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
JavaScript
"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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