"use strict"; (self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_recharts_es6_util_BarUtils_js-node_modules_recharts_es6_util_CssPrefixUt-0883c9"],{ /***/ "../../../node_modules/recharts/es6/util/ActiveShapeUtils.js": /*!*******************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/ActiveShapeUtils.js ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Shape: () => (/* binding */ Shape), /* harmony export */ compareFunnel: () => (/* binding */ compareFunnel), /* harmony export */ comparePie: () => (/* binding */ comparePie), /* harmony export */ compareScatter: () => (/* binding */ compareScatter), /* harmony export */ getActiveShapeIndexForTooltip: () => (/* binding */ getActiveShapeIndexForTooltip), /* harmony export */ getPropsFromShapeOption: () => (/* binding */ getPropsFromShapeOption), /* harmony export */ isFunnel: () => (/* binding */ isFunnel), /* harmony export */ isPie: () => (/* binding */ isPie), /* harmony export */ isScatter: () => (/* binding */ isScatter) /* 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_isPlainObject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/isPlainObject */ "../../../node_modules/lodash/isPlainObject.js"); /* harmony import */ var lodash_isPlainObject__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_isPlainObject__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var lodash_isBoolean__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash/isBoolean */ "../../../node_modules/lodash/isBoolean.js"); /* harmony import */ var lodash_isBoolean__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_isBoolean__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var lodash_isEqual__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash/isEqual */ "../../../node_modules/lodash/isEqual.js"); /* harmony import */ var lodash_isEqual__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(lodash_isEqual__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _shape_Rectangle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../shape/Rectangle */ "../../../node_modules/recharts/es6/shape/Rectangle.js"); /* harmony import */ var _shape_Trapezoid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../shape/Trapezoid */ "../../../node_modules/recharts/es6/shape/Trapezoid.js"); /* harmony import */ var _shape_Sector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../shape/Sector */ "../../../node_modules/recharts/es6/shape/Sector.js"); /* harmony import */ var _container_Layer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../container/Layer */ "../../../node_modules/recharts/es6/container/Layer.js"); /* harmony import */ var _shape_Symbols__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../shape/Symbols */ "../../../node_modules/recharts/es6/shape/Symbols.js"); var _excluded = ["option", "shapeType", "propTransformer", "activeClassName", "isActive"]; 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 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); } /** * This is an abstraction for rendering a user defined prop for a customized shape in several forms. * * is the root and will handle taking in: * - an object of svg properties * - a boolean * - a render prop(inline function that returns jsx) * - a react element * * is a subcomponent of and used to match a component * to the value of props.shapeType that is passed to the root. * */ function defaultPropTransformer(option, props) { return _objectSpread(_objectSpread({}, props), option); } function isSymbolsProps(shapeType, _elementProps) { return shapeType === 'symbols'; } function ShapeSelector(_ref) { var shapeType = _ref.shapeType, elementProps = _ref.elementProps; switch (shapeType) { case 'rectangle': return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_shape_Rectangle__WEBPACK_IMPORTED_MODULE_5__.Rectangle, elementProps); case 'trapezoid': return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_shape_Trapezoid__WEBPACK_IMPORTED_MODULE_6__.Trapezoid, elementProps); case 'sector': return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_shape_Sector__WEBPACK_IMPORTED_MODULE_7__.Sector, elementProps); case 'symbols': if (isSymbolsProps(shapeType, elementProps)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_shape_Symbols__WEBPACK_IMPORTED_MODULE_8__.Symbols, elementProps); } break; default: return null; } } function getPropsFromShapeOption(option) { if ( /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(option)) { return option.props; } return option; } function Shape(_ref2) { var option = _ref2.option, shapeType = _ref2.shapeType, _ref2$propTransformer = _ref2.propTransformer, propTransformer = _ref2$propTransformer === void 0 ? defaultPropTransformer : _ref2$propTransformer, _ref2$activeClassName = _ref2.activeClassName, activeClassName = _ref2$activeClassName === void 0 ? 'recharts-active-shape' : _ref2$activeClassName, isActive = _ref2.isActive, props = _objectWithoutProperties(_ref2, _excluded); var shape; if ( /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(option)) { shape = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.cloneElement)(option, _objectSpread(_objectSpread({}, props), getPropsFromShapeOption(option))); } else if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default()(option)) { shape = option(props); } else if (lodash_isPlainObject__WEBPACK_IMPORTED_MODULE_2___default()(option) && !lodash_isBoolean__WEBPACK_IMPORTED_MODULE_3___default()(option)) { var nextProps = propTransformer(option, props); shape = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ShapeSelector, { shapeType: shapeType, elementProps: nextProps }); } else { var elementProps = props; shape = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ShapeSelector, { shapeType: shapeType, elementProps: elementProps }); } if (isActive) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_9__.Layer, { className: activeClassName }, shape); } return shape; } /** * This is an abstraction to handle identifying the active index from a tooltip mouse interaction */ function isFunnel(graphicalItem, _item) { return _item != null && 'trapezoids' in graphicalItem.props; } function isPie(graphicalItem, _item) { return _item != null && 'sectors' in graphicalItem.props; } function isScatter(graphicalItem, _item) { return _item != null && 'points' in graphicalItem.props; } function compareFunnel(shapeData, activeTooltipItem) { var _activeTooltipItem$la, _activeTooltipItem$la2; var xMatches = shapeData.x === (activeTooltipItem === null || activeTooltipItem === void 0 || (_activeTooltipItem$la = activeTooltipItem.labelViewBox) === null || _activeTooltipItem$la === void 0 ? void 0 : _activeTooltipItem$la.x) || shapeData.x === activeTooltipItem.x; var yMatches = shapeData.y === (activeTooltipItem === null || activeTooltipItem === void 0 || (_activeTooltipItem$la2 = activeTooltipItem.labelViewBox) === null || _activeTooltipItem$la2 === void 0 ? void 0 : _activeTooltipItem$la2.y) || shapeData.y === activeTooltipItem.y; return xMatches && yMatches; } function comparePie(shapeData, activeTooltipItem) { var startAngleMatches = shapeData.endAngle === activeTooltipItem.endAngle; var endAngleMatches = shapeData.startAngle === activeTooltipItem.startAngle; return startAngleMatches && endAngleMatches; } function compareScatter(shapeData, activeTooltipItem) { var xMatches = shapeData.x === activeTooltipItem.x; var yMatches = shapeData.y === activeTooltipItem.y; var zMatches = shapeData.z === activeTooltipItem.z; return xMatches && yMatches && zMatches; } function getComparisonFn(graphicalItem, activeItem) { var comparison; if (isFunnel(graphicalItem, activeItem)) { comparison = compareFunnel; } else if (isPie(graphicalItem, activeItem)) { comparison = comparePie; } else if (isScatter(graphicalItem, activeItem)) { comparison = compareScatter; } return comparison; } function getShapeDataKey(graphicalItem, activeItem) { var shapeKey; if (isFunnel(graphicalItem, activeItem)) { shapeKey = 'trapezoids'; } else if (isPie(graphicalItem, activeItem)) { shapeKey = 'sectors'; } else if (isScatter(graphicalItem, activeItem)) { shapeKey = 'points'; } return shapeKey; } function getActiveShapeTooltipPayload(graphicalItem, activeItem) { if (isFunnel(graphicalItem, activeItem)) { var _activeItem$tooltipPa; return (_activeItem$tooltipPa = activeItem.tooltipPayload) === null || _activeItem$tooltipPa === void 0 || (_activeItem$tooltipPa = _activeItem$tooltipPa[0]) === null || _activeItem$tooltipPa === void 0 || (_activeItem$tooltipPa = _activeItem$tooltipPa.payload) === null || _activeItem$tooltipPa === void 0 ? void 0 : _activeItem$tooltipPa.payload; } if (isPie(graphicalItem, activeItem)) { var _activeItem$tooltipPa2; return (_activeItem$tooltipPa2 = activeItem.tooltipPayload) === null || _activeItem$tooltipPa2 === void 0 || (_activeItem$tooltipPa2 = _activeItem$tooltipPa2[0]) === null || _activeItem$tooltipPa2 === void 0 || (_activeItem$tooltipPa2 = _activeItem$tooltipPa2.payload) === null || _activeItem$tooltipPa2 === void 0 ? void 0 : _activeItem$tooltipPa2.payload; } if (isScatter(graphicalItem, activeItem)) { return activeItem.payload; } return {}; } /** * * @param {GetActiveShapeIndexForTooltip} arg an object of incoming attributes from Tooltip * @returns {number} * * To handle possible duplicates in the data set, * match both the data value of the active item to a data value on a graph item, * and match the mouse coordinates of the active item to the coordinates of in a particular components shape data. * This assumes equal lengths of shape objects to data items. */ function getActiveShapeIndexForTooltip(_ref3) { var activeTooltipItem = _ref3.activeTooltipItem, graphicalItem = _ref3.graphicalItem, itemData = _ref3.itemData; var shapeKey = getShapeDataKey(graphicalItem, activeTooltipItem); var tooltipPayload = getActiveShapeTooltipPayload(graphicalItem, activeTooltipItem); var activeItemMatches = itemData.filter(function (datum, dataIndex) { var valuesMatch = lodash_isEqual__WEBPACK_IMPORTED_MODULE_4___default()(tooltipPayload, datum); var mouseCoordinateMatches = graphicalItem.props[shapeKey].filter(function (shapeData) { var comparison = getComparisonFn(graphicalItem, activeTooltipItem); return comparison(shapeData, activeTooltipItem); }); // get the last index in case of multiple matches var indexOfMouseCoordinates = graphicalItem.props[shapeKey].indexOf(mouseCoordinateMatches[mouseCoordinateMatches.length - 1]); var coordinatesMatch = dataIndex === indexOfMouseCoordinates; return valuesMatch && coordinatesMatch; }); // get the last index in case of multiple matches var activeIndex = itemData.indexOf(activeItemMatches[activeItemMatches.length - 1]); return activeIndex; } /***/ }), /***/ "../../../node_modules/recharts/es6/util/BarUtils.js": /*!***********************************************************!*\ !*** ../../../node_modules/recharts/es6/util/BarUtils.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BarRectangle: () => (/* binding */ BarRectangle), /* harmony export */ minPointSizeCallback: () => (/* binding */ minPointSizeCallback) /* 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 _ActiveShapeUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ActiveShapeUtils */ "../../../node_modules/recharts/es6/util/ActiveShapeUtils.js"); var _excluded = ["x", "y"]; 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 _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 _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; } // Rectangle props is expecting x, y, height, width as numbers, name as a string, and radius as a custom type // When props are being spread in from a user defined component in Bar, // the prop types of an SVGElement have these typed as something else. // This function will return the passed in props // along with x, y, height as numbers, name as a string, and radius as number | [number, number, number, number] function typeguardBarRectangleProps(_ref, props) { var xProp = _ref.x, yProp = _ref.y, option = _objectWithoutProperties(_ref, _excluded); var xValue = "".concat(xProp); var x = parseInt(xValue, 10); var yValue = "".concat(yProp); var y = parseInt(yValue, 10); var heightValue = "".concat(props.height || option.height); var height = parseInt(heightValue, 10); var widthValue = "".concat(props.width || option.width); var width = parseInt(widthValue, 10); return _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, props), option), x ? { x: x } : {}), y ? { y: y } : {}), {}, { height: height, width: width, name: props.name, radius: props.radius }); } function BarRectangle(props) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ActiveShapeUtils__WEBPACK_IMPORTED_MODULE_2__.Shape, _extends({ shapeType: "rectangle", propTransformer: typeguardBarRectangleProps, activeClassName: "recharts-active-bar" }, props)); } /** * Safely gets minPointSize from from the minPointSize prop if it is a function * @param minPointSize minPointSize as passed to the Bar component * @param defaultValue default minPointSize * @returns minPointSize */ var minPointSizeCallback = function minPointSizeCallback(minPointSize) { var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; return function (value, index) { if (typeof minPointSize === 'number') return minPointSize; var isValueNumber = typeof value === 'number'; if (isValueNumber) { return minPointSize(value, index); } !isValueNumber ? true ? (0,tiny_invariant__WEBPACK_IMPORTED_MODULE_1__["default"])(false, "minPointSize callback function received a value with type of ".concat(_typeof(value), ". Currently only numbers are supported.")) : 0 : void 0; return defaultValue; }; }; /***/ }), /***/ "../../../node_modules/recharts/es6/util/CartesianUtils.js": /*!*****************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/CartesianUtils.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ScaleHelper: () => (/* binding */ ScaleHelper), /* harmony export */ createLabeledScales: () => (/* binding */ createLabeledScales), /* harmony export */ formatAxisMap: () => (/* binding */ formatAxisMap), /* harmony export */ getAngledRectangleWidth: () => (/* binding */ getAngledRectangleWidth), /* harmony export */ normalizeAngle: () => (/* binding */ normalizeAngle), /* harmony export */ rectWithCoords: () => (/* binding */ rectWithCoords), /* harmony export */ rectWithPoints: () => (/* binding */ rectWithPoints) /* harmony export */ }); /* harmony import */ var lodash_mapValues__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/mapValues */ "../../../node_modules/lodash/mapValues.js"); /* harmony import */ var lodash_mapValues__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_mapValues__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var lodash_every__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/every */ "../../../node_modules/lodash/every.js"); /* harmony import */ var lodash_every__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_every__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _ChartUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ChartUtils */ "../../../node_modules/recharts/es6/util/ChartUtils.js"); /* harmony import */ var _ReactUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); /* harmony import */ var _DataUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _cartesian_Bar__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../cartesian/Bar */ "../../../node_modules/recharts/es6/cartesian/Bar.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 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); } /** * Calculate the scale function, position, width, height of axes * @param {Object} props Latest props * @param {Object} axisMap The configuration of axes * @param {Object} offset The offset of main part in the svg element * @param {String} axisType The type of axes, x-axis or y-axis * @param {String} chartName The name of chart * @return {Object} Configuration */ var formatAxisMap = function formatAxisMap(props, axisMap, offset, axisType, chartName) { var width = props.width, height = props.height, layout = props.layout, children = props.children; var ids = Object.keys(axisMap); var steps = { left: offset.left, leftMirror: offset.left, right: width - offset.right, rightMirror: width - offset.right, top: offset.top, topMirror: offset.top, bottom: height - offset.bottom, bottomMirror: height - offset.bottom }; var hasBar = !!(0,_ReactUtils__WEBPACK_IMPORTED_MODULE_2__.findChildByType)(children, _cartesian_Bar__WEBPACK_IMPORTED_MODULE_3__.Bar); return ids.reduce(function (result, id) { var axis = axisMap[id]; var orientation = axis.orientation, domain = axis.domain, _axis$padding = axis.padding, padding = _axis$padding === void 0 ? {} : _axis$padding, mirror = axis.mirror, reversed = axis.reversed; var offsetKey = "".concat(orientation).concat(mirror ? 'Mirror' : ''); var calculatedPadding, range, x, y, needSpace; if (axis.type === 'number' && (axis.padding === 'gap' || axis.padding === 'no-gap')) { var diff = domain[1] - domain[0]; var smallestDistanceBetweenValues = Infinity; var sortedValues = axis.categoricalDomain.sort(); sortedValues.forEach(function (value, index) { if (index > 0) { smallestDistanceBetweenValues = Math.min((value || 0) - (sortedValues[index - 1] || 0), smallestDistanceBetweenValues); } }); if (Number.isFinite(smallestDistanceBetweenValues)) { var smallestDistanceInPercent = smallestDistanceBetweenValues / diff; var rangeWidth = axis.layout === 'vertical' ? offset.height : offset.width; if (axis.padding === 'gap') { calculatedPadding = smallestDistanceInPercent * rangeWidth / 2; } if (axis.padding === 'no-gap') { var gap = (0,_DataUtils__WEBPACK_IMPORTED_MODULE_4__.getPercentValue)(props.barCategoryGap, smallestDistanceInPercent * rangeWidth); var halfBand = smallestDistanceInPercent * rangeWidth / 2; calculatedPadding = halfBand - gap - (halfBand - gap) / rangeWidth * gap; } } } if (axisType === 'xAxis') { range = [offset.left + (padding.left || 0) + (calculatedPadding || 0), offset.left + offset.width - (padding.right || 0) - (calculatedPadding || 0)]; } else if (axisType === 'yAxis') { range = layout === 'horizontal' ? [offset.top + offset.height - (padding.bottom || 0), offset.top + (padding.top || 0)] : [offset.top + (padding.top || 0) + (calculatedPadding || 0), offset.top + offset.height - (padding.bottom || 0) - (calculatedPadding || 0)]; } else { range = axis.range; } if (reversed) { range = [range[1], range[0]]; } var _parseScale = (0,_ChartUtils__WEBPACK_IMPORTED_MODULE_5__.parseScale)(axis, chartName, hasBar), scale = _parseScale.scale, realScaleType = _parseScale.realScaleType; scale.domain(domain).range(range); (0,_ChartUtils__WEBPACK_IMPORTED_MODULE_5__.checkDomainOfScale)(scale); var ticks = (0,_ChartUtils__WEBPACK_IMPORTED_MODULE_5__.getTicksOfScale)(scale, _objectSpread(_objectSpread({}, axis), {}, { realScaleType: realScaleType })); if (axisType === 'xAxis') { needSpace = orientation === 'top' && !mirror || orientation === 'bottom' && mirror; x = offset.left; y = steps[offsetKey] - needSpace * axis.height; } else if (axisType === 'yAxis') { needSpace = orientation === 'left' && !mirror || orientation === 'right' && mirror; x = steps[offsetKey] - needSpace * axis.width; y = offset.top; } var finalAxis = _objectSpread(_objectSpread(_objectSpread({}, axis), ticks), {}, { realScaleType: realScaleType, x: x, y: y, scale: scale, width: axisType === 'xAxis' ? offset.width : axis.width, height: axisType === 'yAxis' ? offset.height : axis.height }); finalAxis.bandSize = (0,_ChartUtils__WEBPACK_IMPORTED_MODULE_5__.getBandSizeOfAxis)(finalAxis, ticks); if (!axis.hide && axisType === 'xAxis') { steps[offsetKey] += (needSpace ? -1 : 1) * finalAxis.height; } else if (!axis.hide) { steps[offsetKey] += (needSpace ? -1 : 1) * finalAxis.width; } return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, id, finalAxis)); }, {}); }; var rectWithPoints = function rectWithPoints(_ref, _ref2) { var x1 = _ref.x, y1 = _ref.y; var x2 = _ref2.x, y2 = _ref2.y; return { x: Math.min(x1, x2), y: Math.min(y1, y2), width: Math.abs(x2 - x1), height: Math.abs(y2 - y1) }; }; /** * Compute the x, y, width, and height of a box from two reference points. * @param {Object} coords x1, x2, y1, and y2 * @return {Object} object */ var rectWithCoords = function rectWithCoords(_ref3) { var x1 = _ref3.x1, y1 = _ref3.y1, x2 = _ref3.x2, y2 = _ref3.y2; return rectWithPoints({ x: x1, y: y1 }, { x: x2, y: y2 }); }; var ScaleHelper = /*#__PURE__*/function () { function ScaleHelper(scale) { _classCallCheck(this, ScaleHelper); this.scale = scale; } return _createClass(ScaleHelper, [{ key: "domain", get: function get() { return this.scale.domain; } }, { key: "range", get: function get() { return this.scale.range; } }, { key: "rangeMin", get: function get() { return this.range()[0]; } }, { key: "rangeMax", get: function get() { return this.range()[1]; } }, { key: "bandwidth", get: function get() { return this.scale.bandwidth; } }, { key: "apply", value: function apply(value) { var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, bandAware = _ref4.bandAware, position = _ref4.position; if (value === undefined) { return undefined; } if (position) { switch (position) { case 'start': { return this.scale(value); } case 'middle': { var offset = this.bandwidth ? this.bandwidth() / 2 : 0; return this.scale(value) + offset; } case 'end': { var _offset = this.bandwidth ? this.bandwidth() : 0; return this.scale(value) + _offset; } default: { return this.scale(value); } } } if (bandAware) { var _offset2 = this.bandwidth ? this.bandwidth() / 2 : 0; return this.scale(value) + _offset2; } return this.scale(value); } }, { key: "isInRange", value: function isInRange(value) { var range = this.range(); var first = range[0]; var last = range[range.length - 1]; return first <= last ? value >= first && value <= last : value >= last && value <= first; } }], [{ key: "create", value: function create(obj) { return new ScaleHelper(obj); } }]); }(); _defineProperty(ScaleHelper, "EPS", 1e-4); var createLabeledScales = function createLabeledScales(options) { var scales = Object.keys(options).reduce(function (res, key) { return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, key, ScaleHelper.create(options[key]))); }, {}); return _objectSpread(_objectSpread({}, scales), {}, { apply: function apply(coord) { var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, bandAware = _ref5.bandAware, position = _ref5.position; return lodash_mapValues__WEBPACK_IMPORTED_MODULE_0___default()(coord, function (value, label) { return scales[label].apply(value, { bandAware: bandAware, position: position }); }); }, isInRange: function isInRange(coord) { return lodash_every__WEBPACK_IMPORTED_MODULE_1___default()(coord, function (value, label) { return scales[label].isInRange(value); }); } }); }; /** Normalizes the angle so that 0 <= angle < 180. * @param {number} angle Angle in degrees. * @return {number} the normalized angle with a value of at least 0 and never greater or equal to 180. */ function normalizeAngle(angle) { return (angle % 180 + 180) % 180; } /** Calculates the width of the largest horizontal line that fits inside a rectangle that is displayed at an angle. * @param {Object} size Width and height of the text in a horizontal position. * @param {number} angle Angle in degrees in which the text is displayed. * @return {number} The width of the largest horizontal line that fits inside a rectangle that is displayed at an angle. */ var getAngledRectangleWidth = function getAngledRectangleWidth(_ref6) { var width = _ref6.width, height = _ref6.height; var angle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; // Ensure angle is >= 0 && < 180 var normalizedAngle = normalizeAngle(angle); var angleRadians = normalizedAngle * Math.PI / 180; /* Depending on the height and width of the rectangle, we may need to use different formulas to calculate the angled * width. This threshold defines when each formula should kick in. */ var angleThreshold = Math.atan(height / width); var angledWidth = angleRadians > angleThreshold && angleRadians < Math.PI - angleThreshold ? height / Math.sin(angleRadians) : width / Math.cos(angleRadians); return Math.abs(angledWidth); }; /***/ }), /***/ "../../../node_modules/recharts/es6/util/ChartUtils.js": /*!*************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/ChartUtils.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MAX_VALUE_REG: () => (/* binding */ MAX_VALUE_REG), /* harmony export */ MIN_VALUE_REG: () => (/* binding */ MIN_VALUE_REG), /* harmony export */ appendOffsetOfLegend: () => (/* binding */ appendOffsetOfLegend), /* harmony export */ calculateActiveTickIndex: () => (/* binding */ calculateActiveTickIndex), /* harmony export */ checkDomainOfScale: () => (/* binding */ checkDomainOfScale), /* harmony export */ combineEventHandlers: () => (/* binding */ combineEventHandlers), /* harmony export */ findPositionOfBar: () => (/* binding */ findPositionOfBar), /* harmony export */ getBandSizeOfAxis: () => (/* binding */ getBandSizeOfAxis), /* harmony export */ getBarPosition: () => (/* binding */ getBarPosition), /* harmony export */ getBarSizeList: () => (/* binding */ getBarSizeList), /* harmony export */ getBaseValueOfBar: () => (/* binding */ getBaseValueOfBar), /* harmony export */ getCateCoordinateOfBar: () => (/* binding */ getCateCoordinateOfBar), /* harmony export */ getCateCoordinateOfLine: () => (/* binding */ getCateCoordinateOfLine), /* harmony export */ getCoordinatesOfGrid: () => (/* binding */ getCoordinatesOfGrid), /* harmony export */ getDomainOfDataByKey: () => (/* binding */ getDomainOfDataByKey), /* harmony export */ getDomainOfErrorBars: () => (/* binding */ getDomainOfErrorBars), /* harmony export */ getDomainOfItemsWithSameAxis: () => (/* binding */ getDomainOfItemsWithSameAxis), /* harmony export */ getDomainOfStackGroups: () => (/* binding */ getDomainOfStackGroups), /* harmony export */ getLegendProps: () => (/* reexport safe */ _getLegendProps__WEBPACK_IMPORTED_MODULE_14__.getLegendProps), /* harmony export */ getMainColorOfGraphicItem: () => (/* binding */ getMainColorOfGraphicItem), /* harmony export */ getStackGroupsByAxisId: () => (/* binding */ getStackGroupsByAxisId), /* harmony export */ getStackedData: () => (/* binding */ getStackedData), /* harmony export */ getStackedDataOfItem: () => (/* binding */ getStackedDataOfItem), /* harmony export */ getTicksOfAxis: () => (/* binding */ getTicksOfAxis), /* harmony export */ getTicksOfScale: () => (/* binding */ getTicksOfScale), /* harmony export */ getTooltipItem: () => (/* binding */ getTooltipItem), /* harmony export */ getValueByDataKey: () => (/* binding */ getValueByDataKey), /* harmony export */ isCategoricalAxis: () => (/* binding */ isCategoricalAxis), /* harmony export */ offsetPositive: () => (/* binding */ offsetPositive), /* harmony export */ offsetSign: () => (/* binding */ offsetSign), /* harmony export */ parseDomainOfCategoryAxis: () => (/* binding */ parseDomainOfCategoryAxis), /* harmony export */ parseErrorBarsOfAxis: () => (/* binding */ parseErrorBarsOfAxis), /* harmony export */ parseScale: () => (/* binding */ parseScale), /* harmony export */ parseSpecifiedDomain: () => (/* binding */ parseSpecifiedDomain), /* harmony export */ truncateByDomain: () => (/* binding */ truncateByDomain) /* harmony export */ }); /* harmony import */ var victory_vendor_d3_scale__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! victory-vendor/d3-scale */ "../../../node_modules/victory-vendor/es/d3-scale.js"); /* harmony import */ var victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! victory-vendor/d3-shape */ "../../../node_modules/victory-vendor/es/d3-shape.js"); /* harmony import */ var lodash_max__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/max */ "../../../node_modules/lodash/max.js"); /* harmony import */ var lodash_max__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_max__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var lodash_min__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash/min */ "../../../node_modules/lodash/min.js"); /* harmony import */ var lodash_min__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_min__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash/isNil */ "../../../node_modules/lodash/isNil.js"); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(lodash_isNil__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash/isFunction */ "../../../node_modules/lodash/isFunction.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash_isFunction__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var lodash_isString__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash/isString */ "../../../node_modules/lodash/isString.js"); /* harmony import */ var lodash_isString__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash_isString__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash/get */ "../../../node_modules/lodash/get.js"); /* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(lodash_get__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var lodash_flatMap__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lodash/flatMap */ "../../../node_modules/lodash/flatMap.js"); /* harmony import */ var lodash_flatMap__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(lodash_flatMap__WEBPACK_IMPORTED_MODULE_8__); /* harmony import */ var lodash_isNaN__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! lodash/isNaN */ "../../../node_modules/lodash/isNaN.js"); /* harmony import */ var lodash_isNaN__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(lodash_isNaN__WEBPACK_IMPORTED_MODULE_9__); /* harmony import */ var lodash_upperFirst__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! lodash/upperFirst */ "../../../node_modules/lodash/upperFirst.js"); /* harmony import */ var lodash_upperFirst__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(lodash_upperFirst__WEBPACK_IMPORTED_MODULE_10__); /* harmony import */ var lodash_isEqual__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! lodash/isEqual */ "../../../node_modules/lodash/isEqual.js"); /* harmony import */ var lodash_isEqual__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(lodash_isEqual__WEBPACK_IMPORTED_MODULE_11__); /* harmony import */ var lodash_sortBy__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! lodash/sortBy */ "../../../node_modules/lodash/sortBy.js"); /* harmony import */ var lodash_sortBy__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(lodash_sortBy__WEBPACK_IMPORTED_MODULE_12__); /* harmony import */ var recharts_scale__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! recharts-scale */ "../../../node_modules/recharts-scale/es6/index.js"); /* harmony import */ var _cartesian_ErrorBar__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../cartesian/ErrorBar */ "../../../node_modules/recharts/es6/cartesian/ErrorBar.js"); /* harmony import */ var _DataUtils__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _ReactUtils__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); /* harmony import */ var _getLegendProps__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./getLegendProps */ "../../../node_modules/recharts/es6/util/getLegendProps.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 _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" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) 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; } 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); } // TODO: Cause of circular dependency. Needs refactor. // import { RadiusAxisProps, AngleAxisProps } from '../polar/types'; // Exported for backwards compatibility function getValueByDataKey(obj, dataKey, defaultValue) { if (lodash_isNil__WEBPACK_IMPORTED_MODULE_4___default()(obj) || lodash_isNil__WEBPACK_IMPORTED_MODULE_4___default()(dataKey)) { return defaultValue; } if ((0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.isNumOrStr)(dataKey)) { return lodash_get__WEBPACK_IMPORTED_MODULE_7___default()(obj, dataKey, defaultValue); } if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_5___default()(dataKey)) { return dataKey(obj); } return defaultValue; } /** * Get domain of data by key. * @param {Array} data The data displayed in the chart * @param {String} key The unique key of a group of data * @param {String} type The type of axis * @param {Boolean} filterNil Whether or not filter nil values * @return {Array} Domain of data */ function getDomainOfDataByKey(data, key, type, filterNil) { var flattenData = lodash_flatMap__WEBPACK_IMPORTED_MODULE_8___default()(data, function (entry) { return getValueByDataKey(entry, key); }); if (type === 'number') { // @ts-expect-error parseFloat type only accepts strings var domain = flattenData.filter(function (entry) { return (0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.isNumber)(entry) || parseFloat(entry); }); return domain.length ? [lodash_min__WEBPACK_IMPORTED_MODULE_3___default()(domain), lodash_max__WEBPACK_IMPORTED_MODULE_2___default()(domain)] : [Infinity, -Infinity]; } var validateData = filterNil ? flattenData.filter(function (entry) { return !lodash_isNil__WEBPACK_IMPORTED_MODULE_4___default()(entry); }) : flattenData; // Supports x-axis of Date type return validateData.map(function (entry) { return (0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.isNumOrStr)(entry) || entry instanceof Date ? entry : ''; }); } var calculateActiveTickIndex = function calculateActiveTickIndex(coordinate) { var _ticks$length; var ticks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var unsortedTicks = arguments.length > 2 ? arguments[2] : undefined; var axis = arguments.length > 3 ? arguments[3] : undefined; var index = -1; var len = (_ticks$length = ticks === null || ticks === void 0 ? void 0 : ticks.length) !== null && _ticks$length !== void 0 ? _ticks$length : 0; // if there are 1 or less ticks ticks then the active tick is at index 0 if (len <= 1) { return 0; } if (axis && axis.axisType === 'angleAxis' && Math.abs(Math.abs(axis.range[1] - axis.range[0]) - 360) <= 1e-6) { var range = axis.range; // ticks are distributed in a circle for (var i = 0; i < len; i++) { var before = i > 0 ? unsortedTicks[i - 1].coordinate : unsortedTicks[len - 1].coordinate; var cur = unsortedTicks[i].coordinate; var after = i >= len - 1 ? unsortedTicks[0].coordinate : unsortedTicks[i + 1].coordinate; var sameDirectionCoord = void 0; if ((0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.mathSign)(cur - before) !== (0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.mathSign)(after - cur)) { var diffInterval = []; if ((0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.mathSign)(after - cur) === (0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.mathSign)(range[1] - range[0])) { sameDirectionCoord = after; var curInRange = cur + range[1] - range[0]; diffInterval[0] = Math.min(curInRange, (curInRange + before) / 2); diffInterval[1] = Math.max(curInRange, (curInRange + before) / 2); } else { sameDirectionCoord = before; var afterInRange = after + range[1] - range[0]; diffInterval[0] = Math.min(cur, (afterInRange + cur) / 2); diffInterval[1] = Math.max(cur, (afterInRange + cur) / 2); } var sameInterval = [Math.min(cur, (sameDirectionCoord + cur) / 2), Math.max(cur, (sameDirectionCoord + cur) / 2)]; if (coordinate > sameInterval[0] && coordinate <= sameInterval[1] || coordinate >= diffInterval[0] && coordinate <= diffInterval[1]) { index = unsortedTicks[i].index; break; } } else { var minValue = Math.min(before, after); var maxValue = Math.max(before, after); if (coordinate > (minValue + cur) / 2 && coordinate <= (maxValue + cur) / 2) { index = unsortedTicks[i].index; break; } } } } else { // ticks are distributed in a single direction for (var _i = 0; _i < len; _i++) { if (_i === 0 && coordinate <= (ticks[_i].coordinate + ticks[_i + 1].coordinate) / 2 || _i > 0 && _i < len - 1 && coordinate > (ticks[_i].coordinate + ticks[_i - 1].coordinate) / 2 && coordinate <= (ticks[_i].coordinate + ticks[_i + 1].coordinate) / 2 || _i === len - 1 && coordinate > (ticks[_i].coordinate + ticks[_i - 1].coordinate) / 2) { index = ticks[_i].index; break; } } } return index; }; /** * Get the main color of each graphic item * @param {ReactElement} item A graphic item * @return {String} Color */ var getMainColorOfGraphicItem = function getMainColorOfGraphicItem(item) { var _item$type; var _ref = item, displayName = _ref.type.displayName; // TODO: check if displayName is valid. var defaultedProps = (_item$type = item.type) !== null && _item$type !== void 0 && _item$type.defaultProps ? _objectSpread(_objectSpread({}, item.type.defaultProps), item.props) : item.props; var stroke = defaultedProps.stroke, fill = defaultedProps.fill; var result; switch (displayName) { case 'Line': result = stroke; break; case 'Area': case 'Radar': result = stroke && stroke !== 'none' ? stroke : fill; break; default: result = fill; break; } return result; }; /** * Calculate the size of all groups for stacked bar graph * @param {Object} stackGroups The items grouped by axisId and stackId * @return {Object} The size of all groups */ var getBarSizeList = function getBarSizeList(_ref2) { var globalSize = _ref2.barSize, totalSize = _ref2.totalSize, _ref2$stackGroups = _ref2.stackGroups, stackGroups = _ref2$stackGroups === void 0 ? {} : _ref2$stackGroups; if (!stackGroups) { return {}; } var result = {}; var numericAxisIds = Object.keys(stackGroups); for (var i = 0, len = numericAxisIds.length; i < len; i++) { var sgs = stackGroups[numericAxisIds[i]].stackGroups; var stackIds = Object.keys(sgs); for (var j = 0, sLen = stackIds.length; j < sLen; j++) { var _sgs$stackIds$j = sgs[stackIds[j]], items = _sgs$stackIds$j.items, cateAxisId = _sgs$stackIds$j.cateAxisId; var barItems = items.filter(function (item) { return (0,_ReactUtils__WEBPACK_IMPORTED_MODULE_16__.getDisplayName)(item.type).indexOf('Bar') >= 0; }); if (barItems && barItems.length) { var barItemDefaultProps = barItems[0].type.defaultProps; var barItemProps = barItemDefaultProps !== undefined ? _objectSpread(_objectSpread({}, barItemDefaultProps), barItems[0].props) : barItems[0].props; var selfSize = barItemProps.barSize; var cateId = barItemProps[cateAxisId]; if (!result[cateId]) { result[cateId] = []; } var barSize = lodash_isNil__WEBPACK_IMPORTED_MODULE_4___default()(selfSize) ? globalSize : selfSize; result[cateId].push({ item: barItems[0], stackList: barItems.slice(1), barSize: lodash_isNil__WEBPACK_IMPORTED_MODULE_4___default()(barSize) ? undefined : (0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.getPercentValue)(barSize, totalSize, 0) }); } } } return result; }; /** * Calculate the size of each bar and offset between start of band and the bar * * @param {number} bandSize is the size of area where bars can render * @param {number | string} barGap is the gap size, as a percentage of `bandSize`. * Can be defined as number or percent string * @param {number | string} barCategoryGap is the gap size, as a percentage of `bandSize`. * Can be defined as number or percent string * @param {Array} sizeList Sizes of all groups * @param {number} maxBarSize The maximum size of each bar * @return {Array} The size and offset of each bar */ var getBarPosition = function getBarPosition(_ref3) { var barGap = _ref3.barGap, barCategoryGap = _ref3.barCategoryGap, bandSize = _ref3.bandSize, _ref3$sizeList = _ref3.sizeList, sizeList = _ref3$sizeList === void 0 ? [] : _ref3$sizeList, maxBarSize = _ref3.maxBarSize; var len = sizeList.length; if (len < 1) return null; var realBarGap = (0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.getPercentValue)(barGap, bandSize, 0, true); var result; var initialValue = []; // whether or not is barSize setted by user if (sizeList[0].barSize === +sizeList[0].barSize) { var useFull = false; var fullBarSize = bandSize / len; // @ts-expect-error the type check above does not check for type number explicitly var sum = sizeList.reduce(function (res, entry) { return res + entry.barSize || 0; }, 0); sum += (len - 1) * realBarGap; if (sum >= bandSize) { sum -= (len - 1) * realBarGap; realBarGap = 0; } if (sum >= bandSize && fullBarSize > 0) { useFull = true; fullBarSize *= 0.9; sum = len * fullBarSize; } var offset = (bandSize - sum) / 2 >> 0; var prev = { offset: offset - realBarGap, size: 0 }; result = sizeList.reduce(function (res, entry) { var newPosition = { item: entry.item, position: { offset: prev.offset + prev.size + realBarGap, // @ts-expect-error the type check above does not check for type number explicitly size: useFull ? fullBarSize : entry.barSize } }; var newRes = [].concat(_toConsumableArray(res), [newPosition]); prev = newRes[newRes.length - 1].position; if (entry.stackList && entry.stackList.length) { entry.stackList.forEach(function (item) { newRes.push({ item: item, position: prev }); }); } return newRes; }, initialValue); } else { var _offset = (0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.getPercentValue)(barCategoryGap, bandSize, 0, true); if (bandSize - 2 * _offset - (len - 1) * realBarGap <= 0) { realBarGap = 0; } var originalSize = (bandSize - 2 * _offset - (len - 1) * realBarGap) / len; if (originalSize > 1) { originalSize >>= 0; } var size = maxBarSize === +maxBarSize ? Math.min(originalSize, maxBarSize) : originalSize; result = sizeList.reduce(function (res, entry, i) { var newRes = [].concat(_toConsumableArray(res), [{ item: entry.item, position: { offset: _offset + (originalSize + realBarGap) * i + (originalSize - size) / 2, size: size } }]); if (entry.stackList && entry.stackList.length) { entry.stackList.forEach(function (item) { newRes.push({ item: item, position: newRes[newRes.length - 1].position }); }); } return newRes; }, initialValue); } return result; }; var appendOffsetOfLegend = function appendOffsetOfLegend(offset, _unused, props, legendBox) { var children = props.children, width = props.width, margin = props.margin; var legendWidth = width - (margin.left || 0) - (margin.right || 0); var legendProps = (0,_getLegendProps__WEBPACK_IMPORTED_MODULE_14__.getLegendProps)({ children: children, legendWidth: legendWidth }); if (legendProps) { var _ref4 = legendBox || {}, boxWidth = _ref4.width, boxHeight = _ref4.height; var align = legendProps.align, verticalAlign = legendProps.verticalAlign, layout = legendProps.layout; if ((layout === 'vertical' || layout === 'horizontal' && verticalAlign === 'middle') && align !== 'center' && (0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.isNumber)(offset[align])) { return _objectSpread(_objectSpread({}, offset), {}, _defineProperty({}, align, offset[align] + (boxWidth || 0))); } if ((layout === 'horizontal' || layout === 'vertical' && align === 'center') && verticalAlign !== 'middle' && (0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.isNumber)(offset[verticalAlign])) { return _objectSpread(_objectSpread({}, offset), {}, _defineProperty({}, verticalAlign, offset[verticalAlign] + (boxHeight || 0))); } } return offset; }; var isErrorBarRelevantForAxis = function isErrorBarRelevantForAxis(layout, axisType, direction) { if (lodash_isNil__WEBPACK_IMPORTED_MODULE_4___default()(axisType)) { return true; } if (layout === 'horizontal') { return axisType === 'yAxis'; } if (layout === 'vertical') { return axisType === 'xAxis'; } if (direction === 'x') { return axisType === 'xAxis'; } if (direction === 'y') { return axisType === 'yAxis'; } return true; }; var getDomainOfErrorBars = function getDomainOfErrorBars(data, item, dataKey, layout, axisType) { var children = item.props.children; var errorBars = (0,_ReactUtils__WEBPACK_IMPORTED_MODULE_16__.findAllByType)(children, _cartesian_ErrorBar__WEBPACK_IMPORTED_MODULE_17__.ErrorBar).filter(function (errorBarChild) { return isErrorBarRelevantForAxis(layout, axisType, errorBarChild.props.direction); }); if (errorBars && errorBars.length) { var keys = errorBars.map(function (errorBarChild) { return errorBarChild.props.dataKey; }); return data.reduce(function (result, entry) { var entryValue = getValueByDataKey(entry, dataKey); if (lodash_isNil__WEBPACK_IMPORTED_MODULE_4___default()(entryValue)) return result; var mainValue = Array.isArray(entryValue) ? [lodash_min__WEBPACK_IMPORTED_MODULE_3___default()(entryValue), lodash_max__WEBPACK_IMPORTED_MODULE_2___default()(entryValue)] : [entryValue, entryValue]; var errorDomain = keys.reduce(function (prevErrorArr, k) { var errorValue = getValueByDataKey(entry, k, 0); var lowerValue = mainValue[0] - Math.abs(Array.isArray(errorValue) ? errorValue[0] : errorValue); var upperValue = mainValue[1] + Math.abs(Array.isArray(errorValue) ? errorValue[1] : errorValue); return [Math.min(lowerValue, prevErrorArr[0]), Math.max(upperValue, prevErrorArr[1])]; }, [Infinity, -Infinity]); return [Math.min(errorDomain[0], result[0]), Math.max(errorDomain[1], result[1])]; }, [Infinity, -Infinity]); } return null; }; var parseErrorBarsOfAxis = function parseErrorBarsOfAxis(data, items, dataKey, axisType, layout) { var domains = items.map(function (item) { return getDomainOfErrorBars(data, item, dataKey, layout, axisType); }).filter(function (entry) { return !lodash_isNil__WEBPACK_IMPORTED_MODULE_4___default()(entry); }); if (domains && domains.length) { return domains.reduce(function (result, entry) { return [Math.min(result[0], entry[0]), Math.max(result[1], entry[1])]; }, [Infinity, -Infinity]); } return null; }; /** * Get domain of data by the configuration of item element * @param {Array} data The data displayed in the chart * @param {Array} items The instances of item * @param {String} type The type of axis, number - Number Axis, category - Category Axis * @param {LayoutType} layout The type of layout * @param {Boolean} filterNil Whether or not filter nil values * @return {Array} Domain */ var getDomainOfItemsWithSameAxis = function getDomainOfItemsWithSameAxis(data, items, type, layout, filterNil) { var domains = items.map(function (item) { var dataKey = item.props.dataKey; if (type === 'number' && dataKey) { return getDomainOfErrorBars(data, item, dataKey, layout) || getDomainOfDataByKey(data, dataKey, type, filterNil); } return getDomainOfDataByKey(data, dataKey, type, filterNil); }); if (type === 'number') { // Calculate the domain of number axis return domains.reduce( // @ts-expect-error if (type === number) means that the domain is numerical type // - but this link is missing in the type definition function (result, entry) { return [Math.min(result[0], entry[0]), Math.max(result[1], entry[1])]; }, [Infinity, -Infinity]); } var tag = {}; // Get the union set of category axis return domains.reduce(function (result, entry) { for (var i = 0, len = entry.length; i < len; i++) { // @ts-expect-error Date cannot index an object if (!tag[entry[i]]) { // @ts-expect-error Date cannot index an object tag[entry[i]] = true; // @ts-expect-error Date cannot index an object result.push(entry[i]); } } return result; }, []); }; var isCategoricalAxis = function isCategoricalAxis(layout, axisType) { return layout === 'horizontal' && axisType === 'xAxis' || layout === 'vertical' && axisType === 'yAxis' || layout === 'centric' && axisType === 'angleAxis' || layout === 'radial' && axisType === 'radiusAxis'; }; /** * Calculate the Coordinates of grid * @param {Array} ticks The ticks in axis * @param {Number} minValue The minimun value of axis * @param {Number} maxValue The maximun value of axis * @param {boolean} syncWithTicks Synchronize grid lines with ticks or not * @return {Array} Coordinates */ var getCoordinatesOfGrid = function getCoordinatesOfGrid(ticks, minValue, maxValue, syncWithTicks) { if (syncWithTicks) { return ticks.map(function (entry) { return entry.coordinate; }); } var hasMin, hasMax; var values = ticks.map(function (entry) { if (entry.coordinate === minValue) { hasMin = true; } if (entry.coordinate === maxValue) { hasMax = true; } return entry.coordinate; }); if (!hasMin) { values.push(minValue); } if (!hasMax) { values.push(maxValue); } return values; }; /** * Get the ticks of an axis * @param {Object} axis The configuration of an axis * @param {Boolean} isGrid Whether or not are the ticks in grid * @param {Boolean} isAll Return the ticks of all the points or not * @return {Array} Ticks */ var getTicksOfAxis = function getTicksOfAxis(axis, isGrid, isAll) { if (!axis) return null; var scale = axis.scale; var duplicateDomain = axis.duplicateDomain, type = axis.type, range = axis.range; var offsetForBand = axis.realScaleType === 'scaleBand' ? scale.bandwidth() / 2 : 2; var offset = (isGrid || isAll) && type === 'category' && scale.bandwidth ? scale.bandwidth() / offsetForBand : 0; offset = axis.axisType === 'angleAxis' && (range === null || range === void 0 ? void 0 : range.length) >= 2 ? (0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.mathSign)(range[0] - range[1]) * 2 * offset : offset; // The ticks set by user should only affect the ticks adjacent to axis line if (isGrid && (axis.ticks || axis.niceTicks)) { var result = (axis.ticks || axis.niceTicks).map(function (entry) { var scaleContent = duplicateDomain ? duplicateDomain.indexOf(entry) : entry; return { // If the scaleContent is not a number, the coordinate will be NaN. // That could be the case for example with a PointScale and a string as domain. coordinate: scale(scaleContent) + offset, value: entry, offset: offset }; }); return result.filter(function (row) { return !lodash_isNaN__WEBPACK_IMPORTED_MODULE_9___default()(row.coordinate); }); } // When axis is a categorial axis, but the type of axis is number or the scale of axis is not "auto" if (axis.isCategorical && axis.categoricalDomain) { return axis.categoricalDomain.map(function (entry, index) { return { coordinate: scale(entry) + offset, value: entry, index: index, offset: offset }; }); } if (scale.ticks && !isAll) { return scale.ticks(axis.tickCount).map(function (entry) { return { coordinate: scale(entry) + offset, value: entry, offset: offset }; }); } // When axis has duplicated text, serial numbers are used to generate scale return scale.domain().map(function (entry, index) { return { coordinate: scale(entry) + offset, value: duplicateDomain ? duplicateDomain[entry] : entry, index: index, offset: offset }; }); }; /** * combine the handlers * @param {Function} defaultHandler Internal private handler * @param {Function} childHandler Handler function specified in child component * @return {Function} The combined handler */ var handlerWeakMap = new WeakMap(); var combineEventHandlers = function combineEventHandlers(defaultHandler, childHandler) { if (typeof childHandler !== 'function') { return defaultHandler; } if (!handlerWeakMap.has(defaultHandler)) { handlerWeakMap.set(defaultHandler, new WeakMap()); } var childWeakMap = handlerWeakMap.get(defaultHandler); if (childWeakMap.has(childHandler)) { return childWeakMap.get(childHandler); } var combineHandler = function combineHandler() { defaultHandler.apply(void 0, arguments); childHandler.apply(void 0, arguments); }; childWeakMap.set(childHandler, combineHandler); return combineHandler; }; /** * Parse the scale function of axis * @param {Object} axis The option of axis * @param {String} chartType The displayName of chart * @param {Boolean} hasBar if it has a bar * @return {object} The scale function and resolved name */ var parseScale = function parseScale(axis, chartType, hasBar) { var scale = axis.scale, type = axis.type, layout = axis.layout, axisType = axis.axisType; if (scale === 'auto') { if (layout === 'radial' && axisType === 'radiusAxis') { return { scale: victory_vendor_d3_scale__WEBPACK_IMPORTED_MODULE_0__.scaleBand(), realScaleType: 'band' }; } if (layout === 'radial' && axisType === 'angleAxis') { return { scale: victory_vendor_d3_scale__WEBPACK_IMPORTED_MODULE_0__.scaleLinear(), realScaleType: 'linear' }; } if (type === 'category' && chartType && (chartType.indexOf('LineChart') >= 0 || chartType.indexOf('AreaChart') >= 0 || chartType.indexOf('ComposedChart') >= 0 && !hasBar)) { return { scale: victory_vendor_d3_scale__WEBPACK_IMPORTED_MODULE_0__.scalePoint(), realScaleType: 'point' }; } if (type === 'category') { return { scale: victory_vendor_d3_scale__WEBPACK_IMPORTED_MODULE_0__.scaleBand(), realScaleType: 'band' }; } return { scale: victory_vendor_d3_scale__WEBPACK_IMPORTED_MODULE_0__.scaleLinear(), realScaleType: 'linear' }; } if (lodash_isString__WEBPACK_IMPORTED_MODULE_6___default()(scale)) { var name = "scale".concat(lodash_upperFirst__WEBPACK_IMPORTED_MODULE_10___default()(scale)); return { scale: (victory_vendor_d3_scale__WEBPACK_IMPORTED_MODULE_0__[name] || victory_vendor_d3_scale__WEBPACK_IMPORTED_MODULE_0__.scalePoint)(), realScaleType: victory_vendor_d3_scale__WEBPACK_IMPORTED_MODULE_0__[name] ? name : 'point' }; } return lodash_isFunction__WEBPACK_IMPORTED_MODULE_5___default()(scale) ? { scale: scale } : { scale: victory_vendor_d3_scale__WEBPACK_IMPORTED_MODULE_0__.scalePoint(), realScaleType: 'point' }; }; var EPS = 1e-4; var checkDomainOfScale = function checkDomainOfScale(scale) { var domain = scale.domain(); if (!domain || domain.length <= 2) { return; } var len = domain.length; var range = scale.range(); var minValue = Math.min(range[0], range[1]) - EPS; var maxValue = Math.max(range[0], range[1]) + EPS; var first = scale(domain[0]); var last = scale(domain[len - 1]); if (first < minValue || first > maxValue || last < minValue || last > maxValue) { scale.domain([domain[0], domain[len - 1]]); } }; var findPositionOfBar = function findPositionOfBar(barPosition, child) { if (!barPosition) { return null; } for (var i = 0, len = barPosition.length; i < len; i++) { if (barPosition[i].item === child) { return barPosition[i].position; } } return null; }; /** * Both value and domain are tuples of two numbers * - but the type stays as array of numbers until we have better support in rest of the app * @param {Array} value input that will be truncated * @param {Array} domain boundaries * @returns {Array} tuple of two numbers */ var truncateByDomain = function truncateByDomain(value, domain) { if (!domain || domain.length !== 2 || !(0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.isNumber)(domain[0]) || !(0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.isNumber)(domain[1])) { return value; } var minValue = Math.min(domain[0], domain[1]); var maxValue = Math.max(domain[0], domain[1]); var result = [value[0], value[1]]; if (!(0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.isNumber)(value[0]) || value[0] < minValue) { result[0] = minValue; } if (!(0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.isNumber)(value[1]) || value[1] > maxValue) { result[1] = maxValue; } if (result[0] > maxValue) { result[0] = maxValue; } if (result[1] < minValue) { result[1] = minValue; } return result; }; /** * Stacks all positive numbers above zero and all negative numbers below zero. * * If all values in the series are positive then this behaves the same as 'none' stacker. * * @param {Array} series from d3-shape Stack * @return {Array} series with applied offset */ var offsetSign = function offsetSign(series) { var n = series.length; if (n <= 0) { return; } for (var j = 0, m = series[0].length; j < m; ++j) { var positive = 0; var negative = 0; for (var i = 0; i < n; ++i) { var value = lodash_isNaN__WEBPACK_IMPORTED_MODULE_9___default()(series[i][j][1]) ? series[i][j][0] : series[i][j][1]; /* eslint-disable prefer-destructuring, no-param-reassign */ if (value >= 0) { series[i][j][0] = positive; series[i][j][1] = positive + value; positive = series[i][j][1]; } else { series[i][j][0] = negative; series[i][j][1] = negative + value; negative = series[i][j][1]; } /* eslint-enable prefer-destructuring, no-param-reassign */ } } }; /** * Replaces all negative values with zero when stacking data. * * If all values in the series are positive then this behaves the same as 'none' stacker. * * @param {Array} series from d3-shape Stack * @return {Array} series with applied offset */ var offsetPositive = function offsetPositive(series) { var n = series.length; if (n <= 0) { return; } for (var j = 0, m = series[0].length; j < m; ++j) { var positive = 0; for (var i = 0; i < n; ++i) { var value = lodash_isNaN__WEBPACK_IMPORTED_MODULE_9___default()(series[i][j][1]) ? series[i][j][0] : series[i][j][1]; /* eslint-disable prefer-destructuring, no-param-reassign */ if (value >= 0) { series[i][j][0] = positive; series[i][j][1] = positive + value; positive = series[i][j][1]; } else { series[i][j][0] = 0; series[i][j][1] = 0; } /* eslint-enable prefer-destructuring, no-param-reassign */ } } }; /** * Function type to compute offset for stacked data. * * d3-shape has something fishy going on with its types. * In @definitelytyped/d3-shape, this function (the offset accessor) is typed as Series<> => void. * However! When I actually open the storybook I can see that the offset accessor actually receives Array>. * The same I can see in the source code itself: * https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/66042 * That one unfortunately has no types but we can tell it passes three-dimensional array. * * Which leads me to believe that definitelytyped is wrong on this one. * There's open discussion on this topic without much attention: * https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/66042 */ var STACK_OFFSET_MAP = { sign: offsetSign, // @ts-expect-error definitelytyped types are incorrect expand: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.stackOffsetExpand, // @ts-expect-error definitelytyped types are incorrect none: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.stackOffsetNone, // @ts-expect-error definitelytyped types are incorrect silhouette: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.stackOffsetSilhouette, // @ts-expect-error definitelytyped types are incorrect wiggle: victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.stackOffsetWiggle, positive: offsetPositive }; var getStackedData = function getStackedData(data, stackItems, offsetType) { var dataKeys = stackItems.map(function (item) { return item.props.dataKey; }); var offsetAccessor = STACK_OFFSET_MAP[offsetType]; var stack = (0,victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.stack)() // @ts-expect-error stack.keys type wants an array of strings, but we provide array of DataKeys .keys(dataKeys).value(function (d, key) { return +getValueByDataKey(d, key, 0); }).order(victory_vendor_d3_shape__WEBPACK_IMPORTED_MODULE_1__.stackOrderNone) // @ts-expect-error definitelytyped types are incorrect .offset(offsetAccessor); return stack(data); }; var getStackGroupsByAxisId = function getStackGroupsByAxisId(data, _items, numericAxisId, cateAxisId, offsetType, reverseStackOrder) { if (!data) { return null; } // reversing items to affect render order (for layering) var items = reverseStackOrder ? _items.reverse() : _items; var parentStackGroupsInitialValue = {}; var stackGroups = items.reduce(function (result, item) { var _item$type2; var defaultedProps = (_item$type2 = item.type) !== null && _item$type2 !== void 0 && _item$type2.defaultProps ? _objectSpread(_objectSpread({}, item.type.defaultProps), item.props) : item.props; var stackId = defaultedProps.stackId, hide = defaultedProps.hide; if (hide) { return result; } var axisId = defaultedProps[numericAxisId]; var parentGroup = result[axisId] || { hasStack: false, stackGroups: {} }; if ((0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.isNumOrStr)(stackId)) { var childGroup = parentGroup.stackGroups[stackId] || { numericAxisId: numericAxisId, cateAxisId: cateAxisId, items: [] }; childGroup.items.push(item); parentGroup.hasStack = true; parentGroup.stackGroups[stackId] = childGroup; } else { parentGroup.stackGroups[(0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.uniqueId)('_stackId_')] = { numericAxisId: numericAxisId, cateAxisId: cateAxisId, items: [item] }; } return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, axisId, parentGroup)); }, parentStackGroupsInitialValue); var axisStackGroupsInitialValue = {}; return Object.keys(stackGroups).reduce(function (result, axisId) { var group = stackGroups[axisId]; if (group.hasStack) { var stackGroupsInitialValue = {}; group.stackGroups = Object.keys(group.stackGroups).reduce(function (res, stackId) { var g = group.stackGroups[stackId]; return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, stackId, { numericAxisId: numericAxisId, cateAxisId: cateAxisId, items: g.items, stackedData: getStackedData(data, g.items, offsetType) })); }, stackGroupsInitialValue); } return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, axisId, group)); }, axisStackGroupsInitialValue); }; /** * Configure the scale function of axis * @param {Object} scale The scale function * @param {Object} opts The configuration of axis * @return {Object} null */ var getTicksOfScale = function getTicksOfScale(scale, opts) { var realScaleType = opts.realScaleType, type = opts.type, tickCount = opts.tickCount, originalDomain = opts.originalDomain, allowDecimals = opts.allowDecimals; var scaleType = realScaleType || opts.scale; if (scaleType !== 'auto' && scaleType !== 'linear') { return null; } if (tickCount && type === 'number' && originalDomain && (originalDomain[0] === 'auto' || originalDomain[1] === 'auto')) { // Calculate the ticks by the number of grid when the axis is a number axis var domain = scale.domain(); if (!domain.length) { return null; } var tickValues = (0,recharts_scale__WEBPACK_IMPORTED_MODULE_13__.getNiceTickValues)(domain, tickCount, allowDecimals); scale.domain([lodash_min__WEBPACK_IMPORTED_MODULE_3___default()(tickValues), lodash_max__WEBPACK_IMPORTED_MODULE_2___default()(tickValues)]); return { niceTicks: tickValues }; } if (tickCount && type === 'number') { var _domain = scale.domain(); var _tickValues = (0,recharts_scale__WEBPACK_IMPORTED_MODULE_13__.getTickValuesFixedDomain)(_domain, tickCount, allowDecimals); return { niceTicks: _tickValues }; } return null; }; function getCateCoordinateOfLine(_ref5) { var axis = _ref5.axis, ticks = _ref5.ticks, bandSize = _ref5.bandSize, entry = _ref5.entry, index = _ref5.index, dataKey = _ref5.dataKey; if (axis.type === 'category') { // find coordinate of category axis by the value of category // @ts-expect-error why does this use direct object access instead of getValueByDataKey? if (!axis.allowDuplicatedCategory && axis.dataKey && !lodash_isNil__WEBPACK_IMPORTED_MODULE_4___default()(entry[axis.dataKey])) { // @ts-expect-error why does this use direct object access instead of getValueByDataKey? var matchedTick = (0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.findEntryInArray)(ticks, 'value', entry[axis.dataKey]); if (matchedTick) { return matchedTick.coordinate + bandSize / 2; } } return ticks[index] ? ticks[index].coordinate + bandSize / 2 : null; } var value = getValueByDataKey(entry, !lodash_isNil__WEBPACK_IMPORTED_MODULE_4___default()(dataKey) ? dataKey : axis.dataKey); return !lodash_isNil__WEBPACK_IMPORTED_MODULE_4___default()(value) ? axis.scale(value) : null; } var getCateCoordinateOfBar = function getCateCoordinateOfBar(_ref6) { var axis = _ref6.axis, ticks = _ref6.ticks, offset = _ref6.offset, bandSize = _ref6.bandSize, entry = _ref6.entry, index = _ref6.index; if (axis.type === 'category') { return ticks[index] ? ticks[index].coordinate + offset : null; } var value = getValueByDataKey(entry, axis.dataKey, axis.domain[index]); return !lodash_isNil__WEBPACK_IMPORTED_MODULE_4___default()(value) ? axis.scale(value) - bandSize / 2 + offset : null; }; var getBaseValueOfBar = function getBaseValueOfBar(_ref7) { var numericAxis = _ref7.numericAxis; var domain = numericAxis.scale.domain(); if (numericAxis.type === 'number') { var minValue = Math.min(domain[0], domain[1]); var maxValue = Math.max(domain[0], domain[1]); if (minValue <= 0 && maxValue >= 0) { return 0; } if (maxValue < 0) { return maxValue; } return minValue; } return domain[0]; }; var getStackedDataOfItem = function getStackedDataOfItem(item, stackGroups) { var _item$type3; var defaultedProps = (_item$type3 = item.type) !== null && _item$type3 !== void 0 && _item$type3.defaultProps ? _objectSpread(_objectSpread({}, item.type.defaultProps), item.props) : item.props; var stackId = defaultedProps.stackId; if ((0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.isNumOrStr)(stackId)) { var group = stackGroups[stackId]; if (group) { var itemIndex = group.items.indexOf(item); return itemIndex >= 0 ? group.stackedData[itemIndex] : null; } } return null; }; var getDomainOfSingle = function getDomainOfSingle(data) { return data.reduce(function (result, entry) { return [lodash_min__WEBPACK_IMPORTED_MODULE_3___default()(entry.concat([result[0]]).filter(_DataUtils__WEBPACK_IMPORTED_MODULE_15__.isNumber)), lodash_max__WEBPACK_IMPORTED_MODULE_2___default()(entry.concat([result[1]]).filter(_DataUtils__WEBPACK_IMPORTED_MODULE_15__.isNumber))]; }, [Infinity, -Infinity]); }; var getDomainOfStackGroups = function getDomainOfStackGroups(stackGroups, startIndex, endIndex) { return Object.keys(stackGroups).reduce(function (result, stackId) { var group = stackGroups[stackId]; var stackedData = group.stackedData; var domain = stackedData.reduce(function (res, entry) { var s = getDomainOfSingle(entry.slice(startIndex, endIndex + 1)); return [Math.min(res[0], s[0]), Math.max(res[1], s[1])]; }, [Infinity, -Infinity]); return [Math.min(domain[0], result[0]), Math.max(domain[1], result[1])]; }, [Infinity, -Infinity]).map(function (result) { return result === Infinity || result === -Infinity ? 0 : result; }); }; var MIN_VALUE_REG = /^dataMin[\s]*-[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/; var MAX_VALUE_REG = /^dataMax[\s]*\+[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/; var parseSpecifiedDomain = function parseSpecifiedDomain(specifiedDomain, dataDomain, allowDataOverflow) { if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_5___default()(specifiedDomain)) { return specifiedDomain(dataDomain, allowDataOverflow); } if (!Array.isArray(specifiedDomain)) { return dataDomain; } var domain = []; /* eslint-disable prefer-destructuring */ if ((0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.isNumber)(specifiedDomain[0])) { domain[0] = allowDataOverflow ? specifiedDomain[0] : Math.min(specifiedDomain[0], dataDomain[0]); } else if (MIN_VALUE_REG.test(specifiedDomain[0])) { var value = +MIN_VALUE_REG.exec(specifiedDomain[0])[1]; domain[0] = dataDomain[0] - value; } else if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_5___default()(specifiedDomain[0])) { domain[0] = specifiedDomain[0](dataDomain[0]); } else { domain[0] = dataDomain[0]; } if ((0,_DataUtils__WEBPACK_IMPORTED_MODULE_15__.isNumber)(specifiedDomain[1])) { domain[1] = allowDataOverflow ? specifiedDomain[1] : Math.max(specifiedDomain[1], dataDomain[1]); } else if (MAX_VALUE_REG.test(specifiedDomain[1])) { var _value = +MAX_VALUE_REG.exec(specifiedDomain[1])[1]; domain[1] = dataDomain[1] + _value; } else if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_5___default()(specifiedDomain[1])) { domain[1] = specifiedDomain[1](dataDomain[1]); } else { domain[1] = dataDomain[1]; } /* eslint-enable prefer-destructuring */ return domain; }; /** * Calculate the size between two category * @param {Object} axis The options of axis * @param {Array} ticks The ticks of axis * @param {Boolean} isBar if items in axis are bars * @return {Number} Size */ var getBandSizeOfAxis = function getBandSizeOfAxis(axis, ticks, isBar) { // @ts-expect-error we need to rethink scale type if (axis && axis.scale && axis.scale.bandwidth) { // @ts-expect-error we need to rethink scale type var bandWidth = axis.scale.bandwidth(); if (!isBar || bandWidth > 0) { return bandWidth; } } if (axis && ticks && ticks.length >= 2) { var orderedTicks = lodash_sortBy__WEBPACK_IMPORTED_MODULE_12___default()(ticks, function (o) { return o.coordinate; }); var bandSize = Infinity; for (var i = 1, len = orderedTicks.length; i < len; i++) { var cur = orderedTicks[i]; var prev = orderedTicks[i - 1]; bandSize = Math.min((cur.coordinate || 0) - (prev.coordinate || 0), bandSize); } return bandSize === Infinity ? 0 : bandSize; } return isBar ? undefined : 0; }; /** * parse the domain of a category axis when a domain is specified * @param {Array} specifiedDomain The domain specified by users * @param {Array} calculatedDomain The domain calculated by dateKey * @param {ReactElement} axisChild The axis ReactElement * @returns {Array} domains */ var parseDomainOfCategoryAxis = function parseDomainOfCategoryAxis(specifiedDomain, calculatedDomain, axisChild) { if (!specifiedDomain || !specifiedDomain.length) { return calculatedDomain; } if (lodash_isEqual__WEBPACK_IMPORTED_MODULE_11___default()(specifiedDomain, lodash_get__WEBPACK_IMPORTED_MODULE_7___default()(axisChild, 'type.defaultProps.domain'))) { return calculatedDomain; } return specifiedDomain; }; var getTooltipItem = function getTooltipItem(graphicalItem, payload) { var defaultedProps = graphicalItem.type.defaultProps ? _objectSpread(_objectSpread({}, graphicalItem.type.defaultProps), graphicalItem.props) : graphicalItem.props; var dataKey = defaultedProps.dataKey, name = defaultedProps.name, unit = defaultedProps.unit, formatter = defaultedProps.formatter, tooltipType = defaultedProps.tooltipType, chartType = defaultedProps.chartType, hide = defaultedProps.hide; return _objectSpread(_objectSpread({}, (0,_ReactUtils__WEBPACK_IMPORTED_MODULE_16__.filterProps)(graphicalItem, false)), {}, { dataKey: dataKey, unit: unit, formatter: formatter, name: name || dataKey, color: getMainColorOfGraphicItem(graphicalItem), value: getValueByDataKey(payload, dataKey), type: tooltipType, payload: payload, chartType: chartType, hide: hide }); }; /***/ }), /***/ "../../../node_modules/recharts/es6/util/CssPrefixUtils.js": /*!*****************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/CssPrefixUtils.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ generatePrefixStyle: () => (/* binding */ generatePrefixStyle) /* harmony export */ }); 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); } var PREFIX_LIST = ['Webkit', 'Moz', 'O', 'ms']; var generatePrefixStyle = function generatePrefixStyle(name, value) { if (!name) { return null; } var camelName = name.replace(/(\w)/, function (v) { return v.toUpperCase(); }); var result = PREFIX_LIST.reduce(function (res, entry) { return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, entry + camelName, value)); }, {}); result[name] = value; return result; }; /***/ }), /***/ "../../../node_modules/recharts/es6/util/DOMUtils.js": /*!***********************************************************!*\ !*** ../../../node_modules/recharts/es6/util/DOMUtils.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getOffset: () => (/* binding */ getOffset), /* harmony export */ getStringSize: () => (/* binding */ getStringSize), /* harmony export */ getStyleString: () => (/* binding */ getStyleString) /* harmony export */ }); /* harmony import */ var _Global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Global */ "../../../node_modules/recharts/es6/util/Global.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 _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" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) 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 stringCache = { widthCache: {}, cacheCount: 0 }; var MAX_CACHE_NUM = 2000; var SPAN_STYLE = { position: 'absolute', top: '-20000px', left: 0, padding: 0, margin: 0, border: 'none', whiteSpace: 'pre' }; var STYLE_LIST = ['minWidth', 'maxWidth', 'width', 'minHeight', 'maxHeight', 'height', 'top', 'left', 'fontSize', 'lineHeight', 'padding', 'margin', 'paddingLeft', 'paddingRight', 'paddingTop', 'paddingBottom', 'marginLeft', 'marginRight', 'marginTop', 'marginBottom']; var MEASUREMENT_SPAN_ID = 'recharts_measurement_span'; function autoCompleteStyle(name, value) { if (STYLE_LIST.indexOf(name) >= 0 && value === +value) { return "".concat(value, "px"); } return value; } function camelToMiddleLine(text) { var strs = text.split(''); var formatStrs = strs.reduce(function (result, entry) { if (entry === entry.toUpperCase()) { return [].concat(_toConsumableArray(result), ['-', entry.toLowerCase()]); } return [].concat(_toConsumableArray(result), [entry]); }, []); return formatStrs.join(''); } var getStyleString = function getStyleString(style) { return Object.keys(style).reduce(function (result, s) { return "".concat(result).concat(camelToMiddleLine(s), ":").concat(autoCompleteStyle(s, style[s]), ";"); }, ''); }; function removeInvalidKeys(obj) { var copyObj = _objectSpread({}, obj); Object.keys(copyObj).forEach(function (key) { if (!copyObj[key]) { delete copyObj[key]; } }); return copyObj; } var getStringSize = function getStringSize(text) { var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (text === undefined || text === null || _Global__WEBPACK_IMPORTED_MODULE_0__.Global.isSsr) { return { width: 0, height: 0 }; } var copyStyle = removeInvalidKeys(style); var cacheKey = JSON.stringify({ text: text, copyStyle: copyStyle }); if (stringCache.widthCache[cacheKey]) { return stringCache.widthCache[cacheKey]; } try { var measurementSpan = document.getElementById(MEASUREMENT_SPAN_ID); if (!measurementSpan) { measurementSpan = document.createElement('span'); measurementSpan.setAttribute('id', MEASUREMENT_SPAN_ID); measurementSpan.setAttribute('aria-hidden', 'true'); document.body.appendChild(measurementSpan); } // Need to use CSS Object Model (CSSOM) to be able to comply with Content Security Policy (CSP) // https://en.wikipedia.org/wiki/Content_Security_Policy var measurementSpanStyle = _objectSpread(_objectSpread({}, SPAN_STYLE), copyStyle); Object.assign(measurementSpan.style, measurementSpanStyle); measurementSpan.textContent = "".concat(text); var rect = measurementSpan.getBoundingClientRect(); var result = { width: rect.width, height: rect.height }; stringCache.widthCache[cacheKey] = result; if (++stringCache.cacheCount > MAX_CACHE_NUM) { stringCache.cacheCount = 0; stringCache.widthCache = {}; } return result; } catch (e) { return { width: 0, height: 0 }; } }; var getOffset = function getOffset(rect) { return { top: rect.top + window.scrollY - document.documentElement.clientTop, left: rect.left + window.scrollX - document.documentElement.clientLeft }; }; /***/ }), /***/ "../../../node_modules/recharts/es6/util/DataUtils.js": /*!************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/DataUtils.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ findEntryInArray: () => (/* binding */ findEntryInArray), /* harmony export */ getAnyElementOfObject: () => (/* binding */ getAnyElementOfObject), /* harmony export */ getLinearRegression: () => (/* binding */ getLinearRegression), /* harmony export */ getPercentValue: () => (/* binding */ getPercentValue), /* harmony export */ hasDuplicate: () => (/* binding */ hasDuplicate), /* harmony export */ interpolateNumber: () => (/* binding */ interpolateNumber), /* harmony export */ isNumOrStr: () => (/* binding */ isNumOrStr), /* harmony export */ isNumber: () => (/* binding */ isNumber), /* harmony export */ isPercent: () => (/* binding */ isPercent), /* harmony export */ mathSign: () => (/* binding */ mathSign), /* harmony export */ uniqueId: () => (/* binding */ uniqueId) /* harmony export */ }); /* harmony import */ var lodash_isString__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/isString */ "../../../node_modules/lodash/isString.js"); /* harmony import */ var lodash_isString__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_isString__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var lodash_isNaN__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isNaN */ "../../../node_modules/lodash/isNaN.js"); /* harmony import */ var lodash_isNaN__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isNaN__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 lodash_isNumber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash/isNumber */ "../../../node_modules/lodash/isNumber.js"); /* harmony import */ var lodash_isNumber__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_isNumber__WEBPACK_IMPORTED_MODULE_3__); var mathSign = function mathSign(value) { if (value === 0) { return 0; } if (value > 0) { return 1; } return -1; }; var isPercent = function isPercent(value) { return lodash_isString__WEBPACK_IMPORTED_MODULE_0___default()(value) && value.indexOf('%') === value.length - 1; }; var isNumber = function isNumber(value) { return lodash_isNumber__WEBPACK_IMPORTED_MODULE_3___default()(value) && !lodash_isNaN__WEBPACK_IMPORTED_MODULE_1___default()(value); }; var isNumOrStr = function isNumOrStr(value) { return isNumber(value) || lodash_isString__WEBPACK_IMPORTED_MODULE_0___default()(value); }; var idCounter = 0; var uniqueId = function uniqueId(prefix) { var id = ++idCounter; return "".concat(prefix || '').concat(id); }; /** * Get percent value of a total value * @param {number|string} percent A percent * @param {number} totalValue Total value * @param {number} defaultValue The value returned when percent is undefined or invalid * @param {boolean} validate If set to be true, the result will be validated * @return {number} value */ var getPercentValue = function getPercentValue(percent, totalValue) { var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; var validate = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; if (!isNumber(percent) && !lodash_isString__WEBPACK_IMPORTED_MODULE_0___default()(percent)) { return defaultValue; } var value; if (isPercent(percent)) { var index = percent.indexOf('%'); value = totalValue * parseFloat(percent.slice(0, index)) / 100; } else { value = +percent; } if (lodash_isNaN__WEBPACK_IMPORTED_MODULE_1___default()(value)) { value = defaultValue; } if (validate && value > totalValue) { value = totalValue; } return value; }; var getAnyElementOfObject = function getAnyElementOfObject(obj) { if (!obj) { return null; } var keys = Object.keys(obj); if (keys && keys.length) { return obj[keys[0]]; } return null; }; var hasDuplicate = function hasDuplicate(ary) { if (!Array.isArray(ary)) { return false; } var len = ary.length; var cache = {}; for (var i = 0; i < len; i++) { if (!cache[ary[i]]) { cache[ary[i]] = true; } else { return true; } } return false; }; /* @todo consider to rename this function into `getInterpolator` */ var interpolateNumber = function interpolateNumber(numberA, numberB) { if (isNumber(numberA) && isNumber(numberB)) { return function (t) { return numberA + t * (numberB - numberA); }; } return function () { return numberB; }; }; function findEntryInArray(ary, specifiedKey, specifiedValue) { if (!ary || !ary.length) { return null; } return ary.find(function (entry) { return entry && (typeof specifiedKey === 'function' ? specifiedKey(entry) : lodash_get__WEBPACK_IMPORTED_MODULE_2___default()(entry, specifiedKey)) === specifiedValue; }); } /** * The least square linear regression * @param {Array} data The array of points * @returns {Object} The domain of x, and the parameter of linear function */ var getLinearRegression = function getLinearRegression(data) { if (!data || !data.length) { return null; } var len = data.length; var xsum = 0; var ysum = 0; var xysum = 0; var xxsum = 0; var xmin = Infinity; var xmax = -Infinity; var xcurrent = 0; var ycurrent = 0; for (var i = 0; i < len; i++) { xcurrent = data[i].cx || 0; ycurrent = data[i].cy || 0; xsum += xcurrent; ysum += ycurrent; xysum += xcurrent * ycurrent; xxsum += xcurrent * xcurrent; xmin = Math.min(xmin, xcurrent); xmax = Math.max(xmax, xcurrent); } var a = len * xxsum !== xsum * xsum ? (len * xysum - xsum * ysum) / (len * xxsum - xsum * xsum) : 0; return { xmin: xmin, xmax: xmax, a: a, b: (ysum - a * xsum) / len }; }; /***/ }), /***/ "../../../node_modules/recharts/es6/util/DetectReferenceElementsDomain.js": /*!********************************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/DetectReferenceElementsDomain.js ***! \********************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ detectReferenceElementsDomain: () => (/* binding */ detectReferenceElementsDomain) /* harmony export */ }); /* harmony import */ var _cartesian_ReferenceDot__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../cartesian/ReferenceDot */ "../../../node_modules/recharts/es6/cartesian/ReferenceDot.js"); /* harmony import */ var _cartesian_ReferenceLine__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cartesian/ReferenceLine */ "../../../node_modules/recharts/es6/cartesian/ReferenceLine.js"); /* harmony import */ var _cartesian_ReferenceArea__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../cartesian/ReferenceArea */ "../../../node_modules/recharts/es6/cartesian/ReferenceArea.js"); /* harmony import */ var _IfOverflowMatches__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./IfOverflowMatches */ "../../../node_modules/recharts/es6/util/IfOverflowMatches.js"); /* harmony import */ var _ReactUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); /* harmony import */ var _DataUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.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 _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" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) 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 detectReferenceElementsDomain = function detectReferenceElementsDomain(children, domain, axisId, axisType, specifiedTicks) { var lines = (0,_ReactUtils__WEBPACK_IMPORTED_MODULE_0__.findAllByType)(children, _cartesian_ReferenceLine__WEBPACK_IMPORTED_MODULE_1__.ReferenceLine); var dots = (0,_ReactUtils__WEBPACK_IMPORTED_MODULE_0__.findAllByType)(children, _cartesian_ReferenceDot__WEBPACK_IMPORTED_MODULE_2__.ReferenceDot); var elements = [].concat(_toConsumableArray(lines), _toConsumableArray(dots)); var areas = (0,_ReactUtils__WEBPACK_IMPORTED_MODULE_0__.findAllByType)(children, _cartesian_ReferenceArea__WEBPACK_IMPORTED_MODULE_3__.ReferenceArea); var idKey = "".concat(axisType, "Id"); var valueKey = axisType[0]; var finalDomain = domain; if (elements.length) { finalDomain = elements.reduce(function (result, el) { if (el.props[idKey] === axisId && (0,_IfOverflowMatches__WEBPACK_IMPORTED_MODULE_4__.ifOverflowMatches)(el.props, 'extendDomain') && (0,_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(el.props[valueKey])) { var value = el.props[valueKey]; return [Math.min(result[0], value), Math.max(result[1], value)]; } return result; }, finalDomain); } if (areas.length) { var key1 = "".concat(valueKey, "1"); var key2 = "".concat(valueKey, "2"); finalDomain = areas.reduce(function (result, el) { if (el.props[idKey] === axisId && (0,_IfOverflowMatches__WEBPACK_IMPORTED_MODULE_4__.ifOverflowMatches)(el.props, 'extendDomain') && (0,_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(el.props[key1]) && (0,_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(el.props[key2])) { var value1 = el.props[key1]; var value2 = el.props[key2]; return [Math.min(result[0], value1, value2), Math.max(result[1], value1, value2)]; } return result; }, finalDomain); } if (specifiedTicks && specifiedTicks.length) { finalDomain = specifiedTicks.reduce(function (result, tick) { if ((0,_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(tick)) { return [Math.min(result[0], tick), Math.max(result[1], tick)]; } return result; }, finalDomain); } return finalDomain; }; /***/ }), /***/ "../../../node_modules/recharts/es6/util/Events.js": /*!*********************************************************!*\ !*** ../../../node_modules/recharts/es6/util/Events.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ SYNC_EVENT: () => (/* binding */ SYNC_EVENT), /* harmony export */ eventCenter: () => (/* binding */ eventCenter) /* harmony export */ }); /* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventemitter3 */ "../../../node_modules/recharts/node_modules/eventemitter3/index.js"); /* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(eventemitter3__WEBPACK_IMPORTED_MODULE_0__); var eventCenter = new (eventemitter3__WEBPACK_IMPORTED_MODULE_0___default())(); var SYNC_EVENT = 'recharts.syncMouseEvents'; /***/ }), /***/ "../../../node_modules/recharts/es6/util/Global.js": /*!*********************************************************!*\ !*** ../../../node_modules/recharts/es6/util/Global.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Global: () => (/* binding */ Global) /* harmony export */ }); var parseIsSsrByDefault = function parseIsSsrByDefault() { return !(typeof window !== 'undefined' && window.document && window.document.createElement && window.setTimeout); }; var Global = { isSsr: parseIsSsrByDefault(), get: function get(key) { return Global[key]; }, set: function set(key, value) { if (typeof key === 'string') { Global[key] = value; } else { var keys = Object.keys(key); if (keys && keys.length) { keys.forEach(function (k) { Global[k] = key[k]; }); } } } }; /***/ }), /***/ "../../../node_modules/recharts/es6/util/IfOverflowMatches.js": /*!********************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/IfOverflowMatches.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ifOverflowMatches: () => (/* binding */ ifOverflowMatches) /* harmony export */ }); var ifOverflowMatches = function ifOverflowMatches(props, value) { var alwaysShow = props.alwaysShow; var ifOverflow = props.ifOverflow; if (alwaysShow) { ifOverflow = 'extendDomain'; } return ifOverflow === value; }; /***/ }), /***/ "../../../node_modules/recharts/es6/util/LogUtils.js": /*!***********************************************************!*\ !*** ../../../node_modules/recharts/es6/util/LogUtils.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ warn: () => (/* binding */ warn) /* harmony export */ }); /* eslint no-console: 0 */ var isDev = "development" !== 'production'; var warn = function warn(condition, format) { for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } if (isDev && typeof console !== 'undefined' && console.warn) { if (format === undefined) { console.warn('LogUtils requires an error message argument'); } if (!condition) { if (format === undefined) { console.warn('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.'); } else { var argIndex = 0; console.warn(format.replace(/%s/g, function () { return args[argIndex++]; })); } } } }; /***/ }), /***/ "../../../node_modules/recharts/es6/util/PolarUtils.js": /*!*************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/PolarUtils.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ RADIAN: () => (/* binding */ RADIAN), /* harmony export */ degreeToRadian: () => (/* binding */ degreeToRadian), /* harmony export */ distanceBetweenPoints: () => (/* binding */ distanceBetweenPoints), /* harmony export */ formatAngleOfSector: () => (/* binding */ formatAngleOfSector), /* harmony export */ formatAxisMap: () => (/* binding */ formatAxisMap), /* harmony export */ getAngleOfPoint: () => (/* binding */ getAngleOfPoint), /* harmony export */ getMaxRadius: () => (/* binding */ getMaxRadius), /* harmony export */ getTickClassName: () => (/* binding */ getTickClassName), /* harmony export */ inRangeOfSector: () => (/* binding */ inRangeOfSector), /* harmony export */ polarToCartesian: () => (/* binding */ polarToCartesian), /* harmony export */ radianToDegree: () => (/* binding */ radianToDegree) /* harmony export */ }); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/isNil */ "../../../node_modules/lodash/isNil.js"); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_isNil__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/isFunction */ "../../../node_modules/lodash/isFunction.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_isFunction__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _DataUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _ChartUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./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 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; } var RADIAN = Math.PI / 180; var degreeToRadian = function degreeToRadian(angle) { return angle * Math.PI / 180; }; var radianToDegree = function radianToDegree(angleInRadian) { return angleInRadian * 180 / Math.PI; }; var polarToCartesian = function polarToCartesian(cx, cy, radius, angle) { return { x: cx + Math.cos(-RADIAN * angle) * radius, y: cy + Math.sin(-RADIAN * angle) * radius }; }; var getMaxRadius = function getMaxRadius(width, height) { var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : { top: 0, right: 0, bottom: 0, left: 0 }; return Math.min(Math.abs(width - (offset.left || 0) - (offset.right || 0)), Math.abs(height - (offset.top || 0) - (offset.bottom || 0))) / 2; }; /** * Calculate the scale function, position, width, height of axes * @param {Object} props Latest props * @param {Object} axisMap The configuration of axes * @param {Object} offset The offset of main part in the svg element * @param {Object} axisType The type of axes, radius-axis or angle-axis * @param {String} chartName The name of chart * @return {Object} Configuration */ var formatAxisMap = function formatAxisMap(props, axisMap, offset, axisType, chartName) { var width = props.width, height = props.height; var startAngle = props.startAngle, endAngle = props.endAngle; var cx = (0,_DataUtils__WEBPACK_IMPORTED_MODULE_3__.getPercentValue)(props.cx, width, width / 2); var cy = (0,_DataUtils__WEBPACK_IMPORTED_MODULE_3__.getPercentValue)(props.cy, height, height / 2); var maxRadius = getMaxRadius(width, height, offset); var innerRadius = (0,_DataUtils__WEBPACK_IMPORTED_MODULE_3__.getPercentValue)(props.innerRadius, maxRadius, 0); var outerRadius = (0,_DataUtils__WEBPACK_IMPORTED_MODULE_3__.getPercentValue)(props.outerRadius, maxRadius, maxRadius * 0.8); var ids = Object.keys(axisMap); return ids.reduce(function (result, id) { var axis = axisMap[id]; var domain = axis.domain, reversed = axis.reversed; var range; if (lodash_isNil__WEBPACK_IMPORTED_MODULE_0___default()(axis.range)) { if (axisType === 'angleAxis') { range = [startAngle, endAngle]; } else if (axisType === 'radiusAxis') { range = [innerRadius, outerRadius]; } if (reversed) { range = [range[1], range[0]]; } } else { range = axis.range; var _range = range; var _range2 = _slicedToArray(_range, 2); startAngle = _range2[0]; endAngle = _range2[1]; } var _parseScale = (0,_ChartUtils__WEBPACK_IMPORTED_MODULE_4__.parseScale)(axis, chartName), realScaleType = _parseScale.realScaleType, scale = _parseScale.scale; scale.domain(domain).range(range); (0,_ChartUtils__WEBPACK_IMPORTED_MODULE_4__.checkDomainOfScale)(scale); var ticks = (0,_ChartUtils__WEBPACK_IMPORTED_MODULE_4__.getTicksOfScale)(scale, _objectSpread(_objectSpread({}, axis), {}, { realScaleType: realScaleType })); var finalAxis = _objectSpread(_objectSpread(_objectSpread({}, axis), ticks), {}, { range: range, radius: outerRadius, realScaleType: realScaleType, scale: scale, cx: cx, cy: cy, innerRadius: innerRadius, outerRadius: outerRadius, startAngle: startAngle, endAngle: endAngle }); return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, id, finalAxis)); }, {}); }; var distanceBetweenPoints = function distanceBetweenPoints(point, anotherPoint) { var x1 = point.x, y1 = point.y; var x2 = anotherPoint.x, y2 = anotherPoint.y; return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)); }; var getAngleOfPoint = function getAngleOfPoint(_ref, _ref2) { var x = _ref.x, y = _ref.y; var cx = _ref2.cx, cy = _ref2.cy; var radius = distanceBetweenPoints({ x: x, y: y }, { x: cx, y: cy }); if (radius <= 0) { return { radius: radius }; } var cos = (x - cx) / radius; var angleInRadian = Math.acos(cos); if (y > cy) { angleInRadian = 2 * Math.PI - angleInRadian; } return { radius: radius, angle: radianToDegree(angleInRadian), angleInRadian: angleInRadian }; }; var formatAngleOfSector = function formatAngleOfSector(_ref3) { var startAngle = _ref3.startAngle, endAngle = _ref3.endAngle; var startCnt = Math.floor(startAngle / 360); var endCnt = Math.floor(endAngle / 360); var min = Math.min(startCnt, endCnt); return { startAngle: startAngle - min * 360, endAngle: endAngle - min * 360 }; }; var reverseFormatAngleOfSetor = function reverseFormatAngleOfSetor(angle, _ref4) { var startAngle = _ref4.startAngle, endAngle = _ref4.endAngle; var startCnt = Math.floor(startAngle / 360); var endCnt = Math.floor(endAngle / 360); var min = Math.min(startCnt, endCnt); return angle + min * 360; }; var inRangeOfSector = function inRangeOfSector(_ref5, sector) { var x = _ref5.x, y = _ref5.y; var _getAngleOfPoint = getAngleOfPoint({ x: x, y: y }, sector), radius = _getAngleOfPoint.radius, angle = _getAngleOfPoint.angle; var innerRadius = sector.innerRadius, outerRadius = sector.outerRadius; if (radius < innerRadius || radius > outerRadius) { return false; } if (radius === 0) { return true; } var _formatAngleOfSector = formatAngleOfSector(sector), startAngle = _formatAngleOfSector.startAngle, endAngle = _formatAngleOfSector.endAngle; var formatAngle = angle; var inRange; if (startAngle <= endAngle) { while (formatAngle > endAngle) { formatAngle -= 360; } while (formatAngle < startAngle) { formatAngle += 360; } inRange = formatAngle >= startAngle && formatAngle <= endAngle; } else { while (formatAngle > startAngle) { formatAngle -= 360; } while (formatAngle < endAngle) { formatAngle += 360; } inRange = formatAngle >= endAngle && formatAngle <= startAngle; } if (inRange) { return _objectSpread(_objectSpread({}, sector), {}, { radius: radius, angle: reverseFormatAngleOfSetor(formatAngle, sector) }); } return null; }; var getTickClassName = function getTickClassName(tick) { return ! /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_1__.isValidElement)(tick) && !lodash_isFunction__WEBPACK_IMPORTED_MODULE_2___default()(tick) && typeof tick !== 'boolean' ? tick.className : ''; }; /***/ }), /***/ "../../../node_modules/recharts/es6/util/ReactUtils.js": /*!*************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/ReactUtils.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LEGEND_TYPES: () => (/* binding */ LEGEND_TYPES), /* harmony export */ SCALE_TYPES: () => (/* binding */ SCALE_TYPES), /* harmony export */ TOOLTIP_TYPES: () => (/* binding */ TOOLTIP_TYPES), /* harmony export */ filterProps: () => (/* binding */ filterProps), /* harmony export */ filterSvgElements: () => (/* binding */ filterSvgElements), /* harmony export */ findAllByType: () => (/* binding */ findAllByType), /* harmony export */ findChildByType: () => (/* binding */ findChildByType), /* harmony export */ getDisplayName: () => (/* binding */ getDisplayName), /* harmony export */ getReactEventByType: () => (/* binding */ getReactEventByType), /* harmony export */ hasClipDot: () => (/* binding */ hasClipDot), /* harmony export */ isChildrenEqual: () => (/* binding */ isChildrenEqual), /* harmony export */ isSingleChildEqual: () => (/* binding */ isSingleChildEqual), /* harmony export */ isValidSpreadableProp: () => (/* binding */ isValidSpreadableProp), /* harmony export */ parseChildIndex: () => (/* binding */ parseChildIndex), /* harmony export */ renderByOrder: () => (/* binding */ renderByOrder), /* harmony export */ toArray: () => (/* binding */ toArray), /* harmony export */ validateWidthHeight: () => (/* binding */ validateWidthHeight), /* harmony export */ withoutType: () => (/* binding */ withoutType) /* harmony export */ }); /* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/get */ "../../../node_modules/lodash/get.js"); /* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_get__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isNil */ "../../../node_modules/lodash/isNil.js"); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isNil__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var lodash_isString__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/isString */ "../../../node_modules/lodash/isString.js"); /* harmony import */ var lodash_isString__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_isString__WEBPACK_IMPORTED_MODULE_2__); /* 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_isObject__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash/isObject */ "../../../node_modules/lodash/isObject.js"); /* harmony import */ var lodash_isObject__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(lodash_isObject__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-is */ "../../../node_modules/react-is/index.js"); /* harmony import */ var _DataUtils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _ShallowEqual__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ShallowEqual */ "../../../node_modules/recharts/es6/util/ShallowEqual.js"); /* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./types */ "../../../node_modules/recharts/es6/util/types.js"); var _excluded = ["children"], _excluded2 = ["children"]; 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 _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); } var REACT_BROWSER_EVENT_MAP = { click: 'onClick', mousedown: 'onMouseDown', mouseup: 'onMouseUp', mouseover: 'onMouseOver', mousemove: 'onMouseMove', mouseout: 'onMouseOut', mouseenter: 'onMouseEnter', mouseleave: 'onMouseLeave', touchcancel: 'onTouchCancel', touchend: 'onTouchEnd', touchmove: 'onTouchMove', touchstart: 'onTouchStart', contextmenu: 'onContextMenu', dblclick: 'onDoubleClick' }; var SCALE_TYPES = ['auto', 'linear', 'pow', 'sqrt', 'log', 'identity', 'time', 'band', 'point', 'ordinal', 'quantile', 'quantize', 'utc', 'sequential', 'threshold']; var LEGEND_TYPES = ['plainline', 'line', 'square', 'rect', 'circle', 'cross', 'diamond', 'star', 'triangle', 'wye', 'none']; var TOOLTIP_TYPES = ['none']; /** * Get the display name of a component * @param {Object} Comp Specified Component * @return {String} Display name of Component */ var getDisplayName = function getDisplayName(Comp) { if (typeof Comp === 'string') { return Comp; } if (!Comp) { return ''; } return Comp.displayName || Comp.name || 'Component'; }; // `toArray` gets called multiple times during the render // so we can memoize last invocation (since reference to `children` is the same) var lastChildren = null; var lastResult = null; var toArray = function toArray(children) { if (children === lastChildren && Array.isArray(lastResult)) { return lastResult; } var result = []; react__WEBPACK_IMPORTED_MODULE_5__.Children.forEach(children, function (child) { if (lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(child)) return; if ((0,react_is__WEBPACK_IMPORTED_MODULE_6__.isFragment)(child)) { result = result.concat(toArray(child.props.children)); } else { // @ts-expect-error this could still be Iterable and TS does not like that result.push(child); } }); lastResult = result; lastChildren = children; return result; }; /* * Find and return all matched children by type. * `type` must be a React.ComponentType */ function findAllByType(children, type) { var result = []; var types = []; if (Array.isArray(type)) { types = type.map(function (t) { return getDisplayName(t); }); } else { types = [getDisplayName(type)]; } toArray(children).forEach(function (child) { var childType = lodash_get__WEBPACK_IMPORTED_MODULE_0___default()(child, 'type.displayName') || lodash_get__WEBPACK_IMPORTED_MODULE_0___default()(child, 'type.name'); if (types.indexOf(childType) !== -1) { result.push(child); } }); return result; } /* * Return the first matched child by type, return null otherwise. * `type` must be a React.ComponentType */ function findChildByType(children, type) { var result = findAllByType(children, type); return result && result[0]; } /* * Create a new array of children excluding the ones matched the type */ var withoutType = function withoutType(children, type) { var newChildren = []; var types; if (Array.isArray(type)) { types = type.map(function (t) { return getDisplayName(t); }); } else { types = [getDisplayName(type)]; } toArray(children).forEach(function (child) { var displayName = lodash_get__WEBPACK_IMPORTED_MODULE_0___default()(child, 'type.displayName'); if (displayName && types.indexOf(displayName) !== -1) { return; } newChildren.push(child); }); return newChildren; }; /** * validate the width and height props of a chart element * @param {Object} el A chart element * @return {Boolean} true If the props width and height are number, and greater than 0 */ var validateWidthHeight = function validateWidthHeight(el) { if (!el || !el.props) { return false; } var _el$props = el.props, width = _el$props.width, height = _el$props.height; if (!(0,_DataUtils__WEBPACK_IMPORTED_MODULE_7__.isNumber)(width) || width <= 0 || !(0,_DataUtils__WEBPACK_IMPORTED_MODULE_7__.isNumber)(height) || height <= 0) { return false; } return true; }; var SVG_TAGS = ['a', 'altGlyph', 'altGlyphDef', 'altGlyphItem', 'animate', 'animateColor', 'animateMotion', 'animateTransform', 'circle', 'clipPath', 'color-profile', 'cursor', 'defs', 'desc', 'ellipse', 'feBlend', 'feColormatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence', 'filter', 'font', 'font-face', 'font-face-format', 'font-face-name', 'font-face-url', 'foreignObject', 'g', 'glyph', 'glyphRef', 'hkern', 'image', 'line', 'lineGradient', 'marker', 'mask', 'metadata', 'missing-glyph', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'script', 'set', 'stop', 'style', 'svg', 'switch', 'symbol', 'text', 'textPath', 'title', 'tref', 'tspan', 'use', 'view', 'vkern']; var isSvgElement = function isSvgElement(child) { return child && child.type && lodash_isString__WEBPACK_IMPORTED_MODULE_2___default()(child.type) && SVG_TAGS.indexOf(child.type) >= 0; }; var hasClipDot = function hasClipDot(dot) { return dot && _typeof(dot) === 'object' && 'clipDot' in dot; }; /** * Checks if the property is valid to spread onto an SVG element or onto a specific component * @param {unknown} property property value currently being compared * @param {string} key property key currently being compared * @param {boolean} includeEvents if events are included in spreadable props * @param {boolean} svgElementType checks against map of SVG element types to attributes * @returns {boolean} is prop valid */ var isValidSpreadableProp = function isValidSpreadableProp(property, key, includeEvents, svgElementType) { var _FilteredElementKeyMa; /** * If the svg element type is explicitly included, check against the filtered element key map * to determine if there are attributes that should only exist on that element type. * @todo Add an internal cjs version of https://github.com/wooorm/svg-element-attributes for full coverage. */ var matchingElementTypeKeys = (_FilteredElementKeyMa = _types__WEBPACK_IMPORTED_MODULE_8__.FilteredElementKeyMap === null || _types__WEBPACK_IMPORTED_MODULE_8__.FilteredElementKeyMap === void 0 ? void 0 : _types__WEBPACK_IMPORTED_MODULE_8__.FilteredElementKeyMap[svgElementType]) !== null && _FilteredElementKeyMa !== void 0 ? _FilteredElementKeyMa : []; return !lodash_isFunction__WEBPACK_IMPORTED_MODULE_3___default()(property) && (svgElementType && matchingElementTypeKeys.includes(key) || _types__WEBPACK_IMPORTED_MODULE_8__.SVGElementPropKeys.includes(key)) || includeEvents && _types__WEBPACK_IMPORTED_MODULE_8__.EventKeys.includes(key); }; /** * Filter all the svg elements of children * @param {Array} children The children of a react element * @return {Array} All the svg elements */ var filterSvgElements = function filterSvgElements(children) { var svgElements = []; toArray(children).forEach(function (entry) { if (isSvgElement(entry)) { svgElements.push(entry); } }); return svgElements; }; var filterProps = function filterProps(props, includeEvents, svgElementType) { if (!props || typeof props === 'function' || typeof props === 'boolean') { return null; } var inputProps = props; if ( /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_5__.isValidElement)(props)) { inputProps = props.props; } if (!lodash_isObject__WEBPACK_IMPORTED_MODULE_4___default()(inputProps)) { return null; } var out = {}; /** * Props are blindly spread onto SVG elements. This loop filters out properties that we don't want to spread. * Items filtered out are as follows: * - functions in properties that are SVG attributes (functions are included when includeEvents is true) * - props that are SVG attributes but don't matched the passed svgElementType * - any prop that is not in SVGElementPropKeys (or in EventKeys if includeEvents is true) */ Object.keys(inputProps).forEach(function (key) { var _inputProps; if (isValidSpreadableProp((_inputProps = inputProps) === null || _inputProps === void 0 ? void 0 : _inputProps[key], key, includeEvents, svgElementType)) { out[key] = inputProps[key]; } }); return out; }; /** * Wether props of children changed * @param {Object} nextChildren The latest children * @param {Object} prevChildren The prev children * @return {Boolean} equal or not */ var isChildrenEqual = function isChildrenEqual(nextChildren, prevChildren) { if (nextChildren === prevChildren) { return true; } var count = react__WEBPACK_IMPORTED_MODULE_5__.Children.count(nextChildren); if (count !== react__WEBPACK_IMPORTED_MODULE_5__.Children.count(prevChildren)) { return false; } if (count === 0) { return true; } if (count === 1) { // eslint-disable-next-line @typescript-eslint/no-use-before-define return isSingleChildEqual(Array.isArray(nextChildren) ? nextChildren[0] : nextChildren, Array.isArray(prevChildren) ? prevChildren[0] : prevChildren); } for (var i = 0; i < count; i++) { var nextChild = nextChildren[i]; var prevChild = prevChildren[i]; if (Array.isArray(nextChild) || Array.isArray(prevChild)) { if (!isChildrenEqual(nextChild, prevChild)) { return false; } // eslint-disable-next-line @typescript-eslint/no-use-before-define } else if (!isSingleChildEqual(nextChild, prevChild)) { return false; } } return true; }; var isSingleChildEqual = function isSingleChildEqual(nextChild, prevChild) { if (lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(nextChild) && lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(prevChild)) { return true; } if (!lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(nextChild) && !lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(prevChild)) { var _ref = nextChild.props || {}, nextChildren = _ref.children, nextProps = _objectWithoutProperties(_ref, _excluded); var _ref2 = prevChild.props || {}, prevChildren = _ref2.children, prevProps = _objectWithoutProperties(_ref2, _excluded2); if (nextChildren && prevChildren) { return (0,_ShallowEqual__WEBPACK_IMPORTED_MODULE_9__.shallowEqual)(nextProps, prevProps) && isChildrenEqual(nextChildren, prevChildren); } if (!nextChildren && !prevChildren) { return (0,_ShallowEqual__WEBPACK_IMPORTED_MODULE_9__.shallowEqual)(nextProps, prevProps); } return false; } return false; }; var renderByOrder = function renderByOrder(children, renderMap) { var elements = []; var record = {}; toArray(children).forEach(function (child, index) { if (isSvgElement(child)) { elements.push(child); } else if (child) { var displayName = getDisplayName(child.type); var _ref3 = renderMap[displayName] || {}, handler = _ref3.handler, once = _ref3.once; if (handler && (!once || !record[displayName])) { var results = handler(child, displayName, index); elements.push(results); record[displayName] = true; } } }); return elements; }; var getReactEventByType = function getReactEventByType(e) { var type = e && e.type; if (type && REACT_BROWSER_EVENT_MAP[type]) { return REACT_BROWSER_EVENT_MAP[type]; } return null; }; var parseChildIndex = function parseChildIndex(child, children) { return toArray(children).indexOf(child); }; /***/ }), /***/ "../../../node_modules/recharts/es6/util/ReduceCSSCalc.js": /*!****************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/ReduceCSSCalc.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ reduceCSSCalc: () => (/* binding */ reduceCSSCalc), /* harmony export */ safeEvaluateExpression: () => (/* binding */ safeEvaluateExpression) /* harmony export */ }); 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 _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 _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 _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); } var MULTIPLY_OR_DIVIDE_REGEX = /(-?\d+(?:\.\d+)?[a-zA-Z%]*)([*/])(-?\d+(?:\.\d+)?[a-zA-Z%]*)/; var ADD_OR_SUBTRACT_REGEX = /(-?\d+(?:\.\d+)?[a-zA-Z%]*)([+-])(-?\d+(?:\.\d+)?[a-zA-Z%]*)/; var CSS_LENGTH_UNIT_REGEX = /^px|cm|vh|vw|em|rem|%|mm|in|pt|pc|ex|ch|vmin|vmax|Q$/; var NUM_SPLIT_REGEX = /(-?\d+(?:\.\d+)?)([a-zA-Z%]+)?/; var CONVERSION_RATES = { cm: 96 / 2.54, mm: 96 / 25.4, pt: 96 / 72, pc: 96 / 6, "in": 96, Q: 96 / (2.54 * 40), px: 1 }; var FIXED_CSS_LENGTH_UNITS = Object.keys(CONVERSION_RATES); var STR_NAN = 'NaN'; function convertToPx(value, unit) { return value * CONVERSION_RATES[unit]; } var DecimalCSS = /*#__PURE__*/function () { function DecimalCSS(num, unit) { _classCallCheck(this, DecimalCSS); this.num = num; this.unit = unit; this.num = num; this.unit = unit; if (Number.isNaN(num)) { this.unit = ''; } if (unit !== '' && !CSS_LENGTH_UNIT_REGEX.test(unit)) { this.num = NaN; this.unit = ''; } if (FIXED_CSS_LENGTH_UNITS.includes(unit)) { this.num = convertToPx(num, unit); this.unit = 'px'; } } return _createClass(DecimalCSS, [{ key: "add", value: function add(other) { if (this.unit !== other.unit) { return new DecimalCSS(NaN, ''); } return new DecimalCSS(this.num + other.num, this.unit); } }, { key: "subtract", value: function subtract(other) { if (this.unit !== other.unit) { return new DecimalCSS(NaN, ''); } return new DecimalCSS(this.num - other.num, this.unit); } }, { key: "multiply", value: function multiply(other) { if (this.unit !== '' && other.unit !== '' && this.unit !== other.unit) { return new DecimalCSS(NaN, ''); } return new DecimalCSS(this.num * other.num, this.unit || other.unit); } }, { key: "divide", value: function divide(other) { if (this.unit !== '' && other.unit !== '' && this.unit !== other.unit) { return new DecimalCSS(NaN, ''); } return new DecimalCSS(this.num / other.num, this.unit || other.unit); } }, { key: "toString", value: function toString() { return "".concat(this.num).concat(this.unit); } }, { key: "isNaN", value: function isNaN() { return Number.isNaN(this.num); } }], [{ key: "parse", value: function parse(str) { var _NUM_SPLIT_REGEX$exec; var _ref = (_NUM_SPLIT_REGEX$exec = NUM_SPLIT_REGEX.exec(str)) !== null && _NUM_SPLIT_REGEX$exec !== void 0 ? _NUM_SPLIT_REGEX$exec : [], _ref2 = _slicedToArray(_ref, 3), numStr = _ref2[1], unit = _ref2[2]; return new DecimalCSS(parseFloat(numStr), unit !== null && unit !== void 0 ? unit : ''); } }]); }(); function calculateArithmetic(expr) { if (expr.includes(STR_NAN)) { return STR_NAN; } var newExpr = expr; while (newExpr.includes('*') || newExpr.includes('/')) { var _MULTIPLY_OR_DIVIDE_R; var _ref3 = (_MULTIPLY_OR_DIVIDE_R = MULTIPLY_OR_DIVIDE_REGEX.exec(newExpr)) !== null && _MULTIPLY_OR_DIVIDE_R !== void 0 ? _MULTIPLY_OR_DIVIDE_R : [], _ref4 = _slicedToArray(_ref3, 4), leftOperand = _ref4[1], operator = _ref4[2], rightOperand = _ref4[3]; var lTs = DecimalCSS.parse(leftOperand !== null && leftOperand !== void 0 ? leftOperand : ''); var rTs = DecimalCSS.parse(rightOperand !== null && rightOperand !== void 0 ? rightOperand : ''); var result = operator === '*' ? lTs.multiply(rTs) : lTs.divide(rTs); if (result.isNaN()) { return STR_NAN; } newExpr = newExpr.replace(MULTIPLY_OR_DIVIDE_REGEX, result.toString()); } while (newExpr.includes('+') || /.-\d+(?:\.\d+)?/.test(newExpr)) { var _ADD_OR_SUBTRACT_REGE; var _ref5 = (_ADD_OR_SUBTRACT_REGE = ADD_OR_SUBTRACT_REGEX.exec(newExpr)) !== null && _ADD_OR_SUBTRACT_REGE !== void 0 ? _ADD_OR_SUBTRACT_REGE : [], _ref6 = _slicedToArray(_ref5, 4), _leftOperand = _ref6[1], _operator = _ref6[2], _rightOperand = _ref6[3]; var _lTs = DecimalCSS.parse(_leftOperand !== null && _leftOperand !== void 0 ? _leftOperand : ''); var _rTs = DecimalCSS.parse(_rightOperand !== null && _rightOperand !== void 0 ? _rightOperand : ''); var _result = _operator === '+' ? _lTs.add(_rTs) : _lTs.subtract(_rTs); if (_result.isNaN()) { return STR_NAN; } newExpr = newExpr.replace(ADD_OR_SUBTRACT_REGEX, _result.toString()); } return newExpr; } var PARENTHESES_REGEX = /\(([^()]*)\)/; function calculateParentheses(expr) { var newExpr = expr; while (newExpr.includes('(')) { var _PARENTHESES_REGEX$ex = PARENTHESES_REGEX.exec(newExpr), _PARENTHESES_REGEX$ex2 = _slicedToArray(_PARENTHESES_REGEX$ex, 2), parentheticalExpression = _PARENTHESES_REGEX$ex2[1]; newExpr = newExpr.replace(PARENTHESES_REGEX, calculateArithmetic(parentheticalExpression)); } return newExpr; } function evaluateExpression(expression) { var newExpr = expression.replace(/\s+/g, ''); newExpr = calculateParentheses(newExpr); newExpr = calculateArithmetic(newExpr); return newExpr; } function safeEvaluateExpression(expression) { try { return evaluateExpression(expression); } catch (e) { /* istanbul ignore next */ return STR_NAN; } } function reduceCSSCalc(expression) { var result = safeEvaluateExpression(expression.slice(5, -1)); if (result === STR_NAN) { // notify the user return ''; } return result; } /***/ }), /***/ "../../../node_modules/recharts/es6/util/ShallowEqual.js": /*!***************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/ShallowEqual.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ shallowEqual: () => (/* binding */ shallowEqual) /* harmony export */ }); function shallowEqual(a, b) { /* eslint-disable no-restricted-syntax */ for (var key in a) { if ({}.hasOwnProperty.call(a, key) && (!{}.hasOwnProperty.call(b, key) || a[key] !== b[key])) { return false; } } for (var _key in b) { if ({}.hasOwnProperty.call(b, _key) && !{}.hasOwnProperty.call(a, _key)) { return false; } } return true; } /***/ }), /***/ "../../../node_modules/recharts/es6/util/TickUtils.js": /*!************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/TickUtils.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getAngledTickWidth: () => (/* binding */ getAngledTickWidth), /* harmony export */ getNumberIntervalTicks: () => (/* binding */ getNumberIntervalTicks), /* harmony export */ getTickBoundaries: () => (/* binding */ getTickBoundaries), /* harmony export */ isVisible: () => (/* binding */ isVisible) /* harmony export */ }); /* harmony import */ var _CartesianUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CartesianUtils */ "../../../node_modules/recharts/es6/util/CartesianUtils.js"); /* harmony import */ var _getEveryNthWithCondition__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getEveryNthWithCondition */ "../../../node_modules/recharts/es6/util/getEveryNthWithCondition.js"); function getAngledTickWidth(contentSize, unitSize, angle) { var size = { width: contentSize.width + unitSize.width, height: contentSize.height + unitSize.height }; return (0,_CartesianUtils__WEBPACK_IMPORTED_MODULE_0__.getAngledRectangleWidth)(size, angle); } function getTickBoundaries(viewBox, sign, sizeKey) { var isWidth = sizeKey === 'width'; var x = viewBox.x, y = viewBox.y, width = viewBox.width, height = viewBox.height; if (sign === 1) { return { start: isWidth ? x : y, end: isWidth ? x + width : y + height }; } return { start: isWidth ? x + width : y + height, end: isWidth ? x : y }; } function isVisible(sign, tickPosition, getSize, start, end) { /* Since getSize() is expensive (it reads the ticks' size from the DOM), we do this check first to avoid calculating * the tick's size. */ if (sign * tickPosition < sign * start || sign * tickPosition > sign * end) { return false; } var size = getSize(); return sign * (tickPosition - sign * size / 2 - start) >= 0 && sign * (tickPosition + sign * size / 2 - end) <= 0; } function getNumberIntervalTicks(ticks, interval) { return (0,_getEveryNthWithCondition__WEBPACK_IMPORTED_MODULE_1__.getEveryNthWithCondition)(ticks, interval + 1); } /***/ }), /***/ "../../../node_modules/recharts/es6/util/calculateViewBox.js": /*!*******************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/calculateViewBox.js ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ calculateViewBox: () => (/* binding */ calculateViewBox) /* harmony export */ }); /* harmony import */ var lodash_memoize__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/memoize */ "../../../node_modules/lodash/memoize.js"); /* harmony import */ var lodash_memoize__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_memoize__WEBPACK_IMPORTED_MODULE_0__); /** * This is memoized because the viewBox is unlikely to change often * - but because it is computed from offset, any change to it would re-render all children. * * And because we have many readers of the viewBox, and update it only rarely, * then let's optimize with memoization. */ var calculateViewBox = lodash_memoize__WEBPACK_IMPORTED_MODULE_0___default()(function (offset) { return { x: offset.left, y: offset.top, width: offset.width, height: offset.height }; }, function (offset) { return ['l', offset.left, 't', offset.top, 'w', offset.width, 'h', offset.height].join(''); }); /***/ }), /***/ "../../../node_modules/recharts/es6/util/cursor/getCursorPoints.js": /*!*************************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/cursor/getCursorPoints.js ***! \*************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getCursorPoints: () => (/* binding */ getCursorPoints) /* harmony export */ }); /* harmony import */ var _PolarUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../PolarUtils */ "../../../node_modules/recharts/es6/util/PolarUtils.js"); /* harmony import */ var _getRadialCursorPoints__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getRadialCursorPoints */ "../../../node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js"); function getCursorPoints(layout, activeCoordinate, offset) { var x1, y1, x2, y2; if (layout === 'horizontal') { x1 = activeCoordinate.x; x2 = x1; y1 = offset.top; y2 = offset.top + offset.height; } else if (layout === 'vertical') { y1 = activeCoordinate.y; y2 = y1; x1 = offset.left; x2 = offset.left + offset.width; } else if (activeCoordinate.cx != null && activeCoordinate.cy != null) { if (layout === 'centric') { var cx = activeCoordinate.cx, cy = activeCoordinate.cy, innerRadius = activeCoordinate.innerRadius, outerRadius = activeCoordinate.outerRadius, angle = activeCoordinate.angle; var innerPoint = (0,_PolarUtils__WEBPACK_IMPORTED_MODULE_0__.polarToCartesian)(cx, cy, innerRadius, angle); var outerPoint = (0,_PolarUtils__WEBPACK_IMPORTED_MODULE_0__.polarToCartesian)(cx, cy, outerRadius, angle); x1 = innerPoint.x; y1 = innerPoint.y; x2 = outerPoint.x; y2 = outerPoint.y; } else { return (0,_getRadialCursorPoints__WEBPACK_IMPORTED_MODULE_1__.getRadialCursorPoints)(activeCoordinate); } } return [{ x: x1, y: y1 }, { x: x2, y: y2 }]; } /***/ }), /***/ "../../../node_modules/recharts/es6/util/cursor/getCursorRectangle.js": /*!****************************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/cursor/getCursorRectangle.js ***! \****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getCursorRectangle: () => (/* binding */ getCursorRectangle) /* harmony export */ }); function getCursorRectangle(layout, activeCoordinate, offset, tooltipAxisBandSize) { var halfSize = tooltipAxisBandSize / 2; return { stroke: 'none', fill: '#ccc', x: layout === 'horizontal' ? activeCoordinate.x - halfSize : offset.left + 0.5, y: layout === 'horizontal' ? offset.top + 0.5 : activeCoordinate.y - halfSize, width: layout === 'horizontal' ? tooltipAxisBandSize : offset.width - 1, height: layout === 'horizontal' ? offset.height - 1 : tooltipAxisBandSize }; } /***/ }), /***/ "../../../node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js": /*!*******************************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js ***! \*******************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getRadialCursorPoints: () => (/* binding */ getRadialCursorPoints) /* harmony export */ }); /* harmony import */ var _PolarUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../PolarUtils */ "../../../node_modules/recharts/es6/util/PolarUtils.js"); /** * Only applicable for radial layouts * @param {Object} activeCoordinate ChartCoordinate * @returns {Object} RadialCursorPoints */ function getRadialCursorPoints(activeCoordinate) { var cx = activeCoordinate.cx, cy = activeCoordinate.cy, radius = activeCoordinate.radius, startAngle = activeCoordinate.startAngle, endAngle = activeCoordinate.endAngle; var startPoint = (0,_PolarUtils__WEBPACK_IMPORTED_MODULE_0__.polarToCartesian)(cx, cy, radius, startAngle); var endPoint = (0,_PolarUtils__WEBPACK_IMPORTED_MODULE_0__.polarToCartesian)(cx, cy, radius, endAngle); return { points: [startPoint, endPoint], cx: cx, cy: cy, radius: radius, startAngle: startAngle, endAngle: endAngle }; } /***/ }), /***/ "../../../node_modules/recharts/es6/util/getEveryNthWithCondition.js": /*!***************************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/getEveryNthWithCondition.js ***! \***************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getEveryNthWithCondition: () => (/* binding */ getEveryNthWithCondition) /* harmony export */ }); /** * Given an array and a number N, return a new array which contains every nTh * element of the input array. For n below 1, an empty array is returned. * If isValid is provided, all candidates must suffice the condition, else undefined is returned. * @param {T[]} array An input array. * @param {integer} n A number * @param {Function} isValid A function to evaluate a candidate form the array * @returns {T[]} The result array of the same type as the input array. */ function getEveryNthWithCondition(array, n, isValid) { if (n < 1) { return []; } if (n === 1 && isValid === undefined) { return array; } var result = []; for (var i = 0; i < array.length; i += n) { if (isValid === undefined || isValid(array[i]) === true) { result.push(array[i]); } else { return undefined; } } return result; } /***/ }), /***/ "../../../node_modules/recharts/es6/util/getLegendProps.js": /*!*****************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/getLegendProps.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getLegendProps: () => (/* binding */ getLegendProps) /* harmony export */ }); /* harmony import */ var _component_Legend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../component/Legend */ "../../../node_modules/recharts/es6/component/Legend.js"); /* harmony import */ var _ChartUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ChartUtils */ "../../../node_modules/recharts/es6/util/ChartUtils.js"); /* harmony import */ var _ReactUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./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 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); } var getLegendProps = function getLegendProps(_ref) { var children = _ref.children, formattedGraphicalItems = _ref.formattedGraphicalItems, legendWidth = _ref.legendWidth, legendContent = _ref.legendContent; var legendItem = (0,_ReactUtils__WEBPACK_IMPORTED_MODULE_0__.findChildByType)(children, _component_Legend__WEBPACK_IMPORTED_MODULE_1__.Legend); if (!legendItem) { return null; } var legendDefaultProps = _component_Legend__WEBPACK_IMPORTED_MODULE_1__.Legend.defaultProps; var legendProps = legendDefaultProps !== undefined ? _objectSpread(_objectSpread({}, legendDefaultProps), legendItem.props) : {}; var legendData; if (legendItem.props && legendItem.props.payload) { legendData = legendItem.props && legendItem.props.payload; } else if (legendContent === 'children') { legendData = (formattedGraphicalItems || []).reduce(function (result, _ref2) { var item = _ref2.item, props = _ref2.props; var data = props.sectors || props.data || []; return result.concat(data.map(function (entry) { return { type: legendItem.props.iconType || item.props.legendType, value: entry.name, color: entry.fill, payload: entry }; })); }, []); } else { legendData = (formattedGraphicalItems || []).map(function (_ref3) { var item = _ref3.item; var itemDefaultProps = item.type.defaultProps; var itemProps = itemDefaultProps !== undefined ? _objectSpread(_objectSpread({}, itemDefaultProps), item.props) : {}; var dataKey = itemProps.dataKey, name = itemProps.name, legendType = itemProps.legendType, hide = itemProps.hide; return { inactive: hide, dataKey: dataKey, type: legendProps.iconType || legendType || 'square', color: (0,_ChartUtils__WEBPACK_IMPORTED_MODULE_2__.getMainColorOfGraphicItem)(item), value: name || dataKey, // @ts-expect-error property strokeDasharray is required in Payload but optional in props payload: itemProps }; }); } return _objectSpread(_objectSpread(_objectSpread({}, legendProps), _component_Legend__WEBPACK_IMPORTED_MODULE_1__.Legend.getWithHeight(legendItem, legendWidth)), {}, { payload: legendData, item: legendItem }); }; /***/ }), /***/ "../../../node_modules/recharts/es6/util/isDomainSpecifiedByUser.js": /*!**************************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/isDomainSpecifiedByUser.js ***! \**************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ isDomainSpecifiedByUser: () => (/* binding */ isDomainSpecifiedByUser) /* harmony export */ }); /* harmony import */ var _DataUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /** * Takes a domain and user props to determine whether he provided the domain via props or if we need to calculate it. * @param {AxisDomain} domain The potential domain from props * @param {Boolean} allowDataOverflow from props * @param {String} axisType from props * @returns {Boolean} `true` if domain is specified by user */ function isDomainSpecifiedByUser(domain, allowDataOverflow, axisType) { if (axisType === 'number' && allowDataOverflow === true && Array.isArray(domain)) { var domainStart = domain === null || domain === void 0 ? void 0 : domain[0]; var domainEnd = domain === null || domain === void 0 ? void 0 : domain[1]; /* * The `isNumber` check is needed because the user could also provide strings like "dataMin" via the domain props. * In such case, we have to compute the domain from the data. */ if (!!domainStart && !!domainEnd && (0,_DataUtils__WEBPACK_IMPORTED_MODULE_0__.isNumber)(domainStart) && (0,_DataUtils__WEBPACK_IMPORTED_MODULE_0__.isNumber)(domainEnd)) { return true; } } return false; } /***/ }), /***/ "../../../node_modules/recharts/es6/util/payload/getUniqPayload.js": /*!*************************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/payload/getUniqPayload.js ***! \*************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getUniqPayload: () => (/* binding */ getUniqPayload) /* harmony export */ }); /* harmony import */ var lodash_uniqBy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/uniqBy */ "../../../node_modules/lodash/uniqBy.js"); /* harmony import */ var lodash_uniqBy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_uniqBy__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__); /** * This is configuration option that decides how to filter for unique values only: * * - `false` means "no filter" * - `true` means "use recharts default filter" * - function means "use return of this function as the default key" */ function getUniqPayload(payload, option, defaultUniqBy) { if (option === true) { return lodash_uniqBy__WEBPACK_IMPORTED_MODULE_0___default()(payload, defaultUniqBy); } if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default()(option)) { return lodash_uniqBy__WEBPACK_IMPORTED_MODULE_0___default()(payload, option); } return payload; } /***/ }), /***/ "../../../node_modules/recharts/es6/util/tooltip/translate.js": /*!********************************************************************!*\ !*** ../../../node_modules/recharts/es6/util/tooltip/translate.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getTooltipCSSClassName: () => (/* binding */ getTooltipCSSClassName), /* harmony export */ getTooltipTranslate: () => (/* binding */ getTooltipTranslate), /* harmony export */ getTooltipTranslateXY: () => (/* binding */ getTooltipTranslateXY), /* harmony export */ getTransformStyle: () => (/* binding */ getTransformStyle) /* harmony export */ }); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _DataUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.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 _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); } var CSS_CLASS_PREFIX = 'recharts-tooltip-wrapper'; var TOOLTIP_HIDDEN = { visibility: 'hidden' }; function getTooltipCSSClassName(_ref) { var coordinate = _ref.coordinate, translateX = _ref.translateX, translateY = _ref.translateY; return (0,clsx__WEBPACK_IMPORTED_MODULE_0__["default"])(CSS_CLASS_PREFIX, _defineProperty(_defineProperty(_defineProperty(_defineProperty({}, "".concat(CSS_CLASS_PREFIX, "-right"), (0,_DataUtils__WEBPACK_IMPORTED_MODULE_1__.isNumber)(translateX) && coordinate && (0,_DataUtils__WEBPACK_IMPORTED_MODULE_1__.isNumber)(coordinate.x) && translateX >= coordinate.x), "".concat(CSS_CLASS_PREFIX, "-left"), (0,_DataUtils__WEBPACK_IMPORTED_MODULE_1__.isNumber)(translateX) && coordinate && (0,_DataUtils__WEBPACK_IMPORTED_MODULE_1__.isNumber)(coordinate.x) && translateX < coordinate.x), "".concat(CSS_CLASS_PREFIX, "-bottom"), (0,_DataUtils__WEBPACK_IMPORTED_MODULE_1__.isNumber)(translateY) && coordinate && (0,_DataUtils__WEBPACK_IMPORTED_MODULE_1__.isNumber)(coordinate.y) && translateY >= coordinate.y), "".concat(CSS_CLASS_PREFIX, "-top"), (0,_DataUtils__WEBPACK_IMPORTED_MODULE_1__.isNumber)(translateY) && coordinate && (0,_DataUtils__WEBPACK_IMPORTED_MODULE_1__.isNumber)(coordinate.y) && translateY < coordinate.y)); } function getTooltipTranslateXY(_ref2) { var allowEscapeViewBox = _ref2.allowEscapeViewBox, coordinate = _ref2.coordinate, key = _ref2.key, offsetTopLeft = _ref2.offsetTopLeft, position = _ref2.position, reverseDirection = _ref2.reverseDirection, tooltipDimension = _ref2.tooltipDimension, viewBox = _ref2.viewBox, viewBoxDimension = _ref2.viewBoxDimension; if (position && (0,_DataUtils__WEBPACK_IMPORTED_MODULE_1__.isNumber)(position[key])) { return position[key]; } var negative = coordinate[key] - tooltipDimension - offsetTopLeft; var positive = coordinate[key] + offsetTopLeft; if (allowEscapeViewBox[key]) { return reverseDirection[key] ? negative : positive; } if (reverseDirection[key]) { var _tooltipBoundary = negative; var _viewBoxBoundary = viewBox[key]; if (_tooltipBoundary < _viewBoxBoundary) { return Math.max(positive, viewBox[key]); } return Math.max(negative, viewBox[key]); } var tooltipBoundary = positive + tooltipDimension; var viewBoxBoundary = viewBox[key] + viewBoxDimension; if (tooltipBoundary > viewBoxBoundary) { return Math.max(negative, viewBox[key]); } return Math.max(positive, viewBox[key]); } function getTransformStyle(_ref3) { var translateX = _ref3.translateX, translateY = _ref3.translateY, useTranslate3d = _ref3.useTranslate3d; return { transform: useTranslate3d ? "translate3d(".concat(translateX, "px, ").concat(translateY, "px, 0)") : "translate(".concat(translateX, "px, ").concat(translateY, "px)") }; } function getTooltipTranslate(_ref4) { var allowEscapeViewBox = _ref4.allowEscapeViewBox, coordinate = _ref4.coordinate, offsetTopLeft = _ref4.offsetTopLeft, position = _ref4.position, reverseDirection = _ref4.reverseDirection, tooltipBox = _ref4.tooltipBox, useTranslate3d = _ref4.useTranslate3d, viewBox = _ref4.viewBox; var cssProperties, translateX, translateY; if (tooltipBox.height > 0 && tooltipBox.width > 0 && coordinate) { translateX = getTooltipTranslateXY({ allowEscapeViewBox: allowEscapeViewBox, coordinate: coordinate, key: 'x', offsetTopLeft: offsetTopLeft, position: position, reverseDirection: reverseDirection, tooltipDimension: tooltipBox.width, viewBox: viewBox, viewBoxDimension: viewBox.width }); translateY = getTooltipTranslateXY({ allowEscapeViewBox: allowEscapeViewBox, coordinate: coordinate, key: 'y', offsetTopLeft: offsetTopLeft, position: position, reverseDirection: reverseDirection, tooltipDimension: tooltipBox.height, viewBox: viewBox, viewBoxDimension: viewBox.height }); cssProperties = getTransformStyle({ translateX: translateX, translateY: translateY, useTranslate3d: useTranslate3d }); } else { cssProperties = TOOLTIP_HIDDEN; } return { cssProperties: cssProperties, cssClasses: getTooltipCSSClassName({ translateX: translateX, translateY: translateY, coordinate: coordinate }) }; } /***/ }), /***/ "../../../node_modules/recharts/es6/util/types.js": /*!********************************************************!*\ !*** ../../../node_modules/recharts/es6/util/types.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ EventKeys: () => (/* binding */ EventKeys), /* harmony export */ FilteredElementKeyMap: () => (/* binding */ FilteredElementKeyMap), /* harmony export */ SVGElementPropKeys: () => (/* binding */ SVGElementPropKeys), /* harmony export */ adaptEventHandlers: () => (/* binding */ adaptEventHandlers), /* harmony export */ adaptEventsOfChild: () => (/* binding */ adaptEventsOfChild) /* 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_isObject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isObject */ "../../../node_modules/lodash/isObject.js"); /* harmony import */ var lodash_isObject__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isObject__WEBPACK_IMPORTED_MODULE_1__); 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); } /** * Determines how values are stacked: * * - `none` is the default, it adds values on top of each other. No smarts. Negative values will overlap. * - `expand` make it so that the values always add up to 1 - so the chart will look like a rectangle. * - `wiggle` and `silhouette` tries to keep the chart centered. * - `sign` stacks positive values above zero and negative values below zero. Similar to `none` but handles negatives. * - `positive` ignores all negative values, and then behaves like \`none\`. * * Also see https://d3js.org/d3-shape/stack#stack-offsets * (note that the `diverging` offset in d3 is named `sign` in recharts) */ // // Event Handler Types -- Copied from @types/react/index.d.ts and adapted for Props. // var SVGContainerPropKeys = ['viewBox', 'children']; var SVGElementPropKeys = ['aria-activedescendant', 'aria-atomic', 'aria-autocomplete', 'aria-busy', 'aria-checked', 'aria-colcount', 'aria-colindex', 'aria-colspan', 'aria-controls', 'aria-current', 'aria-describedby', 'aria-details', 'aria-disabled', 'aria-errormessage', 'aria-expanded', 'aria-flowto', 'aria-haspopup', 'aria-hidden', 'aria-invalid', 'aria-keyshortcuts', 'aria-label', 'aria-labelledby', 'aria-level', 'aria-live', 'aria-modal', 'aria-multiline', 'aria-multiselectable', 'aria-orientation', 'aria-owns', 'aria-placeholder', 'aria-posinset', 'aria-pressed', 'aria-readonly', 'aria-relevant', 'aria-required', 'aria-roledescription', 'aria-rowcount', 'aria-rowindex', 'aria-rowspan', 'aria-selected', 'aria-setsize', 'aria-sort', 'aria-valuemax', 'aria-valuemin', 'aria-valuenow', 'aria-valuetext', 'className', 'color', 'height', 'id', 'lang', 'max', 'media', 'method', 'min', 'name', 'style', /* * removed 'type' SVGElementPropKey because we do not currently use any SVG elements * that can use it and it conflicts with the recharts prop 'type' * https://github.com/recharts/recharts/pull/3327 * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/type */ // 'type', 'target', 'width', 'role', 'tabIndex', 'accentHeight', 'accumulate', 'additive', 'alignmentBaseline', 'allowReorder', 'alphabetic', 'amplitude', 'arabicForm', 'ascent', 'attributeName', 'attributeType', 'autoReverse', 'azimuth', 'baseFrequency', 'baselineShift', 'baseProfile', 'bbox', 'begin', 'bias', 'by', 'calcMode', 'capHeight', 'clip', 'clipPath', 'clipPathUnits', 'clipRule', 'colorInterpolation', 'colorInterpolationFilters', 'colorProfile', 'colorRendering', 'contentScriptType', 'contentStyleType', 'cursor', 'cx', 'cy', 'd', 'decelerate', 'descent', 'diffuseConstant', 'direction', 'display', 'divisor', 'dominantBaseline', 'dur', 'dx', 'dy', 'edgeMode', 'elevation', 'enableBackground', 'end', 'exponent', 'externalResourcesRequired', 'fill', 'fillOpacity', 'fillRule', 'filter', 'filterRes', 'filterUnits', 'floodColor', 'floodOpacity', 'focusable', 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontWeight', 'format', 'from', 'fx', 'fy', 'g1', 'g2', 'glyphName', 'glyphOrientationHorizontal', 'glyphOrientationVertical', 'glyphRef', 'gradientTransform', 'gradientUnits', 'hanging', 'horizAdvX', 'horizOriginX', 'href', 'ideographic', 'imageRendering', 'in2', 'in', 'intercept', 'k1', 'k2', 'k3', 'k4', 'k', 'kernelMatrix', 'kernelUnitLength', 'kerning', 'keyPoints', 'keySplines', 'keyTimes', 'lengthAdjust', 'letterSpacing', 'lightingColor', 'limitingConeAngle', 'local', 'markerEnd', 'markerHeight', 'markerMid', 'markerStart', 'markerUnits', 'markerWidth', 'mask', 'maskContentUnits', 'maskUnits', 'mathematical', 'mode', 'numOctaves', 'offset', 'opacity', 'operator', 'order', 'orient', 'orientation', 'origin', 'overflow', 'overlinePosition', 'overlineThickness', 'paintOrder', 'panose1', 'pathLength', 'patternContentUnits', 'patternTransform', 'patternUnits', 'pointerEvents', 'pointsAtX', 'pointsAtY', 'pointsAtZ', 'preserveAlpha', 'preserveAspectRatio', 'primitiveUnits', 'r', 'radius', 'refX', 'refY', 'renderingIntent', 'repeatCount', 'repeatDur', 'requiredExtensions', 'requiredFeatures', 'restart', 'result', 'rotate', 'rx', 'ry', 'seed', 'shapeRendering', 'slope', 'spacing', 'specularConstant', 'specularExponent', 'speed', 'spreadMethod', 'startOffset', 'stdDeviation', 'stemh', 'stemv', 'stitchTiles', 'stopColor', 'stopOpacity', 'strikethroughPosition', 'strikethroughThickness', 'string', 'stroke', 'strokeDasharray', 'strokeDashoffset', 'strokeLinecap', 'strokeLinejoin', 'strokeMiterlimit', 'strokeOpacity', 'strokeWidth', 'surfaceScale', 'systemLanguage', 'tableValues', 'targetX', 'targetY', 'textAnchor', 'textDecoration', 'textLength', 'textRendering', 'to', 'transform', 'u1', 'u2', 'underlinePosition', 'underlineThickness', 'unicode', 'unicodeBidi', 'unicodeRange', 'unitsPerEm', 'vAlphabetic', 'values', 'vectorEffect', 'version', 'vertAdvY', 'vertOriginX', 'vertOriginY', 'vHanging', 'vIdeographic', 'viewTarget', 'visibility', 'vMathematical', 'widths', 'wordSpacing', 'writingMode', 'x1', 'x2', 'x', 'xChannelSelector', 'xHeight', 'xlinkActuate', 'xlinkArcrole', 'xlinkHref', 'xlinkRole', 'xlinkShow', 'xlinkTitle', 'xlinkType', 'xmlBase', 'xmlLang', 'xmlns', 'xmlnsXlink', 'xmlSpace', 'y1', 'y2', 'y', 'yChannelSelector', 'z', 'zoomAndPan', 'ref', 'key', 'angle']; var PolyElementKeys = ['points', 'pathLength']; /** svg element types that have specific attribute filtration requirements */ /** map of svg element types to unique svg attributes that belong to that element */ var FilteredElementKeyMap = { svg: SVGContainerPropKeys, polygon: PolyElementKeys, polyline: PolyElementKeys }; var EventKeys = ['dangerouslySetInnerHTML', 'onCopy', 'onCopyCapture', 'onCut', 'onCutCapture', 'onPaste', 'onPasteCapture', 'onCompositionEnd', 'onCompositionEndCapture', 'onCompositionStart', 'onCompositionStartCapture', 'onCompositionUpdate', 'onCompositionUpdateCapture', 'onFocus', 'onFocusCapture', 'onBlur', 'onBlurCapture', 'onChange', 'onChangeCapture', 'onBeforeInput', 'onBeforeInputCapture', 'onInput', 'onInputCapture', 'onReset', 'onResetCapture', 'onSubmit', 'onSubmitCapture', 'onInvalid', 'onInvalidCapture', 'onLoad', 'onLoadCapture', 'onError', 'onErrorCapture', 'onKeyDown', 'onKeyDownCapture', 'onKeyPress', 'onKeyPressCapture', 'onKeyUp', 'onKeyUpCapture', 'onAbort', 'onAbortCapture', 'onCanPlay', 'onCanPlayCapture', 'onCanPlayThrough', 'onCanPlayThroughCapture', 'onDurationChange', 'onDurationChangeCapture', 'onEmptied', 'onEmptiedCapture', 'onEncrypted', 'onEncryptedCapture', 'onEnded', 'onEndedCapture', 'onLoadedData', 'onLoadedDataCapture', 'onLoadedMetadata', 'onLoadedMetadataCapture', 'onLoadStart', 'onLoadStartCapture', 'onPause', 'onPauseCapture', 'onPlay', 'onPlayCapture', 'onPlaying', 'onPlayingCapture', 'onProgress', 'onProgressCapture', 'onRateChange', 'onRateChangeCapture', 'onSeeked', 'onSeekedCapture', 'onSeeking', 'onSeekingCapture', 'onStalled', 'onStalledCapture', 'onSuspend', 'onSuspendCapture', 'onTimeUpdate', 'onTimeUpdateCapture', 'onVolumeChange', 'onVolumeChangeCapture', 'onWaiting', 'onWaitingCapture', 'onAuxClick', 'onAuxClickCapture', 'onClick', 'onClickCapture', 'onContextMenu', 'onContextMenuCapture', 'onDoubleClick', 'onDoubleClickCapture', 'onDrag', 'onDragCapture', 'onDragEnd', 'onDragEndCapture', 'onDragEnter', 'onDragEnterCapture', 'onDragExit', 'onDragExitCapture', 'onDragLeave', 'onDragLeaveCapture', 'onDragOver', 'onDragOverCapture', 'onDragStart', 'onDragStartCapture', 'onDrop', 'onDropCapture', 'onMouseDown', 'onMouseDownCapture', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseMoveCapture', 'onMouseOut', 'onMouseOutCapture', 'onMouseOver', 'onMouseOverCapture', 'onMouseUp', 'onMouseUpCapture', 'onSelect', 'onSelectCapture', 'onTouchCancel', 'onTouchCancelCapture', 'onTouchEnd', 'onTouchEndCapture', 'onTouchMove', 'onTouchMoveCapture', 'onTouchStart', 'onTouchStartCapture', 'onPointerDown', 'onPointerDownCapture', 'onPointerMove', 'onPointerMoveCapture', 'onPointerUp', 'onPointerUpCapture', 'onPointerCancel', 'onPointerCancelCapture', 'onPointerEnter', 'onPointerEnterCapture', 'onPointerLeave', 'onPointerLeaveCapture', 'onPointerOver', 'onPointerOverCapture', 'onPointerOut', 'onPointerOutCapture', 'onGotPointerCapture', 'onGotPointerCaptureCapture', 'onLostPointerCapture', 'onLostPointerCaptureCapture', 'onScroll', 'onScrollCapture', 'onWheel', 'onWheelCapture', 'onAnimationStart', 'onAnimationStartCapture', 'onAnimationEnd', 'onAnimationEndCapture', 'onAnimationIteration', 'onAnimationIterationCapture', 'onTransitionEnd', 'onTransitionEndCapture']; /** The type of easing function to use for animations */ /** Specifies the duration of animation, the unit of this option is ms. */ /** the offset of a chart, which define the blank space all around */ /** * The domain of axis. * This is the definition * * Numeric domain is always defined by an array of exactly two values, for the min and the max of the axis. * Categorical domain is defined as array of all possible values. * * Can be specified in many ways: * - array of numbers * - with special strings like 'dataMin' and 'dataMax' * - with special string math like 'dataMin - 100' * - with keyword 'auto' * - or a function * - array of functions * - or a combination of the above */ /** * NumberDomain is an evaluated {@link AxisDomain}. * Unlike {@link AxisDomain}, it has no variety - it's a tuple of two number. * This is after all the keywords and functions were evaluated and what is left is [min, max]. * * Know that the min, max values are not guaranteed to be nice numbers - values like -Infinity or NaN are possible. * * There are also `category` axes that have different things than numbers in their domain. */ /** The props definition of base axis */ /** Defines how ticks are placed and whether / how tick collisions are handled. * 'preserveStart' keeps the left tick on collision and ensures that the first tick is always shown. * 'preserveEnd' keeps the right tick on collision and ensures that the last tick is always shown. * 'preserveStartEnd' keeps the left tick on collision and ensures that the first and last ticks are always shown. * 'equidistantPreserveStart' selects a number N such that every nTh tick will be shown without collision. */ var adaptEventHandlers = function adaptEventHandlers(props, newHandler) { if (!props || typeof props === 'function' || typeof props === 'boolean') { return null; } var inputProps = props; if ( /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(props)) { inputProps = props.props; } if (!lodash_isObject__WEBPACK_IMPORTED_MODULE_1___default()(inputProps)) { return null; } var out = {}; Object.keys(inputProps).forEach(function (key) { if (EventKeys.includes(key)) { out[key] = newHandler || function (e) { return inputProps[key](inputProps, e); }; } }); return out; }; var getEventHandlerOfChild = function getEventHandlerOfChild(originalHandler, data, index) { return function (e) { originalHandler(data, index, e); return null; }; }; var adaptEventsOfChild = function adaptEventsOfChild(props, data, index) { if (!lodash_isObject__WEBPACK_IMPORTED_MODULE_1___default()(props) || _typeof(props) !== 'object') { return null; } var out = null; Object.keys(props).forEach(function (key) { var item = props[key]; if (EventKeys.includes(key) && typeof item === 'function') { if (!out) out = {}; out[key] = getEventHandlerOfChild(item, data, index); } }); return out; }; /***/ }), /***/ "../../../node_modules/recharts/node_modules/eventemitter3/index.js": /*!**************************************************************************!*\ !*** ../../../node_modules/recharts/node_modules/eventemitter3/index.js ***! \**************************************************************************/ /***/ ((module) => { var has = Object.prototype.hasOwnProperty , prefix = '~'; /** * Constructor to create a storage for our `EE` objects. * An `Events` instance is a plain object whose properties are event names. * * @constructor * @private */ function Events() {} // // We try to not inherit from `Object.prototype`. In some engines creating an // instance in this way is faster than calling `Object.create(null)` directly. // If `Object.create(null)` is not supported we prefix the event names with a // character to make sure that the built-in object properties are not // overridden or used as an attack vector. // if (Object.create) { Events.prototype = Object.create(null); // // This hack is needed because the `__proto__` property is still inherited in // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5. // if (!new Events().__proto__) prefix = false; } /** * Representation of a single event listener. * * @param {Function} fn The listener function. * @param {*} context The context to invoke the listener with. * @param {Boolean} [once=false] Specify if the listener is a one-time listener. * @constructor * @private */ function EE(fn, context, once) { this.fn = fn; this.context = context; this.once = once || false; } /** * Add a listener for a given event. * * @param {EventEmitter} emitter Reference to the `EventEmitter` instance. * @param {(String|Symbol)} event The event name. * @param {Function} fn The listener function. * @param {*} context The context to invoke the listener with. * @param {Boolean} once Specify if the listener is a one-time listener. * @returns {EventEmitter} * @private */ function addListener(emitter, event, fn, context, once) { if (typeof fn !== 'function') { throw new TypeError('The listener must be a function'); } var listener = new EE(fn, context || emitter, once) , evt = prefix ? prefix + event : event; if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++; else if (!emitter._events[evt].fn) emitter._events[evt].push(listener); else emitter._events[evt] = [emitter._events[evt], listener]; return emitter; } /** * Clear event by name. * * @param {EventEmitter} emitter Reference to the `EventEmitter` instance. * @param {(String|Symbol)} evt The Event name. * @private */ function clearEvent(emitter, evt) { if (--emitter._eventsCount === 0) emitter._events = new Events(); else delete emitter._events[evt]; } /** * Minimal `EventEmitter` interface that is molded against the Node.js * `EventEmitter` interface. * * @constructor * @public */ function EventEmitter() { this._events = new Events(); this._eventsCount = 0; } /** * Return an array listing the events for which the emitter has registered * listeners. * * @returns {Array} * @public */ EventEmitter.prototype.eventNames = function eventNames() { var names = [] , events , name; if (this._eventsCount === 0) return names; for (name in (events = this._events)) { if (has.call(events, name)) names.push(prefix ? name.slice(1) : name); } if (Object.getOwnPropertySymbols) { return names.concat(Object.getOwnPropertySymbols(events)); } return names; }; /** * Return the listeners registered for a given event. * * @param {(String|Symbol)} event The event name. * @returns {Array} The registered listeners. * @public */ EventEmitter.prototype.listeners = function listeners(event) { var evt = prefix ? prefix + event : event , handlers = this._events[evt]; if (!handlers) return []; if (handlers.fn) return [handlers.fn]; for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) { ee[i] = handlers[i].fn; } return ee; }; /** * Return the number of listeners listening to a given event. * * @param {(String|Symbol)} event The event name. * @returns {Number} The number of listeners. * @public */ EventEmitter.prototype.listenerCount = function listenerCount(event) { var evt = prefix ? prefix + event : event , listeners = this._events[evt]; if (!listeners) return 0; if (listeners.fn) return 1; return listeners.length; }; /** * Calls each of the listeners registered for a given event. * * @param {(String|Symbol)} event The event name. * @returns {Boolean} `true` if the event had listeners, else `false`. * @public */ EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { var evt = prefix ? prefix + event : event; if (!this._events[evt]) return false; var listeners = this._events[evt] , len = arguments.length , args , i; if (listeners.fn) { if (listeners.once) this.removeListener(event, listeners.fn, undefined, true); switch (len) { case 1: return listeners.fn.call(listeners.context), true; case 2: return listeners.fn.call(listeners.context, a1), true; case 3: return listeners.fn.call(listeners.context, a1, a2), true; case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true; case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; } for (i = 1, args = new Array(len -1); i < len; i++) { args[i - 1] = arguments[i]; } listeners.fn.apply(listeners.context, args); } else { var length = listeners.length , j; for (i = 0; i < length; i++) { if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true); switch (len) { case 1: listeners[i].fn.call(listeners[i].context); break; case 2: listeners[i].fn.call(listeners[i].context, a1); break; case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break; case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break; default: if (!args) for (j = 1, args = new Array(len -1); j < len; j++) { args[j - 1] = arguments[j]; } listeners[i].fn.apply(listeners[i].context, args); } } } return true; }; /** * Add a listener for a given event. * * @param {(String|Symbol)} event The event name. * @param {Function} fn The listener function. * @param {*} [context=this] The context to invoke the listener with. * @returns {EventEmitter} `this`. * @public */ EventEmitter.prototype.on = function on(event, fn, context) { return addListener(this, event, fn, context, false); }; /** * Add a one-time listener for a given event. * * @param {(String|Symbol)} event The event name. * @param {Function} fn The listener function. * @param {*} [context=this] The context to invoke the listener with. * @returns {EventEmitter} `this`. * @public */ EventEmitter.prototype.once = function once(event, fn, context) { return addListener(this, event, fn, context, true); }; /** * Remove the listeners of a given event. * * @param {(String|Symbol)} event The event name. * @param {Function} fn Only remove the listeners that match this function. * @param {*} context Only remove the listeners that have this context. * @param {Boolean} once Only remove one-time listeners. * @returns {EventEmitter} `this`. * @public */ EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) { var evt = prefix ? prefix + event : event; if (!this._events[evt]) return this; if (!fn) { clearEvent(this, evt); return this; } var listeners = this._events[evt]; if (listeners.fn) { if ( listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context) ) { clearEvent(this, evt); } } else { for (var i = 0, events = [], length = listeners.length; i < length; i++) { if ( listeners[i].fn !== fn || (once && !listeners[i].once) || (context && listeners[i].context !== context) ) { events.push(listeners[i]); } } // // Reset the array, or remove it completely if we have no more listeners. // if (events.length) this._events[evt] = events.length === 1 ? events[0] : events; else clearEvent(this, evt); } return this; }; /** * Remove all listeners, or those of the specified event. * * @param {(String|Symbol)} [event] The event name. * @returns {EventEmitter} `this`. * @public */ EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) { var evt; if (event) { evt = prefix ? prefix + event : event; if (this._events[evt]) clearEvent(this, evt); } else { this._events = new Events(); this._eventsCount = 0; } return this; }; // // Alias methods names because people roll like that. // EventEmitter.prototype.off = EventEmitter.prototype.removeListener; EventEmitter.prototype.addListener = EventEmitter.prototype.on; // // Expose the prefix. // EventEmitter.prefixed = prefix; // // Allow `EventEmitter` to be imported as module namespace. // EventEmitter.EventEmitter = EventEmitter; // // Expose the module. // if (true) { module.exports = EventEmitter; } /***/ }), /***/ "../../../node_modules/redux-thunk/dist/redux-thunk.mjs": /*!**************************************************************!*\ !*** ../../../node_modules/redux-thunk/dist/redux-thunk.mjs ***! \**************************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ thunk: () => (/* binding */ thunk), /* harmony export */ withExtraArgument: () => (/* binding */ withExtraArgument) /* harmony export */ }); // src/index.ts function createThunkMiddleware(extraArgument) { const middleware = ({ dispatch, getState }) => (next) => (action) => { if (typeof action === "function") { return action(dispatch, getState, extraArgument); } return next(action); }; return middleware; } var thunk = createThunkMiddleware(); var withExtraArgument = createThunkMiddleware; /***/ }), /***/ "../../../node_modules/redux/dist/redux.mjs": /*!**************************************************!*\ !*** ../../../node_modules/redux/dist/redux.mjs ***! \**************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ __DO_NOT_USE__ActionTypes: () => (/* binding */ actionTypes_default), /* harmony export */ applyMiddleware: () => (/* binding */ applyMiddleware), /* harmony export */ bindActionCreators: () => (/* binding */ bindActionCreators), /* harmony export */ combineReducers: () => (/* binding */ combineReducers), /* harmony export */ compose: () => (/* binding */ compose), /* harmony export */ createStore: () => (/* binding */ createStore), /* harmony export */ isAction: () => (/* binding */ isAction), /* harmony export */ isPlainObject: () => (/* binding */ isPlainObject), /* harmony export */ legacy_createStore: () => (/* binding */ legacy_createStore) /* harmony export */ }); // src/utils/formatProdErrorMessage.ts function formatProdErrorMessage(code) { return `Minified Redux error #${code}; visit https://redux.js.org/Errors?code=${code} for the full message or use the non-minified dev environment for full errors. `; } // src/utils/symbol-observable.ts var $$observable = /* @__PURE__ */ (() => typeof Symbol === "function" && Symbol.observable || "@@observable")(); var symbol_observable_default = $$observable; // src/utils/actionTypes.ts var randomString = () => Math.random().toString(36).substring(7).split("").join("."); var ActionTypes = { INIT: `@@redux/INIT${/* @__PURE__ */ randomString()}`, REPLACE: `@@redux/REPLACE${/* @__PURE__ */ randomString()}`, PROBE_UNKNOWN_ACTION: () => `@@redux/PROBE_UNKNOWN_ACTION${randomString()}` }; var actionTypes_default = ActionTypes; // src/utils/isPlainObject.ts function isPlainObject(obj) { if (typeof obj !== "object" || obj === null) return false; let proto = obj; while (Object.getPrototypeOf(proto) !== null) { proto = Object.getPrototypeOf(proto); } return Object.getPrototypeOf(obj) === proto || Object.getPrototypeOf(obj) === null; } // src/utils/kindOf.ts function miniKindOf(val) { if (val === void 0) return "undefined"; if (val === null) return "null"; const type = typeof val; switch (type) { case "boolean": case "string": case "number": case "symbol": case "function": { return type; } } if (Array.isArray(val)) return "array"; if (isDate(val)) return "date"; if (isError(val)) return "error"; const constructorName = ctorName(val); switch (constructorName) { case "Symbol": case "Promise": case "WeakMap": case "WeakSet": case "Map": case "Set": return constructorName; } return Object.prototype.toString.call(val).slice(8, -1).toLowerCase().replace(/\s/g, ""); } function ctorName(val) { return typeof val.constructor === "function" ? val.constructor.name : null; } function isError(val) { return val instanceof Error || typeof val.message === "string" && val.constructor && typeof val.constructor.stackTraceLimit === "number"; } function isDate(val) { if (val instanceof Date) return true; return typeof val.toDateString === "function" && typeof val.getDate === "function" && typeof val.setDate === "function"; } function kindOf(val) { let typeOfVal = typeof val; if (true) { typeOfVal = miniKindOf(val); } return typeOfVal; } // src/createStore.ts function createStore(reducer, preloadedState, enhancer) { if (typeof reducer !== "function") { throw new Error( false ? 0 : `Expected the root reducer to be a function. Instead, received: '${kindOf(reducer)}'`); } if (typeof preloadedState === "function" && typeof enhancer === "function" || typeof enhancer === "function" && typeof arguments[3] === "function") { throw new Error( false ? 0 : "It looks like you are passing several store enhancers to createStore(). This is not supported. Instead, compose them together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example."); } if (typeof preloadedState === "function" && typeof enhancer === "undefined") { enhancer = preloadedState; preloadedState = void 0; } if (typeof enhancer !== "undefined") { if (typeof enhancer !== "function") { throw new Error( false ? 0 : `Expected the enhancer to be a function. Instead, received: '${kindOf(enhancer)}'`); } return enhancer(createStore)(reducer, preloadedState); } let currentReducer = reducer; let currentState = preloadedState; let currentListeners = /* @__PURE__ */ new Map(); let nextListeners = currentListeners; let listenerIdCounter = 0; let isDispatching = false; function ensureCanMutateNextListeners() { if (nextListeners === currentListeners) { nextListeners = /* @__PURE__ */ new Map(); currentListeners.forEach((listener, key) => { nextListeners.set(key, listener); }); } } function getState() { if (isDispatching) { throw new Error( false ? 0 : "You may not call store.getState() while the reducer is executing. The reducer has already received the state as an argument. Pass it down from the top reducer instead of reading it from the store."); } return currentState; } function subscribe(listener) { if (typeof listener !== "function") { throw new Error( false ? 0 : `Expected the listener to be a function. Instead, received: '${kindOf(listener)}'`); } if (isDispatching) { throw new Error( false ? 0 : "You may not call store.subscribe() while the reducer is executing. If you would like to be notified after the store has been updated, subscribe from a component and invoke store.getState() in the callback to access the latest state. See https://redux.js.org/api/store#subscribelistener for more details."); } let isSubscribed = true; ensureCanMutateNextListeners(); const listenerId = listenerIdCounter++; nextListeners.set(listenerId, listener); return function unsubscribe() { if (!isSubscribed) { return; } if (isDispatching) { throw new Error( false ? 0 : "You may not unsubscribe from a store listener while the reducer is executing. See https://redux.js.org/api/store#subscribelistener for more details."); } isSubscribed = false; ensureCanMutateNextListeners(); nextListeners.delete(listenerId); currentListeners = null; }; } function dispatch(action) { if (!isPlainObject(action)) { throw new Error( false ? 0 : `Actions must be plain objects. Instead, the actual type was: '${kindOf(action)}'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.`); } if (typeof action.type === "undefined") { throw new Error( false ? 0 : 'Actions may not have an undefined "type" property. You may have misspelled an action type string constant.'); } if (typeof action.type !== "string") { throw new Error( false ? 0 : `Action "type" property must be a string. Instead, the actual type was: '${kindOf(action.type)}'. Value was: '${action.type}' (stringified)`); } if (isDispatching) { throw new Error( false ? 0 : "Reducers may not dispatch actions."); } try { isDispatching = true; currentState = currentReducer(currentState, action); } finally { isDispatching = false; } const listeners = currentListeners = nextListeners; listeners.forEach((listener) => { listener(); }); return action; } function replaceReducer(nextReducer) { if (typeof nextReducer !== "function") { throw new Error( false ? 0 : `Expected the nextReducer to be a function. Instead, received: '${kindOf(nextReducer)}`); } currentReducer = nextReducer; dispatch({ type: actionTypes_default.REPLACE }); } function observable() { const outerSubscribe = subscribe; return { /** * The minimal observable subscription method. * @param observer Any object that can be used as an observer. * The observer object should have a `next` method. * @returns An object with an `unsubscribe` method that can * be used to unsubscribe the observable from the store, and prevent further * emission of values from the observable. */ subscribe(observer) { if (typeof observer !== "object" || observer === null) { throw new Error( false ? 0 : `Expected the observer to be an object. Instead, received: '${kindOf(observer)}'`); } function observeState() { const observerAsObserver = observer; if (observerAsObserver.next) { observerAsObserver.next(getState()); } } observeState(); const unsubscribe = outerSubscribe(observeState); return { unsubscribe }; }, [symbol_observable_default]() { return this; } }; } dispatch({ type: actionTypes_default.INIT }); const store = { dispatch, subscribe, getState, replaceReducer, [symbol_observable_default]: observable }; return store; } function legacy_createStore(reducer, preloadedState, enhancer) { return createStore(reducer, preloadedState, enhancer); } // src/utils/warning.ts function warning(message) { if (typeof console !== "undefined" && typeof console.error === "function") { console.error(message); } try { throw new Error(message); } catch (e) { } } // src/combineReducers.ts function getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) { const reducerKeys = Object.keys(reducers); const argumentName = action && action.type === actionTypes_default.INIT ? "preloadedState argument passed to createStore" : "previous state received by the reducer"; if (reducerKeys.length === 0) { return "Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers."; } if (!isPlainObject(inputState)) { return `The ${argumentName} has unexpected type of "${kindOf(inputState)}". Expected argument to be an object with the following keys: "${reducerKeys.join('", "')}"`; } const unexpectedKeys = Object.keys(inputState).filter((key) => !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key]); unexpectedKeys.forEach((key) => { unexpectedKeyCache[key] = true; }); if (action && action.type === actionTypes_default.REPLACE) return; if (unexpectedKeys.length > 0) { return `Unexpected ${unexpectedKeys.length > 1 ? "keys" : "key"} "${unexpectedKeys.join('", "')}" found in ${argumentName}. Expected to find one of the known reducer keys instead: "${reducerKeys.join('", "')}". Unexpected keys will be ignored.`; } } function assertReducerShape(reducers) { Object.keys(reducers).forEach((key) => { const reducer = reducers[key]; const initialState = reducer(void 0, { type: actionTypes_default.INIT }); if (typeof initialState === "undefined") { throw new Error( false ? 0 : `The slice reducer for key "${key}" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.`); } if (typeof reducer(void 0, { type: actionTypes_default.PROBE_UNKNOWN_ACTION() }) === "undefined") { throw new Error( false ? 0 : `The slice reducer for key "${key}" returned undefined when probed with a random type. Don't try to handle '${actionTypes_default.INIT}' or other actions in "redux/*" namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined, but can be null.`); } }); } function combineReducers(reducers) { const reducerKeys = Object.keys(reducers); const finalReducers = {}; for (let i = 0; i < reducerKeys.length; i++) { const key = reducerKeys[i]; if (true) { if (typeof reducers[key] === "undefined") { warning(`No reducer provided for key "${key}"`); } } if (typeof reducers[key] === "function") { finalReducers[key] = reducers[key]; } } const finalReducerKeys = Object.keys(finalReducers); let unexpectedKeyCache; if (true) { unexpectedKeyCache = {}; } let shapeAssertionError; try { assertReducerShape(finalReducers); } catch (e) { shapeAssertionError = e; } return function combination(state = {}, action) { if (shapeAssertionError) { throw shapeAssertionError; } if (true) { const warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache); if (warningMessage) { warning(warningMessage); } } let hasChanged = false; const nextState = {}; for (let i = 0; i < finalReducerKeys.length; i++) { const key = finalReducerKeys[i]; const reducer = finalReducers[key]; const previousStateForKey = state[key]; const nextStateForKey = reducer(previousStateForKey, action); if (typeof nextStateForKey === "undefined") { const actionType = action && action.type; throw new Error( false ? 0 : `When called with an action of type ${actionType ? `"${String(actionType)}"` : "(unknown type)"}, the slice reducer for key "${key}" returned undefined. To ignore an action, you must explicitly return the previous state. If you want this reducer to hold no value, you can return null instead of undefined.`); } nextState[key] = nextStateForKey; hasChanged = hasChanged || nextStateForKey !== previousStateForKey; } hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length; return hasChanged ? nextState : state; }; } // src/bindActionCreators.ts function bindActionCreator(actionCreator, dispatch) { return function(...args) { return dispatch(actionCreator.apply(this, args)); }; } function bindActionCreators(actionCreators, dispatch) { if (typeof actionCreators === "function") { return bindActionCreator(actionCreators, dispatch); } if (typeof actionCreators !== "object" || actionCreators === null) { throw new Error( false ? 0 : `bindActionCreators expected an object or a function, but instead received: '${kindOf(actionCreators)}'. Did you write "import ActionCreators from" instead of "import * as ActionCreators from"?`); } const boundActionCreators = {}; for (const key in actionCreators) { const actionCreator = actionCreators[key]; if (typeof actionCreator === "function") { boundActionCreators[key] = bindActionCreator(actionCreator, dispatch); } } return boundActionCreators; } // src/compose.ts function compose(...funcs) { if (funcs.length === 0) { return (arg) => arg; } if (funcs.length === 1) { return funcs[0]; } return funcs.reduce((a, b) => (...args) => a(b(...args))); } // src/applyMiddleware.ts function applyMiddleware(...middlewares) { return (createStore2) => (reducer, preloadedState) => { const store = createStore2(reducer, preloadedState); let dispatch = () => { throw new Error( false ? 0 : "Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch."); }; const middlewareAPI = { getState: store.getState, dispatch: (action, ...args) => dispatch(action, ...args) }; const chain = middlewares.map((middleware) => middleware(middlewareAPI)); dispatch = compose(...chain)(store.dispatch); return { ...store, dispatch }; }; } // src/utils/isAction.ts function isAction(action) { return isPlainObject(action) && "type" in action && typeof action.type === "string"; } //# sourceMappingURL=redux.mjs.map /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfcmVjaGFydHNfZXM2X3V0aWxfQmFyVXRpbHNfanMtbm9kZV9tb2R1bGVzX3JlY2hhcnRzX2VzNl91dGlsX0Nzc1ByZWZpeFV0LTA4ODNjOS52b2x1bnRlZXJhcGkuN2NjNjllMmI4YTc1YzhmNjdmOTIuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0Esc0JBQXNCLDJCQUEyQixvR0FBb0csbUJBQW1CLGlCQUFpQixzSEFBc0g7QUFDL1Msc0RBQXNELCtCQUErQiw4REFBOEQsWUFBWSxvQ0FBb0MsNkRBQTZELFlBQVksNkJBQTZCLE9BQU8sMkJBQTJCLDBDQUEwQyx3RUFBd0UsK0JBQStCO0FBQzVkLDJEQUEyRCwrQkFBK0IsaUJBQWlCLDBCQUEwQix5REFBeUQsMENBQTBDLCtCQUErQjtBQUN2USx5QkFBeUIsd0JBQXdCLG9DQUFvQyx5Q0FBeUMsa0NBQWtDLDBEQUEwRCwwQkFBMEI7QUFDcFAsNEJBQTRCLGdCQUFnQixzQkFBc0IsT0FBTyxrREFBa0Qsc0RBQXNELDhCQUE4QixtSkFBbUoscUVBQXFFLEtBQUs7QUFDNWEsNENBQTRDLDJCQUEyQixrQkFBa0Isa0NBQWtDLG9FQUFvRSxLQUFLLE9BQU8sb0JBQW9CO0FBQy9OLDZCQUE2QixtQ0FBbUM7QUFDaEUsOEJBQThCLDRDQUE0QywrQkFBK0Isb0JBQW9CLG1DQUFtQyxzQ0FBc0MsdUVBQXVFO0FBQ2pOO0FBQ2pCO0FBQ007QUFDUjtBQUNKO0FBQ1U7QUFDQTtBQUNOO0FBQ0U7QUFDQTs7QUFFM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLDBEQUFtQixDQUFDLHVEQUFTO0FBQ3ZEO0FBQ0Es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LG9CQUFvQixNQUFxQyxHQUFHLENBQTBCLGtGQUFrRix1QkFBdUI7QUFDL0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixNQUFxQyxHQUFHLENBQTBCO0FBQ3hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBV0U7QUFDRiIsInNvdXJjZXMiOlsid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi91dGlsL0FjdGl2ZVNoYXBlVXRpbHMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L3V0aWwvQmFyVXRpbHMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L3V0aWwvQ2FydGVzaWFuVXRpbHMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L3V0aWwvQ2hhcnRVdGlscy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvdXRpbC9Dc3NQcmVmaXhVdGlscy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvdXRpbC9ET01VdGlscy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvdXRpbC9EYXRhVXRpbHMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L3V0aWwvRGV0ZWN0UmVmZXJlbmNlRWxlbWVudHNEb21haW4uanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L3V0aWwvRXZlbnRzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi91dGlsL0dsb2JhbC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvdXRpbC9JZk92ZXJmbG93TWF0Y2hlcy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvdXRpbC9Mb2dVdGlscy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvdXRpbC9Qb2xhclV0aWxzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi91dGlsL1JlYWN0VXRpbHMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L3V0aWwvUmVkdWNlQ1NTQ2FsYy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvdXRpbC9TaGFsbG93RXF1YWwuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L3V0aWwvVGlja1V0aWxzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi91dGlsL2NhbGN1bGF0ZVZpZXdCb3guanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L3V0aWwvY3Vyc29yL2dldEN1cnNvclBvaW50cy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvdXRpbC9jdXJzb3IvZ2V0Q3Vyc29yUmVjdGFuZ2xlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi91dGlsL2N1cnNvci9nZXRSYWRpYWxDdXJzb3JQb2ludHMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L3V0aWwvZ2V0RXZlcnlOdGhXaXRoQ29uZGl0aW9uLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi91dGlsL2dldExlZ2VuZFByb3BzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi91dGlsL2lzRG9tYWluU3BlY2lmaWVkQnlVc2VyLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi91dGlsL3BheWxvYWQvZ2V0VW5pcVBheWxvYWQuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L3V0aWwvdG9vbHRpcC90cmFuc2xhdGUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L3V0aWwvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVkdXgtdGh1bmsvZGlzdC9yZWR1eC10aHVuay5tanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVkdXgvZGlzdC9yZWR1eC5tanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9leGNsdWRlZCA9IFtcIm9wdGlvblwiLCBcInNoYXBlVHlwZVwiLCBcInByb3BUcmFuc2Zvcm1lclwiLCBcImFjdGl2ZUNsYXNzTmFtZVwiLCBcImlzQWN0aXZlXCJdO1xuZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG5pbXBvcnQgUmVhY3QsIHsgaXNWYWxpZEVsZW1lbnQsIGNsb25lRWxlbWVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJ2xvZGFzaC9pc0Z1bmN0aW9uJztcbmltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJ2xvZGFzaC9pc1BsYWluT2JqZWN0JztcbmltcG9ydCBpc0Jvb2xlYW4gZnJvbSAnbG9kYXNoL2lzQm9vbGVhbic7XG5pbXBvcnQgaXNFcXVhbCBmcm9tICdsb2Rhc2gvaXNFcXVhbCc7XG5pbXBvcnQgeyBSZWN0YW5nbGUgfSBmcm9tICcuLi9zaGFwZS9SZWN0YW5nbGUnO1xuaW1wb3J0IHsgVHJhcGV6b2lkIH0gZnJvbSAnLi4vc2hhcGUvVHJhcGV6b2lkJztcbmltcG9ydCB7IFNlY3RvciB9IGZyb20gJy4uL3NoYXBlL1NlY3Rvcic7XG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4uL2NvbnRhaW5lci9MYXllcic7XG5pbXBvcnQgeyBTeW1ib2xzIH0gZnJvbSAnLi4vc2hhcGUvU3ltYm9scyc7XG5cbi8qKlxuICogVGhpcyBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgcmVuZGVyaW5nIGEgdXNlciBkZWZpbmVkIHByb3AgZm9yIGEgY3VzdG9taXplZCBzaGFwZSBpbiBzZXZlcmFsIGZvcm1zLlxuICpcbiAqIDxTaGFwZSAvPiBpcyB0aGUgcm9vdCBhbmQgd2lsbCBoYW5kbGUgdGFraW5nIGluOlxuICogIC0gYW4gb2JqZWN0IG9mIHN2ZyBwcm9wZXJ0aWVzXG4gKiAgLSBhIGJvb2xlYW5cbiAqICAtIGEgcmVuZGVyIHByb3AoaW5saW5lIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBqc3gpXG4gKiAgLSBhIHJlYWN0IGVsZW1lbnRcbiAqXG4gKiA8U2hhcGVTZWxlY3RvciAvPiBpcyBhIHN1YmNvbXBvbmVudCBvZiA8U2hhcGUgLz4gYW5kIHVzZWQgdG8gbWF0Y2ggYSBjb21wb25lbnRcbiAqIHRvIHRoZSB2YWx1ZSBvZiBwcm9wcy5zaGFwZVR5cGUgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHJvb3QuXG4gKlxuICovXG5cbmZ1bmN0aW9uIGRlZmF1bHRQcm9wVHJhbnNmb3JtZXIob3B0aW9uLCBwcm9wcykge1xuICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIG9wdGlvbik7XG59XG5mdW5jdGlvbiBpc1N5bWJvbHNQcm9wcyhzaGFwZVR5cGUsIF9lbGVtZW50UHJvcHMpIHtcbiAgcmV0dXJuIHNoYXBlVHlwZSA9PT0gJ3N5bWJvbHMnO1xufVxuZnVuY3Rpb24gU2hhcGVTZWxlY3RvcihfcmVmKSB7XG4gIHZhciBzaGFwZVR5cGUgPSBfcmVmLnNoYXBlVHlwZSxcbiAgICBlbGVtZW50UHJvcHMgPSBfcmVmLmVsZW1lbnRQcm9wcztcbiAgc3dpdGNoIChzaGFwZVR5cGUpIHtcbiAgICBjYXNlICdyZWN0YW5nbGUnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlY3RhbmdsZSwgZWxlbWVudFByb3BzKTtcbiAgICBjYXNlICd0cmFwZXpvaWQnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyYXBlem9pZCwgZWxlbWVudFByb3BzKTtcbiAgICBjYXNlICdzZWN0b3InOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNlY3RvciwgZWxlbWVudFByb3BzKTtcbiAgICBjYXNlICdzeW1ib2xzJzpcbiAgICAgIGlmIChpc1N5bWJvbHNQcm9wcyhzaGFwZVR5cGUsIGVsZW1lbnRQcm9wcykpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN5bWJvbHMsIGVsZW1lbnRQcm9wcyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9wc0Zyb21TaGFwZU9wdGlvbihvcHRpb24pIHtcbiAgaWYgKCAvKiNfX1BVUkVfXyovaXNWYWxpZEVsZW1lbnQob3B0aW9uKSkge1xuICAgIHJldHVybiBvcHRpb24ucHJvcHM7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBTaGFwZShfcmVmMikge1xuICB2YXIgb3B0aW9uID0gX3JlZjIub3B0aW9uLFxuICAgIHNoYXBlVHlwZSA9IF9yZWYyLnNoYXBlVHlwZSxcbiAgICBfcmVmMiRwcm9wVHJhbnNmb3JtZXIgPSBfcmVmMi5wcm9wVHJhbnNmb3JtZXIsXG4gICAgcHJvcFRyYW5zZm9ybWVyID0gX3JlZjIkcHJvcFRyYW5zZm9ybWVyID09PSB2b2lkIDAgPyBkZWZhdWx0UHJvcFRyYW5zZm9ybWVyIDogX3JlZjIkcHJvcFRyYW5zZm9ybWVyLFxuICAgIF9yZWYyJGFjdGl2ZUNsYXNzTmFtZSA9IF9yZWYyLmFjdGl2ZUNsYXNzTmFtZSxcbiAgICBhY3RpdmVDbGFzc05hbWUgPSBfcmVmMiRhY3RpdmVDbGFzc05hbWUgPT09IHZvaWQgMCA/ICdyZWNoYXJ0cy1hY3RpdmUtc2hhcGUnIDogX3JlZjIkYWN0aXZlQ2xhc3NOYW1lLFxuICAgIGlzQWN0aXZlID0gX3JlZjIuaXNBY3RpdmUsXG4gICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIsIF9leGNsdWRlZCk7XG4gIHZhciBzaGFwZTtcbiAgaWYgKCAvKiNfX1BVUkVfXyovaXNWYWxpZEVsZW1lbnQob3B0aW9uKSkge1xuICAgIHNoYXBlID0gLyojX19QVVJFX18qL2Nsb25lRWxlbWVudChvcHRpb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCBnZXRQcm9wc0Zyb21TaGFwZU9wdGlvbihvcHRpb24pKSk7XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihvcHRpb24pKSB7XG4gICAgc2hhcGUgPSBvcHRpb24ocHJvcHMpO1xuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qob3B0aW9uKSAmJiAhaXNCb29sZWFuKG9wdGlvbikpIHtcbiAgICB2YXIgbmV4dFByb3BzID0gcHJvcFRyYW5zZm9ybWVyKG9wdGlvbiwgcHJvcHMpO1xuICAgIHNoYXBlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2hhcGVTZWxlY3Rvciwge1xuICAgICAgc2hhcGVUeXBlOiBzaGFwZVR5cGUsXG4gICAgICBlbGVtZW50UHJvcHM6IG5leHRQcm9wc1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHZhciBlbGVtZW50UHJvcHMgPSBwcm9wcztcbiAgICBzaGFwZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNoYXBlU2VsZWN0b3IsIHtcbiAgICAgIHNoYXBlVHlwZTogc2hhcGVUeXBlLFxuICAgICAgZWxlbWVudFByb3BzOiBlbGVtZW50UHJvcHNcbiAgICB9KTtcbiAgfVxuICBpZiAoaXNBY3RpdmUpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGF5ZXIsIHtcbiAgICAgIGNsYXNzTmFtZTogYWN0aXZlQ2xhc3NOYW1lXG4gICAgfSwgc2hhcGUpO1xuICB9XG4gIHJldHVybiBzaGFwZTtcbn1cblxuLyoqXG4gKiBUaGlzIGlzIGFuIGFic3RyYWN0aW9uIHRvIGhhbmRsZSBpZGVudGlmeWluZyB0aGUgYWN0aXZlIGluZGV4IGZyb20gYSB0b29sdGlwIG1vdXNlIGludGVyYWN0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVubmVsKGdyYXBoaWNhbEl0ZW0sIF9pdGVtKSB7XG4gIHJldHVybiBfaXRlbSAhPSBudWxsICYmICd0cmFwZXpvaWRzJyBpbiBncmFwaGljYWxJdGVtLnByb3BzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUGllKGdyYXBoaWNhbEl0ZW0sIF9pdGVtKSB7XG4gIHJldHVybiBfaXRlbSAhPSBudWxsICYmICdzZWN0b3JzJyBpbiBncmFwaGljYWxJdGVtLnByb3BzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NhdHRlcihncmFwaGljYWxJdGVtLCBfaXRlbSkge1xuICByZXR1cm4gX2l0ZW0gIT0gbnVsbCAmJiAncG9pbnRzJyBpbiBncmFwaGljYWxJdGVtLnByb3BzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVGdW5uZWwoc2hhcGVEYXRhLCBhY3RpdmVUb29sdGlwSXRlbSkge1xuICB2YXIgX2FjdGl2ZVRvb2x0aXBJdGVtJGxhLCBfYWN0aXZlVG9vbHRpcEl0ZW0kbGEyO1xuICB2YXIgeE1hdGNoZXMgPSBzaGFwZURhdGEueCA9PT0gKGFjdGl2ZVRvb2x0aXBJdGVtID09PSBudWxsIHx8IGFjdGl2ZVRvb2x0aXBJdGVtID09PSB2b2lkIDAgfHwgKF9hY3RpdmVUb29sdGlwSXRlbSRsYSA9IGFjdGl2ZVRvb2x0aXBJdGVtLmxhYmVsVmlld0JveCkgPT09IG51bGwgfHwgX2FjdGl2ZVRvb2x0aXBJdGVtJGxhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYWN0aXZlVG9vbHRpcEl0ZW0kbGEueCkgfHwgc2hhcGVEYXRhLnggPT09IGFjdGl2ZVRvb2x0aXBJdGVtLng7XG4gIHZhciB5TWF0Y2hlcyA9IHNoYXBlRGF0YS55ID09PSAoYWN0aXZlVG9vbHRpcEl0ZW0gPT09IG51bGwgfHwgYWN0aXZlVG9vbHRpcEl0ZW0gPT09IHZvaWQgMCB8fCAoX2FjdGl2ZVRvb2x0aXBJdGVtJGxhMiA9IGFjdGl2ZVRvb2x0aXBJdGVtLmxhYmVsVmlld0JveCkgPT09IG51bGwgfHwgX2FjdGl2ZVRvb2x0aXBJdGVtJGxhMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FjdGl2ZVRvb2x0aXBJdGVtJGxhMi55KSB8fCBzaGFwZURhdGEueSA9PT0gYWN0aXZlVG9vbHRpcEl0ZW0ueTtcbiAgcmV0dXJuIHhNYXRjaGVzICYmIHlNYXRjaGVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVQaWUoc2hhcGVEYXRhLCBhY3RpdmVUb29sdGlwSXRlbSkge1xuICB2YXIgc3RhcnRBbmdsZU1hdGNoZXMgPSBzaGFwZURhdGEuZW5kQW5nbGUgPT09IGFjdGl2ZVRvb2x0aXBJdGVtLmVuZEFuZ2xlO1xuICB2YXIgZW5kQW5nbGVNYXRjaGVzID0gc2hhcGVEYXRhLnN0YXJ0QW5nbGUgPT09IGFjdGl2ZVRvb2x0aXBJdGVtLnN0YXJ0QW5nbGU7XG4gIHJldHVybiBzdGFydEFuZ2xlTWF0Y2hlcyAmJiBlbmRBbmdsZU1hdGNoZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZVNjYXR0ZXIoc2hhcGVEYXRhLCBhY3RpdmVUb29sdGlwSXRlbSkge1xuICB2YXIgeE1hdGNoZXMgPSBzaGFwZURhdGEueCA9PT0gYWN0aXZlVG9vbHRpcEl0ZW0ueDtcbiAgdmFyIHlNYXRjaGVzID0gc2hhcGVEYXRhLnkgPT09IGFjdGl2ZVRvb2x0aXBJdGVtLnk7XG4gIHZhciB6TWF0Y2hlcyA9IHNoYXBlRGF0YS56ID09PSBhY3RpdmVUb29sdGlwSXRlbS56O1xuICByZXR1cm4geE1hdGNoZXMgJiYgeU1hdGNoZXMgJiYgek1hdGNoZXM7XG59XG5mdW5jdGlvbiBnZXRDb21wYXJpc29uRm4oZ3JhcGhpY2FsSXRlbSwgYWN0aXZlSXRlbSkge1xuICB2YXIgY29tcGFyaXNvbjtcbiAgaWYgKGlzRnVubmVsKGdyYXBoaWNhbEl0ZW0sIGFjdGl2ZUl0ZW0pKSB7XG4gICAgY29tcGFyaXNvbiA9IGNvbXBhcmVGdW5uZWw7XG4gIH0gZWxzZSBpZiAoaXNQaWUoZ3JhcGhpY2FsSXRlbSwgYWN0aXZlSXRlbSkpIHtcbiAgICBjb21wYXJpc29uID0gY29tcGFyZVBpZTtcbiAgfSBlbHNlIGlmIChpc1NjYXR0ZXIoZ3JhcGhpY2FsSXRlbSwgYWN0aXZlSXRlbSkpIHtcbiAgICBjb21wYXJpc29uID0gY29tcGFyZVNjYXR0ZXI7XG4gIH1cbiAgcmV0dXJuIGNvbXBhcmlzb247XG59XG5mdW5jdGlvbiBnZXRTaGFwZURhdGFLZXkoZ3JhcGhpY2FsSXRlbSwgYWN0aXZlSXRlbSkge1xuICB2YXIgc2hhcGVLZXk7XG4gIGlmIChpc0Z1bm5lbChncmFwaGljYWxJdGVtLCBhY3RpdmVJdGVtKSkge1xuICAgIHNoYXBlS2V5ID0gJ3RyYXBlem9pZHMnO1xuICB9IGVsc2UgaWYgKGlzUGllKGdyYXBoaWNhbEl0ZW0sIGFjdGl2ZUl0ZW0pKSB7XG4gICAgc2hhcGVLZXkgPSAnc2VjdG9ycyc7XG4gIH0gZWxzZSBpZiAoaXNTY2F0dGVyKGdyYXBoaWNhbEl0ZW0sIGFjdGl2ZUl0ZW0pKSB7XG4gICAgc2hhcGVLZXkgPSAncG9pbnRzJztcbiAgfVxuICByZXR1cm4gc2hhcGVLZXk7XG59XG5mdW5jdGlvbiBnZXRBY3RpdmVTaGFwZVRvb2x0aXBQYXlsb2FkKGdyYXBoaWNhbEl0ZW0sIGFjdGl2ZUl0ZW0pIHtcbiAgaWYgKGlzRnVubmVsKGdyYXBoaWNhbEl0ZW0sIGFjdGl2ZUl0ZW0pKSB7XG4gICAgdmFyIF9hY3RpdmVJdGVtJHRvb2x0aXBQYTtcbiAgICByZXR1cm4gKF9hY3RpdmVJdGVtJHRvb2x0aXBQYSA9IGFjdGl2ZUl0ZW0udG9vbHRpcFBheWxvYWQpID09PSBudWxsIHx8IF9hY3RpdmVJdGVtJHRvb2x0aXBQYSA9PT0gdm9pZCAwIHx8IChfYWN0aXZlSXRlbSR0b29sdGlwUGEgPSBfYWN0aXZlSXRlbSR0b29sdGlwUGFbMF0pID09PSBudWxsIHx8IF9hY3RpdmVJdGVtJHRvb2x0aXBQYSA9PT0gdm9pZCAwIHx8IChfYWN0aXZlSXRlbSR0b29sdGlwUGEgPSBfYWN0aXZlSXRlbSR0b29sdGlwUGEucGF5bG9hZCkgPT09IG51bGwgfHwgX2FjdGl2ZUl0ZW0kdG9vbHRpcFBhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYWN0aXZlSXRlbSR0b29sdGlwUGEucGF5bG9hZDtcbiAgfVxuICBpZiAoaXNQaWUoZ3JhcGhpY2FsSXRlbSwgYWN0aXZlSXRlbSkpIHtcbiAgICB2YXIgX2FjdGl2ZUl0ZW0kdG9vbHRpcFBhMjtcbiAgICByZXR1cm4gKF9hY3RpdmVJdGVtJHRvb2x0aXBQYTIgPSBhY3RpdmVJdGVtLnRvb2x0aXBQYXlsb2FkKSA9PT0gbnVsbCB8fCBfYWN0aXZlSXRlbSR0b29sdGlwUGEyID09PSB2b2lkIDAgfHwgKF9hY3RpdmVJdGVtJHRvb2x0aXBQYTIgPSBfYWN0aXZlSXRlbSR0b29sdGlwUGEyWzBdKSA9PT0gbnVsbCB8fCBfYWN0aXZlSXRlbSR0b29sdGlwUGEyID09PSB2b2lkIDAgfHwgKF9hY3RpdmVJdGVtJHRvb2x0aXBQYTIgPSBfYWN0aXZlSXRlbSR0b29sdGlwUGEyLnBheWxvYWQpID09PSBudWxsIHx8IF9hY3RpdmVJdGVtJHRvb2x0aXBQYTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hY3RpdmVJdGVtJHRvb2x0aXBQYTIucGF5bG9hZDtcbiAgfVxuICBpZiAoaXNTY2F0dGVyKGdyYXBoaWNhbEl0ZW0sIGFjdGl2ZUl0ZW0pKSB7XG4gICAgcmV0dXJuIGFjdGl2ZUl0ZW0ucGF5bG9hZDtcbiAgfVxuICByZXR1cm4ge307XG59XG4vKipcbiAqXG4gKiBAcGFyYW0ge0dldEFjdGl2ZVNoYXBlSW5kZXhGb3JUb29sdGlwfSBhcmcgYW4gb2JqZWN0IG9mIGluY29taW5nIGF0dHJpYnV0ZXMgZnJvbSBUb29sdGlwXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICpcbiAqIFRvIGhhbmRsZSBwb3NzaWJsZSBkdXBsaWNhdGVzIGluIHRoZSBkYXRhIHNldCxcbiAqIG1hdGNoIGJvdGggdGhlIGRhdGEgdmFsdWUgb2YgdGhlIGFjdGl2ZSBpdGVtIHRvIGEgZGF0YSB2YWx1ZSBvbiBhIGdyYXBoIGl0ZW0sXG4gKiBhbmQgbWF0Y2ggdGhlIG1vdXNlIGNvb3JkaW5hdGVzIG9mIHRoZSBhY3RpdmUgaXRlbSB0byB0aGUgY29vcmRpbmF0ZXMgb2YgaW4gYSBwYXJ0aWN1bGFyIGNvbXBvbmVudHMgc2hhcGUgZGF0YS5cbiAqIFRoaXMgYXNzdW1lcyBlcXVhbCBsZW5ndGhzIG9mIHNoYXBlIG9iamVjdHMgdG8gZGF0YSBpdGVtcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZVNoYXBlSW5kZXhGb3JUb29sdGlwKF9yZWYzKSB7XG4gIHZhciBhY3RpdmVUb29sdGlwSXRlbSA9IF9yZWYzLmFjdGl2ZVRvb2x0aXBJdGVtLFxuICAgIGdyYXBoaWNhbEl0ZW0gPSBfcmVmMy5ncmFwaGljYWxJdGVtLFxuICAgIGl0ZW1EYXRhID0gX3JlZjMuaXRlbURhdGE7XG4gIHZhciBzaGFwZUtleSA9IGdldFNoYXBlRGF0YUtleShncmFwaGljYWxJdGVtLCBhY3RpdmVUb29sdGlwSXRlbSk7XG4gIHZhciB0b29sdGlwUGF5bG9hZCA9IGdldEFjdGl2ZVNoYXBlVG9vbHRpcFBheWxvYWQoZ3JhcGhpY2FsSXRlbSwgYWN0aXZlVG9vbHRpcEl0ZW0pO1xuICB2YXIgYWN0aXZlSXRlbU1hdGNoZXMgPSBpdGVtRGF0YS5maWx0ZXIoZnVuY3Rpb24gKGRhdHVtLCBkYXRhSW5kZXgpIHtcbiAgICB2YXIgdmFsdWVzTWF0Y2ggPSBpc0VxdWFsKHRvb2x0aXBQYXlsb2FkLCBkYXR1bSk7XG4gICAgdmFyIG1vdXNlQ29vcmRpbmF0ZU1hdGNoZXMgPSBncmFwaGljYWxJdGVtLnByb3BzW3NoYXBlS2V5XS5maWx0ZXIoZnVuY3Rpb24gKHNoYXBlRGF0YSkge1xuICAgICAgdmFyIGNvbXBhcmlzb24gPSBnZXRDb21wYXJpc29uRm4oZ3JhcGhpY2FsSXRlbSwgYWN0aXZlVG9vbHRpcEl0ZW0pO1xuICAgICAgcmV0dXJuIGNvbXBhcmlzb24oc2hhcGVEYXRhLCBhY3RpdmVUb29sdGlwSXRlbSk7XG4gICAgfSk7XG5cbiAgICAvLyBnZXQgdGhlIGxhc3QgaW5kZXggaW4gY2FzZSBvZiBtdWx0aXBsZSBtYXRjaGVzXG4gICAgdmFyIGluZGV4T2ZNb3VzZUNvb3JkaW5hdGVzID0gZ3JhcGhpY2FsSXRlbS5wcm9wc1tzaGFwZUtleV0uaW5kZXhPZihtb3VzZUNvb3JkaW5hdGVNYXRjaGVzW21vdXNlQ29vcmRpbmF0ZU1hdGNoZXMubGVuZ3RoIC0gMV0pO1xuICAgIHZhciBjb29yZGluYXRlc01hdGNoID0gZGF0YUluZGV4ID09PSBpbmRleE9mTW91c2VDb29yZGluYXRlcztcbiAgICByZXR1cm4gdmFsdWVzTWF0Y2ggJiYgY29vcmRpbmF0ZXNNYXRjaDtcbiAgfSk7XG5cbiAgLy8gZ2V0IHRoZSBsYXN0IGluZGV4IGluIGNhc2Ugb2YgbXVsdGlwbGUgbWF0Y2hlc1xuICB2YXIgYWN0aXZlSW5kZXggPSBpdGVtRGF0YS5pbmRleE9mKGFjdGl2ZUl0ZW1NYXRjaGVzW2FjdGl2ZUl0ZW1NYXRjaGVzLmxlbmd0aCAtIDFdKTtcbiAgcmV0dXJuIGFjdGl2ZUluZGV4O1xufSIsInZhciBfZXhjbHVkZWQgPSBbXCJ4XCIsIFwieVwiXTtcbmZ1bmN0aW9uIF90eXBlb2YobykgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9IDogZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87IH0sIF90eXBlb2Yobyk7IH1cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7IHZhciBrZXksIGk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGludmFyaWFudCBmcm9tICd0aW55LWludmFyaWFudCc7XG5pbXBvcnQgeyBTaGFwZSB9IGZyb20gJy4vQWN0aXZlU2hhcGVVdGlscyc7XG5cbi8vIFJlY3RhbmdsZSBwcm9wcyBpcyBleHBlY3RpbmcgeCwgeSwgaGVpZ2h0LCB3aWR0aCBhcyBudW1iZXJzLCBuYW1lIGFzIGEgc3RyaW5nLCBhbmQgcmFkaXVzIGFzIGEgY3VzdG9tIHR5cGVcbi8vIFdoZW4gcHJvcHMgYXJlIGJlaW5nIHNwcmVhZCBpbiBmcm9tIGEgdXNlciBkZWZpbmVkIGNvbXBvbmVudCBpbiBCYXIsXG4vLyB0aGUgcHJvcCB0eXBlcyBvZiBhbiBTVkdFbGVtZW50IGhhdmUgdGhlc2UgdHlwZWQgYXMgc29tZXRoaW5nIGVsc2UuXG4vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBwYXNzZWQgaW4gcHJvcHNcbi8vIGFsb25nIHdpdGggeCwgeSwgaGVpZ2h0IGFzIG51bWJlcnMsIG5hbWUgYXMgYSBzdHJpbmcsIGFuZCByYWRpdXMgYXMgbnVtYmVyIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl1cbmZ1bmN0aW9uIHR5cGVndWFyZEJhclJlY3RhbmdsZVByb3BzKF9yZWYsIHByb3BzKSB7XG4gIHZhciB4UHJvcCA9IF9yZWYueCxcbiAgICB5UHJvcCA9IF9yZWYueSxcbiAgICBvcHRpb24gPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgdmFyIHhWYWx1ZSA9IFwiXCIuY29uY2F0KHhQcm9wKTtcbiAgdmFyIHggPSBwYXJzZUludCh4VmFsdWUsIDEwKTtcbiAgdmFyIHlWYWx1ZSA9IFwiXCIuY29uY2F0KHlQcm9wKTtcbiAgdmFyIHkgPSBwYXJzZUludCh5VmFsdWUsIDEwKTtcbiAgdmFyIGhlaWdodFZhbHVlID0gXCJcIi5jb25jYXQocHJvcHMuaGVpZ2h0IHx8IG9wdGlvbi5oZWlnaHQpO1xuICB2YXIgaGVpZ2h0ID0gcGFyc2VJbnQoaGVpZ2h0VmFsdWUsIDEwKTtcbiAgdmFyIHdpZHRoVmFsdWUgPSBcIlwiLmNvbmNhdChwcm9wcy53aWR0aCB8fCBvcHRpb24ud2lkdGgpO1xuICB2YXIgd2lkdGggPSBwYXJzZUludCh3aWR0aFZhbHVlLCAxMCk7XG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwgb3B0aW9uKSwgeCA/IHtcbiAgICB4OiB4XG4gIH0gOiB7fSksIHkgPyB7XG4gICAgeTogeVxuICB9IDoge30pLCB7fSwge1xuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBuYW1lOiBwcm9wcy5uYW1lLFxuICAgIHJhZGl1czogcHJvcHMucmFkaXVzXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEJhclJlY3RhbmdsZShwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2hhcGUsIF9leHRlbmRzKHtcbiAgICBzaGFwZVR5cGU6IFwicmVjdGFuZ2xlXCIsXG4gICAgcHJvcFRyYW5zZm9ybWVyOiB0eXBlZ3VhcmRCYXJSZWN0YW5nbGVQcm9wcyxcbiAgICBhY3RpdmVDbGFzc05hbWU6IFwicmVjaGFydHMtYWN0aXZlLWJhclwiXG4gIH0sIHByb3BzKSk7XG59XG4vKipcbiAqIFNhZmVseSBnZXRzIG1pblBvaW50U2l6ZSBmcm9tIGZyb20gdGhlIG1pblBvaW50U2l6ZSBwcm9wIGlmIGl0IGlzIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSBtaW5Qb2ludFNpemUgbWluUG9pbnRTaXplIGFzIHBhc3NlZCB0byB0aGUgQmFyIGNvbXBvbmVudFxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBkZWZhdWx0IG1pblBvaW50U2l6ZVxuICogQHJldHVybnMgbWluUG9pbnRTaXplXG4gKi9cbmV4cG9ydCB2YXIgbWluUG9pbnRTaXplQ2FsbGJhY2sgPSBmdW5jdGlvbiBtaW5Qb2ludFNpemVDYWxsYmFjayhtaW5Qb2ludFNpemUpIHtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSwgaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIG1pblBvaW50U2l6ZSA9PT0gJ251bWJlcicpIHJldHVybiBtaW5Qb2ludFNpemU7XG4gICAgdmFyIGlzVmFsdWVOdW1iZXIgPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xuICAgIGlmIChpc1ZhbHVlTnVtYmVyKSB7XG4gICAgICByZXR1cm4gbWluUG9pbnRTaXplKHZhbHVlLCBpbmRleCk7XG4gICAgfVxuICAgICFpc1ZhbHVlTnVtYmVyID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCBcIm1pblBvaW50U2l6ZSBjYWxsYmFjayBmdW5jdGlvbiByZWNlaXZlZCBhIHZhbHVlIHdpdGggdHlwZSBvZiBcIi5jb25jYXQoX3R5cGVvZih2YWx1ZSksIFwiLiBDdXJyZW50bHkgb25seSBudW1iZXJzIGFyZSBzdXBwb3J0ZWQuXCIpKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgfTtcbn07IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgX3RvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTsgfSB9XG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbmltcG9ydCBtYXBWYWx1ZXMgZnJvbSAnbG9kYXNoL21hcFZhbHVlcyc7XG5pbXBvcnQgZXZlcnkgZnJvbSAnbG9kYXNoL2V2ZXJ5JztcbmltcG9ydCB7IGdldFRpY2tzT2ZTY2FsZSwgcGFyc2VTY2FsZSwgY2hlY2tEb21haW5PZlNjYWxlLCBnZXRCYW5kU2l6ZU9mQXhpcyB9IGZyb20gJy4vQ2hhcnRVdGlscyc7XG5pbXBvcnQgeyBmaW5kQ2hpbGRCeVR5cGUgfSBmcm9tICcuL1JlYWN0VXRpbHMnO1xuaW1wb3J0IHsgZ2V0UGVyY2VudFZhbHVlIH0gZnJvbSAnLi9EYXRhVXRpbHMnO1xuaW1wb3J0IHsgQmFyIH0gZnJvbSAnLi4vY2FydGVzaWFuL0Jhcic7XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBzY2FsZSBmdW5jdGlvbiwgcG9zaXRpb24sIHdpZHRoLCBoZWlnaHQgb2YgYXhlc1xuICogQHBhcmFtICB7T2JqZWN0fSBwcm9wcyAgICAgTGF0ZXN0IHByb3BzXG4gKiBAcGFyYW0gIHtPYmplY3R9IGF4aXNNYXAgICBUaGUgY29uZmlndXJhdGlvbiBvZiBheGVzXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9mZnNldCAgICBUaGUgb2Zmc2V0IG9mIG1haW4gcGFydCBpbiB0aGUgc3ZnIGVsZW1lbnRcbiAqIEBwYXJhbSAge1N0cmluZ30gYXhpc1R5cGUgIFRoZSB0eXBlIG9mIGF4ZXMsIHgtYXhpcyBvciB5LWF4aXNcbiAqIEBwYXJhbSAge1N0cmluZ30gY2hhcnROYW1lIFRoZSBuYW1lIG9mIGNoYXJ0XG4gKiBAcmV0dXJuIHtPYmplY3R9IENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IHZhciBmb3JtYXRBeGlzTWFwID0gZnVuY3Rpb24gZm9ybWF0QXhpc01hcChwcm9wcywgYXhpc01hcCwgb2Zmc2V0LCBheGlzVHlwZSwgY2hhcnROYW1lKSB7XG4gIHZhciB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICBsYXlvdXQgPSBwcm9wcy5sYXlvdXQsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGlkcyA9IE9iamVjdC5rZXlzKGF4aXNNYXApO1xuICB2YXIgc3RlcHMgPSB7XG4gICAgbGVmdDogb2Zmc2V0LmxlZnQsXG4gICAgbGVmdE1pcnJvcjogb2Zmc2V0LmxlZnQsXG4gICAgcmlnaHQ6IHdpZHRoIC0gb2Zmc2V0LnJpZ2h0LFxuICAgIHJpZ2h0TWlycm9yOiB3aWR0aCAtIG9mZnNldC5yaWdodCxcbiAgICB0b3A6IG9mZnNldC50b3AsXG4gICAgdG9wTWlycm9yOiBvZmZzZXQudG9wLFxuICAgIGJvdHRvbTogaGVpZ2h0IC0gb2Zmc2V0LmJvdHRvbSxcbiAgICBib3R0b21NaXJyb3I6IGhlaWdodCAtIG9mZnNldC5ib3R0b21cbiAgfTtcbiAgdmFyIGhhc0JhciA9ICEhZmluZENoaWxkQnlUeXBlKGNoaWxkcmVuLCBCYXIpO1xuICByZXR1cm4gaWRzLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBpZCkge1xuICAgIHZhciBheGlzID0gYXhpc01hcFtpZF07XG4gICAgdmFyIG9yaWVudGF0aW9uID0gYXhpcy5vcmllbnRhdGlvbixcbiAgICAgIGRvbWFpbiA9IGF4aXMuZG9tYWluLFxuICAgICAgX2F4aXMkcGFkZGluZyA9IGF4aXMucGFkZGluZyxcbiAgICAgIHBhZGRpbmcgPSBfYXhpcyRwYWRkaW5nID09PSB2b2lkIDAgPyB7fSA6IF9heGlzJHBhZGRpbmcsXG4gICAgICBtaXJyb3IgPSBheGlzLm1pcnJvcixcbiAgICAgIHJldmVyc2VkID0gYXhpcy5yZXZlcnNlZDtcbiAgICB2YXIgb2Zmc2V0S2V5ID0gXCJcIi5jb25jYXQob3JpZW50YXRpb24pLmNvbmNhdChtaXJyb3IgPyAnTWlycm9yJyA6ICcnKTtcbiAgICB2YXIgY2FsY3VsYXRlZFBhZGRpbmcsIHJhbmdlLCB4LCB5LCBuZWVkU3BhY2U7XG4gICAgaWYgKGF4aXMudHlwZSA9PT0gJ251bWJlcicgJiYgKGF4aXMucGFkZGluZyA9PT0gJ2dhcCcgfHwgYXhpcy5wYWRkaW5nID09PSAnbm8tZ2FwJykpIHtcbiAgICAgIHZhciBkaWZmID0gZG9tYWluWzFdIC0gZG9tYWluWzBdO1xuICAgICAgdmFyIHNtYWxsZXN0RGlzdGFuY2VCZXR3ZWVuVmFsdWVzID0gSW5maW5pdHk7XG4gICAgICB2YXIgc29ydGVkVmFsdWVzID0gYXhpcy5jYXRlZ29yaWNhbERvbWFpbi5zb3J0KCk7XG4gICAgICBzb3J0ZWRWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgICBzbWFsbGVzdERpc3RhbmNlQmV0d2VlblZhbHVlcyA9IE1hdGgubWluKCh2YWx1ZSB8fCAwKSAtIChzb3J0ZWRWYWx1ZXNbaW5kZXggLSAxXSB8fCAwKSwgc21hbGxlc3REaXN0YW5jZUJldHdlZW5WYWx1ZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoc21hbGxlc3REaXN0YW5jZUJldHdlZW5WYWx1ZXMpKSB7XG4gICAgICAgIHZhciBzbWFsbGVzdERpc3RhbmNlSW5QZXJjZW50ID0gc21hbGxlc3REaXN0YW5jZUJldHdlZW5WYWx1ZXMgLyBkaWZmO1xuICAgICAgICB2YXIgcmFuZ2VXaWR0aCA9IGF4aXMubGF5b3V0ID09PSAndmVydGljYWwnID8gb2Zmc2V0LmhlaWdodCA6IG9mZnNldC53aWR0aDtcbiAgICAgICAgaWYgKGF4aXMucGFkZGluZyA9PT0gJ2dhcCcpIHtcbiAgICAgICAgICBjYWxjdWxhdGVkUGFkZGluZyA9IHNtYWxsZXN0RGlzdGFuY2VJblBlcmNlbnQgKiByYW5nZVdpZHRoIC8gMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXhpcy5wYWRkaW5nID09PSAnbm8tZ2FwJykge1xuICAgICAgICAgIHZhciBnYXAgPSBnZXRQZXJjZW50VmFsdWUocHJvcHMuYmFyQ2F0ZWdvcnlHYXAsIHNtYWxsZXN0RGlzdGFuY2VJblBlcmNlbnQgKiByYW5nZVdpZHRoKTtcbiAgICAgICAgICB2YXIgaGFsZkJhbmQgPSBzbWFsbGVzdERpc3RhbmNlSW5QZXJjZW50ICogcmFuZ2VXaWR0aCAvIDI7XG4gICAgICAgICAgY2FsY3VsYXRlZFBhZGRpbmcgPSBoYWxmQmFuZCAtIGdhcCAtIChoYWxmQmFuZCAtIGdhcCkgLyByYW5nZVdpZHRoICogZ2FwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChheGlzVHlwZSA9PT0gJ3hBeGlzJykge1xuICAgICAgcmFuZ2UgPSBbb2Zmc2V0LmxlZnQgKyAocGFkZGluZy5sZWZ0IHx8IDApICsgKGNhbGN1bGF0ZWRQYWRkaW5nIHx8IDApLCBvZmZzZXQubGVmdCArIG9mZnNldC53aWR0aCAtIChwYWRkaW5nLnJpZ2h0IHx8IDApIC0gKGNhbGN1bGF0ZWRQYWRkaW5nIHx8IDApXTtcbiAgICB9IGVsc2UgaWYgKGF4aXNUeXBlID09PSAneUF4aXMnKSB7XG4gICAgICByYW5nZSA9IGxheW91dCA9PT0gJ2hvcml6b250YWwnID8gW29mZnNldC50b3AgKyBvZmZzZXQuaGVpZ2h0IC0gKHBhZGRpbmcuYm90dG9tIHx8IDApLCBvZmZzZXQudG9wICsgKHBhZGRpbmcudG9wIHx8IDApXSA6IFtvZmZzZXQudG9wICsgKHBhZGRpbmcudG9wIHx8IDApICsgKGNhbGN1bGF0ZWRQYWRkaW5nIHx8IDApLCBvZmZzZXQudG9wICsgb2Zmc2V0LmhlaWdodCAtIChwYWRkaW5nLmJvdHRvbSB8fCAwKSAtIChjYWxjdWxhdGVkUGFkZGluZyB8fCAwKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlID0gYXhpcy5yYW5nZTtcbiAgICB9XG4gICAgaWYgKHJldmVyc2VkKSB7XG4gICAgICByYW5nZSA9IFtyYW5nZVsxXSwgcmFuZ2VbMF1dO1xuICAgIH1cbiAgICB2YXIgX3BhcnNlU2NhbGUgPSBwYXJzZVNjYWxlKGF4aXMsIGNoYXJ0TmFtZSwgaGFzQmFyKSxcbiAgICAgIHNjYWxlID0gX3BhcnNlU2NhbGUuc2NhbGUsXG4gICAgICByZWFsU2NhbGVUeXBlID0gX3BhcnNlU2NhbGUucmVhbFNjYWxlVHlwZTtcbiAgICBzY2FsZS5kb21haW4oZG9tYWluKS5yYW5nZShyYW5nZSk7XG4gICAgY2hlY2tEb21haW5PZlNjYWxlKHNjYWxlKTtcbiAgICB2YXIgdGlja3MgPSBnZXRUaWNrc09mU2NhbGUoc2NhbGUsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYXhpcyksIHt9LCB7XG4gICAgICByZWFsU2NhbGVUeXBlOiByZWFsU2NhbGVUeXBlXG4gICAgfSkpO1xuICAgIGlmIChheGlzVHlwZSA9PT0gJ3hBeGlzJykge1xuICAgICAgbmVlZFNwYWNlID0gb3JpZW50YXRpb24gPT09ICd0b3AnICYmICFtaXJyb3IgfHwgb3JpZW50YXRpb24gPT09ICdib3R0b20nICYmIG1pcnJvcjtcbiAgICAgIHggPSBvZmZzZXQubGVmdDtcbiAgICAgIHkgPSBzdGVwc1tvZmZzZXRLZXldIC0gbmVlZFNwYWNlICogYXhpcy5oZWlnaHQ7XG4gICAgfSBlbHNlIGlmIChheGlzVHlwZSA9PT0gJ3lBeGlzJykge1xuICAgICAgbmVlZFNwYWNlID0gb3JpZW50YXRpb24gPT09ICdsZWZ0JyAmJiAhbWlycm9yIHx8IG9yaWVudGF0aW9uID09PSAncmlnaHQnICYmIG1pcnJvcjtcbiAgICAgIHggPSBzdGVwc1tvZmZzZXRLZXldIC0gbmVlZFNwYWNlICogYXhpcy53aWR0aDtcbiAgICAgIHkgPSBvZmZzZXQudG9wO1xuICAgIH1cbiAgICB2YXIgZmluYWxBeGlzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGF4aXMpLCB0aWNrcyksIHt9LCB7XG4gICAgICByZWFsU2NhbGVUeXBlOiByZWFsU2NhbGVUeXBlLFxuICAgICAgeDogeCxcbiAgICAgIHk6IHksXG4gICAgICBzY2FsZTogc2NhbGUsXG4gICAgICB3aWR0aDogYXhpc1R5cGUgPT09ICd4QXhpcycgPyBvZmZzZXQud2lkdGggOiBheGlzLndpZHRoLFxuICAgICAgaGVpZ2h0OiBheGlzVHlwZSA9PT0gJ3lBeGlzJyA/IG9mZnNldC5oZWlnaHQgOiBheGlzLmhlaWdodFxuICAgIH0pO1xuICAgIGZpbmFsQXhpcy5iYW5kU2l6ZSA9IGdldEJhbmRTaXplT2ZBeGlzKGZpbmFsQXhpcywgdGlja3MpO1xuICAgIGlmICghYXhpcy5oaWRlICYmIGF4aXNUeXBlID09PSAneEF4aXMnKSB7XG4gICAgICBzdGVwc1tvZmZzZXRLZXldICs9IChuZWVkU3BhY2UgPyAtMSA6IDEpICogZmluYWxBeGlzLmhlaWdodDtcbiAgICB9IGVsc2UgaWYgKCFheGlzLmhpZGUpIHtcbiAgICAgIHN0ZXBzW29mZnNldEtleV0gKz0gKG5lZWRTcGFjZSA/IC0xIDogMSkgKiBmaW5hbEF4aXMud2lkdGg7XG4gICAgfVxuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHJlc3VsdCksIHt9LCBfZGVmaW5lUHJvcGVydHkoe30sIGlkLCBmaW5hbEF4aXMpKTtcbiAgfSwge30pO1xufTtcbmV4cG9ydCB2YXIgcmVjdFdpdGhQb2ludHMgPSBmdW5jdGlvbiByZWN0V2l0aFBvaW50cyhfcmVmLCBfcmVmMikge1xuICB2YXIgeDEgPSBfcmVmLngsXG4gICAgeTEgPSBfcmVmLnk7XG4gIHZhciB4MiA9IF9yZWYyLngsXG4gICAgeTIgPSBfcmVmMi55O1xuICByZXR1cm4ge1xuICAgIHg6IE1hdGgubWluKHgxLCB4MiksXG4gICAgeTogTWF0aC5taW4oeTEsIHkyKSxcbiAgICB3aWR0aDogTWF0aC5hYnMoeDIgLSB4MSksXG4gICAgaGVpZ2h0OiBNYXRoLmFicyh5MiAtIHkxKVxuICB9O1xufTtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSB4LCB5LCB3aWR0aCwgYW5kIGhlaWdodCBvZiBhIGJveCBmcm9tIHR3byByZWZlcmVuY2UgcG9pbnRzLlxuICogQHBhcmFtICB7T2JqZWN0fSBjb29yZHMgICAgIHgxLCB4MiwgeTEsIGFuZCB5MlxuICogQHJldHVybiB7T2JqZWN0fSBvYmplY3RcbiAqL1xuZXhwb3J0IHZhciByZWN0V2l0aENvb3JkcyA9IGZ1bmN0aW9uIHJlY3RXaXRoQ29vcmRzKF9yZWYzKSB7XG4gIHZhciB4MSA9IF9yZWYzLngxLFxuICAgIHkxID0gX3JlZjMueTEsXG4gICAgeDIgPSBfcmVmMy54MixcbiAgICB5MiA9IF9yZWYzLnkyO1xuICByZXR1cm4gcmVjdFdpdGhQb2ludHMoe1xuICAgIHg6IHgxLFxuICAgIHk6IHkxXG4gIH0sIHtcbiAgICB4OiB4MixcbiAgICB5OiB5MlxuICB9KTtcbn07XG5leHBvcnQgdmFyIFNjYWxlSGVscGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2NhbGVIZWxwZXIoc2NhbGUpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2NhbGVIZWxwZXIpO1xuICAgIHRoaXMuc2NhbGUgPSBzY2FsZTtcbiAgfVxuICByZXR1cm4gX2NyZWF0ZUNsYXNzKFNjYWxlSGVscGVyLCBbe1xuICAgIGtleTogXCJkb21haW5cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjYWxlLmRvbWFpbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmFuZ2VcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjYWxlLnJhbmdlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyYW5nZU1pblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucmFuZ2UoKVswXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmFuZ2VNYXhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJhbmdlKClbMV07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJhbmR3aWR0aFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NhbGUuYmFuZHdpZHRoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhcHBseVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseSh2YWx1ZSkge1xuICAgICAgdmFyIF9yZWY0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgYmFuZEF3YXJlID0gX3JlZjQuYmFuZEF3YXJlLFxuICAgICAgICBwb3NpdGlvbiA9IF9yZWY0LnBvc2l0aW9uO1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnbWlkZGxlJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMuYmFuZHdpZHRoID8gdGhpcy5iYW5kd2lkdGgoKSAvIDIgOiAwO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsZSh2YWx1ZSkgKyBvZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIF9vZmZzZXQgPSB0aGlzLmJhbmR3aWR0aCA/IHRoaXMuYmFuZHdpZHRoKCkgOiAwO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsZSh2YWx1ZSkgKyBfb2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGJhbmRBd2FyZSkge1xuICAgICAgICB2YXIgX29mZnNldDIgPSB0aGlzLmJhbmR3aWR0aCA/IHRoaXMuYmFuZHdpZHRoKCkgLyAyIDogMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGUodmFsdWUpICsgX29mZnNldDI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5zY2FsZSh2YWx1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzSW5SYW5nZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0luUmFuZ2UodmFsdWUpIHtcbiAgICAgIHZhciByYW5nZSA9IHRoaXMucmFuZ2UoKTtcbiAgICAgIHZhciBmaXJzdCA9IHJhbmdlWzBdO1xuICAgICAgdmFyIGxhc3QgPSByYW5nZVtyYW5nZS5sZW5ndGggLSAxXTtcbiAgICAgIHJldHVybiBmaXJzdCA8PSBsYXN0ID8gdmFsdWUgPj0gZmlyc3QgJiYgdmFsdWUgPD0gbGFzdCA6IHZhbHVlID49IGxhc3QgJiYgdmFsdWUgPD0gZmlyc3Q7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiY3JlYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZShvYmopIHtcbiAgICAgIHJldHVybiBuZXcgU2NhbGVIZWxwZXIob2JqKTtcbiAgICB9XG4gIH1dKTtcbn0oKTtcbl9kZWZpbmVQcm9wZXJ0eShTY2FsZUhlbHBlciwgXCJFUFNcIiwgMWUtNCk7XG5leHBvcnQgdmFyIGNyZWF0ZUxhYmVsZWRTY2FsZXMgPSBmdW5jdGlvbiBjcmVhdGVMYWJlbGVkU2NhbGVzKG9wdGlvbnMpIHtcbiAgdmFyIHNjYWxlcyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpLnJlZHVjZShmdW5jdGlvbiAocmVzLCBrZXkpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCByZXMpLCB7fSwgX2RlZmluZVByb3BlcnR5KHt9LCBrZXksIFNjYWxlSGVscGVyLmNyZWF0ZShvcHRpb25zW2tleV0pKSk7XG4gIH0sIHt9KTtcbiAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NhbGVzKSwge30sIHtcbiAgICBhcHBseTogZnVuY3Rpb24gYXBwbHkoY29vcmQpIHtcbiAgICAgIHZhciBfcmVmNSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgICAgIGJhbmRBd2FyZSA9IF9yZWY1LmJhbmRBd2FyZSxcbiAgICAgICAgcG9zaXRpb24gPSBfcmVmNS5wb3NpdGlvbjtcbiAgICAgIHJldHVybiBtYXBWYWx1ZXMoY29vcmQsIGZ1bmN0aW9uICh2YWx1ZSwgbGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIHNjYWxlc1tsYWJlbF0uYXBwbHkodmFsdWUsIHtcbiAgICAgICAgICBiYW5kQXdhcmU6IGJhbmRBd2FyZSxcbiAgICAgICAgICBwb3NpdGlvbjogcG9zaXRpb25cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGlzSW5SYW5nZTogZnVuY3Rpb24gaXNJblJhbmdlKGNvb3JkKSB7XG4gICAgICByZXR1cm4gZXZlcnkoY29vcmQsIGZ1bmN0aW9uICh2YWx1ZSwgbGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIHNjYWxlc1tsYWJlbF0uaXNJblJhbmdlKHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKiogTm9ybWFsaXplcyB0aGUgYW5nbGUgc28gdGhhdCAwIDw9IGFuZ2xlIDwgMTgwLlxuICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIEFuZ2xlIGluIGRlZ3JlZXMuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBub3JtYWxpemVkIGFuZ2xlIHdpdGggYSB2YWx1ZSBvZiBhdCBsZWFzdCAwIGFuZCBuZXZlciBncmVhdGVyIG9yIGVxdWFsIHRvIDE4MC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBbmdsZShhbmdsZSkge1xuICByZXR1cm4gKGFuZ2xlICUgMTgwICsgMTgwKSAlIDE4MDtcbn1cblxuLyoqIENhbGN1bGF0ZXMgdGhlIHdpZHRoIG9mIHRoZSBsYXJnZXN0IGhvcml6b250YWwgbGluZSB0aGF0IGZpdHMgaW5zaWRlIGEgcmVjdGFuZ2xlIHRoYXQgaXMgZGlzcGxheWVkIGF0IGFuIGFuZ2xlLlxuICogQHBhcmFtIHtPYmplY3R9IHNpemUgV2lkdGggYW5kIGhlaWdodCBvZiB0aGUgdGV4dCBpbiBhIGhvcml6b250YWwgcG9zaXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgQW5nbGUgaW4gZGVncmVlcyBpbiB3aGljaCB0aGUgdGV4dCBpcyBkaXNwbGF5ZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB3aWR0aCBvZiB0aGUgbGFyZ2VzdCBob3Jpem9udGFsIGxpbmUgdGhhdCBmaXRzIGluc2lkZSBhIHJlY3RhbmdsZSB0aGF0IGlzIGRpc3BsYXllZCBhdCBhbiBhbmdsZS5cbiAqL1xuZXhwb3J0IHZhciBnZXRBbmdsZWRSZWN0YW5nbGVXaWR0aCA9IGZ1bmN0aW9uIGdldEFuZ2xlZFJlY3RhbmdsZVdpZHRoKF9yZWY2KSB7XG4gIHZhciB3aWR0aCA9IF9yZWY2LndpZHRoLFxuICAgIGhlaWdodCA9IF9yZWY2LmhlaWdodDtcbiAgdmFyIGFuZ2xlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICAvLyBFbnN1cmUgYW5nbGUgaXMgPj0gMCAmJiA8IDE4MFxuICB2YXIgbm9ybWFsaXplZEFuZ2xlID0gbm9ybWFsaXplQW5nbGUoYW5nbGUpO1xuICB2YXIgYW5nbGVSYWRpYW5zID0gbm9ybWFsaXplZEFuZ2xlICogTWF0aC5QSSAvIDE4MDtcblxuICAvKiBEZXBlbmRpbmcgb24gdGhlIGhlaWdodCBhbmQgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSwgd2UgbWF5IG5lZWQgdG8gdXNlIGRpZmZlcmVudCBmb3JtdWxhcyB0byBjYWxjdWxhdGUgdGhlIGFuZ2xlZFxuICAgKiB3aWR0aC4gVGhpcyB0aHJlc2hvbGQgZGVmaW5lcyB3aGVuIGVhY2ggZm9ybXVsYSBzaG91bGQga2ljayBpbi4gKi9cbiAgdmFyIGFuZ2xlVGhyZXNob2xkID0gTWF0aC5hdGFuKGhlaWdodCAvIHdpZHRoKTtcbiAgdmFyIGFuZ2xlZFdpZHRoID0gYW5nbGVSYWRpYW5zID4gYW5nbGVUaHJlc2hvbGQgJiYgYW5nbGVSYWRpYW5zIDwgTWF0aC5QSSAtIGFuZ2xlVGhyZXNob2xkID8gaGVpZ2h0IC8gTWF0aC5zaW4oYW5nbGVSYWRpYW5zKSA6IHdpZHRoIC8gTWF0aC5jb3MoYW5nbGVSYWRpYW5zKTtcbiAgcmV0dXJuIE1hdGguYWJzKGFuZ2xlZFdpZHRoKTtcbn07IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTsgfVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG5pbXBvcnQgKiBhcyBkM1NjYWxlcyBmcm9tICd2aWN0b3J5LXZlbmRvci9kMy1zY2FsZSc7XG5pbXBvcnQgeyBzdGFjayBhcyBzaGFwZVN0YWNrLCBzdGFja09mZnNldEV4cGFuZCwgc3RhY2tPZmZzZXROb25lLCBzdGFja09mZnNldFNpbGhvdWV0dGUsIHN0YWNrT2Zmc2V0V2lnZ2xlLCBzdGFja09yZGVyTm9uZSB9IGZyb20gJ3ZpY3RvcnktdmVuZG9yL2QzLXNoYXBlJztcbmltcG9ydCBtYXggZnJvbSAnbG9kYXNoL21heCc7XG5pbXBvcnQgbWluIGZyb20gJ2xvZGFzaC9taW4nO1xuaW1wb3J0IGlzTmlsIGZyb20gJ2xvZGFzaC9pc05pbCc7XG5pbXBvcnQgaXNGdW5jdGlvbiBmcm9tICdsb2Rhc2gvaXNGdW5jdGlvbic7XG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAnbG9kYXNoL2lzU3RyaW5nJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoL2dldCc7XG5pbXBvcnQgZmxhdE1hcCBmcm9tICdsb2Rhc2gvZmxhdE1hcCc7XG5pbXBvcnQgaXNOYW4gZnJvbSAnbG9kYXNoL2lzTmFOJztcbmltcG9ydCB1cHBlckZpcnN0IGZyb20gJ2xvZGFzaC91cHBlckZpcnN0JztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2xvZGFzaC9pc0VxdWFsJztcbmltcG9ydCBzb3J0QnkgZnJvbSAnbG9kYXNoL3NvcnRCeSc7XG5pbXBvcnQgeyBnZXROaWNlVGlja1ZhbHVlcywgZ2V0VGlja1ZhbHVlc0ZpeGVkRG9tYWluIH0gZnJvbSAncmVjaGFydHMtc2NhbGUnO1xuaW1wb3J0IHsgRXJyb3JCYXIgfSBmcm9tICcuLi9jYXJ0ZXNpYW4vRXJyb3JCYXInO1xuaW1wb3J0IHsgZmluZEVudHJ5SW5BcnJheSwgZ2V0UGVyY2VudFZhbHVlLCBpc051bWJlciwgaXNOdW1PclN0ciwgbWF0aFNpZ24sIHVuaXF1ZUlkIH0gZnJvbSAnLi9EYXRhVXRpbHMnO1xuaW1wb3J0IHsgZmlsdGVyUHJvcHMsIGZpbmRBbGxCeVR5cGUsIGdldERpc3BsYXlOYW1lIH0gZnJvbSAnLi9SZWFjdFV0aWxzJztcbi8vIFRPRE86IENhdXNlIG9mIGNpcmN1bGFyIGRlcGVuZGVuY3kuIE5lZWRzIHJlZmFjdG9yLlxuLy8gaW1wb3J0IHsgUmFkaXVzQXhpc1Byb3BzLCBBbmdsZUF4aXNQcm9wcyB9IGZyb20gJy4uL3BvbGFyL3R5cGVzJztcblxuaW1wb3J0IHsgZ2V0TGVnZW5kUHJvcHMgfSBmcm9tICcuL2dldExlZ2VuZFByb3BzJztcblxuLy8gRXhwb3J0ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5leHBvcnQgeyBnZXRMZWdlbmRQcm9wcyB9O1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlQnlEYXRhS2V5KG9iaiwgZGF0YUtleSwgZGVmYXVsdFZhbHVlKSB7XG4gIGlmIChpc05pbChvYmopIHx8IGlzTmlsKGRhdGFLZXkpKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgfVxuICBpZiAoaXNOdW1PclN0cihkYXRhS2V5KSkge1xuICAgIHJldHVybiBnZXQob2JqLCBkYXRhS2V5LCBkZWZhdWx0VmFsdWUpO1xuICB9XG4gIGlmIChpc0Z1bmN0aW9uKGRhdGFLZXkpKSB7XG4gICAgcmV0dXJuIGRhdGFLZXkob2JqKTtcbiAgfVxuICByZXR1cm4gZGVmYXVsdFZhbHVlO1xufVxuLyoqXG4gKiBHZXQgZG9tYWluIG9mIGRhdGEgYnkga2V5LlxuICogQHBhcmFtICB7QXJyYXl9ICAgZGF0YSAgICAgIFRoZSBkYXRhIGRpc3BsYXllZCBpbiB0aGUgY2hhcnRcbiAqIEBwYXJhbSAge1N0cmluZ30gIGtleSAgICAgICBUaGUgdW5pcXVlIGtleSBvZiBhIGdyb3VwIG9mIGRhdGFcbiAqIEBwYXJhbSAge1N0cmluZ30gIHR5cGUgICAgICBUaGUgdHlwZSBvZiBheGlzXG4gKiBAcGFyYW0gIHtCb29sZWFufSBmaWx0ZXJOaWwgV2hldGhlciBvciBub3QgZmlsdGVyIG5pbCB2YWx1ZXNcbiAqIEByZXR1cm4ge0FycmF5fSBEb21haW4gb2YgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9tYWluT2ZEYXRhQnlLZXkoZGF0YSwga2V5LCB0eXBlLCBmaWx0ZXJOaWwpIHtcbiAgdmFyIGZsYXR0ZW5EYXRhID0gZmxhdE1hcChkYXRhLCBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVCeURhdGFLZXkoZW50cnksIGtleSk7XG4gIH0pO1xuICBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhcnNlRmxvYXQgdHlwZSBvbmx5IGFjY2VwdHMgc3RyaW5nc1xuICAgIHZhciBkb21haW4gPSBmbGF0dGVuRGF0YS5maWx0ZXIoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICByZXR1cm4gaXNOdW1iZXIoZW50cnkpIHx8IHBhcnNlRmxvYXQoZW50cnkpO1xuICAgIH0pO1xuICAgIHJldHVybiBkb21haW4ubGVuZ3RoID8gW21pbihkb21haW4pLCBtYXgoZG9tYWluKV0gOiBbSW5maW5pdHksIC1JbmZpbml0eV07XG4gIH1cbiAgdmFyIHZhbGlkYXRlRGF0YSA9IGZpbHRlck5pbCA/IGZsYXR0ZW5EYXRhLmZpbHRlcihmdW5jdGlvbiAoZW50cnkpIHtcbiAgICByZXR1cm4gIWlzTmlsKGVudHJ5KTtcbiAgfSkgOiBmbGF0dGVuRGF0YTtcblxuICAvLyBTdXBwb3J0cyB4LWF4aXMgb2YgRGF0ZSB0eXBlXG4gIHJldHVybiB2YWxpZGF0ZURhdGEubWFwKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgIHJldHVybiBpc051bU9yU3RyKGVudHJ5KSB8fCBlbnRyeSBpbnN0YW5jZW9mIERhdGUgPyBlbnRyeSA6ICcnO1xuICB9KTtcbn1cbmV4cG9ydCB2YXIgY2FsY3VsYXRlQWN0aXZlVGlja0luZGV4ID0gZnVuY3Rpb24gY2FsY3VsYXRlQWN0aXZlVGlja0luZGV4KGNvb3JkaW5hdGUpIHtcbiAgdmFyIF90aWNrcyRsZW5ndGg7XG4gIHZhciB0aWNrcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogW107XG4gIHZhciB1bnNvcnRlZFRpY2tzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHZhciBheGlzID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBhcmd1bWVudHNbM10gOiB1bmRlZmluZWQ7XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgbGVuID0gKF90aWNrcyRsZW5ndGggPSB0aWNrcyA9PT0gbnVsbCB8fCB0aWNrcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGlja3MubGVuZ3RoKSAhPT0gbnVsbCAmJiBfdGlja3MkbGVuZ3RoICE9PSB2b2lkIDAgPyBfdGlja3MkbGVuZ3RoIDogMDtcblxuICAvLyBpZiB0aGVyZSBhcmUgMSBvciBsZXNzIHRpY2tzIHRpY2tzIHRoZW4gdGhlIGFjdGl2ZSB0aWNrIGlzIGF0IGluZGV4IDBcbiAgaWYgKGxlbiA8PSAxKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKGF4aXMgJiYgYXhpcy5heGlzVHlwZSA9PT0gJ2FuZ2xlQXhpcycgJiYgTWF0aC5hYnMoTWF0aC5hYnMoYXhpcy5yYW5nZVsxXSAtIGF4aXMucmFuZ2VbMF0pIC0gMzYwKSA8PSAxZS02KSB7XG4gICAgdmFyIHJhbmdlID0gYXhpcy5yYW5nZTtcbiAgICAvLyB0aWNrcyBhcmUgZGlzdHJpYnV0ZWQgaW4gYSBjaXJjbGVcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgYmVmb3JlID0gaSA+IDAgPyB1bnNvcnRlZFRpY2tzW2kgLSAxXS5jb29yZGluYXRlIDogdW5zb3J0ZWRUaWNrc1tsZW4gLSAxXS5jb29yZGluYXRlO1xuICAgICAgdmFyIGN1ciA9IHVuc29ydGVkVGlja3NbaV0uY29vcmRpbmF0ZTtcbiAgICAgIHZhciBhZnRlciA9IGkgPj0gbGVuIC0gMSA/IHVuc29ydGVkVGlja3NbMF0uY29vcmRpbmF0ZSA6IHVuc29ydGVkVGlja3NbaSArIDFdLmNvb3JkaW5hdGU7XG4gICAgICB2YXIgc2FtZURpcmVjdGlvbkNvb3JkID0gdm9pZCAwO1xuICAgICAgaWYgKG1hdGhTaWduKGN1ciAtIGJlZm9yZSkgIT09IG1hdGhTaWduKGFmdGVyIC0gY3VyKSkge1xuICAgICAgICB2YXIgZGlmZkludGVydmFsID0gW107XG4gICAgICAgIGlmIChtYXRoU2lnbihhZnRlciAtIGN1cikgPT09IG1hdGhTaWduKHJhbmdlWzFdIC0gcmFuZ2VbMF0pKSB7XG4gICAgICAgICAgc2FtZURpcmVjdGlvbkNvb3JkID0gYWZ0ZXI7XG4gICAgICAgICAgdmFyIGN1ckluUmFuZ2UgPSBjdXIgKyByYW5nZVsxXSAtIHJhbmdlWzBdO1xuICAgICAgICAgIGRpZmZJbnRlcnZhbFswXSA9IE1hdGgubWluKGN1ckluUmFuZ2UsIChjdXJJblJhbmdlICsgYmVmb3JlKSAvIDIpO1xuICAgICAgICAgIGRpZmZJbnRlcnZhbFsxXSA9IE1hdGgubWF4KGN1ckluUmFuZ2UsIChjdXJJblJhbmdlICsgYmVmb3JlKSAvIDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNhbWVEaXJlY3Rpb25Db29yZCA9IGJlZm9yZTtcbiAgICAgICAgICB2YXIgYWZ0ZXJJblJhbmdlID0gYWZ0ZXIgKyByYW5nZVsxXSAtIHJhbmdlWzBdO1xuICAgICAgICAgIGRpZmZJbnRlcnZhbFswXSA9IE1hdGgubWluKGN1ciwgKGFmdGVySW5SYW5nZSArIGN1cikgLyAyKTtcbiAgICAgICAgICBkaWZmSW50ZXJ2YWxbMV0gPSBNYXRoLm1heChjdXIsIChhZnRlckluUmFuZ2UgKyBjdXIpIC8gMik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNhbWVJbnRlcnZhbCA9IFtNYXRoLm1pbihjdXIsIChzYW1lRGlyZWN0aW9uQ29vcmQgKyBjdXIpIC8gMiksIE1hdGgubWF4KGN1ciwgKHNhbWVEaXJlY3Rpb25Db29yZCArIGN1cikgLyAyKV07XG4gICAgICAgIGlmIChjb29yZGluYXRlID4gc2FtZUludGVydmFsWzBdICYmIGNvb3JkaW5hdGUgPD0gc2FtZUludGVydmFsWzFdIHx8IGNvb3JkaW5hdGUgPj0gZGlmZkludGVydmFsWzBdICYmIGNvb3JkaW5hdGUgPD0gZGlmZkludGVydmFsWzFdKSB7XG4gICAgICAgICAgaW5kZXggPSB1bnNvcnRlZFRpY2tzW2ldLmluZGV4O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbWluVmFsdWUgPSBNYXRoLm1pbihiZWZvcmUsIGFmdGVyKTtcbiAgICAgICAgdmFyIG1heFZhbHVlID0gTWF0aC5tYXgoYmVmb3JlLCBhZnRlcik7XG4gICAgICAgIGlmIChjb29yZGluYXRlID4gKG1pblZhbHVlICsgY3VyKSAvIDIgJiYgY29vcmRpbmF0ZSA8PSAobWF4VmFsdWUgKyBjdXIpIC8gMikge1xuICAgICAgICAgIGluZGV4ID0gdW5zb3J0ZWRUaWNrc1tpXS5pbmRleDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyB0aWNrcyBhcmUgZGlzdHJpYnV0ZWQgaW4gYSBzaW5nbGUgZGlyZWN0aW9uXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbjsgX2krKykge1xuICAgICAgaWYgKF9pID09PSAwICYmIGNvb3JkaW5hdGUgPD0gKHRpY2tzW19pXS5jb29yZGluYXRlICsgdGlja3NbX2kgKyAxXS5jb29yZGluYXRlKSAvIDIgfHwgX2kgPiAwICYmIF9pIDwgbGVuIC0gMSAmJiBjb29yZGluYXRlID4gKHRpY2tzW19pXS5jb29yZGluYXRlICsgdGlja3NbX2kgLSAxXS5jb29yZGluYXRlKSAvIDIgJiYgY29vcmRpbmF0ZSA8PSAodGlja3NbX2ldLmNvb3JkaW5hdGUgKyB0aWNrc1tfaSArIDFdLmNvb3JkaW5hdGUpIC8gMiB8fCBfaSA9PT0gbGVuIC0gMSAmJiBjb29yZGluYXRlID4gKHRpY2tzW19pXS5jb29yZGluYXRlICsgdGlja3NbX2kgLSAxXS5jb29yZGluYXRlKSAvIDIpIHtcbiAgICAgICAgaW5kZXggPSB0aWNrc1tfaV0uaW5kZXg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gaW5kZXg7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgbWFpbiBjb2xvciBvZiBlYWNoIGdyYXBoaWMgaXRlbVxuICogQHBhcmFtICB7UmVhY3RFbGVtZW50fSBpdGVtIEEgZ3JhcGhpYyBpdGVtXG4gKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAgICAgICAgQ29sb3JcbiAqL1xuZXhwb3J0IHZhciBnZXRNYWluQ29sb3JPZkdyYXBoaWNJdGVtID0gZnVuY3Rpb24gZ2V0TWFpbkNvbG9yT2ZHcmFwaGljSXRlbShpdGVtKSB7XG4gIHZhciBfaXRlbSR0eXBlO1xuICB2YXIgX3JlZiA9IGl0ZW0sXG4gICAgZGlzcGxheU5hbWUgPSBfcmVmLnR5cGUuZGlzcGxheU5hbWU7IC8vIFRPRE86IGNoZWNrIGlmIGRpc3BsYXlOYW1lIGlzIHZhbGlkLlxuICB2YXIgZGVmYXVsdGVkUHJvcHMgPSAoX2l0ZW0kdHlwZSA9IGl0ZW0udHlwZSkgIT09IG51bGwgJiYgX2l0ZW0kdHlwZSAhPT0gdm9pZCAwICYmIF9pdGVtJHR5cGUuZGVmYXVsdFByb3BzID8gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpdGVtLnR5cGUuZGVmYXVsdFByb3BzKSwgaXRlbS5wcm9wcykgOiBpdGVtLnByb3BzO1xuICB2YXIgc3Ryb2tlID0gZGVmYXVsdGVkUHJvcHMuc3Ryb2tlLFxuICAgIGZpbGwgPSBkZWZhdWx0ZWRQcm9wcy5maWxsO1xuICB2YXIgcmVzdWx0O1xuICBzd2l0Y2ggKGRpc3BsYXlOYW1lKSB7XG4gICAgY2FzZSAnTGluZSc6XG4gICAgICByZXN1bHQgPSBzdHJva2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdBcmVhJzpcbiAgICBjYXNlICdSYWRhcic6XG4gICAgICByZXN1bHQgPSBzdHJva2UgJiYgc3Ryb2tlICE9PSAnbm9uZScgPyBzdHJva2UgOiBmaWxsO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlc3VsdCA9IGZpbGw7XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBzaXplIG9mIGFsbCBncm91cHMgZm9yIHN0YWNrZWQgYmFyIGdyYXBoXG4gKiBAcGFyYW0gIHtPYmplY3R9IHN0YWNrR3JvdXBzIFRoZSBpdGVtcyBncm91cGVkIGJ5IGF4aXNJZCBhbmQgc3RhY2tJZFxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgc2l6ZSBvZiBhbGwgZ3JvdXBzXG4gKi9cbmV4cG9ydCB2YXIgZ2V0QmFyU2l6ZUxpc3QgPSBmdW5jdGlvbiBnZXRCYXJTaXplTGlzdChfcmVmMikge1xuICB2YXIgZ2xvYmFsU2l6ZSA9IF9yZWYyLmJhclNpemUsXG4gICAgdG90YWxTaXplID0gX3JlZjIudG90YWxTaXplLFxuICAgIF9yZWYyJHN0YWNrR3JvdXBzID0gX3JlZjIuc3RhY2tHcm91cHMsXG4gICAgc3RhY2tHcm91cHMgPSBfcmVmMiRzdGFja0dyb3VwcyA9PT0gdm9pZCAwID8ge30gOiBfcmVmMiRzdGFja0dyb3VwcztcbiAgaWYgKCFzdGFja0dyb3Vwcykge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICB2YXIgcmVzdWx0ID0ge307XG4gIHZhciBudW1lcmljQXhpc0lkcyA9IE9iamVjdC5rZXlzKHN0YWNrR3JvdXBzKTtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG51bWVyaWNBeGlzSWRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIHNncyA9IHN0YWNrR3JvdXBzW251bWVyaWNBeGlzSWRzW2ldXS5zdGFja0dyb3VwcztcbiAgICB2YXIgc3RhY2tJZHMgPSBPYmplY3Qua2V5cyhzZ3MpO1xuICAgIGZvciAodmFyIGogPSAwLCBzTGVuID0gc3RhY2tJZHMubGVuZ3RoOyBqIDwgc0xlbjsgaisrKSB7XG4gICAgICB2YXIgX3NncyRzdGFja0lkcyRqID0gc2dzW3N0YWNrSWRzW2pdXSxcbiAgICAgICAgaXRlbXMgPSBfc2dzJHN0YWNrSWRzJGouaXRlbXMsXG4gICAgICAgIGNhdGVBeGlzSWQgPSBfc2dzJHN0YWNrSWRzJGouY2F0ZUF4aXNJZDtcbiAgICAgIHZhciBiYXJJdGVtcyA9IGl0ZW1zLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWUoaXRlbS50eXBlKS5pbmRleE9mKCdCYXInKSA+PSAwO1xuICAgICAgfSk7XG4gICAgICBpZiAoYmFySXRlbXMgJiYgYmFySXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBiYXJJdGVtRGVmYXVsdFByb3BzID0gYmFySXRlbXNbMF0udHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgICAgIHZhciBiYXJJdGVtUHJvcHMgPSBiYXJJdGVtRGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQgPyBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGJhckl0ZW1EZWZhdWx0UHJvcHMpLCBiYXJJdGVtc1swXS5wcm9wcykgOiBiYXJJdGVtc1swXS5wcm9wcztcbiAgICAgICAgdmFyIHNlbGZTaXplID0gYmFySXRlbVByb3BzLmJhclNpemU7XG4gICAgICAgIHZhciBjYXRlSWQgPSBiYXJJdGVtUHJvcHNbY2F0ZUF4aXNJZF07XG4gICAgICAgIGlmICghcmVzdWx0W2NhdGVJZF0pIHtcbiAgICAgICAgICByZXN1bHRbY2F0ZUlkXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBiYXJTaXplID0gaXNOaWwoc2VsZlNpemUpID8gZ2xvYmFsU2l6ZSA6IHNlbGZTaXplO1xuICAgICAgICByZXN1bHRbY2F0ZUlkXS5wdXNoKHtcbiAgICAgICAgICBpdGVtOiBiYXJJdGVtc1swXSxcbiAgICAgICAgICBzdGFja0xpc3Q6IGJhckl0ZW1zLnNsaWNlKDEpLFxuICAgICAgICAgIGJhclNpemU6IGlzTmlsKGJhclNpemUpID8gdW5kZWZpbmVkIDogZ2V0UGVyY2VudFZhbHVlKGJhclNpemUsIHRvdGFsU2l6ZSwgMClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgZWFjaCBiYXIgYW5kIG9mZnNldCBiZXR3ZWVuIHN0YXJ0IG9mIGJhbmQgYW5kIHRoZSBiYXJcbiAqXG4gKiBAcGFyYW0gIHtudW1iZXJ9IGJhbmRTaXplIGlzIHRoZSBzaXplIG9mIGFyZWEgd2hlcmUgYmFycyBjYW4gcmVuZGVyXG4gKiBAcGFyYW0gIHtudW1iZXIgfCBzdHJpbmd9IGJhckdhcCBpcyB0aGUgZ2FwIHNpemUsIGFzIGEgcGVyY2VudGFnZSBvZiBgYmFuZFNpemVgLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGRlZmluZWQgYXMgbnVtYmVyIG9yIHBlcmNlbnQgc3RyaW5nXG4gKiBAcGFyYW0gIHtudW1iZXIgfCBzdHJpbmd9IGJhckNhdGVnb3J5R2FwIGlzIHRoZSBnYXAgc2l6ZSwgYXMgYSBwZXJjZW50YWdlIG9mIGBiYW5kU2l6ZWAuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgZGVmaW5lZCBhcyBudW1iZXIgb3IgcGVyY2VudCBzdHJpbmdcbiAqIEBwYXJhbSAge0FycmF5PG9iamVjdD59IHNpemVMaXN0IFNpemVzIG9mIGFsbCBncm91cHNcbiAqIEBwYXJhbSAge251bWJlcn0gbWF4QmFyU2l6ZSBUaGUgbWF4aW11bSBzaXplIG9mIGVhY2ggYmFyXG4gKiBAcmV0dXJuIHtBcnJheTxvYmplY3Q+fSBUaGUgc2l6ZSBhbmQgb2Zmc2V0IG9mIGVhY2ggYmFyXG4gKi9cbmV4cG9ydCB2YXIgZ2V0QmFyUG9zaXRpb24gPSBmdW5jdGlvbiBnZXRCYXJQb3NpdGlvbihfcmVmMykge1xuICB2YXIgYmFyR2FwID0gX3JlZjMuYmFyR2FwLFxuICAgIGJhckNhdGVnb3J5R2FwID0gX3JlZjMuYmFyQ2F0ZWdvcnlHYXAsXG4gICAgYmFuZFNpemUgPSBfcmVmMy5iYW5kU2l6ZSxcbiAgICBfcmVmMyRzaXplTGlzdCA9IF9yZWYzLnNpemVMaXN0LFxuICAgIHNpemVMaXN0ID0gX3JlZjMkc2l6ZUxpc3QgPT09IHZvaWQgMCA/IFtdIDogX3JlZjMkc2l6ZUxpc3QsXG4gICAgbWF4QmFyU2l6ZSA9IF9yZWYzLm1heEJhclNpemU7XG4gIHZhciBsZW4gPSBzaXplTGlzdC5sZW5ndGg7XG4gIGlmIChsZW4gPCAxKSByZXR1cm4gbnVsbDtcbiAgdmFyIHJlYWxCYXJHYXAgPSBnZXRQZXJjZW50VmFsdWUoYmFyR2FwLCBiYW5kU2l6ZSwgMCwgdHJ1ZSk7XG4gIHZhciByZXN1bHQ7XG4gIHZhciBpbml0aWFsVmFsdWUgPSBbXTtcblxuICAvLyB3aGV0aGVyIG9yIG5vdCBpcyBiYXJTaXplIHNldHRlZCBieSB1c2VyXG4gIGlmIChzaXplTGlzdFswXS5iYXJTaXplID09PSArc2l6ZUxpc3RbMF0uYmFyU2l6ZSkge1xuICAgIHZhciB1c2VGdWxsID0gZmFsc2U7XG4gICAgdmFyIGZ1bGxCYXJTaXplID0gYmFuZFNpemUgLyBsZW47XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGUgdHlwZSBjaGVjayBhYm92ZSBkb2VzIG5vdCBjaGVjayBmb3IgdHlwZSBudW1iZXIgZXhwbGljaXRseVxuICAgIHZhciBzdW0gPSBzaXplTGlzdC5yZWR1Y2UoZnVuY3Rpb24gKHJlcywgZW50cnkpIHtcbiAgICAgIHJldHVybiByZXMgKyBlbnRyeS5iYXJTaXplIHx8IDA7XG4gICAgfSwgMCk7XG4gICAgc3VtICs9IChsZW4gLSAxKSAqIHJlYWxCYXJHYXA7XG4gICAgaWYgKHN1bSA+PSBiYW5kU2l6ZSkge1xuICAgICAgc3VtIC09IChsZW4gLSAxKSAqIHJlYWxCYXJHYXA7XG4gICAgICByZWFsQmFyR2FwID0gMDtcbiAgICB9XG4gICAgaWYgKHN1bSA+PSBiYW5kU2l6ZSAmJiBmdWxsQmFyU2l6ZSA+IDApIHtcbiAgICAgIHVzZUZ1bGwgPSB0cnVlO1xuICAgICAgZnVsbEJhclNpemUgKj0gMC45O1xuICAgICAgc3VtID0gbGVuICogZnVsbEJhclNpemU7XG4gICAgfVxuICAgIHZhciBvZmZzZXQgPSAoYmFuZFNpemUgLSBzdW0pIC8gMiA+PiAwO1xuICAgIHZhciBwcmV2ID0ge1xuICAgICAgb2Zmc2V0OiBvZmZzZXQgLSByZWFsQmFyR2FwLFxuICAgICAgc2l6ZTogMFxuICAgIH07XG4gICAgcmVzdWx0ID0gc2l6ZUxpc3QucmVkdWNlKGZ1bmN0aW9uIChyZXMsIGVudHJ5KSB7XG4gICAgICB2YXIgbmV3UG9zaXRpb24gPSB7XG4gICAgICAgIGl0ZW06IGVudHJ5Lml0ZW0sXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgb2Zmc2V0OiBwcmV2Lm9mZnNldCArIHByZXYuc2l6ZSArIHJlYWxCYXJHYXAsXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGUgdHlwZSBjaGVjayBhYm92ZSBkb2VzIG5vdCBjaGVjayBmb3IgdHlwZSBudW1iZXIgZXhwbGljaXRseVxuICAgICAgICAgIHNpemU6IHVzZUZ1bGwgPyBmdWxsQmFyU2l6ZSA6IGVudHJ5LmJhclNpemVcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBuZXdSZXMgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJlcyksIFtuZXdQb3NpdGlvbl0pO1xuICAgICAgcHJldiA9IG5ld1Jlc1tuZXdSZXMubGVuZ3RoIC0gMV0ucG9zaXRpb247XG4gICAgICBpZiAoZW50cnkuc3RhY2tMaXN0ICYmIGVudHJ5LnN0YWNrTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgZW50cnkuc3RhY2tMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICBuZXdSZXMucHVzaCh7XG4gICAgICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICAgICAgcG9zaXRpb246IHByZXZcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3UmVzO1xuICAgIH0sIGluaXRpYWxWYWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIF9vZmZzZXQgPSBnZXRQZXJjZW50VmFsdWUoYmFyQ2F0ZWdvcnlHYXAsIGJhbmRTaXplLCAwLCB0cnVlKTtcbiAgICBpZiAoYmFuZFNpemUgLSAyICogX29mZnNldCAtIChsZW4gLSAxKSAqIHJlYWxCYXJHYXAgPD0gMCkge1xuICAgICAgcmVhbEJhckdhcCA9IDA7XG4gICAgfVxuICAgIHZhciBvcmlnaW5hbFNpemUgPSAoYmFuZFNpemUgLSAyICogX29mZnNldCAtIChsZW4gLSAxKSAqIHJlYWxCYXJHYXApIC8gbGVuO1xuICAgIGlmIChvcmlnaW5hbFNpemUgPiAxKSB7XG4gICAgICBvcmlnaW5hbFNpemUgPj49IDA7XG4gICAgfVxuICAgIHZhciBzaXplID0gbWF4QmFyU2l6ZSA9PT0gK21heEJhclNpemUgPyBNYXRoLm1pbihvcmlnaW5hbFNpemUsIG1heEJhclNpemUpIDogb3JpZ2luYWxTaXplO1xuICAgIHJlc3VsdCA9IHNpemVMaXN0LnJlZHVjZShmdW5jdGlvbiAocmVzLCBlbnRyeSwgaSkge1xuICAgICAgdmFyIG5ld1JlcyA9IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocmVzKSwgW3tcbiAgICAgICAgaXRlbTogZW50cnkuaXRlbSxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICBvZmZzZXQ6IF9vZmZzZXQgKyAob3JpZ2luYWxTaXplICsgcmVhbEJhckdhcCkgKiBpICsgKG9yaWdpbmFsU2l6ZSAtIHNpemUpIC8gMixcbiAgICAgICAgICBzaXplOiBzaXplXG4gICAgICAgIH1cbiAgICAgIH1dKTtcbiAgICAgIGlmIChlbnRyeS5zdGFja0xpc3QgJiYgZW50cnkuc3RhY2tMaXN0Lmxlbmd0aCkge1xuICAgICAgICBlbnRyeS5zdGFja0xpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIG5ld1Jlcy5wdXNoKHtcbiAgICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgICBwb3NpdGlvbjogbmV3UmVzW25ld1Jlcy5sZW5ndGggLSAxXS5wb3NpdGlvblxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXdSZXM7XG4gICAgfSwgaW5pdGlhbFZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydCB2YXIgYXBwZW5kT2Zmc2V0T2ZMZWdlbmQgPSBmdW5jdGlvbiBhcHBlbmRPZmZzZXRPZkxlZ2VuZChvZmZzZXQsIF91bnVzZWQsIHByb3BzLCBsZWdlbmRCb3gpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgd2lkdGggPSBwcm9wcy53aWR0aCxcbiAgICBtYXJnaW4gPSBwcm9wcy5tYXJnaW47XG4gIHZhciBsZWdlbmRXaWR0aCA9IHdpZHRoIC0gKG1hcmdpbi5sZWZ0IHx8IDApIC0gKG1hcmdpbi5yaWdodCB8fCAwKTtcbiAgdmFyIGxlZ2VuZFByb3BzID0gZ2V0TGVnZW5kUHJvcHMoe1xuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBsZWdlbmRXaWR0aDogbGVnZW5kV2lkdGhcbiAgfSk7XG4gIGlmIChsZWdlbmRQcm9wcykge1xuICAgIHZhciBfcmVmNCA9IGxlZ2VuZEJveCB8fCB7fSxcbiAgICAgIGJveFdpZHRoID0gX3JlZjQud2lkdGgsXG4gICAgICBib3hIZWlnaHQgPSBfcmVmNC5oZWlnaHQ7XG4gICAgdmFyIGFsaWduID0gbGVnZW5kUHJvcHMuYWxpZ24sXG4gICAgICB2ZXJ0aWNhbEFsaWduID0gbGVnZW5kUHJvcHMudmVydGljYWxBbGlnbixcbiAgICAgIGxheW91dCA9IGxlZ2VuZFByb3BzLmxheW91dDtcbiAgICBpZiAoKGxheW91dCA9PT0gJ3ZlcnRpY2FsJyB8fCBsYXlvdXQgPT09ICdob3Jpem9udGFsJyAmJiB2ZXJ0aWNhbEFsaWduID09PSAnbWlkZGxlJykgJiYgYWxpZ24gIT09ICdjZW50ZXInICYmIGlzTnVtYmVyKG9mZnNldFthbGlnbl0pKSB7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvZmZzZXQpLCB7fSwgX2RlZmluZVByb3BlcnR5KHt9LCBhbGlnbiwgb2Zmc2V0W2FsaWduXSArIChib3hXaWR0aCB8fCAwKSkpO1xuICAgIH1cbiAgICBpZiAoKGxheW91dCA9PT0gJ2hvcml6b250YWwnIHx8IGxheW91dCA9PT0gJ3ZlcnRpY2FsJyAmJiBhbGlnbiA9PT0gJ2NlbnRlcicpICYmIHZlcnRpY2FsQWxpZ24gIT09ICdtaWRkbGUnICYmIGlzTnVtYmVyKG9mZnNldFt2ZXJ0aWNhbEFsaWduXSkpIHtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9mZnNldCksIHt9LCBfZGVmaW5lUHJvcGVydHkoe30sIHZlcnRpY2FsQWxpZ24sIG9mZnNldFt2ZXJ0aWNhbEFsaWduXSArIChib3hIZWlnaHQgfHwgMCkpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9mZnNldDtcbn07XG52YXIgaXNFcnJvckJhclJlbGV2YW50Rm9yQXhpcyA9IGZ1bmN0aW9uIGlzRXJyb3JCYXJSZWxldmFudEZvckF4aXMobGF5b3V0LCBheGlzVHlwZSwgZGlyZWN0aW9uKSB7XG4gIGlmIChpc05pbChheGlzVHlwZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAobGF5b3V0ID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICByZXR1cm4gYXhpc1R5cGUgPT09ICd5QXhpcyc7XG4gIH1cbiAgaWYgKGxheW91dCA9PT0gJ3ZlcnRpY2FsJykge1xuICAgIHJldHVybiBheGlzVHlwZSA9PT0gJ3hBeGlzJztcbiAgfVxuICBpZiAoZGlyZWN0aW9uID09PSAneCcpIHtcbiAgICByZXR1cm4gYXhpc1R5cGUgPT09ICd4QXhpcyc7XG4gIH1cbiAgaWYgKGRpcmVjdGlvbiA9PT0gJ3knKSB7XG4gICAgcmV0dXJuIGF4aXNUeXBlID09PSAneUF4aXMnO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcbmV4cG9ydCB2YXIgZ2V0RG9tYWluT2ZFcnJvckJhcnMgPSBmdW5jdGlvbiBnZXREb21haW5PZkVycm9yQmFycyhkYXRhLCBpdGVtLCBkYXRhS2V5LCBsYXlvdXQsIGF4aXNUeXBlKSB7XG4gIHZhciBjaGlsZHJlbiA9IGl0ZW0ucHJvcHMuY2hpbGRyZW47XG4gIHZhciBlcnJvckJhcnMgPSBmaW5kQWxsQnlUeXBlKGNoaWxkcmVuLCBFcnJvckJhcikuZmlsdGVyKGZ1bmN0aW9uIChlcnJvckJhckNoaWxkKSB7XG4gICAgcmV0dXJuIGlzRXJyb3JCYXJSZWxldmFudEZvckF4aXMobGF5b3V0LCBheGlzVHlwZSwgZXJyb3JCYXJDaGlsZC5wcm9wcy5kaXJlY3Rpb24pO1xuICB9KTtcbiAgaWYgKGVycm9yQmFycyAmJiBlcnJvckJhcnMubGVuZ3RoKSB7XG4gICAgdmFyIGtleXMgPSBlcnJvckJhcnMubWFwKGZ1bmN0aW9uIChlcnJvckJhckNoaWxkKSB7XG4gICAgICByZXR1cm4gZXJyb3JCYXJDaGlsZC5wcm9wcy5kYXRhS2V5O1xuICAgIH0pO1xuICAgIHJldHVybiBkYXRhLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBlbnRyeSkge1xuICAgICAgdmFyIGVudHJ5VmFsdWUgPSBnZXRWYWx1ZUJ5RGF0YUtleShlbnRyeSwgZGF0YUtleSk7XG4gICAgICBpZiAoaXNOaWwoZW50cnlWYWx1ZSkpIHJldHVybiByZXN1bHQ7XG4gICAgICB2YXIgbWFpblZhbHVlID0gQXJyYXkuaXNBcnJheShlbnRyeVZhbHVlKSA/IFttaW4oZW50cnlWYWx1ZSksIG1heChlbnRyeVZhbHVlKV0gOiBbZW50cnlWYWx1ZSwgZW50cnlWYWx1ZV07XG4gICAgICB2YXIgZXJyb3JEb21haW4gPSBrZXlzLnJlZHVjZShmdW5jdGlvbiAocHJldkVycm9yQXJyLCBrKSB7XG4gICAgICAgIHZhciBlcnJvclZhbHVlID0gZ2V0VmFsdWVCeURhdGFLZXkoZW50cnksIGssIDApO1xuICAgICAgICB2YXIgbG93ZXJWYWx1ZSA9IG1haW5WYWx1ZVswXSAtIE1hdGguYWJzKEFycmF5LmlzQXJyYXkoZXJyb3JWYWx1ZSkgPyBlcnJvclZhbHVlWzBdIDogZXJyb3JWYWx1ZSk7XG4gICAgICAgIHZhciB1cHBlclZhbHVlID0gbWFpblZhbHVlWzFdICsgTWF0aC5hYnMoQXJyYXkuaXNBcnJheShlcnJvclZhbHVlKSA/IGVycm9yVmFsdWVbMV0gOiBlcnJvclZhbHVlKTtcbiAgICAgICAgcmV0dXJuIFtNYXRoLm1pbihsb3dlclZhbHVlLCBwcmV2RXJyb3JBcnJbMF0pLCBNYXRoLm1heCh1cHBlclZhbHVlLCBwcmV2RXJyb3JBcnJbMV0pXTtcbiAgICAgIH0sIFtJbmZpbml0eSwgLUluZmluaXR5XSk7XG4gICAgICByZXR1cm4gW01hdGgubWluKGVycm9yRG9tYWluWzBdLCByZXN1bHRbMF0pLCBNYXRoLm1heChlcnJvckRvbWFpblsxXSwgcmVzdWx0WzFdKV07XG4gICAgfSwgW0luZmluaXR5LCAtSW5maW5pdHldKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5leHBvcnQgdmFyIHBhcnNlRXJyb3JCYXJzT2ZBeGlzID0gZnVuY3Rpb24gcGFyc2VFcnJvckJhcnNPZkF4aXMoZGF0YSwgaXRlbXMsIGRhdGFLZXksIGF4aXNUeXBlLCBsYXlvdXQpIHtcbiAgdmFyIGRvbWFpbnMgPSBpdGVtcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXR1cm4gZ2V0RG9tYWluT2ZFcnJvckJhcnMoZGF0YSwgaXRlbSwgZGF0YUtleSwgbGF5b3V0LCBheGlzVHlwZSk7XG4gIH0pLmZpbHRlcihmdW5jdGlvbiAoZW50cnkpIHtcbiAgICByZXR1cm4gIWlzTmlsKGVudHJ5KTtcbiAgfSk7XG4gIGlmIChkb21haW5zICYmIGRvbWFpbnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGRvbWFpbnMucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIGVudHJ5KSB7XG4gICAgICByZXR1cm4gW01hdGgubWluKHJlc3VsdFswXSwgZW50cnlbMF0pLCBNYXRoLm1heChyZXN1bHRbMV0sIGVudHJ5WzFdKV07XG4gICAgfSwgW0luZmluaXR5LCAtSW5maW5pdHldKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogR2V0IGRvbWFpbiBvZiBkYXRhIGJ5IHRoZSBjb25maWd1cmF0aW9uIG9mIGl0ZW0gZWxlbWVudFxuICogQHBhcmFtICB7QXJyYXl9ICAgZGF0YSAgICAgIFRoZSBkYXRhIGRpc3BsYXllZCBpbiB0aGUgY2hhcnRcbiAqIEBwYXJhbSAge0FycmF5fSAgIGl0ZW1zICAgICBUaGUgaW5zdGFuY2VzIG9mIGl0ZW1cbiAqIEBwYXJhbSAge1N0cmluZ30gIHR5cGUgICAgICBUaGUgdHlwZSBvZiBheGlzLCBudW1iZXIgLSBOdW1iZXIgQXhpcywgY2F0ZWdvcnkgLSBDYXRlZ29yeSBBeGlzXG4gKiBAcGFyYW0gIHtMYXlvdXRUeXBlfSBsYXlvdXQgVGhlIHR5cGUgb2YgbGF5b3V0XG4gKiBAcGFyYW0gIHtCb29sZWFufSBmaWx0ZXJOaWwgV2hldGhlciBvciBub3QgZmlsdGVyIG5pbCB2YWx1ZXNcbiAqIEByZXR1cm4ge0FycmF5fSAgICAgICAgRG9tYWluXG4gKi9cbmV4cG9ydCB2YXIgZ2V0RG9tYWluT2ZJdGVtc1dpdGhTYW1lQXhpcyA9IGZ1bmN0aW9uIGdldERvbWFpbk9mSXRlbXNXaXRoU2FtZUF4aXMoZGF0YSwgaXRlbXMsIHR5cGUsIGxheW91dCwgZmlsdGVyTmlsKSB7XG4gIHZhciBkb21haW5zID0gaXRlbXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgdmFyIGRhdGFLZXkgPSBpdGVtLnByb3BzLmRhdGFLZXk7XG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGRhdGFLZXkpIHtcbiAgICAgIHJldHVybiBnZXREb21haW5PZkVycm9yQmFycyhkYXRhLCBpdGVtLCBkYXRhS2V5LCBsYXlvdXQpIHx8IGdldERvbWFpbk9mRGF0YUJ5S2V5KGRhdGEsIGRhdGFLZXksIHR5cGUsIGZpbHRlck5pbCk7XG4gICAgfVxuICAgIHJldHVybiBnZXREb21haW5PZkRhdGFCeUtleShkYXRhLCBkYXRhS2V5LCB0eXBlLCBmaWx0ZXJOaWwpO1xuICB9KTtcbiAgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkb21haW4gb2YgbnVtYmVyIGF4aXNcbiAgICByZXR1cm4gZG9tYWlucy5yZWR1Y2UoXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZiAodHlwZSA9PT0gbnVtYmVyKSBtZWFucyB0aGF0IHRoZSBkb21haW4gaXMgbnVtZXJpY2FsIHR5cGVcbiAgICAvLyAtIGJ1dCB0aGlzIGxpbmsgaXMgbWlzc2luZyBpbiB0aGUgdHlwZSBkZWZpbml0aW9uXG4gICAgZnVuY3Rpb24gKHJlc3VsdCwgZW50cnkpIHtcbiAgICAgIHJldHVybiBbTWF0aC5taW4ocmVzdWx0WzBdLCBlbnRyeVswXSksIE1hdGgubWF4KHJlc3VsdFsxXSwgZW50cnlbMV0pXTtcbiAgICB9LCBbSW5maW5pdHksIC1JbmZpbml0eV0pO1xuICB9XG4gIHZhciB0YWcgPSB7fTtcbiAgLy8gR2V0IHRoZSB1bmlvbiBzZXQgb2YgY2F0ZWdvcnkgYXhpc1xuICByZXR1cm4gZG9tYWlucy5yZWR1Y2UoZnVuY3Rpb24gKHJlc3VsdCwgZW50cnkpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZW50cnkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRGF0ZSBjYW5ub3QgaW5kZXggYW4gb2JqZWN0XG4gICAgICBpZiAoIXRhZ1tlbnRyeVtpXV0pIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBEYXRlIGNhbm5vdCBpbmRleCBhbiBvYmplY3RcbiAgICAgICAgdGFnW2VudHJ5W2ldXSA9IHRydWU7XG5cbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBEYXRlIGNhbm5vdCBpbmRleCBhbiBvYmplY3RcbiAgICAgICAgcmVzdWx0LnB1c2goZW50cnlbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCBbXSk7XG59O1xuZXhwb3J0IHZhciBpc0NhdGVnb3JpY2FsQXhpcyA9IGZ1bmN0aW9uIGlzQ2F0ZWdvcmljYWxBeGlzKGxheW91dCwgYXhpc1R5cGUpIHtcbiAgcmV0dXJuIGxheW91dCA9PT0gJ2hvcml6b250YWwnICYmIGF4aXNUeXBlID09PSAneEF4aXMnIHx8IGxheW91dCA9PT0gJ3ZlcnRpY2FsJyAmJiBheGlzVHlwZSA9PT0gJ3lBeGlzJyB8fCBsYXlvdXQgPT09ICdjZW50cmljJyAmJiBheGlzVHlwZSA9PT0gJ2FuZ2xlQXhpcycgfHwgbGF5b3V0ID09PSAncmFkaWFsJyAmJiBheGlzVHlwZSA9PT0gJ3JhZGl1c0F4aXMnO1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIENvb3JkaW5hdGVzIG9mIGdyaWRcbiAqIEBwYXJhbSAge0FycmF5fSB0aWNrcyAgICAgICAgICAgVGhlIHRpY2tzIGluIGF4aXNcbiAqIEBwYXJhbSB7TnVtYmVyfSBtaW5WYWx1ZSAgICAgICAgVGhlIG1pbmltdW4gdmFsdWUgb2YgYXhpc1xuICogQHBhcmFtIHtOdW1iZXJ9IG1heFZhbHVlICAgICAgICBUaGUgbWF4aW11biB2YWx1ZSBvZiBheGlzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHN5bmNXaXRoVGlja3MgIFN5bmNocm9uaXplIGdyaWQgbGluZXMgd2l0aCB0aWNrcyBvciBub3RcbiAqIEByZXR1cm4ge0FycmF5fSAgICAgICAgICAgICAgICAgQ29vcmRpbmF0ZXNcbiAqL1xuZXhwb3J0IHZhciBnZXRDb29yZGluYXRlc09mR3JpZCA9IGZ1bmN0aW9uIGdldENvb3JkaW5hdGVzT2ZHcmlkKHRpY2tzLCBtaW5WYWx1ZSwgbWF4VmFsdWUsIHN5bmNXaXRoVGlja3MpIHtcbiAgaWYgKHN5bmNXaXRoVGlja3MpIHtcbiAgICByZXR1cm4gdGlja3MubWFwKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgcmV0dXJuIGVudHJ5LmNvb3JkaW5hdGU7XG4gICAgfSk7XG4gIH1cbiAgdmFyIGhhc01pbiwgaGFzTWF4O1xuICB2YXIgdmFsdWVzID0gdGlja3MubWFwKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgIGlmIChlbnRyeS5jb29yZGluYXRlID09PSBtaW5WYWx1ZSkge1xuICAgICAgaGFzTWluID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGVudHJ5LmNvb3JkaW5hdGUgPT09IG1heFZhbHVlKSB7XG4gICAgICBoYXNNYXggPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnkuY29vcmRpbmF0ZTtcbiAgfSk7XG4gIGlmICghaGFzTWluKSB7XG4gICAgdmFsdWVzLnB1c2gobWluVmFsdWUpO1xuICB9XG4gIGlmICghaGFzTWF4KSB7XG4gICAgdmFsdWVzLnB1c2gobWF4VmFsdWUpO1xuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgdGlja3Mgb2YgYW4gYXhpc1xuICogQHBhcmFtICB7T2JqZWN0fSAgYXhpcyBUaGUgY29uZmlndXJhdGlvbiBvZiBhbiBheGlzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzR3JpZCBXaGV0aGVyIG9yIG5vdCBhcmUgdGhlIHRpY2tzIGluIGdyaWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNBbGwgUmV0dXJuIHRoZSB0aWNrcyBvZiBhbGwgdGhlIHBvaW50cyBvciBub3RcbiAqIEByZXR1cm4ge0FycmF5fSAgVGlja3NcbiAqL1xuZXhwb3J0IHZhciBnZXRUaWNrc09mQXhpcyA9IGZ1bmN0aW9uIGdldFRpY2tzT2ZBeGlzKGF4aXMsIGlzR3JpZCwgaXNBbGwpIHtcbiAgaWYgKCFheGlzKSByZXR1cm4gbnVsbDtcbiAgdmFyIHNjYWxlID0gYXhpcy5zY2FsZTtcbiAgdmFyIGR1cGxpY2F0ZURvbWFpbiA9IGF4aXMuZHVwbGljYXRlRG9tYWluLFxuICAgIHR5cGUgPSBheGlzLnR5cGUsXG4gICAgcmFuZ2UgPSBheGlzLnJhbmdlO1xuICB2YXIgb2Zmc2V0Rm9yQmFuZCA9IGF4aXMucmVhbFNjYWxlVHlwZSA9PT0gJ3NjYWxlQmFuZCcgPyBzY2FsZS5iYW5kd2lkdGgoKSAvIDIgOiAyO1xuICB2YXIgb2Zmc2V0ID0gKGlzR3JpZCB8fCBpc0FsbCkgJiYgdHlwZSA9PT0gJ2NhdGVnb3J5JyAmJiBzY2FsZS5iYW5kd2lkdGggPyBzY2FsZS5iYW5kd2lkdGgoKSAvIG9mZnNldEZvckJhbmQgOiAwO1xuICBvZmZzZXQgPSBheGlzLmF4aXNUeXBlID09PSAnYW5nbGVBeGlzJyAmJiAocmFuZ2UgPT09IG51bGwgfHwgcmFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhbmdlLmxlbmd0aCkgPj0gMiA/IG1hdGhTaWduKHJhbmdlWzBdIC0gcmFuZ2VbMV0pICogMiAqIG9mZnNldCA6IG9mZnNldDtcblxuICAvLyBUaGUgdGlja3Mgc2V0IGJ5IHVzZXIgc2hvdWxkIG9ubHkgYWZmZWN0IHRoZSB0aWNrcyBhZGphY2VudCB0byBheGlzIGxpbmVcbiAgaWYgKGlzR3JpZCAmJiAoYXhpcy50aWNrcyB8fCBheGlzLm5pY2VUaWNrcykpIHtcbiAgICB2YXIgcmVzdWx0ID0gKGF4aXMudGlja3MgfHwgYXhpcy5uaWNlVGlja3MpLm1hcChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgIHZhciBzY2FsZUNvbnRlbnQgPSBkdXBsaWNhdGVEb21haW4gPyBkdXBsaWNhdGVEb21haW4uaW5kZXhPZihlbnRyeSkgOiBlbnRyeTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC8vIElmIHRoZSBzY2FsZUNvbnRlbnQgaXMgbm90IGEgbnVtYmVyLCB0aGUgY29vcmRpbmF0ZSB3aWxsIGJlIE5hTi5cbiAgICAgICAgLy8gVGhhdCBjb3VsZCBiZSB0aGUgY2FzZSBmb3IgZXhhbXBsZSB3aXRoIGEgUG9pbnRTY2FsZSBhbmQgYSBzdHJpbmcgYXMgZG9tYWluLlxuICAgICAgICBjb29yZGluYXRlOiBzY2FsZShzY2FsZUNvbnRlbnQpICsgb2Zmc2V0LFxuICAgICAgICB2YWx1ZTogZW50cnksXG4gICAgICAgIG9mZnNldDogb2Zmc2V0XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJldHVybiAhaXNOYW4ocm93LmNvb3JkaW5hdGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gV2hlbiBheGlzIGlzIGEgY2F0ZWdvcmlhbCBheGlzLCBidXQgdGhlIHR5cGUgb2YgYXhpcyBpcyBudW1iZXIgb3IgdGhlIHNjYWxlIG9mIGF4aXMgaXMgbm90IFwiYXV0b1wiXG4gIGlmIChheGlzLmlzQ2F0ZWdvcmljYWwgJiYgYXhpcy5jYXRlZ29yaWNhbERvbWFpbikge1xuICAgIHJldHVybiBheGlzLmNhdGVnb3JpY2FsRG9tYWluLm1hcChmdW5jdGlvbiAoZW50cnksIGluZGV4KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb29yZGluYXRlOiBzY2FsZShlbnRyeSkgKyBvZmZzZXQsXG4gICAgICAgIHZhbHVlOiBlbnRyeSxcbiAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICBvZmZzZXQ6IG9mZnNldFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuICBpZiAoc2NhbGUudGlja3MgJiYgIWlzQWxsKSB7XG4gICAgcmV0dXJuIHNjYWxlLnRpY2tzKGF4aXMudGlja0NvdW50KS5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb29yZGluYXRlOiBzY2FsZShlbnRyeSkgKyBvZmZzZXQsXG4gICAgICAgIHZhbHVlOiBlbnRyeSxcbiAgICAgICAgb2Zmc2V0OiBvZmZzZXRcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBXaGVuIGF4aXMgaGFzIGR1cGxpY2F0ZWQgdGV4dCwgc2VyaWFsIG51bWJlcnMgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgc2NhbGVcbiAgcmV0dXJuIHNjYWxlLmRvbWFpbigpLm1hcChmdW5jdGlvbiAoZW50cnksIGluZGV4KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvb3JkaW5hdGU6IHNjYWxlKGVudHJ5KSArIG9mZnNldCxcbiAgICAgIHZhbHVlOiBkdXBsaWNhdGVEb21haW4gPyBkdXBsaWNhdGVEb21haW5bZW50cnldIDogZW50cnksXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBvZmZzZXQ6IG9mZnNldFxuICAgIH07XG4gIH0pO1xufTtcblxuLyoqXG4gKiBjb21iaW5lIHRoZSBoYW5kbGVyc1xuICogQHBhcmFtICB7RnVuY3Rpb259IGRlZmF1bHRIYW5kbGVyIEludGVybmFsIHByaXZhdGUgaGFuZGxlclxuICogQHBhcmFtICB7RnVuY3Rpb259IGNoaWxkSGFuZGxlciBIYW5kbGVyIGZ1bmN0aW9uIHNwZWNpZmllZCBpbiBjaGlsZCBjb21wb25lbnRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSAgICAgICAgICAgICAgICBUaGUgY29tYmluZWQgaGFuZGxlclxuICovXG5cbnZhciBoYW5kbGVyV2Vha01hcCA9IG5ldyBXZWFrTWFwKCk7XG5leHBvcnQgdmFyIGNvbWJpbmVFdmVudEhhbmRsZXJzID0gZnVuY3Rpb24gY29tYmluZUV2ZW50SGFuZGxlcnMoZGVmYXVsdEhhbmRsZXIsIGNoaWxkSGFuZGxlcikge1xuICBpZiAodHlwZW9mIGNoaWxkSGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBkZWZhdWx0SGFuZGxlcjtcbiAgfVxuICBpZiAoIWhhbmRsZXJXZWFrTWFwLmhhcyhkZWZhdWx0SGFuZGxlcikpIHtcbiAgICBoYW5kbGVyV2Vha01hcC5zZXQoZGVmYXVsdEhhbmRsZXIsIG5ldyBXZWFrTWFwKCkpO1xuICB9XG4gIHZhciBjaGlsZFdlYWtNYXAgPSBoYW5kbGVyV2Vha01hcC5nZXQoZGVmYXVsdEhhbmRsZXIpO1xuICBpZiAoY2hpbGRXZWFrTWFwLmhhcyhjaGlsZEhhbmRsZXIpKSB7XG4gICAgcmV0dXJuIGNoaWxkV2Vha01hcC5nZXQoY2hpbGRIYW5kbGVyKTtcbiAgfVxuICB2YXIgY29tYmluZUhhbmRsZXIgPSBmdW5jdGlvbiBjb21iaW5lSGFuZGxlcigpIHtcbiAgICBkZWZhdWx0SGFuZGxlci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgY2hpbGRIYW5kbGVyLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgfTtcbiAgY2hpbGRXZWFrTWFwLnNldChjaGlsZEhhbmRsZXIsIGNvbWJpbmVIYW5kbGVyKTtcbiAgcmV0dXJuIGNvbWJpbmVIYW5kbGVyO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgc2NhbGUgZnVuY3Rpb24gb2YgYXhpc1xuICogQHBhcmFtICB7T2JqZWN0fSAgIGF4aXMgICAgICAgICAgVGhlIG9wdGlvbiBvZiBheGlzXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgY2hhcnRUeXBlICAgICBUaGUgZGlzcGxheU5hbWUgb2YgY2hhcnRcbiAqIEBwYXJhbSAge0Jvb2xlYW59ICBoYXNCYXIgICAgICAgIGlmIGl0IGhhcyBhIGJhclxuICogQHJldHVybiB7b2JqZWN0fSAgICAgICAgICAgICAgIFRoZSBzY2FsZSBmdW5jdGlvbiBhbmQgcmVzb2x2ZWQgbmFtZVxuICovXG5leHBvcnQgdmFyIHBhcnNlU2NhbGUgPSBmdW5jdGlvbiBwYXJzZVNjYWxlKGF4aXMsIGNoYXJ0VHlwZSwgaGFzQmFyKSB7XG4gIHZhciBzY2FsZSA9IGF4aXMuc2NhbGUsXG4gICAgdHlwZSA9IGF4aXMudHlwZSxcbiAgICBsYXlvdXQgPSBheGlzLmxheW91dCxcbiAgICBheGlzVHlwZSA9IGF4aXMuYXhpc1R5cGU7XG4gIGlmIChzY2FsZSA9PT0gJ2F1dG8nKSB7XG4gICAgaWYgKGxheW91dCA9PT0gJ3JhZGlhbCcgJiYgYXhpc1R5cGUgPT09ICdyYWRpdXNBeGlzJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2NhbGU6IGQzU2NhbGVzLnNjYWxlQmFuZCgpLFxuICAgICAgICByZWFsU2NhbGVUeXBlOiAnYmFuZCdcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChsYXlvdXQgPT09ICdyYWRpYWwnICYmIGF4aXNUeXBlID09PSAnYW5nbGVBeGlzJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2NhbGU6IGQzU2NhbGVzLnNjYWxlTGluZWFyKCksXG4gICAgICAgIHJlYWxTY2FsZVR5cGU6ICdsaW5lYXInXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ2NhdGVnb3J5JyAmJiBjaGFydFR5cGUgJiYgKGNoYXJ0VHlwZS5pbmRleE9mKCdMaW5lQ2hhcnQnKSA+PSAwIHx8IGNoYXJ0VHlwZS5pbmRleE9mKCdBcmVhQ2hhcnQnKSA+PSAwIHx8IGNoYXJ0VHlwZS5pbmRleE9mKCdDb21wb3NlZENoYXJ0JykgPj0gMCAmJiAhaGFzQmFyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2NhbGU6IGQzU2NhbGVzLnNjYWxlUG9pbnQoKSxcbiAgICAgICAgcmVhbFNjYWxlVHlwZTogJ3BvaW50J1xuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdjYXRlZ29yeScpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjYWxlOiBkM1NjYWxlcy5zY2FsZUJhbmQoKSxcbiAgICAgICAgcmVhbFNjYWxlVHlwZTogJ2JhbmQnXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2NhbGU6IGQzU2NhbGVzLnNjYWxlTGluZWFyKCksXG4gICAgICByZWFsU2NhbGVUeXBlOiAnbGluZWFyJ1xuICAgIH07XG4gIH1cbiAgaWYgKGlzU3RyaW5nKHNjYWxlKSkge1xuICAgIHZhciBuYW1lID0gXCJzY2FsZVwiLmNvbmNhdCh1cHBlckZpcnN0KHNjYWxlKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjYWxlOiAoZDNTY2FsZXNbbmFtZV0gfHwgZDNTY2FsZXMuc2NhbGVQb2ludCkoKSxcbiAgICAgIHJlYWxTY2FsZVR5cGU6IGQzU2NhbGVzW25hbWVdID8gbmFtZSA6ICdwb2ludCdcbiAgICB9O1xuICB9XG4gIHJldHVybiBpc0Z1bmN0aW9uKHNjYWxlKSA/IHtcbiAgICBzY2FsZTogc2NhbGVcbiAgfSA6IHtcbiAgICBzY2FsZTogZDNTY2FsZXMuc2NhbGVQb2ludCgpLFxuICAgIHJlYWxTY2FsZVR5cGU6ICdwb2ludCdcbiAgfTtcbn07XG52YXIgRVBTID0gMWUtNDtcbmV4cG9ydCB2YXIgY2hlY2tEb21haW5PZlNjYWxlID0gZnVuY3Rpb24gY2hlY2tEb21haW5PZlNjYWxlKHNjYWxlKSB7XG4gIHZhciBkb21haW4gPSBzY2FsZS5kb21haW4oKTtcbiAgaWYgKCFkb21haW4gfHwgZG9tYWluLmxlbmd0aCA8PSAyKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBsZW4gPSBkb21haW4ubGVuZ3RoO1xuICB2YXIgcmFuZ2UgPSBzY2FsZS5yYW5nZSgpO1xuICB2YXIgbWluVmFsdWUgPSBNYXRoLm1pbihyYW5nZVswXSwgcmFuZ2VbMV0pIC0gRVBTO1xuICB2YXIgbWF4VmFsdWUgPSBNYXRoLm1heChyYW5nZVswXSwgcmFuZ2VbMV0pICsgRVBTO1xuICB2YXIgZmlyc3QgPSBzY2FsZShkb21haW5bMF0pO1xuICB2YXIgbGFzdCA9IHNjYWxlKGRvbWFpbltsZW4gLSAxXSk7XG4gIGlmIChmaXJzdCA8IG1pblZhbHVlIHx8IGZpcnN0ID4gbWF4VmFsdWUgfHwgbGFzdCA8IG1pblZhbHVlIHx8IGxhc3QgPiBtYXhWYWx1ZSkge1xuICAgIHNjYWxlLmRvbWFpbihbZG9tYWluWzBdLCBkb21haW5bbGVuIC0gMV1dKTtcbiAgfVxufTtcbmV4cG9ydCB2YXIgZmluZFBvc2l0aW9uT2ZCYXIgPSBmdW5jdGlvbiBmaW5kUG9zaXRpb25PZkJhcihiYXJQb3NpdGlvbiwgY2hpbGQpIHtcbiAgaWYgKCFiYXJQb3NpdGlvbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBiYXJQb3NpdGlvbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChiYXJQb3NpdGlvbltpXS5pdGVtID09PSBjaGlsZCkge1xuICAgICAgcmV0dXJuIGJhclBvc2l0aW9uW2ldLnBvc2l0aW9uO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogQm90aCB2YWx1ZSBhbmQgZG9tYWluIGFyZSB0dXBsZXMgb2YgdHdvIG51bWJlcnNcbiAqIC0gYnV0IHRoZSB0eXBlIHN0YXlzIGFzIGFycmF5IG9mIG51bWJlcnMgdW50aWwgd2UgaGF2ZSBiZXR0ZXIgc3VwcG9ydCBpbiByZXN0IG9mIHRoZSBhcHBcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlIGlucHV0IHRoYXQgd2lsbCBiZSB0cnVuY2F0ZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGRvbWFpbiBib3VuZGFyaWVzXG4gKiBAcmV0dXJucyB7QXJyYXl9IHR1cGxlIG9mIHR3byBudW1iZXJzXG4gKi9cbmV4cG9ydCB2YXIgdHJ1bmNhdGVCeURvbWFpbiA9IGZ1bmN0aW9uIHRydW5jYXRlQnlEb21haW4odmFsdWUsIGRvbWFpbikge1xuICBpZiAoIWRvbWFpbiB8fCBkb21haW4ubGVuZ3RoICE9PSAyIHx8ICFpc051bWJlcihkb21haW5bMF0pIHx8ICFpc051bWJlcihkb21haW5bMV0pKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciBtaW5WYWx1ZSA9IE1hdGgubWluKGRvbWFpblswXSwgZG9tYWluWzFdKTtcbiAgdmFyIG1heFZhbHVlID0gTWF0aC5tYXgoZG9tYWluWzBdLCBkb21haW5bMV0pO1xuICB2YXIgcmVzdWx0ID0gW3ZhbHVlWzBdLCB2YWx1ZVsxXV07XG4gIGlmICghaXNOdW1iZXIodmFsdWVbMF0pIHx8IHZhbHVlWzBdIDwgbWluVmFsdWUpIHtcbiAgICByZXN1bHRbMF0gPSBtaW5WYWx1ZTtcbiAgfVxuICBpZiAoIWlzTnVtYmVyKHZhbHVlWzFdKSB8fCB2YWx1ZVsxXSA+IG1heFZhbHVlKSB7XG4gICAgcmVzdWx0WzFdID0gbWF4VmFsdWU7XG4gIH1cbiAgaWYgKHJlc3VsdFswXSA+IG1heFZhbHVlKSB7XG4gICAgcmVzdWx0WzBdID0gbWF4VmFsdWU7XG4gIH1cbiAgaWYgKHJlc3VsdFsxXSA8IG1pblZhbHVlKSB7XG4gICAgcmVzdWx0WzFdID0gbWluVmFsdWU7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogU3RhY2tzIGFsbCBwb3NpdGl2ZSBudW1iZXJzIGFib3ZlIHplcm8gYW5kIGFsbCBuZWdhdGl2ZSBudW1iZXJzIGJlbG93IHplcm8uXG4gKlxuICogSWYgYWxsIHZhbHVlcyBpbiB0aGUgc2VyaWVzIGFyZSBwb3NpdGl2ZSB0aGVuIHRoaXMgYmVoYXZlcyB0aGUgc2FtZSBhcyAnbm9uZScgc3RhY2tlci5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBzZXJpZXMgZnJvbSBkMy1zaGFwZSBTdGFja1xuICogQHJldHVybiB7QXJyYXl9IHNlcmllcyB3aXRoIGFwcGxpZWQgb2Zmc2V0XG4gKi9cbmV4cG9ydCB2YXIgb2Zmc2V0U2lnbiA9IGZ1bmN0aW9uIG9mZnNldFNpZ24oc2VyaWVzKSB7XG4gIHZhciBuID0gc2VyaWVzLmxlbmd0aDtcbiAgaWYgKG4gPD0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKHZhciBqID0gMCwgbSA9IHNlcmllc1swXS5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICB2YXIgcG9zaXRpdmUgPSAwO1xuICAgIHZhciBuZWdhdGl2ZSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGlzTmFuKHNlcmllc1tpXVtqXVsxXSkgPyBzZXJpZXNbaV1bal1bMF0gOiBzZXJpZXNbaV1bal1bMV07XG5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHByZWZlci1kZXN0cnVjdHVyaW5nLCBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgICAgaWYgKHZhbHVlID49IDApIHtcbiAgICAgICAgc2VyaWVzW2ldW2pdWzBdID0gcG9zaXRpdmU7XG4gICAgICAgIHNlcmllc1tpXVtqXVsxXSA9IHBvc2l0aXZlICsgdmFsdWU7XG4gICAgICAgIHBvc2l0aXZlID0gc2VyaWVzW2ldW2pdWzFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VyaWVzW2ldW2pdWzBdID0gbmVnYXRpdmU7XG4gICAgICAgIHNlcmllc1tpXVtqXVsxXSA9IG5lZ2F0aXZlICsgdmFsdWU7XG4gICAgICAgIG5lZ2F0aXZlID0gc2VyaWVzW2ldW2pdWzFdO1xuICAgICAgfVxuICAgICAgLyogZXNsaW50LWVuYWJsZSBwcmVmZXItZGVzdHJ1Y3R1cmluZywgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmVwbGFjZXMgYWxsIG5lZ2F0aXZlIHZhbHVlcyB3aXRoIHplcm8gd2hlbiBzdGFja2luZyBkYXRhLlxuICpcbiAqIElmIGFsbCB2YWx1ZXMgaW4gdGhlIHNlcmllcyBhcmUgcG9zaXRpdmUgdGhlbiB0aGlzIGJlaGF2ZXMgdGhlIHNhbWUgYXMgJ25vbmUnIHN0YWNrZXIuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc2VyaWVzIGZyb20gZDMtc2hhcGUgU3RhY2tcbiAqIEByZXR1cm4ge0FycmF5fSBzZXJpZXMgd2l0aCBhcHBsaWVkIG9mZnNldFxuICovXG5leHBvcnQgdmFyIG9mZnNldFBvc2l0aXZlID0gZnVuY3Rpb24gb2Zmc2V0UG9zaXRpdmUoc2VyaWVzKSB7XG4gIHZhciBuID0gc2VyaWVzLmxlbmd0aDtcbiAgaWYgKG4gPD0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKHZhciBqID0gMCwgbSA9IHNlcmllc1swXS5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICB2YXIgcG9zaXRpdmUgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB2YXIgdmFsdWUgPSBpc05hbihzZXJpZXNbaV1bal1bMV0pID8gc2VyaWVzW2ldW2pdWzBdIDogc2VyaWVzW2ldW2pdWzFdO1xuXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItZGVzdHJ1Y3R1cmluZywgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbiAgICAgIGlmICh2YWx1ZSA+PSAwKSB7XG4gICAgICAgIHNlcmllc1tpXVtqXVswXSA9IHBvc2l0aXZlO1xuICAgICAgICBzZXJpZXNbaV1bal1bMV0gPSBwb3NpdGl2ZSArIHZhbHVlO1xuICAgICAgICBwb3NpdGl2ZSA9IHNlcmllc1tpXVtqXVsxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcmllc1tpXVtqXVswXSA9IDA7XG4gICAgICAgIHNlcmllc1tpXVtqXVsxXSA9IDA7XG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHByZWZlci1kZXN0cnVjdHVyaW5nLCBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0eXBlIHRvIGNvbXB1dGUgb2Zmc2V0IGZvciBzdGFja2VkIGRhdGEuXG4gKlxuICogZDMtc2hhcGUgaGFzIHNvbWV0aGluZyBmaXNoeSBnb2luZyBvbiB3aXRoIGl0cyB0eXBlcy5cbiAqIEluIEBkZWZpbml0ZWx5dHlwZWQvZDMtc2hhcGUsIHRoaXMgZnVuY3Rpb24gKHRoZSBvZmZzZXQgYWNjZXNzb3IpIGlzIHR5cGVkIGFzIFNlcmllczw+ID0+IHZvaWQuXG4gKiBIb3dldmVyISBXaGVuIEkgYWN0dWFsbHkgb3BlbiB0aGUgc3Rvcnlib29rIEkgY2FuIHNlZSB0aGF0IHRoZSBvZmZzZXQgYWNjZXNzb3IgYWN0dWFsbHkgcmVjZWl2ZXMgQXJyYXk8U2VyaWVzPD4+LlxuICogVGhlIHNhbWUgSSBjYW4gc2VlIGluIHRoZSBzb3VyY2UgY29kZSBpdHNlbGY6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vRGVmaW5pdGVseVR5cGVkL0RlZmluaXRlbHlUeXBlZC9kaXNjdXNzaW9ucy82NjA0MlxuICogVGhhdCBvbmUgdW5mb3J0dW5hdGVseSBoYXMgbm8gdHlwZXMgYnV0IHdlIGNhbiB0ZWxsIGl0IHBhc3NlcyB0aHJlZS1kaW1lbnNpb25hbCBhcnJheS5cbiAqXG4gKiBXaGljaCBsZWFkcyBtZSB0byBiZWxpZXZlIHRoYXQgZGVmaW5pdGVseXR5cGVkIGlzIHdyb25nIG9uIHRoaXMgb25lLlxuICogVGhlcmUncyBvcGVuIGRpc2N1c3Npb24gb24gdGhpcyB0b3BpYyB3aXRob3V0IG11Y2ggYXR0ZW50aW9uOlxuICogaHR0cHM6Ly9naXRodWIuY29tL0RlZmluaXRlbHlUeXBlZC9EZWZpbml0ZWx5VHlwZWQvZGlzY3Vzc2lvbnMvNjYwNDJcbiAqL1xuXG52YXIgU1RBQ0tfT0ZGU0VUX01BUCA9IHtcbiAgc2lnbjogb2Zmc2V0U2lnbixcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBkZWZpbml0ZWx5dHlwZWQgdHlwZXMgYXJlIGluY29ycmVjdFxuICBleHBhbmQ6IHN0YWNrT2Zmc2V0RXhwYW5kLFxuICAvLyBAdHMtZXhwZWN0LWVycm9yIGRlZmluaXRlbHl0eXBlZCB0eXBlcyBhcmUgaW5jb3JyZWN0XG4gIG5vbmU6IHN0YWNrT2Zmc2V0Tm9uZSxcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBkZWZpbml0ZWx5dHlwZWQgdHlwZXMgYXJlIGluY29ycmVjdFxuICBzaWxob3VldHRlOiBzdGFja09mZnNldFNpbGhvdWV0dGUsXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgZGVmaW5pdGVseXR5cGVkIHR5cGVzIGFyZSBpbmNvcnJlY3RcbiAgd2lnZ2xlOiBzdGFja09mZnNldFdpZ2dsZSxcbiAgcG9zaXRpdmU6IG9mZnNldFBvc2l0aXZlXG59O1xuZXhwb3J0IHZhciBnZXRTdGFja2VkRGF0YSA9IGZ1bmN0aW9uIGdldFN0YWNrZWREYXRhKGRhdGEsIHN0YWNrSXRlbXMsIG9mZnNldFR5cGUpIHtcbiAgdmFyIGRhdGFLZXlzID0gc3RhY2tJdGVtcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbS5wcm9wcy5kYXRhS2V5O1xuICB9KTtcbiAgdmFyIG9mZnNldEFjY2Vzc29yID0gU1RBQ0tfT0ZGU0VUX01BUFtvZmZzZXRUeXBlXTtcbiAgdmFyIHN0YWNrID0gc2hhcGVTdGFjaygpXG4gIC8vIEB0cy1leHBlY3QtZXJyb3Igc3RhY2sua2V5cyB0eXBlIHdhbnRzIGFuIGFycmF5IG9mIHN0cmluZ3MsIGJ1dCB3ZSBwcm92aWRlIGFycmF5IG9mIERhdGFLZXlzXG4gIC5rZXlzKGRhdGFLZXlzKS52YWx1ZShmdW5jdGlvbiAoZCwga2V5KSB7XG4gICAgcmV0dXJuICtnZXRWYWx1ZUJ5RGF0YUtleShkLCBrZXksIDApO1xuICB9KS5vcmRlcihzdGFja09yZGVyTm9uZSlcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBkZWZpbml0ZWx5dHlwZWQgdHlwZXMgYXJlIGluY29ycmVjdFxuICAub2Zmc2V0KG9mZnNldEFjY2Vzc29yKTtcbiAgcmV0dXJuIHN0YWNrKGRhdGEpO1xufTtcbmV4cG9ydCB2YXIgZ2V0U3RhY2tHcm91cHNCeUF4aXNJZCA9IGZ1bmN0aW9uIGdldFN0YWNrR3JvdXBzQnlBeGlzSWQoZGF0YSwgX2l0ZW1zLCBudW1lcmljQXhpc0lkLCBjYXRlQXhpc0lkLCBvZmZzZXRUeXBlLCByZXZlcnNlU3RhY2tPcmRlcikge1xuICBpZiAoIWRhdGEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIHJldmVyc2luZyBpdGVtcyB0byBhZmZlY3QgcmVuZGVyIG9yZGVyIChmb3IgbGF5ZXJpbmcpXG4gIHZhciBpdGVtcyA9IHJldmVyc2VTdGFja09yZGVyID8gX2l0ZW1zLnJldmVyc2UoKSA6IF9pdGVtcztcbiAgdmFyIHBhcmVudFN0YWNrR3JvdXBzSW5pdGlhbFZhbHVlID0ge307XG4gIHZhciBzdGFja0dyb3VwcyA9IGl0ZW1zLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBpdGVtKSB7XG4gICAgdmFyIF9pdGVtJHR5cGUyO1xuICAgIHZhciBkZWZhdWx0ZWRQcm9wcyA9IChfaXRlbSR0eXBlMiA9IGl0ZW0udHlwZSkgIT09IG51bGwgJiYgX2l0ZW0kdHlwZTIgIT09IHZvaWQgMCAmJiBfaXRlbSR0eXBlMi5kZWZhdWx0UHJvcHMgPyBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGl0ZW0udHlwZS5kZWZhdWx0UHJvcHMpLCBpdGVtLnByb3BzKSA6IGl0ZW0ucHJvcHM7XG4gICAgdmFyIHN0YWNrSWQgPSBkZWZhdWx0ZWRQcm9wcy5zdGFja0lkLFxuICAgICAgaGlkZSA9IGRlZmF1bHRlZFByb3BzLmhpZGU7XG4gICAgaWYgKGhpZGUpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHZhciBheGlzSWQgPSBkZWZhdWx0ZWRQcm9wc1tudW1lcmljQXhpc0lkXTtcbiAgICB2YXIgcGFyZW50R3JvdXAgPSByZXN1bHRbYXhpc0lkXSB8fCB7XG4gICAgICBoYXNTdGFjazogZmFsc2UsXG4gICAgICBzdGFja0dyb3Vwczoge31cbiAgICB9O1xuICAgIGlmIChpc051bU9yU3RyKHN0YWNrSWQpKSB7XG4gICAgICB2YXIgY2hpbGRHcm91cCA9IHBhcmVudEdyb3VwLnN0YWNrR3JvdXBzW3N0YWNrSWRdIHx8IHtcbiAgICAgICAgbnVtZXJpY0F4aXNJZDogbnVtZXJpY0F4aXNJZCxcbiAgICAgICAgY2F0ZUF4aXNJZDogY2F0ZUF4aXNJZCxcbiAgICAgICAgaXRlbXM6IFtdXG4gICAgICB9O1xuICAgICAgY2hpbGRHcm91cC5pdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgcGFyZW50R3JvdXAuaGFzU3RhY2sgPSB0cnVlO1xuICAgICAgcGFyZW50R3JvdXAuc3RhY2tHcm91cHNbc3RhY2tJZF0gPSBjaGlsZEdyb3VwO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRHcm91cC5zdGFja0dyb3Vwc1t1bmlxdWVJZCgnX3N0YWNrSWRfJyldID0ge1xuICAgICAgICBudW1lcmljQXhpc0lkOiBudW1lcmljQXhpc0lkLFxuICAgICAgICBjYXRlQXhpc0lkOiBjYXRlQXhpc0lkLFxuICAgICAgICBpdGVtczogW2l0ZW1dXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCByZXN1bHQpLCB7fSwgX2RlZmluZVByb3BlcnR5KHt9LCBheGlzSWQsIHBhcmVudEdyb3VwKSk7XG4gIH0sIHBhcmVudFN0YWNrR3JvdXBzSW5pdGlhbFZhbHVlKTtcbiAgdmFyIGF4aXNTdGFja0dyb3Vwc0luaXRpYWxWYWx1ZSA9IHt9O1xuICByZXR1cm4gT2JqZWN0LmtleXMoc3RhY2tHcm91cHMpLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBheGlzSWQpIHtcbiAgICB2YXIgZ3JvdXAgPSBzdGFja0dyb3Vwc1theGlzSWRdO1xuICAgIGlmIChncm91cC5oYXNTdGFjaykge1xuICAgICAgdmFyIHN0YWNrR3JvdXBzSW5pdGlhbFZhbHVlID0ge307XG4gICAgICBncm91cC5zdGFja0dyb3VwcyA9IE9iamVjdC5rZXlzKGdyb3VwLnN0YWNrR3JvdXBzKS5yZWR1Y2UoZnVuY3Rpb24gKHJlcywgc3RhY2tJZCkge1xuICAgICAgICB2YXIgZyA9IGdyb3VwLnN0YWNrR3JvdXBzW3N0YWNrSWRdO1xuICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCByZXMpLCB7fSwgX2RlZmluZVByb3BlcnR5KHt9LCBzdGFja0lkLCB7XG4gICAgICAgICAgbnVtZXJpY0F4aXNJZDogbnVtZXJpY0F4aXNJZCxcbiAgICAgICAgICBjYXRlQXhpc0lkOiBjYXRlQXhpc0lkLFxuICAgICAgICAgIGl0ZW1zOiBnLml0ZW1zLFxuICAgICAgICAgIHN0YWNrZWREYXRhOiBnZXRTdGFja2VkRGF0YShkYXRhLCBnLml0ZW1zLCBvZmZzZXRUeXBlKVxuICAgICAgICB9KSk7XG4gICAgICB9LCBzdGFja0dyb3Vwc0luaXRpYWxWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHJlc3VsdCksIHt9LCBfZGVmaW5lUHJvcGVydHkoe30sIGF4aXNJZCwgZ3JvdXApKTtcbiAgfSwgYXhpc1N0YWNrR3JvdXBzSW5pdGlhbFZhbHVlKTtcbn07XG5cbi8qKlxuICogQ29uZmlndXJlIHRoZSBzY2FsZSBmdW5jdGlvbiBvZiBheGlzXG4gKiBAcGFyYW0ge09iamVjdH0gc2NhbGUgVGhlIHNjYWxlIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAgVGhlIGNvbmZpZ3VyYXRpb24gb2YgYXhpc1xuICogQHJldHVybiB7T2JqZWN0fSAgICAgIG51bGxcbiAqL1xuZXhwb3J0IHZhciBnZXRUaWNrc09mU2NhbGUgPSBmdW5jdGlvbiBnZXRUaWNrc09mU2NhbGUoc2NhbGUsIG9wdHMpIHtcbiAgdmFyIHJlYWxTY2FsZVR5cGUgPSBvcHRzLnJlYWxTY2FsZVR5cGUsXG4gICAgdHlwZSA9IG9wdHMudHlwZSxcbiAgICB0aWNrQ291bnQgPSBvcHRzLnRpY2tDb3VudCxcbiAgICBvcmlnaW5hbERvbWFpbiA9IG9wdHMub3JpZ2luYWxEb21haW4sXG4gICAgYWxsb3dEZWNpbWFscyA9IG9wdHMuYWxsb3dEZWNpbWFscztcbiAgdmFyIHNjYWxlVHlwZSA9IHJlYWxTY2FsZVR5cGUgfHwgb3B0cy5zY2FsZTtcbiAgaWYgKHNjYWxlVHlwZSAhPT0gJ2F1dG8nICYmIHNjYWxlVHlwZSAhPT0gJ2xpbmVhcicpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAodGlja0NvdW50ICYmIHR5cGUgPT09ICdudW1iZXInICYmIG9yaWdpbmFsRG9tYWluICYmIChvcmlnaW5hbERvbWFpblswXSA9PT0gJ2F1dG8nIHx8IG9yaWdpbmFsRG9tYWluWzFdID09PSAnYXV0bycpKSB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSB0aWNrcyBieSB0aGUgbnVtYmVyIG9mIGdyaWQgd2hlbiB0aGUgYXhpcyBpcyBhIG51bWJlciBheGlzXG4gICAgdmFyIGRvbWFpbiA9IHNjYWxlLmRvbWFpbigpO1xuICAgIGlmICghZG9tYWluLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciB0aWNrVmFsdWVzID0gZ2V0TmljZVRpY2tWYWx1ZXMoZG9tYWluLCB0aWNrQ291bnQsIGFsbG93RGVjaW1hbHMpO1xuICAgIHNjYWxlLmRvbWFpbihbbWluKHRpY2tWYWx1ZXMpLCBtYXgodGlja1ZhbHVlcyldKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmljZVRpY2tzOiB0aWNrVmFsdWVzXG4gICAgfTtcbiAgfVxuICBpZiAodGlja0NvdW50ICYmIHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgdmFyIF9kb21haW4gPSBzY2FsZS5kb21haW4oKTtcbiAgICB2YXIgX3RpY2tWYWx1ZXMgPSBnZXRUaWNrVmFsdWVzRml4ZWREb21haW4oX2RvbWFpbiwgdGlja0NvdW50LCBhbGxvd0RlY2ltYWxzKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmljZVRpY2tzOiBfdGlja1ZhbHVlc1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhdGVDb29yZGluYXRlT2ZMaW5lKF9yZWY1KSB7XG4gIHZhciBheGlzID0gX3JlZjUuYXhpcyxcbiAgICB0aWNrcyA9IF9yZWY1LnRpY2tzLFxuICAgIGJhbmRTaXplID0gX3JlZjUuYmFuZFNpemUsXG4gICAgZW50cnkgPSBfcmVmNS5lbnRyeSxcbiAgICBpbmRleCA9IF9yZWY1LmluZGV4LFxuICAgIGRhdGFLZXkgPSBfcmVmNS5kYXRhS2V5O1xuICBpZiAoYXhpcy50eXBlID09PSAnY2F0ZWdvcnknKSB7XG4gICAgLy8gZmluZCBjb29yZGluYXRlIG9mIGNhdGVnb3J5IGF4aXMgYnkgdGhlIHZhbHVlIG9mIGNhdGVnb3J5XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB3aHkgZG9lcyB0aGlzIHVzZSBkaXJlY3Qgb2JqZWN0IGFjY2VzcyBpbnN0ZWFkIG9mIGdldFZhbHVlQnlEYXRhS2V5P1xuICAgIGlmICghYXhpcy5hbGxvd0R1cGxpY2F0ZWRDYXRlZ29yeSAmJiBheGlzLmRhdGFLZXkgJiYgIWlzTmlsKGVudHJ5W2F4aXMuZGF0YUtleV0pKSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHdoeSBkb2VzIHRoaXMgdXNlIGRpcmVjdCBvYmplY3QgYWNjZXNzIGluc3RlYWQgb2YgZ2V0VmFsdWVCeURhdGFLZXk/XG4gICAgICB2YXIgbWF0Y2hlZFRpY2sgPSBmaW5kRW50cnlJbkFycmF5KHRpY2tzLCAndmFsdWUnLCBlbnRyeVtheGlzLmRhdGFLZXldKTtcbiAgICAgIGlmIChtYXRjaGVkVGljaykge1xuICAgICAgICByZXR1cm4gbWF0Y2hlZFRpY2suY29vcmRpbmF0ZSArIGJhbmRTaXplIC8gMjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRpY2tzW2luZGV4XSA/IHRpY2tzW2luZGV4XS5jb29yZGluYXRlICsgYmFuZFNpemUgLyAyIDogbnVsbDtcbiAgfVxuICB2YXIgdmFsdWUgPSBnZXRWYWx1ZUJ5RGF0YUtleShlbnRyeSwgIWlzTmlsKGRhdGFLZXkpID8gZGF0YUtleSA6IGF4aXMuZGF0YUtleSk7XG4gIHJldHVybiAhaXNOaWwodmFsdWUpID8gYXhpcy5zY2FsZSh2YWx1ZSkgOiBudWxsO1xufVxuZXhwb3J0IHZhciBnZXRDYXRlQ29vcmRpbmF0ZU9mQmFyID0gZnVuY3Rpb24gZ2V0Q2F0ZUNvb3JkaW5hdGVPZkJhcihfcmVmNikge1xuICB2YXIgYXhpcyA9IF9yZWY2LmF4aXMsXG4gICAgdGlja3MgPSBfcmVmNi50aWNrcyxcbiAgICBvZmZzZXQgPSBfcmVmNi5vZmZzZXQsXG4gICAgYmFuZFNpemUgPSBfcmVmNi5iYW5kU2l6ZSxcbiAgICBlbnRyeSA9IF9yZWY2LmVudHJ5LFxuICAgIGluZGV4ID0gX3JlZjYuaW5kZXg7XG4gIGlmIChheGlzLnR5cGUgPT09ICdjYXRlZ29yeScpIHtcbiAgICByZXR1cm4gdGlja3NbaW5kZXhdID8gdGlja3NbaW5kZXhdLmNvb3JkaW5hdGUgKyBvZmZzZXQgOiBudWxsO1xuICB9XG4gIHZhciB2YWx1ZSA9IGdldFZhbHVlQnlEYXRhS2V5KGVudHJ5LCBheGlzLmRhdGFLZXksIGF4aXMuZG9tYWluW2luZGV4XSk7XG4gIHJldHVybiAhaXNOaWwodmFsdWUpID8gYXhpcy5zY2FsZSh2YWx1ZSkgLSBiYW5kU2l6ZSAvIDIgKyBvZmZzZXQgOiBudWxsO1xufTtcbmV4cG9ydCB2YXIgZ2V0QmFzZVZhbHVlT2ZCYXIgPSBmdW5jdGlvbiBnZXRCYXNlVmFsdWVPZkJhcihfcmVmNykge1xuICB2YXIgbnVtZXJpY0F4aXMgPSBfcmVmNy5udW1lcmljQXhpcztcbiAgdmFyIGRvbWFpbiA9IG51bWVyaWNBeGlzLnNjYWxlLmRvbWFpbigpO1xuICBpZiAobnVtZXJpY0F4aXMudHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICB2YXIgbWluVmFsdWUgPSBNYXRoLm1pbihkb21haW5bMF0sIGRvbWFpblsxXSk7XG4gICAgdmFyIG1heFZhbHVlID0gTWF0aC5tYXgoZG9tYWluWzBdLCBkb21haW5bMV0pO1xuICAgIGlmIChtaW5WYWx1ZSA8PSAwICYmIG1heFZhbHVlID49IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAobWF4VmFsdWUgPCAwKSB7XG4gICAgICByZXR1cm4gbWF4VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBtaW5WYWx1ZTtcbiAgfVxuICByZXR1cm4gZG9tYWluWzBdO1xufTtcbmV4cG9ydCB2YXIgZ2V0U3RhY2tlZERhdGFPZkl0ZW0gPSBmdW5jdGlvbiBnZXRTdGFja2VkRGF0YU9mSXRlbShpdGVtLCBzdGFja0dyb3Vwcykge1xuICB2YXIgX2l0ZW0kdHlwZTM7XG4gIHZhciBkZWZhdWx0ZWRQcm9wcyA9IChfaXRlbSR0eXBlMyA9IGl0ZW0udHlwZSkgIT09IG51bGwgJiYgX2l0ZW0kdHlwZTMgIT09IHZvaWQgMCAmJiBfaXRlbSR0eXBlMy5kZWZhdWx0UHJvcHMgPyBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGl0ZW0udHlwZS5kZWZhdWx0UHJvcHMpLCBpdGVtLnByb3BzKSA6IGl0ZW0ucHJvcHM7XG4gIHZhciBzdGFja0lkID0gZGVmYXVsdGVkUHJvcHMuc3RhY2tJZDtcbiAgaWYgKGlzTnVtT3JTdHIoc3RhY2tJZCkpIHtcbiAgICB2YXIgZ3JvdXAgPSBzdGFja0dyb3Vwc1tzdGFja0lkXTtcbiAgICBpZiAoZ3JvdXApIHtcbiAgICAgIHZhciBpdGVtSW5kZXggPSBncm91cC5pdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgICAgcmV0dXJuIGl0ZW1JbmRleCA+PSAwID8gZ3JvdXAuc3RhY2tlZERhdGFbaXRlbUluZGV4XSA6IG51bGw7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufTtcbnZhciBnZXREb21haW5PZlNpbmdsZSA9IGZ1bmN0aW9uIGdldERvbWFpbk9mU2luZ2xlKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIGVudHJ5KSB7XG4gICAgcmV0dXJuIFttaW4oZW50cnkuY29uY2F0KFtyZXN1bHRbMF1dKS5maWx0ZXIoaXNOdW1iZXIpKSwgbWF4KGVudHJ5LmNvbmNhdChbcmVzdWx0WzFdXSkuZmlsdGVyKGlzTnVtYmVyKSldO1xuICB9LCBbSW5maW5pdHksIC1JbmZpbml0eV0pO1xufTtcbmV4cG9ydCB2YXIgZ2V0RG9tYWluT2ZTdGFja0dyb3VwcyA9IGZ1bmN0aW9uIGdldERvbWFpbk9mU3RhY2tHcm91cHMoc3RhY2tHcm91cHMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhzdGFja0dyb3VwcykucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIHN0YWNrSWQpIHtcbiAgICB2YXIgZ3JvdXAgPSBzdGFja0dyb3Vwc1tzdGFja0lkXTtcbiAgICB2YXIgc3RhY2tlZERhdGEgPSBncm91cC5zdGFja2VkRGF0YTtcbiAgICB2YXIgZG9tYWluID0gc3RhY2tlZERhdGEucmVkdWNlKGZ1bmN0aW9uIChyZXMsIGVudHJ5KSB7XG4gICAgICB2YXIgcyA9IGdldERvbWFpbk9mU2luZ2xlKGVudHJ5LnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4ICsgMSkpO1xuICAgICAgcmV0dXJuIFtNYXRoLm1pbihyZXNbMF0sIHNbMF0pLCBNYXRoLm1heChyZXNbMV0sIHNbMV0pXTtcbiAgICB9LCBbSW5maW5pdHksIC1JbmZpbml0eV0pO1xuICAgIHJldHVybiBbTWF0aC5taW4oZG9tYWluWzBdLCByZXN1bHRbMF0pLCBNYXRoLm1heChkb21haW5bMV0sIHJlc3VsdFsxXSldO1xuICB9LCBbSW5maW5pdHksIC1JbmZpbml0eV0pLm1hcChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSW5maW5pdHkgfHwgcmVzdWx0ID09PSAtSW5maW5pdHkgPyAwIDogcmVzdWx0O1xuICB9KTtcbn07XG5leHBvcnQgdmFyIE1JTl9WQUxVRV9SRUcgPSAvXmRhdGFNaW5bXFxzXSotW1xcc10qKFswLTldKyhbLl17MX1bMC05XSspezAsMX0pJC87XG5leHBvcnQgdmFyIE1BWF9WQUxVRV9SRUcgPSAvXmRhdGFNYXhbXFxzXSpcXCtbXFxzXSooWzAtOV0rKFsuXXsxfVswLTldKyl7MCwxfSkkLztcbmV4cG9ydCB2YXIgcGFyc2VTcGVjaWZpZWREb21haW4gPSBmdW5jdGlvbiBwYXJzZVNwZWNpZmllZERvbWFpbihzcGVjaWZpZWREb21haW4sIGRhdGFEb21haW4sIGFsbG93RGF0YU92ZXJmbG93KSB7XG4gIGlmIChpc0Z1bmN0aW9uKHNwZWNpZmllZERvbWFpbikpIHtcbiAgICByZXR1cm4gc3BlY2lmaWVkRG9tYWluKGRhdGFEb21haW4sIGFsbG93RGF0YU92ZXJmbG93KTtcbiAgfVxuICBpZiAoIUFycmF5LmlzQXJyYXkoc3BlY2lmaWVkRG9tYWluKSkge1xuICAgIHJldHVybiBkYXRhRG9tYWluO1xuICB9XG4gIHZhciBkb21haW4gPSBbXTtcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItZGVzdHJ1Y3R1cmluZyAqL1xuICBpZiAoaXNOdW1iZXIoc3BlY2lmaWVkRG9tYWluWzBdKSkge1xuICAgIGRvbWFpblswXSA9IGFsbG93RGF0YU92ZXJmbG93ID8gc3BlY2lmaWVkRG9tYWluWzBdIDogTWF0aC5taW4oc3BlY2lmaWVkRG9tYWluWzBdLCBkYXRhRG9tYWluWzBdKTtcbiAgfSBlbHNlIGlmIChNSU5fVkFMVUVfUkVHLnRlc3Qoc3BlY2lmaWVkRG9tYWluWzBdKSkge1xuICAgIHZhciB2YWx1ZSA9ICtNSU5fVkFMVUVfUkVHLmV4ZWMoc3BlY2lmaWVkRG9tYWluWzBdKVsxXTtcbiAgICBkb21haW5bMF0gPSBkYXRhRG9tYWluWzBdIC0gdmFsdWU7XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihzcGVjaWZpZWREb21haW5bMF0pKSB7XG4gICAgZG9tYWluWzBdID0gc3BlY2lmaWVkRG9tYWluWzBdKGRhdGFEb21haW5bMF0pO1xuICB9IGVsc2Uge1xuICAgIGRvbWFpblswXSA9IGRhdGFEb21haW5bMF07XG4gIH1cbiAgaWYgKGlzTnVtYmVyKHNwZWNpZmllZERvbWFpblsxXSkpIHtcbiAgICBkb21haW5bMV0gPSBhbGxvd0RhdGFPdmVyZmxvdyA/IHNwZWNpZmllZERvbWFpblsxXSA6IE1hdGgubWF4KHNwZWNpZmllZERvbWFpblsxXSwgZGF0YURvbWFpblsxXSk7XG4gIH0gZWxzZSBpZiAoTUFYX1ZBTFVFX1JFRy50ZXN0KHNwZWNpZmllZERvbWFpblsxXSkpIHtcbiAgICB2YXIgX3ZhbHVlID0gK01BWF9WQUxVRV9SRUcuZXhlYyhzcGVjaWZpZWREb21haW5bMV0pWzFdO1xuICAgIGRvbWFpblsxXSA9IGRhdGFEb21haW5bMV0gKyBfdmFsdWU7XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihzcGVjaWZpZWREb21haW5bMV0pKSB7XG4gICAgZG9tYWluWzFdID0gc3BlY2lmaWVkRG9tYWluWzFdKGRhdGFEb21haW5bMV0pO1xuICB9IGVsc2Uge1xuICAgIGRvbWFpblsxXSA9IGRhdGFEb21haW5bMV07XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBwcmVmZXItZGVzdHJ1Y3R1cmluZyAqL1xuXG4gIHJldHVybiBkb21haW47XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgc2l6ZSBiZXR3ZWVuIHR3byBjYXRlZ29yeVxuICogQHBhcmFtICB7T2JqZWN0fSBheGlzICBUaGUgb3B0aW9ucyBvZiBheGlzXG4gKiBAcGFyYW0gIHtBcnJheX0gIHRpY2tzIFRoZSB0aWNrcyBvZiBheGlzXG4gKiBAcGFyYW0gIHtCb29sZWFufSBpc0JhciBpZiBpdGVtcyBpbiBheGlzIGFyZSBiYXJzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFNpemVcbiAqL1xuZXhwb3J0IHZhciBnZXRCYW5kU2l6ZU9mQXhpcyA9IGZ1bmN0aW9uIGdldEJhbmRTaXplT2ZBeGlzKGF4aXMsIHRpY2tzLCBpc0Jhcikge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHdlIG5lZWQgdG8gcmV0aGluayBzY2FsZSB0eXBlXG4gIGlmIChheGlzICYmIGF4aXMuc2NhbGUgJiYgYXhpcy5zY2FsZS5iYW5kd2lkdGgpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHdlIG5lZWQgdG8gcmV0aGluayBzY2FsZSB0eXBlXG4gICAgdmFyIGJhbmRXaWR0aCA9IGF4aXMuc2NhbGUuYmFuZHdpZHRoKCk7XG4gICAgaWYgKCFpc0JhciB8fCBiYW5kV2lkdGggPiAwKSB7XG4gICAgICByZXR1cm4gYmFuZFdpZHRoO1xuICAgIH1cbiAgfVxuICBpZiAoYXhpcyAmJiB0aWNrcyAmJiB0aWNrcy5sZW5ndGggPj0gMikge1xuICAgIHZhciBvcmRlcmVkVGlja3MgPSBzb3J0QnkodGlja3MsIGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gby5jb29yZGluYXRlO1xuICAgIH0pO1xuICAgIHZhciBiYW5kU2l6ZSA9IEluZmluaXR5O1xuICAgIGZvciAodmFyIGkgPSAxLCBsZW4gPSBvcmRlcmVkVGlja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhciBjdXIgPSBvcmRlcmVkVGlja3NbaV07XG4gICAgICB2YXIgcHJldiA9IG9yZGVyZWRUaWNrc1tpIC0gMV07XG4gICAgICBiYW5kU2l6ZSA9IE1hdGgubWluKChjdXIuY29vcmRpbmF0ZSB8fCAwKSAtIChwcmV2LmNvb3JkaW5hdGUgfHwgMCksIGJhbmRTaXplKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhbmRTaXplID09PSBJbmZpbml0eSA/IDAgOiBiYW5kU2l6ZTtcbiAgfVxuICByZXR1cm4gaXNCYXIgPyB1bmRlZmluZWQgOiAwO1xufTtcbi8qKlxuICogcGFyc2UgdGhlIGRvbWFpbiBvZiBhIGNhdGVnb3J5IGF4aXMgd2hlbiBhIGRvbWFpbiBpcyBzcGVjaWZpZWRcbiAqIEBwYXJhbSAgIHtBcnJheX0gICAgICAgIHNwZWNpZmllZERvbWFpbiAgVGhlIGRvbWFpbiBzcGVjaWZpZWQgYnkgdXNlcnNcbiAqIEBwYXJhbSAgIHtBcnJheX0gICAgICAgIGNhbGN1bGF0ZWREb21haW4gVGhlIGRvbWFpbiBjYWxjdWxhdGVkIGJ5IGRhdGVLZXlcbiAqIEBwYXJhbSAgIHtSZWFjdEVsZW1lbnR9IGF4aXNDaGlsZCAgICAgICAgVGhlIGF4aXMgUmVhY3RFbGVtZW50XG4gKiBAcmV0dXJucyB7QXJyYXl9ICAgICAgICBkb21haW5zXG4gKi9cbmV4cG9ydCB2YXIgcGFyc2VEb21haW5PZkNhdGVnb3J5QXhpcyA9IGZ1bmN0aW9uIHBhcnNlRG9tYWluT2ZDYXRlZ29yeUF4aXMoc3BlY2lmaWVkRG9tYWluLCBjYWxjdWxhdGVkRG9tYWluLCBheGlzQ2hpbGQpIHtcbiAgaWYgKCFzcGVjaWZpZWREb21haW4gfHwgIXNwZWNpZmllZERvbWFpbi5sZW5ndGgpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlZERvbWFpbjtcbiAgfVxuICBpZiAoaXNFcXVhbChzcGVjaWZpZWREb21haW4sIGdldChheGlzQ2hpbGQsICd0eXBlLmRlZmF1bHRQcm9wcy5kb21haW4nKSkpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlZERvbWFpbjtcbiAgfVxuICByZXR1cm4gc3BlY2lmaWVkRG9tYWluO1xufTtcbmV4cG9ydCB2YXIgZ2V0VG9vbHRpcEl0ZW0gPSBmdW5jdGlvbiBnZXRUb29sdGlwSXRlbShncmFwaGljYWxJdGVtLCBwYXlsb2FkKSB7XG4gIHZhciBkZWZhdWx0ZWRQcm9wcyA9IGdyYXBoaWNhbEl0ZW0udHlwZS5kZWZhdWx0UHJvcHMgPyBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGdyYXBoaWNhbEl0ZW0udHlwZS5kZWZhdWx0UHJvcHMpLCBncmFwaGljYWxJdGVtLnByb3BzKSA6IGdyYXBoaWNhbEl0ZW0ucHJvcHM7XG4gIHZhciBkYXRhS2V5ID0gZGVmYXVsdGVkUHJvcHMuZGF0YUtleSxcbiAgICBuYW1lID0gZGVmYXVsdGVkUHJvcHMubmFtZSxcbiAgICB1bml0ID0gZGVmYXVsdGVkUHJvcHMudW5pdCxcbiAgICBmb3JtYXR0ZXIgPSBkZWZhdWx0ZWRQcm9wcy5mb3JtYXR0ZXIsXG4gICAgdG9vbHRpcFR5cGUgPSBkZWZhdWx0ZWRQcm9wcy50b29sdGlwVHlwZSxcbiAgICBjaGFydFR5cGUgPSBkZWZhdWx0ZWRQcm9wcy5jaGFydFR5cGUsXG4gICAgaGlkZSA9IGRlZmF1bHRlZFByb3BzLmhpZGU7XG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZpbHRlclByb3BzKGdyYXBoaWNhbEl0ZW0sIGZhbHNlKSksIHt9LCB7XG4gICAgZGF0YUtleTogZGF0YUtleSxcbiAgICB1bml0OiB1bml0LFxuICAgIGZvcm1hdHRlcjogZm9ybWF0dGVyLFxuICAgIG5hbWU6IG5hbWUgfHwgZGF0YUtleSxcbiAgICBjb2xvcjogZ2V0TWFpbkNvbG9yT2ZHcmFwaGljSXRlbShncmFwaGljYWxJdGVtKSxcbiAgICB2YWx1ZTogZ2V0VmFsdWVCeURhdGFLZXkocGF5bG9hZCwgZGF0YUtleSksXG4gICAgdHlwZTogdG9vbHRpcFR5cGUsXG4gICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICBjaGFydFR5cGU6IGNoYXJ0VHlwZSxcbiAgICBoaWRlOiBoaWRlXG4gIH0pO1xufTsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHsgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTsgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7IH0gcmV0dXJuIHQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQoZSkgeyBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykgeyB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307IHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTsgfSk7IH0gcmV0dXJuIGU7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikgeyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDsgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmICh2b2lkIDAgIT09IGUpIHsgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxudmFyIFBSRUZJWF9MSVNUID0gWydXZWJraXQnLCAnTW96JywgJ08nLCAnbXMnXTtcbmV4cG9ydCB2YXIgZ2VuZXJhdGVQcmVmaXhTdHlsZSA9IGZ1bmN0aW9uIGdlbmVyYXRlUHJlZml4U3R5bGUobmFtZSwgdmFsdWUpIHtcbiAgaWYgKCFuYW1lKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGNhbWVsTmFtZSA9IG5hbWUucmVwbGFjZSgvKFxcdykvLCBmdW5jdGlvbiAodikge1xuICAgIHJldHVybiB2LnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xuICB2YXIgcmVzdWx0ID0gUFJFRklYX0xJU1QucmVkdWNlKGZ1bmN0aW9uIChyZXMsIGVudHJ5KSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcmVzKSwge30sIF9kZWZpbmVQcm9wZXJ0eSh7fSwgZW50cnkgKyBjYW1lbE5hbWUsIHZhbHVlKSk7XG4gIH0sIHt9KTtcbiAgcmVzdWx0W25hbWVdID0gdmFsdWU7XG4gIHJldHVybiByZXN1bHQ7XG59OyIsImZ1bmN0aW9uIF90eXBlb2YobykgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9IDogZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87IH0sIF90eXBlb2Yobyk7IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpOyB9XG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfVxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSAnLi9HbG9iYWwnO1xudmFyIHN0cmluZ0NhY2hlID0ge1xuICB3aWR0aENhY2hlOiB7fSxcbiAgY2FjaGVDb3VudDogMFxufTtcbnZhciBNQVhfQ0FDSEVfTlVNID0gMjAwMDtcbnZhciBTUEFOX1NUWUxFID0ge1xuICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgdG9wOiAnLTIwMDAwcHgnLFxuICBsZWZ0OiAwLFxuICBwYWRkaW5nOiAwLFxuICBtYXJnaW46IDAsXG4gIGJvcmRlcjogJ25vbmUnLFxuICB3aGl0ZVNwYWNlOiAncHJlJ1xufTtcbnZhciBTVFlMRV9MSVNUID0gWydtaW5XaWR0aCcsICdtYXhXaWR0aCcsICd3aWR0aCcsICdtaW5IZWlnaHQnLCAnbWF4SGVpZ2h0JywgJ2hlaWdodCcsICd0b3AnLCAnbGVmdCcsICdmb250U2l6ZScsICdsaW5lSGVpZ2h0JywgJ3BhZGRpbmcnLCAnbWFyZ2luJywgJ3BhZGRpbmdMZWZ0JywgJ3BhZGRpbmdSaWdodCcsICdwYWRkaW5nVG9wJywgJ3BhZGRpbmdCb3R0b20nLCAnbWFyZ2luTGVmdCcsICdtYXJnaW5SaWdodCcsICdtYXJnaW5Ub3AnLCAnbWFyZ2luQm90dG9tJ107XG52YXIgTUVBU1VSRU1FTlRfU1BBTl9JRCA9ICdyZWNoYXJ0c19tZWFzdXJlbWVudF9zcGFuJztcbmZ1bmN0aW9uIGF1dG9Db21wbGV0ZVN0eWxlKG5hbWUsIHZhbHVlKSB7XG4gIGlmIChTVFlMRV9MSVNULmluZGV4T2YobmFtZSkgPj0gMCAmJiB2YWx1ZSA9PT0gK3ZhbHVlKSB7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KHZhbHVlLCBcInB4XCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNhbWVsVG9NaWRkbGVMaW5lKHRleHQpIHtcbiAgdmFyIHN0cnMgPSB0ZXh0LnNwbGl0KCcnKTtcbiAgdmFyIGZvcm1hdFN0cnMgPSBzdHJzLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBlbnRyeSkge1xuICAgIGlmIChlbnRyeSA9PT0gZW50cnkudG9VcHBlckNhc2UoKSkge1xuICAgICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocmVzdWx0KSwgWyctJywgZW50cnkudG9Mb3dlckNhc2UoKV0pO1xuICAgIH1cbiAgICByZXR1cm4gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShyZXN1bHQpLCBbZW50cnldKTtcbiAgfSwgW10pO1xuICByZXR1cm4gZm9ybWF0U3Rycy5qb2luKCcnKTtcbn1cbmV4cG9ydCB2YXIgZ2V0U3R5bGVTdHJpbmcgPSBmdW5jdGlvbiBnZXRTdHlsZVN0cmluZyhzdHlsZSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoc3R5bGUpLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBzKSB7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KHJlc3VsdCkuY29uY2F0KGNhbWVsVG9NaWRkbGVMaW5lKHMpLCBcIjpcIikuY29uY2F0KGF1dG9Db21wbGV0ZVN0eWxlKHMsIHN0eWxlW3NdKSwgXCI7XCIpO1xuICB9LCAnJyk7XG59O1xuZnVuY3Rpb24gcmVtb3ZlSW52YWxpZEtleXMob2JqKSB7XG4gIHZhciBjb3B5T2JqID0gX29iamVjdFNwcmVhZCh7fSwgb2JqKTtcbiAgT2JqZWN0LmtleXMoY29weU9iaikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFjb3B5T2JqW2tleV0pIHtcbiAgICAgIGRlbGV0ZSBjb3B5T2JqW2tleV07XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGNvcHlPYmo7XG59XG5leHBvcnQgdmFyIGdldFN0cmluZ1NpemUgPSBmdW5jdGlvbiBnZXRTdHJpbmdTaXplKHRleHQpIHtcbiAgdmFyIHN0eWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgaWYgKHRleHQgPT09IHVuZGVmaW5lZCB8fCB0ZXh0ID09PSBudWxsIHx8IEdsb2JhbC5pc1Nzcikge1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG4gIH1cbiAgdmFyIGNvcHlTdHlsZSA9IHJlbW92ZUludmFsaWRLZXlzKHN0eWxlKTtcbiAgdmFyIGNhY2hlS2V5ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIHRleHQ6IHRleHQsXG4gICAgY29weVN0eWxlOiBjb3B5U3R5bGVcbiAgfSk7XG4gIGlmIChzdHJpbmdDYWNoZS53aWR0aENhY2hlW2NhY2hlS2V5XSkge1xuICAgIHJldHVybiBzdHJpbmdDYWNoZS53aWR0aENhY2hlW2NhY2hlS2V5XTtcbiAgfVxuICB0cnkge1xuICAgIHZhciBtZWFzdXJlbWVudFNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChNRUFTVVJFTUVOVF9TUEFOX0lEKTtcbiAgICBpZiAoIW1lYXN1cmVtZW50U3Bhbikge1xuICAgICAgbWVhc3VyZW1lbnRTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgbWVhc3VyZW1lbnRTcGFuLnNldEF0dHJpYnV0ZSgnaWQnLCBNRUFTVVJFTUVOVF9TUEFOX0lEKTtcbiAgICAgIG1lYXN1cmVtZW50U3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobWVhc3VyZW1lbnRTcGFuKTtcbiAgICB9XG4gICAgLy8gTmVlZCB0byB1c2UgQ1NTIE9iamVjdCBNb2RlbCAoQ1NTT00pIHRvIGJlIGFibGUgdG8gY29tcGx5IHdpdGggQ29udGVudCBTZWN1cml0eSBQb2xpY3kgKENTUClcbiAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db250ZW50X1NlY3VyaXR5X1BvbGljeVxuICAgIHZhciBtZWFzdXJlbWVudFNwYW5TdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgU1BBTl9TVFlMRSksIGNvcHlTdHlsZSk7XG4gICAgT2JqZWN0LmFzc2lnbihtZWFzdXJlbWVudFNwYW4uc3R5bGUsIG1lYXN1cmVtZW50U3BhblN0eWxlKTtcbiAgICBtZWFzdXJlbWVudFNwYW4udGV4dENvbnRlbnQgPSBcIlwiLmNvbmNhdCh0ZXh0KTtcbiAgICB2YXIgcmVjdCA9IG1lYXN1cmVtZW50U3Bhbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0XG4gICAgfTtcbiAgICBzdHJpbmdDYWNoZS53aWR0aENhY2hlW2NhY2hlS2V5XSA9IHJlc3VsdDtcbiAgICBpZiAoKytzdHJpbmdDYWNoZS5jYWNoZUNvdW50ID4gTUFYX0NBQ0hFX05VTSkge1xuICAgICAgc3RyaW5nQ2FjaGUuY2FjaGVDb3VudCA9IDA7XG4gICAgICBzdHJpbmdDYWNoZS53aWR0aENhY2hlID0ge307XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9O1xuICB9XG59O1xuZXhwb3J0IHZhciBnZXRPZmZzZXQgPSBmdW5jdGlvbiBnZXRPZmZzZXQocmVjdCkge1xuICByZXR1cm4ge1xuICAgIHRvcDogcmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWSAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRUb3AsXG4gICAgbGVmdDogcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFggLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50TGVmdFxuICB9O1xufTsiLCJpbXBvcnQgaXNTdHJpbmcgZnJvbSAnbG9kYXNoL2lzU3RyaW5nJztcbmltcG9ydCBpc05hbiBmcm9tICdsb2Rhc2gvaXNOYU4nO1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2gvZ2V0JztcbmltcG9ydCBsb2Rhc2hJc051bWJlciBmcm9tICdsb2Rhc2gvaXNOdW1iZXInO1xuZXhwb3J0IHZhciBtYXRoU2lnbiA9IGZ1bmN0aW9uIG1hdGhTaWduKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmICh2YWx1ZSA+IDApIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gLTE7XG59O1xuZXhwb3J0IHZhciBpc1BlcmNlbnQgPSBmdW5jdGlvbiBpc1BlcmNlbnQodmFsdWUpIHtcbiAgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSAmJiB2YWx1ZS5pbmRleE9mKCclJykgPT09IHZhbHVlLmxlbmd0aCAtIDE7XG59O1xuZXhwb3J0IHZhciBpc051bWJlciA9IGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gIHJldHVybiBsb2Rhc2hJc051bWJlcih2YWx1ZSkgJiYgIWlzTmFuKHZhbHVlKTtcbn07XG5leHBvcnQgdmFyIGlzTnVtT3JTdHIgPSBmdW5jdGlvbiBpc051bU9yU3RyKHZhbHVlKSB7XG4gIHJldHVybiBpc051bWJlcih2YWx1ZSkgfHwgaXNTdHJpbmcodmFsdWUpO1xufTtcbnZhciBpZENvdW50ZXIgPSAwO1xuZXhwb3J0IHZhciB1bmlxdWVJZCA9IGZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICB2YXIgaWQgPSArK2lkQ291bnRlcjtcbiAgcmV0dXJuIFwiXCIuY29uY2F0KHByZWZpeCB8fCAnJykuY29uY2F0KGlkKTtcbn07XG5cbi8qKlxuICogR2V0IHBlcmNlbnQgdmFsdWUgb2YgYSB0b3RhbCB2YWx1ZVxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBwZXJjZW50IEEgcGVyY2VudFxuICogQHBhcmFtIHtudW1iZXJ9IHRvdGFsVmFsdWUgICAgIFRvdGFsIHZhbHVlXG4gKiBAcGFyYW0ge251bWJlcn0gZGVmYXVsdFZhbHVlICAgVGhlIHZhbHVlIHJldHVybmVkIHdoZW4gcGVyY2VudCBpcyB1bmRlZmluZWQgb3IgaW52YWxpZFxuICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZSAgICAgIElmIHNldCB0byBiZSB0cnVlLCB0aGUgcmVzdWx0IHdpbGwgYmUgdmFsaWRhdGVkXG4gKiBAcmV0dXJuIHtudW1iZXJ9IHZhbHVlXG4gKi9cbmV4cG9ydCB2YXIgZ2V0UGVyY2VudFZhbHVlID0gZnVuY3Rpb24gZ2V0UGVyY2VudFZhbHVlKHBlcmNlbnQsIHRvdGFsVmFsdWUpIHtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMDtcbiAgdmFyIHZhbGlkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmYWxzZTtcbiAgaWYgKCFpc051bWJlcihwZXJjZW50KSAmJiAhaXNTdHJpbmcocGVyY2VudCkpIHtcbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICB9XG4gIHZhciB2YWx1ZTtcbiAgaWYgKGlzUGVyY2VudChwZXJjZW50KSkge1xuICAgIHZhciBpbmRleCA9IHBlcmNlbnQuaW5kZXhPZignJScpO1xuICAgIHZhbHVlID0gdG90YWxWYWx1ZSAqIHBhcnNlRmxvYXQocGVyY2VudC5zbGljZSgwLCBpbmRleCkpIC8gMTAwO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gK3BlcmNlbnQ7XG4gIH1cbiAgaWYgKGlzTmFuKHZhbHVlKSkge1xuICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICB9XG4gIGlmICh2YWxpZGF0ZSAmJiB2YWx1ZSA+IHRvdGFsVmFsdWUpIHtcbiAgICB2YWx1ZSA9IHRvdGFsVmFsdWU7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcbmV4cG9ydCB2YXIgZ2V0QW55RWxlbWVudE9mT2JqZWN0ID0gZnVuY3Rpb24gZ2V0QW55RWxlbWVudE9mT2JqZWN0KG9iaikge1xuICBpZiAoIW9iaikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgaWYgKGtleXMgJiYga2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gb2JqW2tleXNbMF1dO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcbmV4cG9ydCB2YXIgaGFzRHVwbGljYXRlID0gZnVuY3Rpb24gaGFzRHVwbGljYXRlKGFyeSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJ5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGVuID0gYXJ5Lmxlbmd0aDtcbiAgdmFyIGNhY2hlID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoIWNhY2hlW2FyeVtpXV0pIHtcbiAgICAgIGNhY2hlW2FyeVtpXV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyogQHRvZG8gY29uc2lkZXIgdG8gcmVuYW1lIHRoaXMgZnVuY3Rpb24gaW50byBgZ2V0SW50ZXJwb2xhdG9yYCAqL1xuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZU51bWJlciA9IGZ1bmN0aW9uIGludGVycG9sYXRlTnVtYmVyKG51bWJlckEsIG51bWJlckIpIHtcbiAgaWYgKGlzTnVtYmVyKG51bWJlckEpICYmIGlzTnVtYmVyKG51bWJlckIpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gbnVtYmVyQSArIHQgKiAobnVtYmVyQiAtIG51bWJlckEpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbnVtYmVyQjtcbiAgfTtcbn07XG5leHBvcnQgZnVuY3Rpb24gZmluZEVudHJ5SW5BcnJheShhcnksIHNwZWNpZmllZEtleSwgc3BlY2lmaWVkVmFsdWUpIHtcbiAgaWYgKCFhcnkgfHwgIWFyeS5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gYXJ5LmZpbmQoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgcmV0dXJuIGVudHJ5ICYmICh0eXBlb2Ygc3BlY2lmaWVkS2V5ID09PSAnZnVuY3Rpb24nID8gc3BlY2lmaWVkS2V5KGVudHJ5KSA6IGdldChlbnRyeSwgc3BlY2lmaWVkS2V5KSkgPT09IHNwZWNpZmllZFZhbHVlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgbGVhc3Qgc3F1YXJlIGxpbmVhciByZWdyZXNzaW9uXG4gKiBAcGFyYW0ge0FycmF5fSBkYXRhIFRoZSBhcnJheSBvZiBwb2ludHNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkb21haW4gb2YgeCwgYW5kIHRoZSBwYXJhbWV0ZXIgb2YgbGluZWFyIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCB2YXIgZ2V0TGluZWFyUmVncmVzc2lvbiA9IGZ1bmN0aW9uIGdldExpbmVhclJlZ3Jlc3Npb24oZGF0YSkge1xuICBpZiAoIWRhdGEgfHwgIWRhdGEubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGxlbiA9IGRhdGEubGVuZ3RoO1xuICB2YXIgeHN1bSA9IDA7XG4gIHZhciB5c3VtID0gMDtcbiAgdmFyIHh5c3VtID0gMDtcbiAgdmFyIHh4c3VtID0gMDtcbiAgdmFyIHhtaW4gPSBJbmZpbml0eTtcbiAgdmFyIHhtYXggPSAtSW5maW5pdHk7XG4gIHZhciB4Y3VycmVudCA9IDA7XG4gIHZhciB5Y3VycmVudCA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB4Y3VycmVudCA9IGRhdGFbaV0uY3ggfHwgMDtcbiAgICB5Y3VycmVudCA9IGRhdGFbaV0uY3kgfHwgMDtcbiAgICB4c3VtICs9IHhjdXJyZW50O1xuICAgIHlzdW0gKz0geWN1cnJlbnQ7XG4gICAgeHlzdW0gKz0geGN1cnJlbnQgKiB5Y3VycmVudDtcbiAgICB4eHN1bSArPSB4Y3VycmVudCAqIHhjdXJyZW50O1xuICAgIHhtaW4gPSBNYXRoLm1pbih4bWluLCB4Y3VycmVudCk7XG4gICAgeG1heCA9IE1hdGgubWF4KHhtYXgsIHhjdXJyZW50KTtcbiAgfVxuICB2YXIgYSA9IGxlbiAqIHh4c3VtICE9PSB4c3VtICogeHN1bSA/IChsZW4gKiB4eXN1bSAtIHhzdW0gKiB5c3VtKSAvIChsZW4gKiB4eHN1bSAtIHhzdW0gKiB4c3VtKSA6IDA7XG4gIHJldHVybiB7XG4gICAgeG1pbjogeG1pbixcbiAgICB4bWF4OiB4bWF4LFxuICAgIGE6IGEsXG4gICAgYjogKHlzdW0gLSBhICogeHN1bSkgLyBsZW5cbiAgfTtcbn07IiwiZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTsgfVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbmltcG9ydCB7IFJlZmVyZW5jZURvdCB9IGZyb20gJy4uL2NhcnRlc2lhbi9SZWZlcmVuY2VEb3QnO1xuaW1wb3J0IHsgUmVmZXJlbmNlTGluZSB9IGZyb20gJy4uL2NhcnRlc2lhbi9SZWZlcmVuY2VMaW5lJztcbmltcG9ydCB7IFJlZmVyZW5jZUFyZWEgfSBmcm9tICcuLi9jYXJ0ZXNpYW4vUmVmZXJlbmNlQXJlYSc7XG5pbXBvcnQgeyBpZk92ZXJmbG93TWF0Y2hlcyB9IGZyb20gJy4vSWZPdmVyZmxvd01hdGNoZXMnO1xuaW1wb3J0IHsgZmluZEFsbEJ5VHlwZSB9IGZyb20gJy4vUmVhY3RVdGlscyc7XG5pbXBvcnQgeyBpc051bWJlciB9IGZyb20gJy4vRGF0YVV0aWxzJztcbmV4cG9ydCB2YXIgZGV0ZWN0UmVmZXJlbmNlRWxlbWVudHNEb21haW4gPSBmdW5jdGlvbiBkZXRlY3RSZWZlcmVuY2VFbGVtZW50c0RvbWFpbihjaGlsZHJlbiwgZG9tYWluLCBheGlzSWQsIGF4aXNUeXBlLCBzcGVjaWZpZWRUaWNrcykge1xuICB2YXIgbGluZXMgPSBmaW5kQWxsQnlUeXBlKGNoaWxkcmVuLCBSZWZlcmVuY2VMaW5lKTtcbiAgdmFyIGRvdHMgPSBmaW5kQWxsQnlUeXBlKGNoaWxkcmVuLCBSZWZlcmVuY2VEb3QpO1xuICB2YXIgZWxlbWVudHMgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGxpbmVzKSwgX3RvQ29uc3VtYWJsZUFycmF5KGRvdHMpKTtcbiAgdmFyIGFyZWFzID0gZmluZEFsbEJ5VHlwZShjaGlsZHJlbiwgUmVmZXJlbmNlQXJlYSk7XG4gIHZhciBpZEtleSA9IFwiXCIuY29uY2F0KGF4aXNUeXBlLCBcIklkXCIpO1xuICB2YXIgdmFsdWVLZXkgPSBheGlzVHlwZVswXTtcbiAgdmFyIGZpbmFsRG9tYWluID0gZG9tYWluO1xuICBpZiAoZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgZmluYWxEb21haW4gPSBlbGVtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKHJlc3VsdCwgZWwpIHtcbiAgICAgIGlmIChlbC5wcm9wc1tpZEtleV0gPT09IGF4aXNJZCAmJiBpZk92ZXJmbG93TWF0Y2hlcyhlbC5wcm9wcywgJ2V4dGVuZERvbWFpbicpICYmIGlzTnVtYmVyKGVsLnByb3BzW3ZhbHVlS2V5XSkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gZWwucHJvcHNbdmFsdWVLZXldO1xuICAgICAgICByZXR1cm4gW01hdGgubWluKHJlc3VsdFswXSwgdmFsdWUpLCBNYXRoLm1heChyZXN1bHRbMV0sIHZhbHVlKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIGZpbmFsRG9tYWluKTtcbiAgfVxuICBpZiAoYXJlYXMubGVuZ3RoKSB7XG4gICAgdmFyIGtleTEgPSBcIlwiLmNvbmNhdCh2YWx1ZUtleSwgXCIxXCIpO1xuICAgIHZhciBrZXkyID0gXCJcIi5jb25jYXQodmFsdWVLZXksIFwiMlwiKTtcbiAgICBmaW5hbERvbWFpbiA9IGFyZWFzLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBlbCkge1xuICAgICAgaWYgKGVsLnByb3BzW2lkS2V5XSA9PT0gYXhpc0lkICYmIGlmT3ZlcmZsb3dNYXRjaGVzKGVsLnByb3BzLCAnZXh0ZW5kRG9tYWluJykgJiYgaXNOdW1iZXIoZWwucHJvcHNba2V5MV0pICYmIGlzTnVtYmVyKGVsLnByb3BzW2tleTJdKSkge1xuICAgICAgICB2YXIgdmFsdWUxID0gZWwucHJvcHNba2V5MV07XG4gICAgICAgIHZhciB2YWx1ZTIgPSBlbC5wcm9wc1trZXkyXTtcbiAgICAgICAgcmV0dXJuIFtNYXRoLm1pbihyZXN1bHRbMF0sIHZhbHVlMSwgdmFsdWUyKSwgTWF0aC5tYXgocmVzdWx0WzFdLCB2YWx1ZTEsIHZhbHVlMildO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCBmaW5hbERvbWFpbik7XG4gIH1cbiAgaWYgKHNwZWNpZmllZFRpY2tzICYmIHNwZWNpZmllZFRpY2tzLmxlbmd0aCkge1xuICAgIGZpbmFsRG9tYWluID0gc3BlY2lmaWVkVGlja3MucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIHRpY2spIHtcbiAgICAgIGlmIChpc051bWJlcih0aWNrKSkge1xuICAgICAgICByZXR1cm4gW01hdGgubWluKHJlc3VsdFswXSwgdGljayksIE1hdGgubWF4KHJlc3VsdFsxXSwgdGljayldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCBmaW5hbERvbWFpbik7XG4gIH1cbiAgcmV0dXJuIGZpbmFsRG9tYWluO1xufTsiLCJpbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xudmFyIGV2ZW50Q2VudGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuZXhwb3J0IHsgZXZlbnRDZW50ZXIgfTtcbmV4cG9ydCB2YXIgU1lOQ19FVkVOVCA9ICdyZWNoYXJ0cy5zeW5jTW91c2VFdmVudHMnOyIsInZhciBwYXJzZUlzU3NyQnlEZWZhdWx0ID0gZnVuY3Rpb24gcGFyc2VJc1NzckJ5RGVmYXVsdCgpIHtcbiAgcmV0dXJuICEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIHdpbmRvdy5zZXRUaW1lb3V0KTtcbn07XG5leHBvcnQgdmFyIEdsb2JhbCA9IHtcbiAgaXNTc3I6IHBhcnNlSXNTc3JCeURlZmF1bHQoKSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgcmV0dXJuIEdsb2JhbFtrZXldO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBHbG9iYWxba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGtleSk7XG4gICAgICBpZiAoa2V5cyAmJiBrZXlzLmxlbmd0aCkge1xuICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICBHbG9iYWxba10gPSBrZXlba107XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTsiLCJleHBvcnQgdmFyIGlmT3ZlcmZsb3dNYXRjaGVzID0gZnVuY3Rpb24gaWZPdmVyZmxvd01hdGNoZXMocHJvcHMsIHZhbHVlKSB7XG4gIHZhciBhbHdheXNTaG93ID0gcHJvcHMuYWx3YXlzU2hvdztcbiAgdmFyIGlmT3ZlcmZsb3cgPSBwcm9wcy5pZk92ZXJmbG93O1xuICBpZiAoYWx3YXlzU2hvdykge1xuICAgIGlmT3ZlcmZsb3cgPSAnZXh0ZW5kRG9tYWluJztcbiAgfVxuICByZXR1cm4gaWZPdmVyZmxvdyA9PT0gdmFsdWU7XG59OyIsIi8qIGVzbGludCBuby1jb25zb2xlOiAwICovXG52YXIgaXNEZXYgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nO1xuZXhwb3J0IHZhciB3YXJuID0gZnVuY3Rpb24gd2Fybihjb25kaXRpb24sIGZvcm1hdCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMiA/IF9sZW4gLSAyIDogMCksIF9rZXkgPSAyOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5IC0gMl0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cbiAgaWYgKGlzRGV2ICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLndhcm4pIHtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignTG9nVXRpbHMgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJyArICdmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgICAgY29uc29sZS53YXJuKGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQociwgbCkgeyB2YXIgdCA9IG51bGwgPT0gciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgcltTeW1ib2wuaXRlcmF0b3JdIHx8IHJbXCJAQGl0ZXJhdG9yXCJdOyBpZiAobnVsbCAhPSB0KSB7IHZhciBlLCBuLCBpLCB1LCBhID0gW10sIGYgPSAhMCwgbyA9ICExOyB0cnkgeyBpZiAoaSA9ICh0ID0gdC5jYWxsKHIpKS5uZXh0LCAwID09PSBsKSB7IGlmIChPYmplY3QodCkgIT09IHQpIHJldHVybjsgZiA9ICExOyB9IGVsc2UgZm9yICg7ICEoZiA9IChlID0gaS5jYWxsKHQpKS5kb25lKSAmJiAoYS5wdXNoKGUudmFsdWUpLCBhLmxlbmd0aCAhPT0gbCk7IGYgPSAhMCk7IH0gY2F0Y2ggKHIpIHsgbyA9ICEwLCBuID0gcjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFmICYmIG51bGwgIT0gdFtcInJldHVyblwiXSAmJiAodSA9IHRbXCJyZXR1cm5cIl0oKSwgT2JqZWN0KHUpICE9PSB1KSkgcmV0dXJuOyB9IGZpbmFsbHkgeyBpZiAobykgdGhyb3cgbjsgfSB9IHJldHVybiBhOyB9IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuaW1wb3J0IGlzTmlsIGZyb20gJ2xvZGFzaC9pc05pbCc7XG5pbXBvcnQgeyBpc1ZhbGlkRWxlbWVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJ2xvZGFzaC9pc0Z1bmN0aW9uJztcbmltcG9ydCB7IGdldFBlcmNlbnRWYWx1ZSB9IGZyb20gJy4vRGF0YVV0aWxzJztcbmltcG9ydCB7IHBhcnNlU2NhbGUsIGNoZWNrRG9tYWluT2ZTY2FsZSwgZ2V0VGlja3NPZlNjYWxlIH0gZnJvbSAnLi9DaGFydFV0aWxzJztcbmV4cG9ydCB2YXIgUkFESUFOID0gTWF0aC5QSSAvIDE4MDtcbmV4cG9ydCB2YXIgZGVncmVlVG9SYWRpYW4gPSBmdW5jdGlvbiBkZWdyZWVUb1JhZGlhbihhbmdsZSkge1xuICByZXR1cm4gYW5nbGUgKiBNYXRoLlBJIC8gMTgwO1xufTtcbmV4cG9ydCB2YXIgcmFkaWFuVG9EZWdyZWUgPSBmdW5jdGlvbiByYWRpYW5Ub0RlZ3JlZShhbmdsZUluUmFkaWFuKSB7XG4gIHJldHVybiBhbmdsZUluUmFkaWFuICogMTgwIC8gTWF0aC5QSTtcbn07XG5leHBvcnQgdmFyIHBvbGFyVG9DYXJ0ZXNpYW4gPSBmdW5jdGlvbiBwb2xhclRvQ2FydGVzaWFuKGN4LCBjeSwgcmFkaXVzLCBhbmdsZSkge1xuICByZXR1cm4ge1xuICAgIHg6IGN4ICsgTWF0aC5jb3MoLVJBRElBTiAqIGFuZ2xlKSAqIHJhZGl1cyxcbiAgICB5OiBjeSArIE1hdGguc2luKC1SQURJQU4gKiBhbmdsZSkgKiByYWRpdXNcbiAgfTtcbn07XG5leHBvcnQgdmFyIGdldE1heFJhZGl1cyA9IGZ1bmN0aW9uIGdldE1heFJhZGl1cyh3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciBvZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHtcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGxlZnQ6IDBcbiAgfTtcbiAgcmV0dXJuIE1hdGgubWluKE1hdGguYWJzKHdpZHRoIC0gKG9mZnNldC5sZWZ0IHx8IDApIC0gKG9mZnNldC5yaWdodCB8fCAwKSksIE1hdGguYWJzKGhlaWdodCAtIChvZmZzZXQudG9wIHx8IDApIC0gKG9mZnNldC5ib3R0b20gfHwgMCkpKSAvIDI7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgc2NhbGUgZnVuY3Rpb24sIHBvc2l0aW9uLCB3aWR0aCwgaGVpZ2h0IG9mIGF4ZXNcbiAqIEBwYXJhbSAge09iamVjdH0gcHJvcHMgICAgIExhdGVzdCBwcm9wc1xuICogQHBhcmFtICB7T2JqZWN0fSBheGlzTWFwICAgVGhlIGNvbmZpZ3VyYXRpb24gb2YgYXhlc1xuICogQHBhcmFtICB7T2JqZWN0fSBvZmZzZXQgICAgVGhlIG9mZnNldCBvZiBtYWluIHBhcnQgaW4gdGhlIHN2ZyBlbGVtZW50XG4gKiBAcGFyYW0gIHtPYmplY3R9IGF4aXNUeXBlICBUaGUgdHlwZSBvZiBheGVzLCByYWRpdXMtYXhpcyBvciBhbmdsZS1heGlzXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGNoYXJ0TmFtZSBUaGUgbmFtZSBvZiBjaGFydFxuICogQHJldHVybiB7T2JqZWN0fSBDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCB2YXIgZm9ybWF0QXhpc01hcCA9IGZ1bmN0aW9uIGZvcm1hdEF4aXNNYXAocHJvcHMsIGF4aXNNYXAsIG9mZnNldCwgYXhpc1R5cGUsIGNoYXJ0TmFtZSkge1xuICB2YXIgd2lkdGggPSBwcm9wcy53aWR0aCxcbiAgICBoZWlnaHQgPSBwcm9wcy5oZWlnaHQ7XG4gIHZhciBzdGFydEFuZ2xlID0gcHJvcHMuc3RhcnRBbmdsZSxcbiAgICBlbmRBbmdsZSA9IHByb3BzLmVuZEFuZ2xlO1xuICB2YXIgY3ggPSBnZXRQZXJjZW50VmFsdWUocHJvcHMuY3gsIHdpZHRoLCB3aWR0aCAvIDIpO1xuICB2YXIgY3kgPSBnZXRQZXJjZW50VmFsdWUocHJvcHMuY3ksIGhlaWdodCwgaGVpZ2h0IC8gMik7XG4gIHZhciBtYXhSYWRpdXMgPSBnZXRNYXhSYWRpdXMod2lkdGgsIGhlaWdodCwgb2Zmc2V0KTtcbiAgdmFyIGlubmVyUmFkaXVzID0gZ2V0UGVyY2VudFZhbHVlKHByb3BzLmlubmVyUmFkaXVzLCBtYXhSYWRpdXMsIDApO1xuICB2YXIgb3V0ZXJSYWRpdXMgPSBnZXRQZXJjZW50VmFsdWUocHJvcHMub3V0ZXJSYWRpdXMsIG1heFJhZGl1cywgbWF4UmFkaXVzICogMC44KTtcbiAgdmFyIGlkcyA9IE9iamVjdC5rZXlzKGF4aXNNYXApO1xuICByZXR1cm4gaWRzLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBpZCkge1xuICAgIHZhciBheGlzID0gYXhpc01hcFtpZF07XG4gICAgdmFyIGRvbWFpbiA9IGF4aXMuZG9tYWluLFxuICAgICAgcmV2ZXJzZWQgPSBheGlzLnJldmVyc2VkO1xuICAgIHZhciByYW5nZTtcbiAgICBpZiAoaXNOaWwoYXhpcy5yYW5nZSkpIHtcbiAgICAgIGlmIChheGlzVHlwZSA9PT0gJ2FuZ2xlQXhpcycpIHtcbiAgICAgICAgcmFuZ2UgPSBbc3RhcnRBbmdsZSwgZW5kQW5nbGVdO1xuICAgICAgfSBlbHNlIGlmIChheGlzVHlwZSA9PT0gJ3JhZGl1c0F4aXMnKSB7XG4gICAgICAgIHJhbmdlID0gW2lubmVyUmFkaXVzLCBvdXRlclJhZGl1c107XG4gICAgICB9XG4gICAgICBpZiAocmV2ZXJzZWQpIHtcbiAgICAgICAgcmFuZ2UgPSBbcmFuZ2VbMV0sIHJhbmdlWzBdXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2UgPSBheGlzLnJhbmdlO1xuICAgICAgdmFyIF9yYW5nZSA9IHJhbmdlO1xuICAgICAgdmFyIF9yYW5nZTIgPSBfc2xpY2VkVG9BcnJheShfcmFuZ2UsIDIpO1xuICAgICAgc3RhcnRBbmdsZSA9IF9yYW5nZTJbMF07XG4gICAgICBlbmRBbmdsZSA9IF9yYW5nZTJbMV07XG4gICAgfVxuICAgIHZhciBfcGFyc2VTY2FsZSA9IHBhcnNlU2NhbGUoYXhpcywgY2hhcnROYW1lKSxcbiAgICAgIHJlYWxTY2FsZVR5cGUgPSBfcGFyc2VTY2FsZS5yZWFsU2NhbGVUeXBlLFxuICAgICAgc2NhbGUgPSBfcGFyc2VTY2FsZS5zY2FsZTtcbiAgICBzY2FsZS5kb21haW4oZG9tYWluKS5yYW5nZShyYW5nZSk7XG4gICAgY2hlY2tEb21haW5PZlNjYWxlKHNjYWxlKTtcbiAgICB2YXIgdGlja3MgPSBnZXRUaWNrc09mU2NhbGUoc2NhbGUsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYXhpcyksIHt9LCB7XG4gICAgICByZWFsU2NhbGVUeXBlOiByZWFsU2NhbGVUeXBlXG4gICAgfSkpO1xuICAgIHZhciBmaW5hbEF4aXMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYXhpcyksIHRpY2tzKSwge30sIHtcbiAgICAgIHJhbmdlOiByYW5nZSxcbiAgICAgIHJhZGl1czogb3V0ZXJSYWRpdXMsXG4gICAgICByZWFsU2NhbGVUeXBlOiByZWFsU2NhbGVUeXBlLFxuICAgICAgc2NhbGU6IHNjYWxlLFxuICAgICAgY3g6IGN4LFxuICAgICAgY3k6IGN5LFxuICAgICAgaW5uZXJSYWRpdXM6IGlubmVyUmFkaXVzLFxuICAgICAgb3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxuICAgICAgc3RhcnRBbmdsZTogc3RhcnRBbmdsZSxcbiAgICAgIGVuZEFuZ2xlOiBlbmRBbmdsZVxuICAgIH0pO1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHJlc3VsdCksIHt9LCBfZGVmaW5lUHJvcGVydHkoe30sIGlkLCBmaW5hbEF4aXMpKTtcbiAgfSwge30pO1xufTtcbmV4cG9ydCB2YXIgZGlzdGFuY2VCZXR3ZWVuUG9pbnRzID0gZnVuY3Rpb24gZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKHBvaW50LCBhbm90aGVyUG9pbnQpIHtcbiAgdmFyIHgxID0gcG9pbnQueCxcbiAgICB5MSA9IHBvaW50Lnk7XG4gIHZhciB4MiA9IGFub3RoZXJQb2ludC54LFxuICAgIHkyID0gYW5vdGhlclBvaW50Lnk7XG4gIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coeDEgLSB4MiwgMikgKyBNYXRoLnBvdyh5MSAtIHkyLCAyKSk7XG59O1xuZXhwb3J0IHZhciBnZXRBbmdsZU9mUG9pbnQgPSBmdW5jdGlvbiBnZXRBbmdsZU9mUG9pbnQoX3JlZiwgX3JlZjIpIHtcbiAgdmFyIHggPSBfcmVmLngsXG4gICAgeSA9IF9yZWYueTtcbiAgdmFyIGN4ID0gX3JlZjIuY3gsXG4gICAgY3kgPSBfcmVmMi5jeTtcbiAgdmFyIHJhZGl1cyA9IGRpc3RhbmNlQmV0d2VlblBvaW50cyh7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0sIHtcbiAgICB4OiBjeCxcbiAgICB5OiBjeVxuICB9KTtcbiAgaWYgKHJhZGl1cyA8PSAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJhZGl1czogcmFkaXVzXG4gICAgfTtcbiAgfVxuICB2YXIgY29zID0gKHggLSBjeCkgLyByYWRpdXM7XG4gIHZhciBhbmdsZUluUmFkaWFuID0gTWF0aC5hY29zKGNvcyk7XG4gIGlmICh5ID4gY3kpIHtcbiAgICBhbmdsZUluUmFkaWFuID0gMiAqIE1hdGguUEkgLSBhbmdsZUluUmFkaWFuO1xuICB9XG4gIHJldHVybiB7XG4gICAgcmFkaXVzOiByYWRpdXMsXG4gICAgYW5nbGU6IHJhZGlhblRvRGVncmVlKGFuZ2xlSW5SYWRpYW4pLFxuICAgIGFuZ2xlSW5SYWRpYW46IGFuZ2xlSW5SYWRpYW5cbiAgfTtcbn07XG5leHBvcnQgdmFyIGZvcm1hdEFuZ2xlT2ZTZWN0b3IgPSBmdW5jdGlvbiBmb3JtYXRBbmdsZU9mU2VjdG9yKF9yZWYzKSB7XG4gIHZhciBzdGFydEFuZ2xlID0gX3JlZjMuc3RhcnRBbmdsZSxcbiAgICBlbmRBbmdsZSA9IF9yZWYzLmVuZEFuZ2xlO1xuICB2YXIgc3RhcnRDbnQgPSBNYXRoLmZsb29yKHN0YXJ0QW5nbGUgLyAzNjApO1xuICB2YXIgZW5kQ250ID0gTWF0aC5mbG9vcihlbmRBbmdsZSAvIDM2MCk7XG4gIHZhciBtaW4gPSBNYXRoLm1pbihzdGFydENudCwgZW5kQ250KTtcbiAgcmV0dXJuIHtcbiAgICBzdGFydEFuZ2xlOiBzdGFydEFuZ2xlIC0gbWluICogMzYwLFxuICAgIGVuZEFuZ2xlOiBlbmRBbmdsZSAtIG1pbiAqIDM2MFxuICB9O1xufTtcbnZhciByZXZlcnNlRm9ybWF0QW5nbGVPZlNldG9yID0gZnVuY3Rpb24gcmV2ZXJzZUZvcm1hdEFuZ2xlT2ZTZXRvcihhbmdsZSwgX3JlZjQpIHtcbiAgdmFyIHN0YXJ0QW5nbGUgPSBfcmVmNC5zdGFydEFuZ2xlLFxuICAgIGVuZEFuZ2xlID0gX3JlZjQuZW5kQW5nbGU7XG4gIHZhciBzdGFydENudCA9IE1hdGguZmxvb3Ioc3RhcnRBbmdsZSAvIDM2MCk7XG4gIHZhciBlbmRDbnQgPSBNYXRoLmZsb29yKGVuZEFuZ2xlIC8gMzYwKTtcbiAgdmFyIG1pbiA9IE1hdGgubWluKHN0YXJ0Q250LCBlbmRDbnQpO1xuICByZXR1cm4gYW5nbGUgKyBtaW4gKiAzNjA7XG59O1xuZXhwb3J0IHZhciBpblJhbmdlT2ZTZWN0b3IgPSBmdW5jdGlvbiBpblJhbmdlT2ZTZWN0b3IoX3JlZjUsIHNlY3Rvcikge1xuICB2YXIgeCA9IF9yZWY1LngsXG4gICAgeSA9IF9yZWY1Lnk7XG4gIHZhciBfZ2V0QW5nbGVPZlBvaW50ID0gZ2V0QW5nbGVPZlBvaW50KHtcbiAgICAgIHg6IHgsXG4gICAgICB5OiB5XG4gICAgfSwgc2VjdG9yKSxcbiAgICByYWRpdXMgPSBfZ2V0QW5nbGVPZlBvaW50LnJhZGl1cyxcbiAgICBhbmdsZSA9IF9nZXRBbmdsZU9mUG9pbnQuYW5nbGU7XG4gIHZhciBpbm5lclJhZGl1cyA9IHNlY3Rvci5pbm5lclJhZGl1cyxcbiAgICBvdXRlclJhZGl1cyA9IHNlY3Rvci5vdXRlclJhZGl1cztcbiAgaWYgKHJhZGl1cyA8IGlubmVyUmFkaXVzIHx8IHJhZGl1cyA+IG91dGVyUmFkaXVzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChyYWRpdXMgPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgX2Zvcm1hdEFuZ2xlT2ZTZWN0b3IgPSBmb3JtYXRBbmdsZU9mU2VjdG9yKHNlY3RvciksXG4gICAgc3RhcnRBbmdsZSA9IF9mb3JtYXRBbmdsZU9mU2VjdG9yLnN0YXJ0QW5nbGUsXG4gICAgZW5kQW5nbGUgPSBfZm9ybWF0QW5nbGVPZlNlY3Rvci5lbmRBbmdsZTtcbiAgdmFyIGZvcm1hdEFuZ2xlID0gYW5nbGU7XG4gIHZhciBpblJhbmdlO1xuICBpZiAoc3RhcnRBbmdsZSA8PSBlbmRBbmdsZSkge1xuICAgIHdoaWxlIChmb3JtYXRBbmdsZSA+IGVuZEFuZ2xlKSB7XG4gICAgICBmb3JtYXRBbmdsZSAtPSAzNjA7XG4gICAgfVxuICAgIHdoaWxlIChmb3JtYXRBbmdsZSA8IHN0YXJ0QW5nbGUpIHtcbiAgICAgIGZvcm1hdEFuZ2xlICs9IDM2MDtcbiAgICB9XG4gICAgaW5SYW5nZSA9IGZvcm1hdEFuZ2xlID49IHN0YXJ0QW5nbGUgJiYgZm9ybWF0QW5nbGUgPD0gZW5kQW5nbGU7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKGZvcm1hdEFuZ2xlID4gc3RhcnRBbmdsZSkge1xuICAgICAgZm9ybWF0QW5nbGUgLT0gMzYwO1xuICAgIH1cbiAgICB3aGlsZSAoZm9ybWF0QW5nbGUgPCBlbmRBbmdsZSkge1xuICAgICAgZm9ybWF0QW5nbGUgKz0gMzYwO1xuICAgIH1cbiAgICBpblJhbmdlID0gZm9ybWF0QW5nbGUgPj0gZW5kQW5nbGUgJiYgZm9ybWF0QW5nbGUgPD0gc3RhcnRBbmdsZTtcbiAgfVxuICBpZiAoaW5SYW5nZSkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNlY3RvciksIHt9LCB7XG4gICAgICByYWRpdXM6IHJhZGl1cyxcbiAgICAgIGFuZ2xlOiByZXZlcnNlRm9ybWF0QW5nbGVPZlNldG9yKGZvcm1hdEFuZ2xlLCBzZWN0b3IpXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuZXhwb3J0IHZhciBnZXRUaWNrQ2xhc3NOYW1lID0gZnVuY3Rpb24gZ2V0VGlja0NsYXNzTmFtZSh0aWNrKSB7XG4gIHJldHVybiAhIC8qI19fUFVSRV9fKi9pc1ZhbGlkRWxlbWVudCh0aWNrKSAmJiAhaXNGdW5jdGlvbih0aWNrKSAmJiB0eXBlb2YgdGljayAhPT0gJ2Jvb2xlYW4nID8gdGljay5jbGFzc05hbWUgOiAnJztcbn07IiwidmFyIF9leGNsdWRlZCA9IFtcImNoaWxkcmVuXCJdLFxuICBfZXhjbHVkZWQyID0gW1wiY2hpbGRyZW5cIl07XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2gvZ2V0JztcbmltcG9ydCBpc05pbCBmcm9tICdsb2Rhc2gvaXNOaWwnO1xuaW1wb3J0IGlzU3RyaW5nIGZyb20gJ2xvZGFzaC9pc1N0cmluZyc7XG5pbXBvcnQgaXNGdW5jdGlvbiBmcm9tICdsb2Rhc2gvaXNGdW5jdGlvbic7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnbG9kYXNoL2lzT2JqZWN0JztcbmltcG9ydCB7IENoaWxkcmVuLCBpc1ZhbGlkRWxlbWVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzRnJhZ21lbnQgfSBmcm9tICdyZWFjdC1pcyc7XG5pbXBvcnQgeyBpc051bWJlciB9IGZyb20gJy4vRGF0YVV0aWxzJztcbmltcG9ydCB7IHNoYWxsb3dFcXVhbCB9IGZyb20gJy4vU2hhbGxvd0VxdWFsJztcbmltcG9ydCB7IEZpbHRlcmVkRWxlbWVudEtleU1hcCwgU1ZHRWxlbWVudFByb3BLZXlzLCBFdmVudEtleXMgfSBmcm9tICcuL3R5cGVzJztcbnZhciBSRUFDVF9CUk9XU0VSX0VWRU5UX01BUCA9IHtcbiAgY2xpY2s6ICdvbkNsaWNrJyxcbiAgbW91c2Vkb3duOiAnb25Nb3VzZURvd24nLFxuICBtb3VzZXVwOiAnb25Nb3VzZVVwJyxcbiAgbW91c2VvdmVyOiAnb25Nb3VzZU92ZXInLFxuICBtb3VzZW1vdmU6ICdvbk1vdXNlTW92ZScsXG4gIG1vdXNlb3V0OiAnb25Nb3VzZU91dCcsXG4gIG1vdXNlZW50ZXI6ICdvbk1vdXNlRW50ZXInLFxuICBtb3VzZWxlYXZlOiAnb25Nb3VzZUxlYXZlJyxcbiAgdG91Y2hjYW5jZWw6ICdvblRvdWNoQ2FuY2VsJyxcbiAgdG91Y2hlbmQ6ICdvblRvdWNoRW5kJyxcbiAgdG91Y2htb3ZlOiAnb25Ub3VjaE1vdmUnLFxuICB0b3VjaHN0YXJ0OiAnb25Ub3VjaFN0YXJ0JyxcbiAgY29udGV4dG1lbnU6ICdvbkNvbnRleHRNZW51JyxcbiAgZGJsY2xpY2s6ICdvbkRvdWJsZUNsaWNrJ1xufTtcbmV4cG9ydCB2YXIgU0NBTEVfVFlQRVMgPSBbJ2F1dG8nLCAnbGluZWFyJywgJ3BvdycsICdzcXJ0JywgJ2xvZycsICdpZGVudGl0eScsICd0aW1lJywgJ2JhbmQnLCAncG9pbnQnLCAnb3JkaW5hbCcsICdxdWFudGlsZScsICdxdWFudGl6ZScsICd1dGMnLCAnc2VxdWVudGlhbCcsICd0aHJlc2hvbGQnXTtcbmV4cG9ydCB2YXIgTEVHRU5EX1RZUEVTID0gWydwbGFpbmxpbmUnLCAnbGluZScsICdzcXVhcmUnLCAncmVjdCcsICdjaXJjbGUnLCAnY3Jvc3MnLCAnZGlhbW9uZCcsICdzdGFyJywgJ3RyaWFuZ2xlJywgJ3d5ZScsICdub25lJ107XG5leHBvcnQgdmFyIFRPT0xUSVBfVFlQRVMgPSBbJ25vbmUnXTtcblxuLyoqXG4gKiBHZXQgdGhlIGRpc3BsYXkgbmFtZSBvZiBhIGNvbXBvbmVudFxuICogQHBhcmFtICB7T2JqZWN0fSBDb21wIFNwZWNpZmllZCBDb21wb25lbnRcbiAqIEByZXR1cm4ge1N0cmluZ30gICAgICBEaXNwbGF5IG5hbWUgb2YgQ29tcG9uZW50XG4gKi9cbmV4cG9ydCB2YXIgZ2V0RGlzcGxheU5hbWUgPSBmdW5jdGlvbiBnZXREaXNwbGF5TmFtZShDb21wKSB7XG4gIGlmICh0eXBlb2YgQ29tcCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gQ29tcDtcbiAgfVxuICBpZiAoIUNvbXApIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuIENvbXAuZGlzcGxheU5hbWUgfHwgQ29tcC5uYW1lIHx8ICdDb21wb25lbnQnO1xufTtcblxuLy8gYHRvQXJyYXlgIGdldHMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyB0aGUgcmVuZGVyXG4vLyBzbyB3ZSBjYW4gbWVtb2l6ZSBsYXN0IGludm9jYXRpb24gKHNpbmNlIHJlZmVyZW5jZSB0byBgY2hpbGRyZW5gIGlzIHRoZSBzYW1lKVxudmFyIGxhc3RDaGlsZHJlbiA9IG51bGw7XG52YXIgbGFzdFJlc3VsdCA9IG51bGw7XG5leHBvcnQgdmFyIHRvQXJyYXkgPSBmdW5jdGlvbiB0b0FycmF5KGNoaWxkcmVuKSB7XG4gIGlmIChjaGlsZHJlbiA9PT0gbGFzdENoaWxkcmVuICYmIEFycmF5LmlzQXJyYXkobGFzdFJlc3VsdCkpIHtcbiAgICByZXR1cm4gbGFzdFJlc3VsdDtcbiAgfVxuICB2YXIgcmVzdWx0ID0gW107XG4gIENoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmIChpc05pbChjaGlsZCkpIHJldHVybjtcbiAgICBpZiAoaXNGcmFnbWVudChjaGlsZCkpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQodG9BcnJheShjaGlsZC5wcm9wcy5jaGlsZHJlbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoaXMgY291bGQgc3RpbGwgYmUgSXRlcmFibGU8UmVhY3ROb2RlPiBhbmQgVFMgZG9lcyBub3QgbGlrZSB0aGF0XG4gICAgICByZXN1bHQucHVzaChjaGlsZCk7XG4gICAgfVxuICB9KTtcbiAgbGFzdFJlc3VsdCA9IHJlc3VsdDtcbiAgbGFzdENoaWxkcmVuID0gY2hpbGRyZW47XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKlxuICogRmluZCBhbmQgcmV0dXJuIGFsbCBtYXRjaGVkIGNoaWxkcmVuIGJ5IHR5cGUuXG4gKiBgdHlwZWAgbXVzdCBiZSBhIFJlYWN0LkNvbXBvbmVudFR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRBbGxCeVR5cGUoY2hpbGRyZW4sIHR5cGUpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgdHlwZXMgPSBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICB0eXBlcyA9IHR5cGUubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWUodCk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdHlwZXMgPSBbZ2V0RGlzcGxheU5hbWUodHlwZSldO1xuICB9XG4gIHRvQXJyYXkoY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgdmFyIGNoaWxkVHlwZSA9IGdldChjaGlsZCwgJ3R5cGUuZGlzcGxheU5hbWUnKSB8fCBnZXQoY2hpbGQsICd0eXBlLm5hbWUnKTtcbiAgICBpZiAodHlwZXMuaW5kZXhPZihjaGlsZFR5cGUpICE9PSAtMSkge1xuICAgICAgcmVzdWx0LnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qXG4gKiBSZXR1cm4gdGhlIGZpcnN0IG1hdGNoZWQgY2hpbGQgYnkgdHlwZSwgcmV0dXJuIG51bGwgb3RoZXJ3aXNlLlxuICogYHR5cGVgIG11c3QgYmUgYSBSZWFjdC5Db21wb25lbnRUeXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ2hpbGRCeVR5cGUoY2hpbGRyZW4sIHR5cGUpIHtcbiAgdmFyIHJlc3VsdCA9IGZpbmRBbGxCeVR5cGUoY2hpbGRyZW4sIHR5cGUpO1xuICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdFswXTtcbn1cblxuLypcbiAqIENyZWF0ZSBhIG5ldyBhcnJheSBvZiBjaGlsZHJlbiBleGNsdWRpbmcgdGhlIG9uZXMgbWF0Y2hlZCB0aGUgdHlwZVxuICovXG5leHBvcnQgdmFyIHdpdGhvdXRUeXBlID0gZnVuY3Rpb24gd2l0aG91dFR5cGUoY2hpbGRyZW4sIHR5cGUpIHtcbiAgdmFyIG5ld0NoaWxkcmVuID0gW107XG4gIHZhciB0eXBlcztcbiAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICB0eXBlcyA9IHR5cGUubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWUodCk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdHlwZXMgPSBbZ2V0RGlzcGxheU5hbWUodHlwZSldO1xuICB9XG4gIHRvQXJyYXkoY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgdmFyIGRpc3BsYXlOYW1lID0gZ2V0KGNoaWxkLCAndHlwZS5kaXNwbGF5TmFtZScpO1xuICAgIGlmIChkaXNwbGF5TmFtZSAmJiB0eXBlcy5pbmRleE9mKGRpc3BsYXlOYW1lKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV3Q2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gIH0pO1xuICByZXR1cm4gbmV3Q2hpbGRyZW47XG59O1xuXG4vKipcbiAqIHZhbGlkYXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHByb3BzIG9mIGEgY2hhcnQgZWxlbWVudFxuICogQHBhcmFtICB7T2JqZWN0fSBlbCBBIGNoYXJ0IGVsZW1lbnRcbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgdHJ1ZSBJZiB0aGUgcHJvcHMgd2lkdGggYW5kIGhlaWdodCBhcmUgbnVtYmVyLCBhbmQgZ3JlYXRlciB0aGFuIDBcbiAqL1xuZXhwb3J0IHZhciB2YWxpZGF0ZVdpZHRoSGVpZ2h0ID0gZnVuY3Rpb24gdmFsaWRhdGVXaWR0aEhlaWdodChlbCkge1xuICBpZiAoIWVsIHx8ICFlbC5wcm9wcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgX2VsJHByb3BzID0gZWwucHJvcHMsXG4gICAgd2lkdGggPSBfZWwkcHJvcHMud2lkdGgsXG4gICAgaGVpZ2h0ID0gX2VsJHByb3BzLmhlaWdodDtcbiAgaWYgKCFpc051bWJlcih3aWR0aCkgfHwgd2lkdGggPD0gMCB8fCAhaXNOdW1iZXIoaGVpZ2h0KSB8fCBoZWlnaHQgPD0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgU1ZHX1RBR1MgPSBbJ2EnLCAnYWx0R2x5cGgnLCAnYWx0R2x5cGhEZWYnLCAnYWx0R2x5cGhJdGVtJywgJ2FuaW1hdGUnLCAnYW5pbWF0ZUNvbG9yJywgJ2FuaW1hdGVNb3Rpb24nLCAnYW5pbWF0ZVRyYW5zZm9ybScsICdjaXJjbGUnLCAnY2xpcFBhdGgnLCAnY29sb3ItcHJvZmlsZScsICdjdXJzb3InLCAnZGVmcycsICdkZXNjJywgJ2VsbGlwc2UnLCAnZmVCbGVuZCcsICdmZUNvbG9ybWF0cml4JywgJ2ZlQ29tcG9uZW50VHJhbnNmZXInLCAnZmVDb21wb3NpdGUnLCAnZmVDb252b2x2ZU1hdHJpeCcsICdmZURpZmZ1c2VMaWdodGluZycsICdmZURpc3BsYWNlbWVudE1hcCcsICdmZURpc3RhbnRMaWdodCcsICdmZUZsb29kJywgJ2ZlRnVuY0EnLCAnZmVGdW5jQicsICdmZUZ1bmNHJywgJ2ZlRnVuY1InLCAnZmVHYXVzc2lhbkJsdXInLCAnZmVJbWFnZScsICdmZU1lcmdlJywgJ2ZlTWVyZ2VOb2RlJywgJ2ZlTW9ycGhvbG9neScsICdmZU9mZnNldCcsICdmZVBvaW50TGlnaHQnLCAnZmVTcGVjdWxhckxpZ2h0aW5nJywgJ2ZlU3BvdExpZ2h0JywgJ2ZlVGlsZScsICdmZVR1cmJ1bGVuY2UnLCAnZmlsdGVyJywgJ2ZvbnQnLCAnZm9udC1mYWNlJywgJ2ZvbnQtZmFjZS1mb3JtYXQnLCAnZm9udC1mYWNlLW5hbWUnLCAnZm9udC1mYWNlLXVybCcsICdmb3JlaWduT2JqZWN0JywgJ2cnLCAnZ2x5cGgnLCAnZ2x5cGhSZWYnLCAnaGtlcm4nLCAnaW1hZ2UnLCAnbGluZScsICdsaW5lR3JhZGllbnQnLCAnbWFya2VyJywgJ21hc2snLCAnbWV0YWRhdGEnLCAnbWlzc2luZy1nbHlwaCcsICdtcGF0aCcsICdwYXRoJywgJ3BhdHRlcm4nLCAncG9seWdvbicsICdwb2x5bGluZScsICdyYWRpYWxHcmFkaWVudCcsICdyZWN0JywgJ3NjcmlwdCcsICdzZXQnLCAnc3RvcCcsICdzdHlsZScsICdzdmcnLCAnc3dpdGNoJywgJ3N5bWJvbCcsICd0ZXh0JywgJ3RleHRQYXRoJywgJ3RpdGxlJywgJ3RyZWYnLCAndHNwYW4nLCAndXNlJywgJ3ZpZXcnLCAndmtlcm4nXTtcbnZhciBpc1N2Z0VsZW1lbnQgPSBmdW5jdGlvbiBpc1N2Z0VsZW1lbnQoY2hpbGQpIHtcbiAgcmV0dXJuIGNoaWxkICYmIGNoaWxkLnR5cGUgJiYgaXNTdHJpbmcoY2hpbGQudHlwZSkgJiYgU1ZHX1RBR1MuaW5kZXhPZihjaGlsZC50eXBlKSA+PSAwO1xufTtcbmV4cG9ydCB2YXIgaGFzQ2xpcERvdCA9IGZ1bmN0aW9uIGhhc0NsaXBEb3QoZG90KSB7XG4gIHJldHVybiBkb3QgJiYgX3R5cGVvZihkb3QpID09PSAnb2JqZWN0JyAmJiAnY2xpcERvdCcgaW4gZG90O1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIHByb3BlcnR5IGlzIHZhbGlkIHRvIHNwcmVhZCBvbnRvIGFuIFNWRyBlbGVtZW50IG9yIG9udG8gYSBzcGVjaWZpYyBjb21wb25lbnRcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHJvcGVydHkgcHJvcGVydHkgdmFsdWUgY3VycmVudGx5IGJlaW5nIGNvbXBhcmVkXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHByb3BlcnR5IGtleSBjdXJyZW50bHkgYmVpbmcgY29tcGFyZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUV2ZW50cyBpZiBldmVudHMgYXJlIGluY2x1ZGVkIGluIHNwcmVhZGFibGUgcHJvcHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc3ZnRWxlbWVudFR5cGUgY2hlY2tzIGFnYWluc3QgbWFwIG9mIFNWRyBlbGVtZW50IHR5cGVzIHRvIGF0dHJpYnV0ZXNcbiAqIEByZXR1cm5zIHtib29sZWFufSBpcyBwcm9wIHZhbGlkXG4gKi9cbmV4cG9ydCB2YXIgaXNWYWxpZFNwcmVhZGFibGVQcm9wID0gZnVuY3Rpb24gaXNWYWxpZFNwcmVhZGFibGVQcm9wKHByb3BlcnR5LCBrZXksIGluY2x1ZGVFdmVudHMsIHN2Z0VsZW1lbnRUeXBlKSB7XG4gIHZhciBfRmlsdGVyZWRFbGVtZW50S2V5TWE7XG4gIC8qKlxuICAgKiBJZiB0aGUgc3ZnIGVsZW1lbnQgdHlwZSBpcyBleHBsaWNpdGx5IGluY2x1ZGVkLCBjaGVjayBhZ2FpbnN0IHRoZSBmaWx0ZXJlZCBlbGVtZW50IGtleSBtYXBcbiAgICogdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGFyZSBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIG9ubHkgZXhpc3Qgb24gdGhhdCBlbGVtZW50IHR5cGUuXG4gICAqIEB0b2RvIEFkZCBhbiBpbnRlcm5hbCBjanMgdmVyc2lvbiBvZiBodHRwczovL2dpdGh1Yi5jb20vd29vb3JtL3N2Zy1lbGVtZW50LWF0dHJpYnV0ZXMgZm9yIGZ1bGwgY292ZXJhZ2UuXG4gICAqL1xuICB2YXIgbWF0Y2hpbmdFbGVtZW50VHlwZUtleXMgPSAoX0ZpbHRlcmVkRWxlbWVudEtleU1hID0gRmlsdGVyZWRFbGVtZW50S2V5TWFwID09PSBudWxsIHx8IEZpbHRlcmVkRWxlbWVudEtleU1hcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogRmlsdGVyZWRFbGVtZW50S2V5TWFwW3N2Z0VsZW1lbnRUeXBlXSkgIT09IG51bGwgJiYgX0ZpbHRlcmVkRWxlbWVudEtleU1hICE9PSB2b2lkIDAgPyBfRmlsdGVyZWRFbGVtZW50S2V5TWEgOiBbXTtcbiAgcmV0dXJuICFpc0Z1bmN0aW9uKHByb3BlcnR5KSAmJiAoc3ZnRWxlbWVudFR5cGUgJiYgbWF0Y2hpbmdFbGVtZW50VHlwZUtleXMuaW5jbHVkZXMoa2V5KSB8fCBTVkdFbGVtZW50UHJvcEtleXMuaW5jbHVkZXMoa2V5KSkgfHwgaW5jbHVkZUV2ZW50cyAmJiBFdmVudEtleXMuaW5jbHVkZXMoa2V5KTtcbn07XG5cbi8qKlxuICogRmlsdGVyIGFsbCB0aGUgc3ZnIGVsZW1lbnRzIG9mIGNoaWxkcmVuXG4gKiBAcGFyYW0gIHtBcnJheX0gY2hpbGRyZW4gVGhlIGNoaWxkcmVuIG9mIGEgcmVhY3QgZWxlbWVudFxuICogQHJldHVybiB7QXJyYXl9ICAgICAgICAgIEFsbCB0aGUgc3ZnIGVsZW1lbnRzXG4gKi9cbmV4cG9ydCB2YXIgZmlsdGVyU3ZnRWxlbWVudHMgPSBmdW5jdGlvbiBmaWx0ZXJTdmdFbGVtZW50cyhjaGlsZHJlbikge1xuICB2YXIgc3ZnRWxlbWVudHMgPSBbXTtcbiAgdG9BcnJheShjaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICBpZiAoaXNTdmdFbGVtZW50KGVudHJ5KSkge1xuICAgICAgc3ZnRWxlbWVudHMucHVzaChlbnRyeSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHN2Z0VsZW1lbnRzO1xufTtcbmV4cG9ydCB2YXIgZmlsdGVyUHJvcHMgPSBmdW5jdGlvbiBmaWx0ZXJQcm9wcyhwcm9wcywgaW5jbHVkZUV2ZW50cywgc3ZnRWxlbWVudFR5cGUpIHtcbiAgaWYgKCFwcm9wcyB8fCB0eXBlb2YgcHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIHByb3BzID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgaW5wdXRQcm9wcyA9IHByb3BzO1xuICBpZiAoIC8qI19fUFVSRV9fKi9pc1ZhbGlkRWxlbWVudChwcm9wcykpIHtcbiAgICBpbnB1dFByb3BzID0gcHJvcHMucHJvcHM7XG4gIH1cbiAgaWYgKCFpc09iamVjdChpbnB1dFByb3BzKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBvdXQgPSB7fTtcblxuICAvKipcbiAgICogUHJvcHMgYXJlIGJsaW5kbHkgc3ByZWFkIG9udG8gU1ZHIGVsZW1lbnRzLiBUaGlzIGxvb3AgZmlsdGVycyBvdXQgcHJvcGVydGllcyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gc3ByZWFkLlxuICAgKiBJdGVtcyBmaWx0ZXJlZCBvdXQgYXJlIGFzIGZvbGxvd3M6XG4gICAqICAgLSBmdW5jdGlvbnMgaW4gcHJvcGVydGllcyB0aGF0IGFyZSBTVkcgYXR0cmlidXRlcyAoZnVuY3Rpb25zIGFyZSBpbmNsdWRlZCB3aGVuIGluY2x1ZGVFdmVudHMgaXMgdHJ1ZSlcbiAgICogICAtIHByb3BzIHRoYXQgYXJlIFNWRyBhdHRyaWJ1dGVzIGJ1dCBkb24ndCBtYXRjaGVkIHRoZSBwYXNzZWQgc3ZnRWxlbWVudFR5cGVcbiAgICogICAtIGFueSBwcm9wIHRoYXQgaXMgbm90IGluIFNWR0VsZW1lbnRQcm9wS2V5cyAob3IgaW4gRXZlbnRLZXlzIGlmIGluY2x1ZGVFdmVudHMgaXMgdHJ1ZSlcbiAgICovXG4gIE9iamVjdC5rZXlzKGlucHV0UHJvcHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBfaW5wdXRQcm9wcztcbiAgICBpZiAoaXNWYWxpZFNwcmVhZGFibGVQcm9wKChfaW5wdXRQcm9wcyA9IGlucHV0UHJvcHMpID09PSBudWxsIHx8IF9pbnB1dFByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfaW5wdXRQcm9wc1trZXldLCBrZXksIGluY2x1ZGVFdmVudHMsIHN2Z0VsZW1lbnRUeXBlKSkge1xuICAgICAgb3V0W2tleV0gPSBpbnB1dFByb3BzW2tleV07XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogV2V0aGVyIHByb3BzIG9mIGNoaWxkcmVuIGNoYW5nZWRcbiAqIEBwYXJhbSAge09iamVjdH0gbmV4dENoaWxkcmVuIFRoZSBsYXRlc3QgY2hpbGRyZW5cbiAqIEBwYXJhbSAge09iamVjdH0gcHJldkNoaWxkcmVuIFRoZSBwcmV2IGNoaWxkcmVuXG4gKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICAgICAgICBlcXVhbCBvciBub3RcbiAqL1xuZXhwb3J0IHZhciBpc0NoaWxkcmVuRXF1YWwgPSBmdW5jdGlvbiBpc0NoaWxkcmVuRXF1YWwobmV4dENoaWxkcmVuLCBwcmV2Q2hpbGRyZW4pIHtcbiAgaWYgKG5leHRDaGlsZHJlbiA9PT0gcHJldkNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIGNvdW50ID0gQ2hpbGRyZW4uY291bnQobmV4dENoaWxkcmVuKTtcbiAgaWYgKGNvdW50ICE9PSBDaGlsZHJlbi5jb3VudChwcmV2Q2hpbGRyZW4pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChjb3VudCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChjb3VudCA9PT0gMSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICByZXR1cm4gaXNTaW5nbGVDaGlsZEVxdWFsKEFycmF5LmlzQXJyYXkobmV4dENoaWxkcmVuKSA/IG5leHRDaGlsZHJlblswXSA6IG5leHRDaGlsZHJlbiwgQXJyYXkuaXNBcnJheShwcmV2Q2hpbGRyZW4pID8gcHJldkNoaWxkcmVuWzBdIDogcHJldkNoaWxkcmVuKTtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICB2YXIgbmV4dENoaWxkID0gbmV4dENoaWxkcmVuW2ldO1xuICAgIHZhciBwcmV2Q2hpbGQgPSBwcmV2Q2hpbGRyZW5baV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV4dENoaWxkKSB8fCBBcnJheS5pc0FycmF5KHByZXZDaGlsZCkpIHtcbiAgICAgIGlmICghaXNDaGlsZHJlbkVxdWFsKG5leHRDaGlsZCwgcHJldkNoaWxkKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgfSBlbHNlIGlmICghaXNTaW5nbGVDaGlsZEVxdWFsKG5leHRDaGlsZCwgcHJldkNoaWxkKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5leHBvcnQgdmFyIGlzU2luZ2xlQ2hpbGRFcXVhbCA9IGZ1bmN0aW9uIGlzU2luZ2xlQ2hpbGRFcXVhbChuZXh0Q2hpbGQsIHByZXZDaGlsZCkge1xuICBpZiAoaXNOaWwobmV4dENoaWxkKSAmJiBpc05pbChwcmV2Q2hpbGQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCFpc05pbChuZXh0Q2hpbGQpICYmICFpc05pbChwcmV2Q2hpbGQpKSB7XG4gICAgdmFyIF9yZWYgPSBuZXh0Q2hpbGQucHJvcHMgfHwge30sXG4gICAgICBuZXh0Q2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgICAgbmV4dFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG4gICAgdmFyIF9yZWYyID0gcHJldkNoaWxkLnByb3BzIHx8IHt9LFxuICAgICAgcHJldkNoaWxkcmVuID0gX3JlZjIuY2hpbGRyZW4sXG4gICAgICBwcmV2UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIsIF9leGNsdWRlZDIpO1xuICAgIGlmIChuZXh0Q2hpbGRyZW4gJiYgcHJldkNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gc2hhbGxvd0VxdWFsKG5leHRQcm9wcywgcHJldlByb3BzKSAmJiBpc0NoaWxkcmVuRXF1YWwobmV4dENoaWxkcmVuLCBwcmV2Q2hpbGRyZW4pO1xuICAgIH1cbiAgICBpZiAoIW5leHRDaGlsZHJlbiAmJiAhcHJldkNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gc2hhbGxvd0VxdWFsKG5leHRQcm9wcywgcHJldlByb3BzKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5leHBvcnQgdmFyIHJlbmRlckJ5T3JkZXIgPSBmdW5jdGlvbiByZW5kZXJCeU9yZGVyKGNoaWxkcmVuLCByZW5kZXJNYXApIHtcbiAgdmFyIGVsZW1lbnRzID0gW107XG4gIHZhciByZWNvcmQgPSB7fTtcbiAgdG9BcnJheShjaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQsIGluZGV4KSB7XG4gICAgaWYgKGlzU3ZnRWxlbWVudChjaGlsZCkpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goY2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoY2hpbGQpIHtcbiAgICAgIHZhciBkaXNwbGF5TmFtZSA9IGdldERpc3BsYXlOYW1lKGNoaWxkLnR5cGUpO1xuICAgICAgdmFyIF9yZWYzID0gcmVuZGVyTWFwW2Rpc3BsYXlOYW1lXSB8fCB7fSxcbiAgICAgICAgaGFuZGxlciA9IF9yZWYzLmhhbmRsZXIsXG4gICAgICAgIG9uY2UgPSBfcmVmMy5vbmNlO1xuICAgICAgaWYgKGhhbmRsZXIgJiYgKCFvbmNlIHx8ICFyZWNvcmRbZGlzcGxheU5hbWVdKSkge1xuICAgICAgICB2YXIgcmVzdWx0cyA9IGhhbmRsZXIoY2hpbGQsIGRpc3BsYXlOYW1lLCBpbmRleCk7XG4gICAgICAgIGVsZW1lbnRzLnB1c2gocmVzdWx0cyk7XG4gICAgICAgIHJlY29yZFtkaXNwbGF5TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBlbGVtZW50cztcbn07XG5leHBvcnQgdmFyIGdldFJlYWN0RXZlbnRCeVR5cGUgPSBmdW5jdGlvbiBnZXRSZWFjdEV2ZW50QnlUeXBlKGUpIHtcbiAgdmFyIHR5cGUgPSBlICYmIGUudHlwZTtcbiAgaWYgKHR5cGUgJiYgUkVBQ1RfQlJPV1NFUl9FVkVOVF9NQVBbdHlwZV0pIHtcbiAgICByZXR1cm4gUkVBQ1RfQlJPV1NFUl9FVkVOVF9NQVBbdHlwZV07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuZXhwb3J0IHZhciBwYXJzZUNoaWxkSW5kZXggPSBmdW5jdGlvbiBwYXJzZUNoaWxkSW5kZXgoY2hpbGQsIGNoaWxkcmVuKSB7XG4gIHJldHVybiB0b0FycmF5KGNoaWxkcmVuKS5pbmRleE9mKGNoaWxkKTtcbn07IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBsKSB7IHZhciB0ID0gbnVsbCA9PSByID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgcltcIkBAaXRlcmF0b3JcIl07IGlmIChudWxsICE9IHQpIHsgdmFyIGUsIG4sIGksIHUsIGEgPSBbXSwgZiA9ICEwLCBvID0gITE7IHRyeSB7IGlmIChpID0gKHQgPSB0LmNhbGwocikpLm5leHQsIDAgPT09IGwpIHsgaWYgKE9iamVjdCh0KSAhPT0gdCkgcmV0dXJuOyBmID0gITE7IH0gZWxzZSBmb3IgKDsgIShmID0gKGUgPSBpLmNhbGwodCkpLmRvbmUpICYmIChhLnB1c2goZS52YWx1ZSksIGEubGVuZ3RoICE9PSBsKTsgZiA9ICEwKTsgfSBjYXRjaCAocikgeyBvID0gITAsIG4gPSByOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIWYgJiYgbnVsbCAhPSB0W1wicmV0dXJuXCJdICYmICh1ID0gdFtcInJldHVyblwiXSgpLCBPYmplY3QodSkgIT09IHUpKSByZXR1cm47IH0gZmluYWxseSB7IGlmIChvKSB0aHJvdyBuOyB9IH0gcmV0dXJuIGE7IH0gfVxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOyB9IH1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikgeyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDsgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmICh2b2lkIDAgIT09IGUpIHsgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxudmFyIE1VTFRJUExZX09SX0RJVklERV9SRUdFWCA9IC8oLT9cXGQrKD86XFwuXFxkKyk/W2EtekEtWiVdKikoWyovXSkoLT9cXGQrKD86XFwuXFxkKyk/W2EtekEtWiVdKikvO1xudmFyIEFERF9PUl9TVUJUUkFDVF9SRUdFWCA9IC8oLT9cXGQrKD86XFwuXFxkKyk/W2EtekEtWiVdKikoWystXSkoLT9cXGQrKD86XFwuXFxkKyk/W2EtekEtWiVdKikvO1xudmFyIENTU19MRU5HVEhfVU5JVF9SRUdFWCA9IC9ecHh8Y218dmh8dnd8ZW18cmVtfCV8bW18aW58cHR8cGN8ZXh8Y2h8dm1pbnx2bWF4fFEkLztcbnZhciBOVU1fU1BMSVRfUkVHRVggPSAvKC0/XFxkKyg/OlxcLlxcZCspPykoW2EtekEtWiVdKyk/LztcbnZhciBDT05WRVJTSU9OX1JBVEVTID0ge1xuICBjbTogOTYgLyAyLjU0LFxuICBtbTogOTYgLyAyNS40LFxuICBwdDogOTYgLyA3MixcbiAgcGM6IDk2IC8gNixcbiAgXCJpblwiOiA5NixcbiAgUTogOTYgLyAoMi41NCAqIDQwKSxcbiAgcHg6IDFcbn07XG52YXIgRklYRURfQ1NTX0xFTkdUSF9VTklUUyA9IE9iamVjdC5rZXlzKENPTlZFUlNJT05fUkFURVMpO1xudmFyIFNUUl9OQU4gPSAnTmFOJztcbmZ1bmN0aW9uIGNvbnZlcnRUb1B4KHZhbHVlLCB1bml0KSB7XG4gIHJldHVybiB2YWx1ZSAqIENPTlZFUlNJT05fUkFURVNbdW5pdF07XG59XG52YXIgRGVjaW1hbENTUyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIERlY2ltYWxDU1MobnVtLCB1bml0KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERlY2ltYWxDU1MpO1xuICAgIHRoaXMubnVtID0gbnVtO1xuICAgIHRoaXMudW5pdCA9IHVuaXQ7XG4gICAgdGhpcy5udW0gPSBudW07XG4gICAgdGhpcy51bml0ID0gdW5pdDtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKG51bSkpIHtcbiAgICAgIHRoaXMudW5pdCA9ICcnO1xuICAgIH1cbiAgICBpZiAodW5pdCAhPT0gJycgJiYgIUNTU19MRU5HVEhfVU5JVF9SRUdFWC50ZXN0KHVuaXQpKSB7XG4gICAgICB0aGlzLm51bSA9IE5hTjtcbiAgICAgIHRoaXMudW5pdCA9ICcnO1xuICAgIH1cbiAgICBpZiAoRklYRURfQ1NTX0xFTkdUSF9VTklUUy5pbmNsdWRlcyh1bml0KSkge1xuICAgICAgdGhpcy5udW0gPSBjb252ZXJ0VG9QeChudW0sIHVuaXQpO1xuICAgICAgdGhpcy51bml0ID0gJ3B4JztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIF9jcmVhdGVDbGFzcyhEZWNpbWFsQ1NTLCBbe1xuICAgIGtleTogXCJhZGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKG90aGVyKSB7XG4gICAgICBpZiAodGhpcy51bml0ICE9PSBvdGhlci51bml0KSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVjaW1hbENTUyhOYU4sICcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgRGVjaW1hbENTUyh0aGlzLm51bSArIG90aGVyLm51bSwgdGhpcy51bml0KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3VidHJhY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3VidHJhY3Qob3RoZXIpIHtcbiAgICAgIGlmICh0aGlzLnVuaXQgIT09IG90aGVyLnVuaXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWNpbWFsQ1NTKE5hTiwgJycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBEZWNpbWFsQ1NTKHRoaXMubnVtIC0gb3RoZXIubnVtLCB0aGlzLnVuaXQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtdWx0aXBseVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtdWx0aXBseShvdGhlcikge1xuICAgICAgaWYgKHRoaXMudW5pdCAhPT0gJycgJiYgb3RoZXIudW5pdCAhPT0gJycgJiYgdGhpcy51bml0ICE9PSBvdGhlci51bml0KSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVjaW1hbENTUyhOYU4sICcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgRGVjaW1hbENTUyh0aGlzLm51bSAqIG90aGVyLm51bSwgdGhpcy51bml0IHx8IG90aGVyLnVuaXQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkaXZpZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGl2aWRlKG90aGVyKSB7XG4gICAgICBpZiAodGhpcy51bml0ICE9PSAnJyAmJiBvdGhlci51bml0ICE9PSAnJyAmJiB0aGlzLnVuaXQgIT09IG90aGVyLnVuaXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWNpbWFsQ1NTKE5hTiwgJycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBEZWNpbWFsQ1NTKHRoaXMubnVtIC8gb3RoZXIubnVtLCB0aGlzLnVuaXQgfHwgb3RoZXIudW5pdCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KHRoaXMubnVtKS5jb25jYXQodGhpcy51bml0KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNOYU5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNOYU4oKSB7XG4gICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHRoaXMubnVtKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJwYXJzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgICAgIHZhciBfTlVNX1NQTElUX1JFR0VYJGV4ZWM7XG4gICAgICB2YXIgX3JlZiA9IChfTlVNX1NQTElUX1JFR0VYJGV4ZWMgPSBOVU1fU1BMSVRfUkVHRVguZXhlYyhzdHIpKSAhPT0gbnVsbCAmJiBfTlVNX1NQTElUX1JFR0VYJGV4ZWMgIT09IHZvaWQgMCA/IF9OVU1fU1BMSVRfUkVHRVgkZXhlYyA6IFtdLFxuICAgICAgICBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDMpLFxuICAgICAgICBudW1TdHIgPSBfcmVmMlsxXSxcbiAgICAgICAgdW5pdCA9IF9yZWYyWzJdO1xuICAgICAgcmV0dXJuIG5ldyBEZWNpbWFsQ1NTKHBhcnNlRmxvYXQobnVtU3RyKSwgdW5pdCAhPT0gbnVsbCAmJiB1bml0ICE9PSB2b2lkIDAgPyB1bml0IDogJycpO1xuICAgIH1cbiAgfV0pO1xufSgpO1xuZnVuY3Rpb24gY2FsY3VsYXRlQXJpdGhtZXRpYyhleHByKSB7XG4gIGlmIChleHByLmluY2x1ZGVzKFNUUl9OQU4pKSB7XG4gICAgcmV0dXJuIFNUUl9OQU47XG4gIH1cbiAgdmFyIG5ld0V4cHIgPSBleHByO1xuICB3aGlsZSAobmV3RXhwci5pbmNsdWRlcygnKicpIHx8IG5ld0V4cHIuaW5jbHVkZXMoJy8nKSkge1xuICAgIHZhciBfTVVMVElQTFlfT1JfRElWSURFX1I7XG4gICAgdmFyIF9yZWYzID0gKF9NVUxUSVBMWV9PUl9ESVZJREVfUiA9IE1VTFRJUExZX09SX0RJVklERV9SRUdFWC5leGVjKG5ld0V4cHIpKSAhPT0gbnVsbCAmJiBfTVVMVElQTFlfT1JfRElWSURFX1IgIT09IHZvaWQgMCA/IF9NVUxUSVBMWV9PUl9ESVZJREVfUiA6IFtdLFxuICAgICAgX3JlZjQgPSBfc2xpY2VkVG9BcnJheShfcmVmMywgNCksXG4gICAgICBsZWZ0T3BlcmFuZCA9IF9yZWY0WzFdLFxuICAgICAgb3BlcmF0b3IgPSBfcmVmNFsyXSxcbiAgICAgIHJpZ2h0T3BlcmFuZCA9IF9yZWY0WzNdO1xuICAgIHZhciBsVHMgPSBEZWNpbWFsQ1NTLnBhcnNlKGxlZnRPcGVyYW5kICE9PSBudWxsICYmIGxlZnRPcGVyYW5kICE9PSB2b2lkIDAgPyBsZWZ0T3BlcmFuZCA6ICcnKTtcbiAgICB2YXIgclRzID0gRGVjaW1hbENTUy5wYXJzZShyaWdodE9wZXJhbmQgIT09IG51bGwgJiYgcmlnaHRPcGVyYW5kICE9PSB2b2lkIDAgPyByaWdodE9wZXJhbmQgOiAnJyk7XG4gICAgdmFyIHJlc3VsdCA9IG9wZXJhdG9yID09PSAnKicgPyBsVHMubXVsdGlwbHkoclRzKSA6IGxUcy5kaXZpZGUoclRzKTtcbiAgICBpZiAocmVzdWx0LmlzTmFOKCkpIHtcbiAgICAgIHJldHVybiBTVFJfTkFOO1xuICAgIH1cbiAgICBuZXdFeHByID0gbmV3RXhwci5yZXBsYWNlKE1VTFRJUExZX09SX0RJVklERV9SRUdFWCwgcmVzdWx0LnRvU3RyaW5nKCkpO1xuICB9XG4gIHdoaWxlIChuZXdFeHByLmluY2x1ZGVzKCcrJykgfHwgLy4tXFxkKyg/OlxcLlxcZCspPy8udGVzdChuZXdFeHByKSkge1xuICAgIHZhciBfQUREX09SX1NVQlRSQUNUX1JFR0U7XG4gICAgdmFyIF9yZWY1ID0gKF9BRERfT1JfU1VCVFJBQ1RfUkVHRSA9IEFERF9PUl9TVUJUUkFDVF9SRUdFWC5leGVjKG5ld0V4cHIpKSAhPT0gbnVsbCAmJiBfQUREX09SX1NVQlRSQUNUX1JFR0UgIT09IHZvaWQgMCA/IF9BRERfT1JfU1VCVFJBQ1RfUkVHRSA6IFtdLFxuICAgICAgX3JlZjYgPSBfc2xpY2VkVG9BcnJheShfcmVmNSwgNCksXG4gICAgICBfbGVmdE9wZXJhbmQgPSBfcmVmNlsxXSxcbiAgICAgIF9vcGVyYXRvciA9IF9yZWY2WzJdLFxuICAgICAgX3JpZ2h0T3BlcmFuZCA9IF9yZWY2WzNdO1xuICAgIHZhciBfbFRzID0gRGVjaW1hbENTUy5wYXJzZShfbGVmdE9wZXJhbmQgIT09IG51bGwgJiYgX2xlZnRPcGVyYW5kICE9PSB2b2lkIDAgPyBfbGVmdE9wZXJhbmQgOiAnJyk7XG4gICAgdmFyIF9yVHMgPSBEZWNpbWFsQ1NTLnBhcnNlKF9yaWdodE9wZXJhbmQgIT09IG51bGwgJiYgX3JpZ2h0T3BlcmFuZCAhPT0gdm9pZCAwID8gX3JpZ2h0T3BlcmFuZCA6ICcnKTtcbiAgICB2YXIgX3Jlc3VsdCA9IF9vcGVyYXRvciA9PT0gJysnID8gX2xUcy5hZGQoX3JUcykgOiBfbFRzLnN1YnRyYWN0KF9yVHMpO1xuICAgIGlmIChfcmVzdWx0LmlzTmFOKCkpIHtcbiAgICAgIHJldHVybiBTVFJfTkFOO1xuICAgIH1cbiAgICBuZXdFeHByID0gbmV3RXhwci5yZXBsYWNlKEFERF9PUl9TVUJUUkFDVF9SRUdFWCwgX3Jlc3VsdC50b1N0cmluZygpKTtcbiAgfVxuICByZXR1cm4gbmV3RXhwcjtcbn1cbnZhciBQQVJFTlRIRVNFU19SRUdFWCA9IC9cXCgoW14oKV0qKVxcKS87XG5mdW5jdGlvbiBjYWxjdWxhdGVQYXJlbnRoZXNlcyhleHByKSB7XG4gIHZhciBuZXdFeHByID0gZXhwcjtcbiAgd2hpbGUgKG5ld0V4cHIuaW5jbHVkZXMoJygnKSkge1xuICAgIHZhciBfUEFSRU5USEVTRVNfUkVHRVgkZXggPSBQQVJFTlRIRVNFU19SRUdFWC5leGVjKG5ld0V4cHIpLFxuICAgICAgX1BBUkVOVEhFU0VTX1JFR0VYJGV4MiA9IF9zbGljZWRUb0FycmF5KF9QQVJFTlRIRVNFU19SRUdFWCRleCwgMiksXG4gICAgICBwYXJlbnRoZXRpY2FsRXhwcmVzc2lvbiA9IF9QQVJFTlRIRVNFU19SRUdFWCRleDJbMV07XG4gICAgbmV3RXhwciA9IG5ld0V4cHIucmVwbGFjZShQQVJFTlRIRVNFU19SRUdFWCwgY2FsY3VsYXRlQXJpdGhtZXRpYyhwYXJlbnRoZXRpY2FsRXhwcmVzc2lvbikpO1xuICB9XG4gIHJldHVybiBuZXdFeHByO1xufVxuZnVuY3Rpb24gZXZhbHVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb24pIHtcbiAgdmFyIG5ld0V4cHIgPSBleHByZXNzaW9uLnJlcGxhY2UoL1xccysvZywgJycpO1xuICBuZXdFeHByID0gY2FsY3VsYXRlUGFyZW50aGVzZXMobmV3RXhwcik7XG4gIG5ld0V4cHIgPSBjYWxjdWxhdGVBcml0aG1ldGljKG5ld0V4cHIpO1xuICByZXR1cm4gbmV3RXhwcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzYWZlRXZhbHVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb24pIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZhbHVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gU1RSX05BTjtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZUNTU0NhbGMoZXhwcmVzc2lvbikge1xuICB2YXIgcmVzdWx0ID0gc2FmZUV2YWx1YXRlRXhwcmVzc2lvbihleHByZXNzaW9uLnNsaWNlKDUsIC0xKSk7XG4gIGlmIChyZXN1bHQgPT09IFNUUl9OQU4pIHtcbiAgICAvLyBub3RpZnkgdGhlIHVzZXJcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJleHBvcnQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsKGEsIGIpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tcmVzdHJpY3RlZC1zeW50YXggKi9cbiAgZm9yICh2YXIga2V5IGluIGEpIHtcbiAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChhLCBrZXkpICYmICghe30uaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXkpIHx8IGFba2V5XSAhPT0gYltrZXldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBmb3IgKHZhciBfa2V5IGluIGIpIHtcbiAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChiLCBfa2V5KSAmJiAhe30uaGFzT3duUHJvcGVydHkuY2FsbChhLCBfa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn0iLCJpbXBvcnQgeyBnZXRBbmdsZWRSZWN0YW5nbGVXaWR0aCB9IGZyb20gJy4vQ2FydGVzaWFuVXRpbHMnO1xuaW1wb3J0IHsgZ2V0RXZlcnlOdGhXaXRoQ29uZGl0aW9uIH0gZnJvbSAnLi9nZXRFdmVyeU50aFdpdGhDb25kaXRpb24nO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFuZ2xlZFRpY2tXaWR0aChjb250ZW50U2l6ZSwgdW5pdFNpemUsIGFuZ2xlKSB7XG4gIHZhciBzaXplID0ge1xuICAgIHdpZHRoOiBjb250ZW50U2l6ZS53aWR0aCArIHVuaXRTaXplLndpZHRoLFxuICAgIGhlaWdodDogY29udGVudFNpemUuaGVpZ2h0ICsgdW5pdFNpemUuaGVpZ2h0XG4gIH07XG4gIHJldHVybiBnZXRBbmdsZWRSZWN0YW5nbGVXaWR0aChzaXplLCBhbmdsZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGlja0JvdW5kYXJpZXModmlld0JveCwgc2lnbiwgc2l6ZUtleSkge1xuICB2YXIgaXNXaWR0aCA9IHNpemVLZXkgPT09ICd3aWR0aCc7XG4gIHZhciB4ID0gdmlld0JveC54LFxuICAgIHkgPSB2aWV3Qm94LnksXG4gICAgd2lkdGggPSB2aWV3Qm94LndpZHRoLFxuICAgIGhlaWdodCA9IHZpZXdCb3guaGVpZ2h0O1xuICBpZiAoc2lnbiA9PT0gMSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFydDogaXNXaWR0aCA/IHggOiB5LFxuICAgICAgZW5kOiBpc1dpZHRoID8geCArIHdpZHRoIDogeSArIGhlaWdodFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzdGFydDogaXNXaWR0aCA/IHggKyB3aWR0aCA6IHkgKyBoZWlnaHQsXG4gICAgZW5kOiBpc1dpZHRoID8geCA6IHlcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Zpc2libGUoc2lnbiwgdGlja1Bvc2l0aW9uLCBnZXRTaXplLCBzdGFydCwgZW5kKSB7XG4gIC8qIFNpbmNlIGdldFNpemUoKSBpcyBleHBlbnNpdmUgKGl0IHJlYWRzIHRoZSB0aWNrcycgc2l6ZSBmcm9tIHRoZSBET00pLCB3ZSBkbyB0aGlzIGNoZWNrIGZpcnN0IHRvIGF2b2lkIGNhbGN1bGF0aW5nXG4gICAqIHRoZSB0aWNrJ3Mgc2l6ZS4gKi9cbiAgaWYgKHNpZ24gKiB0aWNrUG9zaXRpb24gPCBzaWduICogc3RhcnQgfHwgc2lnbiAqIHRpY2tQb3NpdGlvbiA+IHNpZ24gKiBlbmQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHNpemUgPSBnZXRTaXplKCk7XG4gIHJldHVybiBzaWduICogKHRpY2tQb3NpdGlvbiAtIHNpZ24gKiBzaXplIC8gMiAtIHN0YXJ0KSA+PSAwICYmIHNpZ24gKiAodGlja1Bvc2l0aW9uICsgc2lnbiAqIHNpemUgLyAyIC0gZW5kKSA8PSAwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE51bWJlckludGVydmFsVGlja3ModGlja3MsIGludGVydmFsKSB7XG4gIHJldHVybiBnZXRFdmVyeU50aFdpdGhDb25kaXRpb24odGlja3MsIGludGVydmFsICsgMSk7XG59IiwiaW1wb3J0IG1lbW9pemUgZnJvbSAnbG9kYXNoL21lbW9pemUnO1xuLyoqXG4gKiBUaGlzIGlzIG1lbW9pemVkIGJlY2F1c2UgdGhlIHZpZXdCb3ggaXMgdW5saWtlbHkgdG8gY2hhbmdlIG9mdGVuXG4gKiAtIGJ1dCBiZWNhdXNlIGl0IGlzIGNvbXB1dGVkIGZyb20gb2Zmc2V0LCBhbnkgY2hhbmdlIHRvIGl0IHdvdWxkIHJlLXJlbmRlciBhbGwgY2hpbGRyZW4uXG4gKlxuICogQW5kIGJlY2F1c2Ugd2UgaGF2ZSBtYW55IHJlYWRlcnMgb2YgdGhlIHZpZXdCb3gsIGFuZCB1cGRhdGUgaXQgb25seSByYXJlbHksXG4gKiB0aGVuIGxldCdzIG9wdGltaXplIHdpdGggbWVtb2l6YXRpb24uXG4gKi9cbmV4cG9ydCB2YXIgY2FsY3VsYXRlVmlld0JveCA9IG1lbW9pemUoZnVuY3Rpb24gKG9mZnNldCkge1xuICByZXR1cm4ge1xuICAgIHg6IG9mZnNldC5sZWZ0LFxuICAgIHk6IG9mZnNldC50b3AsXG4gICAgd2lkdGg6IG9mZnNldC53aWR0aCxcbiAgICBoZWlnaHQ6IG9mZnNldC5oZWlnaHRcbiAgfTtcbn0sIGZ1bmN0aW9uIChvZmZzZXQpIHtcbiAgcmV0dXJuIFsnbCcsIG9mZnNldC5sZWZ0LCAndCcsIG9mZnNldC50b3AsICd3Jywgb2Zmc2V0LndpZHRoLCAnaCcsIG9mZnNldC5oZWlnaHRdLmpvaW4oJycpO1xufSk7IiwiaW1wb3J0IHsgcG9sYXJUb0NhcnRlc2lhbiB9IGZyb20gJy4uL1BvbGFyVXRpbHMnO1xuaW1wb3J0IHsgZ2V0UmFkaWFsQ3Vyc29yUG9pbnRzIH0gZnJvbSAnLi9nZXRSYWRpYWxDdXJzb3JQb2ludHMnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnNvclBvaW50cyhsYXlvdXQsIGFjdGl2ZUNvb3JkaW5hdGUsIG9mZnNldCkge1xuICB2YXIgeDEsIHkxLCB4MiwgeTI7XG4gIGlmIChsYXlvdXQgPT09ICdob3Jpem9udGFsJykge1xuICAgIHgxID0gYWN0aXZlQ29vcmRpbmF0ZS54O1xuICAgIHgyID0geDE7XG4gICAgeTEgPSBvZmZzZXQudG9wO1xuICAgIHkyID0gb2Zmc2V0LnRvcCArIG9mZnNldC5oZWlnaHQ7XG4gIH0gZWxzZSBpZiAobGF5b3V0ID09PSAndmVydGljYWwnKSB7XG4gICAgeTEgPSBhY3RpdmVDb29yZGluYXRlLnk7XG4gICAgeTIgPSB5MTtcbiAgICB4MSA9IG9mZnNldC5sZWZ0O1xuICAgIHgyID0gb2Zmc2V0LmxlZnQgKyBvZmZzZXQud2lkdGg7XG4gIH0gZWxzZSBpZiAoYWN0aXZlQ29vcmRpbmF0ZS5jeCAhPSBudWxsICYmIGFjdGl2ZUNvb3JkaW5hdGUuY3kgIT0gbnVsbCkge1xuICAgIGlmIChsYXlvdXQgPT09ICdjZW50cmljJykge1xuICAgICAgdmFyIGN4ID0gYWN0aXZlQ29vcmRpbmF0ZS5jeCxcbiAgICAgICAgY3kgPSBhY3RpdmVDb29yZGluYXRlLmN5LFxuICAgICAgICBpbm5lclJhZGl1cyA9IGFjdGl2ZUNvb3JkaW5hdGUuaW5uZXJSYWRpdXMsXG4gICAgICAgIG91dGVyUmFkaXVzID0gYWN0aXZlQ29vcmRpbmF0ZS5vdXRlclJhZGl1cyxcbiAgICAgICAgYW5nbGUgPSBhY3RpdmVDb29yZGluYXRlLmFuZ2xlO1xuICAgICAgdmFyIGlubmVyUG9pbnQgPSBwb2xhclRvQ2FydGVzaWFuKGN4LCBjeSwgaW5uZXJSYWRpdXMsIGFuZ2xlKTtcbiAgICAgIHZhciBvdXRlclBvaW50ID0gcG9sYXJUb0NhcnRlc2lhbihjeCwgY3ksIG91dGVyUmFkaXVzLCBhbmdsZSk7XG4gICAgICB4MSA9IGlubmVyUG9pbnQueDtcbiAgICAgIHkxID0gaW5uZXJQb2ludC55O1xuICAgICAgeDIgPSBvdXRlclBvaW50Lng7XG4gICAgICB5MiA9IG91dGVyUG9pbnQueTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldFJhZGlhbEN1cnNvclBvaW50cyhhY3RpdmVDb29yZGluYXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFt7XG4gICAgeDogeDEsXG4gICAgeTogeTFcbiAgfSwge1xuICAgIHg6IHgyLFxuICAgIHk6IHkyXG4gIH1dO1xufSIsImV4cG9ydCBmdW5jdGlvbiBnZXRDdXJzb3JSZWN0YW5nbGUobGF5b3V0LCBhY3RpdmVDb29yZGluYXRlLCBvZmZzZXQsIHRvb2x0aXBBeGlzQmFuZFNpemUpIHtcbiAgdmFyIGhhbGZTaXplID0gdG9vbHRpcEF4aXNCYW5kU2l6ZSAvIDI7XG4gIHJldHVybiB7XG4gICAgc3Ryb2tlOiAnbm9uZScsXG4gICAgZmlsbDogJyNjY2MnLFxuICAgIHg6IGxheW91dCA9PT0gJ2hvcml6b250YWwnID8gYWN0aXZlQ29vcmRpbmF0ZS54IC0gaGFsZlNpemUgOiBvZmZzZXQubGVmdCArIDAuNSxcbiAgICB5OiBsYXlvdXQgPT09ICdob3Jpem9udGFsJyA/IG9mZnNldC50b3AgKyAwLjUgOiBhY3RpdmVDb29yZGluYXRlLnkgLSBoYWxmU2l6ZSxcbiAgICB3aWR0aDogbGF5b3V0ID09PSAnaG9yaXpvbnRhbCcgPyB0b29sdGlwQXhpc0JhbmRTaXplIDogb2Zmc2V0LndpZHRoIC0gMSxcbiAgICBoZWlnaHQ6IGxheW91dCA9PT0gJ2hvcml6b250YWwnID8gb2Zmc2V0LmhlaWdodCAtIDEgOiB0b29sdGlwQXhpc0JhbmRTaXplXG4gIH07XG59IiwiaW1wb3J0IHsgcG9sYXJUb0NhcnRlc2lhbiB9IGZyb20gJy4uL1BvbGFyVXRpbHMnO1xuLyoqXG4gKiBPbmx5IGFwcGxpY2FibGUgZm9yIHJhZGlhbCBsYXlvdXRzXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aXZlQ29vcmRpbmF0ZSBDaGFydENvb3JkaW5hdGVcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJhZGlhbEN1cnNvclBvaW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFkaWFsQ3Vyc29yUG9pbnRzKGFjdGl2ZUNvb3JkaW5hdGUpIHtcbiAgdmFyIGN4ID0gYWN0aXZlQ29vcmRpbmF0ZS5jeCxcbiAgICBjeSA9IGFjdGl2ZUNvb3JkaW5hdGUuY3ksXG4gICAgcmFkaXVzID0gYWN0aXZlQ29vcmRpbmF0ZS5yYWRpdXMsXG4gICAgc3RhcnRBbmdsZSA9IGFjdGl2ZUNvb3JkaW5hdGUuc3RhcnRBbmdsZSxcbiAgICBlbmRBbmdsZSA9IGFjdGl2ZUNvb3JkaW5hdGUuZW5kQW5nbGU7XG4gIHZhciBzdGFydFBvaW50ID0gcG9sYXJUb0NhcnRlc2lhbihjeCwgY3ksIHJhZGl1cywgc3RhcnRBbmdsZSk7XG4gIHZhciBlbmRQb2ludCA9IHBvbGFyVG9DYXJ0ZXNpYW4oY3gsIGN5LCByYWRpdXMsIGVuZEFuZ2xlKTtcbiAgcmV0dXJuIHtcbiAgICBwb2ludHM6IFtzdGFydFBvaW50LCBlbmRQb2ludF0sXG4gICAgY3g6IGN4LFxuICAgIGN5OiBjeSxcbiAgICByYWRpdXM6IHJhZGl1cyxcbiAgICBzdGFydEFuZ2xlOiBzdGFydEFuZ2xlLFxuICAgIGVuZEFuZ2xlOiBlbmRBbmdsZVxuICB9O1xufSIsIi8qKlxuICogR2l2ZW4gYW4gYXJyYXkgYW5kIGEgbnVtYmVyIE4sIHJldHVybiBhIG5ldyBhcnJheSB3aGljaCBjb250YWlucyBldmVyeSBuVGhcbiAqIGVsZW1lbnQgb2YgdGhlIGlucHV0IGFycmF5LiBGb3IgbiBiZWxvdyAxLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC5cbiAqIElmIGlzVmFsaWQgaXMgcHJvdmlkZWQsIGFsbCBjYW5kaWRhdGVzIG11c3Qgc3VmZmljZSB0aGUgY29uZGl0aW9uLCBlbHNlIHVuZGVmaW5lZCBpcyByZXR1cm5lZC5cbiAqIEBwYXJhbSB7VFtdfSBhcnJheSBBbiBpbnB1dCBhcnJheS5cbiAqIEBwYXJhbSB7aW50ZWdlcn0gbiBBIG51bWJlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXNWYWxpZCBBIGZ1bmN0aW9uIHRvIGV2YWx1YXRlIGEgY2FuZGlkYXRlIGZvcm0gdGhlIGFycmF5XG4gKiBAcmV0dXJucyB7VFtdfSBUaGUgcmVzdWx0IGFycmF5IG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGlucHV0IGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlcnlOdGhXaXRoQ29uZGl0aW9uKGFycmF5LCBuLCBpc1ZhbGlkKSB7XG4gIGlmIChuIDwgMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAobiA9PT0gMSAmJiBpc1ZhbGlkID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSArPSBuKSB7XG4gICAgaWYgKGlzVmFsaWQgPT09IHVuZGVmaW5lZCB8fCBpc1ZhbGlkKGFycmF5W2ldKSA9PT0gdHJ1ZSkge1xuICAgICAgcmVzdWx0LnB1c2goYXJyYXlbaV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSIsImZ1bmN0aW9uIF90eXBlb2YobykgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9IDogZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87IH0sIF90eXBlb2Yobyk7IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9jb21wb25lbnQvTGVnZW5kJztcbmltcG9ydCB7IGdldE1haW5Db2xvck9mR3JhcGhpY0l0ZW0gfSBmcm9tICcuL0NoYXJ0VXRpbHMnO1xuaW1wb3J0IHsgZmluZENoaWxkQnlUeXBlIH0gZnJvbSAnLi9SZWFjdFV0aWxzJztcbmV4cG9ydCB2YXIgZ2V0TGVnZW5kUHJvcHMgPSBmdW5jdGlvbiBnZXRMZWdlbmRQcm9wcyhfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgZm9ybWF0dGVkR3JhcGhpY2FsSXRlbXMgPSBfcmVmLmZvcm1hdHRlZEdyYXBoaWNhbEl0ZW1zLFxuICAgIGxlZ2VuZFdpZHRoID0gX3JlZi5sZWdlbmRXaWR0aCxcbiAgICBsZWdlbmRDb250ZW50ID0gX3JlZi5sZWdlbmRDb250ZW50O1xuICB2YXIgbGVnZW5kSXRlbSA9IGZpbmRDaGlsZEJ5VHlwZShjaGlsZHJlbiwgTGVnZW5kKTtcbiAgaWYgKCFsZWdlbmRJdGVtKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGxlZ2VuZERlZmF1bHRQcm9wcyA9IExlZ2VuZC5kZWZhdWx0UHJvcHM7XG4gIHZhciBsZWdlbmRQcm9wcyA9IGxlZ2VuZERlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkID8gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBsZWdlbmREZWZhdWx0UHJvcHMpLCBsZWdlbmRJdGVtLnByb3BzKSA6IHt9O1xuICB2YXIgbGVnZW5kRGF0YTtcbiAgaWYgKGxlZ2VuZEl0ZW0ucHJvcHMgJiYgbGVnZW5kSXRlbS5wcm9wcy5wYXlsb2FkKSB7XG4gICAgbGVnZW5kRGF0YSA9IGxlZ2VuZEl0ZW0ucHJvcHMgJiYgbGVnZW5kSXRlbS5wcm9wcy5wYXlsb2FkO1xuICB9IGVsc2UgaWYgKGxlZ2VuZENvbnRlbnQgPT09ICdjaGlsZHJlbicpIHtcbiAgICBsZWdlbmREYXRhID0gKGZvcm1hdHRlZEdyYXBoaWNhbEl0ZW1zIHx8IFtdKS5yZWR1Y2UoZnVuY3Rpb24gKHJlc3VsdCwgX3JlZjIpIHtcbiAgICAgIHZhciBpdGVtID0gX3JlZjIuaXRlbSxcbiAgICAgICAgcHJvcHMgPSBfcmVmMi5wcm9wcztcbiAgICAgIHZhciBkYXRhID0gcHJvcHMuc2VjdG9ycyB8fCBwcm9wcy5kYXRhIHx8IFtdO1xuICAgICAgcmV0dXJuIHJlc3VsdC5jb25jYXQoZGF0YS5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogbGVnZW5kSXRlbS5wcm9wcy5pY29uVHlwZSB8fCBpdGVtLnByb3BzLmxlZ2VuZFR5cGUsXG4gICAgICAgICAgdmFsdWU6IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgY29sb3I6IGVudHJ5LmZpbGwsXG4gICAgICAgICAgcGF5bG9hZDogZW50cnlcbiAgICAgICAgfTtcbiAgICAgIH0pKTtcbiAgICB9LCBbXSk7XG4gIH0gZWxzZSB7XG4gICAgbGVnZW5kRGF0YSA9IChmb3JtYXR0ZWRHcmFwaGljYWxJdGVtcyB8fCBbXSkubWFwKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgdmFyIGl0ZW0gPSBfcmVmMy5pdGVtO1xuICAgICAgdmFyIGl0ZW1EZWZhdWx0UHJvcHMgPSBpdGVtLnR5cGUuZGVmYXVsdFByb3BzO1xuICAgICAgdmFyIGl0ZW1Qcm9wcyA9IGl0ZW1EZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCA/IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaXRlbURlZmF1bHRQcm9wcyksIGl0ZW0ucHJvcHMpIDoge307XG4gICAgICB2YXIgZGF0YUtleSA9IGl0ZW1Qcm9wcy5kYXRhS2V5LFxuICAgICAgICBuYW1lID0gaXRlbVByb3BzLm5hbWUsXG4gICAgICAgIGxlZ2VuZFR5cGUgPSBpdGVtUHJvcHMubGVnZW5kVHlwZSxcbiAgICAgICAgaGlkZSA9IGl0ZW1Qcm9wcy5oaWRlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5hY3RpdmU6IGhpZGUsXG4gICAgICAgIGRhdGFLZXk6IGRhdGFLZXksXG4gICAgICAgIHR5cGU6IGxlZ2VuZFByb3BzLmljb25UeXBlIHx8IGxlZ2VuZFR5cGUgfHwgJ3NxdWFyZScsXG4gICAgICAgIGNvbG9yOiBnZXRNYWluQ29sb3JPZkdyYXBoaWNJdGVtKGl0ZW0pLFxuICAgICAgICB2YWx1ZTogbmFtZSB8fCBkYXRhS2V5LFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHByb3BlcnR5IHN0cm9rZURhc2hhcnJheSBpcyByZXF1aXJlZCBpbiBQYXlsb2FkIGJ1dCBvcHRpb25hbCBpbiBwcm9wc1xuICAgICAgICBwYXlsb2FkOiBpdGVtUHJvcHNcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBsZWdlbmRQcm9wcyksIExlZ2VuZC5nZXRXaXRoSGVpZ2h0KGxlZ2VuZEl0ZW0sIGxlZ2VuZFdpZHRoKSksIHt9LCB7XG4gICAgcGF5bG9hZDogbGVnZW5kRGF0YSxcbiAgICBpdGVtOiBsZWdlbmRJdGVtXG4gIH0pO1xufTsiLCJpbXBvcnQgeyBpc051bWJlciB9IGZyb20gJy4vRGF0YVV0aWxzJztcbi8qKlxuICogVGFrZXMgYSBkb21haW4gYW5kIHVzZXIgcHJvcHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaGUgcHJvdmlkZWQgdGhlIGRvbWFpbiB2aWEgcHJvcHMgb3IgaWYgd2UgbmVlZCB0byBjYWxjdWxhdGUgaXQuXG4gKiBAcGFyYW0gICB7QXhpc0RvbWFpbn0gIGRvbWFpbiAgICAgICAgICAgICAgVGhlIHBvdGVudGlhbCBkb21haW4gZnJvbSBwcm9wc1xuICogQHBhcmFtICAge0Jvb2xlYW59ICAgICBhbGxvd0RhdGFPdmVyZmxvdyAgIGZyb20gcHJvcHNcbiAqIEBwYXJhbSAgIHtTdHJpbmd9ICAgICAgYXhpc1R5cGUgICAgICAgICAgICBmcm9tIHByb3BzXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gICAgICAgICAgICAgICAgICAgICAgICAgYHRydWVgIGlmIGRvbWFpbiBpcyBzcGVjaWZpZWQgYnkgdXNlclxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEb21haW5TcGVjaWZpZWRCeVVzZXIoZG9tYWluLCBhbGxvd0RhdGFPdmVyZmxvdywgYXhpc1R5cGUpIHtcbiAgaWYgKGF4aXNUeXBlID09PSAnbnVtYmVyJyAmJiBhbGxvd0RhdGFPdmVyZmxvdyA9PT0gdHJ1ZSAmJiBBcnJheS5pc0FycmF5KGRvbWFpbikpIHtcbiAgICB2YXIgZG9tYWluU3RhcnQgPSBkb21haW4gPT09IG51bGwgfHwgZG9tYWluID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb21haW5bMF07XG4gICAgdmFyIGRvbWFpbkVuZCA9IGRvbWFpbiA9PT0gbnVsbCB8fCBkb21haW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvbWFpblsxXTtcblxuICAgIC8qXG4gICAgICogVGhlIGBpc051bWJlcmAgY2hlY2sgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIHVzZXIgY291bGQgYWxzbyBwcm92aWRlIHN0cmluZ3MgbGlrZSBcImRhdGFNaW5cIiB2aWEgdGhlIGRvbWFpbiBwcm9wcy5cbiAgICAgKiBJbiBzdWNoIGNhc2UsIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGUgZG9tYWluIGZyb20gdGhlIGRhdGEuXG4gICAgICovXG4gICAgaWYgKCEhZG9tYWluU3RhcnQgJiYgISFkb21haW5FbmQgJiYgaXNOdW1iZXIoZG9tYWluU3RhcnQpICYmIGlzTnVtYmVyKGRvbWFpbkVuZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59IiwiaW1wb3J0IHVuaXFCeSBmcm9tICdsb2Rhc2gvdW5pcUJ5JztcbmltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJ2xvZGFzaC9pc0Z1bmN0aW9uJztcblxuLyoqXG4gKiBUaGlzIGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRoYXQgZGVjaWRlcyBob3cgdG8gZmlsdGVyIGZvciB1bmlxdWUgdmFsdWVzIG9ubHk6XG4gKlxuICogLSBgZmFsc2VgIG1lYW5zIFwibm8gZmlsdGVyXCJcbiAqIC0gYHRydWVgIG1lYW5zIFwidXNlIHJlY2hhcnRzIGRlZmF1bHQgZmlsdGVyXCJcbiAqIC0gZnVuY3Rpb24gbWVhbnMgXCJ1c2UgcmV0dXJuIG9mIHRoaXMgZnVuY3Rpb24gYXMgdGhlIGRlZmF1bHQga2V5XCJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pcVBheWxvYWQocGF5bG9hZCwgb3B0aW9uLCBkZWZhdWx0VW5pcUJ5KSB7XG4gIGlmIChvcHRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gdW5pcUJ5KHBheWxvYWQsIGRlZmF1bHRVbmlxQnkpO1xuICB9XG4gIGlmIChpc0Z1bmN0aW9uKG9wdGlvbikpIHtcbiAgICByZXR1cm4gdW5pcUJ5KHBheWxvYWQsIG9wdGlvbik7XG4gIH1cbiAgcmV0dXJuIHBheWxvYWQ7XG59IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSAnLi4vRGF0YVV0aWxzJztcbnZhciBDU1NfQ0xBU1NfUFJFRklYID0gJ3JlY2hhcnRzLXRvb2x0aXAtd3JhcHBlcic7XG52YXIgVE9PTFRJUF9ISURERU4gPSB7XG4gIHZpc2liaWxpdHk6ICdoaWRkZW4nXG59O1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRvb2x0aXBDU1NDbGFzc05hbWUoX3JlZikge1xuICB2YXIgY29vcmRpbmF0ZSA9IF9yZWYuY29vcmRpbmF0ZSxcbiAgICB0cmFuc2xhdGVYID0gX3JlZi50cmFuc2xhdGVYLFxuICAgIHRyYW5zbGF0ZVkgPSBfcmVmLnRyYW5zbGF0ZVk7XG4gIHJldHVybiBjbHN4KENTU19DTEFTU19QUkVGSVgsIF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoQ1NTX0NMQVNTX1BSRUZJWCwgXCItcmlnaHRcIiksIGlzTnVtYmVyKHRyYW5zbGF0ZVgpICYmIGNvb3JkaW5hdGUgJiYgaXNOdW1iZXIoY29vcmRpbmF0ZS54KSAmJiB0cmFuc2xhdGVYID49IGNvb3JkaW5hdGUueCksIFwiXCIuY29uY2F0KENTU19DTEFTU19QUkVGSVgsIFwiLWxlZnRcIiksIGlzTnVtYmVyKHRyYW5zbGF0ZVgpICYmIGNvb3JkaW5hdGUgJiYgaXNOdW1iZXIoY29vcmRpbmF0ZS54KSAmJiB0cmFuc2xhdGVYIDwgY29vcmRpbmF0ZS54KSwgXCJcIi5jb25jYXQoQ1NTX0NMQVNTX1BSRUZJWCwgXCItYm90dG9tXCIpLCBpc051bWJlcih0cmFuc2xhdGVZKSAmJiBjb29yZGluYXRlICYmIGlzTnVtYmVyKGNvb3JkaW5hdGUueSkgJiYgdHJhbnNsYXRlWSA+PSBjb29yZGluYXRlLnkpLCBcIlwiLmNvbmNhdChDU1NfQ0xBU1NfUFJFRklYLCBcIi10b3BcIiksIGlzTnVtYmVyKHRyYW5zbGF0ZVkpICYmIGNvb3JkaW5hdGUgJiYgaXNOdW1iZXIoY29vcmRpbmF0ZS55KSAmJiB0cmFuc2xhdGVZIDwgY29vcmRpbmF0ZS55KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9vbHRpcFRyYW5zbGF0ZVhZKF9yZWYyKSB7XG4gIHZhciBhbGxvd0VzY2FwZVZpZXdCb3ggPSBfcmVmMi5hbGxvd0VzY2FwZVZpZXdCb3gsXG4gICAgY29vcmRpbmF0ZSA9IF9yZWYyLmNvb3JkaW5hdGUsXG4gICAga2V5ID0gX3JlZjIua2V5LFxuICAgIG9mZnNldFRvcExlZnQgPSBfcmVmMi5vZmZzZXRUb3BMZWZ0LFxuICAgIHBvc2l0aW9uID0gX3JlZjIucG9zaXRpb24sXG4gICAgcmV2ZXJzZURpcmVjdGlvbiA9IF9yZWYyLnJldmVyc2VEaXJlY3Rpb24sXG4gICAgdG9vbHRpcERpbWVuc2lvbiA9IF9yZWYyLnRvb2x0aXBEaW1lbnNpb24sXG4gICAgdmlld0JveCA9IF9yZWYyLnZpZXdCb3gsXG4gICAgdmlld0JveERpbWVuc2lvbiA9IF9yZWYyLnZpZXdCb3hEaW1lbnNpb247XG4gIGlmIChwb3NpdGlvbiAmJiBpc051bWJlcihwb3NpdGlvbltrZXldKSkge1xuICAgIHJldHVybiBwb3NpdGlvbltrZXldO1xuICB9XG4gIHZhciBuZWdhdGl2ZSA9IGNvb3JkaW5hdGVba2V5XSAtIHRvb2x0aXBEaW1lbnNpb24gLSBvZmZzZXRUb3BMZWZ0O1xuICB2YXIgcG9zaXRpdmUgPSBjb29yZGluYXRlW2tleV0gKyBvZmZzZXRUb3BMZWZ0O1xuICBpZiAoYWxsb3dFc2NhcGVWaWV3Qm94W2tleV0pIHtcbiAgICByZXR1cm4gcmV2ZXJzZURpcmVjdGlvbltrZXldID8gbmVnYXRpdmUgOiBwb3NpdGl2ZTtcbiAgfVxuICBpZiAocmV2ZXJzZURpcmVjdGlvbltrZXldKSB7XG4gICAgdmFyIF90b29sdGlwQm91bmRhcnkgPSBuZWdhdGl2ZTtcbiAgICB2YXIgX3ZpZXdCb3hCb3VuZGFyeSA9IHZpZXdCb3hba2V5XTtcbiAgICBpZiAoX3Rvb2x0aXBCb3VuZGFyeSA8IF92aWV3Qm94Qm91bmRhcnkpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heChwb3NpdGl2ZSwgdmlld0JveFtrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWF4KG5lZ2F0aXZlLCB2aWV3Qm94W2tleV0pO1xuICB9XG4gIHZhciB0b29sdGlwQm91bmRhcnkgPSBwb3NpdGl2ZSArIHRvb2x0aXBEaW1lbnNpb247XG4gIHZhciB2aWV3Qm94Qm91bmRhcnkgPSB2aWV3Qm94W2tleV0gKyB2aWV3Qm94RGltZW5zaW9uO1xuICBpZiAodG9vbHRpcEJvdW5kYXJ5ID4gdmlld0JveEJvdW5kYXJ5KSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KG5lZ2F0aXZlLCB2aWV3Qm94W2tleV0pO1xuICB9XG4gIHJldHVybiBNYXRoLm1heChwb3NpdGl2ZSwgdmlld0JveFtrZXldKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2Zvcm1TdHlsZShfcmVmMykge1xuICB2YXIgdHJhbnNsYXRlWCA9IF9yZWYzLnRyYW5zbGF0ZVgsXG4gICAgdHJhbnNsYXRlWSA9IF9yZWYzLnRyYW5zbGF0ZVksXG4gICAgdXNlVHJhbnNsYXRlM2QgPSBfcmVmMy51c2VUcmFuc2xhdGUzZDtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2Zvcm06IHVzZVRyYW5zbGF0ZTNkID8gXCJ0cmFuc2xhdGUzZChcIi5jb25jYXQodHJhbnNsYXRlWCwgXCJweCwgXCIpLmNvbmNhdCh0cmFuc2xhdGVZLCBcInB4LCAwKVwiKSA6IFwidHJhbnNsYXRlKFwiLmNvbmNhdCh0cmFuc2xhdGVYLCBcInB4LCBcIikuY29uY2F0KHRyYW5zbGF0ZVksIFwicHgpXCIpXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9vbHRpcFRyYW5zbGF0ZShfcmVmNCkge1xuICB2YXIgYWxsb3dFc2NhcGVWaWV3Qm94ID0gX3JlZjQuYWxsb3dFc2NhcGVWaWV3Qm94LFxuICAgIGNvb3JkaW5hdGUgPSBfcmVmNC5jb29yZGluYXRlLFxuICAgIG9mZnNldFRvcExlZnQgPSBfcmVmNC5vZmZzZXRUb3BMZWZ0LFxuICAgIHBvc2l0aW9uID0gX3JlZjQucG9zaXRpb24sXG4gICAgcmV2ZXJzZURpcmVjdGlvbiA9IF9yZWY0LnJldmVyc2VEaXJlY3Rpb24sXG4gICAgdG9vbHRpcEJveCA9IF9yZWY0LnRvb2x0aXBCb3gsXG4gICAgdXNlVHJhbnNsYXRlM2QgPSBfcmVmNC51c2VUcmFuc2xhdGUzZCxcbiAgICB2aWV3Qm94ID0gX3JlZjQudmlld0JveDtcbiAgdmFyIGNzc1Byb3BlcnRpZXMsIHRyYW5zbGF0ZVgsIHRyYW5zbGF0ZVk7XG4gIGlmICh0b29sdGlwQm94LmhlaWdodCA+IDAgJiYgdG9vbHRpcEJveC53aWR0aCA+IDAgJiYgY29vcmRpbmF0ZSkge1xuICAgIHRyYW5zbGF0ZVggPSBnZXRUb29sdGlwVHJhbnNsYXRlWFkoe1xuICAgICAgYWxsb3dFc2NhcGVWaWV3Qm94OiBhbGxvd0VzY2FwZVZpZXdCb3gsXG4gICAgICBjb29yZGluYXRlOiBjb29yZGluYXRlLFxuICAgICAga2V5OiAneCcsXG4gICAgICBvZmZzZXRUb3BMZWZ0OiBvZmZzZXRUb3BMZWZ0LFxuICAgICAgcG9zaXRpb246IHBvc2l0aW9uLFxuICAgICAgcmV2ZXJzZURpcmVjdGlvbjogcmV2ZXJzZURpcmVjdGlvbixcbiAgICAgIHRvb2x0aXBEaW1lbnNpb246IHRvb2x0aXBCb3gud2lkdGgsXG4gICAgICB2aWV3Qm94OiB2aWV3Qm94LFxuICAgICAgdmlld0JveERpbWVuc2lvbjogdmlld0JveC53aWR0aFxuICAgIH0pO1xuICAgIHRyYW5zbGF0ZVkgPSBnZXRUb29sdGlwVHJhbnNsYXRlWFkoe1xuICAgICAgYWxsb3dFc2NhcGVWaWV3Qm94OiBhbGxvd0VzY2FwZVZpZXdCb3gsXG4gICAgICBjb29yZGluYXRlOiBjb29yZGluYXRlLFxuICAgICAga2V5OiAneScsXG4gICAgICBvZmZzZXRUb3BMZWZ0OiBvZmZzZXRUb3BMZWZ0LFxuICAgICAgcG9zaXRpb246IHBvc2l0aW9uLFxuICAgICAgcmV2ZXJzZURpcmVjdGlvbjogcmV2ZXJzZURpcmVjdGlvbixcbiAgICAgIHRvb2x0aXBEaW1lbnNpb246IHRvb2x0aXBCb3guaGVpZ2h0LFxuICAgICAgdmlld0JveDogdmlld0JveCxcbiAgICAgIHZpZXdCb3hEaW1lbnNpb246IHZpZXdCb3guaGVpZ2h0XG4gICAgfSk7XG4gICAgY3NzUHJvcGVydGllcyA9IGdldFRyYW5zZm9ybVN0eWxlKHtcbiAgICAgIHRyYW5zbGF0ZVg6IHRyYW5zbGF0ZVgsXG4gICAgICB0cmFuc2xhdGVZOiB0cmFuc2xhdGVZLFxuICAgICAgdXNlVHJhbnNsYXRlM2Q6IHVzZVRyYW5zbGF0ZTNkXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY3NzUHJvcGVydGllcyA9IFRPT0xUSVBfSElEREVOO1xuICB9XG4gIHJldHVybiB7XG4gICAgY3NzUHJvcGVydGllczogY3NzUHJvcGVydGllcyxcbiAgICBjc3NDbGFzc2VzOiBnZXRUb29sdGlwQ1NTQ2xhc3NOYW1lKHtcbiAgICAgIHRyYW5zbGF0ZVg6IHRyYW5zbGF0ZVgsXG4gICAgICB0cmFuc2xhdGVZOiB0cmFuc2xhdGVZLFxuICAgICAgY29vcmRpbmF0ZTogY29vcmRpbmF0ZVxuICAgIH0pXG4gIH07XG59IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuaW1wb3J0IHsgaXNWYWxpZEVsZW1lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnbG9kYXNoL2lzT2JqZWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGhvdyB2YWx1ZXMgYXJlIHN0YWNrZWQ6XG4gKlxuICogLSBgbm9uZWAgaXMgdGhlIGRlZmF1bHQsIGl0IGFkZHMgdmFsdWVzIG9uIHRvcCBvZiBlYWNoIG90aGVyLiBObyBzbWFydHMuIE5lZ2F0aXZlIHZhbHVlcyB3aWxsIG92ZXJsYXAuXG4gKiAtIGBleHBhbmRgIG1ha2UgaXQgc28gdGhhdCB0aGUgdmFsdWVzIGFsd2F5cyBhZGQgdXAgdG8gMSAtIHNvIHRoZSBjaGFydCB3aWxsIGxvb2sgbGlrZSBhIHJlY3RhbmdsZS5cbiAqIC0gYHdpZ2dsZWAgYW5kIGBzaWxob3VldHRlYCB0cmllcyB0byBrZWVwIHRoZSBjaGFydCBjZW50ZXJlZC5cbiAqIC0gYHNpZ25gIHN0YWNrcyBwb3NpdGl2ZSB2YWx1ZXMgYWJvdmUgemVybyBhbmQgbmVnYXRpdmUgdmFsdWVzIGJlbG93IHplcm8uIFNpbWlsYXIgdG8gYG5vbmVgIGJ1dCBoYW5kbGVzIG5lZ2F0aXZlcy5cbiAqIC0gYHBvc2l0aXZlYCBpZ25vcmVzIGFsbCBuZWdhdGl2ZSB2YWx1ZXMsIGFuZCB0aGVuIGJlaGF2ZXMgbGlrZSBcXGBub25lXFxgLlxuICpcbiAqIEFsc28gc2VlIGh0dHBzOi8vZDNqcy5vcmcvZDMtc2hhcGUvc3RhY2sjc3RhY2stb2Zmc2V0c1xuICogKG5vdGUgdGhhdCB0aGUgYGRpdmVyZ2luZ2Agb2Zmc2V0IGluIGQzIGlzIG5hbWVkIGBzaWduYCBpbiByZWNoYXJ0cylcbiAqL1xuXG4vL1xuLy8gRXZlbnQgSGFuZGxlciBUeXBlcyAtLSBDb3BpZWQgZnJvbSBAdHlwZXMvcmVhY3QvaW5kZXguZC50cyBhbmQgYWRhcHRlZCBmb3IgUHJvcHMuXG4vL1xuXG52YXIgU1ZHQ29udGFpbmVyUHJvcEtleXMgPSBbJ3ZpZXdCb3gnLCAnY2hpbGRyZW4nXTtcbmV4cG9ydCB2YXIgU1ZHRWxlbWVudFByb3BLZXlzID0gWydhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnLCAnYXJpYS1hdG9taWMnLCAnYXJpYS1hdXRvY29tcGxldGUnLCAnYXJpYS1idXN5JywgJ2FyaWEtY2hlY2tlZCcsICdhcmlhLWNvbGNvdW50JywgJ2FyaWEtY29saW5kZXgnLCAnYXJpYS1jb2xzcGFuJywgJ2FyaWEtY29udHJvbHMnLCAnYXJpYS1jdXJyZW50JywgJ2FyaWEtZGVzY3JpYmVkYnknLCAnYXJpYS1kZXRhaWxzJywgJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1leHBhbmRlZCcsICdhcmlhLWZsb3d0bycsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaGlkZGVuJywgJ2FyaWEtaW52YWxpZCcsICdhcmlhLWtleXNob3J0Y3V0cycsICdhcmlhLWxhYmVsJywgJ2FyaWEtbGFiZWxsZWRieScsICdhcmlhLWxldmVsJywgJ2FyaWEtbGl2ZScsICdhcmlhLW1vZGFsJywgJ2FyaWEtbXVsdGlsaW5lJywgJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJywgJ2FyaWEtb3JpZW50YXRpb24nLCAnYXJpYS1vd25zJywgJ2FyaWEtcGxhY2Vob2xkZXInLCAnYXJpYS1wb3NpbnNldCcsICdhcmlhLXByZXNzZWQnLCAnYXJpYS1yZWFkb25seScsICdhcmlhLXJlbGV2YW50JywgJ2FyaWEtcmVxdWlyZWQnLCAnYXJpYS1yb2xlZGVzY3JpcHRpb24nLCAnYXJpYS1yb3djb3VudCcsICdhcmlhLXJvd2luZGV4JywgJ2FyaWEtcm93c3BhbicsICdhcmlhLXNlbGVjdGVkJywgJ2FyaWEtc2V0c2l6ZScsICdhcmlhLXNvcnQnLCAnYXJpYS12YWx1ZW1heCcsICdhcmlhLXZhbHVlbWluJywgJ2FyaWEtdmFsdWVub3cnLCAnYXJpYS12YWx1ZXRleHQnLCAnY2xhc3NOYW1lJywgJ2NvbG9yJywgJ2hlaWdodCcsICdpZCcsICdsYW5nJywgJ21heCcsICdtZWRpYScsICdtZXRob2QnLCAnbWluJywgJ25hbWUnLCAnc3R5bGUnLFxuLypcbiAqIHJlbW92ZWQgJ3R5cGUnIFNWR0VsZW1lbnRQcm9wS2V5IGJlY2F1c2Ugd2UgZG8gbm90IGN1cnJlbnRseSB1c2UgYW55IFNWRyBlbGVtZW50c1xuICogdGhhdCBjYW4gdXNlIGl0IGFuZCBpdCBjb25mbGljdHMgd2l0aCB0aGUgcmVjaGFydHMgcHJvcCAndHlwZSdcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWNoYXJ0cy9yZWNoYXJ0cy9wdWxsLzMzMjdcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1NWRy9BdHRyaWJ1dGUvdHlwZVxuICovXG4vLyAndHlwZScsXG4ndGFyZ2V0JywgJ3dpZHRoJywgJ3JvbGUnLCAndGFiSW5kZXgnLCAnYWNjZW50SGVpZ2h0JywgJ2FjY3VtdWxhdGUnLCAnYWRkaXRpdmUnLCAnYWxpZ25tZW50QmFzZWxpbmUnLCAnYWxsb3dSZW9yZGVyJywgJ2FscGhhYmV0aWMnLCAnYW1wbGl0dWRlJywgJ2FyYWJpY0Zvcm0nLCAnYXNjZW50JywgJ2F0dHJpYnV0ZU5hbWUnLCAnYXR0cmlidXRlVHlwZScsICdhdXRvUmV2ZXJzZScsICdhemltdXRoJywgJ2Jhc2VGcmVxdWVuY3knLCAnYmFzZWxpbmVTaGlmdCcsICdiYXNlUHJvZmlsZScsICdiYm94JywgJ2JlZ2luJywgJ2JpYXMnLCAnYnknLCAnY2FsY01vZGUnLCAnY2FwSGVpZ2h0JywgJ2NsaXAnLCAnY2xpcFBhdGgnLCAnY2xpcFBhdGhVbml0cycsICdjbGlwUnVsZScsICdjb2xvckludGVycG9sYXRpb24nLCAnY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVycycsICdjb2xvclByb2ZpbGUnLCAnY29sb3JSZW5kZXJpbmcnLCAnY29udGVudFNjcmlwdFR5cGUnLCAnY29udGVudFN0eWxlVHlwZScsICdjdXJzb3InLCAnY3gnLCAnY3knLCAnZCcsICdkZWNlbGVyYXRlJywgJ2Rlc2NlbnQnLCAnZGlmZnVzZUNvbnN0YW50JywgJ2RpcmVjdGlvbicsICdkaXNwbGF5JywgJ2Rpdmlzb3InLCAnZG9taW5hbnRCYXNlbGluZScsICdkdXInLCAnZHgnLCAnZHknLCAnZWRnZU1vZGUnLCAnZWxldmF0aW9uJywgJ2VuYWJsZUJhY2tncm91bmQnLCAnZW5kJywgJ2V4cG9uZW50JywgJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLCAnZmlsbCcsICdmaWxsT3BhY2l0eScsICdmaWxsUnVsZScsICdmaWx0ZXInLCAnZmlsdGVyUmVzJywgJ2ZpbHRlclVuaXRzJywgJ2Zsb29kQ29sb3InLCAnZmxvb2RPcGFjaXR5JywgJ2ZvY3VzYWJsZScsICdmb250RmFtaWx5JywgJ2ZvbnRTaXplJywgJ2ZvbnRTaXplQWRqdXN0JywgJ2ZvbnRTdHJldGNoJywgJ2ZvbnRTdHlsZScsICdmb250VmFyaWFudCcsICdmb250V2VpZ2h0JywgJ2Zvcm1hdCcsICdmcm9tJywgJ2Z4JywgJ2Z5JywgJ2cxJywgJ2cyJywgJ2dseXBoTmFtZScsICdnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbCcsICdnbHlwaE9yaWVudGF0aW9uVmVydGljYWwnLCAnZ2x5cGhSZWYnLCAnZ3JhZGllbnRUcmFuc2Zvcm0nLCAnZ3JhZGllbnRVbml0cycsICdoYW5naW5nJywgJ2hvcml6QWR2WCcsICdob3Jpek9yaWdpblgnLCAnaHJlZicsICdpZGVvZ3JhcGhpYycsICdpbWFnZVJlbmRlcmluZycsICdpbjInLCAnaW4nLCAnaW50ZXJjZXB0JywgJ2sxJywgJ2syJywgJ2szJywgJ2s0JywgJ2snLCAna2VybmVsTWF0cml4JywgJ2tlcm5lbFVuaXRMZW5ndGgnLCAna2VybmluZycsICdrZXlQb2ludHMnLCAna2V5U3BsaW5lcycsICdrZXlUaW1lcycsICdsZW5ndGhBZGp1c3QnLCAnbGV0dGVyU3BhY2luZycsICdsaWdodGluZ0NvbG9yJywgJ2xpbWl0aW5nQ29uZUFuZ2xlJywgJ2xvY2FsJywgJ21hcmtlckVuZCcsICdtYXJrZXJIZWlnaHQnLCAnbWFya2VyTWlkJywgJ21hcmtlclN0YXJ0JywgJ21hcmtlclVuaXRzJywgJ21hcmtlcldpZHRoJywgJ21hc2snLCAnbWFza0NvbnRlbnRVbml0cycsICdtYXNrVW5pdHMnLCAnbWF0aGVtYXRpY2FsJywgJ21vZGUnLCAnbnVtT2N0YXZlcycsICdvZmZzZXQnLCAnb3BhY2l0eScsICdvcGVyYXRvcicsICdvcmRlcicsICdvcmllbnQnLCAnb3JpZW50YXRpb24nLCAnb3JpZ2luJywgJ292ZXJmbG93JywgJ292ZXJsaW5lUG9zaXRpb24nLCAnb3ZlcmxpbmVUaGlja25lc3MnLCAncGFpbnRPcmRlcicsICdwYW5vc2UxJywgJ3BhdGhMZW5ndGgnLCAncGF0dGVybkNvbnRlbnRVbml0cycsICdwYXR0ZXJuVHJhbnNmb3JtJywgJ3BhdHRlcm5Vbml0cycsICdwb2ludGVyRXZlbnRzJywgJ3BvaW50c0F0WCcsICdwb2ludHNBdFknLCAncG9pbnRzQXRaJywgJ3ByZXNlcnZlQWxwaGEnLCAncHJlc2VydmVBc3BlY3RSYXRpbycsICdwcmltaXRpdmVVbml0cycsICdyJywgJ3JhZGl1cycsICdyZWZYJywgJ3JlZlknLCAncmVuZGVyaW5nSW50ZW50JywgJ3JlcGVhdENvdW50JywgJ3JlcGVhdER1cicsICdyZXF1aXJlZEV4dGVuc2lvbnMnLCAncmVxdWlyZWRGZWF0dXJlcycsICdyZXN0YXJ0JywgJ3Jlc3VsdCcsICdyb3RhdGUnLCAncngnLCAncnknLCAnc2VlZCcsICdzaGFwZVJlbmRlcmluZycsICdzbG9wZScsICdzcGFjaW5nJywgJ3NwZWN1bGFyQ29uc3RhbnQnLCAnc3BlY3VsYXJFeHBvbmVudCcsICdzcGVlZCcsICdzcHJlYWRNZXRob2QnLCAnc3RhcnRPZmZzZXQnLCAnc3RkRGV2aWF0aW9uJywgJ3N0ZW1oJywgJ3N0ZW12JywgJ3N0aXRjaFRpbGVzJywgJ3N0b3BDb2xvcicsICdzdG9wT3BhY2l0eScsICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLCAnc3RyaWtldGhyb3VnaFRoaWNrbmVzcycsICdzdHJpbmcnLCAnc3Ryb2tlJywgJ3N0cm9rZURhc2hhcnJheScsICdzdHJva2VEYXNob2Zmc2V0JywgJ3N0cm9rZUxpbmVjYXAnLCAnc3Ryb2tlTGluZWpvaW4nLCAnc3Ryb2tlTWl0ZXJsaW1pdCcsICdzdHJva2VPcGFjaXR5JywgJ3N0cm9rZVdpZHRoJywgJ3N1cmZhY2VTY2FsZScsICdzeXN0ZW1MYW5ndWFnZScsICd0YWJsZVZhbHVlcycsICd0YXJnZXRYJywgJ3RhcmdldFknLCAndGV4dEFuY2hvcicsICd0ZXh0RGVjb3JhdGlvbicsICd0ZXh0TGVuZ3RoJywgJ3RleHRSZW5kZXJpbmcnLCAndG8nLCAndHJhbnNmb3JtJywgJ3UxJywgJ3UyJywgJ3VuZGVybGluZVBvc2l0aW9uJywgJ3VuZGVybGluZVRoaWNrbmVzcycsICd1bmljb2RlJywgJ3VuaWNvZGVCaWRpJywgJ3VuaWNvZGVSYW5nZScsICd1bml0c1BlckVtJywgJ3ZBbHBoYWJldGljJywgJ3ZhbHVlcycsICd2ZWN0b3JFZmZlY3QnLCAndmVyc2lvbicsICd2ZXJ0QWR2WScsICd2ZXJ0T3JpZ2luWCcsICd2ZXJ0T3JpZ2luWScsICd2SGFuZ2luZycsICd2SWRlb2dyYXBoaWMnLCAndmlld1RhcmdldCcsICd2aXNpYmlsaXR5JywgJ3ZNYXRoZW1hdGljYWwnLCAnd2lkdGhzJywgJ3dvcmRTcGFjaW5nJywgJ3dyaXRpbmdNb2RlJywgJ3gxJywgJ3gyJywgJ3gnLCAneENoYW5uZWxTZWxlY3RvcicsICd4SGVpZ2h0JywgJ3hsaW5rQWN0dWF0ZScsICd4bGlua0FyY3JvbGUnLCAneGxpbmtIcmVmJywgJ3hsaW5rUm9sZScsICd4bGlua1Nob3cnLCAneGxpbmtUaXRsZScsICd4bGlua1R5cGUnLCAneG1sQmFzZScsICd4bWxMYW5nJywgJ3htbG5zJywgJ3htbG5zWGxpbmsnLCAneG1sU3BhY2UnLCAneTEnLCAneTInLCAneScsICd5Q2hhbm5lbFNlbGVjdG9yJywgJ3onLCAnem9vbUFuZFBhbicsICdyZWYnLCAna2V5JywgJ2FuZ2xlJ107XG52YXIgUG9seUVsZW1lbnRLZXlzID0gWydwb2ludHMnLCAncGF0aExlbmd0aCddO1xuXG4vKiogc3ZnIGVsZW1lbnQgdHlwZXMgdGhhdCBoYXZlIHNwZWNpZmljIGF0dHJpYnV0ZSBmaWx0cmF0aW9uIHJlcXVpcmVtZW50cyAqL1xuXG4vKiogbWFwIG9mIHN2ZyBlbGVtZW50IHR5cGVzIHRvIHVuaXF1ZSBzdmcgYXR0cmlidXRlcyB0aGF0IGJlbG9uZyB0byB0aGF0IGVsZW1lbnQgKi9cbmV4cG9ydCB2YXIgRmlsdGVyZWRFbGVtZW50S2V5TWFwID0ge1xuICBzdmc6IFNWR0NvbnRhaW5lclByb3BLZXlzLFxuICBwb2x5Z29uOiBQb2x5RWxlbWVudEtleXMsXG4gIHBvbHlsaW5lOiBQb2x5RWxlbWVudEtleXNcbn07XG5leHBvcnQgdmFyIEV2ZW50S2V5cyA9IFsnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnLCAnb25Db3B5JywgJ29uQ29weUNhcHR1cmUnLCAnb25DdXQnLCAnb25DdXRDYXB0dXJlJywgJ29uUGFzdGUnLCAnb25QYXN0ZUNhcHR1cmUnLCAnb25Db21wb3NpdGlvbkVuZCcsICdvbkNvbXBvc2l0aW9uRW5kQ2FwdHVyZScsICdvbkNvbXBvc2l0aW9uU3RhcnQnLCAnb25Db21wb3NpdGlvblN0YXJ0Q2FwdHVyZScsICdvbkNvbXBvc2l0aW9uVXBkYXRlJywgJ29uQ29tcG9zaXRpb25VcGRhdGVDYXB0dXJlJywgJ29uRm9jdXMnLCAnb25Gb2N1c0NhcHR1cmUnLCAnb25CbHVyJywgJ29uQmx1ckNhcHR1cmUnLCAnb25DaGFuZ2UnLCAnb25DaGFuZ2VDYXB0dXJlJywgJ29uQmVmb3JlSW5wdXQnLCAnb25CZWZvcmVJbnB1dENhcHR1cmUnLCAnb25JbnB1dCcsICdvbklucHV0Q2FwdHVyZScsICdvblJlc2V0JywgJ29uUmVzZXRDYXB0dXJlJywgJ29uU3VibWl0JywgJ29uU3VibWl0Q2FwdHVyZScsICdvbkludmFsaWQnLCAnb25JbnZhbGlkQ2FwdHVyZScsICdvbkxvYWQnLCAnb25Mb2FkQ2FwdHVyZScsICdvbkVycm9yJywgJ29uRXJyb3JDYXB0dXJlJywgJ29uS2V5RG93bicsICdvbktleURvd25DYXB0dXJlJywgJ29uS2V5UHJlc3MnLCAnb25LZXlQcmVzc0NhcHR1cmUnLCAnb25LZXlVcCcsICdvbktleVVwQ2FwdHVyZScsICdvbkFib3J0JywgJ29uQWJvcnRDYXB0dXJlJywgJ29uQ2FuUGxheScsICdvbkNhblBsYXlDYXB0dXJlJywgJ29uQ2FuUGxheVRocm91Z2gnLCAnb25DYW5QbGF5VGhyb3VnaENhcHR1cmUnLCAnb25EdXJhdGlvbkNoYW5nZScsICdvbkR1cmF0aW9uQ2hhbmdlQ2FwdHVyZScsICdvbkVtcHRpZWQnLCAnb25FbXB0aWVkQ2FwdHVyZScsICdvbkVuY3J5cHRlZCcsICdvbkVuY3J5cHRlZENhcHR1cmUnLCAnb25FbmRlZCcsICdvbkVuZGVkQ2FwdHVyZScsICdvbkxvYWRlZERhdGEnLCAnb25Mb2FkZWREYXRhQ2FwdHVyZScsICdvbkxvYWRlZE1ldGFkYXRhJywgJ29uTG9hZGVkTWV0YWRhdGFDYXB0dXJlJywgJ29uTG9hZFN0YXJ0JywgJ29uTG9hZFN0YXJ0Q2FwdHVyZScsICdvblBhdXNlJywgJ29uUGF1c2VDYXB0dXJlJywgJ29uUGxheScsICdvblBsYXlDYXB0dXJlJywgJ29uUGxheWluZycsICdvblBsYXlpbmdDYXB0dXJlJywgJ29uUHJvZ3Jlc3MnLCAnb25Qcm9ncmVzc0NhcHR1cmUnLCAnb25SYXRlQ2hhbmdlJywgJ29uUmF0ZUNoYW5nZUNhcHR1cmUnLCAnb25TZWVrZWQnLCAnb25TZWVrZWRDYXB0dXJlJywgJ29uU2Vla2luZycsICdvblNlZWtpbmdDYXB0dXJlJywgJ29uU3RhbGxlZCcsICdvblN0YWxsZWRDYXB0dXJlJywgJ29uU3VzcGVuZCcsICdvblN1c3BlbmRDYXB0dXJlJywgJ29uVGltZVVwZGF0ZScsICdvblRpbWVVcGRhdGVDYXB0dXJlJywgJ29uVm9sdW1lQ2hhbmdlJywgJ29uVm9sdW1lQ2hhbmdlQ2FwdHVyZScsICdvbldhaXRpbmcnLCAnb25XYWl0aW5nQ2FwdHVyZScsICdvbkF1eENsaWNrJywgJ29uQXV4Q2xpY2tDYXB0dXJlJywgJ29uQ2xpY2snLCAnb25DbGlja0NhcHR1cmUnLCAnb25Db250ZXh0TWVudScsICdvbkNvbnRleHRNZW51Q2FwdHVyZScsICdvbkRvdWJsZUNsaWNrJywgJ29uRG91YmxlQ2xpY2tDYXB0dXJlJywgJ29uRHJhZycsICdvbkRyYWdDYXB0dXJlJywgJ29uRHJhZ0VuZCcsICdvbkRyYWdFbmRDYXB0dXJlJywgJ29uRHJhZ0VudGVyJywgJ29uRHJhZ0VudGVyQ2FwdHVyZScsICdvbkRyYWdFeGl0JywgJ29uRHJhZ0V4aXRDYXB0dXJlJywgJ29uRHJhZ0xlYXZlJywgJ29uRHJhZ0xlYXZlQ2FwdHVyZScsICdvbkRyYWdPdmVyJywgJ29uRHJhZ092ZXJDYXB0dXJlJywgJ29uRHJhZ1N0YXJ0JywgJ29uRHJhZ1N0YXJ0Q2FwdHVyZScsICdvbkRyb3AnLCAnb25Ecm9wQ2FwdHVyZScsICdvbk1vdXNlRG93bicsICdvbk1vdXNlRG93bkNhcHR1cmUnLCAnb25Nb3VzZUVudGVyJywgJ29uTW91c2VMZWF2ZScsICdvbk1vdXNlTW92ZScsICdvbk1vdXNlTW92ZUNhcHR1cmUnLCAnb25Nb3VzZU91dCcsICdvbk1vdXNlT3V0Q2FwdHVyZScsICdvbk1vdXNlT3ZlcicsICdvbk1vdXNlT3ZlckNhcHR1cmUnLCAnb25Nb3VzZVVwJywgJ29uTW91c2VVcENhcHR1cmUnLCAnb25TZWxlY3QnLCAnb25TZWxlY3RDYXB0dXJlJywgJ29uVG91Y2hDYW5jZWwnLCAnb25Ub3VjaENhbmNlbENhcHR1cmUnLCAnb25Ub3VjaEVuZCcsICdvblRvdWNoRW5kQ2FwdHVyZScsICdvblRvdWNoTW92ZScsICdvblRvdWNoTW92ZUNhcHR1cmUnLCAnb25Ub3VjaFN0YXJ0JywgJ29uVG91Y2hTdGFydENhcHR1cmUnLCAnb25Qb2ludGVyRG93bicsICdvblBvaW50ZXJEb3duQ2FwdHVyZScsICdvblBvaW50ZXJNb3ZlJywgJ29uUG9pbnRlck1vdmVDYXB0dXJlJywgJ29uUG9pbnRlclVwJywgJ29uUG9pbnRlclVwQ2FwdHVyZScsICdvblBvaW50ZXJDYW5jZWwnLCAnb25Qb2ludGVyQ2FuY2VsQ2FwdHVyZScsICdvblBvaW50ZXJFbnRlcicsICdvblBvaW50ZXJFbnRlckNhcHR1cmUnLCAnb25Qb2ludGVyTGVhdmUnLCAnb25Qb2ludGVyTGVhdmVDYXB0dXJlJywgJ29uUG9pbnRlck92ZXInLCAnb25Qb2ludGVyT3ZlckNhcHR1cmUnLCAnb25Qb2ludGVyT3V0JywgJ29uUG9pbnRlck91dENhcHR1cmUnLCAnb25Hb3RQb2ludGVyQ2FwdHVyZScsICdvbkdvdFBvaW50ZXJDYXB0dXJlQ2FwdHVyZScsICdvbkxvc3RQb2ludGVyQ2FwdHVyZScsICdvbkxvc3RQb2ludGVyQ2FwdHVyZUNhcHR1cmUnLCAnb25TY3JvbGwnLCAnb25TY3JvbGxDYXB0dXJlJywgJ29uV2hlZWwnLCAnb25XaGVlbENhcHR1cmUnLCAnb25BbmltYXRpb25TdGFydCcsICdvbkFuaW1hdGlvblN0YXJ0Q2FwdHVyZScsICdvbkFuaW1hdGlvbkVuZCcsICdvbkFuaW1hdGlvbkVuZENhcHR1cmUnLCAnb25BbmltYXRpb25JdGVyYXRpb24nLCAnb25BbmltYXRpb25JdGVyYXRpb25DYXB0dXJlJywgJ29uVHJhbnNpdGlvbkVuZCcsICdvblRyYW5zaXRpb25FbmRDYXB0dXJlJ107XG5cbi8qKiBUaGUgdHlwZSBvZiBlYXNpbmcgZnVuY3Rpb24gdG8gdXNlIGZvciBhbmltYXRpb25zICovXG5cbi8qKiBTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiwgdGhlIHVuaXQgb2YgdGhpcyBvcHRpb24gaXMgbXMuICovXG5cbi8qKiB0aGUgb2Zmc2V0IG9mIGEgY2hhcnQsIHdoaWNoIGRlZmluZSB0aGUgYmxhbmsgc3BhY2UgYWxsIGFyb3VuZCAqL1xuXG4vKipcbiAqIFRoZSBkb21haW4gb2YgYXhpcy5cbiAqIFRoaXMgaXMgdGhlIGRlZmluaXRpb25cbiAqXG4gKiBOdW1lcmljIGRvbWFpbiBpcyBhbHdheXMgZGVmaW5lZCBieSBhbiBhcnJheSBvZiBleGFjdGx5IHR3byB2YWx1ZXMsIGZvciB0aGUgbWluIGFuZCB0aGUgbWF4IG9mIHRoZSBheGlzLlxuICogQ2F0ZWdvcmljYWwgZG9tYWluIGlzIGRlZmluZWQgYXMgYXJyYXkgb2YgYWxsIHBvc3NpYmxlIHZhbHVlcy5cbiAqXG4gKiBDYW4gYmUgc3BlY2lmaWVkIGluIG1hbnkgd2F5czpcbiAqIC0gYXJyYXkgb2YgbnVtYmVyc1xuICogLSB3aXRoIHNwZWNpYWwgc3RyaW5ncyBsaWtlICdkYXRhTWluJyBhbmQgJ2RhdGFNYXgnXG4gKiAtIHdpdGggc3BlY2lhbCBzdHJpbmcgbWF0aCBsaWtlICdkYXRhTWluIC0gMTAwJ1xuICogLSB3aXRoIGtleXdvcmQgJ2F1dG8nXG4gKiAtIG9yIGEgZnVuY3Rpb25cbiAqIC0gYXJyYXkgb2YgZnVuY3Rpb25zXG4gKiAtIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGFib3ZlXG4gKi9cblxuLyoqXG4gKiBOdW1iZXJEb21haW4gaXMgYW4gZXZhbHVhdGVkIHtAbGluayBBeGlzRG9tYWlufS5cbiAqIFVubGlrZSB7QGxpbmsgQXhpc0RvbWFpbn0sIGl0IGhhcyBubyB2YXJpZXR5IC0gaXQncyBhIHR1cGxlIG9mIHR3byBudW1iZXIuXG4gKiBUaGlzIGlzIGFmdGVyIGFsbCB0aGUga2V5d29yZHMgYW5kIGZ1bmN0aW9ucyB3ZXJlIGV2YWx1YXRlZCBhbmQgd2hhdCBpcyBsZWZ0IGlzIFttaW4sIG1heF0uXG4gKlxuICogS25vdyB0aGF0IHRoZSBtaW4sIG1heCB2YWx1ZXMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIG5pY2UgbnVtYmVycyAtIHZhbHVlcyBsaWtlIC1JbmZpbml0eSBvciBOYU4gYXJlIHBvc3NpYmxlLlxuICpcbiAqIFRoZXJlIGFyZSBhbHNvIGBjYXRlZ29yeWAgYXhlcyB0aGF0IGhhdmUgZGlmZmVyZW50IHRoaW5ncyB0aGFuIG51bWJlcnMgaW4gdGhlaXIgZG9tYWluLlxuICovXG5cbi8qKiBUaGUgcHJvcHMgZGVmaW5pdGlvbiBvZiBiYXNlIGF4aXMgKi9cblxuLyoqIERlZmluZXMgaG93IHRpY2tzIGFyZSBwbGFjZWQgYW5kIHdoZXRoZXIgLyBob3cgdGljayBjb2xsaXNpb25zIGFyZSBoYW5kbGVkLlxuICogJ3ByZXNlcnZlU3RhcnQnIGtlZXBzIHRoZSBsZWZ0IHRpY2sgb24gY29sbGlzaW9uIGFuZCBlbnN1cmVzIHRoYXQgdGhlIGZpcnN0IHRpY2sgaXMgYWx3YXlzIHNob3duLlxuICogJ3ByZXNlcnZlRW5kJyBrZWVwcyB0aGUgcmlnaHQgdGljayBvbiBjb2xsaXNpb24gYW5kIGVuc3VyZXMgdGhhdCB0aGUgbGFzdCB0aWNrIGlzIGFsd2F5cyBzaG93bi5cbiAqICdwcmVzZXJ2ZVN0YXJ0RW5kJyBrZWVwcyB0aGUgbGVmdCB0aWNrIG9uIGNvbGxpc2lvbiBhbmQgZW5zdXJlcyB0aGF0IHRoZSBmaXJzdCBhbmQgbGFzdCB0aWNrcyBhcmUgYWx3YXlzIHNob3duLlxuICogJ2VxdWlkaXN0YW50UHJlc2VydmVTdGFydCcgc2VsZWN0cyBhIG51bWJlciBOIHN1Y2ggdGhhdCBldmVyeSBuVGggdGljayB3aWxsIGJlIHNob3duIHdpdGhvdXQgY29sbGlzaW9uLlxuICovXG5cbmV4cG9ydCB2YXIgYWRhcHRFdmVudEhhbmRsZXJzID0gZnVuY3Rpb24gYWRhcHRFdmVudEhhbmRsZXJzKHByb3BzLCBuZXdIYW5kbGVyKSB7XG4gIGlmICghcHJvcHMgfHwgdHlwZW9mIHByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBwcm9wcyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGlucHV0UHJvcHMgPSBwcm9wcztcbiAgaWYgKCAvKiNfX1BVUkVfXyovaXNWYWxpZEVsZW1lbnQocHJvcHMpKSB7XG4gICAgaW5wdXRQcm9wcyA9IHByb3BzLnByb3BzO1xuICB9XG4gIGlmICghaXNPYmplY3QoaW5wdXRQcm9wcykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgb3V0ID0ge307XG4gIE9iamVjdC5rZXlzKGlucHV0UHJvcHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChFdmVudEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgb3V0W2tleV0gPSBuZXdIYW5kbGVyIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFByb3BzW2tleV0oaW5wdXRQcm9wcywgZSk7XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXQ7XG59O1xudmFyIGdldEV2ZW50SGFuZGxlck9mQ2hpbGQgPSBmdW5jdGlvbiBnZXRFdmVudEhhbmRsZXJPZkNoaWxkKG9yaWdpbmFsSGFuZGxlciwgZGF0YSwgaW5kZXgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7XG4gICAgb3JpZ2luYWxIYW5kbGVyKGRhdGEsIGluZGV4LCBlKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbn07XG5leHBvcnQgdmFyIGFkYXB0RXZlbnRzT2ZDaGlsZCA9IGZ1bmN0aW9uIGFkYXB0RXZlbnRzT2ZDaGlsZChwcm9wcywgZGF0YSwgaW5kZXgpIHtcbiAgaWYgKCFpc09iamVjdChwcm9wcykgfHwgX3R5cGVvZihwcm9wcykgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIG91dCA9IG51bGw7XG4gIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgaXRlbSA9IHByb3BzW2tleV07XG4gICAgaWYgKEV2ZW50S2V5cy5pbmNsdWRlcyhrZXkpICYmIHR5cGVvZiBpdGVtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoIW91dCkgb3V0ID0ge307XG4gICAgICBvdXRba2V5XSA9IGdldEV2ZW50SGFuZGxlck9mQ2hpbGQoaXRlbSwgZGF0YSwgaW5kZXgpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXQ7XG59OyIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBwcmVmaXggPSAnfic7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgc3RvcmFnZSBmb3Igb3VyIGBFRWAgb2JqZWN0cy5cbiAqIEFuIGBFdmVudHNgIGluc3RhbmNlIGlzIGEgcGxhaW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRXZlbnRzKCkge31cblxuLy9cbi8vIFdlIHRyeSB0byBub3QgaW5oZXJpdCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC4gSW4gc29tZSBlbmdpbmVzIGNyZWF0aW5nIGFuXG4vLyBpbnN0YW5jZSBpbiB0aGlzIHdheSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCBkaXJlY3RseS5cbi8vIElmIGBPYmplY3QuY3JlYXRlKG51bGwpYCBpcyBub3Qgc3VwcG9ydGVkIHdlIHByZWZpeCB0aGUgZXZlbnQgbmFtZXMgd2l0aCBhXG4vLyBjaGFyYWN0ZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0LWluIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBub3Rcbi8vIG92ZXJyaWRkZW4gb3IgdXNlZCBhcyBhbiBhdHRhY2sgdmVjdG9yLlxuLy9cbmlmIChPYmplY3QuY3JlYXRlKSB7XG4gIEV2ZW50cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vXG4gIC8vIFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgaXMgc3RpbGwgaW5oZXJpdGVkIGluXG4gIC8vIHNvbWUgb2xkIGJyb3dzZXJzIGxpa2UgQW5kcm9pZCA0LCBpUGhvbmUgNS4xLCBPcGVyYSAxMSBhbmQgU2FmYXJpIDUuXG4gIC8vXG4gIGlmICghbmV3IEV2ZW50cygpLl9fcHJvdG9fXykgcHJlZml4ID0gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEVFKGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHRoaXMuZm4gPSBmbjtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5vbmNlID0gb25jZSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gbmV3IEVFKGZuLCBjb250ZXh0IHx8IGVtaXR0ZXIsIG9uY2UpXG4gICAgLCBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0pIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gbGlzdGVuZXIsIGVtaXR0ZXIuX2V2ZW50c0NvdW50Kys7XG4gIGVsc2UgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XS5mbikgZW1pdHRlci5fZXZlbnRzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2UgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBbZW1pdHRlci5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXTtcblxuICByZXR1cm4gZW1pdHRlcjtcbn1cblxuLyoqXG4gKiBDbGVhciBldmVudCBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZ0IFRoZSBFdmVudCBuYW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJFdmVudChlbWl0dGVyLCBldnQpIHtcbiAgaWYgKC0tZW1pdHRlci5fZXZlbnRzQ291bnQgPT09IDApIGVtaXR0ZXIuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgZWxzZSBkZWxldGUgZW1pdHRlci5fZXZlbnRzW2V2dF07XG59XG5cbi8qKlxuICogTWluaW1hbCBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UgdGhhdCBpcyBtb2xkZWQgYWdhaW5zdCB0aGUgTm9kZS5qc1xuICogYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkXG4gKiBsaXN0ZW5lcnMuXG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICB2YXIgbmFtZXMgPSBbXVxuICAgICwgZXZlbnRzXG4gICAgLCBuYW1lO1xuXG4gIGlmICh0aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgcmV0dXJuIG5hbWVzO1xuXG4gIGZvciAobmFtZSBpbiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzKSkge1xuICAgIGlmIChoYXMuY2FsbChldmVudHMsIG5hbWUpKSBuYW1lcy5wdXNoKHByZWZpeCA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lKTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgcmV0dXJuIG5hbWVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV2ZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgaGFuZGxlcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWhhbmRsZXJzKSByZXR1cm4gW107XG4gIGlmIChoYW5kbGVycy5mbikgcmV0dXJuIFtoYW5kbGVycy5mbl07XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGgsIGVlID0gbmV3IEFycmF5KGwpOyBpIDwgbDsgaSsrKSB7XG4gICAgZWVbaV0gPSBoYW5kbGVyc1tpXS5mbjtcbiAgfVxuXG4gIHJldHVybiBlZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIDA7XG4gIGlmIChsaXN0ZW5lcnMuZm4pIHJldHVybiAxO1xuICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQ2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuICAgICwgbGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgYXJnc1xuICAgICwgaTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKGxpc3RlbmVycy5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnMuZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQpLCB0cnVlO1xuICAgICAgY2FzZSAyOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExKSwgdHJ1ZTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIpLCB0cnVlO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMpLCB0cnVlO1xuICAgICAgY2FzZSA1OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCwgYTUpLCB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMuZm4uYXBwbHkobGlzdGVuZXJzLmNvbnRleHQsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAsIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0ZW5lcnNbaV0ub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzW2ldLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDE6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0KTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMik7IGJyZWFrO1xuICAgICAgICBjYXNlIDQ6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIsIGEzKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFhcmdzKSBmb3IgKGogPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmZuLmFwcGx5KGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiBvbihldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZShldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IGhhdmUgdGhpcyBjb250ZXh0LlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIE9ubHkgcmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVycy5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gdGhpcztcbiAgaWYgKCFmbikge1xuICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKFxuICAgICAgbGlzdGVuZXJzLmZuID09PSBmbiAmJlxuICAgICAgKCFvbmNlIHx8IGxpc3RlbmVycy5vbmNlKSAmJlxuICAgICAgKCFjb250ZXh0IHx8IGxpc3RlbmVycy5jb250ZXh0ID09PSBjb250ZXh0KVxuICAgICkge1xuICAgICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMCwgZXZlbnRzID0gW10sIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBsaXN0ZW5lcnNbaV0uZm4gIT09IGZuIHx8XG4gICAgICAgIChvbmNlICYmICFsaXN0ZW5lcnNbaV0ub25jZSkgfHxcbiAgICAgICAgKGNvbnRleHQgJiYgbGlzdGVuZXJzW2ldLmNvbnRleHQgIT09IGNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIFJlc2V0IHRoZSBhcnJheSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycy5cbiAgICAvL1xuICAgIGlmIChldmVudHMubGVuZ3RoKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGV2ZW50cy5sZW5ndGggPT09IDEgPyBldmVudHNbMF0gOiBldmVudHM7XG4gICAgZWxzZSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IFtldmVudF0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQ7XG5cbiAgaWYgKGV2ZW50KSB7XG4gICAgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcbiAgICBpZiAodGhpcy5fZXZlbnRzW2V2dF0pIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vL1xuLy8gQWxpYXMgbWV0aG9kcyBuYW1lcyBiZWNhdXNlIHBlb3BsZSByb2xsIGxpa2UgdGhhdC5cbi8vXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgcHJlZml4LlxuLy9cbkV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuLy9cbi8vIEFsbG93IGBFdmVudEVtaXR0ZXJgIHRvIGJlIGltcG9ydGVkIGFzIG1vZHVsZSBuYW1lc3BhY2UuXG4vL1xuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuLy9cbmlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbn1cbiIsIi8vIHNyYy9pbmRleC50c1xuZnVuY3Rpb24gY3JlYXRlVGh1bmtNaWRkbGV3YXJlKGV4dHJhQXJndW1lbnQpIHtcbiAgY29uc3QgbWlkZGxld2FyZSA9ICh7IGRpc3BhdGNoLCBnZXRTdGF0ZSB9KSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBhY3Rpb24oZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYUFyZ3VtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcbiAgfTtcbiAgcmV0dXJuIG1pZGRsZXdhcmU7XG59XG52YXIgdGh1bmsgPSBjcmVhdGVUaHVua01pZGRsZXdhcmUoKTtcbnZhciB3aXRoRXh0cmFBcmd1bWVudCA9IGNyZWF0ZVRodW5rTWlkZGxld2FyZTtcbmV4cG9ydCB7XG4gIHRodW5rLFxuICB3aXRoRXh0cmFBcmd1bWVudFxufTtcbiIsIi8vIHNyYy91dGlscy9mb3JtYXRQcm9kRXJyb3JNZXNzYWdlLnRzXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIGBNaW5pZmllZCBSZWR1eCBlcnJvciAjJHtjb2RlfTsgdmlzaXQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvRXJyb3JzP2NvZGU9JHtjb2RlfSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiBgO1xufVxuXG4vLyBzcmMvdXRpbHMvc3ltYm9sLW9ic2VydmFibGUudHNcbnZhciAkJG9ic2VydmFibGUgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCBcIkBAb2JzZXJ2YWJsZVwiKSgpO1xudmFyIHN5bWJvbF9vYnNlcnZhYmxlX2RlZmF1bHQgPSAkJG9ic2VydmFibGU7XG5cbi8vIHNyYy91dGlscy9hY3Rpb25UeXBlcy50c1xudmFyIHJhbmRvbVN0cmluZyA9ICgpID0+IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZyg3KS5zcGxpdChcIlwiKS5qb2luKFwiLlwiKTtcbnZhciBBY3Rpb25UeXBlcyA9IHtcbiAgSU5JVDogYEBAcmVkdXgvSU5JVCR7LyogQF9fUFVSRV9fICovIHJhbmRvbVN0cmluZygpfWAsXG4gIFJFUExBQ0U6IGBAQHJlZHV4L1JFUExBQ0Ukey8qIEBfX1BVUkVfXyAqLyByYW5kb21TdHJpbmcoKX1gLFxuICBQUk9CRV9VTktOT1dOX0FDVElPTjogKCkgPT4gYEBAcmVkdXgvUFJPQkVfVU5LTk9XTl9BQ1RJT04ke3JhbmRvbVN0cmluZygpfWBcbn07XG52YXIgYWN0aW9uVHlwZXNfZGVmYXVsdCA9IEFjdGlvblR5cGVzO1xuXG4vLyBzcmMvdXRpbHMvaXNQbGFpbk9iamVjdC50c1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgfHwgb2JqID09PSBudWxsKVxuICAgIHJldHVybiBmYWxzZTtcbiAgbGV0IHByb3RvID0gb2JqO1xuICB3aGlsZSAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKSAhPT0gbnVsbCkge1xuICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBudWxsO1xufVxuXG4vLyBzcmMvdXRpbHMva2luZE9mLnRzXG5mdW5jdGlvbiBtaW5pS2luZE9mKHZhbCkge1xuICBpZiAodmFsID09PSB2b2lkIDApXG4gICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XG4gIGlmICh2YWwgPT09IG51bGwpXG4gICAgcmV0dXJuIFwibnVsbFwiO1xuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbDtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjoge1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgcmV0dXJuIFwiYXJyYXlcIjtcbiAgaWYgKGlzRGF0ZSh2YWwpKVxuICAgIHJldHVybiBcImRhdGVcIjtcbiAgaWYgKGlzRXJyb3IodmFsKSlcbiAgICByZXR1cm4gXCJlcnJvclwiO1xuICBjb25zdCBjb25zdHJ1Y3Rvck5hbWUgPSBjdG9yTmFtZSh2YWwpO1xuICBzd2l0Y2ggKGNvbnN0cnVjdG9yTmFtZSkge1xuICAgIGNhc2UgXCJTeW1ib2xcIjpcbiAgICBjYXNlIFwiUHJvbWlzZVwiOlxuICAgIGNhc2UgXCJXZWFrTWFwXCI6XG4gICAgY2FzZSBcIldlYWtTZXRcIjpcbiAgICBjYXNlIFwiTWFwXCI6XG4gICAgY2FzZSBcIlNldFwiOlxuICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzL2csIFwiXCIpO1xufVxuZnVuY3Rpb24gY3Rvck5hbWUodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCIgPyB2YWwuY29uc3RydWN0b3IubmFtZSA6IG51bGw7XG59XG5mdW5jdGlvbiBpc0Vycm9yKHZhbCkge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIHZhbC5tZXNzYWdlID09PSBcInN0cmluZ1wiICYmIHZhbC5jb25zdHJ1Y3RvciAmJiB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yLnN0YWNrVHJhY2VMaW1pdCA9PT0gXCJudW1iZXJcIjtcbn1cbmZ1bmN0aW9uIGlzRGF0ZSh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgdmFsLnRvRGF0ZVN0cmluZyA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiB2YWwuZ2V0RGF0ZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiB2YWwuc2V0RGF0ZSA9PT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24ga2luZE9mKHZhbCkge1xuICBsZXQgdHlwZU9mVmFsID0gdHlwZW9mIHZhbDtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHR5cGVPZlZhbCA9IG1pbmlLaW5kT2YodmFsKTtcbiAgfVxuICByZXR1cm4gdHlwZU9mVmFsO1xufVxuXG4vLyBzcmMvY3JlYXRlU3RvcmUudHNcbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcikge1xuICBpZiAodHlwZW9mIHJlZHVjZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIpIDogYEV4cGVjdGVkIHRoZSByb290IHJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihyZWR1Y2VyKX0nYCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcmVsb2FkZWRTdGF0ZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiBlbmhhbmNlciA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBhcmd1bWVudHNbM10gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDApIDogXCJJdCBsb29rcyBsaWtlIHlvdSBhcmUgcGFzc2luZyBzZXZlcmFsIHN0b3JlIGVuaGFuY2VycyB0byBjcmVhdGVTdG9yZSgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIEluc3RlYWQsIGNvbXBvc2UgdGhlbSB0b2dldGhlciB0byBhIHNpbmdsZSBmdW5jdGlvbi4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI2NyZWF0aW5nLWEtc3RvcmUtd2l0aC1lbmhhbmNlcnMgZm9yIGFuIGV4YW1wbGUuXCIpO1xuICB9XG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgZW5oYW5jZXIgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdm9pZCAwO1xuICB9XG4gIGlmICh0eXBlb2YgZW5oYW5jZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEpIDogYEV4cGVjdGVkIHRoZSBlbmhhbmNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJyR7a2luZE9mKGVuaGFuY2VyKX0nYCk7XG4gICAgfVxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG4gIGxldCBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXI7XG4gIGxldCBjdXJyZW50U3RhdGUgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgbGV0IGN1cnJlbnRMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBsZXQgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnM7XG4gIGxldCBsaXN0ZW5lcklkQ291bnRlciA9IDA7XG4gIGxldCBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKG5leHRMaXN0ZW5lcnMgPT09IGN1cnJlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIG5leHRMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgY3VycmVudExpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lciwga2V5KSA9PiB7XG4gICAgICAgIG5leHRMaXN0ZW5lcnMuc2V0KGtleSwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzKSA6IFwiWW91IG1heSBub3QgY2FsbCBzdG9yZS5nZXRTdGF0ZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gVGhlIHJlZHVjZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgdGhlIHN0YXRlIGFzIGFuIGFyZ3VtZW50LiBQYXNzIGl0IGRvd24gZnJvbSB0aGUgdG9wIHJlZHVjZXIgaW5zdGVhZCBvZiByZWFkaW5nIGl0IGZyb20gdGhlIHN0b3JlLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbiAgfVxuICBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQpIDogYEV4cGVjdGVkIHRoZSBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJyR7a2luZE9mKGxpc3RlbmVyKX0nYCk7XG4gICAgfVxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg1KSA6IFwiWW91IG1heSBub3QgY2FsbCBzdG9yZS5zdWJzY3JpYmUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuIElmIHlvdSB3b3VsZCBsaWtlIHRvIGJlIG5vdGlmaWVkIGFmdGVyIHRoZSBzdG9yZSBoYXMgYmVlbiB1cGRhdGVkLCBzdWJzY3JpYmUgZnJvbSBhIGNvbXBvbmVudCBhbmQgaW52b2tlIHN0b3JlLmdldFN0YXRlKCkgaW4gdGhlIGNhbGxiYWNrIHRvIGFjY2VzcyB0aGUgbGF0ZXN0IHN0YXRlLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvYXBpL3N0b3JlI3N1YnNjcmliZWxpc3RlbmVyIGZvciBtb3JlIGRldGFpbHMuXCIpO1xuICAgIH1cbiAgICBsZXQgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgY29uc3QgbGlzdGVuZXJJZCA9IGxpc3RlbmVySWRDb3VudGVyKys7XG4gICAgbmV4dExpc3RlbmVycy5zZXQobGlzdGVuZXJJZCwgbGlzdGVuZXIpO1xuICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICAgIGlmICghaXNTdWJzY3JpYmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogXCJZb3UgbWF5IG5vdCB1bnN1YnNjcmliZSBmcm9tIGEgc3RvcmUgbGlzdGVuZXIgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvYXBpL3N0b3JlI3N1YnNjcmliZWxpc3RlbmVyIGZvciBtb3JlIGRldGFpbHMuXCIpO1xuICAgICAgfVxuICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgICBuZXh0TGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcklkKTtcbiAgICAgIGN1cnJlbnRMaXN0ZW5lcnMgPSBudWxsO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDcpIDogYEFjdGlvbnMgbXVzdCBiZSBwbGFpbiBvYmplY3RzLiBJbnN0ZWFkLCB0aGUgYWN0dWFsIHR5cGUgd2FzOiAnJHtraW5kT2YoYWN0aW9uKX0nLiBZb3UgbWF5IG5lZWQgdG8gYWRkIG1pZGRsZXdhcmUgdG8geW91ciBzdG9yZSBzZXR1cCB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgb3RoZXIgdmFsdWVzLCBzdWNoIGFzICdyZWR1eC10aHVuaycgdG8gaGFuZGxlIGRpc3BhdGNoaW5nIGZ1bmN0aW9ucy4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI21pZGRsZXdhcmUgYW5kIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC02LWFzeW5jLWxvZ2ljI3VzaW5nLXRoZS1yZWR1eC10aHVuay1taWRkbGV3YXJlIGZvciBleGFtcGxlcy5gKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhY3Rpb24udHlwZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOCkgOiAnQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiBZb3UgbWF5IGhhdmUgbWlzc3BlbGxlZCBhbiBhY3Rpb24gdHlwZSBzdHJpbmcgY29uc3RhbnQuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYWN0aW9uLnR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE3KSA6IGBBY3Rpb24gXCJ0eXBlXCIgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZy4gSW5zdGVhZCwgdGhlIGFjdHVhbCB0eXBlIHdhczogJyR7a2luZE9mKGFjdGlvbi50eXBlKX0nLiBWYWx1ZSB3YXM6ICcke2FjdGlvbi50eXBlfScgKHN0cmluZ2lmaWVkKWApO1xuICAgIH1cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOSkgOiBcIlJlZHVjZXJzIG1heSBub3QgZGlzcGF0Y2ggYWN0aW9ucy5cIik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gdHJ1ZTtcbiAgICAgIGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnRSZWR1Y2VyKGN1cnJlbnRTdGF0ZSwgYWN0aW9uKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzID0gbmV4dExpc3RlbmVycztcbiAgICBsaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgIGxpc3RlbmVyKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfVxuICBmdW5jdGlvbiByZXBsYWNlUmVkdWNlcihuZXh0UmVkdWNlcikge1xuICAgIGlmICh0eXBlb2YgbmV4dFJlZHVjZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTApIDogYEV4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJyR7a2luZE9mKG5leHRSZWR1Y2VyKX1gKTtcbiAgICB9XG4gICAgY3VycmVudFJlZHVjZXIgPSBuZXh0UmVkdWNlcjtcbiAgICBkaXNwYXRjaCh7XG4gICAgICB0eXBlOiBhY3Rpb25UeXBlc19kZWZhdWx0LlJFUExBQ0VcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBvYnNlcnZhYmxlKCkge1xuICAgIGNvbnN0IG91dGVyU3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBtaW5pbWFsIG9ic2VydmFibGUgc3Vic2NyaXB0aW9uIG1ldGhvZC5cbiAgICAgICAqIEBwYXJhbSBvYnNlcnZlciBBbnkgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gb2JzZXJ2ZXIuXG4gICAgICAgKiBUaGUgb2JzZXJ2ZXIgb2JqZWN0IHNob3VsZCBoYXZlIGEgYG5leHRgIG1ldGhvZC5cbiAgICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGFuIGB1bnN1YnNjcmliZWAgbWV0aG9kIHRoYXQgY2FuXG4gICAgICAgKiBiZSB1c2VkIHRvIHVuc3Vic2NyaWJlIHRoZSBvYnNlcnZhYmxlIGZyb20gdGhlIHN0b3JlLCBhbmQgcHJldmVudCBmdXJ0aGVyXG4gICAgICAgKiBlbWlzc2lvbiBvZiB2YWx1ZXMgZnJvbSB0aGUgb2JzZXJ2YWJsZS5cbiAgICAgICAqL1xuICAgICAgc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZXIgIT09IFwib2JqZWN0XCIgfHwgb2JzZXJ2ZXIgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMSkgOiBgRXhwZWN0ZWQgdGhlIG9ic2VydmVyIHRvIGJlIGFuIG9iamVjdC4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihvYnNlcnZlcil9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG9ic2VydmVTdGF0ZSgpIHtcbiAgICAgICAgICBjb25zdCBvYnNlcnZlckFzT2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICAgICAgICBpZiAob2JzZXJ2ZXJBc09ic2VydmVyLm5leHQpIHtcbiAgICAgICAgICAgIG9ic2VydmVyQXNPYnNlcnZlci5uZXh0KGdldFN0YXRlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvYnNlcnZlU3RhdGUoKTtcbiAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBvdXRlclN1YnNjcmliZShvYnNlcnZlU3RhdGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVuc3Vic2NyaWJlXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgW3N5bWJvbF9vYnNlcnZhYmxlX2RlZmF1bHRdKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGRpc3BhdGNoKHtcbiAgICB0eXBlOiBhY3Rpb25UeXBlc19kZWZhdWx0LklOSVRcbiAgfSk7XG4gIGNvbnN0IHN0b3JlID0ge1xuICAgIGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZSxcbiAgICBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcixcbiAgICBbc3ltYm9sX29ic2VydmFibGVfZGVmYXVsdF06IG9ic2VydmFibGVcbiAgfTtcbiAgcmV0dXJuIHN0b3JlO1xufVxuZnVuY3Rpb24gbGVnYWN5X2NyZWF0ZVN0b3JlKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcikge1xuICByZXR1cm4gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKTtcbn1cblxuLy8gc3JjL3V0aWxzL3dhcm5pbmcudHNcbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgdHJ5IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxufVxuXG4vLyBzcmMvY29tYmluZVJlZHVjZXJzLnRzXG5mdW5jdGlvbiBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKGlucHV0U3RhdGUsIHJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSkge1xuICBjb25zdCByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgY29uc3QgYXJndW1lbnROYW1lID0gYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBhY3Rpb25UeXBlc19kZWZhdWx0LklOSVQgPyBcInByZWxvYWRlZFN0YXRlIGFyZ3VtZW50IHBhc3NlZCB0byBjcmVhdGVTdG9yZVwiIDogXCJwcmV2aW91cyBzdGF0ZSByZWNlaXZlZCBieSB0aGUgcmVkdWNlclwiO1xuICBpZiAocmVkdWNlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiU3RvcmUgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHJlZHVjZXIuIE1ha2Ugc3VyZSB0aGUgYXJndW1lbnQgcGFzc2VkIHRvIGNvbWJpbmVSZWR1Y2VycyBpcyBhbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSByZWR1Y2Vycy5cIjtcbiAgfVxuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXRTdGF0ZSkpIHtcbiAgICByZXR1cm4gYFRoZSAke2FyZ3VtZW50TmFtZX0gaGFzIHVuZXhwZWN0ZWQgdHlwZSBvZiBcIiR7a2luZE9mKGlucHV0U3RhdGUpfVwiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGtleXM6IFwiJHtyZWR1Y2VyS2V5cy5qb2luKCdcIiwgXCInKX1cImA7XG4gIH1cbiAgY29uc3QgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoKGtleSkgPT4gIXJlZHVjZXJzLmhhc093blByb3BlcnR5KGtleSkgJiYgIXVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldKTtcbiAgdW5leHBlY3RlZEtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlW2tleV0gPSB0cnVlO1xuICB9KTtcbiAgaWYgKGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gYWN0aW9uVHlwZXNfZGVmYXVsdC5SRVBMQUNFKVxuICAgIHJldHVybjtcbiAgaWYgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYFVuZXhwZWN0ZWQgJHt1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAxID8gXCJrZXlzXCIgOiBcImtleVwifSBcIiR7dW5leHBlY3RlZEtleXMuam9pbignXCIsIFwiJyl9XCIgZm91bmQgaW4gJHthcmd1bWVudE5hbWV9LiBFeHBlY3RlZCB0byBmaW5kIG9uZSBvZiB0aGUga25vd24gcmVkdWNlciBrZXlzIGluc3RlYWQ6IFwiJHtyZWR1Y2VyS2V5cy5qb2luKCdcIiwgXCInKX1cIi4gVW5leHBlY3RlZCBrZXlzIHdpbGwgYmUgaWdub3JlZC5gO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnRSZWR1Y2VyU2hhcGUocmVkdWNlcnMpIHtcbiAgT2JqZWN0LmtleXMocmVkdWNlcnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IHJlZHVjZXIgPSByZWR1Y2Vyc1trZXldO1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHJlZHVjZXIodm9pZCAwLCB7XG4gICAgICB0eXBlOiBhY3Rpb25UeXBlc19kZWZhdWx0LklOSVRcbiAgICB9KTtcbiAgICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTIpIDogYFRoZSBzbGljZSByZWR1Y2VyIGZvciBrZXkgXCIke2tleX1cIiByZXR1cm5lZCB1bmRlZmluZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBJZiB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZSByZWR1Y2VyIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCB5b3UgY2FuIHVzZSBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLmApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlZHVjZXIodm9pZCAwLCB7XG4gICAgICB0eXBlOiBhY3Rpb25UeXBlc19kZWZhdWx0LlBST0JFX1VOS05PV05fQUNUSU9OKClcbiAgICB9KSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTMpIDogYFRoZSBzbGljZSByZWR1Y2VyIGZvciBrZXkgXCIke2tleX1cIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBwcm9iZWQgd2l0aCBhIHJhbmRvbSB0eXBlLiBEb24ndCB0cnkgdG8gaGFuZGxlICcke2FjdGlvblR5cGVzX2RlZmF1bHQuSU5JVH0nIG9yIG90aGVyIGFjdGlvbnMgaW4gXCJyZWR1eC8qXCIgbmFtZXNwYWNlLiBUaGV5IGFyZSBjb25zaWRlcmVkIHByaXZhdGUuIEluc3RlYWQsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55IHVua25vd24gYWN0aW9ucywgdW5sZXNzIGl0IGlzIHVuZGVmaW5lZCwgaW4gd2hpY2ggY2FzZSB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdGlvbiB0eXBlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgbm90IGJlIHVuZGVmaW5lZCwgYnV0IGNhbiBiZSBudWxsLmApO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBjb21iaW5lUmVkdWNlcnMocmVkdWNlcnMpIHtcbiAgY29uc3QgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIGNvbnN0IGZpbmFsUmVkdWNlcnMgPSB7fTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IHJlZHVjZXJLZXlzW2ldO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB3YXJuaW5nKGBObyByZWR1Y2VyIHByb3ZpZGVkIGZvciBrZXkgXCIke2tleX1cImApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZmluYWxSZWR1Y2Vyc1trZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZmluYWxSZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsUmVkdWNlcnMpO1xuICBsZXQgdW5leHBlY3RlZEtleUNhY2hlO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlID0ge307XG4gIH1cbiAgbGV0IHNoYXBlQXNzZXJ0aW9uRXJyb3I7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UmVkdWNlclNoYXBlKGZpbmFsUmVkdWNlcnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2hhcGVBc3NlcnRpb25FcnJvciA9IGU7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmF0aW9uKHN0YXRlID0ge30sIGFjdGlvbikge1xuICAgIGlmIChzaGFwZUFzc2VydGlvbkVycm9yKSB7XG4gICAgICB0aHJvdyBzaGFwZUFzc2VydGlvbkVycm9yO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2Uoc3RhdGUsIGZpbmFsUmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKTtcbiAgICAgIGlmICh3YXJuaW5nTWVzc2FnZSkge1xuICAgICAgICB3YXJuaW5nKHdhcm5pbmdNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBuZXh0U3RhdGUgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGZpbmFsUmVkdWNlcktleXNbaV07XG4gICAgICBjb25zdCByZWR1Y2VyID0gZmluYWxSZWR1Y2Vyc1trZXldO1xuICAgICAgY29uc3QgcHJldmlvdXNTdGF0ZUZvcktleSA9IHN0YXRlW2tleV07XG4gICAgICBjb25zdCBuZXh0U3RhdGVGb3JLZXkgPSByZWR1Y2VyKHByZXZpb3VzU3RhdGVGb3JLZXksIGFjdGlvbik7XG4gICAgICBpZiAodHlwZW9mIG5leHRTdGF0ZUZvcktleSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBjb25zdCBhY3Rpb25UeXBlID0gYWN0aW9uICYmIGFjdGlvbi50eXBlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNCkgOiBgV2hlbiBjYWxsZWQgd2l0aCBhbiBhY3Rpb24gb2YgdHlwZSAke2FjdGlvblR5cGUgPyBgXCIke1N0cmluZyhhY3Rpb25UeXBlKX1cImAgOiBcIih1bmtub3duIHR5cGUpXCJ9LCB0aGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFwiJHtrZXl9XCIgcmV0dXJuZWQgdW5kZWZpbmVkLiBUbyBpZ25vcmUgYW4gYWN0aW9uLCB5b3UgbXVzdCBleHBsaWNpdGx5IHJldHVybiB0aGUgcHJldmlvdXMgc3RhdGUuIElmIHlvdSB3YW50IHRoaXMgcmVkdWNlciB0byBob2xkIG5vIHZhbHVlLCB5b3UgY2FuIHJldHVybiBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLmApO1xuICAgICAgfVxuICAgICAgbmV4dFN0YXRlW2tleV0gPSBuZXh0U3RhdGVGb3JLZXk7XG4gICAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBuZXh0U3RhdGVGb3JLZXkgIT09IHByZXZpb3VzU3RhdGVGb3JLZXk7XG4gICAgfVxuICAgIGhhc0NoYW5nZWQgPSBoYXNDaGFuZ2VkIHx8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhzdGF0ZSkubGVuZ3RoO1xuICAgIHJldHVybiBoYXNDaGFuZ2VkID8gbmV4dFN0YXRlIDogc3RhdGU7XG4gIH07XG59XG5cbi8vIHNyYy9iaW5kQWN0aW9uQ3JlYXRvcnMudHNcbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoKGFjdGlvbkNyZWF0b3IuYXBwbHkodGhpcywgYXJncykpO1xuICB9O1xufVxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCkge1xuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKTtcbiAgfVxuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzICE9PSBcIm9iamVjdFwiIHx8IGFjdGlvbkNyZWF0b3JzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTYpIDogYGJpbmRBY3Rpb25DcmVhdG9ycyBleHBlY3RlZCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbiwgYnV0IGluc3RlYWQgcmVjZWl2ZWQ6ICcke2tpbmRPZihhY3Rpb25DcmVhdG9ycyl9Jy4gRGlkIHlvdSB3cml0ZSBcImltcG9ydCBBY3Rpb25DcmVhdG9ycyBmcm9tXCIgaW5zdGVhZCBvZiBcImltcG9ydCAqIGFzIEFjdGlvbkNyZWF0b3JzIGZyb21cIj9gKTtcbiAgfVxuICBjb25zdCBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgY29uc3QgYWN0aW9uQ3JlYXRvciA9IGFjdGlvbkNyZWF0b3JzW2tleV07XG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGJvdW5kQWN0aW9uQ3JlYXRvcnNba2V5XSA9IGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59XG5cbi8vIHNyYy9jb21wb3NlLnRzXG5mdW5jdGlvbiBjb21wb3NlKC4uLmZ1bmNzKSB7XG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKGFyZykgPT4gYXJnO1xuICB9XG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZnVuY3NbMF07XG4gIH1cbiAgcmV0dXJuIGZ1bmNzLnJlZHVjZSgoYSwgYikgPT4gKC4uLmFyZ3MpID0+IGEoYiguLi5hcmdzKSkpO1xufVxuXG4vLyBzcmMvYXBwbHlNaWRkbGV3YXJlLnRzXG5mdW5jdGlvbiBhcHBseU1pZGRsZXdhcmUoLi4ubWlkZGxld2FyZXMpIHtcbiAgcmV0dXJuIChjcmVhdGVTdG9yZTIpID0+IChyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHN0b3JlID0gY3JlYXRlU3RvcmUyKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlKTtcbiAgICBsZXQgZGlzcGF0Y2ggPSAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNSkgOiBcIkRpc3BhdGNoaW5nIHdoaWxlIGNvbnN0cnVjdGluZyB5b3VyIG1pZGRsZXdhcmUgaXMgbm90IGFsbG93ZWQuIE90aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC5cIik7XG4gICAgfTtcbiAgICBjb25zdCBtaWRkbGV3YXJlQVBJID0ge1xuICAgICAgZ2V0U3RhdGU6IHN0b3JlLmdldFN0YXRlLFxuICAgICAgZGlzcGF0Y2g6IChhY3Rpb24sIC4uLmFyZ3MpID0+IGRpc3BhdGNoKGFjdGlvbiwgLi4uYXJncylcbiAgICB9O1xuICAgIGNvbnN0IGNoYWluID0gbWlkZGxld2FyZXMubWFwKChtaWRkbGV3YXJlKSA9PiBtaWRkbGV3YXJlKG1pZGRsZXdhcmVBUEkpKTtcbiAgICBkaXNwYXRjaCA9IGNvbXBvc2UoLi4uY2hhaW4pKHN0b3JlLmRpc3BhdGNoKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RvcmUsXG4gICAgICBkaXNwYXRjaFxuICAgIH07XG4gIH07XG59XG5cbi8vIHNyYy91dGlscy9pc0FjdGlvbi50c1xuZnVuY3Rpb24gaXNBY3Rpb24oYWN0aW9uKSB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KGFjdGlvbikgJiYgXCJ0eXBlXCIgaW4gYWN0aW9uICYmIHR5cGVvZiBhY3Rpb24udHlwZSA9PT0gXCJzdHJpbmdcIjtcbn1cbmV4cG9ydCB7XG4gIGFjdGlvblR5cGVzX2RlZmF1bHQgYXMgX19ET19OT1RfVVNFX19BY3Rpb25UeXBlcyxcbiAgYXBwbHlNaWRkbGV3YXJlLFxuICBiaW5kQWN0aW9uQ3JlYXRvcnMsXG4gIGNvbWJpbmVSZWR1Y2VycyxcbiAgY29tcG9zZSxcbiAgY3JlYXRlU3RvcmUsXG4gIGlzQWN0aW9uLFxuICBpc1BsYWluT2JqZWN0LFxuICBsZWdhY3lfY3JlYXRlU3RvcmVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWR1eC5tanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9