"use strict"; (self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_recharts-scale_es6_index_js-node_modules_recharts_es6_cartesian_Bar_js-n-5ba3ae"],{ /***/ "../../../node_modules/recharts-scale/es6/getNiceTickValues.js": /*!*********************************************************************!*\ !*** ../../../node_modules/recharts-scale/es6/getNiceTickValues.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getNiceTickValues: () => (/* binding */ getNiceTickValues), /* harmony export */ getTickValues: () => (/* binding */ getTickValues), /* harmony export */ getTickValuesFixedDomain: () => (/* binding */ getTickValuesFixedDomain) /* harmony export */ }); /* harmony import */ var decimal_js_light__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! decimal.js-light */ "../../../node_modules/decimal.js-light/decimal.js"); /* harmony import */ var decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(decimal_js_light__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _util_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util/utils */ "../../../node_modules/recharts-scale/es6/util/utils.js"); /* harmony import */ var _util_arithmetic__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util/arithmetic */ "../../../node_modules/recharts-scale/es6/util/arithmetic.js"); function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _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."); } function _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); } function _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; } function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_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; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } /** * @fileOverview calculate tick values of scale * @author xile611, arcthur * @date 2015-09-17 */ /** * Calculate a interval of a minimum value and a maximum value * * @param {Number} min The minimum value * @param {Number} max The maximum value * @return {Array} An interval */ function getValidInterval(_ref) { var _ref2 = _slicedToArray(_ref, 2), min = _ref2[0], max = _ref2[1]; var validMin = min, validMax = max; // exchange if (min > max) { validMin = max; validMax = min; } return [validMin, validMax]; } /** * Calculate the step which is easy to understand between ticks, like 10, 20, 25 * * @param {Decimal} roughStep The rough step calculated by deviding the * difference by the tickCount * @param {Boolean} allowDecimals Allow the ticks to be decimals or not * @param {Integer} correctionFactor A correction factor * @return {Decimal} The step which is easy to understand between two ticks */ function getFormatStep(roughStep, allowDecimals, correctionFactor) { if (roughStep.lte(0)) { return new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(0); } var digitCount = _util_arithmetic__WEBPACK_IMPORTED_MODULE_2__["default"].getDigitCount(roughStep.toNumber()); // The ratio between the rough step and the smallest number which has a bigger // order of magnitudes than the rough step var digitCountValue = new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(10).pow(digitCount); var stepRatio = roughStep.div(digitCountValue); // When an integer and a float multiplied, the accuracy of result may be wrong var stepRatioScale = digitCount !== 1 ? 0.05 : 0.1; var amendStepRatio = new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(Math.ceil(stepRatio.div(stepRatioScale).toNumber())).add(correctionFactor).mul(stepRatioScale); var formatStep = amendStepRatio.mul(digitCountValue); return allowDecimals ? formatStep : new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(Math.ceil(formatStep)); } /** * calculate the ticks when the minimum value equals to the maximum value * * @param {Number} value The minimum valuue which is also the maximum value * @param {Integer} tickCount The count of ticks * @param {Boolean} allowDecimals Allow the ticks to be decimals or not * @return {Array} ticks */ function getTickOfSingleValue(value, tickCount, allowDecimals) { var step = 1; // calculate the middle value of ticks var middle = new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(value); if (!middle.isint() && allowDecimals) { var absVal = Math.abs(value); if (absVal < 1) { // The step should be a float number when the difference is smaller than 1 step = new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(10).pow(_util_arithmetic__WEBPACK_IMPORTED_MODULE_2__["default"].getDigitCount(value) - 1); middle = new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(Math.floor(middle.div(step).toNumber())).mul(step); } else if (absVal > 1) { // Return the maximum integer which is smaller than 'value' when 'value' is greater than 1 middle = new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(Math.floor(value)); } } else if (value === 0) { middle = new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(Math.floor((tickCount - 1) / 2)); } else if (!allowDecimals) { middle = new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(Math.floor(value)); } var middleIndex = Math.floor((tickCount - 1) / 2); var fn = (0,_util_utils__WEBPACK_IMPORTED_MODULE_1__.compose)((0,_util_utils__WEBPACK_IMPORTED_MODULE_1__.map)(function (n) { return middle.add(new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(n - middleIndex).mul(step)).toNumber(); }), _util_utils__WEBPACK_IMPORTED_MODULE_1__.range); return fn(0, tickCount); } /** * Calculate the step * * @param {Number} min The minimum value of an interval * @param {Number} max The maximum value of an interval * @param {Integer} tickCount The count of ticks * @param {Boolean} allowDecimals Allow the ticks to be decimals or not * @param {Number} correctionFactor A correction factor * @return {Object} The step, minimum value of ticks, maximum value of ticks */ function calculateStep(min, max, tickCount, allowDecimals) { var correctionFactor = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; // dirty hack (for recharts' test) if (!Number.isFinite((max - min) / (tickCount - 1))) { return { step: new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(0), tickMin: new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(0), tickMax: new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(0) }; } // The step which is easy to understand between two ticks var step = getFormatStep(new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(max).sub(min).div(tickCount - 1), allowDecimals, correctionFactor); // A medial value of ticks var middle; // When 0 is inside the interval, 0 should be a tick if (min <= 0 && max >= 0) { middle = new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(0); } else { // calculate the middle value middle = new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(min).add(max).div(2); // minus modulo value middle = middle.sub(new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(middle).mod(step)); } var belowCount = Math.ceil(middle.sub(min).div(step).toNumber()); var upCount = Math.ceil(new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(max).sub(middle).div(step).toNumber()); var scaleCount = belowCount + upCount + 1; if (scaleCount > tickCount) { // When more ticks need to cover the interval, step should be bigger. return calculateStep(min, max, tickCount, allowDecimals, correctionFactor + 1); } if (scaleCount < tickCount) { // When less ticks can cover the interval, we should add some additional ticks upCount = max > 0 ? upCount + (tickCount - scaleCount) : upCount; belowCount = max > 0 ? belowCount : belowCount + (tickCount - scaleCount); } return { step: step, tickMin: middle.sub(new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(belowCount).mul(step)), tickMax: middle.add(new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(upCount).mul(step)) }; } /** * Calculate the ticks of an interval, the count of ticks will be guraranteed * * @param {Number} min, max min: The minimum value, max: The maximum value * @param {Integer} tickCount The count of ticks * @param {Boolean} allowDecimals Allow the ticks to be decimals or not * @return {Array} ticks */ function getNiceTickValuesFn(_ref3) { var _ref4 = _slicedToArray(_ref3, 2), min = _ref4[0], max = _ref4[1]; var tickCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 6; var allowDecimals = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; // More than two ticks should be return var count = Math.max(tickCount, 2); var _getValidInterval = getValidInterval([min, max]), _getValidInterval2 = _slicedToArray(_getValidInterval, 2), cormin = _getValidInterval2[0], cormax = _getValidInterval2[1]; if (cormin === -Infinity || cormax === Infinity) { var _values = cormax === Infinity ? [cormin].concat(_toConsumableArray((0,_util_utils__WEBPACK_IMPORTED_MODULE_1__.range)(0, tickCount - 1).map(function () { return Infinity; }))) : [].concat(_toConsumableArray((0,_util_utils__WEBPACK_IMPORTED_MODULE_1__.range)(0, tickCount - 1).map(function () { return -Infinity; })), [cormax]); return min > max ? (0,_util_utils__WEBPACK_IMPORTED_MODULE_1__.reverse)(_values) : _values; } if (cormin === cormax) { return getTickOfSingleValue(cormin, tickCount, allowDecimals); } // Get the step between two ticks var _calculateStep = calculateStep(cormin, cormax, count, allowDecimals), step = _calculateStep.step, tickMin = _calculateStep.tickMin, tickMax = _calculateStep.tickMax; var values = _util_arithmetic__WEBPACK_IMPORTED_MODULE_2__["default"].rangeStep(tickMin, tickMax.add(new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(0.1).mul(step)), step); return min > max ? (0,_util_utils__WEBPACK_IMPORTED_MODULE_1__.reverse)(values) : values; } /** * Calculate the ticks of an interval, the count of ticks won't be guraranteed * * @param {Number} min, max min: The minimum value, max: The maximum value * @param {Integer} tickCount The count of ticks * @param {Boolean} allowDecimals Allow the ticks to be decimals or not * @return {Array} ticks */ function getTickValuesFn(_ref5) { var _ref6 = _slicedToArray(_ref5, 2), min = _ref6[0], max = _ref6[1]; var tickCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 6; var allowDecimals = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; // More than two ticks should be return var count = Math.max(tickCount, 2); var _getValidInterval3 = getValidInterval([min, max]), _getValidInterval4 = _slicedToArray(_getValidInterval3, 2), cormin = _getValidInterval4[0], cormax = _getValidInterval4[1]; if (cormin === -Infinity || cormax === Infinity) { return [min, max]; } if (cormin === cormax) { return getTickOfSingleValue(cormin, tickCount, allowDecimals); } var step = getFormatStep(new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(cormax).sub(cormin).div(count - 1), allowDecimals, 0); var fn = (0,_util_utils__WEBPACK_IMPORTED_MODULE_1__.compose)((0,_util_utils__WEBPACK_IMPORTED_MODULE_1__.map)(function (n) { return new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(cormin).add(new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(n).mul(step)).toNumber(); }), _util_utils__WEBPACK_IMPORTED_MODULE_1__.range); var values = fn(0, count).filter(function (entry) { return entry >= cormin && entry <= cormax; }); return min > max ? (0,_util_utils__WEBPACK_IMPORTED_MODULE_1__.reverse)(values) : values; } /** * Calculate the ticks of an interval, the count of ticks won't be guraranteed, * but the domain will be guaranteed * * @param {Number} min, max min: The minimum value, max: The maximum value * @param {Integer} tickCount The count of ticks * @param {Boolean} allowDecimals Allow the ticks to be decimals or not * @return {Array} ticks */ function getTickValuesFixedDomainFn(_ref7, tickCount) { var _ref8 = _slicedToArray(_ref7, 2), min = _ref8[0], max = _ref8[1]; var allowDecimals = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; // More than two ticks should be return var _getValidInterval5 = getValidInterval([min, max]), _getValidInterval6 = _slicedToArray(_getValidInterval5, 2), cormin = _getValidInterval6[0], cormax = _getValidInterval6[1]; if (cormin === -Infinity || cormax === Infinity) { return [min, max]; } if (cormin === cormax) { return [cormin]; } var count = Math.max(tickCount, 2); var step = getFormatStep(new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(cormax).sub(cormin).div(count - 1), allowDecimals, 0); var values = [].concat(_toConsumableArray(_util_arithmetic__WEBPACK_IMPORTED_MODULE_2__["default"].rangeStep(new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(cormin), new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(cormax).sub(new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(0.99).mul(step)), step)), [cormax]); return min > max ? (0,_util_utils__WEBPACK_IMPORTED_MODULE_1__.reverse)(values) : values; } var getNiceTickValues = (0,_util_utils__WEBPACK_IMPORTED_MODULE_1__.memoize)(getNiceTickValuesFn); var getTickValues = (0,_util_utils__WEBPACK_IMPORTED_MODULE_1__.memoize)(getTickValuesFn); var getTickValuesFixedDomain = (0,_util_utils__WEBPACK_IMPORTED_MODULE_1__.memoize)(getTickValuesFixedDomainFn); /***/ }), /***/ "../../../node_modules/recharts-scale/es6/index.js": /*!*********************************************************!*\ !*** ../../../node_modules/recharts-scale/es6/index.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getNiceTickValues: () => (/* reexport safe */ _getNiceTickValues__WEBPACK_IMPORTED_MODULE_0__.getNiceTickValues), /* harmony export */ getTickValues: () => (/* reexport safe */ _getNiceTickValues__WEBPACK_IMPORTED_MODULE_0__.getTickValues), /* harmony export */ getTickValuesFixedDomain: () => (/* reexport safe */ _getNiceTickValues__WEBPACK_IMPORTED_MODULE_0__.getTickValuesFixedDomain) /* harmony export */ }); /* harmony import */ var _getNiceTickValues__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getNiceTickValues */ "../../../node_modules/recharts-scale/es6/getNiceTickValues.js"); /***/ }), /***/ "../../../node_modules/recharts-scale/es6/util/arithmetic.js": /*!*******************************************************************!*\ !*** ../../../node_modules/recharts-scale/es6/util/arithmetic.js ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var decimal_js_light__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! decimal.js-light */ "../../../node_modules/decimal.js-light/decimal.js"); /* harmony import */ var decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(decimal_js_light__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "../../../node_modules/recharts-scale/es6/util/utils.js"); /** * @fileOverview 一些公用的运算方法 * @author xile611 * @date 2015-09-17 */ /** * 获取数值的位数 * 其中绝对值属于区间[0.1, 1), 得到的值为0 * 绝对值属于区间[0.01, 0.1),得到的位数为 -1 * 绝对值属于区间[0.001, 0.01),得到的位数为 -2 * * @param {Number} value 数值 * @return {Integer} 位数 */ function getDigitCount(value) { var result; if (value === 0) { result = 1; } else { result = Math.floor(new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(value).abs().log(10).toNumber()) + 1; } return result; } /** * 按照固定的步长获取[start, end)这个区间的数据 * 并且需要处理js计算精度的问题 * * @param {Decimal} start 起点 * @param {Decimal} end 终点,不包含该值 * @param {Decimal} step 步长 * @return {Array} 若干数值 */ function rangeStep(start, end, step) { var num = new (decimal_js_light__WEBPACK_IMPORTED_MODULE_0___default())(start); var i = 0; var result = []; // magic number to prevent infinite loop while (num.lt(end) && i < 100000) { result.push(num.toNumber()); num = num.add(step); i++; } return result; } /** * 对数值进行线性插值 * * @param {Number} a 定义域的极点 * @param {Number} b 定义域的极点 * @param {Number} t [0, 1]内的某个值 * @return {Number} 定义域内的某个值 */ var interpolateNumber = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.curry)(function (a, b, t) { var newA = +a; var newB = +b; return newA + t * (newB - newA); }); /** * 线性插值的逆运算 * * @param {Number} a 定义域的极点 * @param {Number} b 定义域的极点 * @param {Number} x 可以认为是插值后的一个输出值 * @return {Number} 当x在 a ~ b这个范围内时,返回值属于[0, 1] */ var uninterpolateNumber = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.curry)(function (a, b, x) { var diff = b - +a; diff = diff || Infinity; return (x - a) / diff; }); /** * 线性插值的逆运算,并且有截断的操作 * * @param {Number} a 定义域的极点 * @param {Number} b 定义域的极点 * @param {Number} x 可以认为是插值后的一个输出值 * @return {Number} 当x在 a ~ b这个区间内时,返回值属于[0, 1], * 当x不在 a ~ b这个区间时,会截断到 a ~ b 这个区间 */ var uninterpolateTruncation = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.curry)(function (a, b, x) { var diff = b - +a; diff = diff || Infinity; return Math.max(0, Math.min(1, (x - a) / diff)); }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ rangeStep: rangeStep, getDigitCount: getDigitCount, interpolateNumber: interpolateNumber, uninterpolateNumber: uninterpolateNumber, uninterpolateTruncation: uninterpolateTruncation }); /***/ }), /***/ "../../../node_modules/recharts-scale/es6/util/utils.js": /*!**************************************************************!*\ !*** ../../../node_modules/recharts-scale/es6/util/utils.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ PLACE_HOLDER: () => (/* binding */ PLACE_HOLDER), /* harmony export */ compose: () => (/* binding */ compose), /* harmony export */ curry: () => (/* binding */ curry), /* harmony export */ map: () => (/* binding */ map), /* harmony export */ memoize: () => (/* binding */ memoize), /* harmony export */ range: () => (/* binding */ range), /* harmony export */ reverse: () => (/* binding */ reverse) /* harmony export */ }); function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _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); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _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; } var identity = function identity(i) { return i; }; var PLACE_HOLDER = { '@@functional/placeholder': true }; var isPlaceHolder = function isPlaceHolder(val) { return val === PLACE_HOLDER; }; var curry0 = function curry0(fn) { return function _curried() { if (arguments.length === 0 || arguments.length === 1 && isPlaceHolder(arguments.length <= 0 ? undefined : arguments[0])) { return _curried; } return fn.apply(void 0, arguments); }; }; var curryN = function curryN(n, fn) { if (n === 1) { return fn; } return curry0(function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var argsLength = args.filter(function (arg) { return arg !== PLACE_HOLDER; }).length; if (argsLength >= n) { return fn.apply(void 0, args); } return curryN(n - argsLength, curry0(function () { for (var _len2 = arguments.length, restArgs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { restArgs[_key2] = arguments[_key2]; } var newArgs = args.map(function (arg) { return isPlaceHolder(arg) ? restArgs.shift() : arg; }); return fn.apply(void 0, _toConsumableArray(newArgs).concat(restArgs)); })); }); }; var curry = function curry(fn) { return curryN(fn.length, fn); }; var range = function range(begin, end) { var arr = []; for (var i = begin; i < end; ++i) { arr[i - begin] = i; } return arr; }; var map = curry(function (fn, arr) { if (Array.isArray(arr)) { return arr.map(fn); } return Object.keys(arr).map(function (key) { return arr[key]; }).map(fn); }); var compose = function compose() { for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } if (!args.length) { return identity; } var fns = args.reverse(); // first function can receive multiply arguments var firstFn = fns[0]; var tailsFn = fns.slice(1); return function () { return tailsFn.reduce(function (res, fn) { return fn(res); }, firstFn.apply(void 0, arguments)); }; }; var reverse = function reverse(arr) { if (Array.isArray(arr)) { return arr.reverse(); } // can be string return arr.split('').reverse.join(''); }; var memoize = function memoize(fn) { var lastArgs = null; var lastResult = null; return function () { for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { args[_key4] = arguments[_key4]; } if (lastArgs && args.every(function (val, i) { return val === lastArgs[i]; })) { return lastResult; } lastArgs = args; lastResult = fn.apply(void 0, args); return lastResult; }; }; /***/ }), /***/ "../../../node_modules/recharts/es6/cartesian/Bar.js": /*!***********************************************************!*\ !*** ../../../node_modules/recharts/es6/cartesian/Bar.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Bar: () => (/* binding */ Bar) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var react_smooth__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react-smooth */ "../../../node_modules/react-smooth/es6/index.js"); /* harmony import */ var lodash_isEqual__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/isEqual */ "../../../node_modules/lodash/isEqual.js"); /* harmony import */ var lodash_isEqual__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_isEqual__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash/isNil */ "../../../node_modules/lodash/isNil.js"); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_isNil__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _container_Layer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../container/Layer */ "../../../node_modules/recharts/es6/container/Layer.js"); /* harmony import */ var _ErrorBar__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ErrorBar */ "../../../node_modules/recharts/es6/cartesian/ErrorBar.js"); /* harmony import */ var _component_Cell__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../component/Cell */ "../../../node_modules/recharts/es6/component/Cell.js"); /* harmony import */ var _component_LabelList__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../component/LabelList */ "../../../node_modules/recharts/es6/component/LabelList.js"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); /* harmony import */ var _util_Global__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../util/Global */ "../../../node_modules/recharts/es6/util/Global.js"); /* harmony import */ var _util_ChartUtils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../util/ChartUtils */ "../../../node_modules/recharts/es6/util/ChartUtils.js"); /* harmony import */ var _util_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/types */ "../../../node_modules/recharts/es6/util/types.js"); /* harmony import */ var _util_BarUtils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../util/BarUtils */ "../../../node_modules/recharts/es6/util/BarUtils.js"); var _excluded = ["value", "background"]; var _Bar; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function 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; } function _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; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _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; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _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); } /** * @fileOverview Render a group of bar */ var Bar = /*#__PURE__*/function (_PureComponent) { function Bar() { var _this; _classCallCheck(this, Bar); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, Bar, [].concat(args)); _defineProperty(_this, "state", { isAnimationFinished: false }); _defineProperty(_this, "id", (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.uniqueId)('recharts-bar-')); _defineProperty(_this, "handleAnimationEnd", function () { var onAnimationEnd = _this.props.onAnimationEnd; _this.setState({ isAnimationFinished: true }); if (onAnimationEnd) { onAnimationEnd(); } }); _defineProperty(_this, "handleAnimationStart", function () { var onAnimationStart = _this.props.onAnimationStart; _this.setState({ isAnimationFinished: false }); if (onAnimationStart) { onAnimationStart(); } }); return _this; } _inherits(Bar, _PureComponent); return _createClass(Bar, [{ key: "renderRectanglesStatically", value: function renderRectanglesStatically(data) { var _this2 = this; var _this$props = this.props, shape = _this$props.shape, dataKey = _this$props.dataKey, activeIndex = _this$props.activeIndex, activeBar = _this$props.activeBar; var baseProps = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_5__.filterProps)(this.props, false); return data && data.map(function (entry, i) { var isActive = i === activeIndex; var option = isActive ? activeBar : shape; var props = _objectSpread(_objectSpread(_objectSpread({}, baseProps), entry), {}, { isActive: isActive, option: option, index: i, dataKey: dataKey, onAnimationStart: _this2.handleAnimationStart, onAnimationEnd: _this2.handleAnimationEnd }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_6__.Layer, _extends({ className: "recharts-bar-rectangle" }, (0,_util_types__WEBPACK_IMPORTED_MODULE_7__.adaptEventsOfChild)(_this2.props, entry, i), { key: "rectangle-".concat(entry === null || entry === void 0 ? void 0 : entry.x, "-").concat(entry === null || entry === void 0 ? void 0 : entry.y, "-").concat(entry === null || entry === void 0 ? void 0 : entry.value) }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_util_BarUtils__WEBPACK_IMPORTED_MODULE_8__.BarRectangle, props)); }); } }, { key: "renderRectanglesWithAnimation", value: function renderRectanglesWithAnimation() { var _this3 = this; var _this$props2 = this.props, data = _this$props2.data, layout = _this$props2.layout, isAnimationActive = _this$props2.isAnimationActive, animationBegin = _this$props2.animationBegin, animationDuration = _this$props2.animationDuration, animationEasing = _this$props2.animationEasing, animationId = _this$props2.animationId; var prevData = this.state.prevData; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_smooth__WEBPACK_IMPORTED_MODULE_9__["default"], { begin: animationBegin, duration: animationDuration, isActive: isAnimationActive, easing: animationEasing, from: { t: 0 }, to: { t: 1 }, key: "bar-".concat(animationId), onAnimationEnd: this.handleAnimationEnd, onAnimationStart: this.handleAnimationStart }, function (_ref) { var t = _ref.t; var stepData = data.map(function (entry, index) { var prev = prevData && prevData[index]; if (prev) { var interpolatorX = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.interpolateNumber)(prev.x, entry.x); var interpolatorY = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.interpolateNumber)(prev.y, entry.y); var interpolatorWidth = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.interpolateNumber)(prev.width, entry.width); var interpolatorHeight = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.interpolateNumber)(prev.height, entry.height); return _objectSpread(_objectSpread({}, entry), {}, { x: interpolatorX(t), y: interpolatorY(t), width: interpolatorWidth(t), height: interpolatorHeight(t) }); } if (layout === 'horizontal') { var _interpolatorHeight = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.interpolateNumber)(0, entry.height); var h = _interpolatorHeight(t); return _objectSpread(_objectSpread({}, entry), {}, { y: entry.y + entry.height - h, height: h }); } var interpolator = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.interpolateNumber)(0, entry.width); var w = interpolator(t); return _objectSpread(_objectSpread({}, entry), {}, { width: w }); }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_6__.Layer, null, _this3.renderRectanglesStatically(stepData)); }); } }, { key: "renderRectangles", value: function renderRectangles() { var _this$props3 = this.props, data = _this$props3.data, isAnimationActive = _this$props3.isAnimationActive; var prevData = this.state.prevData; if (isAnimationActive && data && data.length && (!prevData || !lodash_isEqual__WEBPACK_IMPORTED_MODULE_2___default()(prevData, data))) { return this.renderRectanglesWithAnimation(); } return this.renderRectanglesStatically(data); } }, { key: "renderBackground", value: function renderBackground() { var _this4 = this; var _this$props4 = this.props, data = _this$props4.data, dataKey = _this$props4.dataKey, activeIndex = _this$props4.activeIndex; var backgroundProps = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_5__.filterProps)(this.props.background, false); return data.map(function (entry, i) { var value = entry.value, background = entry.background, rest = _objectWithoutProperties(entry, _excluded); if (!background) { return null; } var props = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, rest), {}, { fill: '#eee' }, background), backgroundProps), (0,_util_types__WEBPACK_IMPORTED_MODULE_7__.adaptEventsOfChild)(_this4.props, entry, i)), {}, { onAnimationStart: _this4.handleAnimationStart, onAnimationEnd: _this4.handleAnimationEnd, dataKey: dataKey, index: i, className: 'recharts-bar-background-rectangle' }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_util_BarUtils__WEBPACK_IMPORTED_MODULE_8__.BarRectangle, _extends({ key: "background-bar-".concat(i), option: _this4.props.background, isActive: i === activeIndex }, props)); }); } }, { key: "renderErrorBar", value: function renderErrorBar(needClip, clipPathId) { if (this.props.isAnimationActive && !this.state.isAnimationFinished) { return null; } var _this$props5 = this.props, data = _this$props5.data, xAxis = _this$props5.xAxis, yAxis = _this$props5.yAxis, layout = _this$props5.layout, children = _this$props5.children; var errorBarItems = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_5__.findAllByType)(children, _ErrorBar__WEBPACK_IMPORTED_MODULE_10__.ErrorBar); if (!errorBarItems) { return null; } var offset = layout === 'vertical' ? data[0].height / 2 : data[0].width / 2; var dataPointFormatter = function dataPointFormatter(dataPoint, dataKey) { /** * if the value coming from `getComposedData` is an array then this is a stacked bar chart. * arr[1] represents end value of the bar since the data is in the form of [startValue, endValue]. * */ var value = Array.isArray(dataPoint.value) ? dataPoint.value[1] : dataPoint.value; return { x: dataPoint.x, y: dataPoint.y, value: value, errorVal: (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_11__.getValueByDataKey)(dataPoint, dataKey) }; }; var errorBarProps = { clipPath: needClip ? "url(#clipPath-".concat(clipPathId, ")") : null }; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_6__.Layer, errorBarProps, errorBarItems.map(function (item) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(item, { key: "error-bar-".concat(clipPathId, "-").concat(item.props.dataKey), data: data, xAxis: xAxis, yAxis: yAxis, layout: layout, offset: offset, dataPointFormatter: dataPointFormatter }); })); } }, { key: "render", value: function render() { var _this$props6 = this.props, hide = _this$props6.hide, data = _this$props6.data, className = _this$props6.className, xAxis = _this$props6.xAxis, yAxis = _this$props6.yAxis, left = _this$props6.left, top = _this$props6.top, width = _this$props6.width, height = _this$props6.height, isAnimationActive = _this$props6.isAnimationActive, background = _this$props6.background, id = _this$props6.id; if (hide || !data || !data.length) { return null; } var isAnimationFinished = this.state.isAnimationFinished; var layerClass = (0,clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('recharts-bar', className); var needClipX = xAxis && xAxis.allowDataOverflow; var needClipY = yAxis && yAxis.allowDataOverflow; var needClip = needClipX || needClipY; var clipPathId = lodash_isNil__WEBPACK_IMPORTED_MODULE_3___default()(id) ? this.id : id; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_6__.Layer, { className: layerClass }, needClipX || needClipY ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("defs", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("clipPath", { id: "clipPath-".concat(clipPathId) }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("rect", { x: needClipX ? left : left - width / 2, y: needClipY ? top : top - height / 2, width: needClipX ? width : width * 2, height: needClipY ? height : height * 2 }))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_6__.Layer, { className: "recharts-bar-rectangles", clipPath: needClip ? "url(#clipPath-".concat(clipPathId, ")") : null }, background ? this.renderBackground() : null, this.renderRectangles()), this.renderErrorBar(needClip, clipPathId), (!isAnimationActive || isAnimationFinished) && _component_LabelList__WEBPACK_IMPORTED_MODULE_12__.LabelList.renderCallByParent(this.props, data)); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(nextProps, prevState) { if (nextProps.animationId !== prevState.prevAnimationId) { return { prevAnimationId: nextProps.animationId, curData: nextProps.data, prevData: prevState.curData }; } if (nextProps.data !== prevState.curData) { return { curData: nextProps.data }; } return null; } }]); }(react__WEBPACK_IMPORTED_MODULE_0__.PureComponent); _Bar = Bar; _defineProperty(Bar, "displayName", 'Bar'); _defineProperty(Bar, "defaultProps", { xAxisId: 0, yAxisId: 0, legendType: 'rect', minPointSize: 0, hide: false, data: [], layout: 'vertical', activeBar: false, isAnimationActive: !_util_Global__WEBPACK_IMPORTED_MODULE_13__.Global.isSsr, animationBegin: 0, animationDuration: 400, animationEasing: 'ease' }); /** * Compose the data of each group * @param {Object} props Props for the component * @param {Object} item An instance of Bar * @param {Array} barPosition The offset and size of each bar * @param {Object} xAxis The configuration of x-axis * @param {Object} yAxis The configuration of y-axis * @param {Array} stackedData The stacked data of a bar item * @return{Array} Composed data */ _defineProperty(Bar, "getComposedData", function (_ref2) { var props = _ref2.props, item = _ref2.item, barPosition = _ref2.barPosition, bandSize = _ref2.bandSize, xAxis = _ref2.xAxis, yAxis = _ref2.yAxis, xAxisTicks = _ref2.xAxisTicks, yAxisTicks = _ref2.yAxisTicks, stackedData = _ref2.stackedData, dataStartIndex = _ref2.dataStartIndex, displayedData = _ref2.displayedData, offset = _ref2.offset; var pos = (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_11__.findPositionOfBar)(barPosition, item); if (!pos) { return null; } var layout = props.layout; var itemDefaultProps = item.type.defaultProps; var itemProps = itemDefaultProps !== undefined ? _objectSpread(_objectSpread({}, itemDefaultProps), item.props) : item.props; var dataKey = itemProps.dataKey, children = itemProps.children, minPointSizeProp = itemProps.minPointSize; var numericAxis = layout === 'horizontal' ? yAxis : xAxis; var stackedDomain = stackedData ? numericAxis.scale.domain() : null; var baseValue = (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_11__.getBaseValueOfBar)({ numericAxis: numericAxis }); var cells = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_5__.findAllByType)(children, _component_Cell__WEBPACK_IMPORTED_MODULE_14__.Cell); var rects = displayedData.map(function (entry, index) { var value, x, y, width, height, background; if (stackedData) { value = (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_11__.truncateByDomain)(stackedData[dataStartIndex + index], stackedDomain); } else { value = (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_11__.getValueByDataKey)(entry, dataKey); if (!Array.isArray(value)) { value = [baseValue, value]; } } var minPointSize = (0,_util_BarUtils__WEBPACK_IMPORTED_MODULE_8__.minPointSizeCallback)(minPointSizeProp, _Bar.defaultProps.minPointSize)(value[1], index); if (layout === 'horizontal') { var _ref4; var _ref3 = [yAxis.scale(value[0]), yAxis.scale(value[1])], baseValueScale = _ref3[0], currentValueScale = _ref3[1]; x = (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_11__.getCateCoordinateOfBar)({ axis: xAxis, ticks: xAxisTicks, bandSize: bandSize, offset: pos.offset, entry: entry, index: index }); y = (_ref4 = currentValueScale !== null && currentValueScale !== void 0 ? currentValueScale : baseValueScale) !== null && _ref4 !== void 0 ? _ref4 : undefined; width = pos.size; var computedHeight = baseValueScale - currentValueScale; height = Number.isNaN(computedHeight) ? 0 : computedHeight; background = { x: x, y: yAxis.y, width: width, height: yAxis.height }; if (Math.abs(minPointSize) > 0 && Math.abs(height) < Math.abs(minPointSize)) { var delta = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.mathSign)(height || minPointSize) * (Math.abs(minPointSize) - Math.abs(height)); y -= delta; height += delta; } } else { var _ref5 = [xAxis.scale(value[0]), xAxis.scale(value[1])], _baseValueScale = _ref5[0], _currentValueScale = _ref5[1]; x = _baseValueScale; y = (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_11__.getCateCoordinateOfBar)({ axis: yAxis, ticks: yAxisTicks, bandSize: bandSize, offset: pos.offset, entry: entry, index: index }); width = _currentValueScale - _baseValueScale; height = pos.size; background = { x: xAxis.x, y: y, width: xAxis.width, height: height }; if (Math.abs(minPointSize) > 0 && Math.abs(width) < Math.abs(minPointSize)) { var _delta = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.mathSign)(width || minPointSize) * (Math.abs(minPointSize) - Math.abs(width)); width += _delta; } } return _objectSpread(_objectSpread(_objectSpread({}, entry), {}, { x: x, y: y, width: width, height: height, value: stackedData ? value : value[1], payload: entry, background: background }, cells && cells[index] && cells[index].props), {}, { tooltipPayload: [(0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_11__.getTooltipItem)(item, entry)], tooltipPosition: { x: x + width / 2, y: y + height / 2 } }); }); return _objectSpread({ data: rects, layout: layout }, offset); }); /***/ }), /***/ "../../../node_modules/recharts/es6/cartesian/Brush.js": /*!*************************************************************!*\ !*** ../../../node_modules/recharts/es6/cartesian/Brush.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Brush: () => (/* binding */ Brush) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var victory_vendor_d3_scale__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! victory-vendor/d3-scale */ "../../../node_modules/victory-vendor/es/d3-scale.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash/isFunction */ "../../../node_modules/lodash/isFunction.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_isFunction__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var lodash_range__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash/range */ "../../../node_modules/lodash/range.js"); /* harmony import */ var lodash_range__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(lodash_range__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _container_Layer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../container/Layer */ "../../../node_modules/recharts/es6/container/Layer.js"); /* harmony import */ var _component_Text__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../component/Text */ "../../../node_modules/recharts/es6/component/Text.js"); /* harmony import */ var _util_ChartUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/ChartUtils */ "../../../node_modules/recharts/es6/util/ChartUtils.js"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_CssPrefixUtils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../util/CssPrefixUtils */ "../../../node_modules/recharts/es6/util/CssPrefixUtils.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function 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; } function _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; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _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; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _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); } /** * @fileOverview Brush */ var createScale = function createScale(_ref) { var data = _ref.data, startIndex = _ref.startIndex, endIndex = _ref.endIndex, x = _ref.x, width = _ref.width, travellerWidth = _ref.travellerWidth; if (!data || !data.length) { return {}; } var len = data.length; var scale = (0,victory_vendor_d3_scale__WEBPACK_IMPORTED_MODULE_2__.scalePoint)().domain(lodash_range__WEBPACK_IMPORTED_MODULE_4___default()(0, len)).range([x, x + width - travellerWidth]); var scaleValues = scale.domain().map(function (entry) { return scale(entry); }); return { isTextActive: false, isSlideMoving: false, isTravellerMoving: false, isTravellerFocused: false, startX: scale(startIndex), endX: scale(endIndex), scale: scale, scaleValues: scaleValues }; }; var isTouch = function isTouch(e) { return e.changedTouches && !!e.changedTouches.length; }; var Brush = /*#__PURE__*/function (_PureComponent) { function Brush(props) { var _this; _classCallCheck(this, Brush); _this = _callSuper(this, Brush, [props]); _defineProperty(_this, "handleDrag", function (e) { if (_this.leaveTimer) { clearTimeout(_this.leaveTimer); _this.leaveTimer = null; } if (_this.state.isTravellerMoving) { _this.handleTravellerMove(e); } else if (_this.state.isSlideMoving) { _this.handleSlideDrag(e); } }); _defineProperty(_this, "handleTouchMove", function (e) { if (e.changedTouches != null && e.changedTouches.length > 0) { _this.handleDrag(e.changedTouches[0]); } }); _defineProperty(_this, "handleDragEnd", function () { _this.setState({ isTravellerMoving: false, isSlideMoving: false }, function () { var _this$props = _this.props, endIndex = _this$props.endIndex, onDragEnd = _this$props.onDragEnd, startIndex = _this$props.startIndex; onDragEnd === null || onDragEnd === void 0 || onDragEnd({ endIndex: endIndex, startIndex: startIndex }); }); _this.detachDragEndListener(); }); _defineProperty(_this, "handleLeaveWrapper", function () { if (_this.state.isTravellerMoving || _this.state.isSlideMoving) { _this.leaveTimer = window.setTimeout(_this.handleDragEnd, _this.props.leaveTimeOut); } }); _defineProperty(_this, "handleEnterSlideOrTraveller", function () { _this.setState({ isTextActive: true }); }); _defineProperty(_this, "handleLeaveSlideOrTraveller", function () { _this.setState({ isTextActive: false }); }); _defineProperty(_this, "handleSlideDragStart", function (e) { var event = isTouch(e) ? e.changedTouches[0] : e; _this.setState({ isTravellerMoving: false, isSlideMoving: true, slideMoveStartX: event.pageX }); _this.attachDragEndListener(); }); _this.travellerDragStartHandlers = { startX: _this.handleTravellerDragStart.bind(_this, 'startX'), endX: _this.handleTravellerDragStart.bind(_this, 'endX') }; _this.state = {}; return _this; } _inherits(Brush, _PureComponent); return _createClass(Brush, [{ key: "componentWillUnmount", value: function componentWillUnmount() { if (this.leaveTimer) { clearTimeout(this.leaveTimer); this.leaveTimer = null; } this.detachDragEndListener(); } }, { key: "getIndex", value: function getIndex(_ref2) { var startX = _ref2.startX, endX = _ref2.endX; var scaleValues = this.state.scaleValues; var _this$props2 = this.props, gap = _this$props2.gap, data = _this$props2.data; var lastIndex = data.length - 1; var min = Math.min(startX, endX); var max = Math.max(startX, endX); var minIndex = Brush.getIndexInRange(scaleValues, min); var maxIndex = Brush.getIndexInRange(scaleValues, max); return { startIndex: minIndex - minIndex % gap, endIndex: maxIndex === lastIndex ? lastIndex : maxIndex - maxIndex % gap }; } }, { key: "getTextOfTick", value: function getTextOfTick(index) { var _this$props3 = this.props, data = _this$props3.data, tickFormatter = _this$props3.tickFormatter, dataKey = _this$props3.dataKey; var text = (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_5__.getValueByDataKey)(data[index], dataKey, index); return lodash_isFunction__WEBPACK_IMPORTED_MODULE_3___default()(tickFormatter) ? tickFormatter(text, index) : text; } }, { key: "attachDragEndListener", value: function attachDragEndListener() { window.addEventListener('mouseup', this.handleDragEnd, true); window.addEventListener('touchend', this.handleDragEnd, true); window.addEventListener('mousemove', this.handleDrag, true); } }, { key: "detachDragEndListener", value: function detachDragEndListener() { window.removeEventListener('mouseup', this.handleDragEnd, true); window.removeEventListener('touchend', this.handleDragEnd, true); window.removeEventListener('mousemove', this.handleDrag, true); } }, { key: "handleSlideDrag", value: function handleSlideDrag(e) { var _this$state = this.state, slideMoveStartX = _this$state.slideMoveStartX, startX = _this$state.startX, endX = _this$state.endX; var _this$props4 = this.props, x = _this$props4.x, width = _this$props4.width, travellerWidth = _this$props4.travellerWidth, startIndex = _this$props4.startIndex, endIndex = _this$props4.endIndex, onChange = _this$props4.onChange; var delta = e.pageX - slideMoveStartX; if (delta > 0) { delta = Math.min(delta, x + width - travellerWidth - endX, x + width - travellerWidth - startX); } else if (delta < 0) { delta = Math.max(delta, x - startX, x - endX); } var newIndex = this.getIndex({ startX: startX + delta, endX: endX + delta }); if ((newIndex.startIndex !== startIndex || newIndex.endIndex !== endIndex) && onChange) { onChange(newIndex); } this.setState({ startX: startX + delta, endX: endX + delta, slideMoveStartX: e.pageX }); } }, { key: "handleTravellerDragStart", value: function handleTravellerDragStart(id, e) { var event = isTouch(e) ? e.changedTouches[0] : e; this.setState({ isSlideMoving: false, isTravellerMoving: true, movingTravellerId: id, brushMoveStartX: event.pageX }); this.attachDragEndListener(); } }, { key: "handleTravellerMove", value: function handleTravellerMove(e) { var _this$state2 = this.state, brushMoveStartX = _this$state2.brushMoveStartX, movingTravellerId = _this$state2.movingTravellerId, endX = _this$state2.endX, startX = _this$state2.startX; var prevValue = this.state[movingTravellerId]; var _this$props5 = this.props, x = _this$props5.x, width = _this$props5.width, travellerWidth = _this$props5.travellerWidth, onChange = _this$props5.onChange, gap = _this$props5.gap, data = _this$props5.data; var params = { startX: this.state.startX, endX: this.state.endX }; var delta = e.pageX - brushMoveStartX; if (delta > 0) { delta = Math.min(delta, x + width - travellerWidth - prevValue); } else if (delta < 0) { delta = Math.max(delta, x - prevValue); } params[movingTravellerId] = prevValue + delta; var newIndex = this.getIndex(params); var startIndex = newIndex.startIndex, endIndex = newIndex.endIndex; var isFullGap = function isFullGap() { var lastIndex = data.length - 1; if (movingTravellerId === 'startX' && (endX > startX ? startIndex % gap === 0 : endIndex % gap === 0) || endX < startX && endIndex === lastIndex || movingTravellerId === 'endX' && (endX > startX ? endIndex % gap === 0 : startIndex % gap === 0) || endX > startX && endIndex === lastIndex) { return true; } return false; }; this.setState(_defineProperty(_defineProperty({}, movingTravellerId, prevValue + delta), "brushMoveStartX", e.pageX), function () { if (onChange) { if (isFullGap()) { onChange(newIndex); } } }); } }, { key: "handleTravellerMoveKeyboard", value: function handleTravellerMoveKeyboard(direction, id) { var _this2 = this; // scaleValues are a list of coordinates. For example: [65, 250, 435, 620, 805, 990]. var _this$state3 = this.state, scaleValues = _this$state3.scaleValues, startX = _this$state3.startX, endX = _this$state3.endX; // currentScaleValue refers to which coordinate the current traveller should be placed at. var currentScaleValue = this.state[id]; var currentIndex = scaleValues.indexOf(currentScaleValue); if (currentIndex === -1) { return; } var newIndex = currentIndex + direction; if (newIndex === -1 || newIndex >= scaleValues.length) { return; } var newScaleValue = scaleValues[newIndex]; // Prevent travellers from being on top of each other or overlapping if (id === 'startX' && newScaleValue >= endX || id === 'endX' && newScaleValue <= startX) { return; } this.setState(_defineProperty({}, id, newScaleValue), function () { _this2.props.onChange(_this2.getIndex({ startX: _this2.state.startX, endX: _this2.state.endX })); }); } }, { key: "renderBackground", value: function renderBackground() { var _this$props6 = this.props, x = _this$props6.x, y = _this$props6.y, width = _this$props6.width, height = _this$props6.height, fill = _this$props6.fill, stroke = _this$props6.stroke; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("rect", { stroke: stroke, fill: fill, x: x, y: y, width: width, height: height }); } }, { key: "renderPanorama", value: function renderPanorama() { var _this$props7 = this.props, x = _this$props7.x, y = _this$props7.y, width = _this$props7.width, height = _this$props7.height, data = _this$props7.data, children = _this$props7.children, padding = _this$props7.padding; var chartElement = react__WEBPACK_IMPORTED_MODULE_0__.Children.only(children); if (!chartElement) { return null; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(chartElement, { x: x, y: y, width: width, height: height, margin: padding, compact: true, data: data }); } }, { key: "renderTravellerLayer", value: function renderTravellerLayer(travellerX, id) { var _data$startIndex, _data$endIndex, _this3 = this; var _this$props8 = this.props, y = _this$props8.y, travellerWidth = _this$props8.travellerWidth, height = _this$props8.height, traveller = _this$props8.traveller, ariaLabel = _this$props8.ariaLabel, data = _this$props8.data, startIndex = _this$props8.startIndex, endIndex = _this$props8.endIndex; var x = Math.max(travellerX, this.props.x); var travellerProps = _objectSpread(_objectSpread({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_6__.filterProps)(this.props, false)), {}, { x: x, y: y, width: travellerWidth, height: height }); var ariaLabelBrush = ariaLabel || "Min value: ".concat((_data$startIndex = data[startIndex]) === null || _data$startIndex === void 0 ? void 0 : _data$startIndex.name, ", Max value: ").concat((_data$endIndex = data[endIndex]) === null || _data$endIndex === void 0 ? void 0 : _data$endIndex.name); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_7__.Layer, { tabIndex: 0, role: "slider", "aria-label": ariaLabelBrush, "aria-valuenow": travellerX, className: "recharts-brush-traveller", onMouseEnter: this.handleEnterSlideOrTraveller, onMouseLeave: this.handleLeaveSlideOrTraveller, onMouseDown: this.travellerDragStartHandlers[id], onTouchStart: this.travellerDragStartHandlers[id], onKeyDown: function onKeyDown(e) { if (!['ArrowLeft', 'ArrowRight'].includes(e.key)) { return; } e.preventDefault(); e.stopPropagation(); _this3.handleTravellerMoveKeyboard(e.key === 'ArrowRight' ? 1 : -1, id); }, onFocus: function onFocus() { _this3.setState({ isTravellerFocused: true }); }, onBlur: function onBlur() { _this3.setState({ isTravellerFocused: false }); }, style: { cursor: 'col-resize' } }, Brush.renderTraveller(traveller, travellerProps)); } }, { key: "renderSlide", value: function renderSlide(startX, endX) { var _this$props9 = this.props, y = _this$props9.y, height = _this$props9.height, stroke = _this$props9.stroke, travellerWidth = _this$props9.travellerWidth; var x = Math.min(startX, endX) + travellerWidth; var width = Math.max(Math.abs(endX - startX) - travellerWidth, 0); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("rect", { className: "recharts-brush-slide", onMouseEnter: this.handleEnterSlideOrTraveller, onMouseLeave: this.handleLeaveSlideOrTraveller, onMouseDown: this.handleSlideDragStart, onTouchStart: this.handleSlideDragStart, style: { cursor: 'move' }, stroke: "none", fill: stroke, fillOpacity: 0.2, x: x, y: y, width: width, height: height }); } }, { key: "renderText", value: function renderText() { var _this$props10 = this.props, startIndex = _this$props10.startIndex, endIndex = _this$props10.endIndex, y = _this$props10.y, height = _this$props10.height, travellerWidth = _this$props10.travellerWidth, stroke = _this$props10.stroke; var _this$state4 = this.state, startX = _this$state4.startX, endX = _this$state4.endX; var offset = 5; var attrs = { pointerEvents: 'none', fill: stroke }; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_7__.Layer, { className: "recharts-brush-texts" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_component_Text__WEBPACK_IMPORTED_MODULE_8__.Text, _extends({ textAnchor: "end", verticalAnchor: "middle", x: Math.min(startX, endX) - offset, y: y + height / 2 }, attrs), this.getTextOfTick(startIndex)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_component_Text__WEBPACK_IMPORTED_MODULE_8__.Text, _extends({ textAnchor: "start", verticalAnchor: "middle", x: Math.max(startX, endX) + travellerWidth + offset, y: y + height / 2 }, attrs), this.getTextOfTick(endIndex))); } }, { key: "render", value: function render() { var _this$props11 = this.props, data = _this$props11.data, className = _this$props11.className, children = _this$props11.children, x = _this$props11.x, y = _this$props11.y, width = _this$props11.width, height = _this$props11.height, alwaysShowText = _this$props11.alwaysShowText; var _this$state5 = this.state, startX = _this$state5.startX, endX = _this$state5.endX, isTextActive = _this$state5.isTextActive, isSlideMoving = _this$state5.isSlideMoving, isTravellerMoving = _this$state5.isTravellerMoving, isTravellerFocused = _this$state5.isTravellerFocused; if (!data || !data.length || !(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_9__.isNumber)(x) || !(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_9__.isNumber)(y) || !(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_9__.isNumber)(width) || !(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_9__.isNumber)(height) || width <= 0 || height <= 0) { return null; } var layerClass = (0,clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('recharts-brush', className); var isPanoramic = react__WEBPACK_IMPORTED_MODULE_0___default().Children.count(children) === 1; var style = (0,_util_CssPrefixUtils__WEBPACK_IMPORTED_MODULE_10__.generatePrefixStyle)('userSelect', 'none'); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_7__.Layer, { className: layerClass, onMouseLeave: this.handleLeaveWrapper, onTouchMove: this.handleTouchMove, style: style }, this.renderBackground(), isPanoramic && this.renderPanorama(), this.renderSlide(startX, endX), this.renderTravellerLayer(startX, 'startX'), this.renderTravellerLayer(endX, 'endX'), (isTextActive || isSlideMoving || isTravellerMoving || isTravellerFocused || alwaysShowText) && this.renderText()); } }], [{ key: "renderDefaultTraveller", value: function renderDefaultTraveller(props) { var x = props.x, y = props.y, width = props.width, height = props.height, stroke = props.stroke; var lineY = Math.floor(y + height / 2) - 1; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("rect", { x: x, y: y, width: width, height: height, fill: stroke, stroke: "none" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("line", { x1: x + 1, y1: lineY, x2: x + width - 1, y2: lineY, fill: "none", stroke: "#fff" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("line", { x1: x + 1, y1: lineY + 2, x2: x + width - 1, y2: lineY + 2, fill: "none", stroke: "#fff" })); } }, { key: "renderTraveller", value: function renderTraveller(option, props) { var rectangle; if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(option)) { rectangle = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(option, props); } else if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_3___default()(option)) { rectangle = option(props); } else { rectangle = Brush.renderDefaultTraveller(props); } return rectangle; } }, { key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(nextProps, prevState) { var data = nextProps.data, width = nextProps.width, x = nextProps.x, travellerWidth = nextProps.travellerWidth, updateId = nextProps.updateId, startIndex = nextProps.startIndex, endIndex = nextProps.endIndex; if (data !== prevState.prevData || updateId !== prevState.prevUpdateId) { return _objectSpread({ prevData: data, prevTravellerWidth: travellerWidth, prevUpdateId: updateId, prevX: x, prevWidth: width }, data && data.length ? createScale({ data: data, width: width, x: x, travellerWidth: travellerWidth, startIndex: startIndex, endIndex: endIndex }) : { scale: null, scaleValues: null }); } if (prevState.scale && (width !== prevState.prevWidth || x !== prevState.prevX || travellerWidth !== prevState.prevTravellerWidth)) { prevState.scale.range([x, x + width - travellerWidth]); var scaleValues = prevState.scale.domain().map(function (entry) { return prevState.scale(entry); }); return { prevData: data, prevTravellerWidth: travellerWidth, prevUpdateId: updateId, prevX: x, prevWidth: width, startX: prevState.scale(nextProps.startIndex), endX: prevState.scale(nextProps.endIndex), scaleValues: scaleValues }; } return null; } }, { key: "getIndexInRange", value: function getIndexInRange(valueRange, x) { var len = valueRange.length; var start = 0; var end = len - 1; while (end - start > 1) { var middle = Math.floor((start + end) / 2); if (valueRange[middle] > x) { end = middle; } else { start = middle; } } return x >= valueRange[end] ? end : start; } }]); }(react__WEBPACK_IMPORTED_MODULE_0__.PureComponent); _defineProperty(Brush, "displayName", 'Brush'); _defineProperty(Brush, "defaultProps", { height: 40, travellerWidth: 5, gap: 1, fill: '#fff', stroke: '#666', padding: { top: 1, right: 1, bottom: 1, left: 1 }, leaveTimeOut: 1000, alwaysShowText: false }); /***/ }), /***/ "../../../node_modules/recharts/es6/cartesian/CartesianAxis.js": /*!*********************************************************************!*\ !*** ../../../node_modules/recharts/es6/cartesian/CartesianAxis.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CartesianAxis: () => (/* binding */ CartesianAxis) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isFunction */ "../../../node_modules/lodash/isFunction.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isFunction__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/get */ "../../../node_modules/lodash/get.js"); /* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_get__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _util_ShallowEqual__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/ShallowEqual */ "../../../node_modules/recharts/es6/util/ShallowEqual.js"); /* harmony import */ var _container_Layer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../container/Layer */ "../../../node_modules/recharts/es6/container/Layer.js"); /* harmony import */ var _component_Text__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../component/Text */ "../../../node_modules/recharts/es6/component/Text.js"); /* harmony import */ var _component_Label__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../component/Label */ "../../../node_modules/recharts/es6/component/Label.js"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_types__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../util/types */ "../../../node_modules/recharts/es6/util/types.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); /* harmony import */ var _getTicks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./getTicks */ "../../../node_modules/recharts/es6/cartesian/getTicks.js"); var _excluded = ["viewBox"], _excluded2 = ["viewBox"], _excluded3 = ["ticks"]; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function 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; } function _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; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _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; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _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); } /** * @fileOverview Cartesian Axis */ /** The orientation of the axis in correspondence to the chart */ /** A unit to be appended to a value */ /** The formatter function of tick */ var CartesianAxis = /*#__PURE__*/function (_Component) { function CartesianAxis(props) { var _this; _classCallCheck(this, CartesianAxis); _this = _callSuper(this, CartesianAxis, [props]); _this.state = { fontSize: '', letterSpacing: '' }; return _this; } _inherits(CartesianAxis, _Component); return _createClass(CartesianAxis, [{ key: "shouldComponentUpdate", value: function shouldComponentUpdate(_ref, nextState) { var viewBox = _ref.viewBox, restProps = _objectWithoutProperties(_ref, _excluded); // props.viewBox is sometimes generated every time - // check that specially as object equality is likely to fail var _this$props = this.props, viewBoxOld = _this$props.viewBox, restPropsOld = _objectWithoutProperties(_this$props, _excluded2); return !(0,_util_ShallowEqual__WEBPACK_IMPORTED_MODULE_4__.shallowEqual)(viewBox, viewBoxOld) || !(0,_util_ShallowEqual__WEBPACK_IMPORTED_MODULE_4__.shallowEqual)(restProps, restPropsOld) || !(0,_util_ShallowEqual__WEBPACK_IMPORTED_MODULE_4__.shallowEqual)(nextState, this.state); } }, { key: "componentDidMount", value: function componentDidMount() { var htmlLayer = this.layerReference; if (!htmlLayer) return; var tick = htmlLayer.getElementsByClassName('recharts-cartesian-axis-tick-value')[0]; if (tick) { this.setState({ fontSize: window.getComputedStyle(tick).fontSize, letterSpacing: window.getComputedStyle(tick).letterSpacing }); } } /** * Calculate the coordinates of endpoints in ticks * @param {Object} data The data of a simple tick * @return {Object} (x1, y1): The coordinate of endpoint close to tick text * (x2, y2): The coordinate of endpoint close to axis */ }, { key: "getTickLineCoord", value: function getTickLineCoord(data) { var _this$props2 = this.props, x = _this$props2.x, y = _this$props2.y, width = _this$props2.width, height = _this$props2.height, orientation = _this$props2.orientation, tickSize = _this$props2.tickSize, mirror = _this$props2.mirror, tickMargin = _this$props2.tickMargin; var x1, x2, y1, y2, tx, ty; var sign = mirror ? -1 : 1; var finalTickSize = data.tickSize || tickSize; var tickCoord = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(data.tickCoord) ? data.tickCoord : data.coordinate; switch (orientation) { case 'top': x1 = x2 = data.coordinate; y2 = y + +!mirror * height; y1 = y2 - sign * finalTickSize; ty = y1 - sign * tickMargin; tx = tickCoord; break; case 'left': y1 = y2 = data.coordinate; x2 = x + +!mirror * width; x1 = x2 - sign * finalTickSize; tx = x1 - sign * tickMargin; ty = tickCoord; break; case 'right': y1 = y2 = data.coordinate; x2 = x + +mirror * width; x1 = x2 + sign * finalTickSize; tx = x1 + sign * tickMargin; ty = tickCoord; break; default: x1 = x2 = data.coordinate; y2 = y + +mirror * height; y1 = y2 + sign * finalTickSize; ty = y1 + sign * tickMargin; tx = tickCoord; break; } return { line: { x1: x1, y1: y1, x2: x2, y2: y2 }, tick: { x: tx, y: ty } }; } }, { key: "getTickTextAnchor", value: function getTickTextAnchor() { var _this$props3 = this.props, orientation = _this$props3.orientation, mirror = _this$props3.mirror; var textAnchor; switch (orientation) { case 'left': textAnchor = mirror ? 'start' : 'end'; break; case 'right': textAnchor = mirror ? 'end' : 'start'; break; default: textAnchor = 'middle'; break; } return textAnchor; } }, { key: "getTickVerticalAnchor", value: function getTickVerticalAnchor() { var _this$props4 = this.props, orientation = _this$props4.orientation, mirror = _this$props4.mirror; var verticalAnchor = 'end'; switch (orientation) { case 'left': case 'right': verticalAnchor = 'middle'; break; case 'top': verticalAnchor = mirror ? 'start' : 'end'; break; default: verticalAnchor = mirror ? 'end' : 'start'; break; } return verticalAnchor; } }, { key: "renderAxisLine", value: function renderAxisLine() { var _this$props5 = this.props, x = _this$props5.x, y = _this$props5.y, width = _this$props5.width, height = _this$props5.height, orientation = _this$props5.orientation, mirror = _this$props5.mirror, axisLine = _this$props5.axisLine; var props = _objectSpread(_objectSpread(_objectSpread({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_6__.filterProps)(this.props, false)), (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_6__.filterProps)(axisLine, false)), {}, { fill: 'none' }); if (orientation === 'top' || orientation === 'bottom') { var needHeight = +(orientation === 'top' && !mirror || orientation === 'bottom' && mirror); props = _objectSpread(_objectSpread({}, props), {}, { x1: x, y1: y + needHeight * height, x2: x + width, y2: y + needHeight * height }); } else { var needWidth = +(orientation === 'left' && !mirror || orientation === 'right' && mirror); props = _objectSpread(_objectSpread({}, props), {}, { x1: x + needWidth * width, y1: y, x2: x + needWidth * width, y2: y + height }); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("line", _extends({}, props, { className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__["default"])('recharts-cartesian-axis-line', lodash_get__WEBPACK_IMPORTED_MODULE_2___default()(axisLine, 'className')) })); } }, { key: "renderTicks", value: /** * render the ticks * @param {Array} ticks The ticks to actually render (overrides what was passed in props) * @param {string} fontSize Fontsize to consider for tick spacing * @param {string} letterSpacing Letterspacing to consider for tick spacing * @return {ReactComponent} renderedTicks */ function renderTicks(ticks, fontSize, letterSpacing) { var _this2 = this; var _this$props6 = this.props, tickLine = _this$props6.tickLine, stroke = _this$props6.stroke, tick = _this$props6.tick, tickFormatter = _this$props6.tickFormatter, unit = _this$props6.unit; var finalTicks = (0,_getTicks__WEBPACK_IMPORTED_MODULE_7__.getTicks)(_objectSpread(_objectSpread({}, this.props), {}, { ticks: ticks }), fontSize, letterSpacing); var textAnchor = this.getTickTextAnchor(); var verticalAnchor = this.getTickVerticalAnchor(); var axisProps = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_6__.filterProps)(this.props, false); var customTickProps = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_6__.filterProps)(tick, false); var tickLineProps = _objectSpread(_objectSpread({}, axisProps), {}, { fill: 'none' }, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_6__.filterProps)(tickLine, false)); var items = finalTicks.map(function (entry, i) { var _this2$getTickLineCoo = _this2.getTickLineCoord(entry), lineCoord = _this2$getTickLineCoo.line, tickCoord = _this2$getTickLineCoo.tick; var tickProps = _objectSpread(_objectSpread(_objectSpread(_objectSpread({ textAnchor: textAnchor, verticalAnchor: verticalAnchor }, axisProps), {}, { stroke: 'none', fill: stroke }, customTickProps), tickCoord), {}, { index: i, payload: entry, visibleTicksCount: finalTicks.length, tickFormatter: tickFormatter }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_8__.Layer, _extends({ className: "recharts-cartesian-axis-tick", key: "tick-".concat(entry.value, "-").concat(entry.coordinate, "-").concat(entry.tickCoord) }, (0,_util_types__WEBPACK_IMPORTED_MODULE_9__.adaptEventsOfChild)(_this2.props, entry, i)), tickLine && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("line", _extends({}, tickLineProps, lineCoord, { className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__["default"])('recharts-cartesian-axis-tick-line', lodash_get__WEBPACK_IMPORTED_MODULE_2___default()(tickLine, 'className')) })), tick && CartesianAxis.renderTickItem(tick, tickProps, "".concat(lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default()(tickFormatter) ? tickFormatter(entry.value, i) : entry.value).concat(unit || ''))); }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("g", { className: "recharts-cartesian-axis-ticks" }, items); } }, { key: "render", value: function render() { var _this3 = this; var _this$props7 = this.props, axisLine = _this$props7.axisLine, width = _this$props7.width, height = _this$props7.height, ticksGenerator = _this$props7.ticksGenerator, className = _this$props7.className, hide = _this$props7.hide; if (hide) { return null; } var _this$props8 = this.props, ticks = _this$props8.ticks, noTicksProps = _objectWithoutProperties(_this$props8, _excluded3); var finalTicks = ticks; if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default()(ticksGenerator)) { finalTicks = ticks && ticks.length > 0 ? ticksGenerator(this.props) : ticksGenerator(noTicksProps); } if (width <= 0 || height <= 0 || !finalTicks || !finalTicks.length) { return null; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_8__.Layer, { className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__["default"])('recharts-cartesian-axis', className), ref: function ref(_ref2) { _this3.layerReference = _ref2; } }, axisLine && this.renderAxisLine(), this.renderTicks(finalTicks, this.state.fontSize, this.state.letterSpacing), _component_Label__WEBPACK_IMPORTED_MODULE_10__.Label.renderCallByParent(this.props)); } }], [{ key: "renderTickItem", value: function renderTickItem(option, props, value) { var tickItem; if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(option)) { tickItem = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(option, props); } else if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default()(option)) { tickItem = option(props); } else { tickItem = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_component_Text__WEBPACK_IMPORTED_MODULE_11__.Text, _extends({}, props, { className: "recharts-cartesian-axis-tick-value" }), value); } return tickItem; } }]); }(react__WEBPACK_IMPORTED_MODULE_0__.Component); _defineProperty(CartesianAxis, "displayName", 'CartesianAxis'); _defineProperty(CartesianAxis, "defaultProps", { x: 0, y: 0, width: 0, height: 0, viewBox: { x: 0, y: 0, width: 0, height: 0 }, // The orientation of axis orientation: 'bottom', // The ticks ticks: [], stroke: '#666', tickLine: true, axisLine: true, tick: true, mirror: false, minTickGap: 5, // The width or height of tick tickSize: 6, tickMargin: 2, interval: 'preserveEnd' }); /***/ }), /***/ "../../../node_modules/recharts/es6/cartesian/CartesianGrid.js": /*!*********************************************************************!*\ !*** ../../../node_modules/recharts/es6/cartesian/CartesianGrid.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CartesianGrid: () => (/* binding */ CartesianGrid) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isFunction */ "../../../node_modules/lodash/isFunction.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isFunction__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _util_LogUtils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../util/LogUtils */ "../../../node_modules/recharts/es6/util/LogUtils.js"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); /* harmony import */ var _util_ChartUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/ChartUtils */ "../../../node_modules/recharts/es6/util/ChartUtils.js"); /* harmony import */ var _getTicks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getTicks */ "../../../node_modules/recharts/es6/cartesian/getTicks.js"); /* harmony import */ var _CartesianAxis__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./CartesianAxis */ "../../../node_modules/recharts/es6/cartesian/CartesianAxis.js"); /* harmony import */ var _context_chartLayoutContext__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../context/chartLayoutContext */ "../../../node_modules/recharts/es6/context/chartLayoutContext.js"); var _excluded = ["x1", "y1", "x2", "y2", "key"], _excluded2 = ["offset"]; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function 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; } function _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; } function _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; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _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); } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; } /** * @fileOverview Cartesian Grid */ /** * The { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ErrorBar: () => (/* binding */ ErrorBar) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var tiny_invariant__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tiny-invariant */ "../../../node_modules/tiny-invariant/dist/esm/tiny-invariant.js"); /* harmony import */ var _container_Layer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../container/Layer */ "../../../node_modules/recharts/es6/container/Layer.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); var _excluded = ["offset", "layout", "width", "dataKey", "data", "dataPointFormatter", "xAxis", "yAxis"]; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _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."); } function _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); } function _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; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _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; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _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); } /** * @fileOverview Render a group of error bar */ // eslint-disable-next-line react/prefer-stateless-function -- requires static defaultProps var ErrorBar = /*#__PURE__*/function (_React$Component) { function ErrorBar() { _classCallCheck(this, ErrorBar); return _callSuper(this, ErrorBar, arguments); } _inherits(ErrorBar, _React$Component); return _createClass(ErrorBar, [{ key: "render", value: function render() { var _this$props = this.props, offset = _this$props.offset, layout = _this$props.layout, width = _this$props.width, dataKey = _this$props.dataKey, data = _this$props.data, dataPointFormatter = _this$props.dataPointFormatter, xAxis = _this$props.xAxis, yAxis = _this$props.yAxis, others = _objectWithoutProperties(_this$props, _excluded); var svgProps = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__.filterProps)(others, false); !!(this.props.direction === 'x' && xAxis.type !== 'number') ? true ? (0,tiny_invariant__WEBPACK_IMPORTED_MODULE_1__["default"])(false, 'ErrorBar requires Axis type property to be "number".') : 0 : void 0; var errorBars = data.map(function (entry) { var _dataPointFormatter = dataPointFormatter(entry, dataKey), x = _dataPointFormatter.x, y = _dataPointFormatter.y, value = _dataPointFormatter.value, errorVal = _dataPointFormatter.errorVal; if (!errorVal) { return null; } var lineCoordinates = []; var lowBound, highBound; if (Array.isArray(errorVal)) { var _errorVal = _slicedToArray(errorVal, 2); lowBound = _errorVal[0]; highBound = _errorVal[1]; } else { lowBound = highBound = errorVal; } if (layout === 'vertical') { // error bar for horizontal charts, the y is fixed, x is a range value var scale = xAxis.scale; var yMid = y + offset; var yMin = yMid + width; var yMax = yMid - width; var xMin = scale(value - lowBound); var xMax = scale(value + highBound); // the right line of |--| lineCoordinates.push({ x1: xMax, y1: yMin, x2: xMax, y2: yMax }); // the middle line of |--| lineCoordinates.push({ x1: xMin, y1: yMid, x2: xMax, y2: yMid }); // the left line of |--| lineCoordinates.push({ x1: xMin, y1: yMin, x2: xMin, y2: yMax }); } else if (layout === 'horizontal') { // error bar for horizontal charts, the x is fixed, y is a range value var _scale = yAxis.scale; var xMid = x + offset; var _xMin = xMid - width; var _xMax = xMid + width; var _yMin = _scale(value - lowBound); var _yMax = _scale(value + highBound); // the top line lineCoordinates.push({ x1: _xMin, y1: _yMax, x2: _xMax, y2: _yMax }); // the middle line lineCoordinates.push({ x1: xMid, y1: _yMin, x2: xMid, y2: _yMax }); // the bottom line lineCoordinates.push({ x1: _xMin, y1: _yMin, x2: _xMax, y2: _yMin }); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_3__.Layer, _extends({ className: "recharts-errorBar", key: "bar-".concat(lineCoordinates.map(function (c) { return "".concat(c.x1, "-").concat(c.x2, "-").concat(c.y1, "-").concat(c.y2); })) }, svgProps), lineCoordinates.map(function (coordinates) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("line", _extends({}, coordinates, { key: "line-".concat(coordinates.x1, "-").concat(coordinates.x2, "-").concat(coordinates.y1, "-").concat(coordinates.y2) })); })); }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_3__.Layer, { className: "recharts-errorBars" }, errorBars); } }]); }((react__WEBPACK_IMPORTED_MODULE_0___default().Component)); _defineProperty(ErrorBar, "defaultProps", { stroke: 'black', strokeWidth: 1.5, width: 5, offset: 0, layout: 'horizontal' }); _defineProperty(ErrorBar, "displayName", 'ErrorBar'); /***/ }), /***/ "../../../node_modules/recharts/es6/cartesian/ReferenceArea.js": /*!*********************************************************************!*\ !*** ../../../node_modules/recharts/es6/cartesian/ReferenceArea.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ReferenceArea: () => (/* binding */ ReferenceArea) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isFunction */ "../../../node_modules/lodash/isFunction.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isFunction__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _container_Layer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../container/Layer */ "../../../node_modules/recharts/es6/container/Layer.js"); /* harmony import */ var _component_Label__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../component/Label */ "../../../node_modules/recharts/es6/component/Label.js"); /* harmony import */ var _util_CartesianUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/CartesianUtils */ "../../../node_modules/recharts/es6/util/CartesianUtils.js"); /* harmony import */ var _util_IfOverflowMatches__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/IfOverflowMatches */ "../../../node_modules/recharts/es6/util/IfOverflowMatches.js"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_LogUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/LogUtils */ "../../../node_modules/recharts/es6/util/LogUtils.js"); /* harmony import */ var _shape_Rectangle__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../shape/Rectangle */ "../../../node_modules/recharts/es6/shape/Rectangle.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function 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; } function _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; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _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; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _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); } /** * @fileOverview Reference Line */ var getRect = function getRect(hasX1, hasX2, hasY1, hasY2, props) { var xValue1 = props.x1, xValue2 = props.x2, yValue1 = props.y1, yValue2 = props.y2, xAxis = props.xAxis, yAxis = props.yAxis; if (!xAxis || !yAxis) return null; var scales = (0,_util_CartesianUtils__WEBPACK_IMPORTED_MODULE_3__.createLabeledScales)({ x: xAxis.scale, y: yAxis.scale }); var p1 = { x: hasX1 ? scales.x.apply(xValue1, { position: 'start' }) : scales.x.rangeMin, y: hasY1 ? scales.y.apply(yValue1, { position: 'start' }) : scales.y.rangeMin }; var p2 = { x: hasX2 ? scales.x.apply(xValue2, { position: 'end' }) : scales.x.rangeMax, y: hasY2 ? scales.y.apply(yValue2, { position: 'end' }) : scales.y.rangeMax }; if ((0,_util_IfOverflowMatches__WEBPACK_IMPORTED_MODULE_4__.ifOverflowMatches)(props, 'discard') && (!scales.isInRange(p1) || !scales.isInRange(p2))) { return null; } return (0,_util_CartesianUtils__WEBPACK_IMPORTED_MODULE_3__.rectWithPoints)(p1, p2); }; // eslint-disable-next-line react/prefer-stateless-function -- requires static defaultProps var ReferenceArea = /*#__PURE__*/function (_React$Component) { function ReferenceArea() { _classCallCheck(this, ReferenceArea); return _callSuper(this, ReferenceArea, arguments); } _inherits(ReferenceArea, _React$Component); return _createClass(ReferenceArea, [{ key: "render", value: function render() { var _this$props = this.props, x1 = _this$props.x1, x2 = _this$props.x2, y1 = _this$props.y1, y2 = _this$props.y2, className = _this$props.className, alwaysShow = _this$props.alwaysShow, clipPathId = _this$props.clipPathId; (0,_util_LogUtils__WEBPACK_IMPORTED_MODULE_5__.warn)(alwaysShow === undefined, 'The alwaysShow prop is deprecated. Please use ifOverflow="extendDomain" instead.'); var hasX1 = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.isNumOrStr)(x1); var hasX2 = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.isNumOrStr)(x2); var hasY1 = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.isNumOrStr)(y1); var hasY2 = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_6__.isNumOrStr)(y2); var shape = this.props.shape; if (!hasX1 && !hasX2 && !hasY1 && !hasY2 && !shape) { return null; } var rect = getRect(hasX1, hasX2, hasY1, hasY2, this.props); if (!rect && !shape) { return null; } var clipPath = (0,_util_IfOverflowMatches__WEBPACK_IMPORTED_MODULE_4__.ifOverflowMatches)(this.props, 'hidden') ? "url(#".concat(clipPathId, ")") : undefined; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_7__.Layer, { className: (0,clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('recharts-reference-area', className) }, ReferenceArea.renderRect(shape, _objectSpread(_objectSpread({ clipPath: clipPath }, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_8__.filterProps)(this.props, true)), rect)), _component_Label__WEBPACK_IMPORTED_MODULE_9__.Label.renderCallByParent(this.props, rect)); } }]); }((react__WEBPACK_IMPORTED_MODULE_0___default().Component)); _defineProperty(ReferenceArea, "displayName", 'ReferenceArea'); _defineProperty(ReferenceArea, "defaultProps", { isFront: false, ifOverflow: 'discard', xAxisId: 0, yAxisId: 0, r: 10, fill: '#ccc', fillOpacity: 0.5, stroke: 'none', strokeWidth: 1 }); _defineProperty(ReferenceArea, "renderRect", function (option, props) { var rect; if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(option)) { rect = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(option, props); } else if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default()(option)) { rect = option(props); } else { rect = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_shape_Rectangle__WEBPACK_IMPORTED_MODULE_10__.Rectangle, _extends({}, props, { className: "recharts-reference-area-rect" })); } return rect; }); /***/ }), /***/ "../../../node_modules/recharts/es6/cartesian/ReferenceDot.js": /*!********************************************************************!*\ !*** ../../../node_modules/recharts/es6/cartesian/ReferenceDot.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ReferenceDot: () => (/* binding */ ReferenceDot) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isFunction */ "../../../node_modules/lodash/isFunction.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isFunction__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _container_Layer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../container/Layer */ "../../../node_modules/recharts/es6/container/Layer.js"); /* harmony import */ var _shape_Dot__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../shape/Dot */ "../../../node_modules/recharts/es6/shape/Dot.js"); /* harmony import */ var _component_Label__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../component/Label */ "../../../node_modules/recharts/es6/component/Label.js"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_IfOverflowMatches__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/IfOverflowMatches */ "../../../node_modules/recharts/es6/util/IfOverflowMatches.js"); /* harmony import */ var _util_CartesianUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/CartesianUtils */ "../../../node_modules/recharts/es6/util/CartesianUtils.js"); /* harmony import */ var _util_LogUtils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/LogUtils */ "../../../node_modules/recharts/es6/util/LogUtils.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function 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; } function _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; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _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; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _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); } /** * @fileOverview Reference Dot */ var getCoordinate = function getCoordinate(props) { var x = props.x, y = props.y, xAxis = props.xAxis, yAxis = props.yAxis; var scales = (0,_util_CartesianUtils__WEBPACK_IMPORTED_MODULE_3__.createLabeledScales)({ x: xAxis.scale, y: yAxis.scale }); var result = scales.apply({ x: x, y: y }, { bandAware: true }); if ((0,_util_IfOverflowMatches__WEBPACK_IMPORTED_MODULE_4__.ifOverflowMatches)(props, 'discard') && !scales.isInRange(result)) { return null; } return result; }; // eslint-disable-next-line react/prefer-stateless-function -- requires static defaultProps var ReferenceDot = /*#__PURE__*/function (_React$Component) { function ReferenceDot() { _classCallCheck(this, ReferenceDot); return _callSuper(this, ReferenceDot, arguments); } _inherits(ReferenceDot, _React$Component); return _createClass(ReferenceDot, [{ key: "render", value: function render() { var _this$props = this.props, x = _this$props.x, y = _this$props.y, r = _this$props.r, alwaysShow = _this$props.alwaysShow, clipPathId = _this$props.clipPathId; var isX = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumOrStr)(x); var isY = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumOrStr)(y); (0,_util_LogUtils__WEBPACK_IMPORTED_MODULE_6__.warn)(alwaysShow === undefined, 'The alwaysShow prop is deprecated. Please use ifOverflow="extendDomain" instead.'); if (!isX || !isY) { return null; } var coordinate = getCoordinate(this.props); if (!coordinate) { return null; } var cx = coordinate.x, cy = coordinate.y; var _this$props2 = this.props, shape = _this$props2.shape, className = _this$props2.className; var clipPath = (0,_util_IfOverflowMatches__WEBPACK_IMPORTED_MODULE_4__.ifOverflowMatches)(this.props, 'hidden') ? "url(#".concat(clipPathId, ")") : undefined; var dotProps = _objectSpread(_objectSpread({ clipPath: clipPath }, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__.filterProps)(this.props, true)), {}, { cx: cx, cy: cy }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_8__.Layer, { className: (0,clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('recharts-reference-dot', className) }, ReferenceDot.renderDot(shape, dotProps), _component_Label__WEBPACK_IMPORTED_MODULE_9__.Label.renderCallByParent(this.props, { x: cx - r, y: cy - r, width: 2 * r, height: 2 * r })); } }]); }((react__WEBPACK_IMPORTED_MODULE_0___default().Component)); _defineProperty(ReferenceDot, "displayName", 'ReferenceDot'); _defineProperty(ReferenceDot, "defaultProps", { isFront: false, ifOverflow: 'discard', xAxisId: 0, yAxisId: 0, r: 10, fill: '#fff', stroke: '#ccc', fillOpacity: 1, strokeWidth: 1 }); _defineProperty(ReferenceDot, "renderDot", function (option, props) { var dot; if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(option)) { dot = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(option, props); } else if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default()(option)) { dot = option(props); } else { dot = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_shape_Dot__WEBPACK_IMPORTED_MODULE_10__.Dot, _extends({}, props, { cx: props.cx, cy: props.cy, className: "recharts-reference-dot-dot" })); } return dot; }); /***/ }), /***/ "../../../node_modules/recharts/es6/cartesian/ReferenceLine.js": /*!*********************************************************************!*\ !*** ../../../node_modules/recharts/es6/cartesian/ReferenceLine.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ReferenceLine: () => (/* binding */ ReferenceLine), /* harmony export */ getEndPoints: () => (/* binding */ getEndPoints) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isFunction */ "../../../node_modules/lodash/isFunction.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isFunction__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var lodash_some__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/some */ "../../../node_modules/lodash/some.js"); /* harmony import */ var lodash_some__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_some__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _container_Layer__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../container/Layer */ "../../../node_modules/recharts/es6/container/Layer.js"); /* harmony import */ var _component_Label__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../component/Label */ "../../../node_modules/recharts/es6/component/Label.js"); /* harmony import */ var _util_IfOverflowMatches__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/IfOverflowMatches */ "../../../node_modules/recharts/es6/util/IfOverflowMatches.js"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_CartesianUtils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/CartesianUtils */ "../../../node_modules/recharts/es6/util/CartesianUtils.js"); /* harmony import */ var _util_LogUtils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/LogUtils */ "../../../node_modules/recharts/es6/util/LogUtils.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); /* harmony import */ var _context_chartLayoutContext__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../context/chartLayoutContext */ "../../../node_modules/recharts/es6/context/chartLayoutContext.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function 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; } function _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; } function _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; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _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); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _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."); } function _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); } function _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; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } /** * @fileOverview Reference Line */ /** * This excludes `viewBox` prop from svg for two reasons: * 1. The components wants viewBox of object type, and svg wants string * - so there's a conflict, and the component will throw if it gets string * 2. Internally the component calls `filterProps` which filters the viewBox away anyway */ var renderLine = function renderLine(option, props) { var line; if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(option)) { line = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(option, props); } else if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default()(option)) { line = option(props); } else { line = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("line", _extends({}, props, { className: "recharts-reference-line-line" })); } return line; }; // TODO: ScaleHelper var getEndPoints = function getEndPoints(scales, isFixedX, isFixedY, isSegment, viewBox, position, xAxisOrientation, yAxisOrientation, props) { var x = viewBox.x, y = viewBox.y, width = viewBox.width, height = viewBox.height; if (isFixedY) { var yCoord = props.y; var coord = scales.y.apply(yCoord, { position: position }); if ((0,_util_IfOverflowMatches__WEBPACK_IMPORTED_MODULE_4__.ifOverflowMatches)(props, 'discard') && !scales.y.isInRange(coord)) { return null; } var points = [{ x: x + width, y: coord }, { x: x, y: coord }]; return yAxisOrientation === 'left' ? points.reverse() : points; } if (isFixedX) { var xCoord = props.x; var _coord = scales.x.apply(xCoord, { position: position }); if ((0,_util_IfOverflowMatches__WEBPACK_IMPORTED_MODULE_4__.ifOverflowMatches)(props, 'discard') && !scales.x.isInRange(_coord)) { return null; } var _points = [{ x: _coord, y: y + height }, { x: _coord, y: y }]; return xAxisOrientation === 'top' ? _points.reverse() : _points; } if (isSegment) { var segment = props.segment; var _points2 = segment.map(function (p) { return scales.apply(p, { position: position }); }); if ((0,_util_IfOverflowMatches__WEBPACK_IMPORTED_MODULE_4__.ifOverflowMatches)(props, 'discard') && lodash_some__WEBPACK_IMPORTED_MODULE_2___default()(_points2, function (p) { return !scales.isInRange(p); })) { return null; } return _points2; } return null; }; function ReferenceLineImpl(props) { var fixedX = props.x, fixedY = props.y, segment = props.segment, xAxisId = props.xAxisId, yAxisId = props.yAxisId, shape = props.shape, className = props.className, alwaysShow = props.alwaysShow; var clipPathId = (0,_context_chartLayoutContext__WEBPACK_IMPORTED_MODULE_5__.useClipPathId)(); var xAxis = (0,_context_chartLayoutContext__WEBPACK_IMPORTED_MODULE_5__.useXAxisOrThrow)(xAxisId); var yAxis = (0,_context_chartLayoutContext__WEBPACK_IMPORTED_MODULE_5__.useYAxisOrThrow)(yAxisId); var viewBox = (0,_context_chartLayoutContext__WEBPACK_IMPORTED_MODULE_5__.useViewBox)(); if (!clipPathId || !viewBox) { return null; } (0,_util_LogUtils__WEBPACK_IMPORTED_MODULE_6__.warn)(alwaysShow === undefined, 'The alwaysShow prop is deprecated. Please use ifOverflow="extendDomain" instead.'); var scales = (0,_util_CartesianUtils__WEBPACK_IMPORTED_MODULE_7__.createLabeledScales)({ x: xAxis.scale, y: yAxis.scale }); var isX = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_8__.isNumOrStr)(fixedX); var isY = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_8__.isNumOrStr)(fixedY); var isSegment = segment && segment.length === 2; var endPoints = getEndPoints(scales, isX, isY, isSegment, viewBox, props.position, xAxis.orientation, yAxis.orientation, props); if (!endPoints) { return null; } var _endPoints = _slicedToArray(endPoints, 2), _endPoints$ = _endPoints[0], x1 = _endPoints$.x, y1 = _endPoints$.y, _endPoints$2 = _endPoints[1], x2 = _endPoints$2.x, y2 = _endPoints$2.y; var clipPath = (0,_util_IfOverflowMatches__WEBPACK_IMPORTED_MODULE_4__.ifOverflowMatches)(props, 'hidden') ? "url(#".concat(clipPathId, ")") : undefined; var lineProps = _objectSpread(_objectSpread({ clipPath: clipPath }, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_9__.filterProps)(props, true)), {}, { x1: x1, y1: y1, x2: x2, y2: y2 }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_10__.Layer, { className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__["default"])('recharts-reference-line', className) }, renderLine(shape, lineProps), _component_Label__WEBPACK_IMPORTED_MODULE_11__.Label.renderCallByParent(props, (0,_util_CartesianUtils__WEBPACK_IMPORTED_MODULE_7__.rectWithCoords)({ x1: x1, y1: y1, x2: x2, y2: y2 }))); } // eslint-disable-next-line react/prefer-stateless-function -- requires static defaultProps var ReferenceLine = /*#__PURE__*/function (_React$Component) { function ReferenceLine() { _classCallCheck(this, ReferenceLine); return _callSuper(this, ReferenceLine, arguments); } _inherits(ReferenceLine, _React$Component); return _createClass(ReferenceLine, [{ key: "render", value: function render() { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ReferenceLineImpl, this.props); } }]); }((react__WEBPACK_IMPORTED_MODULE_0___default().Component)); _defineProperty(ReferenceLine, "displayName", 'ReferenceLine'); _defineProperty(ReferenceLine, "defaultProps", { isFront: false, ifOverflow: 'discard', xAxisId: 0, yAxisId: 0, fill: 'none', stroke: '#ccc', fillOpacity: 1, strokeWidth: 1, position: 'middle' }); /***/ }), /***/ "../../../node_modules/recharts/es6/cartesian/XAxis.js": /*!*************************************************************!*\ !*** ../../../node_modules/recharts/es6/cartesian/XAxis.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ XAxis: () => (/* binding */ XAxis) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _context_chartLayoutContext__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../context/chartLayoutContext */ "../../../node_modules/recharts/es6/context/chartLayoutContext.js"); /* harmony import */ var _CartesianAxis__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./CartesianAxis */ "../../../node_modules/recharts/es6/cartesian/CartesianAxis.js"); /* harmony import */ var _util_ChartUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/ChartUtils */ "../../../node_modules/recharts/es6/util/ChartUtils.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _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; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _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); } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } /** * @fileOverview X Axis */ /** Define of XAxis props */ function XAxisImpl(_ref) { var xAxisId = _ref.xAxisId; var width = (0,_context_chartLayoutContext__WEBPACK_IMPORTED_MODULE_2__.useChartWidth)(); var height = (0,_context_chartLayoutContext__WEBPACK_IMPORTED_MODULE_2__.useChartHeight)(); var axisOptions = (0,_context_chartLayoutContext__WEBPACK_IMPORTED_MODULE_2__.useXAxisOrThrow)(xAxisId); if (axisOptions == null) { return null; } return ( /*#__PURE__*/ // @ts-expect-error the axisOptions type is not exactly what CartesianAxis is expecting. react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_CartesianAxis__WEBPACK_IMPORTED_MODULE_3__.CartesianAxis, _extends({}, axisOptions, { className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__["default"])("recharts-".concat(axisOptions.axisType, " ").concat(axisOptions.axisType), axisOptions.className), viewBox: { x: 0, y: 0, width: width, height: height }, ticksGenerator: function ticksGenerator(axis) { return (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_4__.getTicksOfAxis)(axis, true); } })) ); } // eslint-disable-next-line react/prefer-stateless-function -- requires static defaultProps var XAxis = /*#__PURE__*/function (_React$Component) { function XAxis() { _classCallCheck(this, XAxis); return _callSuper(this, XAxis, arguments); } _inherits(XAxis, _React$Component); return _createClass(XAxis, [{ key: "render", value: function render() { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(XAxisImpl, this.props); } }]); }((react__WEBPACK_IMPORTED_MODULE_0___default().Component)); _defineProperty(XAxis, "displayName", 'XAxis'); _defineProperty(XAxis, "defaultProps", { allowDecimals: true, hide: false, orientation: 'bottom', width: 0, height: 30, mirror: false, xAxisId: 0, tickCount: 5, type: 'category', padding: { left: 0, right: 0 }, allowDataOverflow: false, scale: 'auto', reversed: false, allowDuplicatedCategory: true }); /***/ }), /***/ "../../../node_modules/recharts/es6/cartesian/YAxis.js": /*!*************************************************************!*\ !*** ../../../node_modules/recharts/es6/cartesian/YAxis.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ YAxis: () => (/* binding */ YAxis) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _context_chartLayoutContext__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../context/chartLayoutContext */ "../../../node_modules/recharts/es6/context/chartLayoutContext.js"); /* harmony import */ var _CartesianAxis__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./CartesianAxis */ "../../../node_modules/recharts/es6/cartesian/CartesianAxis.js"); /* harmony import */ var _util_ChartUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/ChartUtils */ "../../../node_modules/recharts/es6/util/ChartUtils.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _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; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _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); } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } /** * @fileOverview Y Axis */ var YAxisImpl = function YAxisImpl(_ref) { var yAxisId = _ref.yAxisId; var width = (0,_context_chartLayoutContext__WEBPACK_IMPORTED_MODULE_2__.useChartWidth)(); var height = (0,_context_chartLayoutContext__WEBPACK_IMPORTED_MODULE_2__.useChartHeight)(); var axisOptions = (0,_context_chartLayoutContext__WEBPACK_IMPORTED_MODULE_2__.useYAxisOrThrow)(yAxisId); if (axisOptions == null) { return null; } return ( /*#__PURE__*/ // @ts-expect-error the axisOptions type is not exactly what CartesianAxis is expecting. react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_CartesianAxis__WEBPACK_IMPORTED_MODULE_3__.CartesianAxis, _extends({}, axisOptions, { className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__["default"])("recharts-".concat(axisOptions.axisType, " ").concat(axisOptions.axisType), axisOptions.className), viewBox: { x: 0, y: 0, width: width, height: height }, ticksGenerator: function ticksGenerator(axis) { return (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_4__.getTicksOfAxis)(axis, true); } })) ); }; // eslint-disable-next-line react/prefer-stateless-function -- requires static defaultProps var YAxis = /*#__PURE__*/function (_React$Component) { function YAxis() { _classCallCheck(this, YAxis); return _callSuper(this, YAxis, arguments); } _inherits(YAxis, _React$Component); return _createClass(YAxis, [{ key: "render", value: function render() { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(YAxisImpl, this.props); } }]); }((react__WEBPACK_IMPORTED_MODULE_0___default().Component)); _defineProperty(YAxis, "displayName", 'YAxis'); _defineProperty(YAxis, "defaultProps", { allowDuplicatedCategory: true, allowDecimals: true, hide: false, orientation: 'left', width: 60, height: 0, mirror: false, yAxisId: 0, tickCount: 5, type: 'number', padding: { top: 0, bottom: 0 }, allowDataOverflow: false, scale: 'auto', reversed: false }); /***/ }), /***/ "../../../node_modules/recharts/es6/cartesian/getEquidistantTicks.js": /*!***************************************************************************!*\ !*** ../../../node_modules/recharts/es6/cartesian/getEquidistantTicks.js ***! \***************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getEquidistantTicks: () => (/* binding */ getEquidistantTicks) /* harmony export */ }); /* harmony import */ var _util_TickUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/TickUtils */ "../../../node_modules/recharts/es6/util/TickUtils.js"); /* harmony import */ var _util_getEveryNthWithCondition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../util/getEveryNthWithCondition */ "../../../node_modules/recharts/es6/util/getEveryNthWithCondition.js"); function getEquidistantTicks(sign, boundaries, getTickSize, ticks, minTickGap) { var result = (ticks || []).slice(); var initialStart = boundaries.start, end = boundaries.end; var index = 0; // Premature optimisation idea 1: Estimate a lower bound, and start from there. // For now, start from every tick var stepsize = 1; var start = initialStart; var _loop = function _loop() { // Given stepsize, evaluate whether every stepsize-th tick can be shown. // If it can not, then increase the stepsize by 1, and try again. var entry = ticks === null || ticks === void 0 ? void 0 : ticks[index]; // Break condition - If we have evaluate all the ticks, then we are done. if (entry === undefined) { return { v: (0,_util_getEveryNthWithCondition__WEBPACK_IMPORTED_MODULE_0__.getEveryNthWithCondition)(ticks, stepsize) }; } // Check if the element collides with the next element var i = index; var size; var getSize = function getSize() { if (size === undefined) { size = getTickSize(entry, i); } return size; }; var tickCoord = entry.coordinate; // We will always show the first tick. var isShow = index === 0 || (0,_util_TickUtils__WEBPACK_IMPORTED_MODULE_1__.isVisible)(sign, tickCoord, getSize, start, end); if (!isShow) { // Start all over with a larger stepsize index = 0; start = initialStart; stepsize += 1; } if (isShow) { // If it can be shown, update the start start = tickCoord + sign * (getSize() / 2 + minTickGap); index += stepsize; } }, _ret; while (stepsize <= result.length) { _ret = _loop(); if (_ret) return _ret.v; } return []; } /***/ }), /***/ "../../../node_modules/recharts/es6/cartesian/getTicks.js": /*!****************************************************************!*\ !*** ../../../node_modules/recharts/es6/cartesian/getTicks.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getTicks: () => (/* binding */ getTicks) /* harmony export */ }); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/isFunction */ "../../../node_modules/lodash/isFunction.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_isFunction__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_DOMUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/DOMUtils */ "../../../node_modules/recharts/es6/util/DOMUtils.js"); /* harmony import */ var _util_Global__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/Global */ "../../../node_modules/recharts/es6/util/Global.js"); /* harmony import */ var _util_TickUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/TickUtils */ "../../../node_modules/recharts/es6/util/TickUtils.js"); /* harmony import */ var _getEquidistantTicks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./getEquidistantTicks */ "../../../node_modules/recharts/es6/cartesian/getEquidistantTicks.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function 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; } function _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; } function _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; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _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); } function getTicksEnd(sign, boundaries, getTickSize, ticks, minTickGap) { var result = (ticks || []).slice(); var len = result.length; var start = boundaries.start; var end = boundaries.end; var _loop = function _loop(i) { var entry = result[i]; var size; var getSize = function getSize() { if (size === undefined) { size = getTickSize(entry, i); } return size; }; if (i === len - 1) { var gap = sign * (entry.coordinate + sign * getSize() / 2 - end); result[i] = entry = _objectSpread(_objectSpread({}, entry), {}, { tickCoord: gap > 0 ? entry.coordinate - gap * sign : entry.coordinate }); } else { result[i] = entry = _objectSpread(_objectSpread({}, entry), {}, { tickCoord: entry.coordinate }); } var isShow = (0,_util_TickUtils__WEBPACK_IMPORTED_MODULE_1__.isVisible)(sign, entry.tickCoord, getSize, start, end); if (isShow) { end = entry.tickCoord - sign * (getSize() / 2 + minTickGap); result[i] = _objectSpread(_objectSpread({}, entry), {}, { isShow: true }); } }; for (var i = len - 1; i >= 0; i--) { _loop(i); } return result; } function getTicksStart(sign, boundaries, getTickSize, ticks, minTickGap, preserveEnd) { var result = (ticks || []).slice(); var len = result.length; var start = boundaries.start, end = boundaries.end; if (preserveEnd) { // Try to guarantee the tail to be displayed var tail = ticks[len - 1]; var tailSize = getTickSize(tail, len - 1); var tailGap = sign * (tail.coordinate + sign * tailSize / 2 - end); result[len - 1] = tail = _objectSpread(_objectSpread({}, tail), {}, { tickCoord: tailGap > 0 ? tail.coordinate - tailGap * sign : tail.coordinate }); var isTailShow = (0,_util_TickUtils__WEBPACK_IMPORTED_MODULE_1__.isVisible)(sign, tail.tickCoord, function () { return tailSize; }, start, end); if (isTailShow) { end = tail.tickCoord - sign * (tailSize / 2 + minTickGap); result[len - 1] = _objectSpread(_objectSpread({}, tail), {}, { isShow: true }); } } var count = preserveEnd ? len - 1 : len; var _loop2 = function _loop2(i) { var entry = result[i]; var size; var getSize = function getSize() { if (size === undefined) { size = getTickSize(entry, i); } return size; }; if (i === 0) { var gap = sign * (entry.coordinate - sign * getSize() / 2 - start); result[i] = entry = _objectSpread(_objectSpread({}, entry), {}, { tickCoord: gap < 0 ? entry.coordinate - gap * sign : entry.coordinate }); } else { result[i] = entry = _objectSpread(_objectSpread({}, entry), {}, { tickCoord: entry.coordinate }); } var isShow = (0,_util_TickUtils__WEBPACK_IMPORTED_MODULE_1__.isVisible)(sign, entry.tickCoord, getSize, start, end); if (isShow) { start = entry.tickCoord + sign * (getSize() / 2 + minTickGap); result[i] = _objectSpread(_objectSpread({}, entry), {}, { isShow: true }); } }; for (var i = 0; i < count; i++) { _loop2(i); } return result; } function getTicks(props, fontSize, letterSpacing) { var tick = props.tick, ticks = props.ticks, viewBox = props.viewBox, minTickGap = props.minTickGap, orientation = props.orientation, interval = props.interval, tickFormatter = props.tickFormatter, unit = props.unit, angle = props.angle; if (!ticks || !ticks.length || !tick) { return []; } if ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_2__.isNumber)(interval) || _util_Global__WEBPACK_IMPORTED_MODULE_3__.Global.isSsr) { return (0,_util_TickUtils__WEBPACK_IMPORTED_MODULE_1__.getNumberIntervalTicks)(ticks, typeof interval === 'number' && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_2__.isNumber)(interval) ? interval : 0); } var candidates = []; var sizeKey = orientation === 'top' || orientation === 'bottom' ? 'width' : 'height'; var unitSize = unit && sizeKey === 'width' ? (0,_util_DOMUtils__WEBPACK_IMPORTED_MODULE_4__.getStringSize)(unit, { fontSize: fontSize, letterSpacing: letterSpacing }) : { width: 0, height: 0 }; var getTickSize = function getTickSize(content, index) { var value = lodash_isFunction__WEBPACK_IMPORTED_MODULE_0___default()(tickFormatter) ? tickFormatter(content.value, index) : content.value; // Recharts only supports angles when sizeKey === 'width' return sizeKey === 'width' ? (0,_util_TickUtils__WEBPACK_IMPORTED_MODULE_1__.getAngledTickWidth)((0,_util_DOMUtils__WEBPACK_IMPORTED_MODULE_4__.getStringSize)(value, { fontSize: fontSize, letterSpacing: letterSpacing }), unitSize, angle) : (0,_util_DOMUtils__WEBPACK_IMPORTED_MODULE_4__.getStringSize)(value, { fontSize: fontSize, letterSpacing: letterSpacing })[sizeKey]; }; var sign = ticks.length >= 2 ? (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_2__.mathSign)(ticks[1].coordinate - ticks[0].coordinate) : 1; var boundaries = (0,_util_TickUtils__WEBPACK_IMPORTED_MODULE_1__.getTickBoundaries)(viewBox, sign, sizeKey); if (interval === 'equidistantPreserveStart') { return (0,_getEquidistantTicks__WEBPACK_IMPORTED_MODULE_5__.getEquidistantTicks)(sign, boundaries, getTickSize, ticks, minTickGap); } if (interval === 'preserveStart' || interval === 'preserveStartEnd') { candidates = getTicksStart(sign, boundaries, getTickSize, ticks, minTickGap, interval === 'preserveStartEnd'); } else { candidates = getTicksEnd(sign, boundaries, getTickSize, ticks, minTickGap); } return candidates.filter(function (entry) { return entry.isShow; }); } /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfcmVjaGFydHMtc2NhbGVfZXM2X2luZGV4X2pzLW5vZGVfbW9kdWxlc19yZWNoYXJ0c19lczZfY2FydGVzaWFuX0Jhcl9qcy1uLTViYTNhZS52b2x1bnRlZXJhcGkuYzEyZGY2N2JlMWU0NjFhNTgyMTkuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBbUM7O0FBRW5DLGdDQUFnQzs7QUFFaEMsa0NBQWtDOztBQUVsQyxtQ0FBbUM7O0FBRW5DLGtDQUFrQzs7QUFFbEMsOEJBQThCOztBQUU5QixrREFBa0QsZ0JBQWdCLGdFQUFnRSx3REFBd0QsNkRBQTZELHNEQUFzRDs7QUFFN1MsdUNBQXVDLHVEQUF1RCx1Q0FBdUMsU0FBUyxPQUFPLG9CQUFvQjs7QUFFeksseUNBQXlDLGdGQUFnRixlQUFlLGVBQWUsZ0JBQWdCLG9CQUFvQixNQUFNLDBDQUEwQywrQkFBK0IsYUFBYSxxQkFBcUIsdUNBQXVDLGNBQWMsV0FBVyxZQUFZLFVBQVUsTUFBTSxtREFBbUQsVUFBVSxzQkFBc0I7O0FBRTNkLGdDQUFnQzs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUN1QztBQUM4QjtBQUMxQjtBQUMzQztBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsWUFBWSxRQUFRO0FBQ3BCLFlBQVksT0FBTztBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUFzQjs7QUFFdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksU0FBUztBQUNyQjtBQUNBLFlBQVksU0FBUztBQUNyQixZQUFZLFNBQVM7QUFDckIsWUFBWSxTQUFTO0FBQ3JCOzs7QUFHQTtBQUNBO0FBQ0EsZUFBZSx5REFBTztBQUN0Qjs7QUFFQSxtQkFBbUIsd0RBQVUsc0NBQXNDO0FBQ25FOztBQUVBLDRCQUE0Qix5REFBTztBQUNuQyxrREFBa0Q7O0FBRWxEO0FB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QSxXQUFXLHlFQUFtQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy1zY2FsZS9lczYvZ2V0TmljZVRpY2tWYWx1ZXMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMtc2NhbGUvZXM2L2luZGV4LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzLXNjYWxlL2VzNi91dGlsL2FyaXRobWV0aWMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMtc2NhbGUvZXM2L3V0aWwvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L2NhcnRlc2lhbi9CYXIuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L2NhcnRlc2lhbi9CcnVzaC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvY2FydGVzaWFuL0NhcnRlc2lhbkF4aXMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L2NhcnRlc2lhbi9DYXJ0ZXNpYW5HcmlkLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9jYXJ0ZXNpYW4vRXJyb3JCYXIuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L2NhcnRlc2lhbi9SZWZlcmVuY2VBcmVhLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9jYXJ0ZXNpYW4vUmVmZXJlbmNlRG90LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9jYXJ0ZXNpYW4vUmVmZXJlbmNlTGluZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvY2FydGVzaWFuL1hBeGlzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9jYXJ0ZXNpYW4vWUF4aXMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L2NhcnRlc2lhbi9nZXRFcXVpZGlzdGFudFRpY2tzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9jYXJ0ZXNpYW4vZ2V0VGlja3MuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7IH1cblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IGNhbGN1bGF0ZSB0aWNrIHZhbHVlcyBvZiBzY2FsZVxuICogQGF1dGhvciB4aWxlNjExLCBhcmN0aHVyXG4gKiBAZGF0ZSAyMDE1LTA5LTE3XG4gKi9cbmltcG9ydCBEZWNpbWFsIGZyb20gJ2RlY2ltYWwuanMtbGlnaHQnO1xuaW1wb3J0IHsgY29tcG9zZSwgcmFuZ2UsIG1lbW9pemUsIG1hcCwgcmV2ZXJzZSB9IGZyb20gJy4vdXRpbC91dGlscyc7XG5pbXBvcnQgQXJpdGhtZXRpYyBmcm9tICcuL3V0aWwvYXJpdGhtZXRpYyc7XG4vKipcbiAqIENhbGN1bGF0ZSBhIGludGVydmFsIG9mIGEgbWluaW11bSB2YWx1ZSBhbmQgYSBtYXhpbXVtIHZhbHVlXG4gKlxuICogQHBhcmFtICB7TnVtYmVyfSBtaW4gICAgICAgVGhlIG1pbmltdW0gdmFsdWVcbiAqIEBwYXJhbSAge051bWJlcn0gbWF4ICAgICAgIFRoZSBtYXhpbXVtIHZhbHVlXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gaW50ZXJ2YWxcbiAqL1xuXG5mdW5jdGlvbiBnZXRWYWxpZEludGVydmFsKF9yZWYpIHtcbiAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICBtaW4gPSBfcmVmMlswXSxcbiAgICAgIG1heCA9IF9yZWYyWzFdO1xuXG4gIHZhciB2YWxpZE1pbiA9IG1pbixcbiAgICAgIHZhbGlkTWF4ID0gbWF4OyAvLyBleGNoYW5nZVxuXG4gIGlmIChtaW4gPiBtYXgpIHtcbiAgICB2YWxpZE1pbiA9IG1heDtcbiAgICB2YWxpZE1heCA9IG1pbjtcbiAgfVxuXG4gIHJldHVybiBbdmFsaWRNaW4sIHZhbGlkTWF4XTtcbn1cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBzdGVwIHdoaWNoIGlzIGVhc3kgdG8gdW5kZXJzdGFuZCBiZXR3ZWVuIHRpY2tzLCBsaWtlIDEwLCAyMCwgMjVcbiAqXG4gKiBAcGFyYW0gIHtEZWNpbWFsfSByb3VnaFN0ZXAgICAgICAgIFRoZSByb3VnaCBzdGVwIGNhbGN1bGF0ZWQgYnkgZGV2aWRpbmcgdGhlXG4gKiBkaWZmZXJlbmNlIGJ5IHRoZSB0aWNrQ291bnRcbiAqIEBwYXJhbSAge0Jvb2xlYW59IGFsbG93RGVjaW1hbHMgICAgQWxsb3cgdGhlIHRpY2tzIHRvIGJlIGRlY2ltYWxzIG9yIG5vdFxuICogQHBhcmFtICB7SW50ZWdlcn0gY29ycmVjdGlvbkZhY3RvciBBIGNvcnJlY3Rpb24gZmFjdG9yXG4gKiBAcmV0dXJuIHtEZWNpbWFsfSBUaGUgc3RlcCB3aGljaCBpcyBlYXN5IHRvIHVuZGVyc3RhbmQgYmV0d2VlbiB0d28gdGlja3NcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEZvcm1hdFN0ZXAocm91Z2hTdGVwLCBhbGxvd0RlY2ltYWxzLCBjb3JyZWN0aW9uRmFjdG9yKSB7XG4gIGlmIChyb3VnaFN0ZXAubHRlKDApKSB7XG4gICAgcmV0dXJuIG5ldyBEZWNpbWFsKDApO1xuICB9XG5cbiAgdmFyIGRpZ2l0Q291bnQgPSBBcml0aG1ldGljLmdldERpZ2l0Q291bnQocm91Z2hTdGVwLnRvTnVtYmVyKCkpOyAvLyBUaGUgcmF0aW8gYmV0d2VlbiB0aGUgcm91Z2ggc3RlcCBhbmQgdGhlIHNtYWxsZXN0IG51bWJlciB3aGljaCBoYXMgYSBiaWdnZXJcbiAgLy8gb3JkZXIgb2YgbWFnbml0dWRlcyB0aGFuIHRoZSByb3VnaCBzdGVwXG5cbiAgdmFyIGRpZ2l0Q291bnRWYWx1ZSA9IG5ldyBEZWNpbWFsKDEwKS5wb3coZGlnaXRDb3VudCk7XG4gIHZhciBzdGVwUmF0aW8gPSByb3VnaFN0ZXAuZGl2KGRpZ2l0Q291bnRWYWx1ZSk7IC8vIFdoZW4gYW4gaW50ZWdlciBhbmQgYSBmbG9hdCBtdWx0aXBsaWVkLCB0aGUgYWNjdXJhY3kgb2YgcmVzdWx0IG1heSBiZSB3cm9uZ1xuXG4gIHZhciBzdGVwUmF0aW9TY2FsZSA9IGRpZ2l0Q291bnQgIT09IDEgPyAwLjA1IDogMC4xO1xuICB2YXIgYW1lbmRTdGVwUmF0aW8gPSBuZXcgRGVjaW1hbChNYXRoLmNlaWwoc3RlcFJhdGlvLmRpdihzdGVwUmF0aW9TY2FsZSkudG9OdW1iZXIoKSkpLmFkZChjb3JyZWN0aW9uRmFjdG9yKS5tdWwoc3RlcFJhdGlvU2NhbGUpO1xuICB2YXIgZm9ybWF0U3RlcCA9IGFtZW5kU3RlcFJhdGlvLm11bChkaWdpdENvdW50VmFsdWUpO1xuICByZXR1cm4gYWxsb3dEZWNpbWFscyA/IGZvcm1hdFN0ZXAgOiBuZXcgRGVjaW1hbChNYXRoLmNlaWwoZm9ybWF0U3RlcCkpO1xufVxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIHRpY2tzIHdoZW4gdGhlIG1pbmltdW0gdmFsdWUgZXF1YWxzIHRvIHRoZSBtYXhpbXVtIHZhbHVlXG4gKlxuICogQHBhcmFtICB7TnVtYmVyfSAgdmFsdWUgICAgICAgICBUaGUgbWluaW11bSB2YWx1dWUgd2hpY2ggaXMgYWxzbyB0aGUgbWF4aW11bSB2YWx1ZVxuICogQHBhcmFtICB7SW50ZWdlcn0gdGlja0NvdW50ICAgICBUaGUgY291bnQgb2YgdGlja3NcbiAqIEBwYXJhbSAge0Jvb2xlYW59IGFsbG93RGVjaW1hbHMgQWxsb3cgdGhlIHRpY2tzIHRvIGJlIGRlY2ltYWxzIG9yIG5vdFxuICogQHJldHVybiB7QXJyYXl9ICAgICAgICAgICAgICAgICB0aWNrc1xuICovXG5cblxuZnVuY3Rpb24gZ2V0VGlja09mU2luZ2xlVmFsdWUodmFsdWUsIHRpY2tDb3VudCwgYWxsb3dEZWNpbWFscykge1xuICB2YXIgc3RlcCA9IDE7IC8vIGNhbGN1bGF0ZSB0aGUgbWlkZGxlIHZhbHVlIG9mIHRpY2tzXG5cbiAgdmFyIG1pZGRsZSA9IG5ldyBEZWNpbWFsKHZhbHVlKTtcblxuICBpZiAoIW1pZGRsZS5pc2ludCgpICYmIGFsbG93RGVjaW1hbHMpIHtcbiAgICB2YXIgYWJzVmFsID0gTWF0aC5hYnModmFsdWUpO1xuXG4gICAgaWYgKGFic1ZhbCA8IDEpIHtcbiAgICAgIC8vIFRoZSBzdGVwIHNob3VsZCBiZSBhIGZsb2F0IG51bWJlciB3aGVuIHRoZSBkaWZmZXJlbmNlIGlzIHNtYWxsZXIgdGhhbiAxXG4gICAgICBzdGVwID0gbmV3IERlY2ltYWwoMTApLnBvdyhBcml0aG1ldGljLmdldERpZ2l0Q291bnQodmFsdWUpIC0gMSk7XG4gICAgICBtaWRkbGUgPSBuZXcgRGVjaW1hbChNYXRoLmZsb29yKG1pZGRsZS5kaXYoc3RlcCkudG9OdW1iZXIoKSkpLm11bChzdGVwKTtcbiAgICB9IGVsc2UgaWYgKGFic1ZhbCA+IDEpIHtcbiAgICAgIC8vIFJldHVybiB0aGUgbWF4aW11bSBpbnRlZ2VyIHdoaWNoIGlzIHNtYWxsZXIgdGhhbiAndmFsdWUnIHdoZW4gJ3ZhbHVlJyBpcyBncmVhdGVyIHRoYW4gMVxuICAgICAgbWlkZGxlID0gbmV3IERlY2ltYWwoTWF0aC5mbG9vcih2YWx1ZSkpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgIG1pZGRsZSA9IG5ldyBEZWNpbWFsKE1hdGguZmxvb3IoKHRpY2tDb3VudCAtIDEpIC8gMikpO1xuICB9IGVsc2UgaWYgKCFhbGxvd0RlY2ltYWxzKSB7XG4gICAgbWlkZGxlID0gbmV3IERlY2ltYWwoTWF0aC5mbG9vcih2YWx1ZSkpO1xuICB9XG5cbiAgdmFyIG1pZGRsZUluZGV4ID0gTWF0aC5mbG9vcigodGlja0NvdW50IC0gMSkgLyAyKTtcbiAgdmFyIGZuID0gY29tcG9zZShtYXAoZnVuY3Rpb24gKG4pIHtcbiAgICByZXR1cm4gbWlkZGxlLmFkZChuZXcgRGVjaW1hbChuIC0gbWlkZGxlSW5kZXgpLm11bChzdGVwKSkudG9OdW1iZXIoKTtcbiAgfSksIHJhbmdlKTtcbiAgcmV0dXJuIGZuKDAsIHRpY2tDb3VudCk7XG59XG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgc3RlcFxuICpcbiAqIEBwYXJhbSAge051bWJlcn0gIG1pbiAgICAgICAgICAgICAgVGhlIG1pbmltdW0gdmFsdWUgb2YgYW4gaW50ZXJ2YWxcbiAqIEBwYXJhbSAge051bWJlcn0gIG1heCAgICAgICAgICAgICAgVGhlIG1heGltdW0gdmFsdWUgb2YgYW4gaW50ZXJ2YWxcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHRpY2tDb3VudCAgICAgICAgVGhlIGNvdW50IG9mIHRpY2tzXG4gKiBAcGFyYW0gIHtCb29sZWFufSBhbGxvd0RlY2ltYWxzICAgIEFsbG93IHRoZSB0aWNrcyB0byBiZSBkZWNpbWFscyBvciBub3RcbiAqIEBwYXJhbSAge051bWJlcn0gIGNvcnJlY3Rpb25GYWN0b3IgQSBjb3JyZWN0aW9uIGZhY3RvclxuICogQHJldHVybiB7T2JqZWN0fSAgVGhlIHN0ZXAsIG1pbmltdW0gdmFsdWUgb2YgdGlja3MsIG1heGltdW0gdmFsdWUgb2YgdGlja3NcbiAqL1xuXG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVN0ZXAobWluLCBtYXgsIHRpY2tDb3VudCwgYWxsb3dEZWNpbWFscykge1xuICB2YXIgY29ycmVjdGlvbkZhY3RvciA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogMDtcblxuICAvLyBkaXJ0eSBoYWNrIChmb3IgcmVjaGFydHMnIHRlc3QpXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKChtYXggLSBtaW4pIC8gKHRpY2tDb3VudCAtIDEpKSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGVwOiBuZXcgRGVjaW1hbCgwKSxcbiAgICAgIHRpY2tNaW46IG5ldyBEZWNpbWFsKDApLFxuICAgICAgdGlja01heDogbmV3IERlY2ltYWwoMClcbiAgICB9O1xuICB9IC8vIFRoZSBzdGVwIHdoaWNoIGlzIGVhc3kgdG8gdW5kZXJzdGFuZCBiZXR3ZWVuIHR3byB0aWNrc1xuXG5cbiAgdmFyIHN0ZXAgPSBnZXRGb3JtYXRTdGVwKG5ldyBEZWNpbWFsKG1heCkuc3ViKG1pbikuZGl2KHRpY2tDb3VudCAtIDEpLCBhbGxvd0RlY2ltYWxzLCBjb3JyZWN0aW9uRmFjdG9yKTsgLy8gQSBtZWRpYWwgdmFsdWUgb2YgdGlja3NcblxuICB2YXIgbWlkZGxlOyAvLyBXaGVuIDAgaXMgaW5zaWRlIHRoZSBpbnRlcnZhbCwgMCBzaG91bGQgYmUgYSB0aWNrXG5cbiAgaWYgKG1pbiA8PSAwICYmIG1heCA+PSAwKSB7XG4gICAgbWlkZGxlID0gbmV3IERlY2ltYWwoMCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gY2FsY3VsYXRlIHRoZSBtaWRkbGUgdmFsdWVcbiAgICBtaWRkbGUgPSBuZXcgRGVjaW1hbChtaW4pLmFkZChtYXgpLmRpdigyKTsgLy8gbWludXMgbW9kdWxvIHZhbHVlXG5cbiAgICBtaWRkbGUgPSBtaWRkbGUuc3ViKG5ldyBEZWNpbWFsKG1pZGRsZSkubW9kKHN0ZXApKTtcbiAgfVxuXG4gIHZhciBiZWxvd0NvdW50ID0gTWF0aC5jZWlsKG1pZGRsZS5zdWIobWluKS5kaXYoc3RlcCkudG9OdW1iZXIoKSk7XG4gIHZhciB1cENvdW50ID0gTWF0aC5jZWlsKG5ldyBEZWNpbWFsKG1heCkuc3ViKG1pZGRsZSkuZGl2KHN0ZXApLnRvTnVtYmVyKCkpO1xuICB2YXIgc2NhbGVDb3VudCA9IGJlbG93Q291bnQgKyB1cENvdW50ICsgMTtcblxuICBpZiAoc2NhbGVDb3VudCA+IHRpY2tDb3VudCkge1xuICAgIC8vIFdoZW4gbW9yZSB0aWNrcyBuZWVkIHRvIGNvdmVyIHRoZSBpbnRlcnZhbCwgc3RlcCBzaG91bGQgYmUgYmlnZ2VyLlxuICAgIHJldHVybiBjYWxjdWxhdGVTdGVwKG1pbiwgbWF4LCB0aWNrQ291bnQsIGFsbG93RGVjaW1hbHMsIGNvcnJlY3Rpb25GYWN0b3IgKyAxKTtcbiAgfVxuXG4gIGlmIChzY2FsZUNvdW50IDwgdGlja0NvdW50KSB7XG4gICAgLy8gV2hlbiBsZXNzIHRpY2tzIGNhbiBjb3ZlciB0aGUgaW50ZXJ2YWwsIHdlIHNob3VsZCBhZGQgc29tZSBhZGRpdGlvbmFsIHRpY2tzXG4gICAgdXBDb3VudCA9IG1heCA+IDAgPyB1cENvdW50ICsgKHRpY2tDb3VudCAtIHNjYWxlQ291bnQpIDogdXBDb3VudDtcbiAgICBiZWxvd0NvdW50ID0gbWF4ID4gMCA/IGJlbG93Q291bnQgOiBiZWxvd0NvdW50ICsgKHRpY2tDb3VudCAtIHNjYWxlQ291bnQpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGVwOiBzdGVwLFxuICAgIHRpY2tNaW46IG1pZGRsZS5zdWIobmV3IERlY2ltYWwoYmVsb3dDb3VudCkubXVsKHN0ZXApKSxcbiAgICB0aWNrTWF4OiBtaWRkbGUuYWRkKG5ldyBEZWNpbWFsKHVwQ291bnQpLm11bChzdGVwKSlcbiAgfTtcbn1cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSB0aWNrcyBvZiBhbiBpbnRlcnZhbCwgdGhlIGNvdW50IG9mIHRpY2tzIHdpbGwgYmUgZ3VyYXJhbnRlZWRcbiAqXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICBtaW4sIG1heCAgICAgIG1pbjogVGhlIG1pbmltdW0gdmFsdWUsIG1heDogVGhlIG1heGltdW0gdmFsdWVcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHRpY2tDb3VudCAgICAgVGhlIGNvdW50IG9mIHRpY2tzXG4gKiBAcGFyYW0gIHtCb29sZWFufSBhbGxvd0RlY2ltYWxzIEFsbG93IHRoZSB0aWNrcyB0byBiZSBkZWNpbWFscyBvciBub3RcbiAqIEByZXR1cm4ge0FycmF5fSAgIHRpY2tzXG4gKi9cblxuXG5mdW5jdGlvbiBnZXROaWNlVGlja1ZhbHVlc0ZuKF9yZWYzKSB7XG4gIHZhciBfcmVmNCA9IF9zbGljZWRUb0FycmF5KF9yZWYzLCAyKSxcbiAgICAgIG1pbiA9IF9yZWY0WzBdLFxuICAgICAgbWF4ID0gX3JlZjRbMV07XG5cbiAgdmFyIHRpY2tDb3VudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogNjtcbiAgdmFyIGFsbG93RGVjaW1hbHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG4gIC8vIE1vcmUgdGhhbiB0d28gdGlja3Mgc2hvdWxkIGJlIHJldHVyblxuICB2YXIgY291bnQgPSBNYXRoLm1heCh0aWNrQ291bnQsIDIpO1xuXG4gIHZhciBfZ2V0VmFsaWRJbnRlcnZhbCA9IGdldFZhbGlkSW50ZXJ2YWwoW21pbiwgbWF4XSksXG4gICAgICBfZ2V0VmFsaWRJbnRlcnZhbDIgPSBfc2xpY2VkVG9BcnJheShfZ2V0VmFsaWRJbnRlcnZhbCwgMiksXG4gICAgICBjb3JtaW4gPSBfZ2V0VmFsaWRJbnRlcnZhbDJbMF0sXG4gICAgICBjb3JtYXggPSBfZ2V0VmFsaWRJbnRlcnZhbDJbMV07XG5cbiAgaWYgKGNvcm1pbiA9PT0gLUluZmluaXR5IHx8IGNvcm1heCA9PT0gSW5maW5pdHkpIHtcbiAgICB2YXIgX3ZhbHVlcyA9IGNvcm1heCA9PT0gSW5maW5pdHkgPyBbY29ybWluXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJhbmdlKDAsIHRpY2tDb3VudCAtIDEpLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgfSkpKSA6IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocmFuZ2UoMCwgdGlja0NvdW50IC0gMSkubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfSkpLCBbY29ybWF4XSk7XG5cbiAgICByZXR1cm4gbWluID4gbWF4ID8gcmV2ZXJzZShfdmFsdWVzKSA6IF92YWx1ZXM7XG4gIH1cblxuICBpZiAoY29ybWluID09PSBjb3JtYXgpIHtcbiAgICByZXR1cm4gZ2V0VGlja09mU2luZ2xlVmFsdWUoY29ybWluLCB0aWNrQ291bnQsIGFsbG93RGVjaW1hbHMpO1xuICB9IC8vIEdldCB0aGUgc3RlcCBiZXR3ZWVuIHR3byB0aWNrc1xuXG5cbiAgdmFyIF9jYWxjdWxhdGVTdGVwID0gY2FsY3VsYXRlU3RlcChjb3JtaW4sIGNvcm1heCwgY291bnQsIGFsbG93RGVjaW1hbHMpLFxuICAgICAgc3RlcCA9IF9jYWxjdWxhdGVTdGVwLnN0ZXAsXG4gICAgICB0aWNrTWluID0gX2NhbGN1bGF0ZVN0ZXAudGlja01pbixcbiAgICAgIHRpY2tNYXggPSBfY2FsY3VsYXRlU3RlcC50aWNrTWF4O1xuXG4gIHZhciB2YWx1ZXMgPSBBcml0aG1ldGljLnJhbmdlU3RlcCh0aWNrTWluLCB0aWNrTWF4LmFkZChuZXcgRGVjaW1hbCgwLjEpLm11bChzdGVwKSksIHN0ZXApO1xuICByZXR1cm4gbWluID4gbWF4ID8gcmV2ZXJzZSh2YWx1ZXMpIDogdmFsdWVzO1xufVxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIHRpY2tzIG9mIGFuIGludGVydmFsLCB0aGUgY291bnQgb2YgdGlja3Mgd29uJ3QgYmUgZ3VyYXJhbnRlZWRcbiAqXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICBtaW4sIG1heCAgICAgIG1pbjogVGhlIG1pbmltdW0gdmFsdWUsIG1heDogVGhlIG1heGltdW0gdmFsdWVcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHRpY2tDb3VudCAgICAgVGhlIGNvdW50IG9mIHRpY2tzXG4gKiBAcGFyYW0gIHtCb29sZWFufSBhbGxvd0RlY2ltYWxzIEFsbG93IHRoZSB0aWNrcyB0byBiZSBkZWNpbWFscyBvciBub3RcbiAqIEByZXR1cm4ge0FycmF5fSAgIHRpY2tzXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRUaWNrVmFsdWVzRm4oX3JlZjUpIHtcbiAgdmFyIF9yZWY2ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjUsIDIpLFxuICAgICAgbWluID0gX3JlZjZbMF0sXG4gICAgICBtYXggPSBfcmVmNlsxXTtcblxuICB2YXIgdGlja0NvdW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiA2O1xuICB2YXIgYWxsb3dEZWNpbWFscyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcbiAgLy8gTW9yZSB0aGFuIHR3byB0aWNrcyBzaG91bGQgYmUgcmV0dXJuXG4gIHZhciBjb3VudCA9IE1hdGgubWF4KHRpY2tDb3VudCwgMik7XG5cbiAgdmFyIF9nZXRWYWxpZEludGVydmFsMyA9IGdldFZhbGlkSW50ZXJ2YWwoW21pbiwgbWF4XSksXG4gICAgICBfZ2V0VmFsaWRJbnRlcnZhbDQgPSBfc2xpY2VkVG9BcnJheShfZ2V0VmFsaWRJbnRlcnZhbDMsIDIpLFxuICAgICAgY29ybWluID0gX2dldFZhbGlkSW50ZXJ2YWw0WzBdLFxuICAgICAgY29ybWF4ID0gX2dldFZhbGlkSW50ZXJ2YWw0WzFdO1xuXG4gIGlmIChjb3JtaW4gPT09IC1JbmZpbml0eSB8fCBjb3JtYXggPT09IEluZmluaXR5KSB7XG4gICAgcmV0dXJuIFttaW4sIG1heF07XG4gIH1cblxuICBpZiAoY29ybWluID09PSBjb3JtYXgpIHtcbiAgICByZXR1cm4gZ2V0VGlja09mU2luZ2xlVmFsdWUoY29ybWluLCB0aWNrQ291bnQsIGFsbG93RGVjaW1hbHMpO1xuICB9XG5cbiAgdmFyIHN0ZXAgPSBnZXRGb3JtYXRTdGVwKG5ldyBEZWNpbWFsKGNvcm1heCkuc3ViKGNvcm1pbikuZGl2KGNvdW50IC0gMSksIGFsbG93RGVjaW1hbHMsIDApO1xuICB2YXIgZm4gPSBjb21wb3NlKG1hcChmdW5jdGlvbiAobikge1xuICAgIHJldHVybiBuZXcgRGVjaW1hbChjb3JtaW4pLmFkZChuZXcgRGVjaW1hbChuKS5tdWwoc3RlcCkpLnRvTnVtYmVyKCk7XG4gIH0pLCByYW5nZSk7XG4gIHZhciB2YWx1ZXMgPSBmbigwLCBjb3VudCkuZmlsdGVyKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgIHJldHVybiBlbnRyeSA+PSBjb3JtaW4gJiYgZW50cnkgPD0gY29ybWF4O1xuICB9KTtcbiAgcmV0dXJuIG1pbiA+IG1heCA/IHJldmVyc2UodmFsdWVzKSA6IHZhbHVlcztcbn1cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSB0aWNrcyBvZiBhbiBpbnRlcnZhbCwgdGhlIGNvdW50IG9mIHRpY2tzIHdvbid0IGJlIGd1cmFyYW50ZWVkLFxuICogYnV0IHRoZSBkb21haW4gd2lsbCBiZSBndWFyYW50ZWVkXG4gKlxuICogQHBhcmFtICB7TnVtYmVyfSAgbWluLCBtYXggICAgICBtaW46IFRoZSBtaW5pbXVtIHZhbHVlLCBtYXg6IFRoZSBtYXhpbXVtIHZhbHVlXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSB0aWNrQ291bnQgICAgIFRoZSBjb3VudCBvZiB0aWNrc1xuICogQHBhcmFtICB7Qm9vbGVhbn0gYWxsb3dEZWNpbWFscyBBbGxvdyB0aGUgdGlja3MgdG8gYmUgZGVjaW1hbHMgb3Igbm90XG4gKiBAcmV0dXJuIHtBcnJheX0gICB0aWNrc1xuICovXG5cblxuZnVuY3Rpb24gZ2V0VGlja1ZhbHVlc0ZpeGVkRG9tYWluRm4oX3JlZjcsIHRpY2tDb3VudCkge1xuICB2YXIgX3JlZjggPSBfc2xpY2VkVG9BcnJheShfcmVmNywgMiksXG4gICAgICBtaW4gPSBfcmVmOFswXSxcbiAgICAgIG1heCA9IF9yZWY4WzFdO1xuXG4gIHZhciBhbGxvd0RlY2ltYWxzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuXG4gIC8vIE1vcmUgdGhhbiB0d28gdGlja3Mgc2hvdWxkIGJlIHJldHVyblxuICB2YXIgX2dldFZhbGlkSW50ZXJ2YWw1ID0gZ2V0VmFsaWRJbnRlcnZhbChbbWluLCBtYXhdKSxcbiAgICAgIF9nZXRWYWxpZEludGVydmFsNiA9IF9zbGljZWRUb0FycmF5KF9nZXRWYWxpZEludGVydmFsNSwgMiksXG4gICAgICBjb3JtaW4gPSBfZ2V0VmFsaWRJbnRlcnZhbDZbMF0sXG4gICAgICBjb3JtYXggPSBfZ2V0VmFsaWRJbnRlcnZhbDZbMV07XG5cbiAgaWYgKGNvcm1pbiA9PT0gLUluZmluaXR5IHx8IGNvcm1heCA9PT0gSW5maW5pdHkpIHtcbiAgICByZXR1cm4gW21pbiwgbWF4XTtcbiAgfVxuXG4gIGlmIChjb3JtaW4gPT09IGNvcm1heCkge1xuICAgIHJldHVybiBbY29ybWluXTtcbiAgfVxuXG4gIHZhciBjb3VudCA9IE1hdGgubWF4KHRpY2tDb3VudCwgMik7XG4gIHZhciBzdGVwID0gZ2V0Rm9ybWF0U3RlcChuZXcgRGVjaW1hbChjb3JtYXgpLnN1Yihjb3JtaW4pLmRpdihjb3VudCAtIDEpLCBhbGxvd0RlY2ltYWxzLCAwKTtcbiAgdmFyIHZhbHVlcyA9IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoQXJpdGhtZXRpYy5yYW5nZVN0ZXAobmV3IERlY2ltYWwoY29ybWluKSwgbmV3IERlY2ltYWwoY29ybWF4KS5zdWIobmV3IERlY2ltYWwoMC45OSkubXVsKHN0ZXApKSwgc3RlcCkpLCBbY29ybWF4XSk7XG4gIHJldHVybiBtaW4gPiBtYXggPyByZXZlcnNlKHZhbHVlcykgOiB2YWx1ZXM7XG59XG5cbmV4cG9ydCB2YXIgZ2V0TmljZVRpY2tWYWx1ZXMgPSBtZW1vaXplKGdldE5pY2VUaWNrVmFsdWVzRm4pO1xuZXhwb3J0IHZhciBnZXRUaWNrVmFsdWVzID0gbWVtb2l6ZShnZXRUaWNrVmFsdWVzRm4pO1xuZXhwb3J0IHZhciBnZXRUaWNrVmFsdWVzRml4ZWREb21haW4gPSBtZW1vaXplKGdldFRpY2tWYWx1ZXNGaXhlZERvbWFpbkZuKTsiLCJleHBvcnQgeyBnZXRUaWNrVmFsdWVzLCBnZXROaWNlVGlja1ZhbHVlcywgZ2V0VGlja1ZhbHVlc0ZpeGVkRG9tYWluIH0gZnJvbSAnLi9nZXROaWNlVGlja1ZhbHVlcyc7IiwiLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IOS4gOS6m+WFrOeUqOeahOi/kOeul+aWueazlVxuICogQGF1dGhvciB4aWxlNjExXG4gKiBAZGF0ZSAyMDE1LTA5LTE3XG4gKi9cbmltcG9ydCBEZWNpbWFsIGZyb20gJ2RlY2ltYWwuanMtbGlnaHQnO1xuaW1wb3J0IHsgY3VycnkgfSBmcm9tICcuL3V0aWxzJztcbi8qKlxuICog6I635Y+W5pWw5YC855qE5L2N5pWwXG4gKiDlhbbkuK3nu53lr7nlgLzlsZ7kuo7ljLrpl7RbMC4xLCAxKe+8jCDlvpfliLDnmoTlgLzkuLowXG4gKiDnu53lr7nlgLzlsZ7kuo7ljLrpl7RbMC4wMSwgMC4xKe+8jOW+l+WIsOeahOS9jeaVsOS4uiAtMVxuICog57ud5a+55YC85bGe5LqO5Yy66Ze0WzAuMDAxLCAwLjAxKe+8jOW+l+WIsOeahOS9jeaVsOS4uiAtMlxuICpcbiAqIEBwYXJhbSAge051bWJlcn0gdmFsdWUg5pWw5YC8XG4gKiBAcmV0dXJuIHtJbnRlZ2VyfSDkvY3mlbBcbiAqL1xuXG5mdW5jdGlvbiBnZXREaWdpdENvdW50KHZhbHVlKSB7XG4gIHZhciByZXN1bHQ7XG5cbiAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgcmVzdWx0ID0gMTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBNYXRoLmZsb29yKG5ldyBEZWNpbWFsKHZhbHVlKS5hYnMoKS5sb2coMTApLnRvTnVtYmVyKCkpICsgMTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIOaMieeFp+WbuuWumueahOatpemVv+iOt+WPlltzdGFydCwgZW5kKei/meS4quWMuumXtOeahOaVsOaNrlxuICog5bm25LiU6ZyA6KaB5aSE55CGanPorqHnrpfnsr7luqbnmoTpl67pophcbiAqXG4gKiBAcGFyYW0gIHtEZWNpbWFsfSBzdGFydCDotbfngrlcbiAqIEBwYXJhbSAge0RlY2ltYWx9IGVuZCAgIOe7iOeCue+8jOS4jeWMheWQq+ivpeWAvFxuICogQHBhcmFtICB7RGVjaW1hbH0gc3RlcCAg5q2l6ZW/XG4gKiBAcmV0dXJuIHtBcnJheX0gICAgICAgICDoi6XlubLmlbDlgLxcbiAqL1xuXG5cbmZ1bmN0aW9uIHJhbmdlU3RlcChzdGFydCwgZW5kLCBzdGVwKSB7XG4gIHZhciBudW0gPSBuZXcgRGVjaW1hbChzdGFydCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdOyAvLyBtYWdpYyBudW1iZXIgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wXG5cbiAgd2hpbGUgKG51bS5sdChlbmQpICYmIGkgPCAxMDAwMDApIHtcbiAgICByZXN1bHQucHVzaChudW0udG9OdW1iZXIoKSk7XG4gICAgbnVtID0gbnVtLmFkZChzdGVwKTtcbiAgICBpKys7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiDlr7nmlbDlgLzov5vooYznur/mgKfmj5LlgLxcbiAqXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGEgIOWumuS5ieWfn+eahOaegeeCuVxuICogQHBhcmFtICB7TnVtYmVyfSBiICDlrprkuYnln5/nmoTmnoHngrlcbiAqIEBwYXJhbSAge051bWJlcn0gdCAgWzAsIDFd5YaF55qE5p+Q5Liq5YC8XG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgIOWumuS5ieWfn+WGheeahOafkOS4quWAvFxuICovXG5cblxudmFyIGludGVycG9sYXRlTnVtYmVyID0gY3VycnkoZnVuY3Rpb24gKGEsIGIsIHQpIHtcbiAgdmFyIG5ld0EgPSArYTtcbiAgdmFyIG5ld0IgPSArYjtcbiAgcmV0dXJuIG5ld0EgKyB0ICogKG5ld0IgLSBuZXdBKTtcbn0pO1xuLyoqXG4gKiDnur/mgKfmj5LlgLznmoTpgIbov5DnrpdcbiAqXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGEg5a6a5LmJ5Z+f55qE5p6B54K5XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGIg5a6a5LmJ5Z+f55qE5p6B54K5XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHgg5Y+v5Lul6K6k5Li65piv5o+S5YC85ZCO55qE5LiA5Liq6L6T5Ye65YC8XG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAg5b2TeOWcqCBhIH4gYui/meS4quiMg+WbtOWGheaXtu+8jOi/lOWbnuWAvOWxnuS6jlswLCAxXVxuICovXG5cbnZhciB1bmludGVycG9sYXRlTnVtYmVyID0gY3VycnkoZnVuY3Rpb24gKGEsIGIsIHgpIHtcbiAgdmFyIGRpZmYgPSBiIC0gK2E7XG4gIGRpZmYgPSBkaWZmIHx8IEluZmluaXR5O1xuICByZXR1cm4gKHggLSBhKSAvIGRpZmY7XG59KTtcbi8qKlxuICog57q/5oCn5o+S5YC855qE6YCG6L+Q566X77yM5bm25LiU5pyJ5oiq5pat55qE5pON5L2cXG4gKlxuICogQHBhcmFtICB7TnVtYmVyfSBhIOWumuS5ieWfn+eahOaegeeCuVxuICogQHBhcmFtICB7TnVtYmVyfSBiIOWumuS5ieWfn+eahOaegeeCuVxuICogQHBhcmFtICB7TnVtYmVyfSB4IOWPr+S7peiupOS4uuaYr+aPkuWAvOWQjueahOS4gOS4qui+k+WHuuWAvFxuICogQHJldHVybiB7TnVtYmVyfSAgIOW9k3jlnKggYSB+IGLov5nkuKrljLrpl7TlhoXml7bvvIzov5Tlm57lgLzlsZ7kuo5bMCwgMV3vvIxcbiAqIOW9k3jkuI3lnKggYSB+IGLov5nkuKrljLrpl7Tml7bvvIzkvJrmiKrmlq3liLAgYSB+IGIg6L+Z5Liq5Yy66Ze0XG4gKi9cblxudmFyIHVuaW50ZXJwb2xhdGVUcnVuY2F0aW9uID0gY3VycnkoZnVuY3Rpb24gKGEsIGIsIHgpIHtcbiAgdmFyIGRpZmYgPSBiIC0gK2E7XG4gIGRpZmYgPSBkaWZmIHx8IEluZmluaXR5O1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgKHggLSBhKSAvIGRpZmYpKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQge1xuICByYW5nZVN0ZXA6IHJhbmdlU3RlcCxcbiAgZ2V0RGlnaXRDb3VudDogZ2V0RGlnaXRDb3VudCxcbiAgaW50ZXJwb2xhdGVOdW1iZXI6IGludGVycG9sYXRlTnVtYmVyLFxuICB1bmludGVycG9sYXRlTnVtYmVyOiB1bmludGVycG9sYXRlTnVtYmVyLFxuICB1bmludGVycG9sYXRlVHJ1bmNhdGlvbjogdW5pbnRlcnBvbGF0ZVRydW5jYXRpb25cbn07IiwiZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgaWRlbnRpdHkgPSBmdW5jdGlvbiBpZGVudGl0eShpKSB7XG4gIHJldHVybiBpO1xufTtcblxuZXhwb3J0IHZhciBQTEFDRV9IT0xERVIgPSB7XG4gICdAQGZ1bmN0aW9uYWwvcGxhY2Vob2xkZXInOiB0cnVlXG59O1xuXG52YXIgaXNQbGFjZUhvbGRlciA9IGZ1bmN0aW9uIGlzUGxhY2VIb2xkZXIodmFsKSB7XG4gIHJldHVybiB2YWwgPT09IFBMQUNFX0hPTERFUjtcbn07XG5cbnZhciBjdXJyeTAgPSBmdW5jdGlvbiBjdXJyeTAoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIF9jdXJyaWVkKCkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgaXNQbGFjZUhvbGRlcihhcmd1bWVudHMubGVuZ3RoIDw9IDAgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMF0pKSB7XG4gICAgICByZXR1cm4gX2N1cnJpZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZuLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG5cbnZhciBjdXJyeU4gPSBmdW5jdGlvbiBjdXJyeU4obiwgZm4pIHtcbiAgaWYgKG4gPT09IDEpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICByZXR1cm4gY3VycnkwKGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgdmFyIGFyZ3NMZW5ndGggPSBhcmdzLmZpbHRlcihmdW5jdGlvbiAoYXJnKSB7XG4gICAgICByZXR1cm4gYXJnICE9PSBQTEFDRV9IT0xERVI7XG4gICAgfSkubGVuZ3RoO1xuXG4gICAgaWYgKGFyZ3NMZW5ndGggPj0gbikge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHZvaWQgMCwgYXJncyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJ5TihuIC0gYXJnc0xlbmd0aCwgY3VycnkwKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdEFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgcmVzdEFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld0FyZ3MgPSBhcmdzLm1hcChmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgIHJldHVybiBpc1BsYWNlSG9sZGVyKGFyZykgPyByZXN0QXJncy5zaGlmdCgpIDogYXJnO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZm4uYXBwbHkodm9pZCAwLCBfdG9Db25zdW1hYmxlQXJyYXkobmV3QXJncykuY29uY2F0KHJlc3RBcmdzKSk7XG4gICAgfSkpO1xuICB9KTtcbn07XG5cbmV4cG9ydCB2YXIgY3VycnkgPSBmdW5jdGlvbiBjdXJyeShmbikge1xuICByZXR1cm4gY3VycnlOKGZuLmxlbmd0aCwgZm4pO1xufTtcbmV4cG9ydCB2YXIgcmFuZ2UgPSBmdW5jdGlvbiByYW5nZShiZWdpbiwgZW5kKSB7XG4gIHZhciBhcnIgPSBbXTtcblxuICBmb3IgKHZhciBpID0gYmVnaW47IGkgPCBlbmQ7ICsraSkge1xuICAgIGFycltpIC0gYmVnaW5dID0gaTtcbiAgfVxuXG4gIHJldHVybiBhcnI7XG59O1xuZXhwb3J0IHZhciBtYXAgPSBjdXJyeShmdW5jdGlvbiAoZm4sIGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuIGFyci5tYXAoZm4pO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKGFycikubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gYXJyW2tleV07XG4gIH0pLm1hcChmbik7XG59KTtcbmV4cG9ydCB2YXIgY29tcG9zZSA9IGZ1bmN0aW9uIGNvbXBvc2UoKSB7XG4gIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMyksIF9rZXkzID0gMDsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgfVxuXG4gIGlmICghYXJncy5sZW5ndGgpIHtcbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICB2YXIgZm5zID0gYXJncy5yZXZlcnNlKCk7IC8vIGZpcnN0IGZ1bmN0aW9uIGNhbiByZWNlaXZlIG11bHRpcGx5IGFyZ3VtZW50c1xuXG4gIHZhciBmaXJzdEZuID0gZm5zWzBdO1xuICB2YXIgdGFpbHNGbiA9IGZucy5zbGljZSgxKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGFpbHNGbi5yZWR1Y2UoZnVuY3Rpb24gKHJlcywgZm4pIHtcbiAgICAgIHJldHVybiBmbihyZXMpO1xuICAgIH0sIGZpcnN0Rm4uYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpKTtcbiAgfTtcbn07XG5leHBvcnQgdmFyIHJldmVyc2UgPSBmdW5jdGlvbiByZXZlcnNlKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuIGFyci5yZXZlcnNlKCk7XG4gIH0gLy8gY2FuIGJlIHN0cmluZ1xuXG5cbiAgcmV0dXJuIGFyci5zcGxpdCgnJykucmV2ZXJzZS5qb2luKCcnKTtcbn07XG5leHBvcnQgdmFyIG1lbW9pemUgPSBmdW5jdGlvbiBtZW1vaXplKGZuKSB7XG4gIHZhciBsYXN0QXJncyA9IG51bGw7XG4gIHZhciBsYXN0UmVzdWx0ID0gbnVsbDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjQpLCBfa2V5NCA9IDA7IF9rZXk0IDwgX2xlbjQ7IF9rZXk0KyspIHtcbiAgICAgIGFyZ3NbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcbiAgICB9XG5cbiAgICBpZiAobGFzdEFyZ3MgJiYgYXJncy5ldmVyeShmdW5jdGlvbiAodmFsLCBpKSB7XG4gICAgICByZXR1cm4gdmFsID09PSBsYXN0QXJnc1tpXTtcbiAgICB9KSkge1xuICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7XG4gICAgfVxuXG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgIGxhc3RSZXN1bHQgPSBmbi5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgIHJldHVybiBsYXN0UmVzdWx0O1xuICB9O1xufTsiLCJ2YXIgX2V4Y2x1ZGVkID0gW1widmFsdWVcIiwgXCJiYWNrZ3JvdW5kXCJdO1xudmFyIF9CYXI7XG5mdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHsgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTsgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7IH0gcmV0dXJuIHQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQoZSkgeyBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykgeyB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307IHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTsgfSk7IH0gcmV0dXJuIGU7IH1cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIF90b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7IH0gfVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cbmZ1bmN0aW9uIF9jYWxsU3VwZXIodCwgbywgZSkgeyByZXR1cm4gbyA9IF9nZXRQcm90b3R5cGVPZihvKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odCwgX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpID8gUmVmbGVjdC5jb25zdHJ1Y3QobywgZSB8fCBbXSwgX2dldFByb3RvdHlwZU9mKHQpLmNvbnN0cnVjdG9yKSA6IG8uYXBwbHkodCwgZSkpOyB9XG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWRcIik7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgdHJ5IHsgdmFyIHQgPSAhQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyB9IGNhdGNoICh0KSB7fSByZXR1cm4gKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyByZXR1cm4gISF0OyB9KSgpOyB9XG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN1YkNsYXNzLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbi8qKlxuICogQGZpbGVPdmVydmlldyBSZW5kZXIgYSBncm91cCBvZiBiYXJcbiAqL1xuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCBBbmltYXRlIGZyb20gJ3JlYWN0LXNtb290aCc7XG5pbXBvcnQgaXNFcXVhbCBmcm9tICdsb2Rhc2gvaXNFcXVhbCc7XG5pbXBvcnQgaXNOaWwgZnJvbSAnbG9kYXNoL2lzTmlsJztcbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi4vY29udGFpbmVyL0xheWVyJztcbmltcG9ydCB7IEVycm9yQmFyIH0gZnJvbSAnLi9FcnJvckJhcic7XG5pbXBvcnQgeyBDZWxsIH0gZnJvbSAnLi4vY29tcG9uZW50L0NlbGwnO1xuaW1wb3J0IHsgTGFiZWxMaXN0IH0gZnJvbSAnLi4vY29tcG9uZW50L0xhYmVsTGlzdCc7XG5pbXBvcnQgeyB1bmlxdWVJZCwgbWF0aFNpZ24sIGludGVycG9sYXRlTnVtYmVyIH0gZnJvbSAnLi4vdXRpbC9EYXRhVXRpbHMnO1xuaW1wb3J0IHsgZmlsdGVyUHJvcHMsIGZpbmRBbGxCeVR5cGUgfSBmcm9tICcuLi91dGlsL1JlYWN0VXRpbHMnO1xuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSAnLi4vdXRpbC9HbG9iYWwnO1xuaW1wb3J0IHsgZ2V0Q2F0ZUNvb3JkaW5hdGVPZkJhciwgZ2V0VmFsdWVCeURhdGFLZXksIHRydW5jYXRlQnlEb21haW4sIGdldEJhc2VWYWx1ZU9mQmFyLCBmaW5kUG9zaXRpb25PZkJhciwgZ2V0VG9vbHRpcEl0ZW0gfSBmcm9tICcuLi91dGlsL0NoYXJ0VXRpbHMnO1xuaW1wb3J0IHsgYWRhcHRFdmVudHNPZkNoaWxkIH0gZnJvbSAnLi4vdXRpbC90eXBlcyc7XG5pbXBvcnQgeyBCYXJSZWN0YW5nbGUsIG1pblBvaW50U2l6ZUNhbGxiYWNrIH0gZnJvbSAnLi4vdXRpbC9CYXJVdGlscyc7XG5leHBvcnQgdmFyIEJhciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1B1cmVDb21wb25lbnQpIHtcbiAgZnVuY3Rpb24gQmFyKCkge1xuICAgIHZhciBfdGhpcztcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQmFyKTtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIF90aGlzID0gX2NhbGxTdXBlcih0aGlzLCBCYXIsIFtdLmNvbmNhdChhcmdzKSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcInN0YXRlXCIsIHtcbiAgICAgIGlzQW5pbWF0aW9uRmluaXNoZWQ6IGZhbHNlXG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcImlkXCIsIHVuaXF1ZUlkKCdyZWNoYXJ0cy1iYXItJykpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJoYW5kbGVBbmltYXRpb25FbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9uQW5pbWF0aW9uRW5kID0gX3RoaXMucHJvcHMub25BbmltYXRpb25FbmQ7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzQW5pbWF0aW9uRmluaXNoZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgICAgaWYgKG9uQW5pbWF0aW9uRW5kKSB7XG4gICAgICAgIG9uQW5pbWF0aW9uRW5kKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcImhhbmRsZUFuaW1hdGlvblN0YXJ0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBvbkFuaW1hdGlvblN0YXJ0ID0gX3RoaXMucHJvcHMub25BbmltYXRpb25TdGFydDtcbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNBbmltYXRpb25GaW5pc2hlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgaWYgKG9uQW5pbWF0aW9uU3RhcnQpIHtcbiAgICAgICAgb25BbmltYXRpb25TdGFydCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfaW5oZXJpdHMoQmFyLCBfUHVyZUNvbXBvbmVudCk7XG4gIHJldHVybiBfY3JlYXRlQ2xhc3MoQmFyLCBbe1xuICAgIGtleTogXCJyZW5kZXJSZWN0YW5nbGVzU3RhdGljYWxseVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJSZWN0YW5nbGVzU3RhdGljYWxseShkYXRhKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIHNoYXBlID0gX3RoaXMkcHJvcHMuc2hhcGUsXG4gICAgICAgIGRhdGFLZXkgPSBfdGhpcyRwcm9wcy5kYXRhS2V5LFxuICAgICAgICBhY3RpdmVJbmRleCA9IF90aGlzJHByb3BzLmFjdGl2ZUluZGV4LFxuICAgICAgICBhY3RpdmVCYXIgPSBfdGhpcyRwcm9wcy5hY3RpdmVCYXI7XG4gICAgICB2YXIgYmFzZVByb3BzID0gZmlsdGVyUHJvcHModGhpcy5wcm9wcywgZmFsc2UpO1xuICAgICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5tYXAoZnVuY3Rpb24gKGVudHJ5LCBpKSB7XG4gICAgICAgIHZhciBpc0FjdGl2ZSA9IGkgPT09IGFjdGl2ZUluZGV4O1xuICAgICAgICB2YXIgb3B0aW9uID0gaXNBY3RpdmUgPyBhY3RpdmVCYXIgOiBzaGFwZTtcbiAgICAgICAgdmFyIHByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGJhc2VQcm9wcyksIGVudHJ5KSwge30sIHtcbiAgICAgICAgICBpc0FjdGl2ZTogaXNBY3RpdmUsXG4gICAgICAgICAgb3B0aW9uOiBvcHRpb24sXG4gICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgZGF0YUtleTogZGF0YUtleSxcbiAgICAgICAgICBvbkFuaW1hdGlvblN0YXJ0OiBfdGhpczIuaGFuZGxlQW5pbWF0aW9uU3RhcnQsXG4gICAgICAgICAgb25BbmltYXRpb25FbmQ6IF90aGlzMi5oYW5kbGVBbmltYXRpb25FbmRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYXllciwgX2V4dGVuZHMoe1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy1iYXItcmVjdGFuZ2xlXCJcbiAgICAgICAgfSwgYWRhcHRFdmVudHNPZkNoaWxkKF90aGlzMi5wcm9wcywgZW50cnksIGkpLCB7XG4gICAgICAgICAga2V5OiBcInJlY3RhbmdsZS1cIi5jb25jYXQoZW50cnkgPT09IG51bGwgfHwgZW50cnkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVudHJ5LngsIFwiLVwiKS5jb25jYXQoZW50cnkgPT09IG51bGwgfHwgZW50cnkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVudHJ5LnksIFwiLVwiKS5jb25jYXQoZW50cnkgPT09IG51bGwgfHwgZW50cnkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVudHJ5LnZhbHVlKVxuICAgICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFyUmVjdGFuZ2xlLCBwcm9wcykpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclJlY3RhbmdsZXNXaXRoQW5pbWF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlclJlY3RhbmdsZXNXaXRoQW5pbWF0aW9uKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgZGF0YSA9IF90aGlzJHByb3BzMi5kYXRhLFxuICAgICAgICBsYXlvdXQgPSBfdGhpcyRwcm9wczIubGF5b3V0LFxuICAgICAgICBpc0FuaW1hdGlvbkFjdGl2ZSA9IF90aGlzJHByb3BzMi5pc0FuaW1hdGlvbkFjdGl2ZSxcbiAgICAgICAgYW5pbWF0aW9uQmVnaW4gPSBfdGhpcyRwcm9wczIuYW5pbWF0aW9uQmVnaW4sXG4gICAgICAgIGFuaW1hdGlvbkR1cmF0aW9uID0gX3RoaXMkcHJvcHMyLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICBhbmltYXRpb25FYXNpbmcgPSBfdGhpcyRwcm9wczIuYW5pbWF0aW9uRWFzaW5nLFxuICAgICAgICBhbmltYXRpb25JZCA9IF90aGlzJHByb3BzMi5hbmltYXRpb25JZDtcbiAgICAgIHZhciBwcmV2RGF0YSA9IHRoaXMuc3RhdGUucHJldkRhdGE7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW5pbWF0ZSwge1xuICAgICAgICBiZWdpbjogYW5pbWF0aW9uQmVnaW4sXG4gICAgICAgIGR1cmF0aW9uOiBhbmltYXRpb25EdXJhdGlvbixcbiAgICAgICAgaXNBY3RpdmU6IGlzQW5pbWF0aW9uQWN0aXZlLFxuICAgICAgICBlYXNpbmc6IGFuaW1hdGlvbkVhc2luZyxcbiAgICAgICAgZnJvbToge1xuICAgICAgICAgIHQ6IDBcbiAgICAgICAgfSxcbiAgICAgICAgdG86IHtcbiAgICAgICAgICB0OiAxXG4gICAgICAgIH0sXG4gICAgICAgIGtleTogXCJiYXItXCIuY29uY2F0KGFuaW1hdGlvbklkKSxcbiAgICAgICAgb25BbmltYXRpb25FbmQ6IHRoaXMuaGFuZGxlQW5pbWF0aW9uRW5kLFxuICAgICAgICBvbkFuaW1hdGlvblN0YXJ0OiB0aGlzLmhhbmRsZUFuaW1hdGlvblN0YXJ0XG4gICAgICB9LCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgdCA9IF9yZWYudDtcbiAgICAgICAgdmFyIHN0ZXBEYXRhID0gZGF0YS5tYXAoZnVuY3Rpb24gKGVudHJ5LCBpbmRleCkge1xuICAgICAgICAgIHZhciBwcmV2ID0gcHJldkRhdGEgJiYgcHJldkRhdGFbaW5kZXhdO1xuICAgICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICB2YXIgaW50ZXJwb2xhdG9yWCA9IGludGVycG9sYXRlTnVtYmVyKHByZXYueCwgZW50cnkueCk7XG4gICAgICAgICAgICB2YXIgaW50ZXJwb2xhdG9yWSA9IGludGVycG9sYXRlTnVtYmVyKHByZXYueSwgZW50cnkueSk7XG4gICAgICAgICAgICB2YXIgaW50ZXJwb2xhdG9yV2lkdGggPSBpbnRlcnBvbGF0ZU51bWJlcihwcmV2LndpZHRoLCBlbnRyeS53aWR0aCk7XG4gICAgICAgICAgICB2YXIgaW50ZXJwb2xhdG9ySGVpZ2h0ID0gaW50ZXJwb2xhdGVOdW1iZXIocHJldi5oZWlnaHQsIGVudHJ5LmhlaWdodCk7XG4gICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBlbnRyeSksIHt9LCB7XG4gICAgICAgICAgICAgIHg6IGludGVycG9sYXRvclgodCksXG4gICAgICAgICAgICAgIHk6IGludGVycG9sYXRvclkodCksXG4gICAgICAgICAgICAgIHdpZHRoOiBpbnRlcnBvbGF0b3JXaWR0aCh0KSxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBpbnRlcnBvbGF0b3JIZWlnaHQodClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGF5b3V0ID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgICAgIHZhciBfaW50ZXJwb2xhdG9ySGVpZ2h0ID0gaW50ZXJwb2xhdGVOdW1iZXIoMCwgZW50cnkuaGVpZ2h0KTtcbiAgICAgICAgICAgIHZhciBoID0gX2ludGVycG9sYXRvckhlaWdodCh0KTtcbiAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGVudHJ5KSwge30sIHtcbiAgICAgICAgICAgICAgeTogZW50cnkueSArIGVudHJ5LmhlaWdodCAtIGgsXG4gICAgICAgICAgICAgIGhlaWdodDogaFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBpbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0ZU51bWJlcigwLCBlbnRyeS53aWR0aCk7XG4gICAgICAgICAgdmFyIHcgPSBpbnRlcnBvbGF0b3IodCk7XG4gICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZW50cnkpLCB7fSwge1xuICAgICAgICAgICAgd2lkdGg6IHdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYXllciwgbnVsbCwgX3RoaXMzLnJlbmRlclJlY3RhbmdsZXNTdGF0aWNhbGx5KHN0ZXBEYXRhKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyUmVjdGFuZ2xlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJSZWN0YW5nbGVzKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGRhdGEgPSBfdGhpcyRwcm9wczMuZGF0YSxcbiAgICAgICAgaXNBbmltYXRpb25BY3RpdmUgPSBfdGhpcyRwcm9wczMuaXNBbmltYXRpb25BY3RpdmU7XG4gICAgICB2YXIgcHJldkRhdGEgPSB0aGlzLnN0YXRlLnByZXZEYXRhO1xuICAgICAgaWYgKGlzQW5pbWF0aW9uQWN0aXZlICYmIGRhdGEgJiYgZGF0YS5sZW5ndGggJiYgKCFwcmV2RGF0YSB8fCAhaXNFcXVhbChwcmV2RGF0YSwgZGF0YSkpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlclJlY3RhbmdsZXNXaXRoQW5pbWF0aW9uKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJSZWN0YW5nbGVzU3RhdGljYWxseShkYXRhKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyQmFja2dyb3VuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJCYWNrZ3JvdW5kKCkge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgZGF0YSA9IF90aGlzJHByb3BzNC5kYXRhLFxuICAgICAgICBkYXRhS2V5ID0gX3RoaXMkcHJvcHM0LmRhdGFLZXksXG4gICAgICAgIGFjdGl2ZUluZGV4ID0gX3RoaXMkcHJvcHM0LmFjdGl2ZUluZGV4O1xuICAgICAgdmFyIGJhY2tncm91bmRQcm9wcyA9IGZpbHRlclByb3BzKHRoaXMucHJvcHMuYmFja2dyb3VuZCwgZmFsc2UpO1xuICAgICAgcmV0dXJuIGRhdGEubWFwKGZ1bmN0aW9uIChlbnRyeSwgaSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBlbnRyeS52YWx1ZSxcbiAgICAgICAgICBiYWNrZ3JvdW5kID0gZW50cnkuYmFja2dyb3VuZCxcbiAgICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKGVudHJ5LCBfZXhjbHVkZWQpO1xuICAgICAgICBpZiAoIWJhY2tncm91bmQpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHJlc3QpLCB7fSwge1xuICAgICAgICAgIGZpbGw6ICcjZWVlJ1xuICAgICAgICB9LCBiYWNrZ3JvdW5kKSwgYmFja2dyb3VuZFByb3BzKSwgYWRhcHRFdmVudHNPZkNoaWxkKF90aGlzNC5wcm9wcywgZW50cnksIGkpKSwge30sIHtcbiAgICAgICAgICBvbkFuaW1hdGlvblN0YXJ0OiBfdGhpczQuaGFuZGxlQW5pbWF0aW9uU3RhcnQsXG4gICAgICAgICAgb25BbmltYXRpb25FbmQ6IF90aGlzNC5oYW5kbGVBbmltYXRpb25FbmQsXG4gICAgICAgICAgZGF0YUtleTogZGF0YUtleSxcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICBjbGFzc05hbWU6ICdyZWNoYXJ0cy1iYXItYmFja2dyb3VuZC1yZWN0YW5nbGUnXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFyUmVjdGFuZ2xlLCBfZXh0ZW5kcyh7XG4gICAgICAgICAga2V5OiBcImJhY2tncm91bmQtYmFyLVwiLmNvbmNhdChpKSxcbiAgICAgICAgICBvcHRpb246IF90aGlzNC5wcm9wcy5iYWNrZ3JvdW5kLFxuICAgICAgICAgIGlzQWN0aXZlOiBpID09PSBhY3RpdmVJbmRleFxuICAgICAgICB9LCBwcm9wcykpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlckVycm9yQmFyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckVycm9yQmFyKG5lZWRDbGlwLCBjbGlwUGF0aElkKSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5pc0FuaW1hdGlvbkFjdGl2ZSAmJiAhdGhpcy5zdGF0ZS5pc0FuaW1hdGlvbkZpbmlzaGVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgdmFyIF90aGlzJHByb3BzNSA9IHRoaXMucHJvcHMsXG4gICAgICAgIGRhdGEgPSBfdGhpcyRwcm9wczUuZGF0YSxcbiAgICAgICAgeEF4aXMgPSBfdGhpcyRwcm9wczUueEF4aXMsXG4gICAgICAgIHlBeGlzID0gX3RoaXMkcHJvcHM1LnlBeGlzLFxuICAgICAgICBsYXlvdXQgPSBfdGhpcyRwcm9wczUubGF5b3V0LFxuICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzNS5jaGlsZHJlbjtcbiAgICAgIHZhciBlcnJvckJhckl0ZW1zID0gZmluZEFsbEJ5VHlwZShjaGlsZHJlbiwgRXJyb3JCYXIpO1xuICAgICAgaWYgKCFlcnJvckJhckl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgdmFyIG9mZnNldCA9IGxheW91dCA9PT0gJ3ZlcnRpY2FsJyA/IGRhdGFbMF0uaGVpZ2h0IC8gMiA6IGRhdGFbMF0ud2lkdGggLyAyO1xuICAgICAgdmFyIGRhdGFQb2ludEZvcm1hdHRlciA9IGZ1bmN0aW9uIGRhdGFQb2ludEZvcm1hdHRlcihkYXRhUG9pbnQsIGRhdGFLZXkpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGlmIHRoZSB2YWx1ZSBjb21pbmcgZnJvbSBgZ2V0Q29tcG9zZWREYXRhYCBpcyBhbiBhcnJheSB0aGVuIHRoaXMgaXMgYSBzdGFja2VkIGJhciBjaGFydC5cbiAgICAgICAgICogYXJyWzFdIHJlcHJlc2VudHMgZW5kIHZhbHVlIG9mIHRoZSBiYXIgc2luY2UgdGhlIGRhdGEgaXMgaW4gdGhlIGZvcm0gb2YgW3N0YXJ0VmFsdWUsIGVuZFZhbHVlXS5cbiAgICAgICAgICogKi9cbiAgICAgICAgdmFyIHZhbHVlID0gQXJyYXkuaXNBcnJheShkYXRhUG9pbnQudmFsdWUpID8gZGF0YVBvaW50LnZhbHVlWzFdIDogZGF0YVBvaW50LnZhbHVlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IGRhdGFQb2ludC54LFxuICAgICAgICAgIHk6IGRhdGFQb2ludC55LFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBlcnJvclZhbDogZ2V0VmFsdWVCeURhdGFLZXkoZGF0YVBvaW50LCBkYXRhS2V5KVxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHZhciBlcnJvckJhclByb3BzID0ge1xuICAgICAgICBjbGlwUGF0aDogbmVlZENsaXAgPyBcInVybCgjY2xpcFBhdGgtXCIuY29uY2F0KGNsaXBQYXRoSWQsIFwiKVwiKSA6IG51bGxcbiAgICAgIH07XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGF5ZXIsIGVycm9yQmFyUHJvcHMsIGVycm9yQmFySXRlbXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGl0ZW0sIHtcbiAgICAgICAgICBrZXk6IFwiZXJyb3ItYmFyLVwiLmNvbmNhdChjbGlwUGF0aElkLCBcIi1cIikuY29uY2F0KGl0ZW0ucHJvcHMuZGF0YUtleSksXG4gICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICB4QXhpczogeEF4aXMsXG4gICAgICAgICAgeUF4aXM6IHlBeGlzLFxuICAgICAgICAgIGxheW91dDogbGF5b3V0LFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgICAgIGRhdGFQb2ludEZvcm1hdHRlcjogZGF0YVBvaW50Rm9ybWF0dGVyXG4gICAgICAgIH0pO1xuICAgICAgfSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNiA9IHRoaXMucHJvcHMsXG4gICAgICAgIGhpZGUgPSBfdGhpcyRwcm9wczYuaGlkZSxcbiAgICAgICAgZGF0YSA9IF90aGlzJHByb3BzNi5kYXRhLFxuICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczYuY2xhc3NOYW1lLFxuICAgICAgICB4QXhpcyA9IF90aGlzJHByb3BzNi54QXhpcyxcbiAgICAgICAgeUF4aXMgPSBfdGhpcyRwcm9wczYueUF4aXMsXG4gICAgICAgIGxlZnQgPSBfdGhpcyRwcm9wczYubGVmdCxcbiAgICAgICAgdG9wID0gX3RoaXMkcHJvcHM2LnRvcCxcbiAgICAgICAgd2lkdGggPSBfdGhpcyRwcm9wczYud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF90aGlzJHByb3BzNi5oZWlnaHQsXG4gICAgICAgIGlzQW5pbWF0aW9uQWN0aXZlID0gX3RoaXMkcHJvcHM2LmlzQW5pbWF0aW9uQWN0aXZlLFxuICAgICAgICBiYWNrZ3JvdW5kID0gX3RoaXMkcHJvcHM2LmJhY2tncm91bmQsXG4gICAgICAgIGlkID0gX3RoaXMkcHJvcHM2LmlkO1xuICAgICAgaWYgKGhpZGUgfHwgIWRhdGEgfHwgIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgdmFyIGlzQW5pbWF0aW9uRmluaXNoZWQgPSB0aGlzLnN0YXRlLmlzQW5pbWF0aW9uRmluaXNoZWQ7XG4gICAgICB2YXIgbGF5ZXJDbGFzcyA9IGNsc3goJ3JlY2hhcnRzLWJhcicsIGNsYXNzTmFtZSk7XG4gICAgICB2YXIgbmVlZENsaXBYID0geEF4aXMgJiYgeEF4aXMuYWxsb3dEYXRhT3ZlcmZsb3c7XG4gICAgICB2YXIgbmVlZENsaXBZID0geUF4aXMgJiYgeUF4aXMuYWxsb3dEYXRhT3ZlcmZsb3c7XG4gICAgICB2YXIgbmVlZENsaXAgPSBuZWVkQ2xpcFggfHwgbmVlZENsaXBZO1xuICAgICAgdmFyIGNsaXBQYXRoSWQgPSBpc05pbChpZCkgPyB0aGlzLmlkIDogaWQ7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGF5ZXIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBsYXllckNsYXNzXG4gICAgICB9LCBuZWVkQ2xpcFggfHwgbmVlZENsaXBZID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkZWZzXCIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2xpcFBhdGhcIiwge1xuICAgICAgICBpZDogXCJjbGlwUGF0aC1cIi5jb25jYXQoY2xpcFBhdGhJZClcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgICAgIHg6IG5lZWRDbGlwWCA/IGxlZnQgOiBsZWZ0IC0gd2lkdGggLyAyLFxuICAgICAgICB5OiBuZWVkQ2xpcFkgPyB0b3AgOiB0b3AgLSBoZWlnaHQgLyAyLFxuICAgICAgICB3aWR0aDogbmVlZENsaXBYID8gd2lkdGggOiB3aWR0aCAqIDIsXG4gICAgICAgIGhlaWdodDogbmVlZENsaXBZID8gaGVpZ2h0IDogaGVpZ2h0ICogMlxuICAgICAgfSkpKSA6IG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExheWVyLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy1iYXItcmVjdGFuZ2xlc1wiLFxuICAgICAgICBjbGlwUGF0aDogbmVlZENsaXAgPyBcInVybCgjY2xpcFBhdGgtXCIuY29uY2F0KGNsaXBQYXRoSWQsIFwiKVwiKSA6IG51bGxcbiAgICAgIH0sIGJhY2tncm91bmQgPyB0aGlzLnJlbmRlckJhY2tncm91bmQoKSA6IG51bGwsIHRoaXMucmVuZGVyUmVjdGFuZ2xlcygpKSwgdGhpcy5yZW5kZXJFcnJvckJhcihuZWVkQ2xpcCwgY2xpcFBhdGhJZCksICghaXNBbmltYXRpb25BY3RpdmUgfHwgaXNBbmltYXRpb25GaW5pc2hlZCkgJiYgTGFiZWxMaXN0LnJlbmRlckNhbGxCeVBhcmVudCh0aGlzLnByb3BzLCBkYXRhKSk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgaWYgKG5leHRQcm9wcy5hbmltYXRpb25JZCAhPT0gcHJldlN0YXRlLnByZXZBbmltYXRpb25JZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByZXZBbmltYXRpb25JZDogbmV4dFByb3BzLmFuaW1hdGlvbklkLFxuICAgICAgICAgIGN1ckRhdGE6IG5leHRQcm9wcy5kYXRhLFxuICAgICAgICAgIHByZXZEYXRhOiBwcmV2U3RhdGUuY3VyRGF0YVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKG5leHRQcm9wcy5kYXRhICE9PSBwcmV2U3RhdGUuY3VyRGF0YSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGN1ckRhdGE6IG5leHRQcm9wcy5kYXRhXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1dKTtcbn0oUHVyZUNvbXBvbmVudCk7XG5fQmFyID0gQmFyO1xuX2RlZmluZVByb3BlcnR5KEJhciwgXCJkaXNwbGF5TmFtZVwiLCAnQmFyJyk7XG5fZGVmaW5lUHJvcGVydHkoQmFyLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIHhBeGlzSWQ6IDAsXG4gIHlBeGlzSWQ6IDAsXG4gIGxlZ2VuZFR5cGU6ICdyZWN0JyxcbiAgbWluUG9pbnRTaXplOiAwLFxuICBoaWRlOiBmYWxzZSxcbiAgZGF0YTogW10sXG4gIGxheW91dDogJ3ZlcnRpY2FsJyxcbiAgYWN0aXZlQmFyOiBmYWxzZSxcbiAgaXNBbmltYXRpb25BY3RpdmU6ICFHbG9iYWwuaXNTc3IsXG4gIGFuaW1hdGlvbkJlZ2luOiAwLFxuICBhbmltYXRpb25EdXJhdGlvbjogNDAwLFxuICBhbmltYXRpb25FYXNpbmc6ICdlYXNlJ1xufSk7XG4vKipcbiAqIENvbXBvc2UgdGhlIGRhdGEgb2YgZWFjaCBncm91cFxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BzIGZvciB0aGUgY29tcG9uZW50XG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSAgICAgICAgQW4gaW5zdGFuY2Ugb2YgQmFyXG4gKiBAcGFyYW0ge0FycmF5fSBiYXJQb3NpdGlvbiAgVGhlIG9mZnNldCBhbmQgc2l6ZSBvZiBlYWNoIGJhclxuICogQHBhcmFtIHtPYmplY3R9IHhBeGlzICAgICAgIFRoZSBjb25maWd1cmF0aW9uIG9mIHgtYXhpc1xuICogQHBhcmFtIHtPYmplY3R9IHlBeGlzICAgICAgIFRoZSBjb25maWd1cmF0aW9uIG9mIHktYXhpc1xuICogQHBhcmFtIHtBcnJheX0gc3RhY2tlZERhdGEgIFRoZSBzdGFja2VkIGRhdGEgb2YgYSBiYXIgaXRlbVxuICogQHJldHVybntBcnJheX0gQ29tcG9zZWQgZGF0YVxuICovXG5fZGVmaW5lUHJvcGVydHkoQmFyLCBcImdldENvbXBvc2VkRGF0YVwiLCBmdW5jdGlvbiAoX3JlZjIpIHtcbiAgdmFyIHByb3BzID0gX3JlZjIucHJvcHMsXG4gICAgaXRlbSA9IF9yZWYyLml0ZW0sXG4gICAgYmFyUG9zaXRpb24gPSBfcmVmMi5iYXJQb3NpdGlvbixcbiAgICBiYW5kU2l6ZSA9IF9yZWYyLmJhbmRTaXplLFxuICAgIHhBeGlzID0gX3JlZjIueEF4aXMsXG4gICAgeUF4aXMgPSBfcmVmMi55QXhpcyxcbiAgICB4QXhpc1RpY2tzID0gX3JlZjIueEF4aXNUaWNrcyxcbiAgICB5QXhpc1RpY2tzID0gX3JlZjIueUF4aXNUaWNrcyxcbiAgICBzdGFja2VkRGF0YSA9IF9yZWYyLnN0YWNrZWREYXRhLFxuICAgIGRhdGFTdGFydEluZGV4ID0gX3JlZjIuZGF0YVN0YXJ0SW5kZXgsXG4gICAgZGlzcGxheWVkRGF0YSA9IF9yZWYyLmRpc3BsYXllZERhdGEsXG4gICAgb2Zmc2V0ID0gX3JlZjIub2Zmc2V0O1xuICB2YXIgcG9zID0gZmluZFBvc2l0aW9uT2ZCYXIoYmFyUG9zaXRpb24sIGl0ZW0pO1xuICBpZiAoIXBvcykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBsYXlvdXQgPSBwcm9wcy5sYXlvdXQ7XG4gIHZhciBpdGVtRGVmYXVsdFByb3BzID0gaXRlbS50eXBlLmRlZmF1bHRQcm9wcztcbiAgdmFyIGl0ZW1Qcm9wcyA9IGl0ZW1EZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCA/IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaXRlbURlZmF1bHRQcm9wcyksIGl0ZW0ucHJvcHMpIDogaXRlbS5wcm9wcztcbiAgdmFyIGRhdGFLZXkgPSBpdGVtUHJvcHMuZGF0YUtleSxcbiAgICBjaGlsZHJlbiA9IGl0ZW1Qcm9wcy5jaGlsZHJlbixcbiAgICBtaW5Qb2ludFNpemVQcm9wID0gaXRlbVByb3BzLm1pblBvaW50U2l6ZTtcbiAgdmFyIG51bWVyaWNBeGlzID0gbGF5b3V0ID09PSAnaG9yaXpvbnRhbCcgPyB5QXhpcyA6IHhBeGlzO1xuICB2YXIgc3RhY2tlZERvbWFpbiA9IHN0YWNrZWREYXRhID8gbnVtZXJpY0F4aXMuc2NhbGUuZG9tYWluKCkgOiBudWxsO1xuICB2YXIgYmFzZVZhbHVlID0gZ2V0QmFzZVZhbHVlT2ZCYXIoe1xuICAgIG51bWVyaWNBeGlzOiBudW1lcmljQXhpc1xuICB9KTtcbiAgdmFyIGNlbGxzID0gZmluZEFsbEJ5VHlwZShjaGlsZHJlbiwgQ2VsbCk7XG4gIHZhciByZWN0cyA9IGRpc3BsYXllZERhdGEubWFwKGZ1bmN0aW9uIChlbnRyeSwgaW5kZXgpIHtcbiAgICB2YXIgdmFsdWUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJhY2tncm91bmQ7XG4gICAgaWYgKHN0YWNrZWREYXRhKSB7XG4gICAgICB2YWx1ZSA9IHRydW5jYXRlQnlEb21haW4oc3RhY2tlZERhdGFbZGF0YVN0YXJ0SW5kZXggKyBpbmRleF0sIHN0YWNrZWREb21haW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IGdldFZhbHVlQnlEYXRhS2V5KGVudHJ5LCBkYXRhS2V5KTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSBbYmFzZVZhbHVlLCB2YWx1ZV07XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBtaW5Qb2ludFNpemUgPSBtaW5Qb2ludFNpemVDYWxsYmFjayhtaW5Qb2ludFNpemVQcm9wLCBfQmFyLmRlZmF1bHRQcm9wcy5taW5Qb2ludFNpemUpKHZhbHVlWzFdLCBpbmRleCk7XG4gICAgaWYgKGxheW91dCA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICB2YXIgX3JlZjQ7XG4gICAgICB2YXIgX3JlZjMgPSBbeUF4aXMuc2NhbGUodmFsdWVbMF0pLCB5QXhpcy5zY2FsZSh2YWx1ZVsxXSldLFxuICAgICAgICBiYXNlVmFsdWVTY2FsZSA9IF9yZWYzWzBdLFxuICAgICAgICBjdXJyZW50VmFsdWVTY2FsZSA9IF9yZWYzWzFdO1xuICAgICAgeCA9IGdldENhdGVDb29yZGluYXRlT2ZCYXIoe1xuICAgICAgICBheGlzOiB4QXhpcyxcbiAgICAgICAgdGlja3M6IHhBeGlzVGlja3MsXG4gICAgICAgIGJhbmRTaXplOiBiYW5kU2l6ZSxcbiAgICAgICAgb2Zmc2V0OiBwb3Mub2Zmc2V0LFxuICAgICAgICBlbnRyeTogZW50cnksXG4gICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgfSk7XG4gICAgICB5ID0gKF9yZWY0ID0gY3VycmVudFZhbHVlU2NhbGUgIT09IG51bGwgJiYgY3VycmVudFZhbHVlU2NhbGUgIT09IHZvaWQgMCA/IGN1cnJlbnRWYWx1ZVNjYWxlIDogYmFzZVZhbHVlU2NhbGUpICE9PSBudWxsICYmIF9yZWY0ICE9PSB2b2lkIDAgPyBfcmVmNCA6IHVuZGVmaW5lZDtcbiAgICAgIHdpZHRoID0gcG9zLnNpemU7XG4gICAgICB2YXIgY29tcHV0ZWRIZWlnaHQgPSBiYXNlVmFsdWVTY2FsZSAtIGN1cnJlbnRWYWx1ZVNjYWxlO1xuICAgICAgaGVpZ2h0ID0gTnVtYmVyLmlzTmFOKGNvbXB1dGVkSGVpZ2h0KSA/IDAgOiBjb21wdXRlZEhlaWdodDtcbiAgICAgIGJhY2tncm91bmQgPSB7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHlBeGlzLnksXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiB5QXhpcy5oZWlnaHRcbiAgICAgIH07XG4gICAgICBpZiAoTWF0aC5hYnMobWluUG9pbnRTaXplKSA+IDAgJiYgTWF0aC5hYnMoaGVpZ2h0KSA8IE1hdGguYWJzKG1pblBvaW50U2l6ZSkpIHtcbiAgICAgICAgdmFyIGRlbHRhID0gbWF0aFNpZ24oaGVpZ2h0IHx8IG1pblBvaW50U2l6ZSkgKiAoTWF0aC5hYnMobWluUG9pbnRTaXplKSAtIE1hdGguYWJzKGhlaWdodCkpO1xuICAgICAgICB5IC09IGRlbHRhO1xuICAgICAgICBoZWlnaHQgKz0gZGVsdGE7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfcmVmNSA9IFt4QXhpcy5zY2FsZSh2YWx1ZVswXSksIHhBeGlzLnNjYWxlKHZhbHVlWzFdKV0sXG4gICAgICAgIF9iYXNlVmFsdWVTY2FsZSA9IF9yZWY1WzBdLFxuICAgICAgICBfY3VycmVudFZhbHVlU2NhbGUgPSBfcmVmNVsxXTtcbiAgICAgIHggPSBfYmFzZVZhbHVlU2NhbGU7XG4gICAgICB5ID0gZ2V0Q2F0ZUNvb3JkaW5hdGVPZkJhcih7XG4gICAgICAgIGF4aXM6IHlBeGlzLFxuICAgICAgICB0aWNrczogeUF4aXNUaWNrcyxcbiAgICAgICAgYmFuZFNpemU6IGJhbmRTaXplLFxuICAgICAgICBvZmZzZXQ6IHBvcy5vZmZzZXQsXG4gICAgICAgIGVudHJ5OiBlbnRyeSxcbiAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICB9KTtcbiAgICAgIHdpZHRoID0gX2N1cnJlbnRWYWx1ZVNjYWxlIC0gX2Jhc2VWYWx1ZVNjYWxlO1xuICAgICAgaGVpZ2h0ID0gcG9zLnNpemU7XG4gICAgICBiYWNrZ3JvdW5kID0ge1xuICAgICAgICB4OiB4QXhpcy54LFxuICAgICAgICB5OiB5LFxuICAgICAgICB3aWR0aDogeEF4aXMud2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICB9O1xuICAgICAgaWYgKE1hdGguYWJzKG1pblBvaW50U2l6ZSkgPiAwICYmIE1hdGguYWJzKHdpZHRoKSA8IE1hdGguYWJzKG1pblBvaW50U2l6ZSkpIHtcbiAgICAgICAgdmFyIF9kZWx0YSA9IG1hdGhTaWduKHdpZHRoIHx8IG1pblBvaW50U2l6ZSkgKiAoTWF0aC5hYnMobWluUG9pbnRTaXplKSAtIE1hdGguYWJzKHdpZHRoKSk7XG4gICAgICAgIHdpZHRoICs9IF9kZWx0YTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBlbnRyeSksIHt9LCB7XG4gICAgICB4OiB4LFxuICAgICAgeTogeSxcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgdmFsdWU6IHN0YWNrZWREYXRhID8gdmFsdWUgOiB2YWx1ZVsxXSxcbiAgICAgIHBheWxvYWQ6IGVudHJ5LFxuICAgICAgYmFja2dyb3VuZDogYmFja2dyb3VuZFxuICAgIH0sIGNlbGxzICYmIGNlbGxzW2luZGV4XSAmJiBjZWxsc1tpbmRleF0ucHJvcHMpLCB7fSwge1xuICAgICAgdG9vbHRpcFBheWxvYWQ6IFtnZXRUb29sdGlwSXRlbShpdGVtLCBlbnRyeSldLFxuICAgICAgdG9vbHRpcFBvc2l0aW9uOiB7XG4gICAgICAgIHg6IHggKyB3aWR0aCAvIDIsXG4gICAgICAgIHk6IHkgKyBoZWlnaHQgLyAyXG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gX29iamVjdFNwcmVhZCh7XG4gICAgZGF0YTogcmVjdHMsXG4gICAgbGF5b3V0OiBsYXlvdXRcbiAgfSwgb2Zmc2V0KTtcbn0pOyIsImZ1bmN0aW9uIF90eXBlb2YobykgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9IDogZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87IH0sIF90eXBlb2Yobyk7IH1cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOyB9IH1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5mdW5jdGlvbiBfY2FsbFN1cGVyKHQsIG8sIGUpIHsgcmV0dXJuIG8gPSBfZ2V0UHJvdG90eXBlT2YobyksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSA/IFJlZmxlY3QuY29uc3RydWN0KG8sIGUgfHwgW10sIF9nZXRQcm90b3R5cGVPZih0KS5jb25zdHJ1Y3RvcikgOiBvLmFwcGx5KHQsIGUpKTsgfVxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSBlbHNlIGlmIChjYWxsICE9PSB2b2lkIDApIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IHRyeSB7IHZhciB0ID0gIUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgfSBjYXRjaCAodCkge30gcmV0dXJuIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgcmV0dXJuICEhdDsgfSkoKTsgfVxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgQnJ1c2hcbiAqL1xuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQsIENoaWxkcmVuIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyBzY2FsZVBvaW50IH0gZnJvbSAndmljdG9yeS12ZW5kb3IvZDMtc2NhbGUnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnbG9kYXNoL2lzRnVuY3Rpb24nO1xuaW1wb3J0IHJhbmdlIGZyb20gJ2xvZGFzaC9yYW5nZSc7XG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4uL2NvbnRhaW5lci9MYXllcic7XG5pbXBvcnQgeyBUZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50L1RleHQnO1xuaW1wb3J0IHsgZ2V0VmFsdWVCeURhdGFLZXkgfSBmcm9tICcuLi91dGlsL0NoYXJ0VXRpbHMnO1xuaW1wb3J0IHsgaXNOdW1iZXIgfSBmcm9tICcuLi91dGlsL0RhdGFVdGlscyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZWZpeFN0eWxlIH0gZnJvbSAnLi4vdXRpbC9Dc3NQcmVmaXhVdGlscyc7XG5pbXBvcnQgeyBmaWx0ZXJQcm9wcyB9IGZyb20gJy4uL3V0aWwvUmVhY3RVdGlscyc7XG52YXIgY3JlYXRlU2NhbGUgPSBmdW5jdGlvbiBjcmVhdGVTY2FsZShfcmVmKSB7XG4gIHZhciBkYXRhID0gX3JlZi5kYXRhLFxuICAgIHN0YXJ0SW5kZXggPSBfcmVmLnN0YXJ0SW5kZXgsXG4gICAgZW5kSW5kZXggPSBfcmVmLmVuZEluZGV4LFxuICAgIHggPSBfcmVmLngsXG4gICAgd2lkdGggPSBfcmVmLndpZHRoLFxuICAgIHRyYXZlbGxlcldpZHRoID0gX3JlZi50cmF2ZWxsZXJXaWR0aDtcbiAgaWYgKCFkYXRhIHx8ICFkYXRhLmxlbmd0aCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICB2YXIgbGVuID0gZGF0YS5sZW5ndGg7XG4gIHZhciBzY2FsZSA9IHNjYWxlUG9pbnQoKS5kb21haW4ocmFuZ2UoMCwgbGVuKSkucmFuZ2UoW3gsIHggKyB3aWR0aCAtIHRyYXZlbGxlcldpZHRoXSk7XG4gIHZhciBzY2FsZVZhbHVlcyA9IHNjYWxlLmRvbWFpbigpLm1hcChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICByZXR1cm4gc2NhbGUoZW50cnkpO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBpc1RleHRBY3RpdmU6IGZhbHNlLFxuICAgIGlzU2xpZGVNb3Zpbmc6IGZhbHNlLFxuICAgIGlzVHJhdmVsbGVyTW92aW5nOiBmYWxzZSxcbiAgICBpc1RyYXZlbGxlckZvY3VzZWQ6IGZhbHNlLFxuICAgIHN0YXJ0WDogc2NhbGUoc3RhcnRJbmRleCksXG4gICAgZW5kWDogc2NhbGUoZW5kSW5kZXgpLFxuICAgIHNjYWxlOiBzY2FsZSxcbiAgICBzY2FsZVZhbHVlczogc2NhbGVWYWx1ZXNcbiAgfTtcbn07XG52YXIgaXNUb3VjaCA9IGZ1bmN0aW9uIGlzVG91Y2goZSkge1xuICByZXR1cm4gZS5jaGFuZ2VkVG91Y2hlcyAmJiAhIWUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoO1xufTtcbmV4cG9ydCB2YXIgQnJ1c2ggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdXJlQ29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIEJydXNoKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCcnVzaCk7XG4gICAgX3RoaXMgPSBfY2FsbFN1cGVyKHRoaXMsIEJydXNoLCBbcHJvcHNdKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwiaGFuZGxlRHJhZ1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKF90aGlzLmxlYXZlVGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzLmxlYXZlVGltZXIpO1xuICAgICAgICBfdGhpcy5sZWF2ZVRpbWVyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChfdGhpcy5zdGF0ZS5pc1RyYXZlbGxlck1vdmluZykge1xuICAgICAgICBfdGhpcy5oYW5kbGVUcmF2ZWxsZXJNb3ZlKGUpO1xuICAgICAgfSBlbHNlIGlmIChfdGhpcy5zdGF0ZS5pc1NsaWRlTW92aW5nKSB7XG4gICAgICAgIF90aGlzLmhhbmRsZVNsaWRlRHJhZyhlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwiaGFuZGxlVG91Y2hNb3ZlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZS5jaGFuZ2VkVG91Y2hlcyAhPSBudWxsICYmIGUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBfdGhpcy5oYW5kbGVEcmFnKGUuY2hhbmdlZFRvdWNoZXNbMF0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJoYW5kbGVEcmFnRW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNUcmF2ZWxsZXJNb3Zpbmc6IGZhbHNlLFxuICAgICAgICBpc1NsaWRlTW92aW5nOiBmYWxzZVxuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBlbmRJbmRleCA9IF90aGlzJHByb3BzLmVuZEluZGV4LFxuICAgICAgICAgIG9uRHJhZ0VuZCA9IF90aGlzJHByb3BzLm9uRHJhZ0VuZCxcbiAgICAgICAgICBzdGFydEluZGV4ID0gX3RoaXMkcHJvcHMuc3RhcnRJbmRleDtcbiAgICAgICAgb25EcmFnRW5kID09PSBudWxsIHx8IG9uRHJhZ0VuZCA9PT0gdm9pZCAwIHx8IG9uRHJhZ0VuZCh7XG4gICAgICAgICAgZW5kSW5kZXg6IGVuZEluZGV4LFxuICAgICAgICAgIHN0YXJ0SW5kZXg6IHN0YXJ0SW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIF90aGlzLmRldGFjaERyYWdFbmRMaXN0ZW5lcigpO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJoYW5kbGVMZWF2ZVdyYXBwZXJcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnN0YXRlLmlzVHJhdmVsbGVyTW92aW5nIHx8IF90aGlzLnN0YXRlLmlzU2xpZGVNb3ZpbmcpIHtcbiAgICAgICAgX3RoaXMubGVhdmVUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KF90aGlzLmhhbmRsZURyYWdFbmQsIF90aGlzLnByb3BzLmxlYXZlVGltZU91dCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcImhhbmRsZUVudGVyU2xpZGVPclRyYXZlbGxlclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzVGV4dEFjdGl2ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcImhhbmRsZUxlYXZlU2xpZGVPclRyYXZlbGxlclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzVGV4dEFjdGl2ZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJoYW5kbGVTbGlkZURyYWdTdGFydFwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGV2ZW50ID0gaXNUb3VjaChlKSA/IGUuY2hhbmdlZFRvdWNoZXNbMF0gOiBlO1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc1RyYXZlbGxlck1vdmluZzogZmFsc2UsXG4gICAgICAgIGlzU2xpZGVNb3Zpbmc6IHRydWUsXG4gICAgICAgIHNsaWRlTW92ZVN0YXJ0WDogZXZlbnQucGFnZVhcbiAgICAgIH0pO1xuICAgICAgX3RoaXMuYXR0YWNoRHJhZ0VuZExpc3RlbmVyKCk7XG4gICAgfSk7XG4gICAgX3RoaXMudHJhdmVsbGVyRHJhZ1N0YXJ0SGFuZGxlcnMgPSB7XG4gICAgICBzdGFydFg6IF90aGlzLmhhbmRsZVRyYXZlbGxlckRyYWdTdGFydC5iaW5kKF90aGlzLCAnc3RhcnRYJyksXG4gICAgICBlbmRYOiBfdGhpcy5oYW5kbGVUcmF2ZWxsZXJEcmFnU3RhcnQuYmluZChfdGhpcywgJ2VuZFgnKVxuICAgIH07XG4gICAgX3RoaXMuc3RhdGUgPSB7fTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2luaGVyaXRzKEJydXNoLCBfUHVyZUNvbXBvbmVudCk7XG4gIHJldHVybiBfY3JlYXRlQ2xhc3MoQnJ1c2gsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgaWYgKHRoaXMubGVhdmVUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5sZWF2ZVRpbWVyKTtcbiAgICAgICAgdGhpcy5sZWF2ZVRpbWVyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGV0YWNoRHJhZ0VuZExpc3RlbmVyKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEluZGV4XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEluZGV4KF9yZWYyKSB7XG4gICAgICB2YXIgc3RhcnRYID0gX3JlZjIuc3RhcnRYLFxuICAgICAgICBlbmRYID0gX3JlZjIuZW5kWDtcbiAgICAgIHZhciBzY2FsZVZhbHVlcyA9IHRoaXMuc3RhdGUuc2NhbGVWYWx1ZXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgZ2FwID0gX3RoaXMkcHJvcHMyLmdhcCxcbiAgICAgICAgZGF0YSA9IF90aGlzJHByb3BzMi5kYXRhO1xuICAgICAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBtaW4gPSBNYXRoLm1pbihzdGFydFgsIGVuZFgpO1xuICAgICAgdmFyIG1heCA9IE1hdGgubWF4KHN0YXJ0WCwgZW5kWCk7XG4gICAgICB2YXIgbWluSW5kZXggPSBCcnVzaC5nZXRJbmRleEluUmFuZ2Uoc2NhbGVWYWx1ZXMsIG1pbik7XG4gICAgICB2YXIgbWF4SW5kZXggPSBCcnVzaC5nZXRJbmRleEluUmFuZ2Uoc2NhbGVWYWx1ZXMsIG1heCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydEluZGV4OiBtaW5JbmRleCAtIG1pbkluZGV4ICUgZ2FwLFxuICAgICAgICBlbmRJbmRleDogbWF4SW5kZXggPT09IGxhc3RJbmRleCA/IGxhc3RJbmRleCA6IG1heEluZGV4IC0gbWF4SW5kZXggJSBnYXBcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFRleHRPZlRpY2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VGV4dE9mVGljayhpbmRleCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGRhdGEgPSBfdGhpcyRwcm9wczMuZGF0YSxcbiAgICAgICAgdGlja0Zvcm1hdHRlciA9IF90aGlzJHByb3BzMy50aWNrRm9ybWF0dGVyLFxuICAgICAgICBkYXRhS2V5ID0gX3RoaXMkcHJvcHMzLmRhdGFLZXk7XG4gICAgICB2YXIgdGV4dCA9IGdldFZhbHVlQnlEYXRhS2V5KGRhdGFbaW5kZXhdLCBkYXRhS2V5LCBpbmRleCk7XG4gICAgICByZXR1cm4gaXNGdW5jdGlvbih0aWNrRm9ybWF0dGVyKSA/IHRpY2tGb3JtYXR0ZXIodGV4dCwgaW5kZXgpIDogdGV4dDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYXR0YWNoRHJhZ0VuZExpc3RlbmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0dGFjaERyYWdFbmRMaXN0ZW5lcigpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5oYW5kbGVEcmFnRW5kLCB0cnVlKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlRHJhZ0VuZCwgdHJ1ZSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5oYW5kbGVEcmFnLCB0cnVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGV0YWNoRHJhZ0VuZExpc3RlbmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRldGFjaERyYWdFbmRMaXN0ZW5lcigpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5oYW5kbGVEcmFnRW5kLCB0cnVlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlRHJhZ0VuZCwgdHJ1ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5oYW5kbGVEcmFnLCB0cnVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFuZGxlU2xpZGVEcmFnXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVNsaWRlRHJhZyhlKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUgPSB0aGlzLnN0YXRlLFxuICAgICAgICBzbGlkZU1vdmVTdGFydFggPSBfdGhpcyRzdGF0ZS5zbGlkZU1vdmVTdGFydFgsXG4gICAgICAgIHN0YXJ0WCA9IF90aGlzJHN0YXRlLnN0YXJ0WCxcbiAgICAgICAgZW5kWCA9IF90aGlzJHN0YXRlLmVuZFg7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgeCA9IF90aGlzJHByb3BzNC54LFxuICAgICAgICB3aWR0aCA9IF90aGlzJHByb3BzNC53aWR0aCxcbiAgICAgICAgdHJhdmVsbGVyV2lkdGggPSBfdGhpcyRwcm9wczQudHJhdmVsbGVyV2lkdGgsXG4gICAgICAgIHN0YXJ0SW5kZXggPSBfdGhpcyRwcm9wczQuc3RhcnRJbmRleCxcbiAgICAgICAgZW5kSW5kZXggPSBfdGhpcyRwcm9wczQuZW5kSW5kZXgsXG4gICAgICAgIG9uQ2hhbmdlID0gX3RoaXMkcHJvcHM0Lm9uQ2hhbmdlO1xuICAgICAgdmFyIGRlbHRhID0gZS5wYWdlWCAtIHNsaWRlTW92ZVN0YXJ0WDtcbiAgICAgIGlmIChkZWx0YSA+IDApIHtcbiAgICAgICAgZGVsdGEgPSBNYXRoLm1pbihkZWx0YSwgeCArIHdpZHRoIC0gdHJhdmVsbGVyV2lkdGggLSBlbmRYLCB4ICsgd2lkdGggLSB0cmF2ZWxsZXJXaWR0aCAtIHN0YXJ0WCk7XG4gICAgICB9IGVsc2UgaWYgKGRlbHRhIDwgMCkge1xuICAgICAgICBkZWx0YSA9IE1hdGgubWF4KGRlbHRhLCB4IC0gc3RhcnRYLCB4IC0gZW5kWCk7XG4gICAgICB9XG4gICAgICB2YXIgbmV3SW5kZXggPSB0aGlzLmdldEluZGV4KHtcbiAgICAgICAgc3RhcnRYOiBzdGFydFggKyBkZWx0YSxcbiAgICAgICAgZW5kWDogZW5kWCArIGRlbHRhXG4gICAgICB9KTtcbiAgICAgIGlmICgobmV3SW5kZXguc3RhcnRJbmRleCAhPT0gc3RhcnRJbmRleCB8fCBuZXdJbmRleC5lbmRJbmRleCAhPT0gZW5kSW5kZXgpICYmIG9uQ2hhbmdlKSB7XG4gICAgICAgIG9uQ2hhbmdlKG5ld0luZGV4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzdGFydFg6IHN0YXJ0WCArIGRlbHRhLFxuICAgICAgICBlbmRYOiBlbmRYICsgZGVsdGEsXG4gICAgICAgIHNsaWRlTW92ZVN0YXJ0WDogZS5wYWdlWFxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZVRyYXZlbGxlckRyYWdTdGFydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVUcmF2ZWxsZXJEcmFnU3RhcnQoaWQsIGUpIHtcbiAgICAgIHZhciBldmVudCA9IGlzVG91Y2goZSkgPyBlLmNoYW5nZWRUb3VjaGVzWzBdIDogZTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc1NsaWRlTW92aW5nOiBmYWxzZSxcbiAgICAgICAgaXNUcmF2ZWxsZXJNb3Zpbmc6IHRydWUsXG4gICAgICAgIG1vdmluZ1RyYXZlbGxlcklkOiBpZCxcbiAgICAgICAgYnJ1c2hNb3ZlU3RhcnRYOiBldmVudC5wYWdlWFxuICAgICAgfSk7XG4gICAgICB0aGlzLmF0dGFjaERyYWdFbmRMaXN0ZW5lcigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYW5kbGVUcmF2ZWxsZXJNb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVRyYXZlbGxlck1vdmUoZSkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlMiA9IHRoaXMuc3RhdGUsXG4gICAgICAgIGJydXNoTW92ZVN0YXJ0WCA9IF90aGlzJHN0YXRlMi5icnVzaE1vdmVTdGFydFgsXG4gICAgICAgIG1vdmluZ1RyYXZlbGxlcklkID0gX3RoaXMkc3RhdGUyLm1vdmluZ1RyYXZlbGxlcklkLFxuICAgICAgICBlbmRYID0gX3RoaXMkc3RhdGUyLmVuZFgsXG4gICAgICAgIHN0YXJ0WCA9IF90aGlzJHN0YXRlMi5zdGFydFg7XG4gICAgICB2YXIgcHJldlZhbHVlID0gdGhpcy5zdGF0ZVttb3ZpbmdUcmF2ZWxsZXJJZF07XG4gICAgICB2YXIgX3RoaXMkcHJvcHM1ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgeCA9IF90aGlzJHByb3BzNS54LFxuICAgICAgICB3aWR0aCA9IF90aGlzJHByb3BzNS53aWR0aCxcbiAgICAgICAgdHJhdmVsbGVyV2lkdGggPSBfdGhpcyRwcm9wczUudHJhdmVsbGVyV2lkdGgsXG4gICAgICAgIG9uQ2hhbmdlID0gX3RoaXMkcHJvcHM1Lm9uQ2hhbmdlLFxuICAgICAgICBnYXAgPSBfdGhpcyRwcm9wczUuZ2FwLFxuICAgICAgICBkYXRhID0gX3RoaXMkcHJvcHM1LmRhdGE7XG4gICAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgICBzdGFydFg6IHRoaXMuc3RhdGUuc3RhcnRYLFxuICAgICAgICBlbmRYOiB0aGlzLnN0YXRlLmVuZFhcbiAgICAgIH07XG4gICAgICB2YXIgZGVsdGEgPSBlLnBhZ2VYIC0gYnJ1c2hNb3ZlU3RhcnRYO1xuICAgICAgaWYgKGRlbHRhID4gMCkge1xuICAgICAgICBkZWx0YSA9IE1hdGgubWluKGRlbHRhLCB4ICsgd2lkdGggLSB0cmF2ZWxsZXJXaWR0aCAtIHByZXZWYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGRlbHRhIDwgMCkge1xuICAgICAgICBkZWx0YSA9IE1hdGgubWF4KGRlbHRhLCB4IC0gcHJldlZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHBhcmFtc1ttb3ZpbmdUcmF2ZWxsZXJJZF0gPSBwcmV2VmFsdWUgKyBkZWx0YTtcbiAgICAgIHZhciBuZXdJbmRleCA9IHRoaXMuZ2V0SW5kZXgocGFyYW1zKTtcbiAgICAgIHZhciBzdGFydEluZGV4ID0gbmV3SW5kZXguc3RhcnRJbmRleCxcbiAgICAgICAgZW5kSW5kZXggPSBuZXdJbmRleC5lbmRJbmRleDtcbiAgICAgIHZhciBpc0Z1bGxHYXAgPSBmdW5jdGlvbiBpc0Z1bGxHYXAoKSB7XG4gICAgICAgIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChtb3ZpbmdUcmF2ZWxsZXJJZCA9PT0gJ3N0YXJ0WCcgJiYgKGVuZFggPiBzdGFydFggPyBzdGFydEluZGV4ICUgZ2FwID09PSAwIDogZW5kSW5kZXggJSBnYXAgPT09IDApIHx8IGVuZFggPCBzdGFydFggJiYgZW5kSW5kZXggPT09IGxhc3RJbmRleCB8fCBtb3ZpbmdUcmF2ZWxsZXJJZCA9PT0gJ2VuZFgnICYmIChlbmRYID4gc3RhcnRYID8gZW5kSW5kZXggJSBnYXAgPT09IDAgOiBzdGFydEluZGV4ICUgZ2FwID09PSAwKSB8fCBlbmRYID4gc3RhcnRYICYmIGVuZEluZGV4ID09PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuICAgICAgdGhpcy5zZXRTdGF0ZShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBtb3ZpbmdUcmF2ZWxsZXJJZCwgcHJldlZhbHVlICsgZGVsdGEpLCBcImJydXNoTW92ZVN0YXJ0WFwiLCBlLnBhZ2VYKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgICAgICBpZiAoaXNGdWxsR2FwKCkpIHtcbiAgICAgICAgICAgIG9uQ2hhbmdlKG5ld0luZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYW5kbGVUcmF2ZWxsZXJNb3ZlS2V5Ym9hcmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlVHJhdmVsbGVyTW92ZUtleWJvYXJkKGRpcmVjdGlvbiwgaWQpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuICAgICAgLy8gc2NhbGVWYWx1ZXMgYXJlIGEgbGlzdCBvZiBjb29yZGluYXRlcy4gRm9yIGV4YW1wbGU6IFs2NSwgMjUwLCA0MzUsIDYyMCwgODA1LCA5OTBdLlxuICAgICAgdmFyIF90aGlzJHN0YXRlMyA9IHRoaXMuc3RhdGUsXG4gICAgICAgIHNjYWxlVmFsdWVzID0gX3RoaXMkc3RhdGUzLnNjYWxlVmFsdWVzLFxuICAgICAgICBzdGFydFggPSBfdGhpcyRzdGF0ZTMuc3RhcnRYLFxuICAgICAgICBlbmRYID0gX3RoaXMkc3RhdGUzLmVuZFg7XG4gICAgICAvLyBjdXJyZW50U2NhbGVWYWx1ZSByZWZlcnMgdG8gd2hpY2ggY29vcmRpbmF0ZSB0aGUgY3VycmVudCB0cmF2ZWxsZXIgc2hvdWxkIGJlIHBsYWNlZCBhdC5cbiAgICAgIHZhciBjdXJyZW50U2NhbGVWYWx1ZSA9IHRoaXMuc3RhdGVbaWRdO1xuICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IHNjYWxlVmFsdWVzLmluZGV4T2YoY3VycmVudFNjYWxlVmFsdWUpO1xuICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0luZGV4ID0gY3VycmVudEluZGV4ICsgZGlyZWN0aW9uO1xuICAgICAgaWYgKG5ld0luZGV4ID09PSAtMSB8fCBuZXdJbmRleCA+PSBzY2FsZVZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5ld1NjYWxlVmFsdWUgPSBzY2FsZVZhbHVlc1tuZXdJbmRleF07XG5cbiAgICAgIC8vIFByZXZlbnQgdHJhdmVsbGVycyBmcm9tIGJlaW5nIG9uIHRvcCBvZiBlYWNoIG90aGVyIG9yIG92ZXJsYXBwaW5nXG4gICAgICBpZiAoaWQgPT09ICdzdGFydFgnICYmIG5ld1NjYWxlVmFsdWUgPj0gZW5kWCB8fCBpZCA9PT0gJ2VuZFgnICYmIG5ld1NjYWxlVmFsdWUgPD0gc3RhcnRYKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U3RhdGUoX2RlZmluZVByb3BlcnR5KHt9LCBpZCwgbmV3U2NhbGVWYWx1ZSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLnByb3BzLm9uQ2hhbmdlKF90aGlzMi5nZXRJbmRleCh7XG4gICAgICAgICAgc3RhcnRYOiBfdGhpczIuc3RhdGUuc3RhcnRYLFxuICAgICAgICAgIGVuZFg6IF90aGlzMi5zdGF0ZS5lbmRYXG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJCYWNrZ3JvdW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckJhY2tncm91bmQoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM2ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgeCA9IF90aGlzJHByb3BzNi54LFxuICAgICAgICB5ID0gX3RoaXMkcHJvcHM2LnksXG4gICAgICAgIHdpZHRoID0gX3RoaXMkcHJvcHM2LndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBfdGhpcyRwcm9wczYuaGVpZ2h0LFxuICAgICAgICBmaWxsID0gX3RoaXMkcHJvcHM2LmZpbGwsXG4gICAgICAgIHN0cm9rZSA9IF90aGlzJHByb3BzNi5zdHJva2U7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICAgICAgc3Ryb2tlOiBzdHJva2UsXG4gICAgICAgIGZpbGw6IGZpbGwsXG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHksXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJQYW5vcmFtYVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJQYW5vcmFtYSgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczcgPSB0aGlzLnByb3BzLFxuICAgICAgICB4ID0gX3RoaXMkcHJvcHM3LngsXG4gICAgICAgIHkgPSBfdGhpcyRwcm9wczcueSxcbiAgICAgICAgd2lkdGggPSBfdGhpcyRwcm9wczcud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF90aGlzJHByb3BzNy5oZWlnaHQsXG4gICAgICAgIGRhdGEgPSBfdGhpcyRwcm9wczcuZGF0YSxcbiAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wczcuY2hpbGRyZW4sXG4gICAgICAgIHBhZGRpbmcgPSBfdGhpcyRwcm9wczcucGFkZGluZztcbiAgICAgIHZhciBjaGFydEVsZW1lbnQgPSBDaGlsZHJlbi5vbmx5KGNoaWxkcmVuKTtcbiAgICAgIGlmICghY2hhcnRFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hhcnRFbGVtZW50LCB7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHksXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIG1hcmdpbjogcGFkZGluZyxcbiAgICAgICAgY29tcGFjdDogdHJ1ZSxcbiAgICAgICAgZGF0YTogZGF0YVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclRyYXZlbGxlckxheWVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlclRyYXZlbGxlckxheWVyKHRyYXZlbGxlclgsIGlkKSB7XG4gICAgICB2YXIgX2RhdGEkc3RhcnRJbmRleCxcbiAgICAgICAgX2RhdGEkZW5kSW5kZXgsXG4gICAgICAgIF90aGlzMyA9IHRoaXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM4ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgeSA9IF90aGlzJHByb3BzOC55LFxuICAgICAgICB0cmF2ZWxsZXJXaWR0aCA9IF90aGlzJHByb3BzOC50cmF2ZWxsZXJXaWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gX3RoaXMkcHJvcHM4LmhlaWdodCxcbiAgICAgICAgdHJhdmVsbGVyID0gX3RoaXMkcHJvcHM4LnRyYXZlbGxlcixcbiAgICAgICAgYXJpYUxhYmVsID0gX3RoaXMkcHJvcHM4LmFyaWFMYWJlbCxcbiAgICAgICAgZGF0YSA9IF90aGlzJHByb3BzOC5kYXRhLFxuICAgICAgICBzdGFydEluZGV4ID0gX3RoaXMkcHJvcHM4LnN0YXJ0SW5kZXgsXG4gICAgICAgIGVuZEluZGV4ID0gX3RoaXMkcHJvcHM4LmVuZEluZGV4O1xuICAgICAgdmFyIHggPSBNYXRoLm1heCh0cmF2ZWxsZXJYLCB0aGlzLnByb3BzLngpO1xuICAgICAgdmFyIHRyYXZlbGxlclByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmaWx0ZXJQcm9wcyh0aGlzLnByb3BzLCBmYWxzZSkpLCB7fSwge1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5LFxuICAgICAgICB3aWR0aDogdHJhdmVsbGVyV2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICB9KTtcbiAgICAgIHZhciBhcmlhTGFiZWxCcnVzaCA9IGFyaWFMYWJlbCB8fCBcIk1pbiB2YWx1ZTogXCIuY29uY2F0KChfZGF0YSRzdGFydEluZGV4ID0gZGF0YVtzdGFydEluZGV4XSkgPT09IG51bGwgfHwgX2RhdGEkc3RhcnRJbmRleCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RhdGEkc3RhcnRJbmRleC5uYW1lLCBcIiwgTWF4IHZhbHVlOiBcIikuY29uY2F0KChfZGF0YSRlbmRJbmRleCA9IGRhdGFbZW5kSW5kZXhdKSA9PT0gbnVsbCB8fCBfZGF0YSRlbmRJbmRleCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RhdGEkZW5kSW5kZXgubmFtZSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGF5ZXIsIHtcbiAgICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICAgIHJvbGU6IFwic2xpZGVyXCIsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBhcmlhTGFiZWxCcnVzaCxcbiAgICAgICAgXCJhcmlhLXZhbHVlbm93XCI6IHRyYXZlbGxlclgsXG4gICAgICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy1icnVzaC10cmF2ZWxsZXJcIixcbiAgICAgICAgb25Nb3VzZUVudGVyOiB0aGlzLmhhbmRsZUVudGVyU2xpZGVPclRyYXZlbGxlcixcbiAgICAgICAgb25Nb3VzZUxlYXZlOiB0aGlzLmhhbmRsZUxlYXZlU2xpZGVPclRyYXZlbGxlcixcbiAgICAgICAgb25Nb3VzZURvd246IHRoaXMudHJhdmVsbGVyRHJhZ1N0YXJ0SGFuZGxlcnNbaWRdLFxuICAgICAgICBvblRvdWNoU3RhcnQ6IHRoaXMudHJhdmVsbGVyRHJhZ1N0YXJ0SGFuZGxlcnNbaWRdLFxuICAgICAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICAgICAgaWYgKCFbJ0Fycm93TGVmdCcsICdBcnJvd1JpZ2h0J10uaW5jbHVkZXMoZS5rZXkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIF90aGlzMy5oYW5kbGVUcmF2ZWxsZXJNb3ZlS2V5Ym9hcmQoZS5rZXkgPT09ICdBcnJvd1JpZ2h0JyA/IDEgOiAtMSwgaWQpO1xuICAgICAgICB9LFxuICAgICAgICBvbkZvY3VzOiBmdW5jdGlvbiBvbkZvY3VzKCkge1xuICAgICAgICAgIF90aGlzMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBpc1RyYXZlbGxlckZvY3VzZWQ6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoKSB7XG4gICAgICAgICAgX3RoaXMzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGlzVHJhdmVsbGVyRm9jdXNlZDogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBjdXJzb3I6ICdjb2wtcmVzaXplJ1xuICAgICAgICB9XG4gICAgICB9LCBCcnVzaC5yZW5kZXJUcmF2ZWxsZXIodHJhdmVsbGVyLCB0cmF2ZWxsZXJQcm9wcykpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJTbGlkZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJTbGlkZShzdGFydFgsIGVuZFgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczkgPSB0aGlzLnByb3BzLFxuICAgICAgICB5ID0gX3RoaXMkcHJvcHM5LnksXG4gICAgICAgIGhlaWdodCA9IF90aGlzJHByb3BzOS5oZWlnaHQsXG4gICAgICAgIHN0cm9rZSA9IF90aGlzJHByb3BzOS5zdHJva2UsXG4gICAgICAgIHRyYXZlbGxlcldpZHRoID0gX3RoaXMkcHJvcHM5LnRyYXZlbGxlcldpZHRoO1xuICAgICAgdmFyIHggPSBNYXRoLm1pbihzdGFydFgsIGVuZFgpICsgdHJhdmVsbGVyV2lkdGg7XG4gICAgICB2YXIgd2lkdGggPSBNYXRoLm1heChNYXRoLmFicyhlbmRYIC0gc3RhcnRYKSAtIHRyYXZlbGxlcldpZHRoLCAwKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtYnJ1c2gtc2xpZGVcIixcbiAgICAgICAgb25Nb3VzZUVudGVyOiB0aGlzLmhhbmRsZUVudGVyU2xpZGVPclRyYXZlbGxlcixcbiAgICAgICAgb25Nb3VzZUxlYXZlOiB0aGlzLmhhbmRsZUxlYXZlU2xpZGVPclRyYXZlbGxlcixcbiAgICAgICAgb25Nb3VzZURvd246IHRoaXMuaGFuZGxlU2xpZGVEcmFnU3RhcnQsXG4gICAgICAgIG9uVG91Y2hTdGFydDogdGhpcy5oYW5kbGVTbGlkZURyYWdTdGFydCxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBjdXJzb3I6ICdtb3ZlJ1xuICAgICAgICB9LFxuICAgICAgICBzdHJva2U6IFwibm9uZVwiLFxuICAgICAgICBmaWxsOiBzdHJva2UsXG4gICAgICAgIGZpbGxPcGFjaXR5OiAwLjIsXG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHksXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJUZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlclRleHQoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMxMCA9IHRoaXMucHJvcHMsXG4gICAgICAgIHN0YXJ0SW5kZXggPSBfdGhpcyRwcm9wczEwLnN0YXJ0SW5kZXgsXG4gICAgICAgIGVuZEluZGV4ID0gX3RoaXMkcHJvcHMxMC5lbmRJbmRleCxcbiAgICAgICAgeSA9IF90aGlzJHByb3BzMTAueSxcbiAgICAgICAgaGVpZ2h0ID0gX3RoaXMkcHJvcHMxMC5oZWlnaHQsXG4gICAgICAgIHRyYXZlbGxlcldpZHRoID0gX3RoaXMkcHJvcHMxMC50cmF2ZWxsZXJXaWR0aCxcbiAgICAgICAgc3Ryb2tlID0gX3RoaXMkcHJvcHMxMC5zdHJva2U7XG4gICAgICB2YXIgX3RoaXMkc3RhdGU0ID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgc3RhcnRYID0gX3RoaXMkc3RhdGU0LnN0YXJ0WCxcbiAgICAgICAgZW5kWCA9IF90aGlzJHN0YXRlNC5lbmRYO1xuICAgICAgdmFyIG9mZnNldCA9IDU7XG4gICAgICB2YXIgYXR0cnMgPSB7XG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgICAgZmlsbDogc3Ryb2tlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExheWVyLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy1icnVzaC10ZXh0c1wiXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUZXh0LCBfZXh0ZW5kcyh7XG4gICAgICAgIHRleHRBbmNob3I6IFwiZW5kXCIsXG4gICAgICAgIHZlcnRpY2FsQW5jaG9yOiBcIm1pZGRsZVwiLFxuICAgICAgICB4OiBNYXRoLm1pbihzdGFydFgsIGVuZFgpIC0gb2Zmc2V0LFxuICAgICAgICB5OiB5ICsgaGVpZ2h0IC8gMlxuICAgICAgfSwgYXR0cnMpLCB0aGlzLmdldFRleHRPZlRpY2soc3RhcnRJbmRleCkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUZXh0LCBfZXh0ZW5kcyh7XG4gICAgICAgIHRleHRBbmNob3I6IFwic3RhcnRcIixcbiAgICAgICAgdmVydGljYWxBbmNob3I6IFwibWlkZGxlXCIsXG4gICAgICAgIHg6IE1hdGgubWF4KHN0YXJ0WCwgZW5kWCkgKyB0cmF2ZWxsZXJXaWR0aCArIG9mZnNldCxcbiAgICAgICAgeTogeSArIGhlaWdodCAvIDJcbiAgICAgIH0sIGF0dHJzKSwgdGhpcy5nZXRUZXh0T2ZUaWNrKGVuZEluZGV4KSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMTEgPSB0aGlzLnByb3BzLFxuICAgICAgICBkYXRhID0gX3RoaXMkcHJvcHMxMS5kYXRhLFxuICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczExLmNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wczExLmNoaWxkcmVuLFxuICAgICAgICB4ID0gX3RoaXMkcHJvcHMxMS54LFxuICAgICAgICB5ID0gX3RoaXMkcHJvcHMxMS55LFxuICAgICAgICB3aWR0aCA9IF90aGlzJHByb3BzMTEud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF90aGlzJHByb3BzMTEuaGVpZ2h0LFxuICAgICAgICBhbHdheXNTaG93VGV4dCA9IF90aGlzJHByb3BzMTEuYWx3YXlzU2hvd1RleHQ7XG4gICAgICB2YXIgX3RoaXMkc3RhdGU1ID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgc3RhcnRYID0gX3RoaXMkc3RhdGU1LnN0YXJ0WCxcbiAgICAgICAgZW5kWCA9IF90aGlzJHN0YXRlNS5lbmRYLFxuICAgICAgICBpc1RleHRBY3RpdmUgPSBfdGhpcyRzdGF0ZTUuaXNUZXh0QWN0aXZlLFxuICAgICAgICBpc1NsaWRlTW92aW5nID0gX3RoaXMkc3RhdGU1LmlzU2xpZGVNb3ZpbmcsXG4gICAgICAgIGlzVHJhdmVsbGVyTW92aW5nID0gX3RoaXMkc3RhdGU1LmlzVHJhdmVsbGVyTW92aW5nLFxuICAgICAgICBpc1RyYXZlbGxlckZvY3VzZWQgPSBfdGhpcyRzdGF0ZTUuaXNUcmF2ZWxsZXJGb2N1c2VkO1xuICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLmxlbmd0aCB8fCAhaXNOdW1iZXIoeCkgfHwgIWlzTnVtYmVyKHkpIHx8ICFpc051bWJlcih3aWR0aCkgfHwgIWlzTnVtYmVyKGhlaWdodCkgfHwgd2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBsYXllckNsYXNzID0gY2xzeCgncmVjaGFydHMtYnJ1c2gnLCBjbGFzc05hbWUpO1xuICAgICAgdmFyIGlzUGFub3JhbWljID0gUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pID09PSAxO1xuICAgICAgdmFyIHN0eWxlID0gZ2VuZXJhdGVQcmVmaXhTdHlsZSgndXNlclNlbGVjdCcsICdub25lJyk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGF5ZXIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBsYXllckNsYXNzLFxuICAgICAgICBvbk1vdXNlTGVhdmU6IHRoaXMuaGFuZGxlTGVhdmVXcmFwcGVyLFxuICAgICAgICBvblRvdWNoTW92ZTogdGhpcy5oYW5kbGVUb3VjaE1vdmUsXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSwgdGhpcy5yZW5kZXJCYWNrZ3JvdW5kKCksIGlzUGFub3JhbWljICYmIHRoaXMucmVuZGVyUGFub3JhbWEoKSwgdGhpcy5yZW5kZXJTbGlkZShzdGFydFgsIGVuZFgpLCB0aGlzLnJlbmRlclRyYXZlbGxlckxheWVyKHN0YXJ0WCwgJ3N0YXJ0WCcpLCB0aGlzLnJlbmRlclRyYXZlbGxlckxheWVyKGVuZFgsICdlbmRYJyksIChpc1RleHRBY3RpdmUgfHwgaXNTbGlkZU1vdmluZyB8fCBpc1RyYXZlbGxlck1vdmluZyB8fCBpc1RyYXZlbGxlckZvY3VzZWQgfHwgYWx3YXlzU2hvd1RleHQpICYmIHRoaXMucmVuZGVyVGV4dCgpKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJyZW5kZXJEZWZhdWx0VHJhdmVsbGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckRlZmF1bHRUcmF2ZWxsZXIocHJvcHMpIHtcbiAgICAgIHZhciB4ID0gcHJvcHMueCxcbiAgICAgICAgeSA9IHByb3BzLnksXG4gICAgICAgIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICAgICAgc3Ryb2tlID0gcHJvcHMuc3Ryb2tlO1xuICAgICAgdmFyIGxpbmVZID0gTWF0aC5mbG9vcih5ICsgaGVpZ2h0IC8gMikgLSAxO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5LFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICBmaWxsOiBzdHJva2UsXG4gICAgICAgIHN0cm9rZTogXCJub25lXCJcbiAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpbmVcIiwge1xuICAgICAgICB4MTogeCArIDEsXG4gICAgICAgIHkxOiBsaW5lWSxcbiAgICAgICAgeDI6IHggKyB3aWR0aCAtIDEsXG4gICAgICAgIHkyOiBsaW5lWSxcbiAgICAgICAgZmlsbDogXCJub25lXCIsXG4gICAgICAgIHN0cm9rZTogXCIjZmZmXCJcbiAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpbmVcIiwge1xuICAgICAgICB4MTogeCArIDEsXG4gICAgICAgIHkxOiBsaW5lWSArIDIsXG4gICAgICAgIHgyOiB4ICsgd2lkdGggLSAxLFxuICAgICAgICB5MjogbGluZVkgKyAyLFxuICAgICAgICBmaWxsOiBcIm5vbmVcIixcbiAgICAgICAgc3Ryb2tlOiBcIiNmZmZcIlxuICAgICAgfSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJUcmF2ZWxsZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyVHJhdmVsbGVyKG9wdGlvbiwgcHJvcHMpIHtcbiAgICAgIHZhciByZWN0YW5nbGU7XG4gICAgICBpZiAoIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChvcHRpb24pKSB7XG4gICAgICAgIHJlY3RhbmdsZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQob3B0aW9uLCBwcm9wcyk7XG4gICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24ob3B0aW9uKSkge1xuICAgICAgICByZWN0YW5nbGUgPSBvcHRpb24ocHJvcHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVjdGFuZ2xlID0gQnJ1c2gucmVuZGVyRGVmYXVsdFRyYXZlbGxlcihwcm9wcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVjdGFuZ2xlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICB2YXIgZGF0YSA9IG5leHRQcm9wcy5kYXRhLFxuICAgICAgICB3aWR0aCA9IG5leHRQcm9wcy53aWR0aCxcbiAgICAgICAgeCA9IG5leHRQcm9wcy54LFxuICAgICAgICB0cmF2ZWxsZXJXaWR0aCA9IG5leHRQcm9wcy50cmF2ZWxsZXJXaWR0aCxcbiAgICAgICAgdXBkYXRlSWQgPSBuZXh0UHJvcHMudXBkYXRlSWQsXG4gICAgICAgIHN0YXJ0SW5kZXggPSBuZXh0UHJvcHMuc3RhcnRJbmRleCxcbiAgICAgICAgZW5kSW5kZXggPSBuZXh0UHJvcHMuZW5kSW5kZXg7XG4gICAgICBpZiAoZGF0YSAhPT0gcHJldlN0YXRlLnByZXZEYXRhIHx8IHVwZGF0ZUlkICE9PSBwcmV2U3RhdGUucHJldlVwZGF0ZUlkKSB7XG4gICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICBwcmV2RGF0YTogZGF0YSxcbiAgICAgICAgICBwcmV2VHJhdmVsbGVyV2lkdGg6IHRyYXZlbGxlcldpZHRoLFxuICAgICAgICAgIHByZXZVcGRhdGVJZDogdXBkYXRlSWQsXG4gICAgICAgICAgcHJldlg6IHgsXG4gICAgICAgICAgcHJldldpZHRoOiB3aWR0aFxuICAgICAgICB9LCBkYXRhICYmIGRhdGEubGVuZ3RoID8gY3JlYXRlU2NhbGUoe1xuICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgdHJhdmVsbGVyV2lkdGg6IHRyYXZlbGxlcldpZHRoLFxuICAgICAgICAgIHN0YXJ0SW5kZXg6IHN0YXJ0SW5kZXgsXG4gICAgICAgICAgZW5kSW5kZXg6IGVuZEluZGV4XG4gICAgICAgIH0pIDoge1xuICAgICAgICAgIHNjYWxlOiBudWxsLFxuICAgICAgICAgIHNjYWxlVmFsdWVzOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHByZXZTdGF0ZS5zY2FsZSAmJiAod2lkdGggIT09IHByZXZTdGF0ZS5wcmV2V2lkdGggfHwgeCAhPT0gcHJldlN0YXRlLnByZXZYIHx8IHRyYXZlbGxlcldpZHRoICE9PSBwcmV2U3RhdGUucHJldlRyYXZlbGxlcldpZHRoKSkge1xuICAgICAgICBwcmV2U3RhdGUuc2NhbGUucmFuZ2UoW3gsIHggKyB3aWR0aCAtIHRyYXZlbGxlcldpZHRoXSk7XG4gICAgICAgIHZhciBzY2FsZVZhbHVlcyA9IHByZXZTdGF0ZS5zY2FsZS5kb21haW4oKS5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgICAgcmV0dXJuIHByZXZTdGF0ZS5zY2FsZShlbnRyeSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByZXZEYXRhOiBkYXRhLFxuICAgICAgICAgIHByZXZUcmF2ZWxsZXJXaWR0aDogdHJhdmVsbGVyV2lkdGgsXG4gICAgICAgICAgcHJldlVwZGF0ZUlkOiB1cGRhdGVJZCxcbiAgICAgICAgICBwcmV2WDogeCxcbiAgICAgICAgICBwcmV2V2lkdGg6IHdpZHRoLFxuICAgICAgICAgIHN0YXJ0WDogcHJldlN0YXRlLnNjYWxlKG5leHRQcm9wcy5zdGFydEluZGV4KSxcbiAgICAgICAgICBlbmRYOiBwcmV2U3RhdGUuc2NhbGUobmV4dFByb3BzLmVuZEluZGV4KSxcbiAgICAgICAgICBzY2FsZVZhbHVlczogc2NhbGVWYWx1ZXNcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRJbmRleEluUmFuZ2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0SW5kZXhJblJhbmdlKHZhbHVlUmFuZ2UsIHgpIHtcbiAgICAgIHZhciBsZW4gPSB2YWx1ZVJhbmdlLmxlbmd0aDtcbiAgICAgIHZhciBzdGFydCA9IDA7XG4gICAgICB2YXIgZW5kID0gbGVuIC0gMTtcbiAgICAgIHdoaWxlIChlbmQgLSBzdGFydCA+IDEpIHtcbiAgICAgICAgdmFyIG1pZGRsZSA9IE1hdGguZmxvb3IoKHN0YXJ0ICsgZW5kKSAvIDIpO1xuICAgICAgICBpZiAodmFsdWVSYW5nZVttaWRkbGVdID4geCkge1xuICAgICAgICAgIGVuZCA9IG1pZGRsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGFydCA9IG1pZGRsZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHggPj0gdmFsdWVSYW5nZVtlbmRdID8gZW5kIDogc3RhcnQ7XG4gICAgfVxuICB9XSk7XG59KFB1cmVDb21wb25lbnQpO1xuX2RlZmluZVByb3BlcnR5KEJydXNoLCBcImRpc3BsYXlOYW1lXCIsICdCcnVzaCcpO1xuX2RlZmluZVByb3BlcnR5KEJydXNoLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIGhlaWdodDogNDAsXG4gIHRyYXZlbGxlcldpZHRoOiA1LFxuICBnYXA6IDEsXG4gIGZpbGw6ICcjZmZmJyxcbiAgc3Ryb2tlOiAnIzY2NicsXG4gIHBhZGRpbmc6IHtcbiAgICB0b3A6IDEsXG4gICAgcmlnaHQ6IDEsXG4gICAgYm90dG9tOiAxLFxuICAgIGxlZnQ6IDFcbiAgfSxcbiAgbGVhdmVUaW1lT3V0OiAxMDAwLFxuICBhbHdheXNTaG93VGV4dDogZmFsc2Vcbn0pOyIsInZhciBfZXhjbHVkZWQgPSBbXCJ2aWV3Qm94XCJdLFxuICBfZXhjbHVkZWQyID0gW1widmlld0JveFwiXSxcbiAgX2V4Y2x1ZGVkMyA9IFtcInRpY2tzXCJdO1xuZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHsgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTsgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7IH0gcmV0dXJuIHQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQoZSkgeyBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykgeyB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307IHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTsgfSk7IH0gcmV0dXJuIGU7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7IHZhciBrZXksIGk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOyB9IH1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5mdW5jdGlvbiBfY2FsbFN1cGVyKHQsIG8sIGUpIHsgcmV0dXJuIG8gPSBfZ2V0UHJvdG90eXBlT2YobyksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSA/IFJlZmxlY3QuY29uc3RydWN0KG8sIGUgfHwgW10sIF9nZXRQcm90b3R5cGVPZih0KS5jb25zdHJ1Y3RvcikgOiBvLmFwcGx5KHQsIGUpKTsgfVxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSBlbHNlIGlmIChjYWxsICE9PSB2b2lkIDApIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IHRyeSB7IHZhciB0ID0gIUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgfSBjYXRjaCAodCkge30gcmV0dXJuIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgcmV0dXJuICEhdDsgfSkoKTsgfVxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgQ2FydGVzaWFuIEF4aXNcbiAqL1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJ2xvZGFzaC9pc0Z1bmN0aW9uJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoL2dldCc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IHNoYWxsb3dFcXVhbCB9IGZyb20gJy4uL3V0aWwvU2hhbGxvd0VxdWFsJztcbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi4vY29udGFpbmVyL0xheWVyJztcbmltcG9ydCB7IFRleHQgfSBmcm9tICcuLi9jb21wb25lbnQvVGV4dCc7XG5pbXBvcnQgeyBMYWJlbCB9IGZyb20gJy4uL2NvbXBvbmVudC9MYWJlbCc7XG5pbXBvcnQgeyBpc051bWJlciB9IGZyb20gJy4uL3V0aWwvRGF0YVV0aWxzJztcbmltcG9ydCB7IGFkYXB0RXZlbnRzT2ZDaGlsZCB9IGZyb20gJy4uL3V0aWwvdHlwZXMnO1xuaW1wb3J0IHsgZmlsdGVyUHJvcHMgfSBmcm9tICcuLi91dGlsL1JlYWN0VXRpbHMnO1xuaW1wb3J0IHsgZ2V0VGlja3MgfSBmcm9tICcuL2dldFRpY2tzJztcblxuLyoqIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgYXhpcyBpbiBjb3JyZXNwb25kZW5jZSB0byB0aGUgY2hhcnQgKi9cblxuLyoqIEEgdW5pdCB0byBiZSBhcHBlbmRlZCB0byBhIHZhbHVlICovXG5cbi8qKiBUaGUgZm9ybWF0dGVyIGZ1bmN0aW9uIG9mIHRpY2sgKi9cblxuZXhwb3J0IHZhciBDYXJ0ZXNpYW5BeGlzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIENhcnRlc2lhbkF4aXMocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENhcnRlc2lhbkF4aXMpO1xuICAgIF90aGlzID0gX2NhbGxTdXBlcih0aGlzLCBDYXJ0ZXNpYW5BeGlzLCBbcHJvcHNdKTtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGZvbnRTaXplOiAnJyxcbiAgICAgIGxldHRlclNwYWNpbmc6ICcnXG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2luaGVyaXRzKENhcnRlc2lhbkF4aXMsIF9Db21wb25lbnQpO1xuICByZXR1cm4gX2NyZWF0ZUNsYXNzKENhcnRlc2lhbkF4aXMsIFt7XG4gICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUoX3JlZiwgbmV4dFN0YXRlKSB7XG4gICAgICB2YXIgdmlld0JveCA9IF9yZWYudmlld0JveCxcbiAgICAgICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG4gICAgICAvLyBwcm9wcy52aWV3Qm94IGlzIHNvbWV0aW1lcyBnZW5lcmF0ZWQgZXZlcnkgdGltZSAtXG4gICAgICAvLyBjaGVjayB0aGF0IHNwZWNpYWxseSBhcyBvYmplY3QgZXF1YWxpdHkgaXMgbGlrZWx5IHRvIGZhaWxcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIHZpZXdCb3hPbGQgPSBfdGhpcyRwcm9wcy52aWV3Qm94LFxuICAgICAgICByZXN0UHJvcHNPbGQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3RoaXMkcHJvcHMsIF9leGNsdWRlZDIpO1xuICAgICAgcmV0dXJuICFzaGFsbG93RXF1YWwodmlld0JveCwgdmlld0JveE9sZCkgfHwgIXNoYWxsb3dFcXVhbChyZXN0UHJvcHMsIHJlc3RQcm9wc09sZCkgfHwgIXNoYWxsb3dFcXVhbChuZXh0U3RhdGUsIHRoaXMuc3RhdGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHZhciBodG1sTGF5ZXIgPSB0aGlzLmxheWVyUmVmZXJlbmNlO1xuICAgICAgaWYgKCFodG1sTGF5ZXIpIHJldHVybjtcbiAgICAgIHZhciB0aWNrID0gaHRtbExheWVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3JlY2hhcnRzLWNhcnRlc2lhbi1heGlzLXRpY2stdmFsdWUnKVswXTtcbiAgICAgIGlmICh0aWNrKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGZvbnRTaXplOiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aWNrKS5mb250U2l6ZSxcbiAgICAgICAgICBsZXR0ZXJTcGFjaW5nOiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aWNrKS5sZXR0ZXJTcGFjaW5nXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgY29vcmRpbmF0ZXMgb2YgZW5kcG9pbnRzIGluIHRpY2tzXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBkYXRhIFRoZSBkYXRhIG9mIGEgc2ltcGxlIHRpY2tcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9ICh4MSwgeTEpOiBUaGUgY29vcmRpbmF0ZSBvZiBlbmRwb2ludCBjbG9zZSB0byB0aWNrIHRleHRcbiAgICAgKiAgKHgyLCB5Mik6IFRoZSBjb29yZGluYXRlIG9mIGVuZHBvaW50IGNsb3NlIHRvIGF4aXNcbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJnZXRUaWNrTGluZUNvb3JkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRpY2tMaW5lQ29vcmQoZGF0YSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIHggPSBfdGhpcyRwcm9wczIueCxcbiAgICAgICAgeSA9IF90aGlzJHByb3BzMi55LFxuICAgICAgICB3aWR0aCA9IF90aGlzJHByb3BzMi53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gX3RoaXMkcHJvcHMyLmhlaWdodCxcbiAgICAgICAgb3JpZW50YXRpb24gPSBfdGhpcyRwcm9wczIub3JpZW50YXRpb24sXG4gICAgICAgIHRpY2tTaXplID0gX3RoaXMkcHJvcHMyLnRpY2tTaXplLFxuICAgICAgICBtaXJyb3IgPSBfdGhpcyRwcm9wczIubWlycm9yLFxuICAgICAgICB0aWNrTWFyZ2luID0gX3RoaXMkcHJvcHMyLnRpY2tNYXJnaW47XG4gICAgICB2YXIgeDEsIHgyLCB5MSwgeTIsIHR4LCB0eTtcbiAgICAgIHZhciBzaWduID0gbWlycm9yID8gLTEgOiAxO1xuICAgICAgdmFyIGZpbmFsVGlja1NpemUgPSBkYXRhLnRpY2tTaXplIHx8IHRpY2tTaXplO1xuICAgICAgdmFyIHRpY2tDb29yZCA9IGlzTnVtYmVyKGRhdGEudGlja0Nvb3JkKSA/IGRhdGEudGlja0Nvb3JkIDogZGF0YS5jb29yZGluYXRlO1xuICAgICAgc3dpdGNoIChvcmllbnRhdGlvbikge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIHgxID0geDIgPSBkYXRhLmNvb3JkaW5hdGU7XG4gICAgICAgICAgeTIgPSB5ICsgKyFtaXJyb3IgKiBoZWlnaHQ7XG4gICAgICAgICAgeTEgPSB5MiAtIHNpZ24gKiBmaW5hbFRpY2tTaXplO1xuICAgICAgICAgIHR5ID0geTEgLSBzaWduICogdGlja01hcmdpbjtcbiAgICAgICAgICB0eCA9IHRpY2tDb29yZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgeTEgPSB5MiA9IGRhdGEuY29vcmRpbmF0ZTtcbiAgICAgICAgICB4MiA9IHggKyArIW1pcnJvciAqIHdpZHRoO1xuICAgICAgICAgIHgxID0geDIgLSBzaWduICogZmluYWxUaWNrU2l6ZTtcbiAgICAgICAgICB0eCA9IHgxIC0gc2lnbiAqIHRpY2tNYXJnaW47XG4gICAgICAgICAgdHkgPSB0aWNrQ29vcmQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICB5MSA9IHkyID0gZGF0YS5jb29yZGluYXRlO1xuICAgICAgICAgIHgyID0geCArICttaXJyb3IgKiB3aWR0aDtcbiAgICAgICAgICB4MSA9IHgyICsgc2lnbiAqIGZpbmFsVGlja1NpemU7XG4gICAgICAgICAgdHggPSB4MSArIHNpZ24gKiB0aWNrTWFyZ2luO1xuICAgICAgICAgIHR5ID0gdGlja0Nvb3JkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHgxID0geDIgPSBkYXRhLmNvb3JkaW5hdGU7XG4gICAgICAgICAgeTIgPSB5ICsgK21pcnJvciAqIGhlaWdodDtcbiAgICAgICAgICB5MSA9IHkyICsgc2lnbiAqIGZpbmFsVGlja1NpemU7XG4gICAgICAgICAgdHkgPSB5MSArIHNpZ24gKiB0aWNrTWFyZ2luO1xuICAgICAgICAgIHR4ID0gdGlja0Nvb3JkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGluZToge1xuICAgICAgICAgIHgxOiB4MSxcbiAgICAgICAgICB5MTogeTEsXG4gICAgICAgICAgeDI6IHgyLFxuICAgICAgICAgIHkyOiB5MlxuICAgICAgICB9LFxuICAgICAgICB0aWNrOiB7XG4gICAgICAgICAgeDogdHgsXG4gICAgICAgICAgeTogdHlcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VGlja1RleHRBbmNob3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VGlja1RleHRBbmNob3IoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgb3JpZW50YXRpb24gPSBfdGhpcyRwcm9wczMub3JpZW50YXRpb24sXG4gICAgICAgIG1pcnJvciA9IF90aGlzJHByb3BzMy5taXJyb3I7XG4gICAgICB2YXIgdGV4dEFuY2hvcjtcbiAgICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgdGV4dEFuY2hvciA9IG1pcnJvciA/ICdzdGFydCcgOiAnZW5kJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIHRleHRBbmNob3IgPSBtaXJyb3IgPyAnZW5kJyA6ICdzdGFydCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGV4dEFuY2hvciA9ICdtaWRkbGUnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRleHRBbmNob3I7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFRpY2tWZXJ0aWNhbEFuY2hvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRUaWNrVmVydGljYWxBbmNob3IoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgb3JpZW50YXRpb24gPSBfdGhpcyRwcm9wczQub3JpZW50YXRpb24sXG4gICAgICAgIG1pcnJvciA9IF90aGlzJHByb3BzNC5taXJyb3I7XG4gICAgICB2YXIgdmVydGljYWxBbmNob3IgPSAnZW5kJztcbiAgICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICB2ZXJ0aWNhbEFuY2hvciA9ICdtaWRkbGUnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIHZlcnRpY2FsQW5jaG9yID0gbWlycm9yID8gJ3N0YXJ0JyA6ICdlbmQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHZlcnRpY2FsQW5jaG9yID0gbWlycm9yID8gJ2VuZCcgOiAnc3RhcnQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZlcnRpY2FsQW5jaG9yO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJBeGlzTGluZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJBeGlzTGluZSgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczUgPSB0aGlzLnByb3BzLFxuICAgICAgICB4ID0gX3RoaXMkcHJvcHM1LngsXG4gICAgICAgIHkgPSBfdGhpcyRwcm9wczUueSxcbiAgICAgICAgd2lkdGggPSBfdGhpcyRwcm9wczUud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF90aGlzJHByb3BzNS5oZWlnaHQsXG4gICAgICAgIG9yaWVudGF0aW9uID0gX3RoaXMkcHJvcHM1Lm9yaWVudGF0aW9uLFxuICAgICAgICBtaXJyb3IgPSBfdGhpcyRwcm9wczUubWlycm9yLFxuICAgICAgICBheGlzTGluZSA9IF90aGlzJHByb3BzNS5heGlzTGluZTtcbiAgICAgIHZhciBwcm9wcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmaWx0ZXJQcm9wcyh0aGlzLnByb3BzLCBmYWxzZSkpLCBmaWx0ZXJQcm9wcyhheGlzTGluZSwgZmFsc2UpKSwge30sIHtcbiAgICAgICAgZmlsbDogJ25vbmUnXG4gICAgICB9KTtcbiAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ3RvcCcgfHwgb3JpZW50YXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgICAgIHZhciBuZWVkSGVpZ2h0ID0gKyhvcmllbnRhdGlvbiA9PT0gJ3RvcCcgJiYgIW1pcnJvciB8fCBvcmllbnRhdGlvbiA9PT0gJ2JvdHRvbScgJiYgbWlycm9yKTtcbiAgICAgICAgcHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICAgICAgICB4MTogeCxcbiAgICAgICAgICB5MTogeSArIG5lZWRIZWlnaHQgKiBoZWlnaHQsXG4gICAgICAgICAgeDI6IHggKyB3aWR0aCxcbiAgICAgICAgICB5MjogeSArIG5lZWRIZWlnaHQgKiBoZWlnaHRcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbmVlZFdpZHRoID0gKyhvcmllbnRhdGlvbiA9PT0gJ2xlZnQnICYmICFtaXJyb3IgfHwgb3JpZW50YXRpb24gPT09ICdyaWdodCcgJiYgbWlycm9yKTtcbiAgICAgICAgcHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICAgICAgICB4MTogeCArIG5lZWRXaWR0aCAqIHdpZHRoLFxuICAgICAgICAgIHkxOiB5LFxuICAgICAgICAgIHgyOiB4ICsgbmVlZFdpZHRoICogd2lkdGgsXG4gICAgICAgICAgeTI6IHkgKyBoZWlnaHRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaW5lXCIsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6IGNsc3goJ3JlY2hhcnRzLWNhcnRlc2lhbi1heGlzLWxpbmUnLCBnZXQoYXhpc0xpbmUsICdjbGFzc05hbWUnKSlcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyVGlja3NcIixcbiAgICB2YWx1ZTpcbiAgICAvKipcbiAgICAgKiByZW5kZXIgdGhlIHRpY2tzXG4gICAgICogQHBhcmFtIHtBcnJheX0gdGlja3MgVGhlIHRpY2tzIHRvIGFjdHVhbGx5IHJlbmRlciAob3ZlcnJpZGVzIHdoYXQgd2FzIHBhc3NlZCBpbiBwcm9wcylcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZm9udFNpemUgRm9udHNpemUgdG8gY29uc2lkZXIgZm9yIHRpY2sgc3BhY2luZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsZXR0ZXJTcGFjaW5nIExldHRlcnNwYWNpbmcgdG8gY29uc2lkZXIgZm9yIHRpY2sgc3BhY2luZ1xuICAgICAqIEByZXR1cm4ge1JlYWN0Q29tcG9uZW50fSByZW5kZXJlZFRpY2tzXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVuZGVyVGlja3ModGlja3MsIGZvbnRTaXplLCBsZXR0ZXJTcGFjaW5nKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIHZhciBfdGhpcyRwcm9wczYgPSB0aGlzLnByb3BzLFxuICAgICAgICB0aWNrTGluZSA9IF90aGlzJHByb3BzNi50aWNrTGluZSxcbiAgICAgICAgc3Ryb2tlID0gX3RoaXMkcHJvcHM2LnN0cm9rZSxcbiAgICAgICAgdGljayA9IF90aGlzJHByb3BzNi50aWNrLFxuICAgICAgICB0aWNrRm9ybWF0dGVyID0gX3RoaXMkcHJvcHM2LnRpY2tGb3JtYXR0ZXIsXG4gICAgICAgIHVuaXQgPSBfdGhpcyRwcm9wczYudW5pdDtcbiAgICAgIHZhciBmaW5hbFRpY2tzID0gZ2V0VGlja3MoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aGlzLnByb3BzKSwge30sIHtcbiAgICAgICAgdGlja3M6IHRpY2tzXG4gICAgICB9KSwgZm9udFNpemUsIGxldHRlclNwYWNpbmcpO1xuICAgICAgdmFyIHRleHRBbmNob3IgPSB0aGlzLmdldFRpY2tUZXh0QW5jaG9yKCk7XG4gICAgICB2YXIgdmVydGljYWxBbmNob3IgPSB0aGlzLmdldFRpY2tWZXJ0aWNhbEFuY2hvcigpO1xuICAgICAgdmFyIGF4aXNQcm9wcyA9IGZpbHRlclByb3BzKHRoaXMucHJvcHMsIGZhbHNlKTtcbiAgICAgIHZhciBjdXN0b21UaWNrUHJvcHMgPSBmaWx0ZXJQcm9wcyh0aWNrLCBmYWxzZSk7XG4gICAgICB2YXIgdGlja0xpbmVQcm9wcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYXhpc1Byb3BzKSwge30sIHtcbiAgICAgICAgZmlsbDogJ25vbmUnXG4gICAgICB9LCBmaWx0ZXJQcm9wcyh0aWNrTGluZSwgZmFsc2UpKTtcbiAgICAgIHZhciBpdGVtcyA9IGZpbmFsVGlja3MubWFwKGZ1bmN0aW9uIChlbnRyeSwgaSkge1xuICAgICAgICB2YXIgX3RoaXMyJGdldFRpY2tMaW5lQ29vID0gX3RoaXMyLmdldFRpY2tMaW5lQ29vcmQoZW50cnkpLFxuICAgICAgICAgIGxpbmVDb29yZCA9IF90aGlzMiRnZXRUaWNrTGluZUNvby5saW5lLFxuICAgICAgICAgIHRpY2tDb29yZCA9IF90aGlzMiRnZXRUaWNrTGluZUNvby50aWNrO1xuICAgICAgICB2YXIgdGlja1Byb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgdGV4dEFuY2hvcjogdGV4dEFuY2hvcixcbiAgICAgICAgICB2ZXJ0aWNhbEFuY2hvcjogdmVydGljYWxBbmNob3JcbiAgICAgICAgfSwgYXhpc1Byb3BzKSwge30sIHtcbiAgICAgICAgICBzdHJva2U6ICdub25lJyxcbiAgICAgICAgICBmaWxsOiBzdHJva2VcbiAgICAgICAgfSwgY3VzdG9tVGlja1Byb3BzKSwgdGlja0Nvb3JkKSwge30sIHtcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICBwYXlsb2FkOiBlbnRyeSxcbiAgICAgICAgICB2aXNpYmxlVGlja3NDb3VudDogZmluYWxUaWNrcy5sZW5ndGgsXG4gICAgICAgICAgdGlja0Zvcm1hdHRlcjogdGlja0Zvcm1hdHRlclxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExheWVyLCBfZXh0ZW5kcyh7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLWNhcnRlc2lhbi1heGlzLXRpY2tcIixcbiAgICAgICAgICBrZXk6IFwidGljay1cIi5jb25jYXQoZW50cnkudmFsdWUsIFwiLVwiKS5jb25jYXQoZW50cnkuY29vcmRpbmF0ZSwgXCItXCIpLmNvbmNhdChlbnRyeS50aWNrQ29vcmQpXG4gICAgICAgIH0sIGFkYXB0RXZlbnRzT2ZDaGlsZChfdGhpczIucHJvcHMsIGVudHJ5LCBpKSksIHRpY2tMaW5lICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGluZVwiLCBfZXh0ZW5kcyh7fSwgdGlja0xpbmVQcm9wcywgbGluZUNvb3JkLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBjbHN4KCdyZWNoYXJ0cy1jYXJ0ZXNpYW4tYXhpcy10aWNrLWxpbmUnLCBnZXQodGlja0xpbmUsICdjbGFzc05hbWUnKSlcbiAgICAgICAgfSkpLCB0aWNrICYmIENhcnRlc2lhbkF4aXMucmVuZGVyVGlja0l0ZW0odGljaywgdGlja1Byb3BzLCBcIlwiLmNvbmNhdChpc0Z1bmN0aW9uKHRpY2tGb3JtYXR0ZXIpID8gdGlja0Zvcm1hdHRlcihlbnRyeS52YWx1ZSwgaSkgOiBlbnRyeS52YWx1ZSkuY29uY2F0KHVuaXQgfHwgJycpKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtY2FydGVzaWFuLWF4aXMtdGlja3NcIlxuICAgICAgfSwgaXRlbXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM3ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYXhpc0xpbmUgPSBfdGhpcyRwcm9wczcuYXhpc0xpbmUsXG4gICAgICAgIHdpZHRoID0gX3RoaXMkcHJvcHM3LndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBfdGhpcyRwcm9wczcuaGVpZ2h0LFxuICAgICAgICB0aWNrc0dlbmVyYXRvciA9IF90aGlzJHByb3BzNy50aWNrc0dlbmVyYXRvcixcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHM3LmNsYXNzTmFtZSxcbiAgICAgICAgaGlkZSA9IF90aGlzJHByb3BzNy5oaWRlO1xuICAgICAgaWYgKGhpZGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgX3RoaXMkcHJvcHM4ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgdGlja3MgPSBfdGhpcyRwcm9wczgudGlja3MsXG4gICAgICAgIG5vVGlja3NQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyRwcm9wczgsIF9leGNsdWRlZDMpO1xuICAgICAgdmFyIGZpbmFsVGlja3MgPSB0aWNrcztcbiAgICAgIGlmIChpc0Z1bmN0aW9uKHRpY2tzR2VuZXJhdG9yKSkge1xuICAgICAgICBmaW5hbFRpY2tzID0gdGlja3MgJiYgdGlja3MubGVuZ3RoID4gMCA/IHRpY2tzR2VuZXJhdG9yKHRoaXMucHJvcHMpIDogdGlja3NHZW5lcmF0b3Iobm9UaWNrc1Byb3BzKTtcbiAgICAgIH1cbiAgICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwIHx8ICFmaW5hbFRpY2tzIHx8ICFmaW5hbFRpY2tzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYXllciwge1xuICAgICAgICBjbGFzc05hbWU6IGNsc3goJ3JlY2hhcnRzLWNhcnRlc2lhbi1heGlzJywgY2xhc3NOYW1lKSxcbiAgICAgICAgcmVmOiBmdW5jdGlvbiByZWYoX3JlZjIpIHtcbiAgICAgICAgICBfdGhpczMubGF5ZXJSZWZlcmVuY2UgPSBfcmVmMjtcbiAgICAgICAgfVxuICAgICAgfSwgYXhpc0xpbmUgJiYgdGhpcy5yZW5kZXJBeGlzTGluZSgpLCB0aGlzLnJlbmRlclRpY2tzKGZpbmFsVGlja3MsIHRoaXMuc3RhdGUuZm9udFNpemUsIHRoaXMuc3RhdGUubGV0dGVyU3BhY2luZyksIExhYmVsLnJlbmRlckNhbGxCeVBhcmVudCh0aGlzLnByb3BzKSk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwicmVuZGVyVGlja0l0ZW1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyVGlja0l0ZW0ob3B0aW9uLCBwcm9wcywgdmFsdWUpIHtcbiAgICAgIHZhciB0aWNrSXRlbTtcbiAgICAgIGlmICggLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG9wdGlvbikpIHtcbiAgICAgICAgdGlja0l0ZW0gPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KG9wdGlvbiwgcHJvcHMpO1xuICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKG9wdGlvbikpIHtcbiAgICAgICAgdGlja0l0ZW0gPSBvcHRpb24ocHJvcHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGlja0l0ZW0gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUZXh0LCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtY2FydGVzaWFuLWF4aXMtdGljay12YWx1ZVwiXG4gICAgICAgIH0pLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGlja0l0ZW07XG4gICAgfVxuICB9XSk7XG59KENvbXBvbmVudCk7XG5fZGVmaW5lUHJvcGVydHkoQ2FydGVzaWFuQXhpcywgXCJkaXNwbGF5TmFtZVwiLCAnQ2FydGVzaWFuQXhpcycpO1xuX2RlZmluZVByb3BlcnR5KENhcnRlc2lhbkF4aXMsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgeDogMCxcbiAgeTogMCxcbiAgd2lkdGg6IDAsXG4gIGhlaWdodDogMCxcbiAgdmlld0JveDoge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDBcbiAgfSxcbiAgLy8gVGhlIG9yaWVudGF0aW9uIG9mIGF4aXNcbiAgb3JpZW50YXRpb246ICdib3R0b20nLFxuICAvLyBUaGUgdGlja3NcbiAgdGlja3M6IFtdLFxuICBzdHJva2U6ICcjNjY2JyxcbiAgdGlja0xpbmU6IHRydWUsXG4gIGF4aXNMaW5lOiB0cnVlLFxuICB0aWNrOiB0cnVlLFxuICBtaXJyb3I6IGZhbHNlLFxuICBtaW5UaWNrR2FwOiA1LFxuICAvLyBUaGUgd2lkdGggb3IgaGVpZ2h0IG9mIHRpY2tcbiAgdGlja1NpemU6IDYsXG4gIHRpY2tNYXJnaW46IDIsXG4gIGludGVydmFsOiAncHJlc2VydmVFbmQnXG59KTsiLCJ2YXIgX2V4Y2x1ZGVkID0gW1wieDFcIiwgXCJ5MVwiLCBcIngyXCIsIFwieTJcIiwgXCJrZXlcIl0sXG4gIF9leGNsdWRlZDIgPSBbXCJvZmZzZXRcIl07XG5mdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHsgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTsgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7IH0gcmV0dXJuIHQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQoZSkgeyBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykgeyB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307IHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTsgfSk7IH0gcmV0dXJuIGU7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikgeyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDsgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmICh2b2lkIDAgIT09IGUpIHsgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IENhcnRlc2lhbiBHcmlkXG4gKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaXNGdW5jdGlvbiBmcm9tICdsb2Rhc2gvaXNGdW5jdGlvbic7XG5pbXBvcnQgeyB3YXJuIH0gZnJvbSAnLi4vdXRpbC9Mb2dVdGlscyc7XG5pbXBvcnQgeyBpc051bWJlciB9IGZyb20gJy4uL3V0aWwvRGF0YVV0aWxzJztcbmltcG9ydCB7IGZpbHRlclByb3BzIH0gZnJvbSAnLi4vdXRpbC9SZWFjdFV0aWxzJztcbmltcG9ydCB7IGdldENvb3JkaW5hdGVzT2ZHcmlkLCBnZXRUaWNrc09mQXhpcyB9IGZyb20gJy4uL3V0aWwvQ2hhcnRVdGlscyc7XG5pbXBvcnQgeyBnZXRUaWNrcyB9IGZyb20gJy4vZ2V0VGlja3MnO1xuaW1wb3J0IHsgQ2FydGVzaWFuQXhpcyB9IGZyb20gJy4vQ2FydGVzaWFuQXhpcyc7XG5pbXBvcnQgeyB1c2VBcmJpdHJhcnlYQXhpcywgdXNlQ2hhcnRIZWlnaHQsIHVzZUNoYXJ0V2lkdGgsIHVzZU9mZnNldCwgdXNlWUF4aXNXaXRoRmluaXRlRG9tYWluT3JSYW5kb20gfSBmcm9tICcuLi9jb250ZXh0L2NoYXJ0TGF5b3V0Q29udGV4dCc7XG5cbi8qKlxuICogVGhlIDxDYXJ0ZXNpYW5HcmlkIGhvcml6b250YWxcbiAqL1xuXG52YXIgQmFja2dyb3VuZCA9IGZ1bmN0aW9uIEJhY2tncm91bmQocHJvcHMpIHtcbiAgdmFyIGZpbGwgPSBwcm9wcy5maWxsO1xuICBpZiAoIWZpbGwgfHwgZmlsbCA9PT0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGZpbGxPcGFjaXR5ID0gcHJvcHMuZmlsbE9wYWNpdHksXG4gICAgeCA9IHByb3BzLngsXG4gICAgeSA9IHByb3BzLnksXG4gICAgd2lkdGggPSBwcm9wcy53aWR0aCxcbiAgICBoZWlnaHQgPSBwcm9wcy5oZWlnaHQsXG4gICAgcnkgPSBwcm9wcy5yeTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogeCxcbiAgICB5OiB5LFxuICAgIHJ5OiByeSxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgc3Ryb2tlOiBcIm5vbmVcIixcbiAgICBmaWxsOiBmaWxsLFxuICAgIGZpbGxPcGFjaXR5OiBmaWxsT3BhY2l0eSxcbiAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtY2FydGVzaWFuLWdyaWQtYmdcIlxuICB9KTtcbn07XG5mdW5jdGlvbiByZW5kZXJMaW5lSXRlbShvcHRpb24sIHByb3BzKSB7XG4gIHZhciBsaW5lSXRlbTtcbiAgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQob3B0aW9uKSkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdHlwZXNjcmlwdCBkb2VzIG5vdCBzZWUgdGhlIHByb3BzIHR5cGUgd2hlbiBjbG9uaW5nIGFuIGVsZW1lbnRcbiAgICBsaW5lSXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQob3B0aW9uLCBwcm9wcyk7XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihvcHRpb24pKSB7XG4gICAgbGluZUl0ZW0gPSBvcHRpb24ocHJvcHMpO1xuICB9IGVsc2Uge1xuICAgIHZhciB4MSA9IHByb3BzLngxLFxuICAgICAgeTEgPSBwcm9wcy55MSxcbiAgICAgIHgyID0gcHJvcHMueDIsXG4gICAgICB5MiA9IHByb3BzLnkyLFxuICAgICAga2V5ID0gcHJvcHMua2V5LFxuICAgICAgb3RoZXJzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICAgIHZhciBfZmlsdGVyUHJvcHMgPSBmaWx0ZXJQcm9wcyhvdGhlcnMsIGZhbHNlKSxcbiAgICAgIF9fID0gX2ZpbHRlclByb3BzLm9mZnNldCxcbiAgICAgIHJlc3RPZkZpbHRlcmVkUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX2ZpbHRlclByb3BzLCBfZXhjbHVkZWQyKTtcbiAgICBsaW5lSXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGluZVwiLCBfZXh0ZW5kcyh7fSwgcmVzdE9mRmlsdGVyZWRQcm9wcywge1xuICAgICAgeDE6IHgxLFxuICAgICAgeTE6IHkxLFxuICAgICAgeDI6IHgyLFxuICAgICAgeTI6IHkyLFxuICAgICAgZmlsbDogXCJub25lXCIsXG4gICAgICBrZXk6IGtleVxuICAgIH0pKTtcbiAgfVxuICByZXR1cm4gbGluZUl0ZW07XG59XG5mdW5jdGlvbiBIb3Jpem9udGFsR3JpZExpbmVzKHByb3BzKSB7XG4gIHZhciB4ID0gcHJvcHMueCxcbiAgICB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgIF9wcm9wcyRob3Jpem9udGFsID0gcHJvcHMuaG9yaXpvbnRhbCxcbiAgICBob3Jpem9udGFsID0gX3Byb3BzJGhvcml6b250YWwgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkaG9yaXpvbnRhbCxcbiAgICBob3Jpem9udGFsUG9pbnRzID0gcHJvcHMuaG9yaXpvbnRhbFBvaW50cztcbiAgaWYgKCFob3Jpem9udGFsIHx8ICFob3Jpem9udGFsUG9pbnRzIHx8ICFob3Jpem9udGFsUG9pbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBpdGVtcyA9IGhvcml6b250YWxQb2ludHMubWFwKGZ1bmN0aW9uIChlbnRyeSwgaSkge1xuICAgIHZhciBsaW5lSXRlbVByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgICB4MTogeCxcbiAgICAgIHkxOiBlbnRyeSxcbiAgICAgIHgyOiB4ICsgd2lkdGgsXG4gICAgICB5MjogZW50cnksXG4gICAgICBrZXk6IFwibGluZS1cIi5jb25jYXQoaSksXG4gICAgICBpbmRleDogaVxuICAgIH0pO1xuICAgIHJldHVybiByZW5kZXJMaW5lSXRlbShob3Jpem9udGFsLCBsaW5lSXRlbVByb3BzKTtcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy1jYXJ0ZXNpYW4tZ3JpZC1ob3Jpem9udGFsXCJcbiAgfSwgaXRlbXMpO1xufVxuZnVuY3Rpb24gVmVydGljYWxHcmlkTGluZXMocHJvcHMpIHtcbiAgdmFyIHkgPSBwcm9wcy55LFxuICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICBfcHJvcHMkdmVydGljYWwgPSBwcm9wcy52ZXJ0aWNhbCxcbiAgICB2ZXJ0aWNhbCA9IF9wcm9wcyR2ZXJ0aWNhbCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyR2ZXJ0aWNhbCxcbiAgICB2ZXJ0aWNhbFBvaW50cyA9IHByb3BzLnZlcnRpY2FsUG9pbnRzO1xuICBpZiAoIXZlcnRpY2FsIHx8ICF2ZXJ0aWNhbFBvaW50cyB8fCAhdmVydGljYWxQb2ludHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGl0ZW1zID0gdmVydGljYWxQb2ludHMubWFwKGZ1bmN0aW9uIChlbnRyeSwgaSkge1xuICAgIHZhciBsaW5lSXRlbVByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgICB4MTogZW50cnksXG4gICAgICB5MTogeSxcbiAgICAgIHgyOiBlbnRyeSxcbiAgICAgIHkyOiB5ICsgaGVpZ2h0LFxuICAgICAga2V5OiBcImxpbmUtXCIuY29uY2F0KGkpLFxuICAgICAgaW5kZXg6IGlcbiAgICB9KTtcbiAgICByZXR1cm4gcmVuZGVyTGluZUl0ZW0odmVydGljYWwsIGxpbmVJdGVtUHJvcHMpO1xuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCB7XG4gICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLWNhcnRlc2lhbi1ncmlkLXZlcnRpY2FsXCJcbiAgfSwgaXRlbXMpO1xufVxuZnVuY3Rpb24gSG9yaXpvbnRhbFN0cmlwZXMocHJvcHMpIHtcbiAgdmFyIGhvcml6b250YWxGaWxsID0gcHJvcHMuaG9yaXpvbnRhbEZpbGwsXG4gICAgZmlsbE9wYWNpdHkgPSBwcm9wcy5maWxsT3BhY2l0eSxcbiAgICB4ID0gcHJvcHMueCxcbiAgICB5ID0gcHJvcHMueSxcbiAgICB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICBob3Jpem9udGFsUG9pbnRzID0gcHJvcHMuaG9yaXpvbnRhbFBvaW50cyxcbiAgICBfcHJvcHMkaG9yaXpvbnRhbDIgPSBwcm9wcy5ob3Jpem9udGFsLFxuICAgIGhvcml6b250YWwgPSBfcHJvcHMkaG9yaXpvbnRhbDIgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkaG9yaXpvbnRhbDI7XG4gIGlmICghaG9yaXpvbnRhbCB8fCAhaG9yaXpvbnRhbEZpbGwgfHwgIWhvcml6b250YWxGaWxsLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gV2h5ID15IC15PyBJIHdhcyB0cnlpbmcgdG8gZmluZCBhbnkgZGlmZmVyZW5jZSB0aGF0IHRoaXMgbWFrZXMsIHdpdGggZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhbmQgZWRnZSBjYXNlcyBidXQgLi4uIG5vdGhpbmcuXG4gIHZhciByb3VuZGVkU29ydGVkSG9yaXpvbnRhbFBvaW50cyA9IGhvcml6b250YWxQb2ludHMubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoZSArIHkgLSB5KTtcbiAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhIC0gYjtcbiAgfSk7XG4gIC8vIFdoeSBpcyB0aGlzIGNvbmRpdGlvbiBgIT09YCBpbnN0ZWFkIG9mIGA8PWAgP1xuICBpZiAoeSAhPT0gcm91bmRlZFNvcnRlZEhvcml6b250YWxQb2ludHNbMF0pIHtcbiAgICByb3VuZGVkU29ydGVkSG9yaXpvbnRhbFBvaW50cy51bnNoaWZ0KDApO1xuICB9XG4gIHZhciBpdGVtcyA9IHJvdW5kZWRTb3J0ZWRIb3Jpem9udGFsUG9pbnRzLm1hcChmdW5jdGlvbiAoZW50cnksIGkpIHtcbiAgICAvLyBXaHkgZG8gd2Ugc3RyaXAgb25seSB0aGUgbGFzdCBzdHJpcGUgaWYgaXQgaXMgaW52aXNpYmxlLCBhbmQgbm90IGFsbCBpbnZpc2libGUgc3RyaXBlcz9cbiAgICB2YXIgbGFzdFN0cmlwZSA9ICFyb3VuZGVkU29ydGVkSG9yaXpvbnRhbFBvaW50c1tpICsgMV07XG4gICAgdmFyIGxpbmVIZWlnaHQgPSBsYXN0U3RyaXBlID8geSArIGhlaWdodCAtIGVudHJ5IDogcm91bmRlZFNvcnRlZEhvcml6b250YWxQb2ludHNbaSArIDFdIC0gZW50cnk7XG4gICAgaWYgKGxpbmVIZWlnaHQgPD0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBjb2xvckluZGV4ID0gaSAlIGhvcml6b250YWxGaWxsLmxlbmd0aDtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICAgIGtleTogXCJyZWFjdC1cIi5jb25jYXQoaSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZWFjdC9uby1hcnJheS1pbmRleC1rZXlcbiAgICAgICxcbiAgICAgIHk6IGVudHJ5LFxuICAgICAgeDogeCxcbiAgICAgIGhlaWdodDogbGluZUhlaWdodCxcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIHN0cm9rZTogXCJub25lXCIsXG4gICAgICBmaWxsOiBob3Jpem9udGFsRmlsbFtjb2xvckluZGV4XSxcbiAgICAgIGZpbGxPcGFjaXR5OiBmaWxsT3BhY2l0eSxcbiAgICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy1jYXJ0ZXNpYW4tZ3JpZC1iZ1wiXG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtY2FydGVzaWFuLWdyaWRzdHJpcGVzLWhvcml6b250YWxcIlxuICB9LCBpdGVtcyk7XG59XG5mdW5jdGlvbiBWZXJ0aWNhbFN0cmlwZXMocHJvcHMpIHtcbiAgdmFyIF9wcm9wcyR2ZXJ0aWNhbDIgPSBwcm9wcy52ZXJ0aWNhbCxcbiAgICB2ZXJ0aWNhbCA9IF9wcm9wcyR2ZXJ0aWNhbDIgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkdmVydGljYWwyLFxuICAgIHZlcnRpY2FsRmlsbCA9IHByb3BzLnZlcnRpY2FsRmlsbCxcbiAgICBmaWxsT3BhY2l0eSA9IHByb3BzLmZpbGxPcGFjaXR5LFxuICAgIHggPSBwcm9wcy54LFxuICAgIHkgPSBwcm9wcy55LFxuICAgIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgIHZlcnRpY2FsUG9pbnRzID0gcHJvcHMudmVydGljYWxQb2ludHM7XG4gIGlmICghdmVydGljYWwgfHwgIXZlcnRpY2FsRmlsbCB8fCAhdmVydGljYWxGaWxsLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciByb3VuZGVkU29ydGVkVmVydGljYWxQb2ludHMgPSB2ZXJ0aWNhbFBvaW50cy5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChlICsgeCAtIHgpO1xuICB9KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGEgLSBiO1xuICB9KTtcbiAgaWYgKHggIT09IHJvdW5kZWRTb3J0ZWRWZXJ0aWNhbFBvaW50c1swXSkge1xuICAgIHJvdW5kZWRTb3J0ZWRWZXJ0aWNhbFBvaW50cy51bnNoaWZ0KDApO1xuICB9XG4gIHZhciBpdGVtcyA9IHJvdW5kZWRTb3J0ZWRWZXJ0aWNhbFBvaW50cy5tYXAoZnVuY3Rpb24gKGVudHJ5LCBpKSB7XG4gICAgdmFyIGxhc3RTdHJpcGUgPSAhcm91bmRlZFNvcnRlZFZlcnRpY2FsUG9pbnRzW2kgKyAxXTtcbiAgICB2YXIgbGluZVdpZHRoID0gbGFzdFN0cmlwZSA/IHggKyB3aWR0aCAtIGVudHJ5IDogcm91bmRlZFNvcnRlZFZlcnRpY2FsUG9pbnRzW2kgKyAxXSAtIGVudHJ5O1xuICAgIGlmIChsaW5lV2lkdGggPD0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBjb2xvckluZGV4ID0gaSAlIHZlcnRpY2FsRmlsbC5sZW5ndGg7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgICBrZXk6IFwicmVhY3QtXCIuY29uY2F0KGkpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5XG4gICAgICAsXG4gICAgICB4OiBlbnRyeSxcbiAgICAgIHk6IHksXG4gICAgICB3aWR0aDogbGluZVdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBzdHJva2U6IFwibm9uZVwiLFxuICAgICAgZmlsbDogdmVydGljYWxGaWxsW2NvbG9ySW5kZXhdLFxuICAgICAgZmlsbE9wYWNpdHk6IGZpbGxPcGFjaXR5LFxuICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLWNhcnRlc2lhbi1ncmlkLWJnXCJcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy1jYXJ0ZXNpYW4tZ3JpZHN0cmlwZXMtdmVydGljYWxcIlxuICB9LCBpdGVtcyk7XG59XG52YXIgZGVmYXVsdFZlcnRpY2FsQ29vcmRpbmF0ZXNHZW5lcmF0b3IgPSBmdW5jdGlvbiBkZWZhdWx0VmVydGljYWxDb29yZGluYXRlc0dlbmVyYXRvcihfcmVmLCBzeW5jV2l0aFRpY2tzKSB7XG4gIHZhciB4QXhpcyA9IF9yZWYueEF4aXMsXG4gICAgd2lkdGggPSBfcmVmLndpZHRoLFxuICAgIGhlaWdodCA9IF9yZWYuaGVpZ2h0LFxuICAgIG9mZnNldCA9IF9yZWYub2Zmc2V0O1xuICByZXR1cm4gZ2V0Q29vcmRpbmF0ZXNPZkdyaWQoZ2V0VGlja3MoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIENhcnRlc2lhbkF4aXMuZGVmYXVsdFByb3BzKSwgeEF4aXMpLCB7fSwge1xuICAgIHRpY2tzOiBnZXRUaWNrc09mQXhpcyh4QXhpcywgdHJ1ZSksXG4gICAgdmlld0JveDoge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICB3aWR0aDogd2lkdGgsXG4gICAgICBoZWlnaHQ6IGhlaWdodFxuICAgIH1cbiAgfSkpLCBvZmZzZXQubGVmdCwgb2Zmc2V0LmxlZnQgKyBvZmZzZXQud2lkdGgsIHN5bmNXaXRoVGlja3MpO1xufTtcbnZhciBkZWZhdWx0SG9yaXpvbnRhbENvb3JkaW5hdGVzR2VuZXJhdG9yID0gZnVuY3Rpb24gZGVmYXVsdEhvcml6b250YWxDb29yZGluYXRlc0dlbmVyYXRvcihfcmVmMiwgc3luY1dpdGhUaWNrcykge1xuICB2YXIgeUF4aXMgPSBfcmVmMi55QXhpcyxcbiAgICB3aWR0aCA9IF9yZWYyLndpZHRoLFxuICAgIGhlaWdodCA9IF9yZWYyLmhlaWdodCxcbiAgICBvZmZzZXQgPSBfcmVmMi5vZmZzZXQ7XG4gIHJldHVybiBnZXRDb29yZGluYXRlc09mR3JpZChnZXRUaWNrcyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgQ2FydGVzaWFuQXhpcy5kZWZhdWx0UHJvcHMpLCB5QXhpcyksIHt9LCB7XG4gICAgdGlja3M6IGdldFRpY2tzT2ZBeGlzKHlBeGlzLCB0cnVlKSxcbiAgICB2aWV3Qm94OiB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMCxcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgfVxuICB9KSksIG9mZnNldC50b3AsIG9mZnNldC50b3AgKyBvZmZzZXQuaGVpZ2h0LCBzeW5jV2l0aFRpY2tzKTtcbn07XG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBob3Jpem9udGFsOiB0cnVlLFxuICB2ZXJ0aWNhbDogdHJ1ZSxcbiAgLy8gVGhlIG9yZGluYXRlcyBvZiBob3Jpem9udGFsIGdyaWQgbGluZXNcbiAgaG9yaXpvbnRhbFBvaW50czogW10sXG4gIC8vIFRoZSBhYnNjaXNzYXMgb2YgdmVydGljYWwgZ3JpZCBsaW5lc1xuICB2ZXJ0aWNhbFBvaW50czogW10sXG4gIHN0cm9rZTogJyNjY2MnLFxuICBmaWxsOiAnbm9uZScsXG4gIC8vIFRoZSBmaWxsIG9mIGNvbG9ycyBvZiBncmlkIGxpbmVzXG4gIHZlcnRpY2FsRmlsbDogW10sXG4gIGhvcml6b250YWxGaWxsOiBbXVxufTtcbmV4cG9ydCBmdW5jdGlvbiBDYXJ0ZXNpYW5HcmlkKHByb3BzKSB7XG4gIHZhciBfcHJvcHMkc3Ryb2tlLCBfcHJvcHMkZmlsbCwgX3Byb3BzJGhvcml6b250YWwzLCBfcHJvcHMkaG9yaXpvbnRhbEZpbGwsIF9wcm9wcyR2ZXJ0aWNhbDMsIF9wcm9wcyR2ZXJ0aWNhbEZpbGw7XG4gIHZhciBjaGFydFdpZHRoID0gdXNlQ2hhcnRXaWR0aCgpO1xuICB2YXIgY2hhcnRIZWlnaHQgPSB1c2VDaGFydEhlaWdodCgpO1xuICB2YXIgb2Zmc2V0ID0gdXNlT2Zmc2V0KCk7XG4gIHZhciBwcm9wc0luY2x1ZGluZ0RlZmF1bHRzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgc3Ryb2tlOiAoX3Byb3BzJHN0cm9rZSA9IHByb3BzLnN0cm9rZSkgIT09IG51bGwgJiYgX3Byb3BzJHN0cm9rZSAhPT0gdm9pZCAwID8gX3Byb3BzJHN0cm9rZSA6IGRlZmF1bHRQcm9wcy5zdHJva2UsXG4gICAgZmlsbDogKF9wcm9wcyRmaWxsID0gcHJvcHMuZmlsbCkgIT09IG51bGwgJiYgX3Byb3BzJGZpbGwgIT09IHZvaWQgMCA/IF9wcm9wcyRmaWxsIDogZGVmYXVsdFByb3BzLmZpbGwsXG4gICAgaG9yaXpvbnRhbDogKF9wcm9wcyRob3Jpem9udGFsMyA9IHByb3BzLmhvcml6b250YWwpICE9PSBudWxsICYmIF9wcm9wcyRob3Jpem9udGFsMyAhPT0gdm9pZCAwID8gX3Byb3BzJGhvcml6b250YWwzIDogZGVmYXVsdFByb3BzLmhvcml6b250YWwsXG4gICAgaG9yaXpvbnRhbEZpbGw6IChfcHJvcHMkaG9yaXpvbnRhbEZpbGwgPSBwcm9wcy5ob3Jpem9udGFsRmlsbCkgIT09IG51bGwgJiYgX3Byb3BzJGhvcml6b250YWxGaWxsICE9PSB2b2lkIDAgPyBfcHJvcHMkaG9yaXpvbnRhbEZpbGwgOiBkZWZhdWx0UHJvcHMuaG9yaXpvbnRhbEZpbGwsXG4gICAgdmVydGljYWw6IChfcHJvcHMkdmVydGljYWwzID0gcHJvcHMudmVydGljYWwpICE9PSBudWxsICYmIF9wcm9wcyR2ZXJ0aWNhbDMgIT09IHZvaWQgMCA/IF9wcm9wcyR2ZXJ0aWNhbDMgOiBkZWZhdWx0UHJvcHMudmVydGljYWwsXG4gICAgdmVydGljYWxGaWxsOiAoX3Byb3BzJHZlcnRpY2FsRmlsbCA9IHByb3BzLnZlcnRpY2FsRmlsbCkgIT09IG51bGwgJiYgX3Byb3BzJHZlcnRpY2FsRmlsbCAhPT0gdm9pZCAwID8gX3Byb3BzJHZlcnRpY2FsRmlsbCA6IGRlZmF1bHRQcm9wcy52ZXJ0aWNhbEZpbGwsXG4gICAgeDogaXNOdW1iZXIocHJvcHMueCkgPyBwcm9wcy54IDogb2Zmc2V0LmxlZnQsXG4gICAgeTogaXNOdW1iZXIocHJvcHMueSkgPyBwcm9wcy55IDogb2Zmc2V0LnRvcCxcbiAgICB3aWR0aDogaXNOdW1iZXIocHJvcHMud2lkdGgpID8gcHJvcHMud2lkdGggOiBvZmZzZXQud2lkdGgsXG4gICAgaGVpZ2h0OiBpc051bWJlcihwcm9wcy5oZWlnaHQpID8gcHJvcHMuaGVpZ2h0IDogb2Zmc2V0LmhlaWdodFxuICB9KTtcbiAgdmFyIHggPSBwcm9wc0luY2x1ZGluZ0RlZmF1bHRzLngsXG4gICAgeSA9IHByb3BzSW5jbHVkaW5nRGVmYXVsdHMueSxcbiAgICB3aWR0aCA9IHByb3BzSW5jbHVkaW5nRGVmYXVsdHMud2lkdGgsXG4gICAgaGVpZ2h0ID0gcHJvcHNJbmNsdWRpbmdEZWZhdWx0cy5oZWlnaHQsXG4gICAgc3luY1dpdGhUaWNrcyA9IHByb3BzSW5jbHVkaW5nRGVmYXVsdHMuc3luY1dpdGhUaWNrcyxcbiAgICBob3Jpem9udGFsVmFsdWVzID0gcHJvcHNJbmNsdWRpbmdEZWZhdWx0cy5ob3Jpem9udGFsVmFsdWVzLFxuICAgIHZlcnRpY2FsVmFsdWVzID0gcHJvcHNJbmNsdWRpbmdEZWZhdWx0cy52ZXJ0aWNhbFZhbHVlcztcblxuICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoZSBzY2FsZSBwcm9wIGlzIG1peGVkIHVwIC0gd2UgbmVlZCB0byB1bnRhZ2xlIHRoaXMgYXQgc29tZSBwb2ludFxuICB2YXIgeEF4aXMgPSB1c2VBcmJpdHJhcnlYQXhpcygpO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoZSBzY2FsZSBwcm9wIGlzIG1peGVkIHVwIC0gd2UgbmVlZCB0byB1bnRhZ2xlIHRoaXMgYXQgc29tZSBwb2ludFxuICB2YXIgeUF4aXMgPSB1c2VZQXhpc1dpdGhGaW5pdGVEb21haW5PclJhbmRvbSgpO1xuICBpZiAoIWlzTnVtYmVyKHdpZHRoKSB8fCB3aWR0aCA8PSAwIHx8ICFpc051bWJlcihoZWlnaHQpIHx8IGhlaWdodCA8PSAwIHx8ICFpc051bWJlcih4KSB8fCB4ICE9PSAreCB8fCAhaXNOdW1iZXIoeSkgfHwgeSAhPT0gK3kpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qXG4gICAqIHZlcnRpY2FsQ29vcmRpbmF0ZXNHZW5lcmF0b3IgYW5kIGhvcml6b250YWxDb29yZGluYXRlc0dlbmVyYXRvciBhcmUgZGVmaW5lZFxuICAgKiBvdXRzaWRlIG9mIHRoZSBwcm9wc0luY2x1ZGluZ0RlZmF1bHRzIGJlY2F1c2UgdGhleSB3ZXJlIG5ldmVyIHBhcnQgb2YgdGhlIG9yaWdpbmFsIHByb3BzXG4gICAqIGFuZCB0aGV5IHdlcmUgbmV2ZXIgcGFzc2VkIGFzIGEgcHJvcCBkb3duIHRvIGhvcml6b250YWwvdmVydGljYWwgY3VzdG9tIGVsZW1lbnRzLlxuICAgKiBJZiB3ZSBhZGQgdGhlc2UgdHdvIHRvIHByb3BzSW5jbHVkaW5nRGVmYXVsdHMgdGhlbiB3ZSBhcmUgY2hhbmdpbmcgcHVibGljIEFQSS5cbiAgICogTm90IGEgYmFkIHRoaW5nIHBlciBzZSBidXQgYWxzbyBub3QgbmVjZXNzYXJ5LlxuICAgKi9cbiAgdmFyIHZlcnRpY2FsQ29vcmRpbmF0ZXNHZW5lcmF0b3IgPSBwcm9wc0luY2x1ZGluZ0RlZmF1bHRzLnZlcnRpY2FsQ29vcmRpbmF0ZXNHZW5lcmF0b3IgfHwgZGVmYXVsdFZlcnRpY2FsQ29vcmRpbmF0ZXNHZW5lcmF0b3I7XG4gIHZhciBob3Jpem9udGFsQ29vcmRpbmF0ZXNHZW5lcmF0b3IgPSBwcm9wc0luY2x1ZGluZ0RlZmF1bHRzLmhvcml6b250YWxDb29yZGluYXRlc0dlbmVyYXRvciB8fCBkZWZhdWx0SG9yaXpvbnRhbENvb3JkaW5hdGVzR2VuZXJhdG9yO1xuICB2YXIgaG9yaXpvbnRhbFBvaW50cyA9IHByb3BzSW5jbHVkaW5nRGVmYXVsdHMuaG9yaXpvbnRhbFBvaW50cyxcbiAgICB2ZXJ0aWNhbFBvaW50cyA9IHByb3BzSW5jbHVkaW5nRGVmYXVsdHMudmVydGljYWxQb2ludHM7XG5cbiAgLy8gTm8gaG9yaXpvbnRhbCBwb2ludHMgYXJlIHNwZWNpZmllZFxuICBpZiAoKCFob3Jpem9udGFsUG9pbnRzIHx8ICFob3Jpem9udGFsUG9pbnRzLmxlbmd0aCkgJiYgaXNGdW5jdGlvbihob3Jpem9udGFsQ29vcmRpbmF0ZXNHZW5lcmF0b3IpKSB7XG4gICAgdmFyIGlzSG9yaXpvbnRhbFZhbHVlcyA9IGhvcml6b250YWxWYWx1ZXMgJiYgaG9yaXpvbnRhbFZhbHVlcy5sZW5ndGg7XG4gICAgdmFyIGdlbmVyYXRvclJlc3VsdCA9IGhvcml6b250YWxDb29yZGluYXRlc0dlbmVyYXRvcih7XG4gICAgICB5QXhpczogeUF4aXMgPyBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHlBeGlzKSwge30sIHtcbiAgICAgICAgdGlja3M6IGlzSG9yaXpvbnRhbFZhbHVlcyA/IGhvcml6b250YWxWYWx1ZXMgOiB5QXhpcy50aWNrc1xuICAgICAgfSkgOiB1bmRlZmluZWQsXG4gICAgICB3aWR0aDogY2hhcnRXaWR0aCxcbiAgICAgIGhlaWdodDogY2hhcnRIZWlnaHQsXG4gICAgICBvZmZzZXQ6IG9mZnNldFxuICAgIH0sIGlzSG9yaXpvbnRhbFZhbHVlcyA/IHRydWUgOiBzeW5jV2l0aFRpY2tzKTtcbiAgICB3YXJuKEFycmF5LmlzQXJyYXkoZ2VuZXJhdG9yUmVzdWx0KSwgXCJob3Jpem9udGFsQ29vcmRpbmF0ZXNHZW5lcmF0b3Igc2hvdWxkIHJldHVybiBBcnJheSBidXQgaW5zdGVhZCBpdCByZXR1cm5lZCBbXCIuY29uY2F0KF90eXBlb2YoZ2VuZXJhdG9yUmVzdWx0KSwgXCJdXCIpKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShnZW5lcmF0b3JSZXN1bHQpKSB7XG4gICAgICBob3Jpem9udGFsUG9pbnRzID0gZ2VuZXJhdG9yUmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vIHZlcnRpY2FsIHBvaW50cyBhcmUgc3BlY2lmaWVkXG4gIGlmICgoIXZlcnRpY2FsUG9pbnRzIHx8ICF2ZXJ0aWNhbFBvaW50cy5sZW5ndGgpICYmIGlzRnVuY3Rpb24odmVydGljYWxDb29yZGluYXRlc0dlbmVyYXRvcikpIHtcbiAgICB2YXIgaXNWZXJ0aWNhbFZhbHVlcyA9IHZlcnRpY2FsVmFsdWVzICYmIHZlcnRpY2FsVmFsdWVzLmxlbmd0aDtcbiAgICB2YXIgX2dlbmVyYXRvclJlc3VsdCA9IHZlcnRpY2FsQ29vcmRpbmF0ZXNHZW5lcmF0b3Ioe1xuICAgICAgeEF4aXM6IHhBeGlzID8gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB4QXhpcyksIHt9LCB7XG4gICAgICAgIHRpY2tzOiBpc1ZlcnRpY2FsVmFsdWVzID8gdmVydGljYWxWYWx1ZXMgOiB4QXhpcy50aWNrc1xuICAgICAgfSkgOiB1bmRlZmluZWQsXG4gICAgICB3aWR0aDogY2hhcnRXaWR0aCxcbiAgICAgIGhlaWdodDogY2hhcnRIZWlnaHQsXG4gICAgICBvZmZzZXQ6IG9mZnNldFxuICAgIH0sIGlzVmVydGljYWxWYWx1ZXMgPyB0cnVlIDogc3luY1dpdGhUaWNrcyk7XG4gICAgd2FybihBcnJheS5pc0FycmF5KF9nZW5lcmF0b3JSZXN1bHQpLCBcInZlcnRpY2FsQ29vcmRpbmF0ZXNHZW5lcmF0b3Igc2hvdWxkIHJldHVybiBBcnJheSBidXQgaW5zdGVhZCBpdCByZXR1cm5lZCBbXCIuY29uY2F0KF90eXBlb2YoX2dlbmVyYXRvclJlc3VsdCksIFwiXVwiKSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoX2dlbmVyYXRvclJlc3VsdCkpIHtcbiAgICAgIHZlcnRpY2FsUG9pbnRzID0gX2dlbmVyYXRvclJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCB7XG4gICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLWNhcnRlc2lhbi1ncmlkXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFja2dyb3VuZCwge1xuICAgIGZpbGw6IHByb3BzSW5jbHVkaW5nRGVmYXVsdHMuZmlsbCxcbiAgICBmaWxsT3BhY2l0eTogcHJvcHNJbmNsdWRpbmdEZWZhdWx0cy5maWxsT3BhY2l0eSxcbiAgICB4OiBwcm9wc0luY2x1ZGluZ0RlZmF1bHRzLngsXG4gICAgeTogcHJvcHNJbmNsdWRpbmdEZWZhdWx0cy55LFxuICAgIHdpZHRoOiBwcm9wc0luY2x1ZGluZ0RlZmF1bHRzLndpZHRoLFxuICAgIGhlaWdodDogcHJvcHNJbmNsdWRpbmdEZWZhdWx0cy5oZWlnaHQsXG4gICAgcnk6IHByb3BzSW5jbHVkaW5nRGVmYXVsdHMucnlcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEhvcml6b250YWxHcmlkTGluZXMsIF9leHRlbmRzKHt9LCBwcm9wc0luY2x1ZGluZ0RlZmF1bHRzLCB7XG4gICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgaG9yaXpvbnRhbFBvaW50czogaG9yaXpvbnRhbFBvaW50cyxcbiAgICB4QXhpczogeEF4aXMsXG4gICAgeUF4aXM6IHlBeGlzXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVmVydGljYWxHcmlkTGluZXMsIF9leHRlbmRzKHt9LCBwcm9wc0luY2x1ZGluZ0RlZmF1bHRzLCB7XG4gICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgdmVydGljYWxQb2ludHM6IHZlcnRpY2FsUG9pbnRzLFxuICAgIHhBeGlzOiB4QXhpcyxcbiAgICB5QXhpczogeUF4aXNcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIb3Jpem9udGFsU3RyaXBlcywgX2V4dGVuZHMoe30sIHByb3BzSW5jbHVkaW5nRGVmYXVsdHMsIHtcbiAgICBob3Jpem9udGFsUG9pbnRzOiBob3Jpem9udGFsUG9pbnRzXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVmVydGljYWxTdHJpcGVzLCBfZXh0ZW5kcyh7fSwgcHJvcHNJbmNsdWRpbmdEZWZhdWx0cywge1xuICAgIHZlcnRpY2FsUG9pbnRzOiB2ZXJ0aWNhbFBvaW50c1xuICB9KSkpO1xufVxuQ2FydGVzaWFuR3JpZC5kaXNwbGF5TmFtZSA9ICdDYXJ0ZXNpYW5HcmlkJzsiLCJ2YXIgX2V4Y2x1ZGVkID0gW1wib2Zmc2V0XCIsIFwibGF5b3V0XCIsIFwid2lkdGhcIiwgXCJkYXRhS2V5XCIsIFwiZGF0YVwiLCBcImRhdGFQb2ludEZvcm1hdHRlclwiLCBcInhBeGlzXCIsIFwieUF4aXNcIl07XG5mdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQociwgbCkgeyB2YXIgdCA9IG51bGwgPT0gciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgcltTeW1ib2wuaXRlcmF0b3JdIHx8IHJbXCJAQGl0ZXJhdG9yXCJdOyBpZiAobnVsbCAhPSB0KSB7IHZhciBlLCBuLCBpLCB1LCBhID0gW10sIGYgPSAhMCwgbyA9ICExOyB0cnkgeyBpZiAoaSA9ICh0ID0gdC5jYWxsKHIpKS5uZXh0LCAwID09PSBsKSB7IGlmIChPYmplY3QodCkgIT09IHQpIHJldHVybjsgZiA9ICExOyB9IGVsc2UgZm9yICg7ICEoZiA9IChlID0gaS5jYWxsKHQpKS5kb25lKSAmJiAoYS5wdXNoKGUudmFsdWUpLCBhLmxlbmd0aCAhPT0gbCk7IGYgPSAhMCk7IH0gY2F0Y2ggKHIpIHsgbyA9ICEwLCBuID0gcjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFmICYmIG51bGwgIT0gdFtcInJldHVyblwiXSAmJiAodSA9IHRbXCJyZXR1cm5cIl0oKSwgT2JqZWN0KHUpICE9PSB1KSkgcmV0dXJuOyB9IGZpbmFsbHkgeyBpZiAobykgdGhyb3cgbjsgfSB9IHJldHVybiBhOyB9IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIF90b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7IH0gfVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cbmZ1bmN0aW9uIF9jYWxsU3VwZXIodCwgbywgZSkgeyByZXR1cm4gbyA9IF9nZXRQcm90b3R5cGVPZihvKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odCwgX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpID8gUmVmbGVjdC5jb25zdHJ1Y3QobywgZSB8fCBbXSwgX2dldFByb3RvdHlwZU9mKHQpLmNvbnN0cnVjdG9yKSA6IG8uYXBwbHkodCwgZSkpOyB9XG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWRcIik7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgdHJ5IHsgdmFyIHQgPSAhQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyB9IGNhdGNoICh0KSB7fSByZXR1cm4gKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyByZXR1cm4gISF0OyB9KSgpOyB9XG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN1YkNsYXNzLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbi8qKlxuICogQGZpbGVPdmVydmlldyBSZW5kZXIgYSBncm91cCBvZiBlcnJvciBiYXJcbiAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAndGlueS1pbnZhcmlhbnQnO1xuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb250YWluZXIvTGF5ZXInO1xuaW1wb3J0IHsgZmlsdGVyUHJvcHMgfSBmcm9tICcuLi91dGlsL1JlYWN0VXRpbHMnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L3ByZWZlci1zdGF0ZWxlc3MtZnVuY3Rpb24gLS0gcmVxdWlyZXMgc3RhdGljIGRlZmF1bHRQcm9wc1xuZXhwb3J0IHZhciBFcnJvckJhciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBmdW5jdGlvbiBFcnJvckJhcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXJyb3JCYXIpO1xuICAgIHJldHVybiBfY2FsbFN1cGVyKHRoaXMsIEVycm9yQmFyLCBhcmd1bWVudHMpO1xuICB9XG4gIF9pbmhlcml0cyhFcnJvckJhciwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHJldHVybiBfY3JlYXRlQ2xhc3MoRXJyb3JCYXIsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBvZmZzZXQgPSBfdGhpcyRwcm9wcy5vZmZzZXQsXG4gICAgICAgIGxheW91dCA9IF90aGlzJHByb3BzLmxheW91dCxcbiAgICAgICAgd2lkdGggPSBfdGhpcyRwcm9wcy53aWR0aCxcbiAgICAgICAgZGF0YUtleSA9IF90aGlzJHByb3BzLmRhdGFLZXksXG4gICAgICAgIGRhdGEgPSBfdGhpcyRwcm9wcy5kYXRhLFxuICAgICAgICBkYXRhUG9pbnRGb3JtYXR0ZXIgPSBfdGhpcyRwcm9wcy5kYXRhUG9pbnRGb3JtYXR0ZXIsXG4gICAgICAgIHhBeGlzID0gX3RoaXMkcHJvcHMueEF4aXMsXG4gICAgICAgIHlBeGlzID0gX3RoaXMkcHJvcHMueUF4aXMsXG4gICAgICAgIG90aGVycyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyRwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgICAgIHZhciBzdmdQcm9wcyA9IGZpbHRlclByb3BzKG90aGVycywgZmFsc2UpO1xuICAgICAgISEodGhpcy5wcm9wcy5kaXJlY3Rpb24gPT09ICd4JyAmJiB4QXhpcy50eXBlICE9PSAnbnVtYmVyJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdFcnJvckJhciByZXF1aXJlcyBBeGlzIHR5cGUgcHJvcGVydHkgdG8gYmUgXCJudW1iZXJcIi4nKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgICB2YXIgZXJyb3JCYXJzID0gZGF0YS5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIHZhciBfZGF0YVBvaW50Rm9ybWF0dGVyID0gZGF0YVBvaW50Rm9ybWF0dGVyKGVudHJ5LCBkYXRhS2V5KSxcbiAgICAgICAgICB4ID0gX2RhdGFQb2ludEZvcm1hdHRlci54LFxuICAgICAgICAgIHkgPSBfZGF0YVBvaW50Rm9ybWF0dGVyLnksXG4gICAgICAgICAgdmFsdWUgPSBfZGF0YVBvaW50Rm9ybWF0dGVyLnZhbHVlLFxuICAgICAgICAgIGVycm9yVmFsID0gX2RhdGFQb2ludEZvcm1hdHRlci5lcnJvclZhbDtcbiAgICAgICAgaWYgKCFlcnJvclZhbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsaW5lQ29vcmRpbmF0ZXMgPSBbXTtcbiAgICAgICAgdmFyIGxvd0JvdW5kLCBoaWdoQm91bmQ7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVycm9yVmFsKSkge1xuICAgICAgICAgIHZhciBfZXJyb3JWYWwgPSBfc2xpY2VkVG9BcnJheShlcnJvclZhbCwgMik7XG4gICAgICAgICAgbG93Qm91bmQgPSBfZXJyb3JWYWxbMF07XG4gICAgICAgICAgaGlnaEJvdW5kID0gX2Vycm9yVmFsWzFdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvd0JvdW5kID0gaGlnaEJvdW5kID0gZXJyb3JWYWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxheW91dCA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgICAgIC8vIGVycm9yIGJhciBmb3IgaG9yaXpvbnRhbCBjaGFydHMsIHRoZSB5IGlzIGZpeGVkLCB4IGlzIGEgcmFuZ2UgdmFsdWVcbiAgICAgICAgICB2YXIgc2NhbGUgPSB4QXhpcy5zY2FsZTtcbiAgICAgICAgICB2YXIgeU1pZCA9IHkgKyBvZmZzZXQ7XG4gICAgICAgICAgdmFyIHlNaW4gPSB5TWlkICsgd2lkdGg7XG4gICAgICAgICAgdmFyIHlNYXggPSB5TWlkIC0gd2lkdGg7XG4gICAgICAgICAgdmFyIHhNaW4gPSBzY2FsZSh2YWx1ZSAtIGxvd0JvdW5kKTtcbiAgICAgICAgICB2YXIgeE1heCA9IHNjYWxlKHZhbHVlICsgaGlnaEJvdW5kKTtcblxuICAgICAgICAgIC8vIHRoZSByaWdodCBsaW5lIG9mIHwtLXxcbiAgICAgICAgICBsaW5lQ29vcmRpbmF0ZXMucHVzaCh7XG4gICAgICAgICAgICB4MTogeE1heCxcbiAgICAgICAgICAgIHkxOiB5TWluLFxuICAgICAgICAgICAgeDI6IHhNYXgsXG4gICAgICAgICAgICB5MjogeU1heFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIHRoZSBtaWRkbGUgbGluZSBvZiB8LS18XG4gICAgICAgICAgbGluZUNvb3JkaW5hdGVzLnB1c2goe1xuICAgICAgICAgICAgeDE6IHhNaW4sXG4gICAgICAgICAgICB5MTogeU1pZCxcbiAgICAgICAgICAgIHgyOiB4TWF4LFxuICAgICAgICAgICAgeTI6IHlNaWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyB0aGUgbGVmdCBsaW5lIG9mIHwtLXxcbiAgICAgICAgICBsaW5lQ29vcmRpbmF0ZXMucHVzaCh7XG4gICAgICAgICAgICB4MTogeE1pbixcbiAgICAgICAgICAgIHkxOiB5TWluLFxuICAgICAgICAgICAgeDI6IHhNaW4sXG4gICAgICAgICAgICB5MjogeU1heFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGxheW91dCA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgICAgLy8gZXJyb3IgYmFyIGZvciBob3Jpem9udGFsIGNoYXJ0cywgdGhlIHggaXMgZml4ZWQsIHkgaXMgYSByYW5nZSB2YWx1ZVxuICAgICAgICAgIHZhciBfc2NhbGUgPSB5QXhpcy5zY2FsZTtcbiAgICAgICAgICB2YXIgeE1pZCA9IHggKyBvZmZzZXQ7XG4gICAgICAgICAgdmFyIF94TWluID0geE1pZCAtIHdpZHRoO1xuICAgICAgICAgIHZhciBfeE1heCA9IHhNaWQgKyB3aWR0aDtcbiAgICAgICAgICB2YXIgX3lNaW4gPSBfc2NhbGUodmFsdWUgLSBsb3dCb3VuZCk7XG4gICAgICAgICAgdmFyIF95TWF4ID0gX3NjYWxlKHZhbHVlICsgaGlnaEJvdW5kKTtcblxuICAgICAgICAgIC8vIHRoZSB0b3AgbGluZVxuICAgICAgICAgIGxpbmVDb29yZGluYXRlcy5wdXNoKHtcbiAgICAgICAgICAgIHgxOiBfeE1pbixcbiAgICAgICAgICAgIHkxOiBfeU1heCxcbiAgICAgICAgICAgIHgyOiBfeE1heCxcbiAgICAgICAgICAgIHkyOiBfeU1heFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIHRoZSBtaWRkbGUgbGluZVxuICAgICAgICAgIGxpbmVDb29yZGluYXRlcy5wdXNoKHtcbiAgICAgICAgICAgIHgxOiB4TWlkLFxuICAgICAgICAgICAgeTE6IF95TWluLFxuICAgICAgICAgICAgeDI6IHhNaWQsXG4gICAgICAgICAgICB5MjogX3lNYXhcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyB0aGUgYm90dG9tIGxpbmVcbiAgICAgICAgICBsaW5lQ29vcmRpbmF0ZXMucHVzaCh7XG4gICAgICAgICAgICB4MTogX3hNaW4sXG4gICAgICAgICAgICB5MTogX3lNaW4sXG4gICAgICAgICAgICB4MjogX3hNYXgsXG4gICAgICAgICAgICB5MjogX3lNaW5cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGF5ZXIsIF9leHRlbmRzKHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtZXJyb3JCYXJcIixcbiAgICAgICAgICBrZXk6IFwiYmFyLVwiLmNvbmNhdChsaW5lQ29vcmRpbmF0ZXMubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQoYy54MSwgXCItXCIpLmNvbmNhdChjLngyLCBcIi1cIikuY29uY2F0KGMueTEsIFwiLVwiKS5jb25jYXQoYy55Mik7XG4gICAgICAgICAgfSkpXG4gICAgICAgIH0sIHN2Z1Byb3BzKSwgbGluZUNvb3JkaW5hdGVzLm1hcChmdW5jdGlvbiAoY29vcmRpbmF0ZXMpIHtcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaW5lXCIsIF9leHRlbmRzKHt9LCBjb29yZGluYXRlcywge1xuICAgICAgICAgICAga2V5OiBcImxpbmUtXCIuY29uY2F0KGNvb3JkaW5hdGVzLngxLCBcIi1cIikuY29uY2F0KGNvb3JkaW5hdGVzLngyLCBcIi1cIikuY29uY2F0KGNvb3JkaW5hdGVzLnkxLCBcIi1cIikuY29uY2F0KGNvb3JkaW5hdGVzLnkyKVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGF5ZXIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLWVycm9yQmFyc1wiXG4gICAgICB9LCBlcnJvckJhcnMpO1xuICAgIH1cbiAgfV0pO1xufShSZWFjdC5Db21wb25lbnQpO1xuX2RlZmluZVByb3BlcnR5KEVycm9yQmFyLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIHN0cm9rZTogJ2JsYWNrJyxcbiAgc3Ryb2tlV2lkdGg6IDEuNSxcbiAgd2lkdGg6IDUsXG4gIG9mZnNldDogMCxcbiAgbGF5b3V0OiAnaG9yaXpvbnRhbCdcbn0pO1xuX2RlZmluZVByb3BlcnR5KEVycm9yQmFyLCBcImRpc3BsYXlOYW1lXCIsICdFcnJvckJhcicpOyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOyB9IH1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5mdW5jdGlvbiBfY2FsbFN1cGVyKHQsIG8sIGUpIHsgcmV0dXJuIG8gPSBfZ2V0UHJvdG90eXBlT2YobyksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSA/IFJlZmxlY3QuY29uc3RydWN0KG8sIGUgfHwgW10sIF9nZXRQcm90b3R5cGVPZih0KS5jb25zdHJ1Y3RvcikgOiBvLmFwcGx5KHQsIGUpKTsgfVxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSBlbHNlIGlmIChjYWxsICE9PSB2b2lkIDApIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IHRyeSB7IHZhciB0ID0gIUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgfSBjYXRjaCAodCkge30gcmV0dXJuIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgcmV0dXJuICEhdDsgfSkoKTsgfVxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgUmVmZXJlbmNlIExpbmVcbiAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJ2xvZGFzaC9pc0Z1bmN0aW9uJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb250YWluZXIvTGF5ZXInO1xuaW1wb3J0IHsgTGFiZWwgfSBmcm9tICcuLi9jb21wb25lbnQvTGFiZWwnO1xuaW1wb3J0IHsgY3JlYXRlTGFiZWxlZFNjYWxlcywgcmVjdFdpdGhQb2ludHMgfSBmcm9tICcuLi91dGlsL0NhcnRlc2lhblV0aWxzJztcbmltcG9ydCB7IGlmT3ZlcmZsb3dNYXRjaGVzIH0gZnJvbSAnLi4vdXRpbC9JZk92ZXJmbG93TWF0Y2hlcyc7XG5pbXBvcnQgeyBpc051bU9yU3RyIH0gZnJvbSAnLi4vdXRpbC9EYXRhVXRpbHMnO1xuaW1wb3J0IHsgd2FybiB9IGZyb20gJy4uL3V0aWwvTG9nVXRpbHMnO1xuaW1wb3J0IHsgUmVjdGFuZ2xlIH0gZnJvbSAnLi4vc2hhcGUvUmVjdGFuZ2xlJztcbmltcG9ydCB7IGZpbHRlclByb3BzIH0gZnJvbSAnLi4vdXRpbC9SZWFjdFV0aWxzJztcbnZhciBnZXRSZWN0ID0gZnVuY3Rpb24gZ2V0UmVjdChoYXNYMSwgaGFzWDIsIGhhc1kxLCBoYXNZMiwgcHJvcHMpIHtcbiAgdmFyIHhWYWx1ZTEgPSBwcm9wcy54MSxcbiAgICB4VmFsdWUyID0gcHJvcHMueDIsXG4gICAgeVZhbHVlMSA9IHByb3BzLnkxLFxuICAgIHlWYWx1ZTIgPSBwcm9wcy55MixcbiAgICB4QXhpcyA9IHByb3BzLnhBeGlzLFxuICAgIHlBeGlzID0gcHJvcHMueUF4aXM7XG4gIGlmICgheEF4aXMgfHwgIXlBeGlzKSByZXR1cm4gbnVsbDtcbiAgdmFyIHNjYWxlcyA9IGNyZWF0ZUxhYmVsZWRTY2FsZXMoe1xuICAgIHg6IHhBeGlzLnNjYWxlLFxuICAgIHk6IHlBeGlzLnNjYWxlXG4gIH0pO1xuICB2YXIgcDEgPSB7XG4gICAgeDogaGFzWDEgPyBzY2FsZXMueC5hcHBseSh4VmFsdWUxLCB7XG4gICAgICBwb3NpdGlvbjogJ3N0YXJ0J1xuICAgIH0pIDogc2NhbGVzLngucmFuZ2VNaW4sXG4gICAgeTogaGFzWTEgPyBzY2FsZXMueS5hcHBseSh5VmFsdWUxLCB7XG4gICAgICBwb3NpdGlvbjogJ3N0YXJ0J1xuICAgIH0pIDogc2NhbGVzLnkucmFuZ2VNaW5cbiAgfTtcbiAgdmFyIHAyID0ge1xuICAgIHg6IGhhc1gyID8gc2NhbGVzLnguYXBwbHkoeFZhbHVlMiwge1xuICAgICAgcG9zaXRpb246ICdlbmQnXG4gICAgfSkgOiBzY2FsZXMueC5yYW5nZU1heCxcbiAgICB5OiBoYXNZMiA/IHNjYWxlcy55LmFwcGx5KHlWYWx1ZTIsIHtcbiAgICAgIHBvc2l0aW9uOiAnZW5kJ1xuICAgIH0pIDogc2NhbGVzLnkucmFuZ2VNYXhcbiAgfTtcbiAgaWYgKGlmT3ZlcmZsb3dNYXRjaGVzKHByb3BzLCAnZGlzY2FyZCcpICYmICghc2NhbGVzLmlzSW5SYW5nZShwMSkgfHwgIXNjYWxlcy5pc0luUmFuZ2UocDIpKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiByZWN0V2l0aFBvaW50cyhwMSwgcDIpO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L3ByZWZlci1zdGF0ZWxlc3MtZnVuY3Rpb24gLS0gcmVxdWlyZXMgc3RhdGljIGRlZmF1bHRQcm9wc1xuZXhwb3J0IHZhciBSZWZlcmVuY2VBcmVhID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIFJlZmVyZW5jZUFyZWEoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlZmVyZW5jZUFyZWEpO1xuICAgIHJldHVybiBfY2FsbFN1cGVyKHRoaXMsIFJlZmVyZW5jZUFyZWEsIGFyZ3VtZW50cyk7XG4gIH1cbiAgX2luaGVyaXRzKFJlZmVyZW5jZUFyZWEsIF9SZWFjdCRDb21wb25lbnQpO1xuICByZXR1cm4gX2NyZWF0ZUNsYXNzKFJlZmVyZW5jZUFyZWEsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICB4MSA9IF90aGlzJHByb3BzLngxLFxuICAgICAgICB4MiA9IF90aGlzJHByb3BzLngyLFxuICAgICAgICB5MSA9IF90aGlzJHByb3BzLnkxLFxuICAgICAgICB5MiA9IF90aGlzJHByb3BzLnkyLFxuICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGFsd2F5c1Nob3cgPSBfdGhpcyRwcm9wcy5hbHdheXNTaG93LFxuICAgICAgICBjbGlwUGF0aElkID0gX3RoaXMkcHJvcHMuY2xpcFBhdGhJZDtcbiAgICAgIHdhcm4oYWx3YXlzU2hvdyA9PT0gdW5kZWZpbmVkLCAnVGhlIGFsd2F5c1Nob3cgcHJvcCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGlmT3ZlcmZsb3c9XCJleHRlbmREb21haW5cIiBpbnN0ZWFkLicpO1xuICAgICAgdmFyIGhhc1gxID0gaXNOdW1PclN0cih4MSk7XG4gICAgICB2YXIgaGFzWDIgPSBpc051bU9yU3RyKHgyKTtcbiAgICAgIHZhciBoYXNZMSA9IGlzTnVtT3JTdHIoeTEpO1xuICAgICAgdmFyIGhhc1kyID0gaXNOdW1PclN0cih5Mik7XG4gICAgICB2YXIgc2hhcGUgPSB0aGlzLnByb3BzLnNoYXBlO1xuICAgICAgaWYgKCFoYXNYMSAmJiAhaGFzWDIgJiYgIWhhc1kxICYmICFoYXNZMiAmJiAhc2hhcGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgcmVjdCA9IGdldFJlY3QoaGFzWDEsIGhhc1gyLCBoYXNZMSwgaGFzWTIsIHRoaXMucHJvcHMpO1xuICAgICAgaWYgKCFyZWN0ICYmICFzaGFwZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBjbGlwUGF0aCA9IGlmT3ZlcmZsb3dNYXRjaGVzKHRoaXMucHJvcHMsICdoaWRkZW4nKSA/IFwidXJsKCNcIi5jb25jYXQoY2xpcFBhdGhJZCwgXCIpXCIpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExheWVyLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xzeCgncmVjaGFydHMtcmVmZXJlbmNlLWFyZWEnLCBjbGFzc05hbWUpXG4gICAgICB9LCBSZWZlcmVuY2VBcmVhLnJlbmRlclJlY3Qoc2hhcGUsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgICAgIGNsaXBQYXRoOiBjbGlwUGF0aFxuICAgICAgfSwgZmlsdGVyUHJvcHModGhpcy5wcm9wcywgdHJ1ZSkpLCByZWN0KSksIExhYmVsLnJlbmRlckNhbGxCeVBhcmVudCh0aGlzLnByb3BzLCByZWN0KSk7XG4gICAgfVxuICB9XSk7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5fZGVmaW5lUHJvcGVydHkoUmVmZXJlbmNlQXJlYSwgXCJkaXNwbGF5TmFtZVwiLCAnUmVmZXJlbmNlQXJlYScpO1xuX2RlZmluZVByb3BlcnR5KFJlZmVyZW5jZUFyZWEsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgaXNGcm9udDogZmFsc2UsXG4gIGlmT3ZlcmZsb3c6ICdkaXNjYXJkJyxcbiAgeEF4aXNJZDogMCxcbiAgeUF4aXNJZDogMCxcbiAgcjogMTAsXG4gIGZpbGw6ICcjY2NjJyxcbiAgZmlsbE9wYWNpdHk6IDAuNSxcbiAgc3Ryb2tlOiAnbm9uZScsXG4gIHN0cm9rZVdpZHRoOiAxXG59KTtcbl9kZWZpbmVQcm9wZXJ0eShSZWZlcmVuY2VBcmVhLCBcInJlbmRlclJlY3RcIiwgZnVuY3Rpb24gKG9wdGlvbiwgcHJvcHMpIHtcbiAgdmFyIHJlY3Q7XG4gIGlmICggLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG9wdGlvbikpIHtcbiAgICByZWN0ID0gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChvcHRpb24sIHByb3BzKTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKG9wdGlvbikpIHtcbiAgICByZWN0ID0gb3B0aW9uKHByb3BzKTtcbiAgfSBlbHNlIHtcbiAgICByZWN0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVjdGFuZ2xlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy1yZWZlcmVuY2UtYXJlYS1yZWN0XCJcbiAgICB9KSk7XG4gIH1cbiAgcmV0dXJuIHJlY3Q7XG59KTsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmZ1bmN0aW9uIF90eXBlb2YobykgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9IDogZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87IH0sIF90eXBlb2Yobyk7IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgX3RvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTsgfSB9XG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuZnVuY3Rpb24gX2NhbGxTdXBlcih0LCBvLCBlKSB7IHJldHVybiBvID0gX2dldFByb3RvdHlwZU9mKG8pLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LCBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgPyBSZWZsZWN0LmNvbnN0cnVjdChvLCBlIHx8IFtdLCBfZ2V0UHJvdG90eXBlT2YodCkuY29uc3RydWN0b3IpIDogby5hcHBseSh0LCBlKSk7IH1cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZFwiKTsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyB0cnkgeyB2YXIgdCA9ICFCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IH0gY2F0Y2ggKHQpIHt9IHJldHVybiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IGZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IHJldHVybiAhIXQ7IH0pKCk7IH1cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ViQ2xhc3MsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikgeyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDsgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmICh2b2lkIDAgIT09IGUpIHsgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IFJlZmVyZW5jZSBEb3RcbiAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJ2xvZGFzaC9pc0Z1bmN0aW9uJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb250YWluZXIvTGF5ZXInO1xuaW1wb3J0IHsgRG90IH0gZnJvbSAnLi4vc2hhcGUvRG90JztcbmltcG9ydCB7IExhYmVsIH0gZnJvbSAnLi4vY29tcG9uZW50L0xhYmVsJztcbmltcG9ydCB7IGlzTnVtT3JTdHIgfSBmcm9tICcuLi91dGlsL0RhdGFVdGlscyc7XG5pbXBvcnQgeyBpZk92ZXJmbG93TWF0Y2hlcyB9IGZyb20gJy4uL3V0aWwvSWZPdmVyZmxvd01hdGNoZXMnO1xuaW1wb3J0IHsgY3JlYXRlTGFiZWxlZFNjYWxlcyB9IGZyb20gJy4uL3V0aWwvQ2FydGVzaWFuVXRpbHMnO1xuaW1wb3J0IHsgd2FybiB9IGZyb20gJy4uL3V0aWwvTG9nVXRpbHMnO1xuaW1wb3J0IHsgZmlsdGVyUHJvcHMgfSBmcm9tICcuLi91dGlsL1JlYWN0VXRpbHMnO1xudmFyIGdldENvb3JkaW5hdGUgPSBmdW5jdGlvbiBnZXRDb29yZGluYXRlKHByb3BzKSB7XG4gIHZhciB4ID0gcHJvcHMueCxcbiAgICB5ID0gcHJvcHMueSxcbiAgICB4QXhpcyA9IHByb3BzLnhBeGlzLFxuICAgIHlBeGlzID0gcHJvcHMueUF4aXM7XG4gIHZhciBzY2FsZXMgPSBjcmVhdGVMYWJlbGVkU2NhbGVzKHtcbiAgICB4OiB4QXhpcy5zY2FsZSxcbiAgICB5OiB5QXhpcy5zY2FsZVxuICB9KTtcbiAgdmFyIHJlc3VsdCA9IHNjYWxlcy5hcHBseSh7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0sIHtcbiAgICBiYW5kQXdhcmU6IHRydWVcbiAgfSk7XG4gIGlmIChpZk92ZXJmbG93TWF0Y2hlcyhwcm9wcywgJ2Rpc2NhcmQnKSAmJiAhc2NhbGVzLmlzSW5SYW5nZShyZXN1bHQpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9wcmVmZXItc3RhdGVsZXNzLWZ1bmN0aW9uIC0tIHJlcXVpcmVzIHN0YXRpYyBkZWZhdWx0UHJvcHNcbmV4cG9ydCB2YXIgUmVmZXJlbmNlRG90ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIFJlZmVyZW5jZURvdCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVmZXJlbmNlRG90KTtcbiAgICByZXR1cm4gX2NhbGxTdXBlcih0aGlzLCBSZWZlcmVuY2VEb3QsIGFyZ3VtZW50cyk7XG4gIH1cbiAgX2luaGVyaXRzKFJlZmVyZW5jZURvdCwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHJldHVybiBfY3JlYXRlQ2xhc3MoUmVmZXJlbmNlRG90LCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgeCA9IF90aGlzJHByb3BzLngsXG4gICAgICAgIHkgPSBfdGhpcyRwcm9wcy55LFxuICAgICAgICByID0gX3RoaXMkcHJvcHMucixcbiAgICAgICAgYWx3YXlzU2hvdyA9IF90aGlzJHByb3BzLmFsd2F5c1Nob3csXG4gICAgICAgIGNsaXBQYXRoSWQgPSBfdGhpcyRwcm9wcy5jbGlwUGF0aElkO1xuICAgICAgdmFyIGlzWCA9IGlzTnVtT3JTdHIoeCk7XG4gICAgICB2YXIgaXNZID0gaXNOdW1PclN0cih5KTtcbiAgICAgIHdhcm4oYWx3YXlzU2hvdyA9PT0gdW5kZWZpbmVkLCAnVGhlIGFsd2F5c1Nob3cgcHJvcCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGlmT3ZlcmZsb3c9XCJleHRlbmREb21haW5cIiBpbnN0ZWFkLicpO1xuICAgICAgaWYgKCFpc1ggfHwgIWlzWSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBjb29yZGluYXRlID0gZ2V0Q29vcmRpbmF0ZSh0aGlzLnByb3BzKTtcbiAgICAgIGlmICghY29vcmRpbmF0ZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBjeCA9IGNvb3JkaW5hdGUueCxcbiAgICAgICAgY3kgPSBjb29yZGluYXRlLnk7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgc2hhcGUgPSBfdGhpcyRwcm9wczIuc2hhcGUsXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMi5jbGFzc05hbWU7XG4gICAgICB2YXIgY2xpcFBhdGggPSBpZk92ZXJmbG93TWF0Y2hlcyh0aGlzLnByb3BzLCAnaGlkZGVuJykgPyBcInVybCgjXCIuY29uY2F0KGNsaXBQYXRoSWQsIFwiKVwiKSA6IHVuZGVmaW5lZDtcbiAgICAgIHZhciBkb3RQcm9wcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgICAgIGNsaXBQYXRoOiBjbGlwUGF0aFxuICAgICAgfSwgZmlsdGVyUHJvcHModGhpcy5wcm9wcywgdHJ1ZSkpLCB7fSwge1xuICAgICAgICBjeDogY3gsXG4gICAgICAgIGN5OiBjeVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGF5ZXIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbHN4KCdyZWNoYXJ0cy1yZWZlcmVuY2UtZG90JywgY2xhc3NOYW1lKVxuICAgICAgfSwgUmVmZXJlbmNlRG90LnJlbmRlckRvdChzaGFwZSwgZG90UHJvcHMpLCBMYWJlbC5yZW5kZXJDYWxsQnlQYXJlbnQodGhpcy5wcm9wcywge1xuICAgICAgICB4OiBjeCAtIHIsXG4gICAgICAgIHk6IGN5IC0gcixcbiAgICAgICAgd2lkdGg6IDIgKiByLFxuICAgICAgICBoZWlnaHQ6IDIgKiByXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5fZGVmaW5lUHJvcGVydHkoUmVmZXJlbmNlRG90LCBcImRpc3BsYXlOYW1lXCIsICdSZWZlcmVuY2VEb3QnKTtcbl9kZWZpbmVQcm9wZXJ0eShSZWZlcmVuY2VEb3QsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgaXNGcm9udDogZmFsc2UsXG4gIGlmT3ZlcmZsb3c6ICdkaXNjYXJkJyxcbiAgeEF4aXNJZDogMCxcbiAgeUF4aXNJZDogMCxcbiAgcjogMTAsXG4gIGZpbGw6ICcjZmZmJyxcbiAgc3Ryb2tlOiAnI2NjYycsXG4gIGZpbGxPcGFjaXR5OiAxLFxuICBzdHJva2VXaWR0aDogMVxufSk7XG5fZGVmaW5lUHJvcGVydHkoUmVmZXJlbmNlRG90LCBcInJlbmRlckRvdFwiLCBmdW5jdGlvbiAob3B0aW9uLCBwcm9wcykge1xuICB2YXIgZG90O1xuICBpZiAoIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChvcHRpb24pKSB7XG4gICAgZG90ID0gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChvcHRpb24sIHByb3BzKTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKG9wdGlvbikpIHtcbiAgICBkb3QgPSBvcHRpb24ocHJvcHMpO1xuICB9IGVsc2Uge1xuICAgIGRvdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERvdCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICBjeDogcHJvcHMuY3gsXG4gICAgICBjeTogcHJvcHMuY3ksXG4gICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtcmVmZXJlbmNlLWRvdC1kb3RcIlxuICAgIH0pKTtcbiAgfVxuICByZXR1cm4gZG90O1xufSk7IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgX3RvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTsgfSB9XG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuZnVuY3Rpb24gX2NhbGxTdXBlcih0LCBvLCBlKSB7IHJldHVybiBvID0gX2dldFByb3RvdHlwZU9mKG8pLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LCBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgPyBSZWZsZWN0LmNvbnN0cnVjdChvLCBlIHx8IFtdLCBfZ2V0UHJvdG90eXBlT2YodCkuY29uc3RydWN0b3IpIDogby5hcHBseSh0LCBlKSk7IH1cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZFwiKTsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyB0cnkgeyB2YXIgdCA9ICFCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IH0gY2F0Y2ggKHQpIHt9IHJldHVybiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IGZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IHJldHVybiAhIXQ7IH0pKCk7IH1cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ViQ2xhc3MsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGwpIHsgdmFyIHQgPSBudWxsID09IHIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTsgaWYgKG51bGwgIT0gdCkgeyB2YXIgZSwgbiwgaSwgdSwgYSA9IFtdLCBmID0gITAsIG8gPSAhMTsgdHJ5IHsgaWYgKGkgPSAodCA9IHQuY2FsbChyKSkubmV4dCwgMCA9PT0gbCkgeyBpZiAoT2JqZWN0KHQpICE9PSB0KSByZXR1cm47IGYgPSAhMTsgfSBlbHNlIGZvciAoOyAhKGYgPSAoZSA9IGkuY2FsbCh0KSkuZG9uZSkgJiYgKGEucHVzaChlLnZhbHVlKSwgYS5sZW5ndGggIT09IGwpOyBmID0gITApOyB9IGNhdGNoIChyKSB7IG8gPSAhMCwgbiA9IHI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghZiAmJiBudWxsICE9IHRbXCJyZXR1cm5cIl0gJiYgKHUgPSB0W1wicmV0dXJuXCJdKCksIE9iamVjdCh1KSAhPT0gdSkpIHJldHVybjsgfSBmaW5hbGx5IHsgaWYgKG8pIHRocm93IG47IH0gfSByZXR1cm4gYTsgfSB9XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IFJlZmVyZW5jZSBMaW5lXG4gKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaXNGdW5jdGlvbiBmcm9tICdsb2Rhc2gvaXNGdW5jdGlvbic7XG5pbXBvcnQgc29tZSBmcm9tICdsb2Rhc2gvc29tZSc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi4vY29udGFpbmVyL0xheWVyJztcbmltcG9ydCB7IExhYmVsIH0gZnJvbSAnLi4vY29tcG9uZW50L0xhYmVsJztcbmltcG9ydCB7IGlmT3ZlcmZsb3dNYXRjaGVzIH0gZnJvbSAnLi4vdXRpbC9JZk92ZXJmbG93TWF0Y2hlcyc7XG5pbXBvcnQgeyBpc051bU9yU3RyIH0gZnJvbSAnLi4vdXRpbC9EYXRhVXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlTGFiZWxlZFNjYWxlcywgcmVjdFdpdGhDb29yZHMgfSBmcm9tICcuLi91dGlsL0NhcnRlc2lhblV0aWxzJztcbmltcG9ydCB7IHdhcm4gfSBmcm9tICcuLi91dGlsL0xvZ1V0aWxzJztcbmltcG9ydCB7IGZpbHRlclByb3BzIH0gZnJvbSAnLi4vdXRpbC9SZWFjdFV0aWxzJztcbmltcG9ydCB7IHVzZUNsaXBQYXRoSWQsIHVzZVZpZXdCb3gsIHVzZVhBeGlzT3JUaHJvdywgdXNlWUF4aXNPclRocm93IH0gZnJvbSAnLi4vY29udGV4dC9jaGFydExheW91dENvbnRleHQnO1xuXG4vKipcbiAqIFRoaXMgZXhjbHVkZXMgYHZpZXdCb3hgIHByb3AgZnJvbSBzdmcgZm9yIHR3byByZWFzb25zOlxuICogMS4gVGhlIGNvbXBvbmVudHMgd2FudHMgdmlld0JveCBvZiBvYmplY3QgdHlwZSwgYW5kIHN2ZyB3YW50cyBzdHJpbmdcbiAqICAgIC0gc28gdGhlcmUncyBhIGNvbmZsaWN0LCBhbmQgdGhlIGNvbXBvbmVudCB3aWxsIHRocm93IGlmIGl0IGdldHMgc3RyaW5nXG4gKiAyLiBJbnRlcm5hbGx5IHRoZSBjb21wb25lbnQgY2FsbHMgYGZpbHRlclByb3BzYCB3aGljaCBmaWx0ZXJzIHRoZSB2aWV3Qm94IGF3YXkgYW55d2F5XG4gKi9cblxudmFyIHJlbmRlckxpbmUgPSBmdW5jdGlvbiByZW5kZXJMaW5lKG9wdGlvbiwgcHJvcHMpIHtcbiAgdmFyIGxpbmU7XG4gIGlmICggLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG9wdGlvbikpIHtcbiAgICBsaW5lID0gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChvcHRpb24sIHByb3BzKTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKG9wdGlvbikpIHtcbiAgICBsaW5lID0gb3B0aW9uKHByb3BzKTtcbiAgfSBlbHNlIHtcbiAgICBsaW5lID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaW5lXCIsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLXJlZmVyZW5jZS1saW5lLWxpbmVcIlxuICAgIH0pKTtcbiAgfVxuICByZXR1cm4gbGluZTtcbn07XG4vLyBUT0RPOiBTY2FsZUhlbHBlclxuZXhwb3J0IHZhciBnZXRFbmRQb2ludHMgPSBmdW5jdGlvbiBnZXRFbmRQb2ludHMoc2NhbGVzLCBpc0ZpeGVkWCwgaXNGaXhlZFksIGlzU2VnbWVudCwgdmlld0JveCwgcG9zaXRpb24sIHhBeGlzT3JpZW50YXRpb24sIHlBeGlzT3JpZW50YXRpb24sIHByb3BzKSB7XG4gIHZhciB4ID0gdmlld0JveC54LFxuICAgIHkgPSB2aWV3Qm94LnksXG4gICAgd2lkdGggPSB2aWV3Qm94LndpZHRoLFxuICAgIGhlaWdodCA9IHZpZXdCb3guaGVpZ2h0O1xuICBpZiAoaXNGaXhlZFkpIHtcbiAgICB2YXIgeUNvb3JkID0gcHJvcHMueTtcbiAgICB2YXIgY29vcmQgPSBzY2FsZXMueS5hcHBseSh5Q29vcmQsIHtcbiAgICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICAgIH0pO1xuICAgIGlmIChpZk92ZXJmbG93TWF0Y2hlcyhwcm9wcywgJ2Rpc2NhcmQnKSAmJiAhc2NhbGVzLnkuaXNJblJhbmdlKGNvb3JkKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBwb2ludHMgPSBbe1xuICAgICAgeDogeCArIHdpZHRoLFxuICAgICAgeTogY29vcmRcbiAgICB9LCB7XG4gICAgICB4OiB4LFxuICAgICAgeTogY29vcmRcbiAgICB9XTtcbiAgICByZXR1cm4geUF4aXNPcmllbnRhdGlvbiA9PT0gJ2xlZnQnID8gcG9pbnRzLnJldmVyc2UoKSA6IHBvaW50cztcbiAgfVxuICBpZiAoaXNGaXhlZFgpIHtcbiAgICB2YXIgeENvb3JkID0gcHJvcHMueDtcbiAgICB2YXIgX2Nvb3JkID0gc2NhbGVzLnguYXBwbHkoeENvb3JkLCB7XG4gICAgICBwb3NpdGlvbjogcG9zaXRpb25cbiAgICB9KTtcbiAgICBpZiAoaWZPdmVyZmxvd01hdGNoZXMocHJvcHMsICdkaXNjYXJkJykgJiYgIXNjYWxlcy54LmlzSW5SYW5nZShfY29vcmQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIF9wb2ludHMgPSBbe1xuICAgICAgeDogX2Nvb3JkLFxuICAgICAgeTogeSArIGhlaWdodFxuICAgIH0sIHtcbiAgICAgIHg6IF9jb29yZCxcbiAgICAgIHk6IHlcbiAgICB9XTtcbiAgICByZXR1cm4geEF4aXNPcmllbnRhdGlvbiA9PT0gJ3RvcCcgPyBfcG9pbnRzLnJldmVyc2UoKSA6IF9wb2ludHM7XG4gIH1cbiAgaWYgKGlzU2VnbWVudCkge1xuICAgIHZhciBzZWdtZW50ID0gcHJvcHMuc2VnbWVudDtcbiAgICB2YXIgX3BvaW50czIgPSBzZWdtZW50Lm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgcmV0dXJuIHNjYWxlcy5hcHBseShwLCB7XG4gICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKGlmT3ZlcmZsb3dNYXRjaGVzKHByb3BzLCAnZGlzY2FyZCcpICYmIHNvbWUoX3BvaW50czIsIGZ1bmN0aW9uIChwKSB7XG4gICAgICByZXR1cm4gIXNjYWxlcy5pc0luUmFuZ2UocCk7XG4gICAgfSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gX3BvaW50czI7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuZnVuY3Rpb24gUmVmZXJlbmNlTGluZUltcGwocHJvcHMpIHtcbiAgdmFyIGZpeGVkWCA9IHByb3BzLngsXG4gICAgZml4ZWRZID0gcHJvcHMueSxcbiAgICBzZWdtZW50ID0gcHJvcHMuc2VnbWVudCxcbiAgICB4QXhpc0lkID0gcHJvcHMueEF4aXNJZCxcbiAgICB5QXhpc0lkID0gcHJvcHMueUF4aXNJZCxcbiAgICBzaGFwZSA9IHByb3BzLnNoYXBlLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBhbHdheXNTaG93ID0gcHJvcHMuYWx3YXlzU2hvdztcbiAgdmFyIGNsaXBQYXRoSWQgPSB1c2VDbGlwUGF0aElkKCk7XG4gIHZhciB4QXhpcyA9IHVzZVhBeGlzT3JUaHJvdyh4QXhpc0lkKTtcbiAgdmFyIHlBeGlzID0gdXNlWUF4aXNPclRocm93KHlBeGlzSWQpO1xuICB2YXIgdmlld0JveCA9IHVzZVZpZXdCb3goKTtcbiAgaWYgKCFjbGlwUGF0aElkIHx8ICF2aWV3Qm94KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgd2FybihhbHdheXNTaG93ID09PSB1bmRlZmluZWQsICdUaGUgYWx3YXlzU2hvdyBwcm9wIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgaWZPdmVyZmxvdz1cImV4dGVuZERvbWFpblwiIGluc3RlYWQuJyk7XG4gIHZhciBzY2FsZXMgPSBjcmVhdGVMYWJlbGVkU2NhbGVzKHtcbiAgICB4OiB4QXhpcy5zY2FsZSxcbiAgICB5OiB5QXhpcy5zY2FsZVxuICB9KTtcbiAgdmFyIGlzWCA9IGlzTnVtT3JTdHIoZml4ZWRYKTtcbiAgdmFyIGlzWSA9IGlzTnVtT3JTdHIoZml4ZWRZKTtcbiAgdmFyIGlzU2VnbWVudCA9IHNlZ21lbnQgJiYgc2VnbWVudC5sZW5ndGggPT09IDI7XG4gIHZhciBlbmRQb2ludHMgPSBnZXRFbmRQb2ludHMoc2NhbGVzLCBpc1gsIGlzWSwgaXNTZWdtZW50LCB2aWV3Qm94LCBwcm9wcy5wb3NpdGlvbiwgeEF4aXMub3JpZW50YXRpb24sIHlBeGlzLm9yaWVudGF0aW9uLCBwcm9wcyk7XG4gIGlmICghZW5kUG9pbnRzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIF9lbmRQb2ludHMgPSBfc2xpY2VkVG9BcnJheShlbmRQb2ludHMsIDIpLFxuICAgIF9lbmRQb2ludHMkID0gX2VuZFBvaW50c1swXSxcbiAgICB4MSA9IF9lbmRQb2ludHMkLngsXG4gICAgeTEgPSBfZW5kUG9pbnRzJC55LFxuICAgIF9lbmRQb2ludHMkMiA9IF9lbmRQb2ludHNbMV0sXG4gICAgeDIgPSBfZW5kUG9pbnRzJDIueCxcbiAgICB5MiA9IF9lbmRQb2ludHMkMi55O1xuICB2YXIgY2xpcFBhdGggPSBpZk92ZXJmbG93TWF0Y2hlcyhwcm9wcywgJ2hpZGRlbicpID8gXCJ1cmwoI1wiLmNvbmNhdChjbGlwUGF0aElkLCBcIilcIikgOiB1bmRlZmluZWQ7XG4gIHZhciBsaW5lUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgIGNsaXBQYXRoOiBjbGlwUGF0aFxuICB9LCBmaWx0ZXJQcm9wcyhwcm9wcywgdHJ1ZSkpLCB7fSwge1xuICAgIHgxOiB4MSxcbiAgICB5MTogeTEsXG4gICAgeDI6IHgyLFxuICAgIHkyOiB5MlxuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExheWVyLCB7XG4gICAgY2xhc3NOYW1lOiBjbHN4KCdyZWNoYXJ0cy1yZWZlcmVuY2UtbGluZScsIGNsYXNzTmFtZSlcbiAgfSwgcmVuZGVyTGluZShzaGFwZSwgbGluZVByb3BzKSwgTGFiZWwucmVuZGVyQ2FsbEJ5UGFyZW50KHByb3BzLCByZWN0V2l0aENvb3Jkcyh7XG4gICAgeDE6IHgxLFxuICAgIHkxOiB5MSxcbiAgICB4MjogeDIsXG4gICAgeTI6IHkyXG4gIH0pKSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9wcmVmZXItc3RhdGVsZXNzLWZ1bmN0aW9uIC0tIHJlcXVpcmVzIHN0YXRpYyBkZWZhdWx0UHJvcHNcbmV4cG9ydCB2YXIgUmVmZXJlbmNlTGluZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBmdW5jdGlvbiBSZWZlcmVuY2VMaW5lKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZWZlcmVuY2VMaW5lKTtcbiAgICByZXR1cm4gX2NhbGxTdXBlcih0aGlzLCBSZWZlcmVuY2VMaW5lLCBhcmd1bWVudHMpO1xuICB9XG4gIF9pbmhlcml0cyhSZWZlcmVuY2VMaW5lLCBfUmVhY3QkQ29tcG9uZW50KTtcbiAgcmV0dXJuIF9jcmVhdGVDbGFzcyhSZWZlcmVuY2VMaW5lLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlZmVyZW5jZUxpbmVJbXBsLCB0aGlzLnByb3BzKTtcbiAgICB9XG4gIH1dKTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcbl9kZWZpbmVQcm9wZXJ0eShSZWZlcmVuY2VMaW5lLCBcImRpc3BsYXlOYW1lXCIsICdSZWZlcmVuY2VMaW5lJyk7XG5fZGVmaW5lUHJvcGVydHkoUmVmZXJlbmNlTGluZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBpc0Zyb250OiBmYWxzZSxcbiAgaWZPdmVyZmxvdzogJ2Rpc2NhcmQnLFxuICB4QXhpc0lkOiAwLFxuICB5QXhpc0lkOiAwLFxuICBmaWxsOiAnbm9uZScsXG4gIHN0cm9rZTogJyNjY2MnLFxuICBmaWxsT3BhY2l0eTogMSxcbiAgc3Ryb2tlV2lkdGg6IDEsXG4gIHBvc2l0aW9uOiAnbWlkZGxlJ1xufSk7IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgX3RvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTsgfSB9XG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuZnVuY3Rpb24gX2NhbGxTdXBlcih0LCBvLCBlKSB7IHJldHVybiBvID0gX2dldFByb3RvdHlwZU9mKG8pLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LCBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgPyBSZWZsZWN0LmNvbnN0cnVjdChvLCBlIHx8IFtdLCBfZ2V0UHJvdG90eXBlT2YodCkuY29uc3RydWN0b3IpIDogby5hcHBseSh0LCBlKSk7IH1cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZFwiKTsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyB0cnkgeyB2YXIgdCA9ICFCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IH0gY2F0Y2ggKHQpIHt9IHJldHVybiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IGZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IHJldHVybiAhIXQ7IH0pKCk7IH1cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ViQ2xhc3MsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikgeyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDsgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmICh2b2lkIDAgIT09IGUpIHsgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgWCBBeGlzXG4gKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IHVzZUNoYXJ0SGVpZ2h0LCB1c2VDaGFydFdpZHRoLCB1c2VYQXhpc09yVGhyb3cgfSBmcm9tICcuLi9jb250ZXh0L2NoYXJ0TGF5b3V0Q29udGV4dCc7XG5pbXBvcnQgeyBDYXJ0ZXNpYW5BeGlzIH0gZnJvbSAnLi9DYXJ0ZXNpYW5BeGlzJztcbmltcG9ydCB7IGdldFRpY2tzT2ZBeGlzIH0gZnJvbSAnLi4vdXRpbC9DaGFydFV0aWxzJztcblxuLyoqIERlZmluZSBvZiBYQXhpcyBwcm9wcyAqL1xuXG5mdW5jdGlvbiBYQXhpc0ltcGwoX3JlZikge1xuICB2YXIgeEF4aXNJZCA9IF9yZWYueEF4aXNJZDtcbiAgdmFyIHdpZHRoID0gdXNlQ2hhcnRXaWR0aCgpO1xuICB2YXIgaGVpZ2h0ID0gdXNlQ2hhcnRIZWlnaHQoKTtcbiAgdmFyIGF4aXNPcHRpb25zID0gdXNlWEF4aXNPclRocm93KHhBeGlzSWQpO1xuICBpZiAoYXhpc09wdGlvbnMgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiAoXG4gICAgLyojX19QVVJFX18qL1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdGhlIGF4aXNPcHRpb25zIHR5cGUgaXMgbm90IGV4YWN0bHkgd2hhdCBDYXJ0ZXNpYW5BeGlzIGlzIGV4cGVjdGluZy5cbiAgICBSZWFjdC5jcmVhdGVFbGVtZW50KENhcnRlc2lhbkF4aXMsIF9leHRlbmRzKHt9LCBheGlzT3B0aW9ucywge1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KFwicmVjaGFydHMtXCIuY29uY2F0KGF4aXNPcHRpb25zLmF4aXNUeXBlLCBcIiBcIikuY29uY2F0KGF4aXNPcHRpb25zLmF4aXNUeXBlKSwgYXhpc09wdGlvbnMuY2xhc3NOYW1lKSxcbiAgICAgIHZpZXdCb3g6IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMCxcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgfSxcbiAgICAgIHRpY2tzR2VuZXJhdG9yOiBmdW5jdGlvbiB0aWNrc0dlbmVyYXRvcihheGlzKSB7XG4gICAgICAgIHJldHVybiBnZXRUaWNrc09mQXhpcyhheGlzLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9KSlcbiAgKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L3ByZWZlci1zdGF0ZWxlc3MtZnVuY3Rpb24gLS0gcmVxdWlyZXMgc3RhdGljIGRlZmF1bHRQcm9wc1xuZXhwb3J0IHZhciBYQXhpcyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBmdW5jdGlvbiBYQXhpcygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgWEF4aXMpO1xuICAgIHJldHVybiBfY2FsbFN1cGVyKHRoaXMsIFhBeGlzLCBhcmd1bWVudHMpO1xuICB9XG4gIF9pbmhlcml0cyhYQXhpcywgX1JlYWN0JENvbXBvbmVudCk7XG4gIHJldHVybiBfY3JlYXRlQ2xhc3MoWEF4aXMsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoWEF4aXNJbXBsLCB0aGlzLnByb3BzKTtcbiAgICB9XG4gIH1dKTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcbl9kZWZpbmVQcm9wZXJ0eShYQXhpcywgXCJkaXNwbGF5TmFtZVwiLCAnWEF4aXMnKTtcbl9kZWZpbmVQcm9wZXJ0eShYQXhpcywgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBhbGxvd0RlY2ltYWxzOiB0cnVlLFxuICBoaWRlOiBmYWxzZSxcbiAgb3JpZW50YXRpb246ICdib3R0b20nLFxuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAzMCxcbiAgbWlycm9yOiBmYWxzZSxcbiAgeEF4aXNJZDogMCxcbiAgdGlja0NvdW50OiA1LFxuICB0eXBlOiAnY2F0ZWdvcnknLFxuICBwYWRkaW5nOiB7XG4gICAgbGVmdDogMCxcbiAgICByaWdodDogMFxuICB9LFxuICBhbGxvd0RhdGFPdmVyZmxvdzogZmFsc2UsXG4gIHNjYWxlOiAnYXV0bycsXG4gIHJldmVyc2VkOiBmYWxzZSxcbiAgYWxsb3dEdXBsaWNhdGVkQ2F0ZWdvcnk6IHRydWVcbn0pOyIsImZ1bmN0aW9uIF90eXBlb2YobykgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9IDogZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87IH0sIF90eXBlb2Yobyk7IH1cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIF90b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7IH0gfVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cbmZ1bmN0aW9uIF9jYWxsU3VwZXIodCwgbywgZSkgeyByZXR1cm4gbyA9IF9nZXRQcm90b3R5cGVPZihvKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odCwgX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpID8gUmVmbGVjdC5jb25zdHJ1Y3QobywgZSB8fCBbXSwgX2dldFByb3RvdHlwZU9mKHQpLmNvbnN0cnVjdG9yKSA6IG8uYXBwbHkodCwgZSkpOyB9XG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWRcIik7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgdHJ5IHsgdmFyIHQgPSAhQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyB9IGNhdGNoICh0KSB7fSByZXR1cm4gKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyByZXR1cm4gISF0OyB9KSgpOyB9XG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN1YkNsYXNzLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IFkgQXhpc1xuICovXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyB1c2VDaGFydEhlaWdodCwgdXNlQ2hhcnRXaWR0aCwgdXNlWUF4aXNPclRocm93IH0gZnJvbSAnLi4vY29udGV4dC9jaGFydExheW91dENvbnRleHQnO1xuaW1wb3J0IHsgQ2FydGVzaWFuQXhpcyB9IGZyb20gJy4vQ2FydGVzaWFuQXhpcyc7XG5pbXBvcnQgeyBnZXRUaWNrc09mQXhpcyB9IGZyb20gJy4uL3V0aWwvQ2hhcnRVdGlscyc7XG52YXIgWUF4aXNJbXBsID0gZnVuY3Rpb24gWUF4aXNJbXBsKF9yZWYpIHtcbiAgdmFyIHlBeGlzSWQgPSBfcmVmLnlBeGlzSWQ7XG4gIHZhciB3aWR0aCA9IHVzZUNoYXJ0V2lkdGgoKTtcbiAgdmFyIGhlaWdodCA9IHVzZUNoYXJ0SGVpZ2h0KCk7XG4gIHZhciBheGlzT3B0aW9ucyA9IHVzZVlBeGlzT3JUaHJvdyh5QXhpc0lkKTtcbiAgaWYgKGF4aXNPcHRpb25zID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gKFxuICAgIC8qI19fUFVSRV9fKi9cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoZSBheGlzT3B0aW9ucyB0eXBlIGlzIG5vdCBleGFjdGx5IHdoYXQgQ2FydGVzaWFuQXhpcyBpcyBleHBlY3RpbmcuXG4gICAgUmVhY3QuY3JlYXRlRWxlbWVudChDYXJ0ZXNpYW5BeGlzLCBfZXh0ZW5kcyh7fSwgYXhpc09wdGlvbnMsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xzeChcInJlY2hhcnRzLVwiLmNvbmNhdChheGlzT3B0aW9ucy5heGlzVHlwZSwgXCIgXCIpLmNvbmNhdChheGlzT3B0aW9ucy5heGlzVHlwZSksIGF4aXNPcHRpb25zLmNsYXNzTmFtZSksXG4gICAgICB2aWV3Qm94OiB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgIH0sXG4gICAgICB0aWNrc0dlbmVyYXRvcjogZnVuY3Rpb24gdGlja3NHZW5lcmF0b3IoYXhpcykge1xuICAgICAgICByZXR1cm4gZ2V0VGlja3NPZkF4aXMoYXhpcywgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSkpXG4gICk7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvcHJlZmVyLXN0YXRlbGVzcy1mdW5jdGlvbiAtLSByZXF1aXJlcyBzdGF0aWMgZGVmYXVsdFByb3BzXG5leHBvcnQgdmFyIFlBeGlzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIFlBeGlzKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBZQXhpcyk7XG4gICAgcmV0dXJuIF9jYWxsU3VwZXIodGhpcywgWUF4aXMsIGFyZ3VtZW50cyk7XG4gIH1cbiAgX2luaGVyaXRzKFlBeGlzLCBfUmVhY3QkQ29tcG9uZW50KTtcbiAgcmV0dXJuIF9jcmVhdGVDbGFzcyhZQXhpcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChZQXhpc0ltcGwsIHRoaXMucHJvcHMpO1xuICAgIH1cbiAgfV0pO1xufShSZWFjdC5Db21wb25lbnQpO1xuX2RlZmluZVByb3BlcnR5KFlBeGlzLCBcImRpc3BsYXlOYW1lXCIsICdZQXhpcycpO1xuX2RlZmluZVByb3BlcnR5KFlBeGlzLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIGFsbG93RHVwbGljYXRlZENhdGVnb3J5OiB0cnVlLFxuICBhbGxvd0RlY2ltYWxzOiB0cnVlLFxuICBoaWRlOiBmYWxzZSxcbiAgb3JpZW50YXRpb246ICdsZWZ0JyxcbiAgd2lkdGg6IDYwLFxuICBoZWlnaHQ6IDAsXG4gIG1pcnJvcjogZmFsc2UsXG4gIHlBeGlzSWQ6IDAsXG4gIHRpY2tDb3VudDogNSxcbiAgdHlwZTogJ251bWJlcicsXG4gIHBhZGRpbmc6IHtcbiAgICB0b3A6IDAsXG4gICAgYm90dG9tOiAwXG4gIH0sXG4gIGFsbG93RGF0YU92ZXJmbG93OiBmYWxzZSxcbiAgc2NhbGU6ICdhdXRvJyxcbiAgcmV2ZXJzZWQ6IGZhbHNlXG59KTsiLCJpbXBvcnQgeyBpc1Zpc2libGUgfSBmcm9tICcuLi91dGlsL1RpY2tVdGlscyc7XG5pbXBvcnQgeyBnZXRFdmVyeU50aFdpdGhDb25kaXRpb24gfSBmcm9tICcuLi91dGlsL2dldEV2ZXJ5TnRoV2l0aENvbmRpdGlvbic7XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXF1aWRpc3RhbnRUaWNrcyhzaWduLCBib3VuZGFyaWVzLCBnZXRUaWNrU2l6ZSwgdGlja3MsIG1pblRpY2tHYXApIHtcbiAgdmFyIHJlc3VsdCA9ICh0aWNrcyB8fCBbXSkuc2xpY2UoKTtcbiAgdmFyIGluaXRpYWxTdGFydCA9IGJvdW5kYXJpZXMuc3RhcnQsXG4gICAgZW5kID0gYm91bmRhcmllcy5lbmQ7XG4gIHZhciBpbmRleCA9IDA7XG4gIC8vIFByZW1hdHVyZSBvcHRpbWlzYXRpb24gaWRlYSAxOiBFc3RpbWF0ZSBhIGxvd2VyIGJvdW5kLCBhbmQgc3RhcnQgZnJvbSB0aGVyZS5cbiAgLy8gRm9yIG5vdywgc3RhcnQgZnJvbSBldmVyeSB0aWNrXG4gIHZhciBzdGVwc2l6ZSA9IDE7XG4gIHZhciBzdGFydCA9IGluaXRpYWxTdGFydDtcbiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAvLyBHaXZlbiBzdGVwc2l6ZSwgZXZhbHVhdGUgd2hldGhlciBldmVyeSBzdGVwc2l6ZS10aCB0aWNrIGNhbiBiZSBzaG93bi5cbiAgICAgIC8vIElmIGl0IGNhbiBub3QsIHRoZW4gaW5jcmVhc2UgdGhlIHN0ZXBzaXplIGJ5IDEsIGFuZCB0cnkgYWdhaW4uXG5cbiAgICAgIHZhciBlbnRyeSA9IHRpY2tzID09PSBudWxsIHx8IHRpY2tzID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0aWNrc1tpbmRleF07XG5cbiAgICAgIC8vIEJyZWFrIGNvbmRpdGlvbiAtIElmIHdlIGhhdmUgZXZhbHVhdGUgYWxsIHRoZSB0aWNrcywgdGhlbiB3ZSBhcmUgZG9uZS5cbiAgICAgIGlmIChlbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdjogZ2V0RXZlcnlOdGhXaXRoQ29uZGl0aW9uKHRpY2tzLCBzdGVwc2l6ZSlcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVsZW1lbnQgY29sbGlkZXMgd2l0aCB0aGUgbmV4dCBlbGVtZW50XG4gICAgICB2YXIgaSA9IGluZGV4O1xuICAgICAgdmFyIHNpemU7XG4gICAgICB2YXIgZ2V0U2l6ZSA9IGZ1bmN0aW9uIGdldFNpemUoKSB7XG4gICAgICAgIGlmIChzaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzaXplID0gZ2V0VGlja1NpemUoZW50cnksIGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgICAgfTtcbiAgICAgIHZhciB0aWNrQ29vcmQgPSBlbnRyeS5jb29yZGluYXRlO1xuICAgICAgLy8gV2Ugd2lsbCBhbHdheXMgc2hvdyB0aGUgZmlyc3QgdGljay5cbiAgICAgIHZhciBpc1Nob3cgPSBpbmRleCA9PT0gMCB8fCBpc1Zpc2libGUoc2lnbiwgdGlja0Nvb3JkLCBnZXRTaXplLCBzdGFydCwgZW5kKTtcbiAgICAgIGlmICghaXNTaG93KSB7XG4gICAgICAgIC8vIFN0YXJ0IGFsbCBvdmVyIHdpdGggYSBsYXJnZXIgc3RlcHNpemVcbiAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICBzdGFydCA9IGluaXRpYWxTdGFydDtcbiAgICAgICAgc3RlcHNpemUgKz0gMTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1Nob3cpIHtcbiAgICAgICAgLy8gSWYgaXQgY2FuIGJlIHNob3duLCB1cGRhdGUgdGhlIHN0YXJ0XG4gICAgICAgIHN0YXJ0ID0gdGlja0Nvb3JkICsgc2lnbiAqIChnZXRTaXplKCkgLyAyICsgbWluVGlja0dhcCk7XG4gICAgICAgIGluZGV4ICs9IHN0ZXBzaXplO1xuICAgICAgfVxuICAgIH0sXG4gICAgX3JldDtcbiAgd2hpbGUgKHN0ZXBzaXplIDw9IHJlc3VsdC5sZW5ndGgpIHtcbiAgICBfcmV0ID0gX2xvb3AoKTtcbiAgICBpZiAoX3JldCkgcmV0dXJuIF9yZXQudjtcbiAgfVxuICByZXR1cm4gW107XG59IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbmltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJ2xvZGFzaC9pc0Z1bmN0aW9uJztcbmltcG9ydCB7IG1hdGhTaWduLCBpc051bWJlciB9IGZyb20gJy4uL3V0aWwvRGF0YVV0aWxzJztcbmltcG9ydCB7IGdldFN0cmluZ1NpemUgfSBmcm9tICcuLi91dGlsL0RPTVV0aWxzJztcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gJy4uL3V0aWwvR2xvYmFsJztcbmltcG9ydCB7IGlzVmlzaWJsZSwgZ2V0VGlja0JvdW5kYXJpZXMsIGdldE51bWJlckludGVydmFsVGlja3MsIGdldEFuZ2xlZFRpY2tXaWR0aCB9IGZyb20gJy4uL3V0aWwvVGlja1V0aWxzJztcbmltcG9ydCB7IGdldEVxdWlkaXN0YW50VGlja3MgfSBmcm9tICcuL2dldEVxdWlkaXN0YW50VGlja3MnO1xuZnVuY3Rpb24gZ2V0VGlja3NFbmQoc2lnbiwgYm91bmRhcmllcywgZ2V0VGlja1NpemUsIHRpY2tzLCBtaW5UaWNrR2FwKSB7XG4gIHZhciByZXN1bHQgPSAodGlja3MgfHwgW10pLnNsaWNlKCk7XG4gIHZhciBsZW4gPSByZXN1bHQubGVuZ3RoO1xuICB2YXIgc3RhcnQgPSBib3VuZGFyaWVzLnN0YXJ0O1xuICB2YXIgZW5kID0gYm91bmRhcmllcy5lbmQ7XG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGkpIHtcbiAgICB2YXIgZW50cnkgPSByZXN1bHRbaV07XG4gICAgdmFyIHNpemU7XG4gICAgdmFyIGdldFNpemUgPSBmdW5jdGlvbiBnZXRTaXplKCkge1xuICAgICAgaWYgKHNpemUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzaXplID0gZ2V0VGlja1NpemUoZW50cnksIGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNpemU7XG4gICAgfTtcbiAgICBpZiAoaSA9PT0gbGVuIC0gMSkge1xuICAgICAgdmFyIGdhcCA9IHNpZ24gKiAoZW50cnkuY29vcmRpbmF0ZSArIHNpZ24gKiBnZXRTaXplKCkgLyAyIC0gZW5kKTtcbiAgICAgIHJlc3VsdFtpXSA9IGVudHJ5ID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBlbnRyeSksIHt9LCB7XG4gICAgICAgIHRpY2tDb29yZDogZ2FwID4gMCA/IGVudHJ5LmNvb3JkaW5hdGUgLSBnYXAgKiBzaWduIDogZW50cnkuY29vcmRpbmF0ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtpXSA9IGVudHJ5ID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBlbnRyeSksIHt9LCB7XG4gICAgICAgIHRpY2tDb29yZDogZW50cnkuY29vcmRpbmF0ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBpc1Nob3cgPSBpc1Zpc2libGUoc2lnbiwgZW50cnkudGlja0Nvb3JkLCBnZXRTaXplLCBzdGFydCwgZW5kKTtcbiAgICBpZiAoaXNTaG93KSB7XG4gICAgICBlbmQgPSBlbnRyeS50aWNrQ29vcmQgLSBzaWduICogKGdldFNpemUoKSAvIDIgKyBtaW5UaWNrR2FwKTtcbiAgICAgIHJlc3VsdFtpXSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZW50cnkpLCB7fSwge1xuICAgICAgICBpc1Nob3c6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgZm9yICh2YXIgaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgX2xvb3AoaSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldFRpY2tzU3RhcnQoc2lnbiwgYm91bmRhcmllcywgZ2V0VGlja1NpemUsIHRpY2tzLCBtaW5UaWNrR2FwLCBwcmVzZXJ2ZUVuZCkge1xuICB2YXIgcmVzdWx0ID0gKHRpY2tzIHx8IFtdKS5zbGljZSgpO1xuICB2YXIgbGVuID0gcmVzdWx0Lmxlbmd0aDtcbiAgdmFyIHN0YXJ0ID0gYm91bmRhcmllcy5zdGFydCxcbiAgICBlbmQgPSBib3VuZGFyaWVzLmVuZDtcbiAgaWYgKHByZXNlcnZlRW5kKSB7XG4gICAgLy8gVHJ5IHRvIGd1YXJhbnRlZSB0aGUgdGFpbCB0byBiZSBkaXNwbGF5ZWRcbiAgICB2YXIgdGFpbCA9IHRpY2tzW2xlbiAtIDFdO1xuICAgIHZhciB0YWlsU2l6ZSA9IGdldFRpY2tTaXplKHRhaWwsIGxlbiAtIDEpO1xuICAgIHZhciB0YWlsR2FwID0gc2lnbiAqICh0YWlsLmNvb3JkaW5hdGUgKyBzaWduICogdGFpbFNpemUgLyAyIC0gZW5kKTtcbiAgICByZXN1bHRbbGVuIC0gMV0gPSB0YWlsID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0YWlsKSwge30sIHtcbiAgICAgIHRpY2tDb29yZDogdGFpbEdhcCA+IDAgPyB0YWlsLmNvb3JkaW5hdGUgLSB0YWlsR2FwICogc2lnbiA6IHRhaWwuY29vcmRpbmF0ZVxuICAgIH0pO1xuICAgIHZhciBpc1RhaWxTaG93ID0gaXNWaXNpYmxlKHNpZ24sIHRhaWwudGlja0Nvb3JkLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGFpbFNpemU7XG4gICAgfSwgc3RhcnQsIGVuZCk7XG4gICAgaWYgKGlzVGFpbFNob3cpIHtcbiAgICAgIGVuZCA9IHRhaWwudGlja0Nvb3JkIC0gc2lnbiAqICh0YWlsU2l6ZSAvIDIgKyBtaW5UaWNrR2FwKTtcbiAgICAgIHJlc3VsdFtsZW4gLSAxXSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGFpbCksIHt9LCB7XG4gICAgICAgIGlzU2hvdzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHZhciBjb3VudCA9IHByZXNlcnZlRW5kID8gbGVuIC0gMSA6IGxlbjtcbiAgdmFyIF9sb29wMiA9IGZ1bmN0aW9uIF9sb29wMihpKSB7XG4gICAgdmFyIGVudHJ5ID0gcmVzdWx0W2ldO1xuICAgIHZhciBzaXplO1xuICAgIHZhciBnZXRTaXplID0gZnVuY3Rpb24gZ2V0U2l6ZSgpIHtcbiAgICAgIGlmIChzaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2l6ZSA9IGdldFRpY2tTaXplKGVudHJ5LCBpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzaXplO1xuICAgIH07XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIHZhciBnYXAgPSBzaWduICogKGVudHJ5LmNvb3JkaW5hdGUgLSBzaWduICogZ2V0U2l6ZSgpIC8gMiAtIHN0YXJ0KTtcbiAgICAgIHJlc3VsdFtpXSA9IGVudHJ5ID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBlbnRyeSksIHt9LCB7XG4gICAgICAgIHRpY2tDb29yZDogZ2FwIDwgMCA/IGVudHJ5LmNvb3JkaW5hdGUgLSBnYXAgKiBzaWduIDogZW50cnkuY29vcmRpbmF0ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtpXSA9IGVudHJ5ID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBlbnRyeSksIHt9LCB7XG4gICAgICAgIHRpY2tDb29yZDogZW50cnkuY29vcmRpbmF0ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBpc1Nob3cgPSBpc1Zpc2libGUoc2lnbiwgZW50cnkudGlja0Nvb3JkLCBnZXRTaXplLCBzdGFydCwgZW5kKTtcbiAgICBpZiAoaXNTaG93KSB7XG4gICAgICBzdGFydCA9IGVudHJ5LnRpY2tDb29yZCArIHNpZ24gKiAoZ2V0U2l6ZSgpIC8gMiArIG1pblRpY2tHYXApO1xuICAgICAgcmVzdWx0W2ldID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBlbnRyeSksIHt9LCB7XG4gICAgICAgIGlzU2hvdzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBfbG9vcDIoaSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaWNrcyhwcm9wcywgZm9udFNpemUsIGxldHRlclNwYWNpbmcpIHtcbiAgdmFyIHRpY2sgPSBwcm9wcy50aWNrLFxuICAgIHRpY2tzID0gcHJvcHMudGlja3MsXG4gICAgdmlld0JveCA9IHByb3BzLnZpZXdCb3gsXG4gICAgbWluVGlja0dhcCA9IHByb3BzLm1pblRpY2tHYXAsXG4gICAgb3JpZW50YXRpb24gPSBwcm9wcy5vcmllbnRhdGlvbixcbiAgICBpbnRlcnZhbCA9IHByb3BzLmludGVydmFsLFxuICAgIHRpY2tGb3JtYXR0ZXIgPSBwcm9wcy50aWNrRm9ybWF0dGVyLFxuICAgIHVuaXQgPSBwcm9wcy51bml0LFxuICAgIGFuZ2xlID0gcHJvcHMuYW5nbGU7XG4gIGlmICghdGlja3MgfHwgIXRpY2tzLmxlbmd0aCB8fCAhdGljaykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAoaXNOdW1iZXIoaW50ZXJ2YWwpIHx8IEdsb2JhbC5pc1Nzcikge1xuICAgIHJldHVybiBnZXROdW1iZXJJbnRlcnZhbFRpY2tzKHRpY2tzLCB0eXBlb2YgaW50ZXJ2YWwgPT09ICdudW1iZXInICYmIGlzTnVtYmVyKGludGVydmFsKSA/IGludGVydmFsIDogMCk7XG4gIH1cbiAgdmFyIGNhbmRpZGF0ZXMgPSBbXTtcbiAgdmFyIHNpemVLZXkgPSBvcmllbnRhdGlvbiA9PT0gJ3RvcCcgfHwgb3JpZW50YXRpb24gPT09ICdib3R0b20nID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICB2YXIgdW5pdFNpemUgPSB1bml0ICYmIHNpemVLZXkgPT09ICd3aWR0aCcgPyBnZXRTdHJpbmdTaXplKHVuaXQsIHtcbiAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgbGV0dGVyU3BhY2luZzogbGV0dGVyU3BhY2luZ1xuICB9KSA6IHtcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDBcbiAgfTtcbiAgdmFyIGdldFRpY2tTaXplID0gZnVuY3Rpb24gZ2V0VGlja1NpemUoY29udGVudCwgaW5kZXgpIHtcbiAgICB2YXIgdmFsdWUgPSBpc0Z1bmN0aW9uKHRpY2tGb3JtYXR0ZXIpID8gdGlja0Zvcm1hdHRlcihjb250ZW50LnZhbHVlLCBpbmRleCkgOiBjb250ZW50LnZhbHVlO1xuICAgIC8vIFJlY2hhcnRzIG9ubHkgc3VwcG9ydHMgYW5nbGVzIHdoZW4gc2l6ZUtleSA9PT0gJ3dpZHRoJ1xuICAgIHJldHVybiBzaXplS2V5ID09PSAnd2lkdGgnID8gZ2V0QW5nbGVkVGlja1dpZHRoKGdldFN0cmluZ1NpemUodmFsdWUsIHtcbiAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgIGxldHRlclNwYWNpbmc6IGxldHRlclNwYWNpbmdcbiAgICB9KSwgdW5pdFNpemUsIGFuZ2xlKSA6IGdldFN0cmluZ1NpemUodmFsdWUsIHtcbiAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgIGxldHRlclNwYWNpbmc6IGxldHRlclNwYWNpbmdcbiAgICB9KVtzaXplS2V5XTtcbiAgfTtcbiAgdmFyIHNpZ24gPSB0aWNrcy5sZW5ndGggPj0gMiA/IG1hdGhTaWduKHRpY2tzWzFdLmNvb3JkaW5hdGUgLSB0aWNrc1swXS5jb29yZGluYXRlKSA6IDE7XG4gIHZhciBib3VuZGFyaWVzID0gZ2V0VGlja0JvdW5kYXJpZXModmlld0JveCwgc2lnbiwgc2l6ZUtleSk7XG4gIGlmIChpbnRlcnZhbCA9PT0gJ2VxdWlkaXN0YW50UHJlc2VydmVTdGFydCcpIHtcbiAgICByZXR1cm4gZ2V0RXF1aWRpc3RhbnRUaWNrcyhzaWduLCBib3VuZGFyaWVzLCBnZXRUaWNrU2l6ZSwgdGlja3MsIG1pblRpY2tHYXApO1xuICB9XG4gIGlmIChpbnRlcnZhbCA9PT0gJ3ByZXNlcnZlU3RhcnQnIHx8IGludGVydmFsID09PSAncHJlc2VydmVTdGFydEVuZCcpIHtcbiAgICBjYW5kaWRhdGVzID0gZ2V0VGlja3NTdGFydChzaWduLCBib3VuZGFyaWVzLCBnZXRUaWNrU2l6ZSwgdGlja3MsIG1pblRpY2tHYXAsIGludGVydmFsID09PSAncHJlc2VydmVTdGFydEVuZCcpO1xuICB9IGVsc2Uge1xuICAgIGNhbmRpZGF0ZXMgPSBnZXRUaWNrc0VuZChzaWduLCBib3VuZGFyaWVzLCBnZXRUaWNrU2l6ZSwgdGlja3MsIG1pblRpY2tHYXApO1xuICB9XG4gIHJldHVybiBjYW5kaWRhdGVzLmZpbHRlcihmdW5jdGlvbiAoZW50cnkpIHtcbiAgICByZXR1cm4gZW50cnkuaXNTaG93O1xuICB9KTtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=