UNPKG

adui

Version:

<div> <img src="https://wxa.wxs.qq.com/mpweb/delivery/legacy/wxadtouch/upload/t1/od834zef_52939fc6.png" style="margin:40px 0 0 -8px; background-color: #fcfcfc; box-shadow: none;" /> </div>

420 lines (351 loc) 51 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _classnames = _interopRequireDefault(require("classnames")); var _rcAnimate = _interopRequireDefault(require("rc-animate")); var _button = _interopRequireDefault(require("../button")); var _icon = _interopRequireDefault(require("../icon")); var _popover = _interopRequireDefault(require("../popover")); var _isEqualArrays = _interopRequireDefault(require("../_util/isEqualArrays")); require("./style"); var _excluded = ["allowClear", "changeOnSelect", "children", "className", "defaultValue", "disabled", "displayRender", "expandTrigger", "onChange", "onVisibleChange", "options", "placeholder", "popoverProps", "size", "value", "visible"]; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } 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 _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } var prefix = "adui-cascader"; var Cascader = function Cascader(_ref) { var _classNames3; var allowClear = _ref.allowClear, changeOnSelect = _ref.changeOnSelect, children = _ref.children, className = _ref.className, defaultValue = _ref.defaultValue, disabled = _ref.disabled, _ref$displayRender = _ref.displayRender, displayRender = _ref$displayRender === void 0 ? function (title) { return title.join("/"); } : _ref$displayRender, expandTrigger = _ref.expandTrigger, onChange = _ref.onChange, onVisibleChange = _ref.onVisibleChange, options = _ref.options, placeholder = _ref.placeholder, popoverProps = _ref.popoverProps, size = _ref.size, valueProps = _ref.value, visibleProps = _ref.visible, otherProps = _objectWithoutProperties(_ref, _excluded); var _useState = (0, _react.useState)(valueProps !== null ? valueProps || [] : defaultValue || []), _useState2 = _slicedToArray(_useState, 2), value = _useState2[0], setValue = _useState2[1]; var _useState3 = (0, _react.useState)(valueProps !== null ? valueProps || [] : defaultValue || []), _useState4 = _slicedToArray(_useState3, 2), activeValue = _useState4[0], setActiveValue = _useState4[1]; var _useState5 = (0, _react.useState)(visibleProps !== null ? visibleProps : false), _useState6 = _slicedToArray(_useState5, 2), visible = _useState6[0], setVisible = _useState6[1]; var delayTimer = (0, _react.useRef)(0); if (valueProps !== null && !(0, _isEqualArrays["default"])(valueProps || [], value)) { setValue(valueProps || []); } if (visibleProps !== null && visible !== visibleProps) { setVisible(visibleProps); } var setPopupVisible = function setPopupVisible(popupVisible) { if (visibleProps === null) { setVisible(popupVisible); } if (popupVisible && !visible) { setActiveValue(value); } if (onVisibleChange) { onVisibleChange(popupVisible); } }; var handleClear = function handleClear(e) { e.preventDefault(); e.stopPropagation(); setPopupVisible(false); if (!valueProps) { setValue([]); } if (onChange) { onChange([], []); } }; var handleChange = function handleChange(opts, _ref2) { var popupVisible = _ref2.visible; setPopupVisible(popupVisible); if (onChange) { onChange(opts.map(function (_ref3) { var v = _ref3.value; return v || ""; }), opts); } }; var hasValue = value === null || value === void 0 ? void 0 : value.length; var arrayTreeFilter = function arrayTreeFilter() { var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var filterFn = arguments.length > 1 ? arguments[1] : undefined; var childs = data; var result = []; var level = 0; do { var foundItem = childs.filter(function (item) { return filterFn(item, level); })[0]; if (!foundItem) { break; } result.push(foundItem); childs = foundItem.children || []; level += 1; } while (childs.length > 0); return result; }; var getTitle = function getTitle() { var unwrappedValue = Array.isArray(value[0]) ? value[0] : value; var selectedOptions = arrayTreeFilter(options, function (o, level) { return o.value === unwrappedValue[level]; }); var title = selectedOptions.length ? selectedOptions.map(function (o) { return o.title; }) : value; return displayRender(title.map(function (o) { return (o || "").toString(); }), selectedOptions); }; var isActiveOption = function isActiveOption(option, menuIndex) { return activeValue[menuIndex] === option.value; }; var getActiveOptions = function getActiveOptions(activeValueParam) { return arrayTreeFilter(options, function (o, level) { return o.value === (activeValueParam || activeValue)[level]; }); }; var getShowOptions = function getShowOptions() { var result = getActiveOptions().map(function (_ref4) { var childs = _ref4.children; return childs; }).filter(function (activeOption) { return activeOption === null || activeOption === void 0 ? void 0 : activeOption.length; }); result.unshift(options); return result; }; var delaySelect = function delaySelect(func) { if (delayTimer.current) { clearTimeout(delayTimer.current); delayTimer.current = 0; } if (typeof func === "function") { delayTimer.current = window.setTimeout(function () { func(); delayTimer.current = 0; }, 150); } }; var optss = getShowOptions(); var menus = _react["default"].createElement("div", { className: "".concat(prefix, "-menus") }, _react["default"].createElement(_rcAnimate["default"], { transitionAppear: true, component: "div", style: { display: "flex" }, animation: { appear: function appear(node, done) { node.classList.add("".concat(prefix, "-enter")); setTimeout(function () { node.classList.add("".concat(prefix, "-enter-active")); }, 50); var promise = new Promise(function (resolve) { return setTimeout(resolve, 200); }); promise.then(function () { node.classList.remove("".concat(prefix, "-enter-active")); node.classList.remove("".concat(prefix, "-enter")); return done(); }); return done(); }, enter: function enter(node, done) { node.classList.add("".concat(prefix, "-enter")); setTimeout(function () { node.classList.add("".concat(prefix, "-enter-active")); }, 50); var promise = new Promise(function (resolve) { return setTimeout(resolve, 200); }); promise.then(function () { node.classList.remove("".concat(prefix, "-enter-active")); node.classList.remove("".concat(prefix, "-enter")); return done(); }); return done(); }, leave: function leave(node, done) { node.classList.add("".concat(prefix, "-leave")); setTimeout(function () { node.classList.add("".concat(prefix, "-leave-active")); }, 50); var promise = new Promise(function (resolve) { return setTimeout(resolve, 200); }); promise.then(function () { return done(); }); } } }, optss.map(function (opts, menuIndex) { return _react["default"].createElement("div", { className: (0, _classnames["default"])("".concat(prefix, "-menu"), _defineProperty({}, "".concat(prefix, "-menu-").concat(size), size)), key: menuIndex }, (opts || []).map(function (o, j) { var v = o.value, title = o.title, c = o.children, d = o.disabled; var handleSelect = function handleSelect() { if (d) { return; } var activeValueDuplicated = _toConsumableArray(activeValue); activeValueDuplicated = activeValueDuplicated.slice(0, menuIndex + 1); activeValueDuplicated[menuIndex] = v || ""; var activeOptions = getActiveOptions(activeValueDuplicated); setActiveValue(activeValueDuplicated); if (!(c !== null && c !== void 0 && c.length)) { handleChange(activeOptions, { visible: false }); if (valueProps === null) { setValue(activeValueDuplicated); } } else if (changeOnSelect) { handleChange(activeOptions, { visible: true }); if (valueProps === null) { setValue(activeValueDuplicated); } } }; return _react["default"].createElement("div", { role: "none", key: v || j, className: (0, _classnames["default"])("".concat(prefix, "-menu-item"), _defineProperty({}, "".concat(prefix, "-menu-item-active"), isActiveOption(o, menuIndex))), title: title === null || title === void 0 ? void 0 : title.toString(), onMouseDown: function onMouseDown(e) { return e.preventDefault(); }, onClick: handleSelect, onMouseEnter: function onMouseEnter() { if (expandTrigger === "hover" && c !== null && c !== void 0 && c.length) { delaySelect(handleSelect); } }, onMouseLeave: function onMouseLeave() { if (expandTrigger === "hover" && c !== null && c !== void 0 && c.length) { delaySelect(); } } }, _react["default"].createElement("div", { className: "".concat(prefix, "-menu-item-content") }, title), !!(c !== null && c !== void 0 && c.length) && _react["default"].createElement(_icon["default"], { icon: "triangle-right", className: "".concat(prefix, "-menu-item-icon") })); })); }))); return _react["default"].createElement(_popover["default"], _extends({ arrowed: false, popupClassName: "".concat(prefix, "-popup"), visible: disabled ? false : visible, onVisibleChange: setPopupVisible, trigger: "click", popup: menus }, popoverProps), _react["default"].createElement(_button["default"], _extends({ disabled: disabled, className: (0, _classnames["default"])("".concat(prefix, "-button"), className, (_classNames3 = {}, _defineProperty(_classNames3, "".concat(prefix, "-button-valued"), hasValue), _defineProperty(_classNames3, "".concat(prefix, "-button-clearable"), allowClear), _classNames3)), size: size }, otherProps), hasValue ? _react["default"].createElement("span", { className: "".concat(prefix, "-label") }, getTitle()) : _react["default"].createElement("span", { className: "".concat(prefix, "-placeholder") }, placeholder), _react["default"].createElement("div", { className: "".concat(prefix, "-icons") }, _react["default"].createElement(_icon["default"], { icon: "triangle-down", className: "".concat(prefix, "-suffix"), color: disabled ? "var(--transparent-gray-600)" : "var(--transparent-gray-700)" }), allowClear && !disabled && _react["default"].createElement(_icon["default"], { icon: "cancel-circle", className: "".concat(prefix, "-remove"), color: "var(--transparent-gray-700)", onClick: handleClear })))); }; Cascader.displayName = "Cascader"; Cascader.propTypes = { allowClear: _propTypes["default"].bool, changeOnSelect: _propTypes["default"].bool, children: _propTypes["default"].node, className: _propTypes["default"].string, defaultValue: _propTypes["default"].any, disabled: _propTypes["default"].bool, displayRender: _propTypes["default"].any, expandTrigger: _propTypes["default"].oneOf(["click", "hover"]), options: _propTypes["default"].any, onChange: _propTypes["default"].any, onVisibleChange: _propTypes["default"].any, placeholder: _propTypes["default"].any, popoverProps: _propTypes["default"].any, size: _propTypes["default"].oneOf(["mini", "small", "medium", "large"]), value: _propTypes["default"].any, visible: _propTypes["default"].any }; Cascader.defaultProps = { allowClear: true, changeOnSelect: false, children: null, className: undefined, defaultValue: null, disabled: false, displayRender: undefined, expandTrigger: "click", onChange: undefined, onVisibleChange: undefined, options: [], placeholder: "请选择", popoverProps: {}, size: "small", value: null, visible: null }; var _default = Cascader; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwcmVmaXgiLCJDYXNjYWRlciIsImFsbG93Q2xlYXIiLCJjaGFuZ2VPblNlbGVjdCIsImNoaWxkcmVuIiwiY2xhc3NOYW1lIiwiZGVmYXVsdFZhbHVlIiwiZGlzYWJsZWQiLCJkaXNwbGF5UmVuZGVyIiwidGl0bGUiLCJqb2luIiwiZXhwYW5kVHJpZ2dlciIsIm9uQ2hhbmdlIiwib25WaXNpYmxlQ2hhbmdlIiwib3B0aW9ucyIsInBsYWNlaG9sZGVyIiwicG9wb3ZlclByb3BzIiwic2l6ZSIsInZhbHVlUHJvcHMiLCJ2YWx1ZSIsInZpc2libGVQcm9wcyIsInZpc2libGUiLCJvdGhlclByb3BzIiwidXNlU3RhdGUiLCJzZXRWYWx1ZSIsImFjdGl2ZVZhbHVlIiwic2V0QWN0aXZlVmFsdWUiLCJzZXRWaXNpYmxlIiwiZGVsYXlUaW1lciIsInVzZVJlZiIsImlzRXF1YWxBcnJheXMiLCJzZXRQb3B1cFZpc2libGUiLCJwb3B1cFZpc2libGUiLCJoYW5kbGVDbGVhciIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsImhhbmRsZUNoYW5nZSIsIm9wdHMiLCJtYXAiLCJ2IiwiaGFzVmFsdWUiLCJsZW5ndGgiLCJhcnJheVRyZWVGaWx0ZXIiLCJkYXRhIiwiZmlsdGVyRm4iLCJjaGlsZHMiLCJyZXN1bHQiLCJsZXZlbCIsImZvdW5kSXRlbSIsImZpbHRlciIsIml0ZW0iLCJwdXNoIiwiZ2V0VGl0bGUiLCJ1bndyYXBwZWRWYWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsInNlbGVjdGVkT3B0aW9ucyIsIm8iLCJ0b1N0cmluZyIsImlzQWN0aXZlT3B0aW9uIiwib3B0aW9uIiwibWVudUluZGV4IiwiZ2V0QWN0aXZlT3B0aW9ucyIsImFjdGl2ZVZhbHVlUGFyYW0iLCJnZXRTaG93T3B0aW9ucyIsImFjdGl2ZU9wdGlvbiIsInVuc2hpZnQiLCJkZWxheVNlbGVjdCIsImZ1bmMiLCJjdXJyZW50IiwiY2xlYXJUaW1lb3V0Iiwid2luZG93Iiwic2V0VGltZW91dCIsIm9wdHNzIiwibWVudXMiLCJkaXNwbGF5IiwiYXBwZWFyIiwibm9kZSIsImRvbmUiLCJjbGFzc0xpc3QiLCJhZGQiLCJwcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwicmVtb3ZlIiwiZW50ZXIiLCJsZWF2ZSIsImNsYXNzTmFtZXMiLCJqIiwiYyIsImQiLCJoYW5kbGVTZWxlY3QiLCJhY3RpdmVWYWx1ZUR1cGxpY2F0ZWQiLCJzbGljZSIsImFjdGl2ZU9wdGlvbnMiLCJkaXNwbGF5TmFtZSIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsImJvb2wiLCJzdHJpbmciLCJhbnkiLCJvbmVPZiIsImRlZmF1bHRQcm9wcyIsInVuZGVmaW5lZCJdLCJzb3VyY2VzIjpbIi4uLy4uL2NvbXBvbmVudHMvY2FzY2FkZXIvQ2FzY2FkZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L25vLWFycmF5LWluZGV4LWtleSAqL1xuaW1wb3J0IFJlYWN0LCB7IHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiXG5pbXBvcnQgQW5pbWF0ZSBmcm9tIFwicmMtYW5pbWF0ZVwiXG5pbXBvcnQgQnV0dG9uIGZyb20gXCIuLi9idXR0b25cIlxuaW1wb3J0IEljb24gZnJvbSBcIi4uL2ljb25cIlxuaW1wb3J0IFBvcG92ZXIsIHsgSVBvcG92ZXJQcm9wcyB9IGZyb20gXCIuLi9wb3BvdmVyXCJcbmltcG9ydCBpc0VxdWFsQXJyYXlzIGZyb20gXCIuLi9fdXRpbC9pc0VxdWFsQXJyYXlzXCJcbmltcG9ydCBcIi4vc3R5bGVcIlxuXG5jb25zdCBwcmVmaXggPSBcImFkdWktY2FzY2FkZXJcIlxuXG5leHBvcnQgdHlwZSBDYXNjYWRlclZhbHVlVHlwZSA9IFJlYWN0LlJlYWN0VGV4dFtdXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FzY2FkZXJPcHRpb24ge1xuICBba2V5OiBzdHJpbmddOiBhbnlcbiAgdmFsdWU/OiBzdHJpbmcgfCBudW1iZXJcbiAgdGl0bGU6IFJlYWN0LlJlYWN0Tm9kZVxuICBkaXNhYmxlZD86IGJvb2xlYW5cbiAgY2hpbGRyZW4/OiBDYXNjYWRlck9wdGlvbltdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNhc2NhZGVyUHJvcHMge1xuICBba2V5OiBzdHJpbmddOiBhbnlcbiAgLyoqXG4gICAqIOaYr+WQpuaUr+aMgea4hemZpFxuICAgKi9cbiAgYWxsb3dDbGVhcj86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOW9k+atpOmhueS4uiB0cnVlIOaXtu+8jOeCuemAieavj+e6p+iPnOWNlemAiemhueWAvOmDveS8muWPkeeUn+WPmOWMllxuICAgKi9cbiAgY2hhbmdlT25TZWxlY3Q/OiBib29sZWFuXG4gIC8qKlxuICAgKiDlrZDoioLngrlcbiAgICovXG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDpmYTliqDnsbvlkI3vvIzms6jmhI8gQ2FzY2FkZXIg5omA5pyJ55qE5bGe5oCn5Lya6ZmE5Yqg5Yiw5YaF6YOo55qE5YaF5a655YWD57Sg5LiK77yM6ICM5LiN5piv5YyF5ZCrIG1hc2sg55qE5pyA5aSW5bGC5YWD57SgXG4gICAqL1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOm7mOiupOWAvO+8jOWGhemDqOmpseWKqFxuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogQ2FzY2FkZXJWYWx1ZVR5cGUgfCBudWxsXG4gIC8qKlxuICAgKiDmmK/lkKbnpoHnlKhcbiAgICovXG4gIGRpc2FibGVkPzogYm9vbGVhblxuICAvKipcbiAgICog6YCJ5oup5ZCO5bGV56S655qE5riy5p+T5Ye95pWwXG4gICAqL1xuICBkaXNwbGF5UmVuZGVyPzogKFxuICAgIHRpdGxlOiBzdHJpbmdbXSxcbiAgICBzZWxlY3RlZE9wdGlvbnM/OiBDYXNjYWRlck9wdGlvbltdXG4gICkgPT4gUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDmrKHnuqfoj5zljZXnmoTlsZXlvIDmlrnlvI/vvIzlj6/pgIkgJ2NsaWNrJyDlkowgJ2hvdmVyJ1xuICAgKi9cbiAgZXhwYW5kVHJpZ2dlcj86IFwiY2xpY2tcIiB8IFwiaG92ZXJcIlxuICAvKipcbiAgICog5YC85Y+Y5YyW5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQ2hhbmdlPzogKHZhbHVlOiBDYXNjYWRlclZhbHVlVHlwZSwgc2VsZWN0T3B0aW9uczogQ2FzY2FkZXJPcHRpb25bXSkgPT4gdm9pZFxuICAvKipcbiAgICog5LiL5ouJ5qGGIHZpc2libGUg54q25oCB5pS55Y+Y5pe255qE5Zue6LCDXG4gICAqL1xuICBvblZpc2libGVDaGFuZ2U/OiAodmlzaWJsZTogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICog5Y+v6YCJ6aG55pWw5o2u5rqQXG4gICAqL1xuICBvcHRpb25zPzogQ2FzY2FkZXJPcHRpb25bXVxuICAvKipcbiAgICog5Y2g5L2N5paH5pysXG4gICAqL1xuICBwbGFjZWhvbGRlcj86IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICog5bGe5oCn5bCG5Lya6YCP5Lyg57uZIFBvcG92ZXIg57uE5Lu2XG4gICAqL1xuICBwb3BvdmVyUHJvcHM/OiBJUG9wb3ZlclByb3BzXG4gIC8qKlxuICAgKiDlsLrlr7hcbiAgICovXG4gIHNpemU/OiBcIm1pbmlcIiB8IFwic21hbGxcIiB8IFwibWVkaXVtXCIgfCBcImxhcmdlXCJcbiAgLyoqXG4gICAqIOWAvO+8jOWklumDqOaOp+WItlxuICAgKi9cbiAgdmFsdWU/OiBDYXNjYWRlclZhbHVlVHlwZSB8IG51bGxcbiAgLyoqXG4gICAqIOWklumDqOaOp+WItuS4i+aLieahhiB2aXNpYmxlIOeKtuaAgVxuICAgKi9cbiAgdmlzaWJsZT86IGJvb2xlYW4gfCBudWxsXG59XG5cbi8qKlxuICog57qn6IGU6YCJ5oup5Zmo55u06KeC5bGV56S65bey5pyJ55qE5bGC57qn5YWz57O744CCXG4gKi9cbmNvbnN0IENhc2NhZGVyOiBSZWFjdC5GQzxJQ2FzY2FkZXJQcm9wcz4gPSAoe1xuICBhbGxvd0NsZWFyLFxuICBjaGFuZ2VPblNlbGVjdCxcbiAgY2hpbGRyZW4sXG4gIGNsYXNzTmFtZSxcbiAgZGVmYXVsdFZhbHVlLFxuICBkaXNhYmxlZCxcbiAgZGlzcGxheVJlbmRlciA9ICh0aXRsZTogc3RyaW5nW10pID0+IHRpdGxlLmpvaW4oXCIvXCIpLFxuICBleHBhbmRUcmlnZ2VyLFxuICBvbkNoYW5nZSxcbiAgb25WaXNpYmxlQ2hhbmdlLFxuICBvcHRpb25zLFxuICBwbGFjZWhvbGRlcixcbiAgcG9wb3ZlclByb3BzLFxuICBzaXplLFxuICB2YWx1ZTogdmFsdWVQcm9wcyxcbiAgdmlzaWJsZTogdmlzaWJsZVByb3BzLFxuICAuLi5vdGhlclByb3BzXG59KSA9PiB7XG4gIGNvbnN0IFt2YWx1ZSwgc2V0VmFsdWVdID0gdXNlU3RhdGU8Q2FzY2FkZXJWYWx1ZVR5cGU+KFxuICAgIHZhbHVlUHJvcHMgIT09IG51bGwgPyB2YWx1ZVByb3BzIHx8IFtdIDogZGVmYXVsdFZhbHVlIHx8IFtdXG4gIClcbiAgY29uc3QgW2FjdGl2ZVZhbHVlLCBzZXRBY3RpdmVWYWx1ZV0gPSB1c2VTdGF0ZTxDYXNjYWRlclZhbHVlVHlwZT4oXG4gICAgdmFsdWVQcm9wcyAhPT0gbnVsbCA/IHZhbHVlUHJvcHMgfHwgW10gOiBkZWZhdWx0VmFsdWUgfHwgW11cbiAgKVxuICBjb25zdCBbdmlzaWJsZSwgc2V0VmlzaWJsZV0gPSB1c2VTdGF0ZShcbiAgICB2aXNpYmxlUHJvcHMgIT09IG51bGwgPyB2aXNpYmxlUHJvcHMgOiBmYWxzZVxuICApXG4gIGNvbnN0IGRlbGF5VGltZXIgPSB1c2VSZWYoMClcblxuICAvLyDnm7jlvZPkuo7nlJ/lkb3lkajmnJ8gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXG4gIGlmICh2YWx1ZVByb3BzICE9PSBudWxsICYmICFpc0VxdWFsQXJyYXlzKHZhbHVlUHJvcHMgfHwgW10sIHZhbHVlKSkge1xuICAgIHNldFZhbHVlKHZhbHVlUHJvcHMgfHwgW10pXG4gIH1cbiAgaWYgKHZpc2libGVQcm9wcyAhPT0gbnVsbCAmJiB2aXNpYmxlICE9PSB2aXNpYmxlUHJvcHMpIHtcbiAgICBzZXRWaXNpYmxlKHZpc2libGVQcm9wcylcbiAgfVxuXG4gIGNvbnN0IHNldFBvcHVwVmlzaWJsZSA9IChwb3B1cFZpc2libGU6IGJvb2xlYW4pID0+IHtcbiAgICBpZiAodmlzaWJsZVByb3BzID09PSBudWxsKSB7XG4gICAgICBzZXRWaXNpYmxlKHBvcHVwVmlzaWJsZSlcbiAgICB9XG4gICAgaWYgKHBvcHVwVmlzaWJsZSAmJiAhdmlzaWJsZSkge1xuICAgICAgc2V0QWN0aXZlVmFsdWUodmFsdWUpXG4gICAgfVxuICAgIGlmIChvblZpc2libGVDaGFuZ2UpIHtcbiAgICAgIG9uVmlzaWJsZUNoYW5nZShwb3B1cFZpc2libGUpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQ2xlYXIgPSAoZTogUmVhY3QuTW91c2VFdmVudDxTVkdTVkdFbGVtZW50PikgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICBzZXRQb3B1cFZpc2libGUoZmFsc2UpXG4gICAgaWYgKCF2YWx1ZVByb3BzKSB7XG4gICAgICBzZXRWYWx1ZShbXSlcbiAgICB9XG4gICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICBvbkNoYW5nZShbXSwgW10pXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKFxuICAgIG9wdHM6IENhc2NhZGVyT3B0aW9uW10sXG4gICAgeyB2aXNpYmxlOiBwb3B1cFZpc2libGUgfTogeyB2aXNpYmxlOiBib29sZWFuIH1cbiAgKSA9PiB7XG4gICAgc2V0UG9wdXBWaXNpYmxlKHBvcHVwVmlzaWJsZSlcbiAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgIG9uQ2hhbmdlKFxuICAgICAgICBvcHRzLm1hcCgoeyB2YWx1ZTogdiB9KSA9PiB2IHx8IFwiXCIpLFxuICAgICAgICBvcHRzXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFzVmFsdWUgPSB2YWx1ZT8ubGVuZ3RoXG5cbiAgY29uc3QgYXJyYXlUcmVlRmlsdGVyID0gPFQgZXh0ZW5kcyB1bmtub3duPihcbiAgICBkYXRhOiBUW10gPSBbXSxcbiAgICBmaWx0ZXJGbjogKGl0ZW06IFQsIGxldmVsOiBudW1iZXIpID0+IGJvb2xlYW5cbiAgKSA9PiB7XG4gICAgbGV0IGNoaWxkcyA9IGRhdGFcbiAgICBjb25zdCByZXN1bHQ6IFRbXSA9IFtdXG4gICAgbGV0IGxldmVsID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGZvdW5kSXRlbTogVCA9IGNoaWxkcy5maWx0ZXIoKGl0ZW0pID0+IGZpbHRlckZuKGl0ZW0sIGxldmVsKSlbMF1cbiAgICAgIGlmICghZm91bmRJdGVtKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaChmb3VuZEl0ZW0pXG4gICAgICBjaGlsZHMgPSAoZm91bmRJdGVtIGFzIGFueSkuY2hpbGRyZW4gfHwgW11cbiAgICAgIGxldmVsICs9IDFcbiAgICB9IHdoaWxlIChjaGlsZHMubGVuZ3RoID4gMClcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBjb25zdCBnZXRUaXRsZSA9ICgpID0+IHtcbiAgICBjb25zdCB1bndyYXBwZWRWYWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWVbMF0pID8gdmFsdWVbMF0gOiB2YWx1ZVxuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9ucyA9IGFycmF5VHJlZUZpbHRlcihcbiAgICAgIG9wdGlvbnMsXG4gICAgICAobywgbGV2ZWw6IG51bWJlcikgPT4gby52YWx1ZSA9PT0gdW53cmFwcGVkVmFsdWVbbGV2ZWxdXG4gICAgKVxuICAgIGNvbnN0IHRpdGxlID0gc2VsZWN0ZWRPcHRpb25zLmxlbmd0aFxuICAgICAgPyBzZWxlY3RlZE9wdGlvbnMubWFwKChvKSA9PiBvLnRpdGxlKVxuICAgICAgOiB2YWx1ZVxuICAgIHJldHVybiBkaXNwbGF5UmVuZGVyKFxuICAgICAgdGl0bGUubWFwKChvKSA9PiAobyB8fCBcIlwiKS50b1N0cmluZygpKSxcbiAgICAgIHNlbGVjdGVkT3B0aW9uc1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IGlzQWN0aXZlT3B0aW9uID0gKG9wdGlvbjogQ2FzY2FkZXJPcHRpb24sIG1lbnVJbmRleDogbnVtYmVyKSA9PlxuICAgIGFjdGl2ZVZhbHVlW21lbnVJbmRleF0gPT09IG9wdGlvbi52YWx1ZVxuXG4gIGNvbnN0IGdldEFjdGl2ZU9wdGlvbnMgPSAoXG4gICAgYWN0aXZlVmFsdWVQYXJhbT86IENhc2NhZGVyVmFsdWVUeXBlXG4gICk6IENhc2NhZGVyT3B0aW9uW10gPT5cbiAgICBhcnJheVRyZWVGaWx0ZXIoXG4gICAgICBvcHRpb25zLFxuICAgICAgKG8sIGxldmVsKSA9PiBvLnZhbHVlID09PSAoYWN0aXZlVmFsdWVQYXJhbSB8fCBhY3RpdmVWYWx1ZSlbbGV2ZWxdXG4gICAgKVxuXG4gIGNvbnN0IGdldFNob3dPcHRpb25zID0gKCk6IChDYXNjYWRlck9wdGlvbltdIHwgdW5kZWZpbmVkKVtdID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBnZXRBY3RpdmVPcHRpb25zKClcbiAgICAgIC5tYXAoKHsgY2hpbGRyZW46IGNoaWxkcyB9KSA9PiBjaGlsZHMpXG4gICAgICAuZmlsdGVyKChhY3RpdmVPcHRpb24pID0+IGFjdGl2ZU9wdGlvbj8ubGVuZ3RoKVxuICAgIHJlc3VsdC51bnNoaWZ0KG9wdGlvbnMpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBjb25zdCBkZWxheVNlbGVjdCA9IChmdW5jPzogKCkgPT4gdm9pZCkgPT4ge1xuICAgIGlmIChkZWxheVRpbWVyLmN1cnJlbnQpIHtcbiAgICAgIGNsZWFyVGltZW91dChkZWxheVRpbWVyLmN1cnJlbnQpXG4gICAgICBkZWxheVRpbWVyLmN1cnJlbnQgPSAwXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZnVuYyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBkZWxheVRpbWVyLmN1cnJlbnQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGZ1bmMoKVxuICAgICAgICBkZWxheVRpbWVyLmN1cnJlbnQgPSAwXG4gICAgICB9LCAxNTApXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb3B0c3MgPSBnZXRTaG93T3B0aW9ucygpXG5cbiAgY29uc3QgbWVudXMgPSAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Ake3ByZWZpeH0tbWVudXNgfT5cbiAgICAgIDxBbmltYXRlXG4gICAgICAgIHRyYW5zaXRpb25BcHBlYXJcbiAgICAgICAgY29tcG9uZW50PVwiZGl2XCJcbiAgICAgICAgc3R5bGU9e3sgZGlzcGxheTogXCJmbGV4XCIgfX1cbiAgICAgICAgYW5pbWF0aW9uPXt7XG4gICAgICAgICAgYXBwZWFyKG5vZGU6IEhUTUxFbGVtZW50LCBkb25lOiAoKSA9PiB2b2lkKSB7XG4gICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoYCR7cHJlZml4fS1lbnRlcmApXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGAke3ByZWZpeH0tZW50ZXItYWN0aXZlYClcbiAgICAgICAgICAgIH0sIDUwKVxuICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDIwMCkpXG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoYCR7cHJlZml4fS1lbnRlci1hY3RpdmVgKVxuICAgICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoYCR7cHJlZml4fS1lbnRlcmApXG4gICAgICAgICAgICAgIHJldHVybiBkb25lKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gZG9uZSgpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbnRlcihub2RlOiBIVE1MRWxlbWVudCwgZG9uZTogKCkgPT4gdm9pZCkge1xuICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGAke3ByZWZpeH0tZW50ZXJgKVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChgJHtwcmVmaXh9LWVudGVyLWFjdGl2ZWApXG4gICAgICAgICAgICB9LCA1MClcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDApKVxuICAgICAgICAgICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKGAke3ByZWZpeH0tZW50ZXItYWN0aXZlYClcbiAgICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKGAke3ByZWZpeH0tZW50ZXJgKVxuICAgICAgICAgICAgICByZXR1cm4gZG9uZSgpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIGRvbmUoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbGVhdmUobm9kZTogSFRNTEVsZW1lbnQsIGRvbmU6ICgpID0+IHZvaWQpIHtcbiAgICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChgJHtwcmVmaXh9LWxlYXZlYClcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoYCR7cHJlZml4fS1sZWF2ZS1hY3RpdmVgKVxuICAgICAgICAgICAgfSwgNTApXG4gICAgICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjAwKSlcbiAgICAgICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBkb25lKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge29wdHNzLm1hcCgob3B0cywgbWVudUluZGV4KSA9PiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKGAke3ByZWZpeH0tbWVudWAsIHtcbiAgICAgICAgICAgICAgW2Ake3ByZWZpeH0tbWVudS0ke3NpemV9YF06IHNpemUsXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIGtleT17bWVudUluZGV4fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHsob3B0cyB8fCBbXSkubWFwKChvLCBqKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IHYsIHRpdGxlLCBjaGlsZHJlbjogYywgZGlzYWJsZWQ6IGQgfSA9IG9cbiAgICAgICAgICAgICAgY29uc3QgaGFuZGxlU2VsZWN0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGFjdGl2ZVZhbHVlRHVwbGljYXRlZCA9IFsuLi5hY3RpdmVWYWx1ZV1cbiAgICAgICAgICAgICAgICBhY3RpdmVWYWx1ZUR1cGxpY2F0ZWQgPSBhY3RpdmVWYWx1ZUR1cGxpY2F0ZWQuc2xpY2UoXG4gICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgbWVudUluZGV4ICsgMVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBhY3RpdmVWYWx1ZUR1cGxpY2F0ZWRbbWVudUluZGV4XSA9IHYgfHwgXCJcIlxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZU9wdGlvbnMgPSBnZXRBY3RpdmVPcHRpb25zKGFjdGl2ZVZhbHVlRHVwbGljYXRlZClcbiAgICAgICAgICAgICAgICBzZXRBY3RpdmVWYWx1ZShhY3RpdmVWYWx1ZUR1cGxpY2F0ZWQpXG4gICAgICAgICAgICAgICAgaWYgKCFjPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIGhhbmRsZUNoYW5nZShhY3RpdmVPcHRpb25zLCB7IHZpc2libGU6IGZhbHNlIH0pXG4gICAgICAgICAgICAgICAgICBpZiAodmFsdWVQcm9wcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZShhY3RpdmVWYWx1ZUR1cGxpY2F0ZWQpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VPblNlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgaGFuZGxlQ2hhbmdlKGFjdGl2ZU9wdGlvbnMsIHsgdmlzaWJsZTogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlUHJvcHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWUoYWN0aXZlVmFsdWVEdXBsaWNhdGVkKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIHJvbGU9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgIGtleT17diB8fCBqfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKGAke3ByZWZpeH0tbWVudS1pdGVtYCwge1xuICAgICAgICAgICAgICAgICAgICBbYCR7cHJlZml4fS1tZW51LWl0ZW0tYWN0aXZlYF06IGlzQWN0aXZlT3B0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgIG8sXG4gICAgICAgICAgICAgICAgICAgICAgbWVudUluZGV4XG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgIHRpdGxlPXt0aXRsZT8udG9TdHJpbmcoKX1cbiAgICAgICAgICAgICAgICAgIG9uTW91c2VEb3duPXsoZSkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpfVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU2VsZWN0fVxuICAgICAgICAgICAgICAgICAgb25Nb3VzZUVudGVyPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHBhbmRUcmlnZ2VyID09PSBcImhvdmVyXCIgJiYgYz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWxlY3QoaGFuZGxlU2VsZWN0KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgb25Nb3VzZUxlYXZlPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHBhbmRUcmlnZ2VyID09PSBcImhvdmVyXCIgJiYgYz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWxlY3QoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LW1lbnUtaXRlbS1jb250ZW50YH0+e3RpdGxlfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgeyEhYz8ubGVuZ3RoICYmIChcbiAgICAgICAgICAgICAgICAgICAgPEljb25cbiAgICAgICAgICAgICAgICAgICAgICBpY29uPVwidHJpYW5nbGUtcmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7cHJlZml4fS1tZW51LWl0ZW0taWNvbmB9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSl9XG4gICAgICA8L0FuaW1hdGU+XG4gICAgPC9kaXY+XG4gIClcblxuICByZXR1cm4gKFxuICAgIDxQb3BvdmVyXG4gICAgICBhcnJvd2VkPXtmYWxzZX1cbiAgICAgIHBvcHVwQ2xhc3NOYW1lPXtgJHtwcmVmaXh9LXBvcHVwYH1cbiAgICAgIHZpc2libGU9e2Rpc2FibGVkID8gZmFsc2UgOiB2aXNpYmxlfVxuICAgICAgb25WaXNpYmxlQ2hhbmdlPXtzZXRQb3B1cFZpc2libGV9XG4gICAgICB0cmlnZ2VyPVwiY2xpY2tcIlxuICAgICAgcG9wdXA9e21lbnVzfVxuICAgICAgey4uLnBvcG92ZXJQcm9wc31cbiAgICA+XG4gICAgICA8QnV0dG9uXG4gICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKGAke3ByZWZpeH0tYnV0dG9uYCwgY2xhc3NOYW1lLCB7XG4gICAgICAgICAgW2Ake3ByZWZpeH0tYnV0dG9uLXZhbHVlZGBdOiBoYXNWYWx1ZSxcbiAgICAgICAgICBbYCR7cHJlZml4fS1idXR0b24tY2xlYXJhYmxlYF06IGFsbG93Q2xlYXIsXG4gICAgICAgIH0pfVxuICAgICAgICBzaXplPXtzaXplfVxuICAgICAgICB7Li4ub3RoZXJQcm9wc31cbiAgICAgID5cbiAgICAgICAge2hhc1ZhbHVlID8gKFxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17YCR7cHJlZml4fS1sYWJlbGB9PntnZXRUaXRsZSgpfTwvc3Bhbj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2Ake3ByZWZpeH0tcGxhY2Vob2xkZXJgfT57cGxhY2Vob2xkZXJ9PC9zcGFuPlxuICAgICAgICApfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cHJlZml4fS1pY29uc2B9PlxuICAgICAgICAgIDxJY29uXG4gICAgICAgICAgICBpY29uPVwidHJpYW5nbGUtZG93blwiXG4gICAgICAgICAgICBjbGFzc05hbWU9e2Ake3ByZWZpeH0tc3VmZml4YH1cbiAgICAgICAgICAgIGNvbG9yPXtcbiAgICAgICAgICAgICAgZGlzYWJsZWRcbiAgICAgICAgICAgICAgICA/IFwidmFyKC0tdHJhbnNwYXJlbnQtZ3JheS02MDApXCJcbiAgICAgICAgICAgICAgICA6IFwidmFyKC0tdHJhbnNwYXJlbnQtZ3JheS03MDApXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvPlxuICAgICAgICAgIHthbGxvd0NsZWFyICYmICFkaXNhYmxlZCAmJiAoXG4gICAgICAgICAgICA8SWNvblxuICAgICAgICAgICAgICBpY29uPVwiY2FuY2VsLWNpcmNsZVwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7cHJlZml4fS1yZW1vdmVgfVxuICAgICAgICAgICAgICBjb2xvcj1cInZhcigtLXRyYW5zcGFyZW50LWdyYXktNzAwKVwiXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNsZWFyfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvQnV0dG9uPlxuICAgIDwvUG9wb3Zlcj5cbiAgKVxufVxuXG5DYXNjYWRlci5kaXNwbGF5TmFtZSA9IFwiQ2FzY2FkZXJcIlxuXG5DYXNjYWRlci5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiDmmK/lkKbmlK/mjIHmuIXpmaRcbiAgICovXG4gIGFsbG93Q2xlYXI6IFByb3BUeXBlcy5ib29sLFxuICAvKipcbiAgICog5b2T5q2k6aG55Li6IHRydWUg5pe277yM54K56YCJ5q+P57qn6I+c5Y2V6YCJ6aG55YC86YO95Lya5Y+R55Sf5Y+Y5YyWXG4gICAqL1xuICBjaGFuZ2VPblNlbGVjdDogUHJvcFR5cGVzLmJvb2wsXG4gIC8qKlxuICAgKiDlrZDoioLngrlcbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgLyoqXG4gICAqIOmZhOWKoOexu+WQje+8jOazqOaEjyBEaWFsb2cg5omA5pyJ55qE5bGe5oCn5Lya6ZmE5Yqg5Yiw5YaF6YOo55qE5YaF5a655YWD57Sg5LiK77yM6ICM5LiN5piv5YyF5ZCrIG1hc2sg55qE5pyA5aSW5bGC5YWD57SgXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiDpu5jorqTlgLzvvIzlhoXpg6jpqbHliqhcbiAgICovXG4gIGRlZmF1bHRWYWx1ZTogUHJvcFR5cGVzLmFueSxcbiAgLyoqXG4gICAqIOaYr+WQpuemgeeUqFxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICAvKipcbiAgICog6YCJ5oup5ZCO5bGV56S655qE5riy5p+T5Ye95pWwXG4gICAqL1xuICBkaXNwbGF5UmVuZGVyOiBQcm9wVHlwZXMuYW55LFxuICAvKipcbiAgICog5qyh57qn6I+c5Y2V55qE5bGV5byA5pa55byP77yM5Y+v6YCJICdjbGljaycg5ZKMICdob3ZlcidcbiAgICovXG4gIGV4cGFuZFRyaWdnZXI6IFByb3BUeXBlcy5vbmVPZihbXCJjbGlja1wiLCBcImhvdmVyXCJdKSxcbiAgLyoqXG4gICAqIOWPr+mAiemhueaVsOaNrua6kFxuICAgKi9cbiAgb3B0aW9uczogUHJvcFR5cGVzLmFueSxcbiAgLyoqXG4gICAqIOWAvOWPmOWMluaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvbkNoYW5nZTogUHJvcFR5cGVzLmFueSxcbiAgLyoqXG4gICAqIOS4i+aLieahhiB2aXNpYmxlIOeKtuaAgeaUueWPmOaXtueahOWbnuiwg1xuICAgKi9cbiAgb25WaXNpYmxlQ2hhbmdlOiBQcm9wVHlwZXMuYW55LFxuICAvKipcbiAgICog5Y2g5L2N5paH5pysXG4gICAqL1xuICBwbGFjZWhvbGRlcjogUHJvcFR5cGVzLmFueSxcbiAgLyoqXG4gICAqIOWxnuaAp+WwhuS8mumAj+S8oOe7mSBQb3BvdmVyIOe7hOS7tlxuICAgKi9cbiAgcG9wb3ZlclByb3BzOiBQcm9wVHlwZXMuYW55LFxuICAvKipcbiAgICog5bC65a+4XG4gICAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2YoW1wibWluaVwiLCBcInNtYWxsXCIsIFwibWVkaXVtXCIsIFwibGFyZ2VcIl0pLFxuICAvKipcbiAgICog5YC877yM5aSW6YOo5o6n5Yi2XG4gICAqL1xuICB2YWx1ZTogUHJvcFR5cGVzLmFueSxcbiAgLyoqXG4gICAqIOWklumDqOaOp+WItuS4i+aLieahhiB2aXNpYmxlIOeKtuaAgVxuICAgKi9cbiAgdmlzaWJsZTogUHJvcFR5cGVzLmFueSxcbn1cblxuQ2FzY2FkZXIuZGVmYXVsdFByb3BzID0ge1xuICBhbGxvd0NsZWFyOiB0cnVlLFxuICBjaGFuZ2VPblNlbGVjdDogZmFsc2UsXG4gIGNoaWxkcmVuOiBudWxsLFxuICBjbGFzc05hbWU6IHVuZGVmaW5lZCxcbiAgZGVmYXVsdFZhbHVlOiBudWxsLFxuICBkaXNhYmxlZDogZmFsc2UsXG4gIGRpc3BsYXlSZW5kZXI6IHVuZGVmaW5lZCxcbiAgZXhwYW5kVHJpZ2dlcjogXCJjbGlja1wiLFxuICBvbkNoYW5nZTogdW5kZWZpbmVkLFxuICBvblZpc2libGVDaGFuZ2U6IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogW10sXG4gIHBsYWNlaG9sZGVyOiBcIuivt+mAieaLqVwiLFxuICBwb3BvdmVyUHJvcHM6IHt9LFxuICBzaXplOiBcInNtYWxsXCIsXG4gIHZhbHVlOiBudWxsLFxuICB2aXNpYmxlOiBudWxsLFxufVxuXG5leHBvcnQgZGVmYXVsdCBDYXNjYWRlclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxNQUFNLEdBQUcsZUFBZjs7QUFzRkEsSUFBTUMsUUFBa0MsR0FBRyxTQUFyQ0EsUUFBcUMsT0FrQnJDO0VBQUE7O0VBQUEsSUFqQkpDLFVBaUJJLFFBakJKQSxV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