"use strict"; (self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_antd_lib__util_ActionButton_js-node_modules_antd_lib__util_ContextIsolat-f83f88"],{ /***/ "../../../node_modules/antd/lib/_util/ActionButton.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/ActionButton.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _useState = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/hooks/useState */ "../../../node_modules/rc-util/lib/hooks/useState.js")); var _button = _interopRequireDefault(__webpack_require__(/*! ../button */ "../../../node_modules/antd/lib/button/index.js")); var _buttonHelpers = __webpack_require__(/*! ../button/buttonHelpers */ "../../../node_modules/antd/lib/button/buttonHelpers.js"); function isThenable(thing) { return !!(thing === null || thing === void 0 ? void 0 : thing.then); } const ActionButton = props => { const { type, children, prefixCls, buttonProps, close, autoFocus, emitEvent, isSilent, quitOnNullishReturnValue, actionFn } = props; const clickedRef = React.useRef(false); const buttonRef = React.useRef(null); const [loading, setLoading] = (0, _useState.default)(false); const onInternalClose = (...args) => { close === null || close === void 0 ? void 0 : close.apply(void 0, args); }; React.useEffect(() => { let timeoutId = null; if (autoFocus) { timeoutId = setTimeout(() => { var _a; (_a = buttonRef.current) === null || _a === void 0 ? void 0 : _a.focus({ preventScroll: true }); }); } return () => { if (timeoutId) { clearTimeout(timeoutId); } }; }, []); const handlePromiseOnOk = returnValueOfOnOk => { if (!isThenable(returnValueOfOnOk)) { return; } setLoading(true); returnValueOfOnOk.then((...args) => { setLoading(false, true); onInternalClose.apply(void 0, args); clickedRef.current = false; }, e => { // See: https://github.com/ant-design/ant-design/issues/6183 setLoading(false, true); clickedRef.current = false; // Do not throw if is `await` mode if (isSilent === null || isSilent === void 0 ? void 0 : isSilent()) { return; } return Promise.reject(e); }); }; const onClick = e => { if (clickedRef.current) { return; } clickedRef.current = true; if (!actionFn) { onInternalClose(); return; } let returnValueOfOnOk; if (emitEvent) { returnValueOfOnOk = actionFn(e); if (quitOnNullishReturnValue && !isThenable(returnValueOfOnOk)) { clickedRef.current = false; onInternalClose(e); return; } } else if (actionFn.length) { returnValueOfOnOk = actionFn(close); // https://github.com/ant-design/ant-design/issues/23358 clickedRef.current = false; } else { returnValueOfOnOk = actionFn(); if (!isThenable(returnValueOfOnOk)) { onInternalClose(); return; } } handlePromiseOnOk(returnValueOfOnOk); }; return /*#__PURE__*/React.createElement(_button.default, Object.assign({}, (0, _buttonHelpers.convertLegacyProps)(type), { onClick: onClick, loading: loading, prefixCls: prefixCls }, buttonProps, { ref: buttonRef }), children); }; var _default = exports["default"] = ActionButton; /***/ }), /***/ "../../../node_modules/antd/lib/_util/ContextIsolator.js": /*!***************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/ContextIsolator.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _context = __webpack_require__(/*! ../form/context */ "../../../node_modules/antd/lib/form/context.js"); var _Compact = __webpack_require__(/*! ../space/Compact */ "../../../node_modules/antd/lib/space/Compact.js"); const ContextIsolator = props => { const { space, form, children } = props; if (children === undefined || children === null) { return null; } let result = children; if (form) { result = /*#__PURE__*/_react.default.createElement(_context.NoFormStyle, { override: true, status: true }, result); } if (space) { result = /*#__PURE__*/_react.default.createElement(_Compact.NoCompactStyle, null, result); } return result; }; var _default = exports["default"] = ContextIsolator; /***/ }), /***/ "../../../node_modules/antd/lib/_util/PurePanel.js": /*!*********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/PurePanel.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; exports.withPureRenderTheme = withPureRenderTheme; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _useMergedState = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/hooks/useMergedState */ "../../../node_modules/rc-util/lib/hooks/useMergedState.js")); var _configProvider = _interopRequireWildcard(__webpack_require__(/*! ../config-provider */ "../../../node_modules/antd/lib/config-provider/index.js")); function withPureRenderTheme(Component) { return props => (/*#__PURE__*/React.createElement(_configProvider.default, { theme: { token: { motion: false, zIndexPopupBase: 0 } } }, /*#__PURE__*/React.createElement(Component, Object.assign({}, props)))); } /* istanbul ignore next */ const genPurePanel = (Component, alignPropName, postProps, defaultPrefixCls, getDropdownCls) => { const PurePanel = props => { const { prefixCls: customizePrefixCls, style } = props; const holderRef = React.useRef(null); const [popupHeight, setPopupHeight] = React.useState(0); const [popupWidth, setPopupWidth] = React.useState(0); const [open, setOpen] = (0, _useMergedState.default)(false, { value: props.open }); const { getPrefixCls } = React.useContext(_configProvider.ConfigContext); const prefixCls = getPrefixCls(defaultPrefixCls || 'select', customizePrefixCls); React.useEffect(() => { // We do not care about ssr setOpen(true); if (typeof ResizeObserver !== 'undefined') { const resizeObserver = new ResizeObserver(entries => { const element = entries[0].target; setPopupHeight(element.offsetHeight + 8); setPopupWidth(element.offsetWidth); }); const interval = setInterval(() => { var _a; const dropdownCls = getDropdownCls ? `.${getDropdownCls(prefixCls)}` : `.${prefixCls}-dropdown`; const popup = (_a = holderRef.current) === null || _a === void 0 ? void 0 : _a.querySelector(dropdownCls); if (popup) { clearInterval(interval); resizeObserver.observe(popup); } }, 10); return () => { clearInterval(interval); resizeObserver.disconnect(); }; } }, []); let mergedProps = Object.assign(Object.assign({}, props), { style: Object.assign(Object.assign({}, style), { margin: 0 }), open, visible: open, getPopupContainer: () => holderRef.current }); if (postProps) { mergedProps = postProps(mergedProps); } if (alignPropName) { Object.assign(mergedProps, { [alignPropName]: { overflow: { adjustX: false, adjustY: false } } }); } const mergedStyle = { paddingBottom: popupHeight, position: 'relative', minWidth: popupWidth }; return /*#__PURE__*/React.createElement("div", { ref: holderRef, style: mergedStyle }, /*#__PURE__*/React.createElement(Component, Object.assign({}, mergedProps))); }; return withPureRenderTheme(PurePanel); }; var _default = exports["default"] = genPurePanel; /***/ }), /***/ "../../../node_modules/antd/lib/_util/capitalize.js": /*!**********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/capitalize.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = capitalize; function capitalize(str) { if (typeof str !== 'string') { return str; } const ret = str.charAt(0).toUpperCase() + str.slice(1); return ret; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/colors.js": /*!******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/colors.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.PresetStatusColorTypes = void 0; exports.isPresetColor = isPresetColor; exports.isPresetStatusColor = isPresetStatusColor; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/toConsumableArray.js")); var _interface = __webpack_require__(/*! ../theme/interface */ "../../../node_modules/antd/lib/theme/interface/index.js"); const inverseColors = _interface.PresetColors.map(color => `${color}-inverse`); const PresetStatusColorTypes = exports.PresetStatusColorTypes = ['success', 'processing', 'error', 'default', 'warning']; /** * determine if the color keyword belongs to the `Ant Design` {@link PresetColors}. * @param color color to be judged * @param includeInverse whether to include reversed colors */ function isPresetColor(color, includeInverse = true) { if (includeInverse) { return [].concat((0, _toConsumableArray2.default)(inverseColors), (0, _toConsumableArray2.default)(_interface.PresetColors)).includes(color); } return _interface.PresetColors.includes(color); } function isPresetStatusColor(color) { return PresetStatusColorTypes.includes(color); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/convertToTooltipProps.js": /*!*********************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/convertToTooltipProps.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _react = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); function convertToTooltipProps(tooltip) { // isNil if (tooltip === undefined || tooltip === null) { return null; } if (typeof tooltip === 'object' && ! /*#__PURE__*/(0, _react.isValidElement)(tooltip)) { return tooltip; } return { title: tooltip }; } var _default = exports["default"] = convertToTooltipProps; /***/ }), /***/ "../../../node_modules/antd/lib/_util/easings.js": /*!*******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/easings.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.easeInOutCubic = easeInOutCubic; function easeInOutCubic(t, b, c, d) { const cc = c - b; // biome-ignore lint: it is a common easing function t /= d / 2; if (t < 1) { return cc / 2 * t * t * t + b; } // biome-ignore lint: it is a common easing function return cc / 2 * ((t -= 2) * t * t + 2) + b; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/extendsObject.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/extendsObject.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; function mergeProps(...items) { const ret = {}; items.forEach(item => { if (item) { Object.keys(item).forEach(key => { if (item[key] !== undefined) { ret[key] = item[key]; } }); } }); return ret; } var _default = exports["default"] = mergeProps; /***/ }), /***/ "../../../node_modules/antd/lib/_util/gapSize.js": /*!*******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/gapSize.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.isPresetSize = isPresetSize; exports.isValidGapNumber = isValidGapNumber; function isPresetSize(size) { return ['small', 'middle', 'large'].includes(size); } function isValidGapNumber(size) { if (!size) { // The case of size = 0 is deliberately excluded here, because the default value of the gap attribute in CSS is 0, so if the user passes 0 in, we can directly ignore it. return false; } return typeof size === 'number' && !Number.isNaN(size); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/getAllowClear.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/getAllowClear.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _CloseCircleFilled = _interopRequireDefault(__webpack_require__(/*! @ant-design/icons/CloseCircleFilled */ "../../../node_modules/@ant-design/icons/CloseCircleFilled.js")); const getAllowClear = allowClear => { let mergedAllowClear; if (typeof allowClear === 'object' && (allowClear === null || allowClear === void 0 ? void 0 : allowClear.clearIcon)) { mergedAllowClear = allowClear; } else if (allowClear) { mergedAllowClear = { clearIcon: /*#__PURE__*/_react.default.createElement(_CloseCircleFilled.default, null) }; } return mergedAllowClear; }; var _default = exports["default"] = getAllowClear; /***/ }), /***/ "../../../node_modules/antd/lib/_util/getRenderPropValue.js": /*!******************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/getRenderPropValue.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getRenderPropValue = void 0; const getRenderPropValue = propValue => { if (!propValue) { return null; } return typeof propValue === 'function' ? propValue() : propValue; }; exports.getRenderPropValue = getRenderPropValue; /***/ }), /***/ "../../../node_modules/antd/lib/_util/getScroll.js": /*!*********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/getScroll.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; exports.isWindow = isWindow; function isWindow(obj) { return obj !== null && obj !== undefined && obj === obj.window; } const getScroll = target => { var _a, _b; if (typeof window === 'undefined') { return 0; } let result = 0; if (isWindow(target)) { result = target.pageYOffset; } else if (target instanceof Document) { result = target.documentElement.scrollTop; } else if (target instanceof HTMLElement) { result = target.scrollTop; } else if (target) { // According to the type inference, the `target` is `never` type. // Since we configured the loose mode type checking, and supports mocking the target with such shape below:: // `{ documentElement: { scrollLeft: 200, scrollTop: 400 } }`, // the program may falls into this branch. // Check the corresponding tests for details. Don't sure what is the real scenario this happens. /* biome-ignore lint/complexity/useLiteralKeys: target is a never type */ /* eslint-disable-next-line dot-notation */ result = target['scrollTop']; } if (target && !isWindow(target) && typeof result !== 'number') { result = (_b = ((_a = target.ownerDocument) !== null && _a !== void 0 ? _a : target).documentElement) === null || _b === void 0 ? void 0 : _b.scrollTop; } return result; }; var _default = exports["default"] = getScroll; /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useClosable.js": /*!*****************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useClosable.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useClosable; exports.pickClosable = pickClosable; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _CloseOutlined = _interopRequireDefault(__webpack_require__(/*! @ant-design/icons/CloseOutlined */ "../../../node_modules/@ant-design/icons/CloseOutlined.js")); var _pickAttrs = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/pickAttrs */ "../../../node_modules/rc-util/lib/pickAttrs.js")); var _locale = __webpack_require__(/*! ../../locale */ "../../../node_modules/antd/lib/locale/index.js"); var _en_US = _interopRequireDefault(__webpack_require__(/*! ../../locale/en_US */ "../../../node_modules/antd/lib/locale/en_US.js")); var _extendsObject = _interopRequireDefault(__webpack_require__(/*! ../extendsObject */ "../../../node_modules/antd/lib/_util/extendsObject.js")); function pickClosable(context) { if (!context) { return undefined; } return { closable: context.closable, closeIcon: context.closeIcon }; } /** Convert `closable` and `closeIcon` to config object */ function useClosableConfig(closableCollection) { const { closable, closeIcon } = closableCollection || {}; return _react.default.useMemo(() => { if ( // If `closable`, whatever rest be should be true !closable && (closable === false || closeIcon === false || closeIcon === null)) { return false; } if (closable === undefined && closeIcon === undefined) { return null; } let closableConfig = { closeIcon: typeof closeIcon !== 'boolean' && closeIcon !== null ? closeIcon : undefined }; if (closable && typeof closable === 'object') { closableConfig = Object.assign(Object.assign({}, closableConfig), closable); } return closableConfig; }, [closable, closeIcon]); } /** Use same object to support `useMemo` optimization */ const EmptyFallbackCloseCollection = {}; function useClosable(propCloseCollection, contextCloseCollection, fallbackCloseCollection = EmptyFallbackCloseCollection) { // Align the `props`, `context` `fallback` to config object first const propCloseConfig = useClosableConfig(propCloseCollection); const contextCloseConfig = useClosableConfig(contextCloseCollection); const [contextLocale] = (0, _locale.useLocale)('global', _en_US.default.global); const closeBtnIsDisabled = typeof propCloseConfig !== 'boolean' ? !!(propCloseConfig === null || propCloseConfig === void 0 ? void 0 : propCloseConfig.disabled) : false; const mergedFallbackCloseCollection = _react.default.useMemo(() => Object.assign({ closeIcon: /*#__PURE__*/_react.default.createElement(_CloseOutlined.default, null) }, fallbackCloseCollection), [fallbackCloseCollection]); // Use fallback logic to fill the config const mergedClosableConfig = _react.default.useMemo(() => { // ================ Props First ================ // Skip if prop is disabled if (propCloseConfig === false) { return false; } if (propCloseConfig) { return (0, _extendsObject.default)(mergedFallbackCloseCollection, contextCloseConfig, propCloseConfig); } // =============== Context Second ============== // Skip if context is disabled if (contextCloseConfig === false) { return false; } if (contextCloseConfig) { return (0, _extendsObject.default)(mergedFallbackCloseCollection, contextCloseConfig); } // ============= Fallback Default ============== return !mergedFallbackCloseCollection.closable ? false : mergedFallbackCloseCollection; }, [propCloseConfig, contextCloseConfig, mergedFallbackCloseCollection]); // Calculate the final closeIcon return _react.default.useMemo(() => { if (mergedClosableConfig === false) { return [false, null, closeBtnIsDisabled, {}]; } const { closeIconRender } = mergedFallbackCloseCollection; const { closeIcon } = mergedClosableConfig; let mergedCloseIcon = closeIcon; // Wrap the closeIcon with aria props const ariaOrDataProps = (0, _pickAttrs.default)(mergedClosableConfig, true); if (mergedCloseIcon !== null && mergedCloseIcon !== undefined) { // Wrap the closeIcon if needed if (closeIconRender) { mergedCloseIcon = closeIconRender(closeIcon); } mergedCloseIcon = /*#__PURE__*/_react.default.isValidElement(mergedCloseIcon) ? (/*#__PURE__*/_react.default.cloneElement(mergedCloseIcon, Object.assign({ 'aria-label': contextLocale.close }, ariaOrDataProps))) : (/*#__PURE__*/_react.default.createElement("span", Object.assign({ "aria-label": contextLocale.close }, ariaOrDataProps), mergedCloseIcon)); } return [true, mergedCloseIcon, closeBtnIsDisabled, ariaOrDataProps]; }, [mergedClosableConfig, mergedFallbackCloseCollection]); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useForceUpdate.js": /*!********************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useForceUpdate.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useForceUpdate; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); function useForceUpdate() { const [, forceUpdate] = React.useReducer(x => x + 1, 0); return forceUpdate; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useMergeSemantic/index.js": /*!****************************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useMergeSemantic/index.js ***! \****************************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useMergeSemantic; exports.mergeClassNames = mergeClassNames; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/toConsumableArray.js")); var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); // ========================= ClassNames ========================= function mergeClassNames(schema, ...classNames) { const mergedSchema = schema || {}; return classNames.reduce((acc, cur) => { // Loop keys of the current classNames Object.keys(cur || {}).forEach(key => { const keySchema = mergedSchema[key]; const curVal = cur[key]; if (keySchema && typeof keySchema === 'object') { if (curVal && typeof curVal === 'object') { // Loop fill acc[key] = mergeClassNames(keySchema, acc[key], curVal); } else { // Covert string to object structure const { _default: defaultField } = keySchema; acc[key] = acc[key] || {}; acc[key][defaultField] = (0, _classnames.default)(acc[key][defaultField], curVal); } } else { // Flatten fill acc[key] = (0, _classnames.default)(acc[key], curVal); } }); return acc; }, {}); } function useSemanticClassNames(schema, ...classNames) { return React.useMemo(() => mergeClassNames.apply(void 0, [schema].concat(classNames)), [classNames]); } // =========================== Styles =========================== function useSemanticStyles(...styles) { return React.useMemo(() => { return styles.reduce((acc, cur = {}) => { Object.keys(cur).forEach(key => { acc[key] = Object.assign(Object.assign({}, acc[key]), cur[key]); }); return acc; }, {}); }, [styles]); } // =========================== Export =========================== function fillObjectBySchema(obj, schema) { const newObj = Object.assign({}, obj); Object.keys(schema).forEach(key => { if (key !== '_default') { const nestSchema = schema[key]; const nextValue = newObj[key] || {}; newObj[key] = nestSchema ? fillObjectBySchema(nextValue, nestSchema) : nextValue; } }); return newObj; } /** * Merge classNames and styles from multiple sources. * When `schema` is provided, it will **must** provide the nest object structure. */ function useMergeSemantic(classNamesList, stylesList, schema) { const mergedClassNames = useSemanticClassNames.apply(void 0, [schema].concat((0, _toConsumableArray2.default)(classNamesList))); const mergedStyles = useSemanticStyles.apply(void 0, (0, _toConsumableArray2.default)(stylesList)); return React.useMemo(() => { return [fillObjectBySchema(mergedClassNames, schema), fillObjectBySchema(mergedStyles, schema)]; }, [mergedClassNames, mergedStyles]); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useMultipleSelect.js": /*!***********************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useMultipleSelect.js ***! \***********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useMultipleSelect; var _react = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /** * @title multipleSelect hooks * @description multipleSelect by hold down shift key */ function useMultipleSelect(getKey) { const [prevSelectedIndex, setPrevSelectedIndex] = (0, _react.useState)(null); const multipleSelect = (0, _react.useCallback)((currentSelectedIndex, data, selectedKeys) => { const configPrevSelectedIndex = prevSelectedIndex !== null && prevSelectedIndex !== void 0 ? prevSelectedIndex : currentSelectedIndex; // add/delete the selected range const startIndex = Math.min(configPrevSelectedIndex || 0, currentSelectedIndex); const endIndex = Math.max(configPrevSelectedIndex || 0, currentSelectedIndex); const rangeKeys = data.slice(startIndex, endIndex + 1).map(item => getKey(item)); const shouldSelected = rangeKeys.some(rangeKey => !selectedKeys.has(rangeKey)); const changedKeys = []; rangeKeys.forEach(item => { if (shouldSelected) { if (!selectedKeys.has(item)) { changedKeys.push(item); } selectedKeys.add(item); } else { selectedKeys.delete(item); changedKeys.push(item); } }); setPrevSelectedIndex(shouldSelected ? endIndex : null); return changedKeys; }, [prevSelectedIndex]); const updatePrevSelectedIndex = val => { setPrevSelectedIndex(val); }; return [multipleSelect, updatePrevSelectedIndex]; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/usePatchElement.js": /*!*********************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/usePatchElement.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = usePatchElement; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/toConsumableArray.js")); var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); function usePatchElement() { const [elements, setElements] = React.useState([]); const patchElement = React.useCallback(element => { // append a new element to elements (and create a new ref) setElements(originElements => [].concat((0, _toConsumableArray2.default)(originElements), [element])); // return a function that removes the new element out of elements (and create a new ref) // it works a little like useEffect return () => { setElements(originElements => originElements.filter(ele => ele !== element)); }; }, []); return [elements, patchElement]; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useProxyImperativeHandle.js": /*!******************************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useProxyImperativeHandle.js ***! \******************************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useProxyImperativeHandle; var _react = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); // Proxy the dom ref with `{ nativeElement, otherFn }` type // ref: https://github.com/ant-design/ant-design/discussions/45242 function fillProxy(element, handler) { element._antProxy = element._antProxy || {}; Object.keys(handler).forEach(key => { if (!(key in element._antProxy)) { const ori = element[key]; element._antProxy[key] = ori; element[key] = handler[key]; } }); return element; } function useProxyImperativeHandle(ref, init) { return (0, _react.useImperativeHandle)(ref, () => { const refObj = init(); const { nativeElement } = refObj; if (typeof Proxy !== 'undefined') { return new Proxy(nativeElement, { get(obj, prop) { if (refObj[prop]) { return refObj[prop]; } return Reflect.get(obj, prop); } }); } // Fallback of IE return fillProxy(nativeElement, refObj); }); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useSyncState.js": /*!******************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useSyncState.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useSyncState; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _useForceUpdate = _interopRequireDefault(__webpack_require__(/*! ./useForceUpdate */ "../../../node_modules/antd/lib/_util/hooks/useForceUpdate.js")); function useSyncState(initialValue) { const ref = React.useRef(initialValue); const forceUpdate = (0, _useForceUpdate.default)(); return [() => ref.current, newValue => { ref.current = newValue; // re-render forceUpdate(); }]; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useZIndex.js": /*!***************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useZIndex.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.useZIndex = exports.containerBaseZIndexOffset = exports.consumerBaseZIndexOffset = exports.CONTAINER_MAX_OFFSET = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _useToken = _interopRequireDefault(__webpack_require__(/*! ../../theme/useToken */ "../../../node_modules/antd/lib/theme/useToken.js")); var _warning = __webpack_require__(/*! ../warning */ "../../../node_modules/antd/lib/_util/warning.js"); var _zindexContext = _interopRequireDefault(__webpack_require__(/*! ../zindexContext */ "../../../node_modules/antd/lib/_util/zindexContext.js")); // Z-Index control range // Container: 1000 + offset 100 (max base + 10 * offset = 2000) // Popover: offset 50 // Notification: Container Max zIndex + componentOffset const CONTAINER_OFFSET = 100; const CONTAINER_OFFSET_MAX_COUNT = 10; const CONTAINER_MAX_OFFSET = exports.CONTAINER_MAX_OFFSET = CONTAINER_OFFSET * CONTAINER_OFFSET_MAX_COUNT; /** * Static function will default be the `CONTAINER_MAX_OFFSET`. * But it still may have children component like Select, Dropdown. * So the warning zIndex should exceed the `CONTAINER_MAX_OFFSET`. */ const CONTAINER_MAX_OFFSET_WITH_CHILDREN = CONTAINER_MAX_OFFSET + CONTAINER_OFFSET; const containerBaseZIndexOffset = exports.containerBaseZIndexOffset = { Modal: CONTAINER_OFFSET, Drawer: CONTAINER_OFFSET, Popover: CONTAINER_OFFSET, Popconfirm: CONTAINER_OFFSET, Tooltip: CONTAINER_OFFSET, Tour: CONTAINER_OFFSET, FloatButton: CONTAINER_OFFSET }; const consumerBaseZIndexOffset = exports.consumerBaseZIndexOffset = { SelectLike: 50, Dropdown: 50, DatePicker: 50, Menu: 50, ImagePreview: 1 }; function isContainerType(type) { return type in containerBaseZIndexOffset; } const useZIndex = (componentType, customZIndex) => { const [, token] = (0, _useToken.default)(); const parentZIndex = _react.default.useContext(_zindexContext.default); const isContainer = isContainerType(componentType); let result; if (customZIndex !== undefined) { result = [customZIndex, customZIndex]; } else { let zIndex = parentZIndex !== null && parentZIndex !== void 0 ? parentZIndex : 0; if (isContainer) { zIndex += // Use preset token zIndex by default but not stack when has parent container (parentZIndex ? 0 : token.zIndexPopupBase) + // Container offset containerBaseZIndexOffset[componentType]; } else { zIndex += consumerBaseZIndexOffset[componentType]; } result = [parentZIndex === undefined ? customZIndex : zIndex, zIndex]; } if (true) { const warning = (0, _warning.devUseWarning)(componentType); const maxZIndex = token.zIndexPopupBase + CONTAINER_MAX_OFFSET_WITH_CHILDREN; const currentZIndex = result[0] || 0; true ? warning(customZIndex !== undefined || currentZIndex <= maxZIndex, 'usage', '`zIndex` is over design token `zIndexPopupBase` too much. It may cause unexpected override.') : 0; } return result; }; exports.useZIndex = useZIndex; /***/ }), /***/ "../../../node_modules/antd/lib/_util/isPrimitive.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/isPrimitive.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; const isPrimitive = value => typeof value !== 'object' && typeof value !== 'function' || value === null; var _default = exports["default"] = isPrimitive; /***/ }), /***/ "../../../node_modules/antd/lib/_util/mediaQueryUtil.js": /*!**************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/mediaQueryUtil.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.removeMediaQueryListener = exports.addMediaQueryListener = void 0; const addMediaQueryListener = (mql, handler) => { // Don't delete here, please keep the code compatible if (typeof (mql === null || mql === void 0 ? void 0 : mql.addEventListener) !== 'undefined') { mql.addEventListener('change', handler); } else if (typeof (mql === null || mql === void 0 ? void 0 : mql.addListener) !== 'undefined') { mql.addListener(handler); } }; exports.addMediaQueryListener = addMediaQueryListener; const removeMediaQueryListener = (mql, handler) => { // Don't delete here, please keep the code compatible if (typeof (mql === null || mql === void 0 ? void 0 : mql.removeEventListener) !== 'undefined') { mql.removeEventListener('change', handler); } else if (typeof (mql === null || mql === void 0 ? void 0 : mql.removeListener) !== 'undefined') { mql.removeListener(handler); } }; exports.removeMediaQueryListener = removeMediaQueryListener; /***/ }), /***/ "../../../node_modules/antd/lib/_util/motion.js": /*!******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/motion.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getTransitionName = exports["default"] = void 0; var _configProvider = __webpack_require__(/*! ../config-provider */ "../../../node_modules/antd/lib/config-provider/index.js"); // ================== Collapse Motion ================== const getCollapsedHeight = () => ({ height: 0, opacity: 0 }); const getRealHeight = node => { const { scrollHeight } = node; return { height: scrollHeight, opacity: 1 }; }; const getCurrentHeight = node => ({ height: node ? node.offsetHeight : 0 }); const skipOpacityTransition = (_, event) => (event === null || event === void 0 ? void 0 : event.deadline) === true || event.propertyName === 'height'; const initCollapseMotion = (rootCls = _configProvider.defaultPrefixCls) => ({ motionName: `${rootCls}-motion-collapse`, onAppearStart: getCollapsedHeight, onEnterStart: getCollapsedHeight, onAppearActive: getRealHeight, onEnterActive: getRealHeight, onLeaveStart: getCurrentHeight, onLeaveActive: getCollapsedHeight, onAppearEnd: skipOpacityTransition, onEnterEnd: skipOpacityTransition, onLeaveEnd: skipOpacityTransition, motionDeadline: 500 }); const _SelectPlacements = ['bottomLeft', 'bottomRight', 'topLeft', 'topRight']; const getTransitionName = (rootPrefixCls, motion, transitionName) => { if (transitionName !== undefined) { return transitionName; } return `${rootPrefixCls}-${motion}`; }; exports.getTransitionName = getTransitionName; var _default = exports["default"] = initCollapseMotion; /***/ }), /***/ "../../../node_modules/antd/lib/_util/placements.js": /*!**********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/placements.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = getPlacements; exports.getOverflowOptions = getOverflowOptions; var _placementArrow = __webpack_require__(/*! ../style/placementArrow */ "../../../node_modules/antd/lib/style/placementArrow.js"); function getOverflowOptions(placement, arrowOffset, arrowWidth, autoAdjustOverflow) { if (autoAdjustOverflow === false) { return { adjustX: false, adjustY: false }; } const overflow = autoAdjustOverflow && typeof autoAdjustOverflow === 'object' ? autoAdjustOverflow : {}; const baseOverflow = {}; switch (placement) { case 'top': case 'bottom': baseOverflow.shiftX = arrowOffset.arrowOffsetHorizontal * 2 + arrowWidth; baseOverflow.shiftY = true; baseOverflow.adjustY = true; break; case 'left': case 'right': baseOverflow.shiftY = arrowOffset.arrowOffsetVertical * 2 + arrowWidth; baseOverflow.shiftX = true; baseOverflow.adjustX = true; break; } const mergedOverflow = Object.assign(Object.assign({}, baseOverflow), overflow); // Support auto shift if (!mergedOverflow.shiftX) { mergedOverflow.adjustX = true; } if (!mergedOverflow.shiftY) { mergedOverflow.adjustY = true; } return mergedOverflow; } const PlacementAlignMap = { left: { points: ['cr', 'cl'] }, right: { points: ['cl', 'cr'] }, top: { points: ['bc', 'tc'] }, bottom: { points: ['tc', 'bc'] }, topLeft: { points: ['bl', 'tl'] }, leftTop: { points: ['tr', 'tl'] }, topRight: { points: ['br', 'tr'] }, rightTop: { points: ['tl', 'tr'] }, bottomRight: { points: ['tr', 'br'] }, rightBottom: { points: ['bl', 'br'] }, bottomLeft: { points: ['tl', 'bl'] }, leftBottom: { points: ['br', 'bl'] } }; const ArrowCenterPlacementAlignMap = { topLeft: { points: ['bl', 'tc'] }, leftTop: { points: ['tr', 'cl'] }, topRight: { points: ['br', 'tc'] }, rightTop: { points: ['tl', 'cr'] }, bottomRight: { points: ['tr', 'bc'] }, rightBottom: { points: ['bl', 'cr'] }, bottomLeft: { points: ['tl', 'bc'] }, leftBottom: { points: ['br', 'cl'] } }; const DisableAutoArrowList = new Set(['topLeft', 'topRight', 'bottomLeft', 'bottomRight', 'leftTop', 'leftBottom', 'rightTop', 'rightBottom']); function getPlacements(config) { const { arrowWidth, autoAdjustOverflow, arrowPointAtCenter, offset, borderRadius, visibleFirst } = config; const halfArrowWidth = arrowWidth / 2; const placementMap = {}; Object.keys(PlacementAlignMap).forEach(key => { const template = arrowPointAtCenter && ArrowCenterPlacementAlignMap[key] || PlacementAlignMap[key]; const placementInfo = Object.assign(Object.assign({}, template), { offset: [0, 0], dynamicInset: true }); placementMap[key] = placementInfo; // Disable autoArrow since design is fixed position if (DisableAutoArrowList.has(key)) { placementInfo.autoArrow = false; } // Static offset switch (key) { case 'top': case 'topLeft': case 'topRight': placementInfo.offset[1] = -halfArrowWidth - offset; break; case 'bottom': case 'bottomLeft': case 'bottomRight': placementInfo.offset[1] = halfArrowWidth + offset; break; case 'left': case 'leftTop': case 'leftBottom': placementInfo.offset[0] = -halfArrowWidth - offset; break; case 'right': case 'rightTop': case 'rightBottom': placementInfo.offset[0] = halfArrowWidth + offset; break; } // Dynamic offset const arrowOffset = (0, _placementArrow.getArrowOffsetToken)({ contentRadius: borderRadius, limitVerticalRadius: true }); if (arrowPointAtCenter) { switch (key) { case 'topLeft': case 'bottomLeft': placementInfo.offset[0] = -arrowOffset.arrowOffsetHorizontal - halfArrowWidth; break; case 'topRight': case 'bottomRight': placementInfo.offset[0] = arrowOffset.arrowOffsetHorizontal + halfArrowWidth; break; case 'leftTop': case 'rightTop': placementInfo.offset[1] = -arrowOffset.arrowOffsetHorizontal * 2 + halfArrowWidth; break; case 'leftBottom': case 'rightBottom': placementInfo.offset[1] = arrowOffset.arrowOffsetHorizontal * 2 - halfArrowWidth; break; } } // Overflow placementInfo.overflow = getOverflowOptions(key, arrowOffset, arrowWidth, autoAdjustOverflow); // VisibleFirst if (visibleFirst) { placementInfo.htmlRegion = 'visibleFirst'; } }); return placementMap; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/reactNode.js": /*!*********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/reactNode.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.cloneElement = cloneElement; exports.isFragment = isFragment; exports.replaceElement = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); function isFragment(child) { return child && /*#__PURE__*/_react.default.isValidElement(child) && child.type === _react.default.Fragment; } const replaceElement = (element, replacement, props) => { if (! /*#__PURE__*/_react.default.isValidElement(element)) { return replacement; } return /*#__PURE__*/_react.default.cloneElement(element, typeof props === 'function' ? props(element.props || {}) : props); }; exports.replaceElement = replaceElement; function cloneElement(element, props) { return replaceElement(element, element, props); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/responsiveObserver.js": /*!******************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/responsiveObserver.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.responsiveArray = exports.matchScreen = exports["default"] = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _internal = __webpack_require__(/*! ../theme/internal */ "../../../node_modules/antd/lib/theme/internal.js"); var _mediaQueryUtil = __webpack_require__(/*! ./mediaQueryUtil */ "../../../node_modules/antd/lib/_util/mediaQueryUtil.js"); const responsiveArray = exports.responsiveArray = ['xxl', 'xl', 'lg', 'md', 'sm', 'xs']; const getResponsiveMap = token => ({ xs: `(max-width: ${token.screenXSMax}px)`, sm: `(min-width: ${token.screenSM}px)`, md: `(min-width: ${token.screenMD}px)`, lg: `(min-width: ${token.screenLG}px)`, xl: `(min-width: ${token.screenXL}px)`, xxl: `(min-width: ${token.screenXXL}px)` }); /** * Ensures that the breakpoints token are valid, in good order * For each breakpoint : screenMin <= screen <= screenMax and screenMax <= nextScreenMin */ const validateBreakpoints = token => { const indexableToken = token; const revBreakpoints = [].concat(responsiveArray).reverse(); revBreakpoints.forEach((breakpoint, i) => { const breakpointUpper = breakpoint.toUpperCase(); const screenMin = `screen${breakpointUpper}Min`; const screen = `screen${breakpointUpper}`; if (!(indexableToken[screenMin] <= indexableToken[screen])) { throw new Error(`${screenMin}<=${screen} fails : !(${indexableToken[screenMin]}<=${indexableToken[screen]})`); } if (i < revBreakpoints.length - 1) { const screenMax = `screen${breakpointUpper}Max`; if (!(indexableToken[screen] <= indexableToken[screenMax])) { throw new Error(`${screen}<=${screenMax} fails : !(${indexableToken[screen]}<=${indexableToken[screenMax]})`); } const nextBreakpointUpperMin = revBreakpoints[i + 1].toUpperCase(); const nextScreenMin = `screen${nextBreakpointUpperMin}Min`; if (!(indexableToken[screenMax] <= indexableToken[nextScreenMin])) { throw new Error(`${screenMax}<=${nextScreenMin} fails : !(${indexableToken[screenMax]}<=${indexableToken[nextScreenMin]})`); } } }); return token; }; const matchScreen = (screens, screenSizes) => { if (!screenSizes) { return; } for (const breakpoint of responsiveArray) { if (screens[breakpoint] && (screenSizes === null || screenSizes === void 0 ? void 0 : screenSizes[breakpoint]) !== undefined) { return screenSizes[breakpoint]; } } }; exports.matchScreen = matchScreen; const useResponsiveObserver = () => { const [, token] = (0, _internal.useToken)(); const responsiveMap = getResponsiveMap(validateBreakpoints(token)); // To avoid repeat create instance, we add `useMemo` here. return _react.default.useMemo(() => { const subscribers = new Map(); let subUid = -1; let screens = {}; return { responsiveMap, matchHandlers: {}, dispatch(pointMap) { screens = pointMap; subscribers.forEach(func => func(screens)); return subscribers.size >= 1; }, subscribe(func) { if (!subscribers.size) { this.register(); } subUid += 1; subscribers.set(subUid, func); func(screens); return subUid; }, unsubscribe(paramToken) { subscribers.delete(paramToken); if (!subscribers.size) { this.unregister(); } }, register() { Object.entries(responsiveMap).forEach(([screen, mediaQuery]) => { const listener = ({ matches }) => { this.dispatch(Object.assign(Object.assign({}, screens), { [screen]: matches })); }; const mql = window.matchMedia(mediaQuery); (0, _mediaQueryUtil.addMediaQueryListener)(mql, listener); this.matchHandlers[mediaQuery] = { mql, listener }; listener(mql); }); }, unregister() { Object.values(responsiveMap).forEach(mediaQuery => { const handler = this.matchHandlers[mediaQuery]; (0, _mediaQueryUtil.removeMediaQueryListener)(handler === null || handler === void 0 ? void 0 : handler.mql, handler === null || handler === void 0 ? void 0 : handler.listener); }); subscribers.clear(); } }; }, [token]); }; var _default = exports["default"] = useResponsiveObserver; /***/ }), /***/ "../../../node_modules/antd/lib/_util/scrollTo.js": /*!********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/scrollTo.js ***! \********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = scrollTo; var _raf = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/raf */ "../../../node_modules/rc-util/lib/raf.js")); var _easings = __webpack_require__(/*! ./easings */ "../../../node_modules/antd/lib/_util/easings.js"); var _getScroll = _interopRequireWildcard(__webpack_require__(/*! ./getScroll */ "../../../node_modules/antd/lib/_util/getScroll.js")); function scrollTo(y, options = {}) { const { getContainer = () => window, callback, duration = 450 } = options; const container = getContainer(); const scrollTop = (0, _getScroll.default)(container); const startTime = Date.now(); const frameFunc = () => { const timestamp = Date.now(); const time = timestamp - startTime; const nextScrollTop = (0, _easings.easeInOutCubic)(time > duration ? duration : time, scrollTop, y, duration); if ((0, _getScroll.isWindow)(container)) { container.scrollTo(window.pageXOffset, nextScrollTop); } else if (container instanceof Document || container.constructor.name === 'HTMLDocument') { container.documentElement.scrollTop = nextScrollTop; } else { container.scrollTop = nextScrollTop; } if (time < duration) { (0, _raf.default)(frameFunc); } else if (typeof callback === 'function') { callback(); } }; (0, _raf.default)(frameFunc); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/statusUtils.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/statusUtils.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getMergedStatus = void 0; exports.getStatusClassNames = getStatusClassNames; var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); const _InputStatuses = ['warning', 'error', '']; function getStatusClassNames(prefixCls, status, hasFeedback) { return (0, _classnames.default)({ [`${prefixCls}-status-success`]: status === 'success', [`${prefixCls}-status-warning`]: status === 'warning', [`${prefixCls}-status-error`]: status === 'error', [`${prefixCls}-status-validating`]: status === 'validating', [`${prefixCls}-has-feedback`]: hasFeedback }); } const getMergedStatus = (contextStatus, customStatus) => customStatus || contextStatus; exports.getMergedStatus = getMergedStatus; /***/ }), /***/ "../../../node_modules/antd/lib/_util/styleChecker.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/styleChecker.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.canUseDocElement = void 0; Object.defineProperty(exports, "isStyleSupport", ({ enumerable: true, get: function () { return _styleChecker.isStyleSupport; } })); var _canUseDom = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/Dom/canUseDom */ "../../../node_modules/rc-util/lib/Dom/canUseDom.js")); var _styleChecker = __webpack_require__(/*! rc-util/lib/Dom/styleChecker */ "../../../node_modules/rc-util/lib/Dom/styleChecker.js"); const canUseDocElement = () => (0, _canUseDom.default)() && window.document.documentElement; exports.canUseDocElement = canUseDocElement; /***/ }), /***/ "../../../node_modules/antd/lib/_util/toList.js": /*!******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/toList.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; const toList = (candidate, skipEmpty = false) => { if (skipEmpty && (candidate === undefined || candidate === null)) { return []; } return Array.isArray(candidate) ? candidate : [candidate]; }; var _default = exports["default"] = toList; /***/ }), /***/ "../../../node_modules/antd/lib/_util/warning.js": /*!*******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/warning.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.devUseWarning = exports["default"] = exports.WarningContext = void 0; exports.noop = noop; exports.resetWarned = resetWarned; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _warning = _interopRequireWildcard(__webpack_require__(/*! rc-util/lib/warning */ "../../../node_modules/rc-util/lib/warning.js")); function noop() {} let deprecatedWarnList = null; function resetWarned() { deprecatedWarnList = null; (0, _warning.resetWarned)(); } let warning = noop; if (true) { warning = (valid, component, message) => { (0, _warning.default)(valid, `[antd: ${component}] ${message}`); // StrictMode will inject console which will not throw warning in React 17. if (false) // removed by dead control flow {} }; } const WarningContext = exports.WarningContext = /*#__PURE__*/React.createContext({}); /** * This is a hook but we not named as `useWarning` * since this is only used in development. * We should always wrap this in `if (process.env.NODE_ENV !== 'production')` condition */ const devUseWarning = exports.devUseWarning = true ? component => { const { strict } = React.useContext(WarningContext); const typeWarning = (valid, type, message) => { if (!valid) { if (strict === false && type === 'deprecated') { const existWarning = deprecatedWarnList; if (!deprecatedWarnList) { deprecatedWarnList = {}; } deprecatedWarnList[component] = deprecatedWarnList[component] || []; if (!deprecatedWarnList[component].includes(message || '')) { deprecatedWarnList[component].push(message || ''); } // Warning for the first time if (!existWarning) { console.warn('[antd] There exists deprecated usage in your code:', deprecatedWarnList); } } else { true ? warning(valid, component, message) : 0; } } }; typeWarning.deprecated = (valid, oldProp, newProp, message) => { typeWarning(valid, 'deprecated', `\`${oldProp}\` is deprecated. Please use \`${newProp}\` instead.${message ? ` ${message}` : ''}`); }; return typeWarning; } : 0; var _default = exports["default"] = warning; /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/WaveEffect.js": /*!***************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/WaveEffect.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); var _rcMotion = _interopRequireDefault(__webpack_require__(/*! rc-motion */ "../../../node_modules/rc-motion/es/index.js")); var _raf = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/raf */ "../../../node_modules/rc-util/lib/raf.js")); var _ref = __webpack_require__(/*! rc-util/lib/ref */ "../../../node_modules/rc-util/lib/ref.js"); var _UnstableContext = __webpack_require__(/*! ../../config-provider/UnstableContext */ "../../../node_modules/antd/lib/config-provider/UnstableContext.js"); var _interface = __webpack_require__(/*! ./interface */ "../../../node_modules/antd/lib/_util/wave/interface.js"); var _util = __webpack_require__(/*! ./util */ "../../../node_modules/antd/lib/_util/wave/util.js"); function validateNum(value) { return Number.isNaN(value) ? 0 : value; } const WaveEffect = props => { const { className, target, component, registerUnmount } = props; const divRef = React.useRef(null); // ====================== Refs ====================== const unmountRef = React.useRef(null); React.useEffect(() => { unmountRef.current = registerUnmount(); }, []); // ===================== Effect ===================== const [color, setWaveColor] = React.useState(null); const [borderRadius, setBorderRadius] = React.useState([]); const [left, setLeft] = React.useState(0); const [top, setTop] = React.useState(0); const [width, setWidth] = React.useState(0); const [height, setHeight] = React.useState(0); const [enabled, setEnabled] = React.useState(false); const waveStyle = { left, top, width, height, borderRadius: borderRadius.map(radius => `${radius}px`).join(' ') }; if (color) { waveStyle['--wave-color'] = color; } function syncPos() { const nodeStyle = getComputedStyle(target); // Get wave color from target setWaveColor((0, _util.getTargetWaveColor)(target)); const isStatic = nodeStyle.position === 'static'; // Rect const { borderLeftWidth, borderTopWidth } = nodeStyle; setLeft(isStatic ? target.offsetLeft : validateNum(-parseFloat(borderLeftWidth))); setTop(isStatic ? target.offsetTop : validateNum(-parseFloat(borderTopWidth))); setWidth(target.offsetWidth); setHeight(target.offsetHeight); // Get border radius const { borderTopLeftRadius, borderTopRightRadius, borderBottomLeftRadius, borderBottomRightRadius } = nodeStyle; setBorderRadius([borderTopLeftRadius, borderTopRightRadius, borderBottomRightRadius, borderBottomLeftRadius].map(radius => validateNum(parseFloat(radius)))); } React.useEffect(() => { if (target) { // We need delay to check position here // since UI may change after click const id = (0, _raf.default)(() => { syncPos(); setEnabled(true); }); // Add resize observer to follow size let resizeObserver; if (typeof ResizeObserver !== 'undefined') { resizeObserver = new ResizeObserver(syncPos); resizeObserver.observe(target); } return () => { _raf.default.cancel(id); resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.disconnect(); }; } }, []); if (!enabled) { return null; } const isSmallComponent = (component === 'Checkbox' || component === 'Radio') && (target === null || target === void 0 ? void 0 : target.classList.contains(_interface.TARGET_CLS)); return /*#__PURE__*/React.createElement(_rcMotion.default, { visible: true, motionAppear: true, motionName: "wave-motion", motionDeadline: 5000, onAppearEnd: (_, event) => { var _a, _b; if (event.deadline || event.propertyName === 'opacity') { const holder = (_a = divRef.current) === null || _a === void 0 ? void 0 : _a.parentElement; (_b = unmountRef.current) === null || _b === void 0 ? void 0 : _b.call(unmountRef).then(() => { holder === null || holder === void 0 ? void 0 : holder.remove(); }); } return false; } }, ({ className: motionClassName }, ref) => (/*#__PURE__*/React.createElement("div", { ref: (0, _ref.composeRef)(divRef, ref), className: (0, _classnames.default)(className, motionClassName, { 'wave-quick': isSmallComponent }), style: waveStyle }))); }; const showWaveEffect = (target, info) => { var _a; const { component } = info; // Skip for unchecked checkbox if (component === 'Checkbox' && !((_a = target.querySelector('input')) === null || _a === void 0 ? void 0 : _a.checked)) { return; } // Create holder const holder = document.createElement('div'); holder.style.position = 'absolute'; holder.style.left = '0px'; holder.style.top = '0px'; target === null || target === void 0 ? void 0 : target.insertBefore(holder, target === null || target === void 0 ? void 0 : target.firstChild); const reactRender = (0, _UnstableContext.unstableSetRender)(); let unmountCallback = null; function registerUnmount() { return unmountCallback; } unmountCallback = reactRender(/*#__PURE__*/React.createElement(WaveEffect, Object.assign({}, info, { target: target, registerUnmount: registerUnmount })), holder); }; var _default = exports["default"] = showWaveEffect; /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/index.js": /*!**********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/index.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); var _isVisible = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/Dom/isVisible */ "../../../node_modules/rc-util/lib/Dom/isVisible.js")); var _ref = __webpack_require__(/*! rc-util/lib/ref */ "../../../node_modules/rc-util/lib/ref.js"); var _configProvider = __webpack_require__(/*! ../../config-provider */ "../../../node_modules/antd/lib/config-provider/index.js"); var _reactNode = __webpack_require__(/*! ../reactNode */ "../../../node_modules/antd/lib/_util/reactNode.js"); var _style = _interopRequireDefault(__webpack_require__(/*! ./style */ "../../../node_modules/antd/lib/_util/wave/style.js")); var _useWave = _interopRequireDefault(__webpack_require__(/*! ./useWave */ "../../../node_modules/antd/lib/_util/wave/useWave.js")); const Wave = props => { const { children, disabled, component } = props; const { getPrefixCls } = (0, _react.useContext)(_configProvider.ConfigContext); const containerRef = (0, _react.useRef)(null); // ============================== Style =============================== const prefixCls = getPrefixCls('wave'); const [, hashId] = (0, _style.default)(prefixCls); // =============================== Wave =============================== const showWave = (0, _useWave.default)(containerRef, (0, _classnames.default)(prefixCls, hashId), component); // ============================== Effect ============================== _react.default.useEffect(() => { const node = containerRef.current; if (!node || node.nodeType !== 1 || disabled) { return; } // Click handler const onClick = e => { // Fix radio button click twice if (!(0, _isVisible.default)(e.target) || // No need wave !node.getAttribute || node.getAttribute('disabled') || node.disabled || node.className.includes('disabled') || node.className.includes('-leave')) { return; } showWave(e); }; // Bind events node.addEventListener('click', onClick, true); return () => { node.removeEventListener('click', onClick, true); }; }, [disabled]); // ============================== Render ============================== if (! /*#__PURE__*/_react.default.isValidElement(children)) { return children !== null && children !== void 0 ? children : null; } const ref = (0, _ref.supportRef)(children) ? (0, _ref.composeRef)((0, _ref.getNodeRef)(children), containerRef) : containerRef; return (0, _reactNode.cloneElement)(children, { ref }); }; if (true) { Wave.displayName = 'Wave'; } var _default = exports["default"] = Wave; /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/interface.js": /*!**************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/interface.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.TARGET_CLS = void 0; var _configProvider = __webpack_require__(/*! ../../config-provider */ "../../../node_modules/antd/lib/config-provider/index.js"); const TARGET_CLS = exports.TARGET_CLS = `${_configProvider.defaultPrefixCls}-wave-target`; /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/style.js": /*!**********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/style.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _internal = __webpack_require__(/*! ../../theme/internal */ "../../../node_modules/antd/lib/theme/internal.js"); const genWaveStyle = token => { const { componentCls, colorPrimary } = token; return { [componentCls]: { position: 'absolute', background: 'transparent', pointerEvents: 'none', boxSizing: 'border-box', color: `var(--wave-color, ${colorPrimary})`, boxShadow: `0 0 0 0 currentcolor`, opacity: 0.2, // =================== Motion =================== '&.wave-motion-appear': { transition: [`box-shadow 0.4s ${token.motionEaseOutCirc}`, `opacity 2s ${token.motionEaseOutCirc}`].join(','), '&-active': { boxShadow: `0 0 0 6px currentcolor`, opacity: 0 }, '&.wave-quick': { transition: [`box-shadow ${token.motionDurationSlow} ${token.motionEaseInOut}`, `opacity ${token.motionDurationSlow} ${token.motionEaseInOut}`].join(',') } } } }; }; var _default = exports["default"] = (0, _internal.genComponentStyleHook)('Wave', token => [genWaveStyle(token)]); /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/useWave.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/useWave.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _useEvent = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/hooks/useEvent */ "../../../node_modules/rc-util/lib/hooks/useEvent.js")); var _raf = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/raf */ "../../../node_modules/rc-util/lib/raf.js")); var _configProvider = __webpack_require__(/*! ../../config-provider */ "../../../node_modules/antd/lib/config-provider/index.js"); var _useToken = _interopRequireDefault(__webpack_require__(/*! ../../theme/useToken */ "../../../node_modules/antd/lib/theme/useToken.js")); var _interface = __webpack_require__(/*! ./interface */ "../../../node_modules/antd/lib/_util/wave/interface.js"); var _WaveEffect = _interopRequireDefault(__webpack_require__(/*! ./WaveEffect */ "../../../node_modules/antd/lib/_util/wave/WaveEffect.js")); const useWave = (nodeRef, className, component) => { const { wave } = React.useContext(_configProvider.ConfigContext); const [, token, hashId] = (0, _useToken.default)(); const showWave = (0, _useEvent.default)(event => { const node = nodeRef.current; if ((wave === null || wave === void 0 ? void 0 : wave.disabled) || !node) { return; } const targetNode = node.querySelector(`.${_interface.TARGET_CLS}`) || node; const { showEffect } = wave || {}; // Customize wave effect (showEffect || _WaveEffect.default)(targetNode, { className, token, component, event, hashId }); }); const rafId = React.useRef(null); // Merge trigger event into one for each frame const showDebounceWave = event => { _raf.default.cancel(rafId.current); rafId.current = (0, _raf.default)(() => { showWave(event); }); }; return showDebounceWave; }; var _default = exports["default"] = useWave; /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/util.js": /*!*********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/util.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getTargetWaveColor = getTargetWaveColor; exports.isValidWaveColor = isValidWaveColor; function isValidWaveColor(color) { return color && color !== '#fff' && color !== '#ffffff' && color !== 'rgb(255, 255, 255)' && color !== 'rgba(255, 255, 255, 1)' && !/rgba\((?:\d*, ){3}0\)/.test(color) && // any transparent rgba color color !== 'transparent'; } function getTargetWaveColor(node) { const { borderTopColor, borderColor, backgroundColor } = getComputedStyle(node); if (isValidWaveColor(borderTopColor)) { return borderTopColor; } if (isValidWaveColor(borderColor)) { return borderColor; } if (isValidWaveColor(backgroundColor)) { return backgroundColor; } return null; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/zindexContext.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/zindexContext.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); const zIndexContext = /*#__PURE__*/_react.default.createContext(undefined); if (true) { zIndexContext.displayName = 'zIndexContext'; } var _default = exports["default"] = zIndexContext; /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfYW50ZF9saWJfX3V0aWxfQWN0aW9uQnV0dG9uX2pzLW5vZGVfbW9kdWxlc19hbnRkX2xpYl9fdXRpbF9Db250ZXh0SXNvbGF0LWY4M2Y4OC52b2x1bnRlZXJhcGkuZTdjMDRkZWQ2ZTcwZmQzYTBjZDQuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFhO0FBQ2I7O0FBRUEsNkJBQTZCLDZKQUErRDtBQUM1Riw4QkFBOEIsK0pBQWdFO0FBQzlGLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQztBQUNGLGtCQUFlO0FBQ2Ysb0NBQW9DLG1CQUFPLENBQUMsbURBQU87QUFDbkQsdUNBQXVDLG1CQUFPLENBQUMsdUZBQTRCO0FBQzNFLHFDQUFxQyxtQkFBTyxDQUFDLGlFQUFXO0FBQ3hELHFCQUFxQixtQkFBTyxDQUFDLHVGQUF5QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkU7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDOzs7Ozs7Ozs7O0FDNUJhOztBQUViLDZCQUE2Qiw2SkFBK0Q7QUFDNUYsOENBQTZDO0FBQzdDO0FBQ0EsQ0FBQyxFQUFDO0FBQ0Ysa0JBQWU7QUFDZixvQ0FBb0MsbUJBQU8sQ0FBQyxtREFBTztBQUNuRDtBQUNBLElBQUksSUFBcUM7QUFDekM7QUFDQTtBQUNBLGVBQWUsa0JBQWUsaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9BY3Rpb25CdXR0b24uanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvQ29udGV4dElzb2xhdG9yLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL1B1cmVQYW5lbC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9jYXBpdGFsaXplLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2NvbG9ycy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9jb252ZXJ0VG9Ub29sdGlwUHJvcHMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvZWFzaW5ncy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9leHRlbmRzT2JqZWN0LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2dhcFNpemUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvZ2V0QWxsb3dDbGVhci5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9nZXRSZW5kZXJQcm9wVmFsdWUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvZ2V0U2Nyb2xsLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2hvb2tzL3VzZUNsb3NhYmxlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2hvb2tzL3VzZUZvcmNlVXBkYXRlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2hvb2tzL3VzZU1lcmdlU2VtYW50aWMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvaG9va3MvdXNlTXVsdGlwbGVTZWxlY3QuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvaG9va3MvdXNlUGF0Y2hFbGVtZW50LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2hvb2tzL3VzZVByb3h5SW1wZXJhdGl2ZUhhbmRsZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9ob29rcy91c2VTeW5jU3RhdGUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvaG9va3MvdXNlWkluZGV4LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2lzUHJpbWl0aXZlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL21lZGlhUXVlcnlVdGlsLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL21vdGlvbi5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9wbGFjZW1lbnRzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3JlYWN0Tm9kZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9yZXNwb25zaXZlT2JzZXJ2ZXIuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvc2Nyb2xsVG8uanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvc3RhdHVzVXRpbHMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvc3R5bGVDaGVja2VyLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3RvTGlzdC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC93YXJuaW5nLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3dhdmUvV2F2ZUVmZmVjdC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC93YXZlL2luZGV4LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3dhdmUvaW50ZXJmYWNlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3dhdmUvc3R5bGUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvd2F2ZS91c2VXYXZlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3dhdmUvdXRpbC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC96aW5kZXhDb250ZXh0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfdXNlU3RhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9ob29rcy91c2VTdGF0ZVwiKSk7XG52YXIgX2J1dHRvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2J1dHRvblwiKSk7XG52YXIgX2J1dHRvbkhlbHBlcnMgPSByZXF1aXJlKFwiLi4vYnV0dG9uL2J1dHRvbkhlbHBlcnNcIik7XG5mdW5jdGlvbiBpc1RoZW5hYmxlKHRoaW5nKSB7XG4gIHJldHVybiAhISh0aGluZyA9PT0gbnVsbCB8fCB0aGluZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGhpbmcudGhlbik7XG59XG5jb25zdCBBY3Rpb25CdXR0b24gPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIGNoaWxkcmVuLFxuICAgIHByZWZpeENscyxcbiAgICBidXR0b25Qcm9wcyxcbiAgICBjbG9zZSxcbiAgICBhdXRvRm9jdXMsXG4gICAgZW1pdEV2ZW50LFxuICAgIGlzU2lsZW50LFxuICAgIHF1aXRPbk51bGxpc2hSZXR1cm5WYWx1ZSxcbiAgICBhY3Rpb25GblxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGNsaWNrZWRSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBidXR0b25SZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9ICgwLCBfdXNlU3RhdGUuZGVmYXVsdCkoZmFsc2UpO1xuICBjb25zdCBvbkludGVybmFsQ2xvc2UgPSAoLi4uYXJncykgPT4ge1xuICAgIGNsb3NlID09PSBudWxsIHx8IGNsb3NlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbG9zZS5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICB9O1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCB0aW1lb3V0SWQgPSBudWxsO1xuICAgIGlmIChhdXRvRm9jdXMpIHtcbiAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IGJ1dHRvblJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZm9jdXMoe1xuICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmICh0aW1lb3V0SWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW10pO1xuICBjb25zdCBoYW5kbGVQcm9taXNlT25PayA9IHJldHVyblZhbHVlT2ZPbk9rID0+IHtcbiAgICBpZiAoIWlzVGhlbmFibGUocmV0dXJuVmFsdWVPZk9uT2spKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgcmV0dXJuVmFsdWVPZk9uT2sudGhlbigoLi4uYXJncykgPT4ge1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSwgdHJ1ZSk7XG4gICAgICBvbkludGVybmFsQ2xvc2UuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICAgIGNsaWNrZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH0sIGUgPT4ge1xuICAgICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy82MTgzXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlLCB0cnVlKTtcbiAgICAgIGNsaWNrZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgLy8gRG8gbm90IHRocm93IGlmIGlzIGBhd2FpdGAgbW9kZVxuICAgICAgaWYgKGlzU2lsZW50ID09PSBudWxsIHx8IGlzU2lsZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpc1NpbGVudCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcbiAgICB9KTtcbiAgfTtcbiAgY29uc3Qgb25DbGljayA9IGUgPT4ge1xuICAgIGlmIChjbGlja2VkUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2xpY2tlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICBpZiAoIWFjdGlvbkZuKSB7XG4gICAgICBvbkludGVybmFsQ2xvc2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHJldHVyblZhbHVlT2ZPbk9rO1xuICAgIGlmIChlbWl0RXZlbnQpIHtcbiAgICAgIHJldHVyblZhbHVlT2ZPbk9rID0gYWN0aW9uRm4oZSk7XG4gICAgICBpZiAocXVpdE9uTnVsbGlzaFJldHVyblZhbHVlICYmICFpc1RoZW5hYmxlKHJldHVyblZhbHVlT2ZPbk9rKSkge1xuICAgICAgICBjbGlja2VkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgb25JbnRlcm5hbENsb3NlKGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhY3Rpb25Gbi5sZW5ndGgpIHtcbiAgICAgIHJldHVyblZhbHVlT2ZPbk9rID0gYWN0aW9uRm4oY2xvc2UpO1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjMzNThcbiAgICAgIGNsaWNrZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5WYWx1ZU9mT25PayA9IGFjdGlvbkZuKCk7XG4gICAgICBpZiAoIWlzVGhlbmFibGUocmV0dXJuVmFsdWVPZk9uT2spKSB7XG4gICAgICAgIG9uSW50ZXJuYWxDbG9zZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGhhbmRsZVByb21pc2VPbk9rKHJldHVyblZhbHVlT2ZPbk9rKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9idXR0b24uZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgKDAsIF9idXR0b25IZWxwZXJzLmNvbnZlcnRMZWdhY3lQcm9wcykodHlwZSksIHtcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIGxvYWRpbmc6IGxvYWRpbmcsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHNcbiAgfSwgYnV0dG9uUHJvcHMsIHtcbiAgICByZWY6IGJ1dHRvblJlZlxuICB9KSwgY2hpbGRyZW4pO1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IEFjdGlvbkJ1dHRvbjsiLCJcInVzZSBzdHJpY3RcIjtcblwidXNlIGNsaWVudFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX2NvbnRleHQgPSByZXF1aXJlKFwiLi4vZm9ybS9jb250ZXh0XCIpO1xudmFyIF9Db21wYWN0ID0gcmVxdWlyZShcIi4uL3NwYWNlL0NvbXBhY3RcIik7XG5jb25zdCBDb250ZXh0SXNvbGF0b3IgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICBzcGFjZSxcbiAgICBmb3JtLFxuICAgIGNoaWxkcmVuXG4gIH0gPSBwcm9wcztcbiAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQgfHwgY2hpbGRyZW4gPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBsZXQgcmVzdWx0ID0gY2hpbGRyZW47XG4gIGlmIChmb3JtKSB7XG4gICAgcmVzdWx0ID0gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX2NvbnRleHQuTm9Gb3JtU3R5bGUsIHtcbiAgICAgIG92ZXJyaWRlOiB0cnVlLFxuICAgICAgc3RhdHVzOiB0cnVlXG4gICAgfSwgcmVzdWx0KTtcbiAgfVxuICBpZiAoc3BhY2UpIHtcbiAgICByZXN1bHQgPSAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfQ29tcGFjdC5Ob0NvbXBhY3RTdHlsZSwgbnVsbCwgcmVzdWx0KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IENvbnRleHRJc29sYXRvcjsiLCJcInVzZSBzdHJpY3RcIjtcblwidXNlIGNsaWVudFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbmV4cG9ydHMud2l0aFB1cmVSZW5kZXJUaGVtZSA9IHdpdGhQdXJlUmVuZGVyVGhlbWU7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF91c2VNZXJnZWRTdGF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCIpKTtcbnZhciBfY29uZmlnUHJvdmlkZXIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpKTtcbmZ1bmN0aW9uIHdpdGhQdXJlUmVuZGVyVGhlbWUoQ29tcG9uZW50KSB7XG4gIHJldHVybiBwcm9wcyA9PiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NvbmZpZ1Byb3ZpZGVyLmRlZmF1bHQsIHtcbiAgICB0aGVtZToge1xuICAgICAgdG9rZW46IHtcbiAgICAgICAgbW90aW9uOiBmYWxzZSxcbiAgICAgICAgekluZGV4UG9wdXBCYXNlOiAwXG4gICAgICB9XG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSkpKTtcbn1cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5jb25zdCBnZW5QdXJlUGFuZWwgPSAoQ29tcG9uZW50LCBhbGlnblByb3BOYW1lLCBwb3N0UHJvcHMsIGRlZmF1bHRQcmVmaXhDbHMsIGdldERyb3Bkb3duQ2xzKSA9PiB7XG4gIGNvbnN0IFB1cmVQYW5lbCA9IHByb3BzID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVByZWZpeENscyxcbiAgICAgIHN0eWxlXG4gICAgfSA9IHByb3BzO1xuICAgIGNvbnN0IGhvbGRlclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCBbcG9wdXBIZWlnaHQsIHNldFBvcHVwSGVpZ2h0XSA9IFJlYWN0LnVzZVN0YXRlKDApO1xuICAgIGNvbnN0IFtwb3B1cFdpZHRoLCBzZXRQb3B1cFdpZHRoXSA9IFJlYWN0LnVzZVN0YXRlKDApO1xuICAgIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9ICgwLCBfdXNlTWVyZ2VkU3RhdGUuZGVmYXVsdCkoZmFsc2UsIHtcbiAgICAgIHZhbHVlOiBwcm9wcy5vcGVuXG4gICAgfSk7XG4gICAgY29uc3Qge1xuICAgICAgZ2V0UHJlZml4Q2xzXG4gICAgfSA9IFJlYWN0LnVzZUNvbnRleHQoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpO1xuICAgIGNvbnN0IHByZWZpeENscyA9IGdldFByZWZpeENscyhkZWZhdWx0UHJlZml4Q2xzIHx8ICdzZWxlY3QnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAvLyBXZSBkbyBub3QgY2FyZSBhYm91dCBzc3JcbiAgICAgIHNldE9wZW4odHJ1ZSk7XG4gICAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZW50cmllc1swXS50YXJnZXQ7XG4gICAgICAgICAgc2V0UG9wdXBIZWlnaHQoZWxlbWVudC5vZmZzZXRIZWlnaHQgKyA4KTtcbiAgICAgICAgICBzZXRQb3B1cFdpZHRoKGVsZW1lbnQub2Zmc2V0V2lkdGgpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ2xzID0gZ2V0RHJvcGRvd25DbHMgPyBgLiR7Z2V0RHJvcGRvd25DbHMocHJlZml4Q2xzKX1gIDogYC4ke3ByZWZpeENsc30tZHJvcGRvd25gO1xuICAgICAgICAgIGNvbnN0IHBvcHVwID0gKF9hID0gaG9sZGVyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5xdWVyeVNlbGVjdG9yKGRyb3Bkb3duQ2xzKTtcbiAgICAgICAgICBpZiAocG9wdXApIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShwb3B1cCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMCk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sIFtdKTtcbiAgICBsZXQgbWVyZ2VkUHJvcHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSwge1xuICAgICAgc3R5bGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3R5bGUpLCB7XG4gICAgICAgIG1hcmdpbjogMFxuICAgICAgfSksXG4gICAgICBvcGVuLFxuICAgICAgdmlzaWJsZTogb3BlbixcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyOiAoKSA9PiBob2xkZXJSZWYuY3VycmVudFxuICAgIH0pO1xuICAgIGlmIChwb3N0UHJvcHMpIHtcbiAgICAgIG1lcmdlZFByb3BzID0gcG9zdFByb3BzKG1lcmdlZFByb3BzKTtcbiAgICB9XG4gICAgaWYgKGFsaWduUHJvcE5hbWUpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24obWVyZ2VkUHJvcHMsIHtcbiAgICAgICAgW2FsaWduUHJvcE5hbWVdOiB7XG4gICAgICAgICAgb3ZlcmZsb3c6IHtcbiAgICAgICAgICAgIGFkanVzdFg6IGZhbHNlLFxuICAgICAgICAgICAgYWRqdXN0WTogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBtZXJnZWRTdHlsZSA9IHtcbiAgICAgIHBhZGRpbmdCb3R0b206IHBvcHVwSGVpZ2h0LFxuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICBtaW5XaWR0aDogcG9wdXBXaWR0aFxuICAgIH07XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHJlZjogaG9sZGVyUmVmLFxuICAgICAgc3R5bGU6IG1lcmdlZFN0eWxlXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCBtZXJnZWRQcm9wcykpKTtcbiAgfTtcbiAgcmV0dXJuIHdpdGhQdXJlUmVuZGVyVGhlbWUoUHVyZVBhbmVsKTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZW5QdXJlUGFuZWw7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjYXBpdGFsaXplO1xuZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHIpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBjb25zdCByZXQgPSBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG4gIHJldHVybiByZXQ7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5QcmVzZXRTdGF0dXNDb2xvclR5cGVzID0gdm9pZCAwO1xuZXhwb3J0cy5pc1ByZXNldENvbG9yID0gaXNQcmVzZXRDb2xvcjtcbmV4cG9ydHMuaXNQcmVzZXRTdGF0dXNDb2xvciA9IGlzUHJlc2V0U3RhdHVzQ29sb3I7XG52YXIgX3RvQ29uc3VtYWJsZUFycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIikpO1xudmFyIF9pbnRlcmZhY2UgPSByZXF1aXJlKFwiLi4vdGhlbWUvaW50ZXJmYWNlXCIpO1xuY29uc3QgaW52ZXJzZUNvbG9ycyA9IF9pbnRlcmZhY2UuUHJlc2V0Q29sb3JzLm1hcChjb2xvciA9PiBgJHtjb2xvcn0taW52ZXJzZWApO1xuY29uc3QgUHJlc2V0U3RhdHVzQ29sb3JUeXBlcyA9IGV4cG9ydHMuUHJlc2V0U3RhdHVzQ29sb3JUeXBlcyA9IFsnc3VjY2VzcycsICdwcm9jZXNzaW5nJywgJ2Vycm9yJywgJ2RlZmF1bHQnLCAnd2FybmluZyddO1xuLyoqXG4gKiBkZXRlcm1pbmUgaWYgdGhlIGNvbG9yIGtleXdvcmQgYmVsb25ncyB0byB0aGUgYEFudCBEZXNpZ25gIHtAbGluayBQcmVzZXRDb2xvcnN9LlxuICogQHBhcmFtIGNvbG9yIGNvbG9yIHRvIGJlIGp1ZGdlZFxuICogQHBhcmFtIGluY2x1ZGVJbnZlcnNlIHdoZXRoZXIgdG8gaW5jbHVkZSByZXZlcnNlZCBjb2xvcnNcbiAqL1xuZnVuY3Rpb24gaXNQcmVzZXRDb2xvcihjb2xvciwgaW5jbHVkZUludmVyc2UgPSB0cnVlKSB7XG4gIGlmIChpbmNsdWRlSW52ZXJzZSkge1xuICAgIHJldHVybiBbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoaW52ZXJzZUNvbG9ycyksICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKF9pbnRlcmZhY2UuUHJlc2V0Q29sb3JzKSkuaW5jbHVkZXMoY29sb3IpO1xuICB9XG4gIHJldHVybiBfaW50ZXJmYWNlLlByZXNldENvbG9ycy5pbmNsdWRlcyhjb2xvcik7XG59XG5mdW5jdGlvbiBpc1ByZXNldFN0YXR1c0NvbG9yKGNvbG9yKSB7XG4gIHJldHVybiBQcmVzZXRTdGF0dXNDb2xvclR5cGVzLmluY2x1ZGVzKGNvbG9yKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIik7XG5mdW5jdGlvbiBjb252ZXJ0VG9Ub29sdGlwUHJvcHModG9vbHRpcCkge1xuICAvLyBpc05pbFxuICBpZiAodG9vbHRpcCA9PT0gdW5kZWZpbmVkIHx8IHRvb2x0aXAgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAodHlwZW9mIHRvb2x0aXAgPT09ICdvYmplY3QnICYmICEgLyojX19QVVJFX18qLygwLCBfcmVhY3QuaXNWYWxpZEVsZW1lbnQpKHRvb2x0aXApKSB7XG4gICAgcmV0dXJuIHRvb2x0aXA7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0aXRsZTogdG9vbHRpcFxuICB9O1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gY29udmVydFRvVG9vbHRpcFByb3BzOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5lYXNlSW5PdXRDdWJpYyA9IGVhc2VJbk91dEN1YmljO1xuZnVuY3Rpb24gZWFzZUluT3V0Q3ViaWModCwgYiwgYywgZCkge1xuICBjb25zdCBjYyA9IGMgLSBiO1xuICAvLyBiaW9tZS1pZ25vcmUgbGludDogaXQgaXMgYSBjb21tb24gZWFzaW5nIGZ1bmN0aW9uXG4gIHQgLz0gZCAvIDI7XG4gIGlmICh0IDwgMSkge1xuICAgIHJldHVybiBjYyAvIDIgKiB0ICogdCAqIHQgKyBiO1xuICB9XG4gIC8vIGJpb21lLWlnbm9yZSBsaW50OiBpdCBpcyBhIGNvbW1vbiBlYXNpbmcgZnVuY3Rpb25cbiAgcmV0dXJuIGNjIC8gMiAqICgodCAtPSAyKSAqIHQgKiB0ICsgMikgKyBiO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuZnVuY3Rpb24gbWVyZ2VQcm9wcyguLi5pdGVtcykge1xuICBjb25zdCByZXQgPSB7fTtcbiAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgT2JqZWN0LmtleXMoaXRlbSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoaXRlbVtrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXRba2V5XSA9IGl0ZW1ba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJldDtcbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IG1lcmdlUHJvcHM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmlzUHJlc2V0U2l6ZSA9IGlzUHJlc2V0U2l6ZTtcbmV4cG9ydHMuaXNWYWxpZEdhcE51bWJlciA9IGlzVmFsaWRHYXBOdW1iZXI7XG5mdW5jdGlvbiBpc1ByZXNldFNpemUoc2l6ZSkge1xuICByZXR1cm4gWydzbWFsbCcsICdtaWRkbGUnLCAnbGFyZ2UnXS5pbmNsdWRlcyhzaXplKTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRHYXBOdW1iZXIoc2l6ZSkge1xuICBpZiAoIXNpemUpIHtcbiAgICAvLyBUaGUgY2FzZSBvZiBzaXplID0gMCBpcyBkZWxpYmVyYXRlbHkgZXhjbHVkZWQgaGVyZSwgYmVjYXVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZ2FwIGF0dHJpYnV0ZSBpbiBDU1MgaXMgMCwgc28gaWYgdGhlIHVzZXIgcGFzc2VzIDAgaW4sIHdlIGNhbiBkaXJlY3RseSBpZ25vcmUgaXQuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0eXBlb2Ygc2l6ZSA9PT0gJ251bWJlcicgJiYgIU51bWJlci5pc05hTihzaXplKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblwidXNlIGNsaWVudFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX0Nsb3NlQ2lyY2xlRmlsbGVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2xvc2VDaXJjbGVGaWxsZWRcIikpO1xuY29uc3QgZ2V0QWxsb3dDbGVhciA9IGFsbG93Q2xlYXIgPT4ge1xuICBsZXQgbWVyZ2VkQWxsb3dDbGVhcjtcbiAgaWYgKHR5cGVvZiBhbGxvd0NsZWFyID09PSAnb2JqZWN0JyAmJiAoYWxsb3dDbGVhciA9PT0gbnVsbCB8fCBhbGxvd0NsZWFyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhbGxvd0NsZWFyLmNsZWFySWNvbikpIHtcbiAgICBtZXJnZWRBbGxvd0NsZWFyID0gYWxsb3dDbGVhcjtcbiAgfSBlbHNlIGlmIChhbGxvd0NsZWFyKSB7XG4gICAgbWVyZ2VkQWxsb3dDbGVhciA9IHtcbiAgICAgIGNsZWFySWNvbjogLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX0Nsb3NlQ2lyY2xlRmlsbGVkLmRlZmF1bHQsIG51bGwpXG4gICAgfTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkQWxsb3dDbGVhcjtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZXRBbGxvd0NsZWFyOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRSZW5kZXJQcm9wVmFsdWUgPSB2b2lkIDA7XG5jb25zdCBnZXRSZW5kZXJQcm9wVmFsdWUgPSBwcm9wVmFsdWUgPT4ge1xuICBpZiAoIXByb3BWYWx1ZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB0eXBlb2YgcHJvcFZhbHVlID09PSAnZnVuY3Rpb24nID8gcHJvcFZhbHVlKCkgOiBwcm9wVmFsdWU7XG59O1xuZXhwb3J0cy5nZXRSZW5kZXJQcm9wVmFsdWUgPSBnZXRSZW5kZXJQcm9wVmFsdWU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5leHBvcnRzLmlzV2luZG93ID0gaXNXaW5kb3c7XG5mdW5jdGlvbiBpc1dpbmRvdyhvYmopIHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogPT09IG9iai53aW5kb3c7XG59XG5jb25zdCBnZXRTY3JvbGwgPSB0YXJnZXQgPT4ge1xuICB2YXIgX2EsIF9iO1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBsZXQgcmVzdWx0ID0gMDtcbiAgaWYgKGlzV2luZG93KHRhcmdldCkpIHtcbiAgICByZXN1bHQgPSB0YXJnZXQucGFnZVlPZmZzZXQ7XG4gIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICByZXN1bHQgPSB0YXJnZXQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcbiAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgIHJlc3VsdCA9IHRhcmdldC5zY3JvbGxUb3A7XG4gIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgLy8gQWNjb3JkaW5nIHRvIHRoZSB0eXBlIGluZmVyZW5jZSwgdGhlIGB0YXJnZXRgIGlzIGBuZXZlcmAgdHlwZS5cbiAgICAvLyBTaW5jZSB3ZSBjb25maWd1cmVkIHRoZSBsb29zZSBtb2RlIHR5cGUgY2hlY2tpbmcsIGFuZCBzdXBwb3J0cyBtb2NraW5nIHRoZSB0YXJnZXQgd2l0aCBzdWNoIHNoYXBlIGJlbG93OjpcbiAgICAvLyAgICBgeyBkb2N1bWVudEVsZW1lbnQ6IHsgc2Nyb2xsTGVmdDogMjAwLCBzY3JvbGxUb3A6IDQwMCB9IH1gLFxuICAgIC8vICAgIHRoZSBwcm9ncmFtIG1heSBmYWxscyBpbnRvIHRoaXMgYnJhbmNoLlxuICAgIC8vIENoZWNrIHRoZSBjb3JyZXNwb25kaW5nIHRlc3RzIGZvciBkZXRhaWxzLiBEb24ndCBzdXJlIHdoYXQgaXMgdGhlIHJlYWwgc2NlbmFyaW8gdGhpcyBoYXBwZW5zLlxuICAgIC8qIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvdXNlTGl0ZXJhbEtleXM6IHRhcmdldCBpcyBhIG5ldmVyIHR5cGUgKi8gLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRvdC1ub3RhdGlvbiAqL1xuICAgIHJlc3VsdCA9IHRhcmdldFsnc2Nyb2xsVG9wJ107XG4gIH1cbiAgaWYgKHRhcmdldCAmJiAhaXNXaW5kb3codGFyZ2V0KSAmJiB0eXBlb2YgcmVzdWx0ICE9PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdCA9IChfYiA9ICgoX2EgPSB0YXJnZXQub3duZXJEb2N1bWVudCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGFyZ2V0KS5kb2N1bWVudEVsZW1lbnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5zY3JvbGxUb3A7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZXRTY3JvbGw7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cInVzZSBjbGllbnRcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VDbG9zYWJsZTtcbmV4cG9ydHMucGlja0Nsb3NhYmxlID0gcGlja0Nsb3NhYmxlO1xudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfQ2xvc2VPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Nsb3NlT3V0bGluZWRcIikpO1xudmFyIF9waWNrQXR0cnMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9waWNrQXR0cnNcIikpO1xudmFyIF9sb2NhbGUgPSByZXF1aXJlKFwiLi4vLi4vbG9jYWxlXCIpO1xudmFyIF9lbl9VUyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL2xvY2FsZS9lbl9VU1wiKSk7XG52YXIgX2V4dGVuZHNPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9leHRlbmRzT2JqZWN0XCIpKTtcbmZ1bmN0aW9uIHBpY2tDbG9zYWJsZShjb250ZXh0KSB7XG4gIGlmICghY29udGV4dCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjbG9zYWJsZTogY29udGV4dC5jbG9zYWJsZSxcbiAgICBjbG9zZUljb246IGNvbnRleHQuY2xvc2VJY29uXG4gIH07XG59XG4vKiogQ29udmVydCBgY2xvc2FibGVgIGFuZCBgY2xvc2VJY29uYCB0byBjb25maWcgb2JqZWN0ICovXG5mdW5jdGlvbiB1c2VDbG9zYWJsZUNvbmZpZyhjbG9zYWJsZUNvbGxlY3Rpb24pIHtcbiAgY29uc3Qge1xuICAgIGNsb3NhYmxlLFxuICAgIGNsb3NlSWNvblxuICB9ID0gY2xvc2FibGVDb2xsZWN0aW9uIHx8IHt9O1xuICByZXR1cm4gX3JlYWN0LmRlZmF1bHQudXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKFxuICAgIC8vIElmIGBjbG9zYWJsZWAsIHdoYXRldmVyIHJlc3QgYmUgc2hvdWxkIGJlIHRydWVcbiAgICAhY2xvc2FibGUgJiYgKGNsb3NhYmxlID09PSBmYWxzZSB8fCBjbG9zZUljb24gPT09IGZhbHNlIHx8IGNsb3NlSWNvbiA9PT0gbnVsbCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNsb3NhYmxlID09PSB1bmRlZmluZWQgJiYgY2xvc2VJY29uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBsZXQgY2xvc2FibGVDb25maWcgPSB7XG4gICAgICBjbG9zZUljb246IHR5cGVvZiBjbG9zZUljb24gIT09ICdib29sZWFuJyAmJiBjbG9zZUljb24gIT09IG51bGwgPyBjbG9zZUljb24gOiB1bmRlZmluZWRcbiAgICB9O1xuICAgIGlmIChjbG9zYWJsZSAmJiB0eXBlb2YgY2xvc2FibGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjbG9zYWJsZUNvbmZpZyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY2xvc2FibGVDb25maWcpLCBjbG9zYWJsZSk7XG4gICAgfVxuICAgIHJldHVybiBjbG9zYWJsZUNvbmZpZztcbiAgfSwgW2Nsb3NhYmxlLCBjbG9zZUljb25dKTtcbn1cbi8qKiBVc2Ugc2FtZSBvYmplY3QgdG8gc3VwcG9ydCBgdXNlTWVtb2Agb3B0aW1pemF0aW9uICovXG5jb25zdCBFbXB0eUZhbGxiYWNrQ2xvc2VDb2xsZWN0aW9uID0ge307XG5mdW5jdGlvbiB1c2VDbG9zYWJsZShwcm9wQ2xvc2VDb2xsZWN0aW9uLCBjb250ZXh0Q2xvc2VDb2xsZWN0aW9uLCBmYWxsYmFja0Nsb3NlQ29sbGVjdGlvbiA9IEVtcHR5RmFsbGJhY2tDbG9zZUNvbGxlY3Rpb24pIHtcbiAgLy8gQWxpZ24gdGhlIGBwcm9wc2AsIGBjb250ZXh0YCBgZmFsbGJhY2tgIHRvIGNvbmZpZyBvYmplY3QgZmlyc3RcbiAgY29uc3QgcHJvcENsb3NlQ29uZmlnID0gdXNlQ2xvc2FibGVDb25maWcocHJvcENsb3NlQ29sbGVjdGlvbik7XG4gIGNvbnN0IGNvbnRleHRDbG9zZUNvbmZpZyA9IHVzZUNsb3NhYmxlQ29uZmlnKGNvbnRleHRDbG9zZUNvbGxlY3Rpb24pO1xuICBjb25zdCBbY29udGV4dExvY2FsZV0gPSAoMCwgX2xvY2FsZS51c2VMb2NhbGUpKCdnbG9iYWwnLCBfZW5fVVMuZGVmYXVsdC5nbG9iYWwpO1xuICBjb25zdCBjbG9zZUJ0bklzRGlzYWJsZWQgPSB0eXBlb2YgcHJvcENsb3NlQ29uZmlnICE9PSAnYm9vbGVhbicgPyAhIShwcm9wQ2xvc2VDb25maWcgPT09IG51bGwgfHwgcHJvcENsb3NlQ29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcm9wQ2xvc2VDb25maWcuZGlzYWJsZWQpIDogZmFsc2U7XG4gIGNvbnN0IG1lcmdlZEZhbGxiYWNrQ2xvc2VDb2xsZWN0aW9uID0gX3JlYWN0LmRlZmF1bHQudXNlTWVtbygoKSA9PiBPYmplY3QuYXNzaWduKHtcbiAgICBjbG9zZUljb246IC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9DbG9zZU91dGxpbmVkLmRlZmF1bHQsIG51bGwpXG4gIH0sIGZhbGxiYWNrQ2xvc2VDb2xsZWN0aW9uKSwgW2ZhbGxiYWNrQ2xvc2VDb2xsZWN0aW9uXSk7XG4gIC8vIFVzZSBmYWxsYmFjayBsb2dpYyB0byBmaWxsIHRoZSBjb25maWdcbiAgY29uc3QgbWVyZ2VkQ2xvc2FibGVDb25maWcgPSBfcmVhY3QuZGVmYXVsdC51c2VNZW1vKCgpID0+IHtcbiAgICAvLyA9PT09PT09PT09PT09PT09IFByb3BzIEZpcnN0ID09PT09PT09PT09PT09PT1cbiAgICAvLyBTa2lwIGlmIHByb3AgaXMgZGlzYWJsZWRcbiAgICBpZiAocHJvcENsb3NlQ29uZmlnID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAocHJvcENsb3NlQ29uZmlnKSB7XG4gICAgICByZXR1cm4gKDAsIF9leHRlbmRzT2JqZWN0LmRlZmF1bHQpKG1lcmdlZEZhbGxiYWNrQ2xvc2VDb2xsZWN0aW9uLCBjb250ZXh0Q2xvc2VDb25maWcsIHByb3BDbG9zZUNvbmZpZyk7XG4gICAgfVxuICAgIC8vID09PT09PT09PT09PT09PSBDb250ZXh0IFNlY29uZCA9PT09PT09PT09PT09PVxuICAgIC8vIFNraXAgaWYgY29udGV4dCBpcyBkaXNhYmxlZFxuICAgIGlmIChjb250ZXh0Q2xvc2VDb25maWcgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb250ZXh0Q2xvc2VDb25maWcpIHtcbiAgICAgIHJldHVybiAoMCwgX2V4dGVuZHNPYmplY3QuZGVmYXVsdCkobWVyZ2VkRmFsbGJhY2tDbG9zZUNvbGxlY3Rpb24sIGNvbnRleHRDbG9zZUNvbmZpZyk7XG4gICAgfVxuICAgIC8vID09PT09PT09PT09PT0gRmFsbGJhY2sgRGVmYXVsdCA9PT09PT09PT09PT09PVxuICAgIHJldHVybiAhbWVyZ2VkRmFsbGJhY2tDbG9zZUNvbGxlY3Rpb24uY2xvc2FibGUgPyBmYWxzZSA6IG1lcmdlZEZhbGxiYWNrQ2xvc2VDb2xsZWN0aW9uO1xuICB9LCBbcHJvcENsb3NlQ29uZmlnLCBjb250ZXh0Q2xvc2VDb25maWcsIG1lcmdlZEZhbGxiYWNrQ2xvc2VDb2xsZWN0aW9uXSk7XG4gIC8vIENhbGN1bGF0ZSB0aGUgZmluYWwgY2xvc2VJY29uXG4gIHJldHVybiBfcmVhY3QuZGVmYXVsdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAobWVyZ2VkQ2xvc2FibGVDb25maWcgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gW2ZhbHNlLCBudWxsLCBjbG9zZUJ0bklzRGlzYWJsZWQsIHt9XTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgY2xvc2VJY29uUmVuZGVyXG4gICAgfSA9IG1lcmdlZEZhbGxiYWNrQ2xvc2VDb2xsZWN0aW9uO1xuICAgIGNvbnN0IHtcbiAgICAgIGNsb3NlSWNvblxuICAgIH0gPSBtZXJnZWRDbG9zYWJsZUNvbmZpZztcbiAgICBsZXQgbWVyZ2VkQ2xvc2VJY29uID0gY2xvc2VJY29uO1xuICAgIC8vIFdyYXAgdGhlIGNsb3NlSWNvbiB3aXRoIGFyaWEgcHJvcHNcbiAgICBjb25zdCBhcmlhT3JEYXRhUHJvcHMgPSAoMCwgX3BpY2tBdHRycy5kZWZhdWx0KShtZXJnZWRDbG9zYWJsZUNvbmZpZywgdHJ1ZSk7XG4gICAgaWYgKG1lcmdlZENsb3NlSWNvbiAhPT0gbnVsbCAmJiBtZXJnZWRDbG9zZUljb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gV3JhcCB0aGUgY2xvc2VJY29uIGlmIG5lZWRlZFxuICAgICAgaWYgKGNsb3NlSWNvblJlbmRlcikge1xuICAgICAgICBtZXJnZWRDbG9zZUljb24gPSBjbG9zZUljb25SZW5kZXIoY2xvc2VJY29uKTtcbiAgICAgIH1cbiAgICAgIG1lcmdlZENsb3NlSWNvbiA9IC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5pc1ZhbGlkRWxlbWVudChtZXJnZWRDbG9zZUljb24pID8gKC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jbG9uZUVsZW1lbnQobWVyZ2VkQ2xvc2VJY29uLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgJ2FyaWEtbGFiZWwnOiBjb250ZXh0TG9jYWxlLmNsb3NlXG4gICAgICB9LCBhcmlhT3JEYXRhUHJvcHMpKSkgOiAoLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBcImFyaWEtbGFiZWxcIjogY29udGV4dExvY2FsZS5jbG9zZVxuICAgICAgfSwgYXJpYU9yRGF0YVByb3BzKSwgbWVyZ2VkQ2xvc2VJY29uKSk7XG4gICAgfVxuICAgIHJldHVybiBbdHJ1ZSwgbWVyZ2VkQ2xvc2VJY29uLCBjbG9zZUJ0bklzRGlzYWJsZWQsIGFyaWFPckRhdGFQcm9wc107XG4gIH0sIFttZXJnZWRDbG9zYWJsZUNvbmZpZywgbWVyZ2VkRmFsbGJhY2tDbG9zZUNvbGxlY3Rpb25dKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZUZvcmNlVXBkYXRlO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbmZ1bmN0aW9uIHVzZUZvcmNlVXBkYXRlKCkge1xuICBjb25zdCBbLCBmb3JjZVVwZGF0ZV0gPSBSZWFjdC51c2VSZWR1Y2VyKHggPT4geCArIDEsIDApO1xuICByZXR1cm4gZm9yY2VVcGRhdGU7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlTWVyZ2VTZW1hbnRpYztcbmV4cG9ydHMubWVyZ2VDbGFzc05hbWVzID0gbWVyZ2VDbGFzc05hbWVzO1xudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT0gQ2xhc3NOYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09XG5mdW5jdGlvbiBtZXJnZUNsYXNzTmFtZXMoc2NoZW1hLCAuLi5jbGFzc05hbWVzKSB7XG4gIGNvbnN0IG1lcmdlZFNjaGVtYSA9IHNjaGVtYSB8fCB7fTtcbiAgcmV0dXJuIGNsYXNzTmFtZXMucmVkdWNlKChhY2MsIGN1cikgPT4ge1xuICAgIC8vIExvb3Aga2V5cyBvZiB0aGUgY3VycmVudCBjbGFzc05hbWVzXG4gICAgT2JqZWN0LmtleXMoY3VyIHx8IHt9KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBrZXlTY2hlbWEgPSBtZXJnZWRTY2hlbWFba2V5XTtcbiAgICAgIGNvbnN0IGN1clZhbCA9IGN1cltrZXldO1xuICAgICAgaWYgKGtleVNjaGVtYSAmJiB0eXBlb2Yga2V5U2NoZW1hID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoY3VyVmFsICYmIHR5cGVvZiBjdXJWYWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgLy8gTG9vcCBmaWxsXG4gICAgICAgICAgYWNjW2tleV0gPSBtZXJnZUNsYXNzTmFtZXMoa2V5U2NoZW1hLCBhY2Nba2V5XSwgY3VyVmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBDb3ZlcnQgc3RyaW5nIHRvIG9iamVjdCBzdHJ1Y3R1cmVcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBfZGVmYXVsdDogZGVmYXVsdEZpZWxkXG4gICAgICAgICAgfSA9IGtleVNjaGVtYTtcbiAgICAgICAgICBhY2Nba2V5XSA9IGFjY1trZXldIHx8IHt9O1xuICAgICAgICAgIGFjY1trZXldW2RlZmF1bHRGaWVsZF0gPSAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoYWNjW2tleV1bZGVmYXVsdEZpZWxkXSwgY3VyVmFsKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmxhdHRlbiBmaWxsXG4gICAgICAgIGFjY1trZXldID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGFjY1trZXldLCBjdXJWYWwpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbn1cbmZ1bmN0aW9uIHVzZVNlbWFudGljQ2xhc3NOYW1lcyhzY2hlbWEsIC4uLmNsYXNzTmFtZXMpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gbWVyZ2VDbGFzc05hbWVzLmFwcGx5KHZvaWQgMCwgW3NjaGVtYV0uY29uY2F0KGNsYXNzTmFtZXMpKSwgW2NsYXNzTmFtZXNdKTtcbn1cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdHlsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5mdW5jdGlvbiB1c2VTZW1hbnRpY1N0eWxlcyguLi5zdHlsZXMpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiBzdHlsZXMucmVkdWNlKChhY2MsIGN1ciA9IHt9KSA9PiB7XG4gICAgICBPYmplY3Qua2V5cyhjdXIpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgYWNjW2tleV0gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY1trZXldKSwgY3VyW2tleV0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbiAgfSwgW3N0eWxlc10pO1xufVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IEV4cG9ydCA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmZ1bmN0aW9uIGZpbGxPYmplY3RCeVNjaGVtYShvYmosIHNjaGVtYSkge1xuICBjb25zdCBuZXdPYmogPSBPYmplY3QuYXNzaWduKHt9LCBvYmopO1xuICBPYmplY3Qua2V5cyhzY2hlbWEpLmZvckVhY2goa2V5ID0+IHtcbiAgICBpZiAoa2V5ICE9PSAnX2RlZmF1bHQnKSB7XG4gICAgICBjb25zdCBuZXN0U2NoZW1hID0gc2NoZW1hW2tleV07XG4gICAgICBjb25zdCBuZXh0VmFsdWUgPSBuZXdPYmpba2V5XSB8fCB7fTtcbiAgICAgIG5ld09ialtrZXldID0gbmVzdFNjaGVtYSA/IGZpbGxPYmplY3RCeVNjaGVtYShuZXh0VmFsdWUsIG5lc3RTY2hlbWEpIDogbmV4dFZhbHVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBuZXdPYmo7XG59XG4vKipcbiAqIE1lcmdlIGNsYXNzTmFtZXMgYW5kIHN0eWxlcyBmcm9tIG11bHRpcGxlIHNvdXJjZXMuXG4gKiBXaGVuIGBzY2hlbWFgIGlzIHByb3ZpZGVkLCBpdCB3aWxsICoqbXVzdCoqIHByb3ZpZGUgdGhlIG5lc3Qgb2JqZWN0IHN0cnVjdHVyZS5cbiAqL1xuZnVuY3Rpb24gdXNlTWVyZ2VTZW1hbnRpYyhjbGFzc05hbWVzTGlzdCwgc3R5bGVzTGlzdCwgc2NoZW1hKSB7XG4gIGNvbnN0IG1lcmdlZENsYXNzTmFtZXMgPSB1c2VTZW1hbnRpY0NsYXNzTmFtZXMuYXBwbHkodm9pZCAwLCBbc2NoZW1hXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoY2xhc3NOYW1lc0xpc3QpKSk7XG4gIGNvbnN0IG1lcmdlZFN0eWxlcyA9IHVzZVNlbWFudGljU3R5bGVzLmFwcGx5KHZvaWQgMCwgKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoc3R5bGVzTGlzdCkpO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIFtmaWxsT2JqZWN0QnlTY2hlbWEobWVyZ2VkQ2xhc3NOYW1lcywgc2NoZW1hKSwgZmlsbE9iamVjdEJ5U2NoZW1hKG1lcmdlZFN0eWxlcywgc2NoZW1hKV07XG4gIH0sIFttZXJnZWRDbGFzc05hbWVzLCBtZXJnZWRTdHlsZXNdKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZU11bHRpcGxlU2VsZWN0O1xudmFyIF9yZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcbi8qKlxuICogQHRpdGxlIG11bHRpcGxlU2VsZWN0IGhvb2tzXG4gKiBAZGVzY3JpcHRpb24gbXVsdGlwbGVTZWxlY3QgYnkgaG9sZCBkb3duIHNoaWZ0IGtleVxuICovXG5mdW5jdGlvbiB1c2VNdWx0aXBsZVNlbGVjdChnZXRLZXkpIHtcbiAgY29uc3QgW3ByZXZTZWxlY3RlZEluZGV4LCBzZXRQcmV2U2VsZWN0ZWRJbmRleF0gPSAoMCwgX3JlYWN0LnVzZVN0YXRlKShudWxsKTtcbiAgY29uc3QgbXVsdGlwbGVTZWxlY3QgPSAoMCwgX3JlYWN0LnVzZUNhbGxiYWNrKSgoY3VycmVudFNlbGVjdGVkSW5kZXgsIGRhdGEsIHNlbGVjdGVkS2V5cykgPT4ge1xuICAgIGNvbnN0IGNvbmZpZ1ByZXZTZWxlY3RlZEluZGV4ID0gcHJldlNlbGVjdGVkSW5kZXggIT09IG51bGwgJiYgcHJldlNlbGVjdGVkSW5kZXggIT09IHZvaWQgMCA/IHByZXZTZWxlY3RlZEluZGV4IDogY3VycmVudFNlbGVjdGVkSW5kZXg7XG4gICAgLy8gYWRkL2RlbGV0ZSB0aGUgc2VsZWN0ZWQgcmFuZ2VcbiAgICBjb25zdCBzdGFydEluZGV4ID0gTWF0aC5taW4oY29uZmlnUHJldlNlbGVjdGVkSW5kZXggfHwgMCwgY3VycmVudFNlbGVjdGVkSW5kZXgpO1xuICAgIGNvbnN0IGVuZEluZGV4ID0gTWF0aC5tYXgoY29uZmlnUHJldlNlbGVjdGVkSW5kZXggfHwgMCwgY3VycmVudFNlbGVjdGVkSW5kZXgpO1xuICAgIGNvbnN0IHJhbmdlS2V5cyA9IGRhdGEuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXggKyAxKS5tYXAoaXRlbSA9PiBnZXRLZXkoaXRlbSkpO1xuICAgIGNvbnN0IHNob3VsZFNlbGVjdGVkID0gcmFuZ2VLZXlzLnNvbWUocmFuZ2VLZXkgPT4gIXNlbGVjdGVkS2V5cy5oYXMocmFuZ2VLZXkpKTtcbiAgICBjb25zdCBjaGFuZ2VkS2V5cyA9IFtdO1xuICAgIHJhbmdlS2V5cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaWYgKHNob3VsZFNlbGVjdGVkKSB7XG4gICAgICAgIGlmICghc2VsZWN0ZWRLZXlzLmhhcyhpdGVtKSkge1xuICAgICAgICAgIGNoYW5nZWRLZXlzLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0ZWRLZXlzLmFkZChpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdGVkS2V5cy5kZWxldGUoaXRlbSk7XG4gICAgICAgIGNoYW5nZWRLZXlzLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc2V0UHJldlNlbGVjdGVkSW5kZXgoc2hvdWxkU2VsZWN0ZWQgPyBlbmRJbmRleCA6IG51bGwpO1xuICAgIHJldHVybiBjaGFuZ2VkS2V5cztcbiAgfSwgW3ByZXZTZWxlY3RlZEluZGV4XSk7XG4gIGNvbnN0IHVwZGF0ZVByZXZTZWxlY3RlZEluZGV4ID0gdmFsID0+IHtcbiAgICBzZXRQcmV2U2VsZWN0ZWRJbmRleCh2YWwpO1xuICB9O1xuICByZXR1cm4gW211bHRpcGxlU2VsZWN0LCB1cGRhdGVQcmV2U2VsZWN0ZWRJbmRleF07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlUGF0Y2hFbGVtZW50O1xudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5mdW5jdGlvbiB1c2VQYXRjaEVsZW1lbnQoKSB7XG4gIGNvbnN0IFtlbGVtZW50cywgc2V0RWxlbWVudHNdID0gUmVhY3QudXNlU3RhdGUoW10pO1xuICBjb25zdCBwYXRjaEVsZW1lbnQgPSBSZWFjdC51c2VDYWxsYmFjayhlbGVtZW50ID0+IHtcbiAgICAvLyBhcHBlbmQgYSBuZXcgZWxlbWVudCB0byBlbGVtZW50cyAoYW5kIGNyZWF0ZSBhIG5ldyByZWYpXG4gICAgc2V0RWxlbWVudHMob3JpZ2luRWxlbWVudHMgPT4gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKG9yaWdpbkVsZW1lbnRzKSwgW2VsZW1lbnRdKSk7XG4gICAgLy8gcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCByZW1vdmVzIHRoZSBuZXcgZWxlbWVudCBvdXQgb2YgZWxlbWVudHMgKGFuZCBjcmVhdGUgYSBuZXcgcmVmKVxuICAgIC8vIGl0IHdvcmtzIGEgbGl0dGxlIGxpa2UgdXNlRWZmZWN0XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHNldEVsZW1lbnRzKG9yaWdpbkVsZW1lbnRzID0+IG9yaWdpbkVsZW1lbnRzLmZpbHRlcihlbGUgPT4gZWxlICE9PSBlbGVtZW50KSk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gW2VsZW1lbnRzLCBwYXRjaEVsZW1lbnRdO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlUHJveHlJbXBlcmF0aXZlSGFuZGxlO1xudmFyIF9yZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcbi8vIFByb3h5IHRoZSBkb20gcmVmIHdpdGggYHsgbmF0aXZlRWxlbWVudCwgb3RoZXJGbiB9YCB0eXBlXG4vLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vZGlzY3Vzc2lvbnMvNDUyNDJcblxuZnVuY3Rpb24gZmlsbFByb3h5KGVsZW1lbnQsIGhhbmRsZXIpIHtcbiAgZWxlbWVudC5fYW50UHJveHkgPSBlbGVtZW50Ll9hbnRQcm94eSB8fCB7fTtcbiAgT2JqZWN0LmtleXMoaGFuZGxlcikuZm9yRWFjaChrZXkgPT4ge1xuICAgIGlmICghKGtleSBpbiBlbGVtZW50Ll9hbnRQcm94eSkpIHtcbiAgICAgIGNvbnN0IG9yaSA9IGVsZW1lbnRba2V5XTtcbiAgICAgIGVsZW1lbnQuX2FudFByb3h5W2tleV0gPSBvcmk7XG4gICAgICBlbGVtZW50W2tleV0gPSBoYW5kbGVyW2tleV07XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5mdW5jdGlvbiB1c2VQcm94eUltcGVyYXRpdmVIYW5kbGUocmVmLCBpbml0KSB7XG4gIHJldHVybiAoMCwgX3JlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUpKHJlZiwgKCkgPT4ge1xuICAgIGNvbnN0IHJlZk9iaiA9IGluaXQoKTtcbiAgICBjb25zdCB7XG4gICAgICBuYXRpdmVFbGVtZW50XG4gICAgfSA9IHJlZk9iajtcbiAgICBpZiAodHlwZW9mIFByb3h5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG5ldyBQcm94eShuYXRpdmVFbGVtZW50LCB7XG4gICAgICAgIGdldChvYmosIHByb3ApIHtcbiAgICAgICAgICBpZiAocmVmT2JqW3Byb3BdKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVmT2JqW3Byb3BdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQob2JqLCBwcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIG9mIElFXG4gICAgcmV0dXJuIGZpbGxQcm94eShuYXRpdmVFbGVtZW50LCByZWZPYmopO1xuICB9KTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VTeW5jU3RhdGU7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF91c2VGb3JjZVVwZGF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXNlRm9yY2VVcGRhdGVcIikpO1xuZnVuY3Rpb24gdXNlU3luY1N0YXRlKGluaXRpYWxWYWx1ZSkge1xuICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYoaW5pdGlhbFZhbHVlKTtcbiAgY29uc3QgZm9yY2VVcGRhdGUgPSAoMCwgX3VzZUZvcmNlVXBkYXRlLmRlZmF1bHQpKCk7XG4gIHJldHVybiBbKCkgPT4gcmVmLmN1cnJlbnQsIG5ld1ZhbHVlID0+IHtcbiAgICByZWYuY3VycmVudCA9IG5ld1ZhbHVlO1xuICAgIC8vIHJlLXJlbmRlclxuICAgIGZvcmNlVXBkYXRlKCk7XG4gIH1dO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudXNlWkluZGV4ID0gZXhwb3J0cy5jb250YWluZXJCYXNlWkluZGV4T2Zmc2V0ID0gZXhwb3J0cy5jb25zdW1lckJhc2VaSW5kZXhPZmZzZXQgPSBleHBvcnRzLkNPTlRBSU5FUl9NQVhfT0ZGU0VUID0gdm9pZCAwO1xudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfdXNlVG9rZW4gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi90aGVtZS91c2VUb2tlblwiKSk7XG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKFwiLi4vd2FybmluZ1wiKTtcbnZhciBfemluZGV4Q29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL3ppbmRleENvbnRleHRcIikpO1xuLy8gWi1JbmRleCBjb250cm9sIHJhbmdlXG4vLyBDb250YWluZXI6IDEwMDAgKyBvZmZzZXQgMTAwIChtYXggYmFzZSArIDEwICogb2Zmc2V0ID0gMjAwMClcbi8vIFBvcG92ZXI6IG9mZnNldCA1MFxuLy8gTm90aWZpY2F0aW9uOiBDb250YWluZXIgTWF4IHpJbmRleCArIGNvbXBvbmVudE9mZnNldFxuY29uc3QgQ09OVEFJTkVSX09GRlNFVCA9IDEwMDtcbmNvbnN0IENPTlRBSU5FUl9PRkZTRVRfTUFYX0NPVU5UID0gMTA7XG5jb25zdCBDT05UQUlORVJfTUFYX09GRlNFVCA9IGV4cG9ydHMuQ09OVEFJTkVSX01BWF9PRkZTRVQgPSBDT05UQUlORVJfT0ZGU0VUICogQ09OVEFJTkVSX09GRlNFVF9NQVhfQ09VTlQ7XG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbiB3aWxsIGRlZmF1bHQgYmUgdGhlIGBDT05UQUlORVJfTUFYX09GRlNFVGAuXG4gKiBCdXQgaXQgc3RpbGwgbWF5IGhhdmUgY2hpbGRyZW4gY29tcG9uZW50IGxpa2UgU2VsZWN0LCBEcm9wZG93bi5cbiAqIFNvIHRoZSB3YXJuaW5nIHpJbmRleCBzaG91bGQgZXhjZWVkIHRoZSBgQ09OVEFJTkVSX01BWF9PRkZTRVRgLlxuICovXG5jb25zdCBDT05UQUlORVJfTUFYX09GRlNFVF9XSVRIX0NISUxEUkVOID0gQ09OVEFJTkVSX01BWF9PRkZTRVQgKyBDT05UQUlORVJfT0ZGU0VUO1xuY29uc3QgY29udGFpbmVyQmFzZVpJbmRleE9mZnNldCA9IGV4cG9ydHMuY29udGFpbmVyQmFzZVpJbmRleE9mZnNldCA9IHtcbiAgTW9kYWw6IENPTlRBSU5FUl9PRkZTRVQsXG4gIERyYXdlcjogQ09OVEFJTkVSX09GRlNFVCxcbiAgUG9wb3ZlcjogQ09OVEFJTkVSX09GRlNFVCxcbiAgUG9wY29uZmlybTogQ09OVEFJTkVSX09GRlNFVCxcbiAgVG9vbHRpcDogQ09OVEFJTkVSX09GRlNFVCxcbiAgVG91cjogQ09OVEFJTkVSX09GRlNFVCxcbiAgRmxvYXRCdXR0b246IENPTlRBSU5FUl9PRkZTRVRcbn07XG5jb25zdCBjb25zdW1lckJhc2VaSW5kZXhPZmZzZXQgPSBleHBvcnRzLmNvbnN1bWVyQmFzZVpJbmRleE9mZnNldCA9IHtcbiAgU2VsZWN0TGlrZTogNTAsXG4gIERyb3Bkb3duOiA1MCxcbiAgRGF0ZVBpY2tlcjogNTAsXG4gIE1lbnU6IDUwLFxuICBJbWFnZVByZXZpZXc6IDFcbn07XG5mdW5jdGlvbiBpc0NvbnRhaW5lclR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZSBpbiBjb250YWluZXJCYXNlWkluZGV4T2Zmc2V0O1xufVxuY29uc3QgdXNlWkluZGV4ID0gKGNvbXBvbmVudFR5cGUsIGN1c3RvbVpJbmRleCkgPT4ge1xuICBjb25zdCBbLCB0b2tlbl0gPSAoMCwgX3VzZVRva2VuLmRlZmF1bHQpKCk7XG4gIGNvbnN0IHBhcmVudFpJbmRleCA9IF9yZWFjdC5kZWZhdWx0LnVzZUNvbnRleHQoX3ppbmRleENvbnRleHQuZGVmYXVsdCk7XG4gIGNvbnN0IGlzQ29udGFpbmVyID0gaXNDb250YWluZXJUeXBlKGNvbXBvbmVudFR5cGUpO1xuICBsZXQgcmVzdWx0O1xuICBpZiAoY3VzdG9tWkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXN1bHQgPSBbY3VzdG9tWkluZGV4LCBjdXN0b21aSW5kZXhdO1xuICB9IGVsc2Uge1xuICAgIGxldCB6SW5kZXggPSBwYXJlbnRaSW5kZXggIT09IG51bGwgJiYgcGFyZW50WkluZGV4ICE9PSB2b2lkIDAgPyBwYXJlbnRaSW5kZXggOiAwO1xuICAgIGlmIChpc0NvbnRhaW5lcikge1xuICAgICAgekluZGV4ICs9XG4gICAgICAvLyBVc2UgcHJlc2V0IHRva2VuIHpJbmRleCBieSBkZWZhdWx0IGJ1dCBub3Qgc3RhY2sgd2hlbiBoYXMgcGFyZW50IGNvbnRhaW5lclxuICAgICAgKHBhcmVudFpJbmRleCA/IDAgOiB0b2tlbi56SW5kZXhQb3B1cEJhc2UpICtcbiAgICAgIC8vIENvbnRhaW5lciBvZmZzZXRcbiAgICAgIGNvbnRhaW5lckJhc2VaSW5kZXhPZmZzZXRbY29tcG9uZW50VHlwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHpJbmRleCArPSBjb25zdW1lckJhc2VaSW5kZXhPZmZzZXRbY29tcG9uZW50VHlwZV07XG4gICAgfVxuICAgIHJlc3VsdCA9IFtwYXJlbnRaSW5kZXggPT09IHVuZGVmaW5lZCA/IGN1c3RvbVpJbmRleCA6IHpJbmRleCwgekluZGV4XTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnN0IHdhcm5pbmcgPSAoMCwgX3dhcm5pbmcuZGV2VXNlV2FybmluZykoY29tcG9uZW50VHlwZSk7XG4gICAgY29uc3QgbWF4WkluZGV4ID0gdG9rZW4uekluZGV4UG9wdXBCYXNlICsgQ09OVEFJTkVSX01BWF9PRkZTRVRfV0lUSF9DSElMRFJFTjtcbiAgICBjb25zdCBjdXJyZW50WkluZGV4ID0gcmVzdWx0WzBdIHx8IDA7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhjdXN0b21aSW5kZXggIT09IHVuZGVmaW5lZCB8fCBjdXJyZW50WkluZGV4IDw9IG1heFpJbmRleCwgJ3VzYWdlJywgJ2B6SW5kZXhgIGlzIG92ZXIgZGVzaWduIHRva2VuIGB6SW5kZXhQb3B1cEJhc2VgIHRvbyBtdWNoLiBJdCBtYXkgY2F1c2UgdW5leHBlY3RlZCBvdmVycmlkZS4nKSA6IHZvaWQgMDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydHMudXNlWkluZGV4ID0gdXNlWkluZGV4OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuY29uc3QgaXNQcmltaXRpdmUgPSB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyB8fCB2YWx1ZSA9PT0gbnVsbDtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGlzUHJpbWl0aXZlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5yZW1vdmVNZWRpYVF1ZXJ5TGlzdGVuZXIgPSBleHBvcnRzLmFkZE1lZGlhUXVlcnlMaXN0ZW5lciA9IHZvaWQgMDtcbmNvbnN0IGFkZE1lZGlhUXVlcnlMaXN0ZW5lciA9IChtcWwsIGhhbmRsZXIpID0+IHtcbiAgLy8gRG9uJ3QgZGVsZXRlIGhlcmUsIHBsZWFzZSBrZWVwIHRoZSBjb2RlIGNvbXBhdGlibGVcbiAgaWYgKHR5cGVvZiAobXFsID09PSBudWxsIHx8IG1xbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbXFsLmFkZEV2ZW50TGlzdGVuZXIpICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1xbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBoYW5kbGVyKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgKG1xbCA9PT0gbnVsbCB8fCBtcWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1xbC5hZGRMaXN0ZW5lcikgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgbXFsLmFkZExpc3RlbmVyKGhhbmRsZXIpO1xuICB9XG59O1xuZXhwb3J0cy5hZGRNZWRpYVF1ZXJ5TGlzdGVuZXIgPSBhZGRNZWRpYVF1ZXJ5TGlzdGVuZXI7XG5jb25zdCByZW1vdmVNZWRpYVF1ZXJ5TGlzdGVuZXIgPSAobXFsLCBoYW5kbGVyKSA9PiB7XG4gIC8vIERvbid0IGRlbGV0ZSBoZXJlLCBwbGVhc2Uga2VlcCB0aGUgY29kZSBjb21wYXRpYmxlXG4gIGlmICh0eXBlb2YgKG1xbCA9PT0gbnVsbCB8fCBtcWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1xbC5yZW1vdmVFdmVudExpc3RlbmVyKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBtcWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgaGFuZGxlcik7XG4gIH0gZWxzZSBpZiAodHlwZW9mIChtcWwgPT09IG51bGwgfHwgbXFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtcWwucmVtb3ZlTGlzdGVuZXIpICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1xbC5yZW1vdmVMaXN0ZW5lcihoYW5kbGVyKTtcbiAgfVxufTtcbmV4cG9ydHMucmVtb3ZlTWVkaWFRdWVyeUxpc3RlbmVyID0gcmVtb3ZlTWVkaWFRdWVyeUxpc3RlbmVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRUcmFuc2l0aW9uTmFtZSA9IGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuLy8gPT09PT09PT09PT09PT09PT09IENvbGxhcHNlIE1vdGlvbiA9PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdldENvbGxhcHNlZEhlaWdodCA9ICgpID0+ICh7XG4gIGhlaWdodDogMCxcbiAgb3BhY2l0eTogMFxufSk7XG5jb25zdCBnZXRSZWFsSGVpZ2h0ID0gbm9kZSA9PiB7XG4gIGNvbnN0IHtcbiAgICBzY3JvbGxIZWlnaHRcbiAgfSA9IG5vZGU7XG4gIHJldHVybiB7XG4gICAgaGVpZ2h0OiBzY3JvbGxIZWlnaHQsXG4gICAgb3BhY2l0eTogMVxuICB9O1xufTtcbmNvbnN0IGdldEN1cnJlbnRIZWlnaHQgPSBub2RlID0+ICh7XG4gIGhlaWdodDogbm9kZSA/IG5vZGUub2Zmc2V0SGVpZ2h0IDogMFxufSk7XG5jb25zdCBza2lwT3BhY2l0eVRyYW5zaXRpb24gPSAoXywgZXZlbnQpID0+IChldmVudCA9PT0gbnVsbCB8fCBldmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXZlbnQuZGVhZGxpbmUpID09PSB0cnVlIHx8IGV2ZW50LnByb3BlcnR5TmFtZSA9PT0gJ2hlaWdodCc7XG5jb25zdCBpbml0Q29sbGFwc2VNb3Rpb24gPSAocm9vdENscyA9IF9jb25maWdQcm92aWRlci5kZWZhdWx0UHJlZml4Q2xzKSA9PiAoe1xuICBtb3Rpb25OYW1lOiBgJHtyb290Q2xzfS1tb3Rpb24tY29sbGFwc2VgLFxuICBvbkFwcGVhclN0YXJ0OiBnZXRDb2xsYXBzZWRIZWlnaHQsXG4gIG9uRW50ZXJTdGFydDogZ2V0Q29sbGFwc2VkSGVpZ2h0LFxuICBvbkFwcGVhckFjdGl2ZTogZ2V0UmVhbEhlaWdodCxcbiAgb25FbnRlckFjdGl2ZTogZ2V0UmVhbEhlaWdodCxcbiAgb25MZWF2ZVN0YXJ0OiBnZXRDdXJyZW50SGVpZ2h0LFxuICBvbkxlYXZlQWN0aXZlOiBnZXRDb2xsYXBzZWRIZWlnaHQsXG4gIG9uQXBwZWFyRW5kOiBza2lwT3BhY2l0eVRyYW5zaXRpb24sXG4gIG9uRW50ZXJFbmQ6IHNraXBPcGFjaXR5VHJhbnNpdGlvbixcbiAgb25MZWF2ZUVuZDogc2tpcE9wYWNpdHlUcmFuc2l0aW9uLFxuICBtb3Rpb25EZWFkbGluZTogNTAwXG59KTtcbmNvbnN0IF9TZWxlY3RQbGFjZW1lbnRzID0gWydib3R0b21MZWZ0JywgJ2JvdHRvbVJpZ2h0JywgJ3RvcExlZnQnLCAndG9wUmlnaHQnXTtcbmNvbnN0IGdldFRyYW5zaXRpb25OYW1lID0gKHJvb3RQcmVmaXhDbHMsIG1vdGlvbiwgdHJhbnNpdGlvbk5hbWUpID0+IHtcbiAgaWYgKHRyYW5zaXRpb25OYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdHJhbnNpdGlvbk5hbWU7XG4gIH1cbiAgcmV0dXJuIGAke3Jvb3RQcmVmaXhDbHN9LSR7bW90aW9ufWA7XG59O1xuZXhwb3J0cy5nZXRUcmFuc2l0aW9uTmFtZSA9IGdldFRyYW5zaXRpb25OYW1lO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gaW5pdENvbGxhcHNlTW90aW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZ2V0UGxhY2VtZW50cztcbmV4cG9ydHMuZ2V0T3ZlcmZsb3dPcHRpb25zID0gZ2V0T3ZlcmZsb3dPcHRpb25zO1xudmFyIF9wbGFjZW1lbnRBcnJvdyA9IHJlcXVpcmUoXCIuLi9zdHlsZS9wbGFjZW1lbnRBcnJvd1wiKTtcbmZ1bmN0aW9uIGdldE92ZXJmbG93T3B0aW9ucyhwbGFjZW1lbnQsIGFycm93T2Zmc2V0LCBhcnJvd1dpZHRoLCBhdXRvQWRqdXN0T3ZlcmZsb3cpIHtcbiAgaWYgKGF1dG9BZGp1c3RPdmVyZmxvdyA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWRqdXN0WDogZmFsc2UsXG4gICAgICBhZGp1c3RZOiBmYWxzZVxuICAgIH07XG4gIH1cbiAgY29uc3Qgb3ZlcmZsb3cgPSBhdXRvQWRqdXN0T3ZlcmZsb3cgJiYgdHlwZW9mIGF1dG9BZGp1c3RPdmVyZmxvdyA9PT0gJ29iamVjdCcgPyBhdXRvQWRqdXN0T3ZlcmZsb3cgOiB7fTtcbiAgY29uc3QgYmFzZU92ZXJmbG93ID0ge307XG4gIHN3aXRjaCAocGxhY2VtZW50KSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgYmFzZU92ZXJmbG93LnNoaWZ0WCA9IGFycm93T2Zmc2V0LmFycm93T2Zmc2V0SG9yaXpvbnRhbCAqIDIgKyBhcnJvd1dpZHRoO1xuICAgICAgYmFzZU92ZXJmbG93LnNoaWZ0WSA9IHRydWU7XG4gICAgICBiYXNlT3ZlcmZsb3cuYWRqdXN0WSA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICBiYXNlT3ZlcmZsb3cuc2hpZnRZID0gYXJyb3dPZmZzZXQuYXJyb3dPZmZzZXRWZXJ0aWNhbCAqIDIgKyBhcnJvd1dpZHRoO1xuICAgICAgYmFzZU92ZXJmbG93LnNoaWZ0WCA9IHRydWU7XG4gICAgICBiYXNlT3ZlcmZsb3cuYWRqdXN0WCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgfVxuICBjb25zdCBtZXJnZWRPdmVyZmxvdyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZU92ZXJmbG93KSwgb3ZlcmZsb3cpO1xuICAvLyBTdXBwb3J0IGF1dG8gc2hpZnRcbiAgaWYgKCFtZXJnZWRPdmVyZmxvdy5zaGlmdFgpIHtcbiAgICBtZXJnZWRPdmVyZmxvdy5hZGp1c3RYID0gdHJ1ZTtcbiAgfVxuICBpZiAoIW1lcmdlZE92ZXJmbG93LnNoaWZ0WSkge1xuICAgIG1lcmdlZE92ZXJmbG93LmFkanVzdFkgPSB0cnVlO1xuICB9XG4gIHJldHVybiBtZXJnZWRPdmVyZmxvdztcbn1cbmNvbnN0IFBsYWNlbWVudEFsaWduTWFwID0ge1xuICBsZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ2NyJywgJ2NsJ11cbiAgfSxcbiAgcmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnY2wnLCAnY3InXVxuICB9LFxuICB0b3A6IHtcbiAgICBwb2ludHM6IFsnYmMnLCAndGMnXVxuICB9LFxuICBib3R0b206IHtcbiAgICBwb2ludHM6IFsndGMnLCAnYmMnXVxuICB9LFxuICB0b3BMZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ2JsJywgJ3RsJ11cbiAgfSxcbiAgbGVmdFRvcDoge1xuICAgIHBvaW50czogWyd0cicsICd0bCddXG4gIH0sXG4gIHRvcFJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ2JyJywgJ3RyJ11cbiAgfSxcbiAgcmlnaHRUb3A6IHtcbiAgICBwb2ludHM6IFsndGwnLCAndHInXVxuICB9LFxuICBib3R0b21SaWdodDoge1xuICAgIHBvaW50czogWyd0cicsICdiciddXG4gIH0sXG4gIHJpZ2h0Qm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ2JsJywgJ2JyJ11cbiAgfSxcbiAgYm90dG9tTGVmdDoge1xuICAgIHBvaW50czogWyd0bCcsICdibCddXG4gIH0sXG4gIGxlZnRCb3R0b206IHtcbiAgICBwb2ludHM6IFsnYnInLCAnYmwnXVxuICB9XG59O1xuY29uc3QgQXJyb3dDZW50ZXJQbGFjZW1lbnRBbGlnbk1hcCA9IHtcbiAgdG9wTGVmdDoge1xuICAgIHBvaW50czogWydibCcsICd0YyddXG4gIH0sXG4gIGxlZnRUb3A6IHtcbiAgICBwb2ludHM6IFsndHInLCAnY2wnXVxuICB9LFxuICB0b3BSaWdodDoge1xuICAgIHBvaW50czogWydicicsICd0YyddXG4gIH0sXG4gIHJpZ2h0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ2NyJ11cbiAgfSxcbiAgYm90dG9tUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsndHInLCAnYmMnXVxuICB9LFxuICByaWdodEJvdHRvbToge1xuICAgIHBvaW50czogWydibCcsICdjciddXG4gIH0sXG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmMnXVxuICB9LFxuICBsZWZ0Qm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ2JyJywgJ2NsJ11cbiAgfVxufTtcbmNvbnN0IERpc2FibGVBdXRvQXJyb3dMaXN0ID0gbmV3IFNldChbJ3RvcExlZnQnLCAndG9wUmlnaHQnLCAnYm90dG9tTGVmdCcsICdib3R0b21SaWdodCcsICdsZWZ0VG9wJywgJ2xlZnRCb3R0b20nLCAncmlnaHRUb3AnLCAncmlnaHRCb3R0b20nXSk7XG5mdW5jdGlvbiBnZXRQbGFjZW1lbnRzKGNvbmZpZykge1xuICBjb25zdCB7XG4gICAgYXJyb3dXaWR0aCxcbiAgICBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgYXJyb3dQb2ludEF0Q2VudGVyLFxuICAgIG9mZnNldCxcbiAgICBib3JkZXJSYWRpdXMsXG4gICAgdmlzaWJsZUZpcnN0XG4gIH0gPSBjb25maWc7XG4gIGNvbnN0IGhhbGZBcnJvd1dpZHRoID0gYXJyb3dXaWR0aCAvIDI7XG4gIGNvbnN0IHBsYWNlbWVudE1hcCA9IHt9O1xuICBPYmplY3Qua2V5cyhQbGFjZW1lbnRBbGlnbk1hcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gYXJyb3dQb2ludEF0Q2VudGVyICYmIEFycm93Q2VudGVyUGxhY2VtZW50QWxpZ25NYXBba2V5XSB8fCBQbGFjZW1lbnRBbGlnbk1hcFtrZXldO1xuICAgIGNvbnN0IHBsYWNlbWVudEluZm8gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRlbXBsYXRlKSwge1xuICAgICAgb2Zmc2V0OiBbMCwgMF0sXG4gICAgICBkeW5hbWljSW5zZXQ6IHRydWVcbiAgICB9KTtcbiAgICBwbGFjZW1lbnRNYXBba2V5XSA9IHBsYWNlbWVudEluZm87XG4gICAgLy8gRGlzYWJsZSBhdXRvQXJyb3cgc2luY2UgZGVzaWduIGlzIGZpeGVkIHBvc2l0aW9uXG4gICAgaWYgKERpc2FibGVBdXRvQXJyb3dMaXN0LmhhcyhrZXkpKSB7XG4gICAgICBwbGFjZW1lbnRJbmZvLmF1dG9BcnJvdyA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBTdGF0aWMgb2Zmc2V0XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICBjYXNlICd0b3BMZWZ0JzpcbiAgICAgIGNhc2UgJ3RvcFJpZ2h0JzpcbiAgICAgICAgcGxhY2VtZW50SW5mby5vZmZzZXRbMV0gPSAtaGFsZkFycm93V2lkdGggLSBvZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIGNhc2UgJ2JvdHRvbUxlZnQnOlxuICAgICAgY2FzZSAnYm90dG9tUmlnaHQnOlxuICAgICAgICBwbGFjZW1lbnRJbmZvLm9mZnNldFsxXSA9IGhhbGZBcnJvd1dpZHRoICsgb2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgY2FzZSAnbGVmdFRvcCc6XG4gICAgICBjYXNlICdsZWZ0Qm90dG9tJzpcbiAgICAgICAgcGxhY2VtZW50SW5mby5vZmZzZXRbMF0gPSAtaGFsZkFycm93V2lkdGggLSBvZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgY2FzZSAncmlnaHRUb3AnOlxuICAgICAgY2FzZSAncmlnaHRCb3R0b20nOlxuICAgICAgICBwbGFjZW1lbnRJbmZvLm9mZnNldFswXSA9IGhhbGZBcnJvd1dpZHRoICsgb2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gRHluYW1pYyBvZmZzZXRcbiAgICBjb25zdCBhcnJvd09mZnNldCA9ICgwLCBfcGxhY2VtZW50QXJyb3cuZ2V0QXJyb3dPZmZzZXRUb2tlbikoe1xuICAgICAgY29udGVudFJhZGl1czogYm9yZGVyUmFkaXVzLFxuICAgICAgbGltaXRWZXJ0aWNhbFJhZGl1czogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChhcnJvd1BvaW50QXRDZW50ZXIpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ3RvcExlZnQnOlxuICAgICAgICBjYXNlICdib3R0b21MZWZ0JzpcbiAgICAgICAgICBwbGFjZW1lbnRJbmZvLm9mZnNldFswXSA9IC1hcnJvd09mZnNldC5hcnJvd09mZnNldEhvcml6b250YWwgLSBoYWxmQXJyb3dXaWR0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9wUmlnaHQnOlxuICAgICAgICBjYXNlICdib3R0b21SaWdodCc6XG4gICAgICAgICAgcGxhY2VtZW50SW5mby5vZmZzZXRbMF0gPSBhcnJvd09mZnNldC5hcnJvd09mZnNldEhvcml6b250YWwgKyBoYWxmQXJyb3dXaWR0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGVmdFRvcCc6XG4gICAgICAgIGNhc2UgJ3JpZ2h0VG9wJzpcbiAgICAgICAgICBwbGFjZW1lbnRJbmZvLm9mZnNldFsxXSA9IC1hcnJvd09mZnNldC5hcnJvd09mZnNldEhvcml6b250YWwgKiAyICsgaGFsZkFycm93V2lkdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xlZnRCb3R0b20nOlxuICAgICAgICBjYXNlICdyaWdodEJvdHRvbSc6XG4gICAgICAgICAgcGxhY2VtZW50SW5mby5vZmZzZXRbMV0gPSBhcnJvd09mZnNldC5hcnJvd09mZnNldEhvcml6b250YWwgKiAyIC0gaGFsZkFycm93V2lkdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE92ZXJmbG93XG4gICAgcGxhY2VtZW50SW5mby5vdmVyZmxvdyA9IGdldE92ZXJmbG93T3B0aW9ucyhrZXksIGFycm93T2Zmc2V0LCBhcnJvd1dpZHRoLCBhdXRvQWRqdXN0T3ZlcmZsb3cpO1xuICAgIC8vIFZpc2libGVGaXJzdFxuICAgIGlmICh2aXNpYmxlRmlyc3QpIHtcbiAgICAgIHBsYWNlbWVudEluZm8uaHRtbFJlZ2lvbiA9ICd2aXNpYmxlRmlyc3QnO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBwbGFjZW1lbnRNYXA7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBjbG9uZUVsZW1lbnQ7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5yZXBsYWNlRWxlbWVudCA9IHZvaWQgMDtcbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5mdW5jdGlvbiBpc0ZyYWdtZW50KGNoaWxkKSB7XG4gIHJldHVybiBjaGlsZCAmJiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmIGNoaWxkLnR5cGUgPT09IF9yZWFjdC5kZWZhdWx0LkZyYWdtZW50O1xufVxuY29uc3QgcmVwbGFjZUVsZW1lbnQgPSAoZWxlbWVudCwgcmVwbGFjZW1lbnQsIHByb3BzKSA9PiB7XG4gIGlmICghIC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5pc1ZhbGlkRWxlbWVudChlbGVtZW50KSkge1xuICAgIHJldHVybiByZXBsYWNlbWVudDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNsb25lRWxlbWVudChlbGVtZW50LCB0eXBlb2YgcHJvcHMgPT09ICdmdW5jdGlvbicgPyBwcm9wcyhlbGVtZW50LnByb3BzIHx8IHt9KSA6IHByb3BzKTtcbn07XG5leHBvcnRzLnJlcGxhY2VFbGVtZW50ID0gcmVwbGFjZUVsZW1lbnQ7XG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgcHJvcHMpIHtcbiAgcmV0dXJuIHJlcGxhY2VFbGVtZW50KGVsZW1lbnQsIGVsZW1lbnQsIHByb3BzKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnJlc3BvbnNpdmVBcnJheSA9IGV4cG9ydHMubWF0Y2hTY3JlZW4gPSBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9pbnRlcm5hbCA9IHJlcXVpcmUoXCIuLi90aGVtZS9pbnRlcm5hbFwiKTtcbnZhciBfbWVkaWFRdWVyeVV0aWwgPSByZXF1aXJlKFwiLi9tZWRpYVF1ZXJ5VXRpbFwiKTtcbmNvbnN0IHJlc3BvbnNpdmVBcnJheSA9IGV4cG9ydHMucmVzcG9uc2l2ZUFycmF5ID0gWyd4eGwnLCAneGwnLCAnbGcnLCAnbWQnLCAnc20nLCAneHMnXTtcbmNvbnN0IGdldFJlc3BvbnNpdmVNYXAgPSB0b2tlbiA9PiAoe1xuICB4czogYChtYXgtd2lkdGg6ICR7dG9rZW4uc2NyZWVuWFNNYXh9cHgpYCxcbiAgc206IGAobWluLXdpZHRoOiAke3Rva2VuLnNjcmVlblNNfXB4KWAsXG4gIG1kOiBgKG1pbi13aWR0aDogJHt0b2tlbi5zY3JlZW5NRH1weClgLFxuICBsZzogYChtaW4td2lkdGg6ICR7dG9rZW4uc2NyZWVuTEd9cHgpYCxcbiAgeGw6IGAobWluLXdpZHRoOiAke3Rva2VuLnNjcmVlblhMfXB4KWAsXG4gIHh4bDogYChtaW4td2lkdGg6ICR7dG9rZW4uc2NyZWVuWFhMfXB4KWBcbn0pO1xuLyoqXG4gKiBFbnN1cmVzIHRoYXQgdGhlIGJyZWFrcG9pbnRzIHRva2VuIGFyZSB2YWxpZCwgaW4gZ29vZCBvcmRlclxuICogRm9yIGVhY2ggYnJlYWtwb2ludCA6IHNjcmVlbk1pbiA8PSBzY3JlZW4gPD0gc2NyZWVuTWF4IGFuZCBzY3JlZW5NYXggPD0gbmV4dFNjcmVlbk1pblxuICovXG5jb25zdCB2YWxpZGF0ZUJyZWFrcG9pbnRzID0gdG9rZW4gPT4ge1xuICBjb25zdCBpbmRleGFibGVUb2tlbiA9IHRva2VuO1xuICBjb25zdCByZXZCcmVha3BvaW50cyA9IFtdLmNvbmNhdChyZXNwb25zaXZlQXJyYXkpLnJldmVyc2UoKTtcbiAgcmV2QnJlYWtwb2ludHMuZm9yRWFjaCgoYnJlYWtwb2ludCwgaSkgPT4ge1xuICAgIGNvbnN0IGJyZWFrcG9pbnRVcHBlciA9IGJyZWFrcG9pbnQudG9VcHBlckNhc2UoKTtcbiAgICBjb25zdCBzY3JlZW5NaW4gPSBgc2NyZWVuJHticmVha3BvaW50VXBwZXJ9TWluYDtcbiAgICBjb25zdCBzY3JlZW4gPSBgc2NyZWVuJHticmVha3BvaW50VXBwZXJ9YDtcbiAgICBpZiAoIShpbmRleGFibGVUb2tlbltzY3JlZW5NaW5dIDw9IGluZGV4YWJsZVRva2VuW3NjcmVlbl0pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NyZWVuTWlufTw9JHtzY3JlZW59IGZhaWxzIDogISgke2luZGV4YWJsZVRva2VuW3NjcmVlbk1pbl19PD0ke2luZGV4YWJsZVRva2VuW3NjcmVlbl19KWApO1xuICAgIH1cbiAgICBpZiAoaSA8IHJldkJyZWFrcG9pbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGNvbnN0IHNjcmVlbk1heCA9IGBzY3JlZW4ke2JyZWFrcG9pbnRVcHBlcn1NYXhgO1xuICAgICAgaWYgKCEoaW5kZXhhYmxlVG9rZW5bc2NyZWVuXSA8PSBpbmRleGFibGVUb2tlbltzY3JlZW5NYXhdKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NyZWVufTw9JHtzY3JlZW5NYXh9IGZhaWxzIDogISgke2luZGV4YWJsZVRva2VuW3NjcmVlbl19PD0ke2luZGV4YWJsZVRva2VuW3NjcmVlbk1heF19KWApO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV4dEJyZWFrcG9pbnRVcHBlck1pbiA9IHJldkJyZWFrcG9pbnRzW2kgKyAxXS50b1VwcGVyQ2FzZSgpO1xuICAgICAgY29uc3QgbmV4dFNjcmVlbk1pbiA9IGBzY3JlZW4ke25leHRCcmVha3BvaW50VXBwZXJNaW59TWluYDtcbiAgICAgIGlmICghKGluZGV4YWJsZVRva2VuW3NjcmVlbk1heF0gPD0gaW5kZXhhYmxlVG9rZW5bbmV4dFNjcmVlbk1pbl0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY3JlZW5NYXh9PD0ke25leHRTY3JlZW5NaW59IGZhaWxzIDogISgke2luZGV4YWJsZVRva2VuW3NjcmVlbk1heF19PD0ke2luZGV4YWJsZVRva2VuW25leHRTY3JlZW5NaW5dfSlgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdG9rZW47XG59O1xuY29uc3QgbWF0Y2hTY3JlZW4gPSAoc2NyZWVucywgc2NyZWVuU2l6ZXMpID0+IHtcbiAgaWYgKCFzY3JlZW5TaXplcykge1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKGNvbnN0IGJyZWFrcG9pbnQgb2YgcmVzcG9uc2l2ZUFycmF5KSB7XG4gICAgaWYgKHNjcmVlbnNbYnJlYWtwb2ludF0gJiYgKHNjcmVlblNpemVzID09PSBudWxsIHx8IHNjcmVlblNpemVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY3JlZW5TaXplc1ticmVha3BvaW50XSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHNjcmVlblNpemVzW2JyZWFrcG9pbnRdO1xuICAgIH1cbiAgfVxufTtcbmV4cG9ydHMubWF0Y2hTY3JlZW4gPSBtYXRjaFNjcmVlbjtcbmNvbnN0IHVzZVJlc3BvbnNpdmVPYnNlcnZlciA9ICgpID0+IHtcbiAgY29uc3QgWywgdG9rZW5dID0gKDAsIF9pbnRlcm5hbC51c2VUb2tlbikoKTtcbiAgY29uc3QgcmVzcG9uc2l2ZU1hcCA9IGdldFJlc3BvbnNpdmVNYXAodmFsaWRhdGVCcmVha3BvaW50cyh0b2tlbikpO1xuICAvLyBUbyBhdm9pZCByZXBlYXQgY3JlYXRlIGluc3RhbmNlLCB3ZSBhZGQgYHVzZU1lbW9gIGhlcmUuXG4gIHJldHVybiBfcmVhY3QuZGVmYXVsdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBzdWJzY3JpYmVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3ViVWlkID0gLTE7XG4gICAgbGV0IHNjcmVlbnMgPSB7fTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzcG9uc2l2ZU1hcCxcbiAgICAgIG1hdGNoSGFuZGxlcnM6IHt9LFxuICAgICAgZGlzcGF0Y2gocG9pbnRNYXApIHtcbiAgICAgICAgc2NyZWVucyA9IHBvaW50TWFwO1xuICAgICAgICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmMgPT4gZnVuYyhzY3JlZW5zKSk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVycy5zaXplID49IDE7XG4gICAgICB9LFxuICAgICAgc3Vic2NyaWJlKGZ1bmMpIHtcbiAgICAgICAgaWYgKCFzdWJzY3JpYmVycy5zaXplKSB7XG4gICAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xuICAgICAgICB9XG4gICAgICAgIHN1YlVpZCArPSAxO1xuICAgICAgICBzdWJzY3JpYmVycy5zZXQoc3ViVWlkLCBmdW5jKTtcbiAgICAgICAgZnVuYyhzY3JlZW5zKTtcbiAgICAgICAgcmV0dXJuIHN1YlVpZDtcbiAgICAgIH0sXG4gICAgICB1bnN1YnNjcmliZShwYXJhbVRva2VuKSB7XG4gICAgICAgIHN1YnNjcmliZXJzLmRlbGV0ZShwYXJhbVRva2VuKTtcbiAgICAgICAgaWYgKCFzdWJzY3JpYmVycy5zaXplKSB7XG4gICAgICAgICAgdGhpcy51bnJlZ2lzdGVyKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICByZWdpc3RlcigpIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzcG9uc2l2ZU1hcCkuZm9yRWFjaCgoW3NjcmVlbiwgbWVkaWFRdWVyeV0pID0+IHtcbiAgICAgICAgICBjb25zdCBsaXN0ZW5lciA9ICh7XG4gICAgICAgICAgICBtYXRjaGVzXG4gICAgICAgICAgfSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHNjcmVlbnMpLCB7XG4gICAgICAgICAgICAgIFtzY3JlZW5dOiBtYXRjaGVzXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBtcWwgPSB3aW5kb3cubWF0Y2hNZWRpYShtZWRpYVF1ZXJ5KTtcbiAgICAgICAgICAoMCwgX21lZGlhUXVlcnlVdGlsLmFkZE1lZGlhUXVlcnlMaXN0ZW5lcikobXFsLCBsaXN0ZW5lcik7XG4gICAgICAgICAgdGhpcy5tYXRjaEhhbmRsZXJzW21lZGlhUXVlcnldID0ge1xuICAgICAgICAgICAgbXFsLFxuICAgICAgICAgICAgbGlzdGVuZXJcbiAgICAgICAgICB9O1xuICAgICAgICAgIGxpc3RlbmVyKG1xbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHVucmVnaXN0ZXIoKSB7XG4gICAgICAgIE9iamVjdC52YWx1ZXMocmVzcG9uc2l2ZU1hcCkuZm9yRWFjaChtZWRpYVF1ZXJ5ID0+IHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5tYXRjaEhhbmRsZXJzW21lZGlhUXVlcnldO1xuICAgICAgICAgICgwLCBfbWVkaWFRdWVyeVV0aWwucmVtb3ZlTWVkaWFRdWVyeUxpc3RlbmVyKShoYW5kbGVyID09PSBudWxsIHx8IGhhbmRsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGhhbmRsZXIubXFsLCBoYW5kbGVyID09PSBudWxsIHx8IGhhbmRsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGhhbmRsZXIubGlzdGVuZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgc3Vic2NyaWJlcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbdG9rZW5dKTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB1c2VSZXNwb25zaXZlT2JzZXJ2ZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gc2Nyb2xsVG87XG52YXIgX3JhZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3JhZlwiKSk7XG52YXIgX2Vhc2luZ3MgPSByZXF1aXJlKFwiLi9lYXNpbmdzXCIpO1xudmFyIF9nZXRTY3JvbGwgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9nZXRTY3JvbGxcIikpO1xuZnVuY3Rpb24gc2Nyb2xsVG8oeSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBnZXRDb250YWluZXIgPSAoKSA9PiB3aW5kb3csXG4gICAgY2FsbGJhY2ssXG4gICAgZHVyYXRpb24gPSA0NTBcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpO1xuICBjb25zdCBzY3JvbGxUb3AgPSAoMCwgX2dldFNjcm9sbC5kZWZhdWx0KShjb250YWluZXIpO1xuICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICBjb25zdCBmcmFtZUZ1bmMgPSAoKSA9PiB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB0aW1lID0gdGltZXN0YW1wIC0gc3RhcnRUaW1lO1xuICAgIGNvbnN0IG5leHRTY3JvbGxUb3AgPSAoMCwgX2Vhc2luZ3MuZWFzZUluT3V0Q3ViaWMpKHRpbWUgPiBkdXJhdGlvbiA/IGR1cmF0aW9uIDogdGltZSwgc2Nyb2xsVG9wLCB5LCBkdXJhdGlvbik7XG4gICAgaWYgKCgwLCBfZ2V0U2Nyb2xsLmlzV2luZG93KShjb250YWluZXIpKSB7XG4gICAgICBjb250YWluZXIuc2Nyb2xsVG8od2luZG93LnBhZ2VYT2Zmc2V0LCBuZXh0U2Nyb2xsVG9wKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGNvbnRhaW5lci5jb25zdHJ1Y3Rvci5uYW1lID09PSAnSFRNTERvY3VtZW50Jykge1xuICAgICAgY29udGFpbmVyLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSBuZXh0U2Nyb2xsVG9wO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuc2Nyb2xsVG9wID0gbmV4dFNjcm9sbFRvcDtcbiAgICB9XG4gICAgaWYgKHRpbWUgPCBkdXJhdGlvbikge1xuICAgICAgKDAsIF9yYWYuZGVmYXVsdCkoZnJhbWVGdW5jKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH07XG4gICgwLCBfcmFmLmRlZmF1bHQpKGZyYW1lRnVuYyk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRNZXJnZWRTdGF0dXMgPSB2b2lkIDA7XG5leHBvcnRzLmdldFN0YXR1c0NsYXNzTmFtZXMgPSBnZXRTdGF0dXNDbGFzc05hbWVzO1xudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5jb25zdCBfSW5wdXRTdGF0dXNlcyA9IFsnd2FybmluZycsICdlcnJvcicsICcnXTtcbmZ1bmN0aW9uIGdldFN0YXR1c0NsYXNzTmFtZXMocHJlZml4Q2xzLCBzdGF0dXMsIGhhc0ZlZWRiYWNrKSB7XG4gIHJldHVybiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoe1xuICAgIFtgJHtwcmVmaXhDbHN9LXN0YXR1cy1zdWNjZXNzYF06IHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnLFxuICAgIFtgJHtwcmVmaXhDbHN9LXN0YXR1cy13YXJuaW5nYF06IHN0YXR1cyA9PT0gJ3dhcm5pbmcnLFxuICAgIFtgJHtwcmVmaXhDbHN9LXN0YXR1cy1lcnJvcmBdOiBzdGF0dXMgPT09ICdlcnJvcicsXG4gICAgW2Ake3ByZWZpeENsc30tc3RhdHVzLXZhbGlkYXRpbmdgXTogc3RhdHVzID09PSAndmFsaWRhdGluZycsXG4gICAgW2Ake3ByZWZpeENsc30taGFzLWZlZWRiYWNrYF06IGhhc0ZlZWRiYWNrXG4gIH0pO1xufVxuY29uc3QgZ2V0TWVyZ2VkU3RhdHVzID0gKGNvbnRleHRTdGF0dXMsIGN1c3RvbVN0YXR1cykgPT4gY3VzdG9tU3RhdHVzIHx8IGNvbnRleHRTdGF0dXM7XG5leHBvcnRzLmdldE1lcmdlZFN0YXR1cyA9IGdldE1lcmdlZFN0YXR1czsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNhblVzZURvY0VsZW1lbnQgPSB2b2lkIDA7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpc1N0eWxlU3VwcG9ydFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfc3R5bGVDaGVja2VyLmlzU3R5bGVTdXBwb3J0O1xuICB9XG59KTtcbnZhciBfY2FuVXNlRG9tID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvRG9tL2NhblVzZURvbVwiKSk7XG52YXIgX3N0eWxlQ2hlY2tlciA9IHJlcXVpcmUoXCJyYy11dGlsL2xpYi9Eb20vc3R5bGVDaGVja2VyXCIpO1xuY29uc3QgY2FuVXNlRG9jRWxlbWVudCA9ICgpID0+ICgwLCBfY2FuVXNlRG9tLmRlZmF1bHQpKCkgJiYgd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbmV4cG9ydHMuY2FuVXNlRG9jRWxlbWVudCA9IGNhblVzZURvY0VsZW1lbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5jb25zdCB0b0xpc3QgPSAoY2FuZGlkYXRlLCBza2lwRW1wdHkgPSBmYWxzZSkgPT4ge1xuICBpZiAoc2tpcEVtcHR5ICYmIChjYW5kaWRhdGUgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUgPT09IG51bGwpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZSkgPyBjYW5kaWRhdGUgOiBbY2FuZGlkYXRlXTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB0b0xpc3Q7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRldlVzZVdhcm5pbmcgPSBleHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLldhcm5pbmdDb250ZXh0ID0gdm9pZCAwO1xuZXhwb3J0cy5ub29wID0gbm9vcDtcbmV4cG9ydHMucmVzZXRXYXJuZWQgPSByZXNldFdhcm5lZDtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX3dhcm5pbmcgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmMtdXRpbC9saWIvd2FybmluZ1wiKSk7XG5mdW5jdGlvbiBub29wKCkge31cbmxldCBkZXByZWNhdGVkV2Fybkxpc3QgPSBudWxsO1xuZnVuY3Rpb24gcmVzZXRXYXJuZWQoKSB7XG4gIGRlcHJlY2F0ZWRXYXJuTGlzdCA9IG51bGw7XG4gICgwLCBfd2FybmluZy5yZXNldFdhcm5lZCkoKTtcbn1cbmxldCB3YXJuaW5nID0gbm9vcDtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHdhcm5pbmcgPSAodmFsaWQsIGNvbXBvbmVudCwgbWVzc2FnZSkgPT4ge1xuICAgICgwLCBfd2FybmluZy5kZWZhdWx0KSh2YWxpZCwgYFthbnRkOiAke2NvbXBvbmVudH1dICR7bWVzc2FnZX1gKTtcbiAgICAvLyBTdHJpY3RNb2RlIHdpbGwgaW5qZWN0IGNvbnNvbGUgd2hpY2ggd2lsbCBub3QgdGhyb3cgd2FybmluZyBpbiBSZWFjdCAxNy5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0Jykge1xuICAgICAgcmVzZXRXYXJuZWQoKTtcbiAgICB9XG4gIH07XG59XG5jb25zdCBXYXJuaW5nQ29udGV4dCA9IGV4cG9ydHMuV2FybmluZ0NvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7XG4vKipcbiAqIFRoaXMgaXMgYSBob29rIGJ1dCB3ZSBub3QgbmFtZWQgYXMgYHVzZVdhcm5pbmdgXG4gKiBzaW5jZSB0aGlzIGlzIG9ubHkgdXNlZCBpbiBkZXZlbG9wbWVudC5cbiAqIFdlIHNob3VsZCBhbHdheXMgd3JhcCB0aGlzIGluIGBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJylgIGNvbmRpdGlvblxuICovXG5jb25zdCBkZXZVc2VXYXJuaW5nID0gZXhwb3J0cy5kZXZVc2VXYXJuaW5nID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGNvbXBvbmVudCA9PiB7XG4gIGNvbnN0IHtcbiAgICBzdHJpY3RcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoV2FybmluZ0NvbnRleHQpO1xuICBjb25zdCB0eXBlV2FybmluZyA9ICh2YWxpZCwgdHlwZSwgbWVzc2FnZSkgPT4ge1xuICAgIGlmICghdmFsaWQpIHtcbiAgICAgIGlmIChzdHJpY3QgPT09IGZhbHNlICYmIHR5cGUgPT09ICdkZXByZWNhdGVkJykge1xuICAgICAgICBjb25zdCBleGlzdFdhcm5pbmcgPSBkZXByZWNhdGVkV2Fybkxpc3Q7XG4gICAgICAgIGlmICghZGVwcmVjYXRlZFdhcm5MaXN0KSB7XG4gICAgICAgICAgZGVwcmVjYXRlZFdhcm5MaXN0ID0ge307XG4gICAgICAgIH1cbiAgICAgICAgZGVwcmVjYXRlZFdhcm5MaXN0W2NvbXBvbmVudF0gPSBkZXByZWNhdGVkV2Fybkxpc3RbY29tcG9uZW50XSB8fCBbXTtcbiAgICAgICAgaWYgKCFkZXByZWNhdGVkV2Fybkxpc3RbY29tcG9uZW50XS5pbmNsdWRlcyhtZXNzYWdlIHx8ICcnKSkge1xuICAgICAgICAgIGRlcHJlY2F0ZWRXYXJuTGlzdFtjb21wb25lbnRdLnB1c2gobWVzc2FnZSB8fCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2FybmluZyBmb3IgdGhlIGZpcnN0IHRpbWVcbiAgICAgICAgaWYgKCFleGlzdFdhcm5pbmcpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1thbnRkXSBUaGVyZSBleGlzdHMgZGVwcmVjYXRlZCB1c2FnZSBpbiB5b3VyIGNvZGU6JywgZGVwcmVjYXRlZFdhcm5MaXN0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyh2YWxpZCwgY29tcG9uZW50LCBtZXNzYWdlKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHR5cGVXYXJuaW5nLmRlcHJlY2F0ZWQgPSAodmFsaWQsIG9sZFByb3AsIG5ld1Byb3AsIG1lc3NhZ2UpID0+IHtcbiAgICB0eXBlV2FybmluZyh2YWxpZCwgJ2RlcHJlY2F0ZWQnLCBgXFxgJHtvbGRQcm9wfVxcYCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIFxcYCR7bmV3UHJvcH1cXGAgaW5zdGVhZC4ke21lc3NhZ2UgPyBgICR7bWVzc2FnZX1gIDogJyd9YCk7XG4gIH07XG4gIHJldHVybiB0eXBlV2FybmluZztcbn0gOiAoKSA9PiB7XG4gIGNvbnN0IG5vb3BXYXJuaW5nID0gKCkgPT4ge307XG4gIG5vb3BXYXJuaW5nLmRlcHJlY2F0ZWQgPSBub29wO1xuICByZXR1cm4gbm9vcFdhcm5pbmc7XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gd2FybmluZzsiLCJcInVzZSBzdHJpY3RcIjtcblwidXNlIGNsaWVudFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcbnZhciBfcmNNb3Rpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1tb3Rpb25cIikpO1xudmFyIF9yYWYgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9yYWZcIikpO1xudmFyIF9yZWYgPSByZXF1aXJlKFwicmMtdXRpbC9saWIvcmVmXCIpO1xudmFyIF9VbnN0YWJsZUNvbnRleHQgPSByZXF1aXJlKFwiLi4vLi4vY29uZmlnLXByb3ZpZGVyL1Vuc3RhYmxlQ29udGV4dFwiKTtcbnZhciBfaW50ZXJmYWNlID0gcmVxdWlyZShcIi4vaW50ZXJmYWNlXCIpO1xudmFyIF91dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbmZ1bmN0aW9uIHZhbGlkYXRlTnVtKHZhbHVlKSB7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUpID8gMCA6IHZhbHVlO1xufVxuY29uc3QgV2F2ZUVmZmVjdCA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIGNsYXNzTmFtZSxcbiAgICB0YXJnZXQsXG4gICAgY29tcG9uZW50LFxuICAgIHJlZ2lzdGVyVW5tb3VudFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGRpdlJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBSZWZzID09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgdW5tb3VudFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICB1bm1vdW50UmVmLmN1cnJlbnQgPSByZWdpc3RlclVubW91bnQoKTtcbiAgfSwgW10pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBbY29sb3IsIHNldFdhdmVDb2xvcl0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW2JvcmRlclJhZGl1cywgc2V0Qm9yZGVyUmFkaXVzXSA9IFJlYWN0LnVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2xlZnQsIHNldExlZnRdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gIGNvbnN0IFt0b3AsIHNldFRvcF0gPSBSZWFjdC51c2VTdGF0ZSgwKTtcbiAgY29uc3QgW3dpZHRoLCBzZXRXaWR0aF0gPSBSZWFjdC51c2VTdGF0ZSgwKTtcbiAgY29uc3QgW2hlaWdodCwgc2V0SGVpZ2h0XSA9IFJlYWN0LnVzZVN0YXRlKDApO1xuICBjb25zdCBbZW5hYmxlZCwgc2V0RW5hYmxlZF0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IHdhdmVTdHlsZSA9IHtcbiAgICBsZWZ0LFxuICAgIHRvcCxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYm9yZGVyUmFkaXVzOiBib3JkZXJSYWRpdXMubWFwKHJhZGl1cyA9PiBgJHtyYWRpdXN9cHhgKS5qb2luKCcgJylcbiAgfTtcbiAgaWYgKGNvbG9yKSB7XG4gICAgd2F2ZVN0eWxlWyctLXdhdmUtY29sb3InXSA9IGNvbG9yO1xuICB9XG4gIGZ1bmN0aW9uIHN5bmNQb3MoKSB7XG4gICAgY29uc3Qgbm9kZVN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpO1xuICAgIC8vIEdldCB3YXZlIGNvbG9yIGZyb20gdGFyZ2V0XG4gICAgc2V0V2F2ZUNvbG9yKCgwLCBfdXRpbC5nZXRUYXJnZXRXYXZlQ29sb3IpKHRhcmdldCkpO1xuICAgIGNvbnN0IGlzU3RhdGljID0gbm9kZVN0eWxlLnBvc2l0aW9uID09PSAnc3RhdGljJztcbiAgICAvLyBSZWN0XG4gICAgY29uc3Qge1xuICAgICAgYm9yZGVyTGVmdFdpZHRoLFxuICAgICAgYm9yZGVyVG9wV2lkdGhcbiAgICB9ID0gbm9kZVN0eWxlO1xuICAgIHNldExlZnQoaXNTdGF0aWMgPyB0YXJnZXQub2Zmc2V0TGVmdCA6IHZhbGlkYXRlTnVtKC1wYXJzZUZsb2F0KGJvcmRlckxlZnRXaWR0aCkpKTtcbiAgICBzZXRUb3AoaXNTdGF0aWMgPyB0YXJnZXQub2Zmc2V0VG9wIDogdmFsaWRhdGVOdW0oLXBhcnNlRmxvYXQoYm9yZGVyVG9wV2lkdGgpKSk7XG4gICAgc2V0V2lkdGgodGFyZ2V0Lm9mZnNldFdpZHRoKTtcbiAgICBzZXRIZWlnaHQodGFyZ2V0Lm9mZnNldEhlaWdodCk7XG4gICAgLy8gR2V0IGJvcmRlciByYWRpdXNcbiAgICBjb25zdCB7XG4gICAgICBib3JkZXJUb3BMZWZ0UmFkaXVzLFxuICAgICAgYm9yZGVyVG9wUmlnaHRSYWRpdXMsXG4gICAgICBib3JkZXJCb3R0b21MZWZ0UmFkaXVzLFxuICAgICAgYm9yZGVyQm90dG9tUmlnaHRSYWRpdXNcbiAgICB9ID0gbm9kZVN0eWxlO1xuICAgIHNldEJvcmRlclJhZGl1cyhbYm9yZGVyVG9wTGVmdFJhZGl1cywgYm9yZGVyVG9wUmlnaHRSYWRpdXMsIGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzLCBib3JkZXJCb3R0b21MZWZ0UmFkaXVzXS5tYXAocmFkaXVzID0+IHZhbGlkYXRlTnVtKHBhcnNlRmxvYXQocmFkaXVzKSkpKTtcbiAgfVxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIC8vIFdlIG5lZWQgZGVsYXkgdG8gY2hlY2sgcG9zaXRpb24gaGVyZVxuICAgICAgLy8gc2luY2UgVUkgbWF5IGNoYW5nZSBhZnRlciBjbGlja1xuICAgICAgY29uc3QgaWQgPSAoMCwgX3JhZi5kZWZhdWx0KSgoKSA9PiB7XG4gICAgICAgIHN5bmNQb3MoKTtcbiAgICAgICAgc2V0RW5hYmxlZCh0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgLy8gQWRkIHJlc2l6ZSBvYnNlcnZlciB0byBmb2xsb3cgc2l6ZVxuICAgICAgbGV0IHJlc2l6ZU9ic2VydmVyO1xuICAgICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoc3luY1Bvcyk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGFyZ2V0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIF9yYWYuZGVmYXVsdC5jYW5jZWwoaWQpO1xuICAgICAgICByZXNpemVPYnNlcnZlciA9PT0gbnVsbCB8fCByZXNpemVPYnNlcnZlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtdKTtcbiAgaWYgKCFlbmFibGVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgaXNTbWFsbENvbXBvbmVudCA9IChjb21wb25lbnQgPT09ICdDaGVja2JveCcgfHwgY29tcG9uZW50ID09PSAnUmFkaW8nKSAmJiAodGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhfaW50ZXJmYWNlLlRBUkdFVF9DTFMpKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY01vdGlvbi5kZWZhdWx0LCB7XG4gICAgdmlzaWJsZTogdHJ1ZSxcbiAgICBtb3Rpb25BcHBlYXI6IHRydWUsXG4gICAgbW90aW9uTmFtZTogXCJ3YXZlLW1vdGlvblwiLFxuICAgIG1vdGlvbkRlYWRsaW5lOiA1MDAwLFxuICAgIG9uQXBwZWFyRW5kOiAoXywgZXZlbnQpID0+IHtcbiAgICAgIHZhciBfYSwgX2I7XG4gICAgICBpZiAoZXZlbnQuZGVhZGxpbmUgfHwgZXZlbnQucHJvcGVydHlOYW1lID09PSAnb3BhY2l0eScpIHtcbiAgICAgICAgY29uc3QgaG9sZGVyID0gKF9hID0gZGl2UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAoX2IgPSB1bm1vdW50UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKHVubW91bnRSZWYpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGhvbGRlciA9PT0gbnVsbCB8fCBob2xkZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGhvbGRlci5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCAoe1xuICAgIGNsYXNzTmFtZTogbW90aW9uQ2xhc3NOYW1lXG4gIH0sIHJlZikgPT4gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6ICgwLCBfcmVmLmNvbXBvc2VSZWYpKGRpdlJlZiwgcmVmKSxcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShjbGFzc05hbWUsIG1vdGlvbkNsYXNzTmFtZSwge1xuICAgICAgJ3dhdmUtcXVpY2snOiBpc1NtYWxsQ29tcG9uZW50XG4gICAgfSksXG4gICAgc3R5bGU6IHdhdmVTdHlsZVxuICB9KSkpO1xufTtcbmNvbnN0IHNob3dXYXZlRWZmZWN0ID0gKHRhcmdldCwgaW5mbykgPT4ge1xuICB2YXIgX2E7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRcbiAgfSA9IGluZm87XG4gIC8vIFNraXAgZm9yIHVuY2hlY2tlZCBjaGVja2JveFxuICBpZiAoY29tcG9uZW50ID09PSAnQ2hlY2tib3gnICYmICEoKF9hID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGVja2VkKSkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBDcmVhdGUgaG9sZGVyXG4gIGNvbnN0IGhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBob2xkZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICBob2xkZXIuc3R5bGUubGVmdCA9ICcwcHgnO1xuICBob2xkZXIuc3R5bGUudG9wID0gJzBweCc7XG4gIHRhcmdldCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldC5pbnNlcnRCZWZvcmUoaG9sZGVyLCB0YXJnZXQgPT09IG51bGwgfHwgdGFyZ2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0YXJnZXQuZmlyc3RDaGlsZCk7XG4gIGNvbnN0IHJlYWN0UmVuZGVyID0gKDAsIF9VbnN0YWJsZUNvbnRleHQudW5zdGFibGVTZXRSZW5kZXIpKCk7XG4gIGxldCB1bm1vdW50Q2FsbGJhY2sgPSBudWxsO1xuICBmdW5jdGlvbiByZWdpc3RlclVubW91bnQoKSB7XG4gICAgcmV0dXJuIHVubW91bnRDYWxsYmFjaztcbiAgfVxuICB1bm1vdW50Q2FsbGJhY2sgPSByZWFjdFJlbmRlcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChXYXZlRWZmZWN0LCBPYmplY3QuYXNzaWduKHt9LCBpbmZvLCB7XG4gICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgcmVnaXN0ZXJVbm1vdW50OiByZWdpc3RlclVubW91bnRcbiAgfSkpLCBob2xkZXIpO1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHNob3dXYXZlRWZmZWN0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG52YXIgX2lzVmlzaWJsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0RvbS9pc1Zpc2libGVcIikpO1xudmFyIF9yZWYgPSByZXF1aXJlKFwicmMtdXRpbC9saWIvcmVmXCIpO1xudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWctcHJvdmlkZXJcIik7XG52YXIgX3JlYWN0Tm9kZSA9IHJlcXVpcmUoXCIuLi9yZWFjdE5vZGVcIik7XG52YXIgX3N0eWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zdHlsZVwiKSk7XG52YXIgX3VzZVdhdmUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3VzZVdhdmVcIikpO1xuY29uc3QgV2F2ZSA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIGNoaWxkcmVuLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbXBvbmVudFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHNcbiAgfSA9ICgwLCBfcmVhY3QudXNlQ29udGV4dCkoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpO1xuICBjb25zdCBjb250YWluZXJSZWYgPSAoMCwgX3JlYWN0LnVzZVJlZikobnVsbCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdHlsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHByZWZpeENscyA9IGdldFByZWZpeENscygnd2F2ZScpO1xuICBjb25zdCBbLCBoYXNoSWRdID0gKDAsIF9zdHlsZS5kZWZhdWx0KShwcmVmaXhDbHMpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFdhdmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBzaG93V2F2ZSA9ICgwLCBfdXNlV2F2ZS5kZWZhdWx0KShjb250YWluZXJSZWYsICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShwcmVmaXhDbHMsIGhhc2hJZCksIGNvbXBvbmVudCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIF9yZWFjdC5kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgbm9kZSA9IGNvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9PSAxIHx8IGRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENsaWNrIGhhbmRsZXJcbiAgICBjb25zdCBvbkNsaWNrID0gZSA9PiB7XG4gICAgICAvLyBGaXggcmFkaW8gYnV0dG9uIGNsaWNrIHR3aWNlXG4gICAgICBpZiAoISgwLCBfaXNWaXNpYmxlLmRlZmF1bHQpKGUudGFyZ2V0KSB8fFxuICAgICAgLy8gTm8gbmVlZCB3YXZlXG4gICAgICAhbm9kZS5nZXRBdHRyaWJ1dGUgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgfHwgbm9kZS5kaXNhYmxlZCB8fCBub2RlLmNsYXNzTmFtZS5pbmNsdWRlcygnZGlzYWJsZWQnKSB8fCBub2RlLmNsYXNzTmFtZS5pbmNsdWRlcygnLWxlYXZlJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2hvd1dhdmUoZSk7XG4gICAgfTtcbiAgICAvLyBCaW5kIGV2ZW50c1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrLCB0cnVlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2ssIHRydWUpO1xuICAgIH07XG4gIH0sIFtkaXNhYmxlZF0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAoISAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuICE9PSBudWxsICYmIGNoaWxkcmVuICE9PSB2b2lkIDAgPyBjaGlsZHJlbiA6IG51bGw7XG4gIH1cbiAgY29uc3QgcmVmID0gKDAsIF9yZWYuc3VwcG9ydFJlZikoY2hpbGRyZW4pID8gKDAsIF9yZWYuY29tcG9zZVJlZikoKDAsIF9yZWYuZ2V0Tm9kZVJlZikoY2hpbGRyZW4pLCBjb250YWluZXJSZWYpIDogY29udGFpbmVyUmVmO1xuICByZXR1cm4gKDAsIF9yZWFjdE5vZGUuY2xvbmVFbGVtZW50KShjaGlsZHJlbiwge1xuICAgIHJlZlxuICB9KTtcbn07XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBXYXZlLmRpc3BsYXlOYW1lID0gJ1dhdmUnO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gV2F2ZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuVEFSR0VUX0NMUyA9IHZvaWQgMDtcbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuY29uc3QgVEFSR0VUX0NMUyA9IGV4cG9ydHMuVEFSR0VUX0NMUyA9IGAke19jb25maWdQcm92aWRlci5kZWZhdWx0UHJlZml4Q2xzfS13YXZlLXRhcmdldGA7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2ludGVybmFsID0gcmVxdWlyZShcIi4uLy4uL3RoZW1lL2ludGVybmFsXCIpO1xuY29uc3QgZ2VuV2F2ZVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGNvbG9yUHJpbWFyeVxuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgY29sb3I6IGB2YXIoLS13YXZlLWNvbG9yLCAke2NvbG9yUHJpbWFyeX0pYCxcbiAgICAgIGJveFNoYWRvdzogYDAgMCAwIDAgY3VycmVudGNvbG9yYCxcbiAgICAgIG9wYWNpdHk6IDAuMixcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT0gTW90aW9uID09PT09PT09PT09PT09PT09PT1cbiAgICAgICcmLndhdmUtbW90aW9uLWFwcGVhcic6IHtcbiAgICAgICAgdHJhbnNpdGlvbjogW2Bib3gtc2hhZG93IDAuNHMgJHt0b2tlbi5tb3Rpb25FYXNlT3V0Q2lyY31gLCBgb3BhY2l0eSAycyAke3Rva2VuLm1vdGlvbkVhc2VPdXRDaXJjfWBdLmpvaW4oJywnKSxcbiAgICAgICAgJyYtYWN0aXZlJzoge1xuICAgICAgICAgIGJveFNoYWRvdzogYDAgMCAwIDZweCBjdXJyZW50Y29sb3JgLFxuICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgfSxcbiAgICAgICAgJyYud2F2ZS1xdWljayc6IHtcbiAgICAgICAgICB0cmFuc2l0aW9uOiBbYGJveC1zaGFkb3cgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9ICR7dG9rZW4ubW90aW9uRWFzZUluT3V0fWAsIGBvcGFjaXR5ICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fSAke3Rva2VuLm1vdGlvbkVhc2VJbk91dH1gXS5qb2luKCcsJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSAoMCwgX2ludGVybmFsLmdlbkNvbXBvbmVudFN0eWxlSG9vaykoJ1dhdmUnLCB0b2tlbiA9PiBbZ2VuV2F2ZVN0eWxlKHRva2VuKV0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX3VzZUV2ZW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvaG9va3MvdXNlRXZlbnRcIikpO1xudmFyIF9yYWYgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9yYWZcIikpO1xudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWctcHJvdmlkZXJcIik7XG52YXIgX3VzZVRva2VuID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vdGhlbWUvdXNlVG9rZW5cIikpO1xudmFyIF9pbnRlcmZhY2UgPSByZXF1aXJlKFwiLi9pbnRlcmZhY2VcIik7XG52YXIgX1dhdmVFZmZlY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1dhdmVFZmZlY3RcIikpO1xuY29uc3QgdXNlV2F2ZSA9IChub2RlUmVmLCBjbGFzc05hbWUsIGNvbXBvbmVudCkgPT4ge1xuICBjb25zdCB7XG4gICAgd2F2ZVxuICB9ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IFssIHRva2VuLCBoYXNoSWRdID0gKDAsIF91c2VUb2tlbi5kZWZhdWx0KSgpO1xuICBjb25zdCBzaG93V2F2ZSA9ICgwLCBfdXNlRXZlbnQuZGVmYXVsdCkoZXZlbnQgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSBub2RlUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCh3YXZlID09PSBudWxsIHx8IHdhdmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdhdmUuZGlzYWJsZWQpIHx8ICFub2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldE5vZGUgPSBub2RlLnF1ZXJ5U2VsZWN0b3IoYC4ke19pbnRlcmZhY2UuVEFSR0VUX0NMU31gKSB8fCBub2RlO1xuICAgIGNvbnN0IHtcbiAgICAgIHNob3dFZmZlY3RcbiAgICB9ID0gd2F2ZSB8fCB7fTtcbiAgICAvLyBDdXN0b21pemUgd2F2ZSBlZmZlY3RcbiAgICAoc2hvd0VmZmVjdCB8fCBfV2F2ZUVmZmVjdC5kZWZhdWx0KSh0YXJnZXROb2RlLCB7XG4gICAgICBjbGFzc05hbWUsXG4gICAgICB0b2tlbixcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIGV2ZW50LFxuICAgICAgaGFzaElkXG4gICAgfSk7XG4gIH0pO1xuICBjb25zdCByYWZJZCA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgLy8gTWVyZ2UgdHJpZ2dlciBldmVudCBpbnRvIG9uZSBmb3IgZWFjaCBmcmFtZVxuICBjb25zdCBzaG93RGVib3VuY2VXYXZlID0gZXZlbnQgPT4ge1xuICAgIF9yYWYuZGVmYXVsdC5jYW5jZWwocmFmSWQuY3VycmVudCk7XG4gICAgcmFmSWQuY3VycmVudCA9ICgwLCBfcmFmLmRlZmF1bHQpKCgpID0+IHtcbiAgICAgIHNob3dXYXZlKGV2ZW50KTtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIHNob3dEZWJvdW5jZVdhdmU7XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdXNlV2F2ZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0VGFyZ2V0V2F2ZUNvbG9yID0gZ2V0VGFyZ2V0V2F2ZUNvbG9yO1xuZXhwb3J0cy5pc1ZhbGlkV2F2ZUNvbG9yID0gaXNWYWxpZFdhdmVDb2xvcjtcbmZ1bmN0aW9uIGlzVmFsaWRXYXZlQ29sb3IoY29sb3IpIHtcbiAgcmV0dXJuIGNvbG9yICYmIGNvbG9yICE9PSAnI2ZmZicgJiYgY29sb3IgIT09ICcjZmZmZmZmJyAmJiBjb2xvciAhPT0gJ3JnYigyNTUsIDI1NSwgMjU1KScgJiYgY29sb3IgIT09ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpJyAmJiAhL3JnYmFcXCgoPzpcXGQqLCApezN9MFxcKS8udGVzdChjb2xvcikgJiZcbiAgLy8gYW55IHRyYW5zcGFyZW50IHJnYmEgY29sb3JcbiAgY29sb3IgIT09ICd0cmFuc3BhcmVudCc7XG59XG5mdW5jdGlvbiBnZXRUYXJnZXRXYXZlQ29sb3Iobm9kZSkge1xuICBjb25zdCB7XG4gICAgYm9yZGVyVG9wQ29sb3IsXG4gICAgYm9yZGVyQ29sb3IsXG4gICAgYmFja2dyb3VuZENvbG9yXG4gIH0gPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICBpZiAoaXNWYWxpZFdhdmVDb2xvcihib3JkZXJUb3BDb2xvcikpIHtcbiAgICByZXR1cm4gYm9yZGVyVG9wQ29sb3I7XG4gIH1cbiAgaWYgKGlzVmFsaWRXYXZlQ29sb3IoYm9yZGVyQ29sb3IpKSB7XG4gICAgcmV0dXJuIGJvcmRlckNvbG9yO1xuICB9XG4gIGlmIChpc1ZhbGlkV2F2ZUNvbG9yKGJhY2tncm91bmRDb2xvcikpIHtcbiAgICByZXR1cm4gYmFja2dyb3VuZENvbG9yO1xuICB9XG4gIHJldHVybiBudWxsO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5jb25zdCB6SW5kZXhDb250ZXh0ID0gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHpJbmRleENvbnRleHQuZGlzcGxheU5hbWUgPSAnekluZGV4Q29udGV4dCc7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB6SW5kZXhDb250ZXh0OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==