"use strict"; (self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_rc-textarea_es_index_js-node_modules_rc-tooltip_es_index_js-node_modules-ae4019"],{ /***/ "../../../node_modules/rc-textarea/es/ResizableTextArea.js": /*!*****************************************************************!*\ !*** ../../../node_modules/rc-textarea/es/ResizableTextArea.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ "../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); /* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ "../../../node_modules/@babel/runtime/helpers/esm/typeof.js"); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var rc_resize_observer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! rc-resize-observer */ "../../../node_modules/rc-resize-observer/es/index.js"); /* harmony import */ var rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! rc-util/es/hooks/useLayoutEffect */ "../../../node_modules/rc-util/es/hooks/useLayoutEffect.js"); /* harmony import */ var rc_util_es_hooks_useMergedState__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! rc-util/es/hooks/useMergedState */ "../../../node_modules/rc-util/es/hooks/useMergedState.js"); /* harmony import */ var rc_util_es_raf__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! rc-util/es/raf */ "../../../node_modules/rc-util/es/raf.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_11__); /* harmony import */ var _calculateNodeHeight__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./calculateNodeHeight */ "../../../node_modules/rc-textarea/es/calculateNodeHeight.js"); var _excluded = ["prefixCls", "defaultValue", "value", "autoSize", "onResize", "className", "style", "disabled", "onChange", "onInternalAutoSize"]; var RESIZE_START = 0; var RESIZE_MEASURING = 1; var RESIZE_STABLE = 2; var ResizableTextArea = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11__.forwardRef(function (props, ref) { var _ref = props, prefixCls = _ref.prefixCls, defaultValue = _ref.defaultValue, value = _ref.value, autoSize = _ref.autoSize, onResize = _ref.onResize, className = _ref.className, style = _ref.style, disabled = _ref.disabled, onChange = _ref.onChange, onInternalAutoSize = _ref.onInternalAutoSize, restProps = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_5__["default"])(_ref, _excluded); // =============================== Value ================================ var _useMergedState = (0,rc_util_es_hooks_useMergedState__WEBPACK_IMPORTED_MODULE_9__["default"])(defaultValue, { value: value, postState: function postState(val) { return val !== null && val !== void 0 ? val : ''; } }), _useMergedState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_useMergedState, 2), mergedValue = _useMergedState2[0], setMergedValue = _useMergedState2[1]; var onInternalChange = function onInternalChange(event) { setMergedValue(event.target.value); onChange === null || onChange === void 0 || onChange(event); }; // ================================ Ref ================================= var textareaRef = react__WEBPACK_IMPORTED_MODULE_11__.useRef(); react__WEBPACK_IMPORTED_MODULE_11__.useImperativeHandle(ref, function () { return { textArea: textareaRef.current }; }); // ============================== AutoSize ============================== var _React$useMemo = react__WEBPACK_IMPORTED_MODULE_11__.useMemo(function () { if (autoSize && (0,_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_3__["default"])(autoSize) === 'object') { return [autoSize.minRows, autoSize.maxRows]; } return []; }, [autoSize]), _React$useMemo2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_React$useMemo, 2), minRows = _React$useMemo2[0], maxRows = _React$useMemo2[1]; var needAutoSize = !!autoSize; // =============================== Scroll =============================== // https://github.com/ant-design/ant-design/issues/21870 var fixFirefoxAutoScroll = function fixFirefoxAutoScroll() { try { // FF has bug with jump of scroll to top. We force back here. if (document.activeElement === textareaRef.current) { var _textareaRef$current = textareaRef.current, selectionStart = _textareaRef$current.selectionStart, selectionEnd = _textareaRef$current.selectionEnd, scrollTop = _textareaRef$current.scrollTop; // Fix Safari bug which not rollback when break line // This makes Chinese IME can't input. Do not fix this // const { value: tmpValue } = textareaRef.current; // textareaRef.current.value = ''; // textareaRef.current.value = tmpValue; textareaRef.current.setSelectionRange(selectionStart, selectionEnd); textareaRef.current.scrollTop = scrollTop; } } catch (e) { // Fix error in Chrome: // Failed to read the 'selectionStart' property from 'HTMLInputElement' // http://stackoverflow.com/q/21177489/3040605 } }; // =============================== Resize =============================== var _React$useState = react__WEBPACK_IMPORTED_MODULE_11__.useState(RESIZE_STABLE), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_React$useState, 2), resizeState = _React$useState2[0], setResizeState = _React$useState2[1]; var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_11__.useState(), _React$useState4 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_React$useState3, 2), autoSizeStyle = _React$useState4[0], setAutoSizeStyle = _React$useState4[1]; var startResize = function startResize() { setResizeState(RESIZE_START); if (false) // removed by dead control flow {} }; // Change to trigger resize measure (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_8__["default"])(function () { if (needAutoSize) { startResize(); } }, [value, minRows, maxRows, needAutoSize]); (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_8__["default"])(function () { if (resizeState === RESIZE_START) { setResizeState(RESIZE_MEASURING); } else if (resizeState === RESIZE_MEASURING) { var textareaStyles = (0,_calculateNodeHeight__WEBPACK_IMPORTED_MODULE_12__["default"])(textareaRef.current, false, minRows, maxRows); // Safari has bug that text will keep break line on text cut when it's prev is break line. // ZombieJ: This not often happen. So we just skip it. // const { selectionStart, selectionEnd, scrollTop } = textareaRef.current; // const { value: tmpValue } = textareaRef.current; // textareaRef.current.value = ''; // textareaRef.current.value = tmpValue; // if (document.activeElement === textareaRef.current) { // textareaRef.current.scrollTop = scrollTop; // textareaRef.current.setSelectionRange(selectionStart, selectionEnd); // } setResizeState(RESIZE_STABLE); setAutoSizeStyle(textareaStyles); } else { fixFirefoxAutoScroll(); } }, [resizeState]); // We lock resize trigger by raf to avoid Safari warning var resizeRafRef = react__WEBPACK_IMPORTED_MODULE_11__.useRef(); var cleanRaf = function cleanRaf() { rc_util_es_raf__WEBPACK_IMPORTED_MODULE_10__["default"].cancel(resizeRafRef.current); }; var onInternalResize = function onInternalResize(size) { if (resizeState === RESIZE_STABLE) { onResize === null || onResize === void 0 || onResize(size); if (autoSize) { cleanRaf(); resizeRafRef.current = (0,rc_util_es_raf__WEBPACK_IMPORTED_MODULE_10__["default"])(function () { startResize(); }); } } }; react__WEBPACK_IMPORTED_MODULE_11__.useEffect(function () { return cleanRaf; }, []); // =============================== Render =============================== var mergedAutoSizeStyle = needAutoSize ? autoSizeStyle : null; var mergedStyle = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, style), mergedAutoSizeStyle); if (resizeState === RESIZE_START || resizeState === RESIZE_MEASURING) { mergedStyle.overflowY = 'hidden'; mergedStyle.overflowX = 'hidden'; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11__.createElement(rc_resize_observer__WEBPACK_IMPORTED_MODULE_7__["default"], { onResize: onInternalResize, disabled: !(autoSize || onResize) }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11__.createElement("textarea", (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, restProps, { ref: textareaRef, style: mergedStyle, className: classnames__WEBPACK_IMPORTED_MODULE_6___default()(prefixCls, className, (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({}, "".concat(prefixCls, "-disabled"), disabled)), disabled: disabled, value: mergedValue, onChange: onInternalChange }))); }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ResizableTextArea); /***/ }), /***/ "../../../node_modules/rc-textarea/es/TextArea.js": /*!********************************************************!*\ !*** ../../../node_modules/rc-textarea/es/TextArea.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ "../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); /* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/esm/toConsumableArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var rc_input__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! rc-input */ "../../../node_modules/rc-input/es/index.js"); /* harmony import */ var rc_input_es_hooks_useCount__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! rc-input/es/hooks/useCount */ "../../../node_modules/rc-input/es/hooks/useCount.js"); /* harmony import */ var rc_input_es_utils_commonUtils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! rc-input/es/utils/commonUtils */ "../../../node_modules/rc-input/es/utils/commonUtils.js"); /* harmony import */ var rc_util_es_hooks_useMergedState__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! rc-util/es/hooks/useMergedState */ "../../../node_modules/rc-util/es/hooks/useMergedState.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_11__); /* harmony import */ var _ResizableTextArea__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ResizableTextArea */ "../../../node_modules/rc-textarea/es/ResizableTextArea.js"); var _excluded = ["defaultValue", "value", "onFocus", "onBlur", "onChange", "allowClear", "maxLength", "onCompositionStart", "onCompositionEnd", "suffix", "prefixCls", "showCount", "count", "className", "style", "disabled", "hidden", "classNames", "styles", "onResize", "onClear", "onPressEnter", "readOnly", "autoSize", "onKeyDown"]; var TextArea = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11___default().forwardRef(function (_ref, ref) { var _countConfig$max; var defaultValue = _ref.defaultValue, customValue = _ref.value, onFocus = _ref.onFocus, onBlur = _ref.onBlur, onChange = _ref.onChange, allowClear = _ref.allowClear, maxLength = _ref.maxLength, onCompositionStart = _ref.onCompositionStart, onCompositionEnd = _ref.onCompositionEnd, suffix = _ref.suffix, _ref$prefixCls = _ref.prefixCls, prefixCls = _ref$prefixCls === void 0 ? 'rc-textarea' : _ref$prefixCls, showCount = _ref.showCount, count = _ref.count, className = _ref.className, style = _ref.style, disabled = _ref.disabled, hidden = _ref.hidden, classNames = _ref.classNames, styles = _ref.styles, onResize = _ref.onResize, onClear = _ref.onClear, onPressEnter = _ref.onPressEnter, readOnly = _ref.readOnly, autoSize = _ref.autoSize, onKeyDown = _ref.onKeyDown, rest = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_5__["default"])(_ref, _excluded); var _useMergedState = (0,rc_util_es_hooks_useMergedState__WEBPACK_IMPORTED_MODULE_10__["default"])(defaultValue, { value: customValue, defaultValue: defaultValue }), _useMergedState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_useMergedState, 2), value = _useMergedState2[0], setValue = _useMergedState2[1]; var formatValue = value === undefined || value === null ? '' : String(value); var _React$useState = react__WEBPACK_IMPORTED_MODULE_11___default().useState(false), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_React$useState, 2), focused = _React$useState2[0], setFocused = _React$useState2[1]; var compositionRef = react__WEBPACK_IMPORTED_MODULE_11___default().useRef(false); var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_11___default().useState(null), _React$useState4 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_React$useState3, 2), textareaResized = _React$useState4[0], setTextareaResized = _React$useState4[1]; // =============================== Ref ================================ var holderRef = (0,react__WEBPACK_IMPORTED_MODULE_11__.useRef)(null); var resizableTextAreaRef = (0,react__WEBPACK_IMPORTED_MODULE_11__.useRef)(null); var getTextArea = function getTextArea() { var _resizableTextAreaRef; return (_resizableTextAreaRef = resizableTextAreaRef.current) === null || _resizableTextAreaRef === void 0 ? void 0 : _resizableTextAreaRef.textArea; }; var focus = function focus() { getTextArea().focus(); }; (0,react__WEBPACK_IMPORTED_MODULE_11__.useImperativeHandle)(ref, function () { var _holderRef$current; return { resizableTextArea: resizableTextAreaRef.current, focus: focus, blur: function blur() { getTextArea().blur(); }, nativeElement: ((_holderRef$current = holderRef.current) === null || _holderRef$current === void 0 ? void 0 : _holderRef$current.nativeElement) || getTextArea() }; }); (0,react__WEBPACK_IMPORTED_MODULE_11__.useEffect)(function () { setFocused(function (prev) { return !disabled && prev; }); }, [disabled]); // =========================== Select Range =========================== var _React$useState5 = react__WEBPACK_IMPORTED_MODULE_11___default().useState(null), _React$useState6 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_React$useState5, 2), selection = _React$useState6[0], setSelection = _React$useState6[1]; react__WEBPACK_IMPORTED_MODULE_11___default().useEffect(function () { if (selection) { var _getTextArea; (_getTextArea = getTextArea()).setSelectionRange.apply(_getTextArea, (0,_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_3__["default"])(selection)); } }, [selection]); // ============================== Count =============================== var countConfig = (0,rc_input_es_hooks_useCount__WEBPACK_IMPORTED_MODULE_8__["default"])(count, showCount); var mergedMax = (_countConfig$max = countConfig.max) !== null && _countConfig$max !== void 0 ? _countConfig$max : maxLength; // Max length value var hasMaxLength = Number(mergedMax) > 0; var valueLength = countConfig.strategy(formatValue); var isOutOfRange = !!mergedMax && valueLength > mergedMax; // ============================== Change ============================== var triggerChange = function triggerChange(e, currentValue) { var cutValue = currentValue; if (!compositionRef.current && countConfig.exceedFormatter && countConfig.max && countConfig.strategy(currentValue) > countConfig.max) { cutValue = countConfig.exceedFormatter(currentValue, { max: countConfig.max }); if (currentValue !== cutValue) { setSelection([getTextArea().selectionStart || 0, getTextArea().selectionEnd || 0]); } } setValue(cutValue); (0,rc_input_es_utils_commonUtils__WEBPACK_IMPORTED_MODULE_9__.resolveOnChange)(e.currentTarget, e, onChange, cutValue); }; // =========================== Value Update =========================== var onInternalCompositionStart = function onInternalCompositionStart(e) { compositionRef.current = true; onCompositionStart === null || onCompositionStart === void 0 || onCompositionStart(e); }; var onInternalCompositionEnd = function onInternalCompositionEnd(e) { compositionRef.current = false; triggerChange(e, e.currentTarget.value); onCompositionEnd === null || onCompositionEnd === void 0 || onCompositionEnd(e); }; var onInternalChange = function onInternalChange(e) { triggerChange(e, e.target.value); }; var handleKeyDown = function handleKeyDown(e) { if (e.key === 'Enter' && onPressEnter) { onPressEnter(e); } onKeyDown === null || onKeyDown === void 0 || onKeyDown(e); }; var handleFocus = function handleFocus(e) { setFocused(true); onFocus === null || onFocus === void 0 || onFocus(e); }; var handleBlur = function handleBlur(e) { setFocused(false); onBlur === null || onBlur === void 0 || onBlur(e); }; // ============================== Reset =============================== var handleReset = function handleReset(e) { setValue(''); focus(); (0,rc_input_es_utils_commonUtils__WEBPACK_IMPORTED_MODULE_9__.resolveOnChange)(getTextArea(), e, onChange); }; var suffixNode = suffix; var dataCount; if (countConfig.show) { if (countConfig.showFormatter) { dataCount = countConfig.showFormatter({ value: formatValue, count: valueLength, maxLength: mergedMax }); } else { dataCount = "".concat(valueLength).concat(hasMaxLength ? " / ".concat(mergedMax) : ''); } suffixNode = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11___default().createElement((react__WEBPACK_IMPORTED_MODULE_11___default().Fragment), null, suffixNode, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11___default().createElement("span", { className: classnames__WEBPACK_IMPORTED_MODULE_6___default()("".concat(prefixCls, "-data-count"), classNames === null || classNames === void 0 ? void 0 : classNames.count), style: styles === null || styles === void 0 ? void 0 : styles.count }, dataCount)); } var handleResize = function handleResize(size) { var _getTextArea2; onResize === null || onResize === void 0 || onResize(size); if ((_getTextArea2 = getTextArea()) !== null && _getTextArea2 !== void 0 && _getTextArea2.style.height) { setTextareaResized(true); } }; var isPureTextArea = !autoSize && !showCount && !allowClear; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11___default().createElement(rc_input__WEBPACK_IMPORTED_MODULE_7__.BaseInput, { ref: holderRef, value: formatValue, allowClear: allowClear, handleReset: handleReset, suffix: suffixNode, prefixCls: prefixCls, classNames: (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, classNames), {}, { affixWrapper: classnames__WEBPACK_IMPORTED_MODULE_6___default()(classNames === null || classNames === void 0 ? void 0 : classNames.affixWrapper, (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({}, "".concat(prefixCls, "-show-count"), showCount), "".concat(prefixCls, "-textarea-allow-clear"), allowClear)) }), disabled: disabled, focused: focused, className: classnames__WEBPACK_IMPORTED_MODULE_6___default()(className, isOutOfRange && "".concat(prefixCls, "-out-of-range")), style: (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, style), textareaResized && !isPureTextArea ? { height: 'auto' } : {}), dataAttrs: { affixWrapper: { 'data-count': typeof dataCount === 'string' ? dataCount : undefined } }, hidden: hidden, readOnly: readOnly, onClear: onClear }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_ResizableTextArea__WEBPACK_IMPORTED_MODULE_12__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { autoSize: autoSize, maxLength: maxLength, onKeyDown: handleKeyDown, onChange: onInternalChange, onFocus: handleFocus, onBlur: handleBlur, onCompositionStart: onInternalCompositionStart, onCompositionEnd: onInternalCompositionEnd, className: classnames__WEBPACK_IMPORTED_MODULE_6___default()(classNames === null || classNames === void 0 ? void 0 : classNames.textarea), style: (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, styles === null || styles === void 0 ? void 0 : styles.textarea), {}, { resize: style === null || style === void 0 ? void 0 : style.resize }), disabled: disabled, prefixCls: prefixCls, onResize: handleResize, ref: resizableTextAreaRef, readOnly: readOnly }))); }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TextArea); /***/ }), /***/ "../../../node_modules/rc-textarea/es/calculateNodeHeight.js": /*!*******************************************************************!*\ !*** ../../../node_modules/rc-textarea/es/calculateNodeHeight.js ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ calculateNodeStyling: () => (/* binding */ calculateNodeStyling), /* harmony export */ "default": () => (/* binding */ calculateAutoSizeStyle) /* harmony export */ }); // Thanks to https://github.com/andreypopp/react-textarea-autosize/ /** * calculateNodeHeight(uiTextNode, useCache = false) */ var HIDDEN_TEXTAREA_STYLE = "\n min-height:0 !important;\n max-height:none !important;\n height:0 !important;\n visibility:hidden !important;\n overflow:hidden !important;\n position:absolute !important;\n z-index:-1000 !important;\n top:0 !important;\n right:0 !important;\n pointer-events: none !important;\n"; var SIZING_STYLE = ['letter-spacing', 'line-height', 'padding-top', 'padding-bottom', 'font-family', 'font-weight', 'font-size', 'font-variant', 'text-rendering', 'text-transform', 'width', 'text-indent', 'padding-left', 'padding-right', 'border-width', 'box-sizing', 'word-break', 'white-space']; var computedStyleCache = {}; var hiddenTextarea; function calculateNodeStyling(node) { var useCache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var nodeRef = node.getAttribute('id') || node.getAttribute('data-reactid') || node.getAttribute('name'); if (useCache && computedStyleCache[nodeRef]) { return computedStyleCache[nodeRef]; } var style = window.getComputedStyle(node); var boxSizing = style.getPropertyValue('box-sizing') || style.getPropertyValue('-moz-box-sizing') || style.getPropertyValue('-webkit-box-sizing'); var paddingSize = parseFloat(style.getPropertyValue('padding-bottom')) + parseFloat(style.getPropertyValue('padding-top')); var borderSize = parseFloat(style.getPropertyValue('border-bottom-width')) + parseFloat(style.getPropertyValue('border-top-width')); var sizingStyle = SIZING_STYLE.map(function (name) { return "".concat(name, ":").concat(style.getPropertyValue(name)); }).join(';'); var nodeInfo = { sizingStyle: sizingStyle, paddingSize: paddingSize, borderSize: borderSize, boxSizing: boxSizing }; if (useCache && nodeRef) { computedStyleCache[nodeRef] = nodeInfo; } return nodeInfo; } function calculateAutoSizeStyle(uiTextNode) { var useCache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var minRows = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; var maxRows = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; if (!hiddenTextarea) { hiddenTextarea = document.createElement('textarea'); hiddenTextarea.setAttribute('tab-index', '-1'); hiddenTextarea.setAttribute('aria-hidden', 'true'); // fix: A form field element should have an id or name attribute // A form field element has neither an id nor a name attribute. This might prevent the browser from correctly autofilling the form. // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea hiddenTextarea.setAttribute('name', 'hiddenTextarea'); document.body.appendChild(hiddenTextarea); } // Fix wrap="off" issue // https://github.com/ant-design/ant-design/issues/6577 if (uiTextNode.getAttribute('wrap')) { hiddenTextarea.setAttribute('wrap', uiTextNode.getAttribute('wrap')); } else { hiddenTextarea.removeAttribute('wrap'); } // Copy all CSS properties that have an impact on the height of the content in // the textbox var _calculateNodeStyling = calculateNodeStyling(uiTextNode, useCache), paddingSize = _calculateNodeStyling.paddingSize, borderSize = _calculateNodeStyling.borderSize, boxSizing = _calculateNodeStyling.boxSizing, sizingStyle = _calculateNodeStyling.sizingStyle; // Need to have the overflow attribute to hide the scrollbar otherwise // text-lines will not calculated properly as the shadow will technically be // narrower for content hiddenTextarea.setAttribute('style', "".concat(sizingStyle, ";").concat(HIDDEN_TEXTAREA_STYLE)); hiddenTextarea.value = uiTextNode.value || uiTextNode.placeholder || ''; var minHeight = undefined; var maxHeight = undefined; var overflowY; var height = hiddenTextarea.scrollHeight; if (boxSizing === 'border-box') { // border-box: add border, since height = content + padding + border height += borderSize; } else if (boxSizing === 'content-box') { // remove padding, since height = content height -= paddingSize; } if (minRows !== null || maxRows !== null) { // measure height of a textarea with a single row hiddenTextarea.value = ' '; var singleRowHeight = hiddenTextarea.scrollHeight - paddingSize; if (minRows !== null) { minHeight = singleRowHeight * minRows; if (boxSizing === 'border-box') { minHeight = minHeight + paddingSize + borderSize; } height = Math.max(minHeight, height); } if (maxRows !== null) { maxHeight = singleRowHeight * maxRows; if (boxSizing === 'border-box') { maxHeight = maxHeight + paddingSize + borderSize; } overflowY = height > maxHeight ? '' : 'hidden'; height = Math.min(maxHeight, height); } } var style = { height: height, overflowY: overflowY, resize: 'none' }; if (minHeight) { style.minHeight = minHeight; } if (maxHeight) { style.maxHeight = maxHeight; } return style; } /***/ }), /***/ "../../../node_modules/rc-textarea/es/index.js": /*!*****************************************************!*\ !*** ../../../node_modules/rc-textarea/es/index.js ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ResizableTextArea: () => (/* reexport safe */ _ResizableTextArea__WEBPACK_IMPORTED_MODULE_1__["default"]), /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _TextArea__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TextArea */ "../../../node_modules/rc-textarea/es/TextArea.js"); /* harmony import */ var _ResizableTextArea__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ResizableTextArea */ "../../../node_modules/rc-textarea/es/ResizableTextArea.js"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_TextArea__WEBPACK_IMPORTED_MODULE_0__["default"]); /***/ }), /***/ "../../../node_modules/rc-tooltip/es/Popup.js": /*!****************************************************!*\ !*** ../../../node_modules/rc-tooltip/es/Popup.js ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ Popup) /* harmony export */ }); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); function Popup(props) { var children = props.children, prefixCls = props.prefixCls, id = props.id, innerStyle = props.overlayInnerStyle, bodyClassName = props.bodyClassName, className = props.className, style = props.style; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("div", { className: classnames__WEBPACK_IMPORTED_MODULE_0___default()("".concat(prefixCls, "-content"), className), style: style }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("div", { className: classnames__WEBPACK_IMPORTED_MODULE_0___default()("".concat(prefixCls, "-inner"), bodyClassName), id: id, role: "tooltip", style: innerStyle }, typeof children === 'function' ? children() : children)); } /***/ }), /***/ "../../../node_modules/rc-tooltip/es/Tooltip.js": /*!******************************************************!*\ !*** ../../../node_modules/rc-tooltip/es/Tooltip.js ***! \******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var _rc_component_trigger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @rc-component/trigger */ "../../../node_modules/@rc-component/trigger/es/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _placements__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./placements */ "../../../node_modules/rc-tooltip/es/placements.js"); /* harmony import */ var _Popup__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Popup */ "../../../node_modules/rc-tooltip/es/Popup.js"); /* harmony import */ var rc_util_es_hooks_useId__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! rc-util/es/hooks/useId */ "../../../node_modules/rc-util/es/hooks/useId.js"); var _excluded = ["overlayClassName", "trigger", "mouseEnterDelay", "mouseLeaveDelay", "overlayStyle", "prefixCls", "children", "onVisibleChange", "afterVisibleChange", "transitionName", "animation", "motion", "placement", "align", "destroyTooltipOnHide", "defaultVisible", "getTooltipContainer", "overlayInnerStyle", "arrowContent", "overlay", "id", "showArrow", "classNames", "styles"]; var Tooltip = function Tooltip(props, ref) { var overlayClassName = props.overlayClassName, _props$trigger = props.trigger, trigger = _props$trigger === void 0 ? ['hover'] : _props$trigger, _props$mouseEnterDela = props.mouseEnterDelay, mouseEnterDelay = _props$mouseEnterDela === void 0 ? 0 : _props$mouseEnterDela, _props$mouseLeaveDela = props.mouseLeaveDelay, mouseLeaveDelay = _props$mouseLeaveDela === void 0 ? 0.1 : _props$mouseLeaveDela, overlayStyle = props.overlayStyle, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? 'rc-tooltip' : _props$prefixCls, children = props.children, onVisibleChange = props.onVisibleChange, afterVisibleChange = props.afterVisibleChange, transitionName = props.transitionName, animation = props.animation, motion = props.motion, _props$placement = props.placement, placement = _props$placement === void 0 ? 'right' : _props$placement, _props$align = props.align, align = _props$align === void 0 ? {} : _props$align, _props$destroyTooltip = props.destroyTooltipOnHide, destroyTooltipOnHide = _props$destroyTooltip === void 0 ? false : _props$destroyTooltip, defaultVisible = props.defaultVisible, getTooltipContainer = props.getTooltipContainer, overlayInnerStyle = props.overlayInnerStyle, arrowContent = props.arrowContent, overlay = props.overlay, id = props.id, _props$showArrow = props.showArrow, showArrow = _props$showArrow === void 0 ? true : _props$showArrow, tooltipClassNames = props.classNames, tooltipStyles = props.styles, restProps = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__["default"])(props, _excluded); var mergedId = (0,rc_util_es_hooks_useId__WEBPACK_IMPORTED_MODULE_8__["default"])(id); var triggerRef = (0,react__WEBPACK_IMPORTED_MODULE_5__.useRef)(null); (0,react__WEBPACK_IMPORTED_MODULE_5__.useImperativeHandle)(ref, function () { return triggerRef.current; }); var extraProps = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])({}, restProps); if ('visible' in props) { extraProps.popupVisible = props.visible; } var getPopupElement = function getPopupElement() { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__.createElement(_Popup__WEBPACK_IMPORTED_MODULE_7__["default"], { key: "content", prefixCls: prefixCls, id: mergedId, bodyClassName: tooltipClassNames === null || tooltipClassNames === void 0 ? void 0 : tooltipClassNames.body, overlayInnerStyle: (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])({}, overlayInnerStyle), tooltipStyles === null || tooltipStyles === void 0 ? void 0 : tooltipStyles.body) }, overlay); }; var getChildren = function getChildren() { var child = react__WEBPACK_IMPORTED_MODULE_5__.Children.only(children); var originalProps = (child === null || child === void 0 ? void 0 : child.props) || {}; var childProps = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])({}, originalProps), {}, { 'aria-describedby': overlay ? mergedId : null }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__.cloneElement(children, childProps); }; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__.createElement(_rc_component_trigger__WEBPACK_IMPORTED_MODULE_3__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ popupClassName: classnames__WEBPACK_IMPORTED_MODULE_4___default()(overlayClassName, tooltipClassNames === null || tooltipClassNames === void 0 ? void 0 : tooltipClassNames.root), prefixCls: prefixCls, popup: getPopupElement, action: trigger, builtinPlacements: _placements__WEBPACK_IMPORTED_MODULE_6__.placements, popupPlacement: placement, ref: triggerRef, popupAlign: align, getPopupContainer: getTooltipContainer, onPopupVisibleChange: onVisibleChange, afterPopupVisibleChange: afterVisibleChange, popupTransitionName: transitionName, popupAnimation: animation, popupMotion: motion, defaultPopupVisible: defaultVisible, autoDestroy: destroyTooltipOnHide, mouseLeaveDelay: mouseLeaveDelay, popupStyle: (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])({}, overlayStyle), tooltipStyles === null || tooltipStyles === void 0 ? void 0 : tooltipStyles.root), mouseEnterDelay: mouseEnterDelay, arrow: showArrow }, extraProps), getChildren()); }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_5__.forwardRef)(Tooltip)); /***/ }), /***/ "../../../node_modules/rc-tooltip/es/index.js": /*!****************************************************!*\ !*** ../../../node_modules/rc-tooltip/es/index.js ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Popup: () => (/* reexport safe */ _Popup__WEBPACK_IMPORTED_MODULE_0__["default"]), /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _Popup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Popup */ "../../../node_modules/rc-tooltip/es/Popup.js"); /* harmony import */ var _Tooltip__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Tooltip */ "../../../node_modules/rc-tooltip/es/Tooltip.js"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_Tooltip__WEBPACK_IMPORTED_MODULE_1__["default"]); /***/ }), /***/ "../../../node_modules/rc-tooltip/es/placements.js": /*!*********************************************************!*\ !*** ../../../node_modules/rc-tooltip/es/placements.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__), /* harmony export */ placements: () => (/* binding */ placements) /* harmony export */ }); var autoAdjustOverflowTopBottom = { shiftX: 64, adjustY: 1 }; var autoAdjustOverflowLeftRight = { adjustX: 1, shiftY: true }; var targetOffset = [0, 0]; var placements = { left: { points: ['cr', 'cl'], overflow: autoAdjustOverflowLeftRight, offset: [-4, 0], targetOffset: targetOffset }, right: { points: ['cl', 'cr'], overflow: autoAdjustOverflowLeftRight, offset: [4, 0], targetOffset: targetOffset }, top: { points: ['bc', 'tc'], overflow: autoAdjustOverflowTopBottom, offset: [0, -4], targetOffset: targetOffset }, bottom: { points: ['tc', 'bc'], overflow: autoAdjustOverflowTopBottom, offset: [0, 4], targetOffset: targetOffset }, topLeft: { points: ['bl', 'tl'], overflow: autoAdjustOverflowTopBottom, offset: [0, -4], targetOffset: targetOffset }, leftTop: { points: ['tr', 'tl'], overflow: autoAdjustOverflowLeftRight, offset: [-4, 0], targetOffset: targetOffset }, topRight: { points: ['br', 'tr'], overflow: autoAdjustOverflowTopBottom, offset: [0, -4], targetOffset: targetOffset }, rightTop: { points: ['tl', 'tr'], overflow: autoAdjustOverflowLeftRight, offset: [4, 0], targetOffset: targetOffset }, bottomRight: { points: ['tr', 'br'], overflow: autoAdjustOverflowTopBottom, offset: [0, 4], targetOffset: targetOffset }, rightBottom: { points: ['bl', 'br'], overflow: autoAdjustOverflowLeftRight, offset: [4, 0], targetOffset: targetOffset }, bottomLeft: { points: ['tl', 'bl'], overflow: autoAdjustOverflowTopBottom, offset: [0, 4], targetOffset: targetOffset }, leftBottom: { points: ['br', 'bl'], overflow: autoAdjustOverflowLeftRight, offset: [-4, 0], targetOffset: targetOffset } }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (placements); /***/ }), /***/ "../../../node_modules/rc-tree/es/DropIndicator.js": /*!*********************************************************!*\ !*** ../../../node_modules/rc-tree/es/DropIndicator.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); var DropIndicator = function DropIndicator(props) { var dropPosition = props.dropPosition, dropLevelOffset = props.dropLevelOffset, indent = props.indent; var style = { pointerEvents: 'none', position: 'absolute', right: 0, backgroundColor: 'red', height: 2 }; switch (dropPosition) { case -1: style.top = 0; style.left = -dropLevelOffset * indent; break; case 1: style.bottom = 0; style.left = -dropLevelOffset * indent; break; case 0: style.bottom = 0; style.left = indent; break; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: style }); }; if (true) { DropIndicator.displayName = 'DropIndicator'; } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DropIndicator); /***/ }), /***/ "../../../node_modules/rc-tree/es/Indent.js": /*!**************************************************!*\ !*** ../../../node_modules/rc-tree/es/Indent.js ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ "../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); var Indent = function Indent(_ref) { var prefixCls = _ref.prefixCls, level = _ref.level, isStart = _ref.isStart, isEnd = _ref.isEnd; var baseClassName = "".concat(prefixCls, "-indent-unit"); var list = []; for (var i = 0; i < level; i += 1) { list.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.createElement("span", { key: i, className: classnames__WEBPACK_IMPORTED_MODULE_1___default()(baseClassName, (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])({}, "".concat(baseClassName, "-start"), isStart[i]), "".concat(baseClassName, "-end"), isEnd[i])) })); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.createElement("span", { "aria-hidden": "true", className: "".concat(prefixCls, "-indent") }, list); }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.memo(Indent)); /***/ }), /***/ "../../../node_modules/rc-tree/es/MotionTreeNode.js": /*!**********************************************************!*\ !*** ../../../node_modules/rc-tree/es/MotionTreeNode.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectDestructuringEmpty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectDestructuringEmpty */ "../../../node_modules/@babel/runtime/helpers/esm/objectDestructuringEmpty.js"); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var rc_motion__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! rc-motion */ "../../../node_modules/rc-motion/es/index.js"); /* harmony import */ var rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! rc-util/es/hooks/useLayoutEffect */ "../../../node_modules/rc-util/es/hooks/useLayoutEffect.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var _contextTypes__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./contextTypes */ "../../../node_modules/rc-tree/es/contextTypes.js"); /* harmony import */ var _TreeNode__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./TreeNode */ "../../../node_modules/rc-tree/es/TreeNode.js"); /* harmony import */ var _useUnmount__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./useUnmount */ "../../../node_modules/rc-tree/es/useUnmount.js"); /* harmony import */ var _utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utils/treeUtil */ "../../../node_modules/rc-tree/es/utils/treeUtil.js"); var _excluded = ["className", "style", "motion", "motionNodes", "motionType", "onMotionStart", "onMotionEnd", "active", "treeNodeRequiredProps"]; var MotionTreeNode = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7__.forwardRef(function (oriProps, ref) { var className = oriProps.className, style = oriProps.style, motion = oriProps.motion, motionNodes = oriProps.motionNodes, motionType = oriProps.motionType, onOriginMotionStart = oriProps.onMotionStart, onOriginMotionEnd = oriProps.onMotionEnd, active = oriProps.active, treeNodeRequiredProps = oriProps.treeNodeRequiredProps, props = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__["default"])(oriProps, _excluded); var _React$useState = react__WEBPACK_IMPORTED_MODULE_7__.useState(true), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState, 2), visible = _React$useState2[0], setVisible = _React$useState2[1]; var _React$useContext = react__WEBPACK_IMPORTED_MODULE_7__.useContext(_contextTypes__WEBPACK_IMPORTED_MODULE_8__.TreeContext), prefixCls = _React$useContext.prefixCls; // Calculate target visible here. // And apply in effect to make `leave` motion work. var targetVisible = motionNodes && motionType !== 'hide'; (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_6__["default"])(function () { if (motionNodes) { if (targetVisible !== visible) { setVisible(targetVisible); } } }, [motionNodes]); var triggerMotionStart = function triggerMotionStart() { if (motionNodes) { onOriginMotionStart(); } }; // Should only trigger once var triggerMotionEndRef = react__WEBPACK_IMPORTED_MODULE_7__.useRef(false); var triggerMotionEnd = function triggerMotionEnd() { if (motionNodes && !triggerMotionEndRef.current) { triggerMotionEndRef.current = true; onOriginMotionEnd(); } }; // Effect if unmount (0,_useUnmount__WEBPACK_IMPORTED_MODULE_10__["default"])(triggerMotionStart, triggerMotionEnd); // Motion end event var onVisibleChanged = function onVisibleChanged(nextVisible) { if (targetVisible === nextVisible) { triggerMotionEnd(); } }; if (motionNodes) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7__.createElement(rc_motion__WEBPACK_IMPORTED_MODULE_5__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ ref: ref, visible: visible }, motion, { motionAppear: motionType === 'show', onVisibleChanged: onVisibleChanged }), function (_ref, motionRef) { var motionClassName = _ref.className, motionStyle = _ref.style; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7__.createElement("div", { ref: motionRef, className: classnames__WEBPACK_IMPORTED_MODULE_4___default()("".concat(prefixCls, "-treenode-motion"), motionClassName), style: motionStyle }, motionNodes.map(function (treeNode) { var restProps = Object.assign({}, ((0,_babel_runtime_helpers_esm_objectDestructuringEmpty__WEBPACK_IMPORTED_MODULE_1__["default"])(treeNode.data), treeNode.data)), title = treeNode.title, key = treeNode.key, isStart = treeNode.isStart, isEnd = treeNode.isEnd; delete restProps.children; var treeNodeProps = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.getTreeNodeProps)(key, treeNodeRequiredProps); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7__.createElement(_TreeNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, restProps, treeNodeProps, { title: title, active: active, data: treeNode.data, key: key, isStart: isStart, isEnd: isEnd })); })); }); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7__.createElement(_TreeNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ domRef: ref, className: className, style: style }, props, { active: active })); }); if (true) { MotionTreeNode.displayName = 'MotionTreeNode'; } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MotionTreeNode); /***/ }), /***/ "../../../node_modules/rc-tree/es/NodeList.js": /*!****************************************************!*\ !*** ../../../node_modules/rc-tree/es/NodeList.js ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MOTION_KEY: () => (/* binding */ MOTION_KEY), /* harmony export */ MotionEntity: () => (/* binding */ MotionEntity), /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__), /* harmony export */ getMinimumRangeTransitionRange: () => (/* binding */ getMinimumRangeTransitionRange) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectDestructuringEmpty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectDestructuringEmpty */ "../../../node_modules/@babel/runtime/helpers/esm/objectDestructuringEmpty.js"); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! rc-util/es/hooks/useLayoutEffect */ "../../../node_modules/rc-util/es/hooks/useLayoutEffect.js"); /* harmony import */ var rc_virtual_list__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! rc-virtual-list */ "../../../node_modules/rc-virtual-list/es/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _MotionTreeNode__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./MotionTreeNode */ "../../../node_modules/rc-tree/es/MotionTreeNode.js"); /* harmony import */ var _utils_diffUtil__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/diffUtil */ "../../../node_modules/rc-tree/es/utils/diffUtil.js"); /* harmony import */ var _utils_treeUtil__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utils/treeUtil */ "../../../node_modules/rc-tree/es/utils/treeUtil.js"); var _excluded = ["prefixCls", "data", "selectable", "checkable", "expandedKeys", "selectedKeys", "checkedKeys", "loadedKeys", "loadingKeys", "halfCheckedKeys", "keyEntities", "disabled", "dragging", "dragOverNodeKey", "dropPosition", "motion", "height", "itemHeight", "virtual", "scrollWidth", "focusable", "activeItem", "focused", "tabIndex", "onKeyDown", "onFocus", "onBlur", "onActiveChange", "onListChangeStart", "onListChangeEnd"]; /** * Handle virtual list of the TreeNodes. */ var HIDDEN_STYLE = { width: 0, height: 0, display: 'flex', overflow: 'hidden', opacity: 0, border: 0, padding: 0, margin: 0 }; var noop = function noop() {}; var MOTION_KEY = "RC_TREE_MOTION_".concat(Math.random()); var MotionNode = { key: MOTION_KEY }; var MotionEntity = { key: MOTION_KEY, level: 0, index: 0, pos: '0', node: MotionNode, nodes: [MotionNode] }; var MotionFlattenData = { parent: null, children: [], pos: MotionEntity.pos, data: MotionNode, title: null, key: MOTION_KEY, /** Hold empty list here since we do not use it */ isStart: [], isEnd: [] }; /** * We only need get visible content items to play the animation. */ function getMinimumRangeTransitionRange(list, virtual, height, itemHeight) { if (virtual === false || !height) { return list; } return list.slice(0, Math.ceil(height / itemHeight) + 1); } function itemKey(item) { var key = item.key, pos = item.pos; return (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_9__.getKey)(key, pos); } function getAccessibilityPath(item) { var path = String(item.data.key); var current = item; while (current.parent) { current = current.parent; path = "".concat(current.data.key, " > ").concat(path); } return path; } var NodeList = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.forwardRef(function (props, ref) { var prefixCls = props.prefixCls, data = props.data, selectable = props.selectable, checkable = props.checkable, expandedKeys = props.expandedKeys, selectedKeys = props.selectedKeys, checkedKeys = props.checkedKeys, loadedKeys = props.loadedKeys, loadingKeys = props.loadingKeys, halfCheckedKeys = props.halfCheckedKeys, keyEntities = props.keyEntities, disabled = props.disabled, dragging = props.dragging, dragOverNodeKey = props.dragOverNodeKey, dropPosition = props.dropPosition, motion = props.motion, height = props.height, itemHeight = props.itemHeight, virtual = props.virtual, scrollWidth = props.scrollWidth, focusable = props.focusable, activeItem = props.activeItem, focused = props.focused, tabIndex = props.tabIndex, onKeyDown = props.onKeyDown, onFocus = props.onFocus, onBlur = props.onBlur, onActiveChange = props.onActiveChange, onListChangeStart = props.onListChangeStart, onListChangeEnd = props.onListChangeEnd, domProps = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__["default"])(props, _excluded); // =============================== Ref ================================ var listRef = react__WEBPACK_IMPORTED_MODULE_6__.useRef(null); var indentMeasurerRef = react__WEBPACK_IMPORTED_MODULE_6__.useRef(null); react__WEBPACK_IMPORTED_MODULE_6__.useImperativeHandle(ref, function () { return { scrollTo: function scrollTo(scroll) { listRef.current.scrollTo(scroll); }, getIndentWidth: function getIndentWidth() { return indentMeasurerRef.current.offsetWidth; } }; }); // ============================== Motion ============================== var _React$useState = react__WEBPACK_IMPORTED_MODULE_6__.useState(expandedKeys), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState, 2), prevExpandedKeys = _React$useState2[0], setPrevExpandedKeys = _React$useState2[1]; var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_6__.useState(data), _React$useState4 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState3, 2), prevData = _React$useState4[0], setPrevData = _React$useState4[1]; var _React$useState5 = react__WEBPACK_IMPORTED_MODULE_6__.useState(data), _React$useState6 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState5, 2), transitionData = _React$useState6[0], setTransitionData = _React$useState6[1]; var _React$useState7 = react__WEBPACK_IMPORTED_MODULE_6__.useState([]), _React$useState8 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState7, 2), transitionRange = _React$useState8[0], setTransitionRange = _React$useState8[1]; var _React$useState9 = react__WEBPACK_IMPORTED_MODULE_6__.useState(null), _React$useState10 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState9, 2), motionType = _React$useState10[0], setMotionType = _React$useState10[1]; // When motion end but data change, this will makes data back to previous one var dataRef = react__WEBPACK_IMPORTED_MODULE_6__.useRef(data); dataRef.current = data; function onMotionEnd() { var latestData = dataRef.current; setPrevData(latestData); setTransitionData(latestData); setTransitionRange([]); setMotionType(null); onListChangeEnd(); } // Do animation if expanded keys changed // layoutEffect here to avoid blink of node removing (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_4__["default"])(function () { setPrevExpandedKeys(expandedKeys); var diffExpanded = (0,_utils_diffUtil__WEBPACK_IMPORTED_MODULE_8__.findExpandedKeys)(prevExpandedKeys, expandedKeys); if (diffExpanded.key !== null) { if (diffExpanded.add) { var keyIndex = prevData.findIndex(function (_ref) { var key = _ref.key; return key === diffExpanded.key; }); var rangeNodes = getMinimumRangeTransitionRange((0,_utils_diffUtil__WEBPACK_IMPORTED_MODULE_8__.getExpandRange)(prevData, data, diffExpanded.key), virtual, height, itemHeight); var newTransitionData = prevData.slice(); newTransitionData.splice(keyIndex + 1, 0, MotionFlattenData); setTransitionData(newTransitionData); setTransitionRange(rangeNodes); setMotionType('show'); } else { var _keyIndex = data.findIndex(function (_ref2) { var key = _ref2.key; return key === diffExpanded.key; }); var _rangeNodes = getMinimumRangeTransitionRange((0,_utils_diffUtil__WEBPACK_IMPORTED_MODULE_8__.getExpandRange)(data, prevData, diffExpanded.key), virtual, height, itemHeight); var _newTransitionData = data.slice(); _newTransitionData.splice(_keyIndex + 1, 0, MotionFlattenData); setTransitionData(_newTransitionData); setTransitionRange(_rangeNodes); setMotionType('hide'); } } else if (prevData !== data) { // If whole data changed, we just refresh the list setPrevData(data); setTransitionData(data); } }, [expandedKeys, data]); // We should clean up motion if is changed by dragging react__WEBPACK_IMPORTED_MODULE_6__.useEffect(function () { if (!dragging) { onMotionEnd(); } }, [dragging]); var mergedData = motion ? transitionData : data; var treeNodeRequiredProps = { expandedKeys: expandedKeys, selectedKeys: selectedKeys, loadedKeys: loadedKeys, loadingKeys: loadingKeys, checkedKeys: checkedKeys, halfCheckedKeys: halfCheckedKeys, dragOverNodeKey: dragOverNodeKey, dropPosition: dropPosition, keyEntities: keyEntities }; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement(react__WEBPACK_IMPORTED_MODULE_6__.Fragment, null, focused && activeItem && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement("span", { style: HIDDEN_STYLE, "aria-live": "assertive" }, getAccessibilityPath(activeItem)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement("input", { style: HIDDEN_STYLE, disabled: focusable === false || disabled, tabIndex: focusable !== false ? tabIndex : null, onKeyDown: onKeyDown, onFocus: onFocus, onBlur: onBlur, value: "", onChange: noop, "aria-label": "for screen reader" })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement("div", { className: "".concat(prefixCls, "-treenode"), "aria-hidden": true, style: { position: 'absolute', pointerEvents: 'none', visibility: 'hidden', height: 0, overflow: 'hidden', border: 0, padding: 0 } }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement("div", { className: "".concat(prefixCls, "-indent") }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement("div", { ref: indentMeasurerRef, className: "".concat(prefixCls, "-indent-unit") }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement(rc_virtual_list__WEBPACK_IMPORTED_MODULE_5__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, domProps, { data: mergedData, itemKey: itemKey, height: height, fullHeight: false, virtual: virtual, itemHeight: itemHeight, scrollWidth: scrollWidth, prefixCls: "".concat(prefixCls, "-list"), ref: listRef, role: "tree", onVisibleChange: function onVisibleChange(originList) { // The best match is using `fullList` - `originList` = `restList` // and check the `restList` to see if has the MOTION_KEY node // but this will cause performance issue for long list compare // we just check `originList` and repeat trigger `onMotionEnd` if (originList.every(function (item) { return itemKey(item) !== MOTION_KEY; })) { onMotionEnd(); } } }), function (treeNode) { var pos = treeNode.pos, restProps = Object.assign({}, ((0,_babel_runtime_helpers_esm_objectDestructuringEmpty__WEBPACK_IMPORTED_MODULE_1__["default"])(treeNode.data), treeNode.data)), title = treeNode.title, key = treeNode.key, isStart = treeNode.isStart, isEnd = treeNode.isEnd; var mergedKey = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_9__.getKey)(key, pos); delete restProps.key; delete restProps.children; var treeNodeProps = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_9__.getTreeNodeProps)(mergedKey, treeNodeRequiredProps); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement(_MotionTreeNode__WEBPACK_IMPORTED_MODULE_7__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, restProps, treeNodeProps, { title: title, active: !!activeItem && key === activeItem.key, pos: pos, data: treeNode.data, isStart: isStart, isEnd: isEnd, motion: motion, motionNodes: key === MOTION_KEY ? transitionRange : null, motionType: motionType, onMotionStart: onListChangeStart, onMotionEnd: onMotionEnd, treeNodeRequiredProps: treeNodeRequiredProps, onMouseMove: function onMouseMove() { onActiveChange(null); } })); })); }); if (true) { NodeList.displayName = 'NodeList'; } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NodeList); /***/ }), /***/ "../../../node_modules/rc-tree/es/Tree.js": /*!************************************************!*\ !*** ../../../node_modules/rc-tree/es/Tree.js ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ "../../../node_modules/@babel/runtime/helpers/esm/typeof.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); /* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/esm/toConsumableArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/esm/classCallCheck */ "../../../node_modules/@babel/runtime/helpers/esm/classCallCheck.js"); /* harmony import */ var _babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createClass */ "../../../node_modules/@babel/runtime/helpers/esm/createClass.js"); /* harmony import */ var _babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/esm/assertThisInitialized */ "../../../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js"); /* harmony import */ var _babel_runtime_helpers_esm_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inherits */ "../../../node_modules/@babel/runtime/helpers/esm/inherits.js"); /* harmony import */ var _babel_runtime_helpers_esm_createSuper__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createSuper */ "../../../node_modules/@babel/runtime/helpers/esm/createSuper.js"); /* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ "../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_10__); /* harmony import */ var rc_util_es_KeyCode__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! rc-util/es/KeyCode */ "../../../node_modules/rc-util/es/KeyCode.js"); /* harmony import */ var rc_util_es_pickAttrs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! rc-util/es/pickAttrs */ "../../../node_modules/rc-util/es/pickAttrs.js"); /* harmony import */ var rc_util_es_warning__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! rc-util/es/warning */ "../../../node_modules/rc-util/es/warning.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_14__); /* harmony import */ var _contextTypes__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./contextTypes */ "../../../node_modules/rc-tree/es/contextTypes.js"); /* harmony import */ var _DropIndicator__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./DropIndicator */ "../../../node_modules/rc-tree/es/DropIndicator.js"); /* harmony import */ var _NodeList__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./NodeList */ "../../../node_modules/rc-tree/es/NodeList.js"); /* harmony import */ var _TreeNode__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./TreeNode */ "../../../node_modules/rc-tree/es/TreeNode.js"); /* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./util */ "../../../node_modules/rc-tree/es/util.js"); /* harmony import */ var _utils_conductUtil__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./utils/conductUtil */ "../../../node_modules/rc-tree/es/utils/conductUtil.js"); /* harmony import */ var _utils_keyUtil__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./utils/keyUtil */ "../../../node_modules/rc-tree/es/utils/keyUtil.js"); /* harmony import */ var _utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./utils/treeUtil */ "../../../node_modules/rc-tree/es/utils/treeUtil.js"); // TODO: https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/treeview/treeview-2/treeview-2a.html // Fully accessibility support var MAX_RETRY_TIMES = 10; var Tree = /*#__PURE__*/function (_React$Component) { (0,_babel_runtime_helpers_esm_inherits__WEBPACK_IMPORTED_MODULE_7__["default"])(Tree, _React$Component); var _super = (0,_babel_runtime_helpers_esm_createSuper__WEBPACK_IMPORTED_MODULE_8__["default"])(Tree); function Tree() { var _this; (0,_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_4__["default"])(this, Tree); for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) { _args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(_args)); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "destroyed", false); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "delayedDragEnterLogic", void 0); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "loadingRetryTimes", {}); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "state", { keyEntities: {}, indent: null, selectedKeys: [], checkedKeys: [], halfCheckedKeys: [], loadedKeys: [], loadingKeys: [], expandedKeys: [], draggingNodeKey: null, dragChildrenKeys: [], // dropTargetKey is the key of abstract-drop-node // the abstract-drop-node is the real drop node when drag and drop // not the DOM drag over node dropTargetKey: null, dropPosition: null, // the drop position of abstract-drop-node, inside 0, top -1, bottom 1 dropContainerKey: null, // the container key of abstract-drop-node if dropPosition is -1 or 1 dropLevelOffset: null, // the drop level offset of abstract-drag-over-node dropTargetPos: null, // the pos of abstract-drop-node dropAllowed: true, // if drop to abstract-drop-node is allowed // the abstract-drag-over-node // if mouse is on the bottom of top dom node or no the top of the bottom dom node // abstract-drag-over-node is the top node dragOverNodeKey: null, treeData: [], flattenNodes: [], focused: false, activeKey: null, listChanging: false, prevProps: null, fieldNames: (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.fillFieldNames)() }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "dragStartMousePosition", null); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "dragNodeProps", null); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "currentMouseOverDroppableNodeKey", null); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "listRef", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_14__.createRef()); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeDragStart", function (event, nodeProps) { var _this$state = _this.state, expandedKeys = _this$state.expandedKeys, keyEntities = _this$state.keyEntities; var onDragStart = _this.props.onDragStart; var eventKey = nodeProps.eventKey; _this.dragNodeProps = nodeProps; _this.dragStartMousePosition = { x: event.clientX, y: event.clientY }; var newExpandedKeys = (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(expandedKeys, eventKey); _this.setState({ draggingNodeKey: eventKey, dragChildrenKeys: (0,_util__WEBPACK_IMPORTED_MODULE_19__.getDragChildrenKeys)(eventKey, keyEntities), indent: _this.listRef.current.getIndentWidth() }); _this.setExpandedKeys(newExpandedKeys); window.addEventListener('dragend', _this.onWindowDragEnd); onDragStart === null || onDragStart === void 0 || onDragStart({ event: event, node: (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)(nodeProps) }); }); /** * [Legacy] Select handler is smaller than node, * so that this will trigger when drag enter node or select handler. * This is a little tricky if customize css without padding. * Better for use mouse move event to refresh drag state. * But let's just keep it to avoid event trigger logic change. */ (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeDragEnter", function (event, nodeProps) { var _this$state2 = _this.state, expandedKeys = _this$state2.expandedKeys, keyEntities = _this$state2.keyEntities, dragChildrenKeys = _this$state2.dragChildrenKeys, flattenNodes = _this$state2.flattenNodes, indent = _this$state2.indent; var _this$props = _this.props, onDragEnter = _this$props.onDragEnter, onExpand = _this$props.onExpand, allowDrop = _this$props.allowDrop, direction = _this$props.direction; var pos = nodeProps.pos, eventKey = nodeProps.eventKey; // record the key of node which is latest entered, used in dragleave event. if (_this.currentMouseOverDroppableNodeKey !== eventKey) { _this.currentMouseOverDroppableNodeKey = eventKey; } if (!_this.dragNodeProps) { _this.resetDragState(); return; } var _calcDropPosition = (0,_util__WEBPACK_IMPORTED_MODULE_19__.calcDropPosition)(event, _this.dragNodeProps, nodeProps, indent, _this.dragStartMousePosition, allowDrop, flattenNodes, keyEntities, expandedKeys, direction), dropPosition = _calcDropPosition.dropPosition, dropLevelOffset = _calcDropPosition.dropLevelOffset, dropTargetKey = _calcDropPosition.dropTargetKey, dropContainerKey = _calcDropPosition.dropContainerKey, dropTargetPos = _calcDropPosition.dropTargetPos, dropAllowed = _calcDropPosition.dropAllowed, dragOverNodeKey = _calcDropPosition.dragOverNodeKey; if ( // don't allow drop inside its children dragChildrenKeys.includes(dropTargetKey) || // don't allow drop when drop is not allowed caculated by calcDropPosition !dropAllowed) { _this.resetDragState(); return; } // Side effect for delay drag if (!_this.delayedDragEnterLogic) { _this.delayedDragEnterLogic = {}; } Object.keys(_this.delayedDragEnterLogic).forEach(function (key) { clearTimeout(_this.delayedDragEnterLogic[key]); }); if (_this.dragNodeProps.eventKey !== nodeProps.eventKey) { // hoist expand logic here // since if logic is on the bottom // it will be blocked by abstract dragover node check // => if you dragenter from top, you mouse will still be consider as in the top node event.persist(); _this.delayedDragEnterLogic[pos] = window.setTimeout(function () { if (_this.state.draggingNodeKey === null) { return; } var newExpandedKeys = (0,_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_3__["default"])(expandedKeys); var entity = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_21__["default"])(keyEntities, nodeProps.eventKey); if (entity && (entity.children || []).length) { newExpandedKeys = (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrAdd)(expandedKeys, nodeProps.eventKey); } if (!_this.props.hasOwnProperty('expandedKeys')) { _this.setExpandedKeys(newExpandedKeys); } onExpand === null || onExpand === void 0 || onExpand(newExpandedKeys, { node: (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)(nodeProps), expanded: true, nativeEvent: event.nativeEvent }); }, 800); } // Skip if drag node is self if (_this.dragNodeProps.eventKey === dropTargetKey && dropLevelOffset === 0) { _this.resetDragState(); return; } // Update drag over node and drag state _this.setState({ dragOverNodeKey: dragOverNodeKey, dropPosition: dropPosition, dropLevelOffset: dropLevelOffset, dropTargetKey: dropTargetKey, dropContainerKey: dropContainerKey, dropTargetPos: dropTargetPos, dropAllowed: dropAllowed }); onDragEnter === null || onDragEnter === void 0 || onDragEnter({ event: event, node: (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)(nodeProps), expandedKeys: expandedKeys }); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeDragOver", function (event, nodeProps) { var _this$state3 = _this.state, dragChildrenKeys = _this$state3.dragChildrenKeys, flattenNodes = _this$state3.flattenNodes, keyEntities = _this$state3.keyEntities, expandedKeys = _this$state3.expandedKeys, indent = _this$state3.indent; var _this$props2 = _this.props, onDragOver = _this$props2.onDragOver, allowDrop = _this$props2.allowDrop, direction = _this$props2.direction; if (!_this.dragNodeProps) { return; } var _calcDropPosition2 = (0,_util__WEBPACK_IMPORTED_MODULE_19__.calcDropPosition)(event, _this.dragNodeProps, nodeProps, indent, _this.dragStartMousePosition, allowDrop, flattenNodes, keyEntities, expandedKeys, direction), dropPosition = _calcDropPosition2.dropPosition, dropLevelOffset = _calcDropPosition2.dropLevelOffset, dropTargetKey = _calcDropPosition2.dropTargetKey, dropContainerKey = _calcDropPosition2.dropContainerKey, dropTargetPos = _calcDropPosition2.dropTargetPos, dropAllowed = _calcDropPosition2.dropAllowed, dragOverNodeKey = _calcDropPosition2.dragOverNodeKey; if (dragChildrenKeys.includes(dropTargetKey) || !dropAllowed) { // don't allow drop inside its children // don't allow drop when drop is not allowed calculated by calcDropPosition return; } // Update drag position if (_this.dragNodeProps.eventKey === dropTargetKey && dropLevelOffset === 0) { if (!(_this.state.dropPosition === null && _this.state.dropLevelOffset === null && _this.state.dropTargetKey === null && _this.state.dropContainerKey === null && _this.state.dropTargetPos === null && _this.state.dropAllowed === false && _this.state.dragOverNodeKey === null)) { _this.resetDragState(); } } else if (!(dropPosition === _this.state.dropPosition && dropLevelOffset === _this.state.dropLevelOffset && dropTargetKey === _this.state.dropTargetKey && dropContainerKey === _this.state.dropContainerKey && dropTargetPos === _this.state.dropTargetPos && dropAllowed === _this.state.dropAllowed && dragOverNodeKey === _this.state.dragOverNodeKey)) { _this.setState({ dropPosition: dropPosition, dropLevelOffset: dropLevelOffset, dropTargetKey: dropTargetKey, dropContainerKey: dropContainerKey, dropTargetPos: dropTargetPos, dropAllowed: dropAllowed, dragOverNodeKey: dragOverNodeKey }); } onDragOver === null || onDragOver === void 0 || onDragOver({ event: event, node: (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)(nodeProps) }); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeDragLeave", function (event, nodeProps) { // if it is outside the droppable area // currentMouseOverDroppableNodeKey will be updated in dragenter event when into another droppable receiver. if (_this.currentMouseOverDroppableNodeKey === nodeProps.eventKey && !event.currentTarget.contains(event.relatedTarget)) { _this.resetDragState(); _this.currentMouseOverDroppableNodeKey = null; } var onDragLeave = _this.props.onDragLeave; onDragLeave === null || onDragLeave === void 0 || onDragLeave({ event: event, node: (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)(nodeProps) }); }); // since stopPropagation() is called in treeNode // if onWindowDrag is called, whice means state is keeped, drag state should be cleared (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onWindowDragEnd", function (event) { _this.onNodeDragEnd(event, null, true); window.removeEventListener('dragend', _this.onWindowDragEnd); }); // if onNodeDragEnd is called, onWindowDragEnd won't be called since stopPropagation() is called (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeDragEnd", function (event, nodeProps) { var onDragEnd = _this.props.onDragEnd; _this.setState({ dragOverNodeKey: null }); _this.cleanDragState(); onDragEnd === null || onDragEnd === void 0 || onDragEnd({ event: event, node: (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)(nodeProps) }); _this.dragNodeProps = null; window.removeEventListener('dragend', _this.onWindowDragEnd); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeDrop", function (event, _) { var _this$getActiveItem; var outsideTree = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var _this$state4 = _this.state, dragChildrenKeys = _this$state4.dragChildrenKeys, dropPosition = _this$state4.dropPosition, dropTargetKey = _this$state4.dropTargetKey, dropTargetPos = _this$state4.dropTargetPos, dropAllowed = _this$state4.dropAllowed; if (!dropAllowed) { return; } var onDrop = _this.props.onDrop; _this.setState({ dragOverNodeKey: null }); _this.cleanDragState(); if (dropTargetKey === null) return; var abstractDropNodeProps = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.getTreeNodeProps)(dropTargetKey, _this.getTreeNodeRequiredProps())), {}, { active: ((_this$getActiveItem = _this.getActiveItem()) === null || _this$getActiveItem === void 0 ? void 0 : _this$getActiveItem.key) === dropTargetKey, data: (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_21__["default"])(_this.state.keyEntities, dropTargetKey).node }); var dropToChild = dragChildrenKeys.includes(dropTargetKey); (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_13__["default"])(!dropToChild, "Can not drop to dragNode's children node. This is a bug of rc-tree. Please report an issue."); var posArr = (0,_util__WEBPACK_IMPORTED_MODULE_19__.posToArr)(dropTargetPos); var dropResult = { event: event, node: (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)(abstractDropNodeProps), dragNode: _this.dragNodeProps ? (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)(_this.dragNodeProps) : null, dragNodesKeys: [_this.dragNodeProps.eventKey].concat(dragChildrenKeys), dropToGap: dropPosition !== 0, dropPosition: dropPosition + Number(posArr[posArr.length - 1]) }; if (!outsideTree) { onDrop === null || onDrop === void 0 || onDrop(dropResult); } _this.dragNodeProps = null; }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "cleanDragState", function () { var draggingNodeKey = _this.state.draggingNodeKey; if (draggingNodeKey !== null) { _this.setState({ draggingNodeKey: null, dropPosition: null, dropContainerKey: null, dropTargetKey: null, dropLevelOffset: null, dropAllowed: true, dragOverNodeKey: null }); } _this.dragStartMousePosition = null; _this.currentMouseOverDroppableNodeKey = null; }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "triggerExpandActionExpand", function (e, treeNode) { var _this$state5 = _this.state, expandedKeys = _this$state5.expandedKeys, flattenNodes = _this$state5.flattenNodes; var expanded = treeNode.expanded, key = treeNode.key, isLeaf = treeNode.isLeaf; if (isLeaf || e.shiftKey || e.metaKey || e.ctrlKey) { return; } var node = flattenNodes.filter(function (nodeItem) { return nodeItem.key === key; })[0]; var eventNode = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.getTreeNodeProps)(key, _this.getTreeNodeRequiredProps())), {}, { data: node.data })); _this.setExpandedKeys(expanded ? (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(expandedKeys, key) : (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrAdd)(expandedKeys, key)); _this.onNodeExpand(e, eventNode); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeClick", function (e, treeNode) { var _this$props3 = _this.props, onClick = _this$props3.onClick, expandAction = _this$props3.expandAction; if (expandAction === 'click') { _this.triggerExpandActionExpand(e, treeNode); } onClick === null || onClick === void 0 || onClick(e, treeNode); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeDoubleClick", function (e, treeNode) { var _this$props4 = _this.props, onDoubleClick = _this$props4.onDoubleClick, expandAction = _this$props4.expandAction; if (expandAction === 'doubleClick') { _this.triggerExpandActionExpand(e, treeNode); } onDoubleClick === null || onDoubleClick === void 0 || onDoubleClick(e, treeNode); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeSelect", function (e, treeNode) { var selectedKeys = _this.state.selectedKeys; var _this$state6 = _this.state, keyEntities = _this$state6.keyEntities, fieldNames = _this$state6.fieldNames; var _this$props5 = _this.props, onSelect = _this$props5.onSelect, multiple = _this$props5.multiple; var selected = treeNode.selected; var key = treeNode[fieldNames.key]; var targetSelected = !selected; // Update selected keys if (!targetSelected) { selectedKeys = (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(selectedKeys, key); } else if (!multiple) { selectedKeys = [key]; } else { selectedKeys = (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrAdd)(selectedKeys, key); } // [Legacy] Not found related usage in doc or upper libs var selectedNodes = selectedKeys.map(function (selectedKey) { var entity = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_21__["default"])(keyEntities, selectedKey); return entity ? entity.node : null; }).filter(Boolean); _this.setUncontrolledState({ selectedKeys: selectedKeys }); onSelect === null || onSelect === void 0 || onSelect(selectedKeys, { event: 'select', selected: targetSelected, node: treeNode, selectedNodes: selectedNodes, nativeEvent: e.nativeEvent }); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeCheck", function (e, treeNode, checked) { var _this$state7 = _this.state, keyEntities = _this$state7.keyEntities, oriCheckedKeys = _this$state7.checkedKeys, oriHalfCheckedKeys = _this$state7.halfCheckedKeys; var _this$props6 = _this.props, checkStrictly = _this$props6.checkStrictly, onCheck = _this$props6.onCheck; var key = treeNode.key; // Prepare trigger arguments var checkedObj; var eventObj = { event: 'check', node: treeNode, checked: checked, nativeEvent: e.nativeEvent }; if (checkStrictly) { var checkedKeys = checked ? (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrAdd)(oriCheckedKeys, key) : (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(oriCheckedKeys, key); var halfCheckedKeys = (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(oriHalfCheckedKeys, key); checkedObj = { checked: checkedKeys, halfChecked: halfCheckedKeys }; eventObj.checkedNodes = checkedKeys.map(function (checkedKey) { return (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_21__["default"])(keyEntities, checkedKey); }).filter(Boolean).map(function (entity) { return entity.node; }); _this.setUncontrolledState({ checkedKeys: checkedKeys }); } else { // Always fill first var _conductCheck = (0,_utils_conductUtil__WEBPACK_IMPORTED_MODULE_20__.conductCheck)([].concat((0,_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_3__["default"])(oriCheckedKeys), [key]), true, keyEntities), _checkedKeys = _conductCheck.checkedKeys, _halfCheckedKeys = _conductCheck.halfCheckedKeys; // If remove, we do it again to correction if (!checked) { var keySet = new Set(_checkedKeys); keySet.delete(key); var _conductCheck2 = (0,_utils_conductUtil__WEBPACK_IMPORTED_MODULE_20__.conductCheck)(Array.from(keySet), { checked: false, halfCheckedKeys: _halfCheckedKeys }, keyEntities); _checkedKeys = _conductCheck2.checkedKeys; _halfCheckedKeys = _conductCheck2.halfCheckedKeys; } checkedObj = _checkedKeys; // [Legacy] This is used for `rc-tree-select` eventObj.checkedNodes = []; eventObj.checkedNodesPositions = []; eventObj.halfCheckedKeys = _halfCheckedKeys; _checkedKeys.forEach(function (checkedKey) { var entity = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_21__["default"])(keyEntities, checkedKey); if (!entity) return; var node = entity.node, pos = entity.pos; eventObj.checkedNodes.push(node); eventObj.checkedNodesPositions.push({ node: node, pos: pos }); }); _this.setUncontrolledState({ checkedKeys: _checkedKeys }, false, { halfCheckedKeys: _halfCheckedKeys }); } onCheck === null || onCheck === void 0 || onCheck(checkedObj, eventObj); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeLoad", function (treeNode) { var _entity$children; var key = treeNode.key; var keyEntities = _this.state.keyEntities; // Skip if has children already var entity = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_21__["default"])(keyEntities, key); if (entity !== null && entity !== void 0 && (_entity$children = entity.children) !== null && _entity$children !== void 0 && _entity$children.length) { return; } var loadPromise = new Promise(function (resolve, reject) { // We need to get the latest state of loading/loaded keys _this.setState(function (_ref) { var _ref$loadedKeys = _ref.loadedKeys, loadedKeys = _ref$loadedKeys === void 0 ? [] : _ref$loadedKeys, _ref$loadingKeys = _ref.loadingKeys, loadingKeys = _ref$loadingKeys === void 0 ? [] : _ref$loadingKeys; var _this$props7 = _this.props, loadData = _this$props7.loadData, onLoad = _this$props7.onLoad; if (!loadData || loadedKeys.includes(key) || loadingKeys.includes(key)) { return null; } // Process load data var promise = loadData(treeNode); promise.then(function () { var currentLoadedKeys = _this.state.loadedKeys; var newLoadedKeys = (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrAdd)(currentLoadedKeys, key); // onLoad should trigger before internal setState to avoid `loadData` trigger twice. // https://github.com/ant-design/ant-design/issues/12464 onLoad === null || onLoad === void 0 || onLoad(newLoadedKeys, { event: 'load', node: treeNode }); _this.setUncontrolledState({ loadedKeys: newLoadedKeys }); _this.setState(function (prevState) { return { loadingKeys: (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(prevState.loadingKeys, key) }; }); resolve(); }).catch(function (e) { _this.setState(function (prevState) { return { loadingKeys: (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(prevState.loadingKeys, key) }; }); // If exceed max retry times, we give up retry _this.loadingRetryTimes[key] = (_this.loadingRetryTimes[key] || 0) + 1; if (_this.loadingRetryTimes[key] >= MAX_RETRY_TIMES) { var currentLoadedKeys = _this.state.loadedKeys; (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_13__["default"])(false, 'Retry for `loadData` many times but still failed. No more retry.'); _this.setUncontrolledState({ loadedKeys: (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrAdd)(currentLoadedKeys, key) }); resolve(); } reject(e); }); return { loadingKeys: (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrAdd)(loadingKeys, key) }; }); }); // Not care warning if we ignore this loadPromise.catch(function () {}); return loadPromise; }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeMouseEnter", function (event, node) { var onMouseEnter = _this.props.onMouseEnter; onMouseEnter === null || onMouseEnter === void 0 || onMouseEnter({ event: event, node: node }); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeMouseLeave", function (event, node) { var onMouseLeave = _this.props.onMouseLeave; onMouseLeave === null || onMouseLeave === void 0 || onMouseLeave({ event: event, node: node }); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeContextMenu", function (event, node) { var onRightClick = _this.props.onRightClick; if (onRightClick) { event.preventDefault(); onRightClick({ event: event, node: node }); } }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onFocus", function () { var onFocus = _this.props.onFocus; _this.setState({ focused: true }); for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } onFocus === null || onFocus === void 0 || onFocus.apply(void 0, args); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onBlur", function () { var onBlur = _this.props.onBlur; _this.setState({ focused: false }); _this.onActiveChange(null); for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } onBlur === null || onBlur === void 0 || onBlur.apply(void 0, args); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "getTreeNodeRequiredProps", function () { var _this$state8 = _this.state, expandedKeys = _this$state8.expandedKeys, selectedKeys = _this$state8.selectedKeys, loadedKeys = _this$state8.loadedKeys, loadingKeys = _this$state8.loadingKeys, checkedKeys = _this$state8.checkedKeys, halfCheckedKeys = _this$state8.halfCheckedKeys, dragOverNodeKey = _this$state8.dragOverNodeKey, dropPosition = _this$state8.dropPosition, keyEntities = _this$state8.keyEntities; return { expandedKeys: expandedKeys || [], selectedKeys: selectedKeys || [], loadedKeys: loadedKeys || [], loadingKeys: loadingKeys || [], checkedKeys: checkedKeys || [], halfCheckedKeys: halfCheckedKeys || [], dragOverNodeKey: dragOverNodeKey, dropPosition: dropPosition, keyEntities: keyEntities }; }); // =========================== Expanded =========================== /** Set uncontrolled `expandedKeys`. This will also auto update `flattenNodes`. */ (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "setExpandedKeys", function (expandedKeys) { var _this$state9 = _this.state, treeData = _this$state9.treeData, fieldNames = _this$state9.fieldNames; var flattenNodes = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.flattenTreeData)(treeData, expandedKeys, fieldNames); _this.setUncontrolledState({ expandedKeys: expandedKeys, flattenNodes: flattenNodes }, true); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeExpand", function (e, treeNode) { var expandedKeys = _this.state.expandedKeys; var _this$state10 = _this.state, listChanging = _this$state10.listChanging, fieldNames = _this$state10.fieldNames; var _this$props8 = _this.props, onExpand = _this$props8.onExpand, loadData = _this$props8.loadData; var expanded = treeNode.expanded; var key = treeNode[fieldNames.key]; // Do nothing when motion is in progress if (listChanging) { return; } // Update selected keys var certain = expandedKeys.includes(key); var targetExpanded = !expanded; (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_13__["default"])(expanded && certain || !expanded && !certain, 'Expand state not sync with index check'); expandedKeys = targetExpanded ? (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrAdd)(expandedKeys, key) : (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(expandedKeys, key); _this.setExpandedKeys(expandedKeys); onExpand === null || onExpand === void 0 || onExpand(expandedKeys, { node: treeNode, expanded: targetExpanded, nativeEvent: e.nativeEvent }); // Async Load data if (targetExpanded && loadData) { var loadPromise = _this.onNodeLoad(treeNode); if (loadPromise) { loadPromise.then(function () { // [Legacy] Refresh logic var newFlattenTreeData = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.flattenTreeData)(_this.state.treeData, expandedKeys, fieldNames); _this.setUncontrolledState({ flattenNodes: newFlattenTreeData }); }).catch(function () { var currentExpandedKeys = _this.state.expandedKeys; var expandedKeysToRestore = (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(currentExpandedKeys, key); _this.setExpandedKeys(expandedKeysToRestore); }); } } }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onListChangeStart", function () { _this.setUncontrolledState({ listChanging: true }); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onListChangeEnd", function () { setTimeout(function () { _this.setUncontrolledState({ listChanging: false }); }); }); // =========================== Keyboard =========================== (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onActiveChange", function (newActiveKey) { var activeKey = _this.state.activeKey; var _this$props9 = _this.props, onActiveChange = _this$props9.onActiveChange, _this$props9$itemScro = _this$props9.itemScrollOffset, itemScrollOffset = _this$props9$itemScro === void 0 ? 0 : _this$props9$itemScro; if (activeKey === newActiveKey) { return; } _this.setState({ activeKey: newActiveKey }); if (newActiveKey !== null) { _this.scrollTo({ key: newActiveKey, offset: itemScrollOffset }); } onActiveChange === null || onActiveChange === void 0 || onActiveChange(newActiveKey); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "getActiveItem", function () { var _this$state11 = _this.state, activeKey = _this$state11.activeKey, flattenNodes = _this$state11.flattenNodes; if (activeKey === null) { return null; } return flattenNodes.find(function (_ref2) { var key = _ref2.key; return key === activeKey; }) || null; }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "offsetActiveKey", function (offset) { var _this$state12 = _this.state, flattenNodes = _this$state12.flattenNodes, activeKey = _this$state12.activeKey; var index = flattenNodes.findIndex(function (_ref3) { var key = _ref3.key; return key === activeKey; }); // Align with index if (index === -1 && offset < 0) { index = flattenNodes.length; } index = (index + offset + flattenNodes.length) % flattenNodes.length; var item = flattenNodes[index]; if (item) { var _key4 = item.key; _this.onActiveChange(_key4); } else { _this.onActiveChange(null); } }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onKeyDown", function (event) { var _this$state13 = _this.state, activeKey = _this$state13.activeKey, expandedKeys = _this$state13.expandedKeys, checkedKeys = _this$state13.checkedKeys, fieldNames = _this$state13.fieldNames; var _this$props10 = _this.props, onKeyDown = _this$props10.onKeyDown, checkable = _this$props10.checkable, selectable = _this$props10.selectable; // >>>>>>>>>> Direction switch (event.which) { case rc_util_es_KeyCode__WEBPACK_IMPORTED_MODULE_11__["default"].UP: { _this.offsetActiveKey(-1); event.preventDefault(); break; } case rc_util_es_KeyCode__WEBPACK_IMPORTED_MODULE_11__["default"].DOWN: { _this.offsetActiveKey(1); event.preventDefault(); break; } } // >>>>>>>>>> Expand & Selection var activeItem = _this.getActiveItem(); if (activeItem && activeItem.data) { var treeNodeRequiredProps = _this.getTreeNodeRequiredProps(); var expandable = activeItem.data.isLeaf === false || !!(activeItem.data[fieldNames.children] || []).length; var eventNode = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.getTreeNodeProps)(activeKey, treeNodeRequiredProps)), {}, { data: activeItem.data, active: true })); switch (event.which) { // >>> Expand case rc_util_es_KeyCode__WEBPACK_IMPORTED_MODULE_11__["default"].LEFT: { // Collapse if possible if (expandable && expandedKeys.includes(activeKey)) { _this.onNodeExpand({}, eventNode); } else if (activeItem.parent) { _this.onActiveChange(activeItem.parent.key); } event.preventDefault(); break; } case rc_util_es_KeyCode__WEBPACK_IMPORTED_MODULE_11__["default"].RIGHT: { // Expand if possible if (expandable && !expandedKeys.includes(activeKey)) { _this.onNodeExpand({}, eventNode); } else if (activeItem.children && activeItem.children.length) { _this.onActiveChange(activeItem.children[0].key); } event.preventDefault(); break; } // Selection case rc_util_es_KeyCode__WEBPACK_IMPORTED_MODULE_11__["default"].ENTER: case rc_util_es_KeyCode__WEBPACK_IMPORTED_MODULE_11__["default"].SPACE: { if (checkable && !eventNode.disabled && eventNode.checkable !== false && !eventNode.disableCheckbox) { _this.onNodeCheck({}, eventNode, !checkedKeys.includes(activeKey)); } else if (!checkable && selectable && !eventNode.disabled && eventNode.selectable !== false) { _this.onNodeSelect({}, eventNode); } break; } } } onKeyDown === null || onKeyDown === void 0 || onKeyDown(event); }); /** * Only update the value which is not in props */ (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "setUncontrolledState", function (state) { var atomic = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var forceState = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; if (!_this.destroyed) { var needSync = false; var allPassed = true; var newState = {}; Object.keys(state).forEach(function (name) { if (_this.props.hasOwnProperty(name)) { allPassed = false; return; } needSync = true; newState[name] = state[name]; }); if (needSync && (!atomic || allPassed)) { _this.setState((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, newState), forceState)); } } }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "scrollTo", function (scroll) { _this.listRef.current.scrollTo(scroll); }); return _this; } (0,_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_5__["default"])(Tree, [{ key: "componentDidMount", value: function componentDidMount() { this.destroyed = false; this.onUpdated(); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { this.onUpdated(); } }, { key: "onUpdated", value: function onUpdated() { var _this$props11 = this.props, activeKey = _this$props11.activeKey, _this$props11$itemScr = _this$props11.itemScrollOffset, itemScrollOffset = _this$props11$itemScr === void 0 ? 0 : _this$props11$itemScr; if (activeKey !== undefined && activeKey !== this.state.activeKey) { this.setState({ activeKey: activeKey }); if (activeKey !== null) { this.scrollTo({ key: activeKey, offset: itemScrollOffset }); } } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { window.removeEventListener('dragend', this.onWindowDragEnd); this.destroyed = true; } }, { key: "resetDragState", value: function resetDragState() { this.setState({ dragOverNodeKey: null, dropPosition: null, dropLevelOffset: null, dropTargetKey: null, dropContainerKey: null, dropTargetPos: null, dropAllowed: false }); } }, { key: "render", value: function render() { var _this$state14 = this.state, focused = _this$state14.focused, flattenNodes = _this$state14.flattenNodes, keyEntities = _this$state14.keyEntities, draggingNodeKey = _this$state14.draggingNodeKey, activeKey = _this$state14.activeKey, dropLevelOffset = _this$state14.dropLevelOffset, dropContainerKey = _this$state14.dropContainerKey, dropTargetKey = _this$state14.dropTargetKey, dropPosition = _this$state14.dropPosition, dragOverNodeKey = _this$state14.dragOverNodeKey, indent = _this$state14.indent; var _this$props12 = this.props, prefixCls = _this$props12.prefixCls, className = _this$props12.className, style = _this$props12.style, showLine = _this$props12.showLine, focusable = _this$props12.focusable, _this$props12$tabInde = _this$props12.tabIndex, tabIndex = _this$props12$tabInde === void 0 ? 0 : _this$props12$tabInde, selectable = _this$props12.selectable, showIcon = _this$props12.showIcon, icon = _this$props12.icon, switcherIcon = _this$props12.switcherIcon, draggable = _this$props12.draggable, checkable = _this$props12.checkable, checkStrictly = _this$props12.checkStrictly, disabled = _this$props12.disabled, motion = _this$props12.motion, loadData = _this$props12.loadData, filterTreeNode = _this$props12.filterTreeNode, height = _this$props12.height, itemHeight = _this$props12.itemHeight, scrollWidth = _this$props12.scrollWidth, virtual = _this$props12.virtual, titleRender = _this$props12.titleRender, dropIndicatorRender = _this$props12.dropIndicatorRender, onContextMenu = _this$props12.onContextMenu, onScroll = _this$props12.onScroll, direction = _this$props12.direction, rootClassName = _this$props12.rootClassName, rootStyle = _this$props12.rootStyle; var domProps = (0,rc_util_es_pickAttrs__WEBPACK_IMPORTED_MODULE_12__["default"])(this.props, { aria: true, data: true }); // It's better move to hooks but we just simply keep here var draggableConfig; if (draggable) { if ((0,_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__["default"])(draggable) === 'object') { draggableConfig = draggable; } else if (typeof draggable === 'function') { draggableConfig = { nodeDraggable: draggable }; } else { draggableConfig = {}; } } var contextValue = { prefixCls: prefixCls, selectable: selectable, showIcon: showIcon, icon: icon, switcherIcon: switcherIcon, draggable: draggableConfig, draggingNodeKey: draggingNodeKey, checkable: checkable, checkStrictly: checkStrictly, disabled: disabled, keyEntities: keyEntities, dropLevelOffset: dropLevelOffset, dropContainerKey: dropContainerKey, dropTargetKey: dropTargetKey, dropPosition: dropPosition, dragOverNodeKey: dragOverNodeKey, indent: indent, direction: direction, dropIndicatorRender: dropIndicatorRender, loadData: loadData, filterTreeNode: filterTreeNode, titleRender: titleRender, onNodeClick: this.onNodeClick, onNodeDoubleClick: this.onNodeDoubleClick, onNodeExpand: this.onNodeExpand, onNodeSelect: this.onNodeSelect, onNodeCheck: this.onNodeCheck, onNodeLoad: this.onNodeLoad, onNodeMouseEnter: this.onNodeMouseEnter, onNodeMouseLeave: this.onNodeMouseLeave, onNodeContextMenu: this.onNodeContextMenu, onNodeDragStart: this.onNodeDragStart, onNodeDragEnter: this.onNodeDragEnter, onNodeDragOver: this.onNodeDragOver, onNodeDragLeave: this.onNodeDragLeave, onNodeDragEnd: this.onNodeDragEnd, onNodeDrop: this.onNodeDrop }; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_14__.createElement(_contextTypes__WEBPACK_IMPORTED_MODULE_15__.TreeContext.Provider, { value: contextValue }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_14__.createElement("div", { className: classnames__WEBPACK_IMPORTED_MODULE_10___default()(prefixCls, className, rootClassName, (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])({}, "".concat(prefixCls, "-show-line"), showLine), "".concat(prefixCls, "-focused"), focused), "".concat(prefixCls, "-active-focused"), activeKey !== null)), style: rootStyle }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_14__.createElement(_NodeList__WEBPACK_IMPORTED_MODULE_17__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ ref: this.listRef, prefixCls: prefixCls, style: style, data: flattenNodes, disabled: disabled, selectable: selectable, checkable: !!checkable, motion: motion, dragging: draggingNodeKey !== null, height: height, itemHeight: itemHeight, virtual: virtual, focusable: focusable, focused: focused, tabIndex: tabIndex, activeItem: this.getActiveItem(), onFocus: this.onFocus, onBlur: this.onBlur, onKeyDown: this.onKeyDown, onActiveChange: this.onActiveChange, onListChangeStart: this.onListChangeStart, onListChangeEnd: this.onListChangeEnd, onContextMenu: onContextMenu, onScroll: onScroll, scrollWidth: scrollWidth }, this.getTreeNodeRequiredProps(), domProps)))); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, prevState) { var prevProps = prevState.prevProps; var newState = { prevProps: props }; function needSync(name) { return !prevProps && props.hasOwnProperty(name) || prevProps && prevProps[name] !== props[name]; } // ================== Tree Node ================== var treeData; // fieldNames var fieldNames = prevState.fieldNames; if (needSync('fieldNames')) { fieldNames = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.fillFieldNames)(props.fieldNames); newState.fieldNames = fieldNames; } // Check if `treeData` or `children` changed and save into the state. if (needSync('treeData')) { treeData = props.treeData; } else if (needSync('children')) { (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_13__["default"])(false, '`children` of Tree is deprecated. Please use `treeData` instead.'); treeData = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertTreeToData)(props.children); } // Save flatten nodes info and convert `treeData` into keyEntities if (treeData) { newState.treeData = treeData; var entitiesMap = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertDataToEntities)(treeData, { fieldNames: fieldNames }); newState.keyEntities = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])({}, _NodeList__WEBPACK_IMPORTED_MODULE_17__.MOTION_KEY, _NodeList__WEBPACK_IMPORTED_MODULE_17__.MotionEntity), entitiesMap.keyEntities); // Warning if treeNode not provide key if (true) { (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.warningWithoutKey)(treeData, fieldNames); } } var keyEntities = newState.keyEntities || prevState.keyEntities; // ================ expandedKeys ================= if (needSync('expandedKeys') || prevProps && needSync('autoExpandParent')) { newState.expandedKeys = props.autoExpandParent || !prevProps && props.defaultExpandParent ? (0,_util__WEBPACK_IMPORTED_MODULE_19__.conductExpandParent)(props.expandedKeys, keyEntities) : props.expandedKeys; } else if (!prevProps && props.defaultExpandAll) { var cloneKeyEntities = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, keyEntities); delete cloneKeyEntities[_NodeList__WEBPACK_IMPORTED_MODULE_17__.MOTION_KEY]; // Only take the key who has the children to enhance the performance var nextExpandedKeys = []; Object.keys(cloneKeyEntities).forEach(function (key) { var entity = cloneKeyEntities[key]; if (entity.children && entity.children.length) { nextExpandedKeys.push(entity.key); } }); newState.expandedKeys = nextExpandedKeys; } else if (!prevProps && props.defaultExpandedKeys) { newState.expandedKeys = props.autoExpandParent || props.defaultExpandParent ? (0,_util__WEBPACK_IMPORTED_MODULE_19__.conductExpandParent)(props.defaultExpandedKeys, keyEntities) : props.defaultExpandedKeys; } if (!newState.expandedKeys) { delete newState.expandedKeys; } // ================ flattenNodes ================= if (treeData || newState.expandedKeys) { var flattenNodes = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.flattenTreeData)(treeData || prevState.treeData, newState.expandedKeys || prevState.expandedKeys, fieldNames); newState.flattenNodes = flattenNodes; } // ================ selectedKeys ================= if (props.selectable) { if (needSync('selectedKeys')) { newState.selectedKeys = (0,_util__WEBPACK_IMPORTED_MODULE_19__.calcSelectedKeys)(props.selectedKeys, props); } else if (!prevProps && props.defaultSelectedKeys) { newState.selectedKeys = (0,_util__WEBPACK_IMPORTED_MODULE_19__.calcSelectedKeys)(props.defaultSelectedKeys, props); } } // ================= checkedKeys ================= if (props.checkable) { var checkedKeyEntity; if (needSync('checkedKeys')) { checkedKeyEntity = (0,_util__WEBPACK_IMPORTED_MODULE_19__.parseCheckedKeys)(props.checkedKeys) || {}; } else if (!prevProps && props.defaultCheckedKeys) { checkedKeyEntity = (0,_util__WEBPACK_IMPORTED_MODULE_19__.parseCheckedKeys)(props.defaultCheckedKeys) || {}; } else if (treeData) { // If `treeData` changed, we also need check it checkedKeyEntity = (0,_util__WEBPACK_IMPORTED_MODULE_19__.parseCheckedKeys)(props.checkedKeys) || { checkedKeys: prevState.checkedKeys, halfCheckedKeys: prevState.halfCheckedKeys }; } if (checkedKeyEntity) { var _checkedKeyEntity = checkedKeyEntity, _checkedKeyEntity$che = _checkedKeyEntity.checkedKeys, checkedKeys = _checkedKeyEntity$che === void 0 ? [] : _checkedKeyEntity$che, _checkedKeyEntity$hal = _checkedKeyEntity.halfCheckedKeys, halfCheckedKeys = _checkedKeyEntity$hal === void 0 ? [] : _checkedKeyEntity$hal; if (!props.checkStrictly) { var conductKeys = (0,_utils_conductUtil__WEBPACK_IMPORTED_MODULE_20__.conductCheck)(checkedKeys, true, keyEntities); checkedKeys = conductKeys.checkedKeys; halfCheckedKeys = conductKeys.halfCheckedKeys; } newState.checkedKeys = checkedKeys; newState.halfCheckedKeys = halfCheckedKeys; } } // ================= loadedKeys ================== if (needSync('loadedKeys')) { newState.loadedKeys = props.loadedKeys; } return newState; } }]); return Tree; }(react__WEBPACK_IMPORTED_MODULE_14__.Component); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])(Tree, "defaultProps", { prefixCls: 'rc-tree', showLine: false, showIcon: true, selectable: true, multiple: false, checkable: false, disabled: false, checkStrictly: false, draggable: false, defaultExpandParent: true, autoExpandParent: false, defaultExpandAll: false, defaultExpandedKeys: [], defaultCheckedKeys: [], defaultSelectedKeys: [], dropIndicatorRender: _DropIndicator__WEBPACK_IMPORTED_MODULE_16__["default"], allowDrop: function allowDrop() { return true; }, expandAction: false }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])(Tree, "TreeNode", _TreeNode__WEBPACK_IMPORTED_MODULE_18__["default"]); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Tree); /***/ }), /***/ "../../../node_modules/rc-tree/es/TreeNode.js": /*!****************************************************!*\ !*** ../../../node_modules/rc-tree/es/TreeNode.js ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ "../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var rc_util_es_pickAttrs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! rc-util/es/pickAttrs */ "../../../node_modules/rc-util/es/pickAttrs.js"); /* harmony import */ var _contextTypes__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./contextTypes */ "../../../node_modules/rc-tree/es/contextTypes.js"); /* harmony import */ var _Indent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Indent */ "../../../node_modules/rc-tree/es/Indent.js"); /* harmony import */ var _utils_keyUtil__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils/keyUtil */ "../../../node_modules/rc-tree/es/utils/keyUtil.js"); /* harmony import */ var _utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utils/treeUtil */ "../../../node_modules/rc-tree/es/utils/treeUtil.js"); var _excluded = ["eventKey", "className", "style", "dragOver", "dragOverGapTop", "dragOverGapBottom", "isLeaf", "isStart", "isEnd", "expanded", "selected", "checked", "halfChecked", "loading", "domRef", "active", "data", "onMouseMove", "selectable"]; var ICON_OPEN = 'open'; var ICON_CLOSE = 'close'; var defaultTitle = '---'; var TreeNode = function TreeNode(props) { var _unstableContext$node, _context$filterTreeNo, _classNames4; var eventKey = props.eventKey, className = props.className, style = props.style, dragOver = props.dragOver, dragOverGapTop = props.dragOverGapTop, dragOverGapBottom = props.dragOverGapBottom, isLeaf = props.isLeaf, isStart = props.isStart, isEnd = props.isEnd, expanded = props.expanded, selected = props.selected, checked = props.checked, halfChecked = props.halfChecked, loading = props.loading, domRef = props.domRef, active = props.active, data = props.data, onMouseMove = props.onMouseMove, selectable = props.selectable, otherProps = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_4__["default"])(props, _excluded); var context = react__WEBPACK_IMPORTED_MODULE_5___default().useContext(_contextTypes__WEBPACK_IMPORTED_MODULE_8__.TreeContext); var unstableContext = react__WEBPACK_IMPORTED_MODULE_5___default().useContext(_contextTypes__WEBPACK_IMPORTED_MODULE_8__.UnstableContext); var selectHandleRef = react__WEBPACK_IMPORTED_MODULE_5___default().useRef(null); var _React$useState = react__WEBPACK_IMPORTED_MODULE_5___default().useState(false), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_3__["default"])(_React$useState, 2), dragNodeHighlight = _React$useState2[0], setDragNodeHighlight = _React$useState2[1]; // ======= State: Disabled State ======= var isDisabled = !!(context.disabled || props.disabled || (_unstableContext$node = unstableContext.nodeDisabled) !== null && _unstableContext$node !== void 0 && _unstableContext$node.call(unstableContext, data)); var isCheckable = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { // Return false if tree or treeNode is not checkable if (!context.checkable || props.checkable === false) { return false; } return context.checkable; }, [context.checkable, props.checkable]); // ======= Event Handlers: Selection and Check ======= var onSelect = function onSelect(e) { if (isDisabled) { return; } context.onNodeSelect(e, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props)); }; var onCheck = function onCheck(e) { if (isDisabled) { return; } if (!isCheckable || props.disableCheckbox) { return; } context.onNodeCheck(e, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props), !checked); }; // ======= State: Selectable Check ======= var isSelectable = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { // Ignore when selectable is undefined or null if (typeof selectable === 'boolean') { return selectable; } return context.selectable; }, [selectable, context.selectable]); var onSelectorClick = function onSelectorClick(e) { // Click trigger before select/check operation context.onNodeClick(e, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props)); if (isSelectable) { onSelect(e); } else { onCheck(e); } }; var onSelectorDoubleClick = function onSelectorDoubleClick(e) { context.onNodeDoubleClick(e, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props)); }; var onMouseEnter = function onMouseEnter(e) { context.onNodeMouseEnter(e, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props)); }; var onMouseLeave = function onMouseLeave(e) { context.onNodeMouseLeave(e, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props)); }; var onContextMenu = function onContextMenu(e) { context.onNodeContextMenu(e, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props)); }; // ======= Drag: Drag Enabled ======= var isDraggable = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { return !!(context.draggable && (!context.draggable.nodeDraggable || context.draggable.nodeDraggable(data))); }, [context.draggable, data]); // ======= Drag: Drag Event Handlers ======= var onDragStart = function onDragStart(e) { e.stopPropagation(); setDragNodeHighlight(true); context.onNodeDragStart(e, props); try { // ie throw error // firefox-need-it e.dataTransfer.setData('text/plain', ''); } catch (_unused) { // empty } }; var onDragEnter = function onDragEnter(e) { e.preventDefault(); e.stopPropagation(); context.onNodeDragEnter(e, props); }; var onDragOver = function onDragOver(e) { e.preventDefault(); e.stopPropagation(); context.onNodeDragOver(e, props); }; var onDragLeave = function onDragLeave(e) { e.stopPropagation(); context.onNodeDragLeave(e, props); }; var onDragEnd = function onDragEnd(e) { e.stopPropagation(); setDragNodeHighlight(false); context.onNodeDragEnd(e, props); }; var onDrop = function onDrop(e) { e.preventDefault(); e.stopPropagation(); setDragNodeHighlight(false); context.onNodeDrop(e, props); }; // ======= Expand: Node Expansion ======= var onExpand = function onExpand(e) { if (loading) { return; } context.onNodeExpand(e, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props)); }; // ======= State: Has Children ======= var hasChildren = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { var _ref = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_10__["default"])(context.keyEntities, eventKey) || {}, children = _ref.children; return Boolean((children || []).length); }, [context.keyEntities, eventKey]); // ======= State: Leaf Check ======= var memoizedIsLeaf = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { if (isLeaf === false) { return false; } return isLeaf || !context.loadData && !hasChildren || context.loadData && props.loaded && !hasChildren; }, [isLeaf, context.loadData, hasChildren, props.loaded]); // ============== Effect ============== react__WEBPACK_IMPORTED_MODULE_5___default().useEffect(function () { // Load data to avoid default expanded tree without data if (loading) { return; } // read from state to avoid loadData at same time if (typeof context.loadData === 'function' && expanded && !memoizedIsLeaf && !props.loaded) { // We needn't reload data when has children in sync logic // It's only needed in node expanded context.onNodeLoad((0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props)); } }, [loading, context.loadData, context.onNodeLoad, expanded, memoizedIsLeaf, props]); // ==================== Render: Drag Handler ==================== var dragHandlerNode = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { var _context$draggable; if (!((_context$draggable = context.draggable) !== null && _context$draggable !== void 0 && _context$draggable.icon)) { return null; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("span", { className: "".concat(context.prefixCls, "-draggable-icon") }, context.draggable.icon); }, [context.draggable]); // ====================== Render: Switcher ====================== var renderSwitcherIconDom = function renderSwitcherIconDom(isInternalLeaf) { var switcherIcon = props.switcherIcon || context.switcherIcon; // if switcherIconDom is null, no render switcher span if (typeof switcherIcon === 'function') { return switcherIcon((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, props), {}, { isLeaf: isInternalLeaf })); } return switcherIcon; }; // Switcher var renderSwitcher = function renderSwitcher() { if (memoizedIsLeaf) { // if switcherIconDom is null, no render switcher span var _switcherIconDom = renderSwitcherIconDom(true); return _switcherIconDom !== false ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("span", { className: classnames__WEBPACK_IMPORTED_MODULE_6___default()("".concat(context.prefixCls, "-switcher"), "".concat(context.prefixCls, "-switcher-noop")) }, _switcherIconDom) : null; } var switcherIconDom = renderSwitcherIconDom(false); return switcherIconDom !== false ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("span", { onClick: onExpand, className: classnames__WEBPACK_IMPORTED_MODULE_6___default()("".concat(context.prefixCls, "-switcher"), "".concat(context.prefixCls, "-switcher_").concat(expanded ? ICON_OPEN : ICON_CLOSE)) }, switcherIconDom) : null; }; // ====================== Checkbox ====================== var checkboxNode = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { if (!isCheckable) { return null; } // [Legacy] Custom element should be separate with `checkable` in future var $custom = typeof isCheckable !== 'boolean' ? isCheckable : null; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("span", { className: classnames__WEBPACK_IMPORTED_MODULE_6___default()("".concat(context.prefixCls, "-checkbox"), (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({}, "".concat(context.prefixCls, "-checkbox-checked"), checked), "".concat(context.prefixCls, "-checkbox-indeterminate"), !checked && halfChecked), "".concat(context.prefixCls, "-checkbox-disabled"), isDisabled || props.disableCheckbox)), onClick: onCheck, role: "checkbox", "aria-checked": halfChecked ? 'mixed' : checked, "aria-disabled": isDisabled || props.disableCheckbox, "aria-label": "Select ".concat(typeof props.title === 'string' ? props.title : 'tree node') }, $custom); }, [isCheckable, checked, halfChecked, isDisabled, props.disableCheckbox, props.title]); // ============== State: Node State (Open/Close) ============== var nodeState = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { if (memoizedIsLeaf) { return null; } return expanded ? ICON_OPEN : ICON_CLOSE; }, [memoizedIsLeaf, expanded]); // ==================== Render: Title + Icon ==================== var iconNode = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("span", { className: classnames__WEBPACK_IMPORTED_MODULE_6___default()("".concat(context.prefixCls, "-iconEle"), "".concat(context.prefixCls, "-icon__").concat(nodeState || 'docu'), (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({}, "".concat(context.prefixCls, "-icon_loading"), loading)) }); }, [context.prefixCls, nodeState, loading]); // =================== Drop Indicator =================== var dropIndicatorNode = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { var rootDraggable = Boolean(context.draggable); // allowDrop is calculated in Tree.tsx, there is no need for calc it here var showIndicator = !props.disabled && rootDraggable && context.dragOverNodeKey === eventKey; if (!showIndicator) { return null; } return context.dropIndicatorRender({ dropPosition: context.dropPosition, dropLevelOffset: context.dropLevelOffset, indent: context.indent, prefixCls: context.prefixCls, direction: context.direction }); }, [context.dropPosition, context.dropLevelOffset, context.indent, context.prefixCls, context.direction, context.draggable, context.dragOverNodeKey, context.dropIndicatorRender]); // Icon + Title var selectorNode = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { var _props$title = props.title, title = _props$title === void 0 ? defaultTitle : _props$title; var wrapClass = "".concat(context.prefixCls, "-node-content-wrapper"); // Icon - Still show loading icon when loading without showIcon var $icon; if (context.showIcon) { var currentIcon = props.icon || context.icon; $icon = currentIcon ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("span", { className: classnames__WEBPACK_IMPORTED_MODULE_6___default()("".concat(context.prefixCls, "-iconEle"), "".concat(context.prefixCls, "-icon__customize")) }, typeof currentIcon === 'function' ? currentIcon(props) : currentIcon) : iconNode; } else if (context.loadData && loading) { $icon = iconNode; } // Title var titleNode; if (typeof title === 'function') { titleNode = title(data); } else if (context.titleRender) { titleNode = context.titleRender(data); } else { titleNode = title; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("span", { ref: selectHandleRef, title: typeof title === 'string' ? title : '', className: classnames__WEBPACK_IMPORTED_MODULE_6___default()(wrapClass, "".concat(wrapClass, "-").concat(nodeState || 'normal'), (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({}, "".concat(context.prefixCls, "-node-selected"), !isDisabled && (selected || dragNodeHighlight))), onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, onContextMenu: onContextMenu, onClick: onSelectorClick, onDoubleClick: onSelectorDoubleClick }, $icon, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("span", { className: "".concat(context.prefixCls, "-title") }, titleNode), dropIndicatorNode); }, [context.prefixCls, context.showIcon, props, context.icon, iconNode, context.titleRender, data, nodeState, onMouseEnter, onMouseLeave, onContextMenu, onSelectorClick, onSelectorDoubleClick]); var dataOrAriaAttributeProps = (0,rc_util_es_pickAttrs__WEBPACK_IMPORTED_MODULE_7__["default"])(otherProps, { aria: true, data: true }); var _ref2 = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_10__["default"])(context.keyEntities, eventKey) || {}, level = _ref2.level; var isEndNode = isEnd[isEnd.length - 1]; var draggableWithoutDisabled = !isDisabled && isDraggable; var dragging = context.draggingNodeKey === eventKey; var ariaSelected = selectable !== undefined ? { 'aria-selected': !!selectable } : undefined; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("div", (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ ref: domRef, role: "treeitem", "aria-expanded": isLeaf ? undefined : expanded, className: classnames__WEBPACK_IMPORTED_MODULE_6___default()(className, "".concat(context.prefixCls, "-treenode"), (_classNames4 = {}, (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])(_classNames4, "".concat(context.prefixCls, "-treenode-disabled"), isDisabled), "".concat(context.prefixCls, "-treenode-switcher-").concat(expanded ? 'open' : 'close'), !isLeaf), "".concat(context.prefixCls, "-treenode-checkbox-checked"), checked), "".concat(context.prefixCls, "-treenode-checkbox-indeterminate"), halfChecked), "".concat(context.prefixCls, "-treenode-selected"), selected), "".concat(context.prefixCls, "-treenode-loading"), loading), "".concat(context.prefixCls, "-treenode-active"), active), "".concat(context.prefixCls, "-treenode-leaf-last"), isEndNode), "".concat(context.prefixCls, "-treenode-draggable"), isDraggable), "dragging", dragging), (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])(_classNames4, 'drop-target', context.dropTargetKey === eventKey), 'drop-container', context.dropContainerKey === eventKey), 'drag-over', !isDisabled && dragOver), 'drag-over-gap-top', !isDisabled && dragOverGapTop), 'drag-over-gap-bottom', !isDisabled && dragOverGapBottom), 'filter-node', (_context$filterTreeNo = context.filterTreeNode) === null || _context$filterTreeNo === void 0 ? void 0 : _context$filterTreeNo.call(context, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props))), "".concat(context.prefixCls, "-treenode-leaf"), memoizedIsLeaf))), style: style // Draggable config , draggable: draggableWithoutDisabled, onDragStart: draggableWithoutDisabled ? onDragStart : undefined // Drop config , onDragEnter: isDraggable ? onDragEnter : undefined, onDragOver: isDraggable ? onDragOver : undefined, onDragLeave: isDraggable ? onDragLeave : undefined, onDrop: isDraggable ? onDrop : undefined, onDragEnd: isDraggable ? onDragEnd : undefined, onMouseMove: onMouseMove }, ariaSelected, dataOrAriaAttributeProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement(_Indent__WEBPACK_IMPORTED_MODULE_9__["default"], { prefixCls: context.prefixCls, level: level, isStart: isStart, isEnd: isEnd }), dragHandlerNode, renderSwitcher(), checkboxNode, selectorNode); }; TreeNode.isTreeNode = 1; if (true) { TreeNode.displayName = 'TreeNode'; } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TreeNode); /***/ }), /***/ "../../../node_modules/rc-tree/es/contextTypes.js": /*!********************************************************!*\ !*** ../../../node_modules/rc-tree/es/contextTypes.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TreeContext: () => (/* binding */ TreeContext), /* harmony export */ UnstableContext: () => (/* binding */ UnstableContext) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /** * Webpack has bug for import loop, which is not the same behavior as ES module. * When util.js imports the TreeNode for tree generate will cause treeContextTypes be empty. */ var TreeContext = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createContext(null); /** Internal usage, safe to remove. Do not use in prod */ var UnstableContext = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createContext({}); /***/ }), /***/ "../../../node_modules/rc-tree/es/index.js": /*!*************************************************!*\ !*** ../../../node_modules/rc-tree/es/index.js ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TreeNode: () => (/* reexport safe */ _TreeNode__WEBPACK_IMPORTED_MODULE_1__["default"]), /* harmony export */ UnstableContext: () => (/* reexport safe */ _contextTypes__WEBPACK_IMPORTED_MODULE_2__.UnstableContext), /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _Tree__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Tree */ "../../../node_modules/rc-tree/es/Tree.js"); /* harmony import */ var _TreeNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TreeNode */ "../../../node_modules/rc-tree/es/TreeNode.js"); /* harmony import */ var _contextTypes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./contextTypes */ "../../../node_modules/rc-tree/es/contextTypes.js"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_Tree__WEBPACK_IMPORTED_MODULE_0__["default"]); /***/ }), /***/ "../../../node_modules/rc-tree/es/useUnmount.js": /*!******************************************************!*\ !*** ../../../node_modules/rc-tree/es/useUnmount.js ***! \******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rc-util/es/hooks/useLayoutEffect */ "../../../node_modules/rc-util/es/hooks/useLayoutEffect.js"); /** * Trigger only when component unmount */ function useUnmount(triggerStart, triggerEnd) { var _React$useState = react__WEBPACK_IMPORTED_MODULE_1__.useState(false), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__["default"])(_React$useState, 2), firstMount = _React$useState2[0], setFirstMount = _React$useState2[1]; (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_2__["default"])(function () { if (firstMount) { triggerStart(); return function () { triggerEnd(); }; } }, [firstMount]); (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_2__["default"])(function () { setFirstMount(true); return function () { setFirstMount(false); }; }, []); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useUnmount); /***/ }), /***/ "../../../node_modules/rc-tree/es/util.js": /*!************************************************!*\ !*** ../../../node_modules/rc-tree/es/util.js ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ arrAdd: () => (/* binding */ arrAdd), /* harmony export */ arrDel: () => (/* binding */ arrDel), /* harmony export */ calcDropPosition: () => (/* binding */ calcDropPosition), /* harmony export */ calcSelectedKeys: () => (/* binding */ calcSelectedKeys), /* harmony export */ conductExpandParent: () => (/* binding */ conductExpandParent), /* harmony export */ convertDataToTree: () => (/* binding */ convertDataToTree), /* harmony export */ getDragChildrenKeys: () => (/* binding */ getDragChildrenKeys), /* harmony export */ getPosition: () => (/* reexport safe */ _utils_treeUtil__WEBPACK_IMPORTED_MODULE_8__.getPosition), /* harmony export */ isFirstChild: () => (/* binding */ isFirstChild), /* harmony export */ isLastChild: () => (/* binding */ isLastChild), /* harmony export */ isTreeNode: () => (/* reexport safe */ _utils_treeUtil__WEBPACK_IMPORTED_MODULE_8__.isTreeNode), /* harmony export */ parseCheckedKeys: () => (/* binding */ parseCheckedKeys), /* harmony export */ posToArr: () => (/* binding */ posToArr) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/esm/toConsumableArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ "../../../node_modules/@babel/runtime/helpers/esm/typeof.js"); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var rc_util_es_warning__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! rc-util/es/warning */ "../../../node_modules/rc-util/es/warning.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _TreeNode__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./TreeNode */ "../../../node_modules/rc-tree/es/TreeNode.js"); /* harmony import */ var _utils_keyUtil__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/keyUtil */ "../../../node_modules/rc-tree/es/utils/keyUtil.js"); /* harmony import */ var _utils_treeUtil__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/treeUtil */ "../../../node_modules/rc-tree/es/utils/treeUtil.js"); var _excluded = ["children"]; /* eslint-disable no-lonely-if */ /** * Legacy code. Should avoid to use if you are new to import these code. */ function arrDel(list, value) { if (!list) return []; var clone = list.slice(); var index = clone.indexOf(value); if (index >= 0) { clone.splice(index, 1); } return clone; } function arrAdd(list, value) { var clone = (list || []).slice(); if (clone.indexOf(value) === -1) { clone.push(value); } return clone; } function posToArr(pos) { return pos.split('-'); } function getDragChildrenKeys(dragNodeKey, keyEntities) { // not contains self // self for left or right drag var dragChildrenKeys = []; var entity = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_7__["default"])(keyEntities, dragNodeKey); function dig() { var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; list.forEach(function (_ref) { var key = _ref.key, children = _ref.children; dragChildrenKeys.push(key); dig(children); }); } dig(entity.children); return dragChildrenKeys; } function isLastChild(treeNodeEntity) { if (treeNodeEntity.parent) { var posArr = posToArr(treeNodeEntity.pos); return Number(posArr[posArr.length - 1]) === treeNodeEntity.parent.children.length - 1; } return false; } function isFirstChild(treeNodeEntity) { var posArr = posToArr(treeNodeEntity.pos); return Number(posArr[posArr.length - 1]) === 0; } // Only used when drag, not affect SSR. function calcDropPosition(event, dragNodeProps, targetNodeProps, indent, startMousePosition, allowDrop, flattenedNodes, keyEntities, expandKeys, direction) { var _abstractDropNodeEnti; var clientX = event.clientX, clientY = event.clientY; var _getBoundingClientRec = event.target.getBoundingClientRect(), top = _getBoundingClientRec.top, height = _getBoundingClientRec.height; // optional chain for testing var horizontalMouseOffset = (direction === 'rtl' ? -1 : 1) * (((startMousePosition === null || startMousePosition === void 0 ? void 0 : startMousePosition.x) || 0) - clientX); var rawDropLevelOffset = (horizontalMouseOffset - 12) / indent; // Filter the expanded keys to exclude the node that not has children currently (like async nodes). var filteredExpandKeys = expandKeys.filter(function (key) { var _keyEntities$key; return (_keyEntities$key = keyEntities[key]) === null || _keyEntities$key === void 0 || (_keyEntities$key = _keyEntities$key.children) === null || _keyEntities$key === void 0 ? void 0 : _keyEntities$key.length; }); // find abstract drop node by horizontal offset var abstractDropNodeEntity = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_7__["default"])(keyEntities, targetNodeProps.eventKey); if (clientY < top + height / 2) { // first half, set abstract drop node to previous node var nodeIndex = flattenedNodes.findIndex(function (flattenedNode) { return flattenedNode.key === abstractDropNodeEntity.key; }); var prevNodeIndex = nodeIndex <= 0 ? 0 : nodeIndex - 1; var prevNodeKey = flattenedNodes[prevNodeIndex].key; abstractDropNodeEntity = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_7__["default"])(keyEntities, prevNodeKey); } var initialAbstractDropNodeKey = abstractDropNodeEntity.key; var abstractDragOverEntity = abstractDropNodeEntity; var dragOverNodeKey = abstractDropNodeEntity.key; var dropPosition = 0; var dropLevelOffset = 0; // Only allow cross level drop when dragging on a non-expanded node if (!filteredExpandKeys.includes(initialAbstractDropNodeKey)) { for (var i = 0; i < rawDropLevelOffset; i += 1) { if (isLastChild(abstractDropNodeEntity)) { abstractDropNodeEntity = abstractDropNodeEntity.parent; dropLevelOffset += 1; } else { break; } } } var abstractDragDataNode = dragNodeProps.data; var abstractDropDataNode = abstractDropNodeEntity.node; var dropAllowed = true; if (isFirstChild(abstractDropNodeEntity) && abstractDropNodeEntity.level === 0 && clientY < top + height / 2 && allowDrop({ dragNode: abstractDragDataNode, dropNode: abstractDropDataNode, dropPosition: -1 }) && abstractDropNodeEntity.key === targetNodeProps.eventKey) { // first half of first node in first level dropPosition = -1; } else if ((abstractDragOverEntity.children || []).length && filteredExpandKeys.includes(dragOverNodeKey)) { // drop on expanded node // only allow drop inside if (allowDrop({ dragNode: abstractDragDataNode, dropNode: abstractDropDataNode, dropPosition: 0 })) { dropPosition = 0; } else { dropAllowed = false; } } else if (dropLevelOffset === 0) { if (rawDropLevelOffset > -1.5) { // | Node | <- abstractDropNode // | -^-===== | <- mousePosition // 1. try drop after // 2. do not allow drop if (allowDrop({ dragNode: abstractDragDataNode, dropNode: abstractDropDataNode, dropPosition: 1 })) { dropPosition = 1; } else { dropAllowed = false; } } else { // | Node | <- abstractDropNode // | ---==^== | <- mousePosition // whether it has children or doesn't has children // always // 1. try drop inside // 2. try drop after // 3. do not allow drop if (allowDrop({ dragNode: abstractDragDataNode, dropNode: abstractDropDataNode, dropPosition: 0 })) { dropPosition = 0; } else if (allowDrop({ dragNode: abstractDragDataNode, dropNode: abstractDropDataNode, dropPosition: 1 })) { dropPosition = 1; } else { dropAllowed = false; } } } else { // | Node1 | <- abstractDropNode // | Node2 | // --^--|----=====| <- mousePosition // 1. try insert after Node1 // 2. do not allow drop if (allowDrop({ dragNode: abstractDragDataNode, dropNode: abstractDropDataNode, dropPosition: 1 })) { dropPosition = 1; } else { dropAllowed = false; } } return { dropPosition: dropPosition, dropLevelOffset: dropLevelOffset, dropTargetKey: abstractDropNodeEntity.key, dropTargetPos: abstractDropNodeEntity.pos, dragOverNodeKey: dragOverNodeKey, dropContainerKey: dropPosition === 0 ? null : ((_abstractDropNodeEnti = abstractDropNodeEntity.parent) === null || _abstractDropNodeEnti === void 0 ? void 0 : _abstractDropNodeEnti.key) || null, dropAllowed: dropAllowed }; } /** * Return selectedKeys according with multiple prop * @param selectedKeys * @param props * @returns [string] */ function calcSelectedKeys(selectedKeys, props) { if (!selectedKeys) return undefined; var multiple = props.multiple; if (multiple) { return selectedKeys.slice(); } if (selectedKeys.length) { return [selectedKeys[0]]; } return selectedKeys; } var internalProcessProps = function internalProcessProps(props) { return props; }; function convertDataToTree(treeData, processor) { if (!treeData) return []; var _ref2 = processor || {}, _ref2$processProps = _ref2.processProps, processProps = _ref2$processProps === void 0 ? internalProcessProps : _ref2$processProps; var list = Array.isArray(treeData) ? treeData : [treeData]; return list.map(function (_ref3) { var children = _ref3.children, props = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__["default"])(_ref3, _excluded); var childrenNodes = convertDataToTree(children, processor); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement(_TreeNode__WEBPACK_IMPORTED_MODULE_6__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__["default"])({ key: props.key }, processProps(props)), childrenNodes); }); } /** * Parse `checkedKeys` to { checkedKeys, halfCheckedKeys } style */ function parseCheckedKeys(keys) { if (!keys) { return null; } // Convert keys to object format var keyProps; if (Array.isArray(keys)) { // [Legacy] Follow the api doc keyProps = { checkedKeys: keys, halfCheckedKeys: undefined }; } else if ((0,_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__["default"])(keys) === 'object') { keyProps = { checkedKeys: keys.checked || undefined, halfCheckedKeys: keys.halfChecked || undefined }; } else { (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_4__["default"])(false, '`checkedKeys` is not an array or an object'); return null; } return keyProps; } /** * If user use `autoExpandParent` we should get the list of parent node * @param keyList * @param keyEntities */ function conductExpandParent(keyList, keyEntities) { var expandedKeys = new Set(); function conductUp(key) { if (expandedKeys.has(key)) return; var entity = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_7__["default"])(keyEntities, key); if (!entity) return; expandedKeys.add(key); var parent = entity.parent, node = entity.node; if (node.disabled) return; if (parent) { conductUp(parent.key); } } (keyList || []).forEach(function (key) { conductUp(key); }); return (0,_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__["default"])(expandedKeys); } /***/ }), /***/ "../../../node_modules/rc-tree/es/utils/conductUtil.js": /*!*************************************************************!*\ !*** ../../../node_modules/rc-tree/es/utils/conductUtil.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ conductCheck: () => (/* binding */ conductCheck), /* harmony export */ isCheckDisabled: () => (/* binding */ isCheckDisabled) /* harmony export */ }); /* harmony import */ var rc_util_es_warning__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rc-util/es/warning */ "../../../node_modules/rc-util/es/warning.js"); /* harmony import */ var _keyUtil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keyUtil */ "../../../node_modules/rc-tree/es/utils/keyUtil.js"); function removeFromCheckedKeys(halfCheckedKeys, checkedKeys) { var filteredKeys = new Set(); halfCheckedKeys.forEach(function (key) { if (!checkedKeys.has(key)) { filteredKeys.add(key); } }); return filteredKeys; } function isCheckDisabled(node) { var _ref = node || {}, disabled = _ref.disabled, disableCheckbox = _ref.disableCheckbox, checkable = _ref.checkable; return !!(disabled || disableCheckbox) || checkable === false; } // Fill miss keys function fillConductCheck(keys, levelEntities, maxLevel, syntheticGetCheckDisabled) { var checkedKeys = new Set(keys); var halfCheckedKeys = new Set(); // Add checked keys top to bottom for (var level = 0; level <= maxLevel; level += 1) { var entities = levelEntities.get(level) || new Set(); entities.forEach(function (entity) { var key = entity.key, node = entity.node, _entity$children = entity.children, children = _entity$children === void 0 ? [] : _entity$children; if (checkedKeys.has(key) && !syntheticGetCheckDisabled(node)) { children.filter(function (childEntity) { return !syntheticGetCheckDisabled(childEntity.node); }).forEach(function (childEntity) { checkedKeys.add(childEntity.key); }); } }); } // Add checked keys from bottom to top var visitedKeys = new Set(); for (var _level = maxLevel; _level >= 0; _level -= 1) { var _entities = levelEntities.get(_level) || new Set(); _entities.forEach(function (entity) { var parent = entity.parent, node = entity.node; // Skip if no need to check if (syntheticGetCheckDisabled(node) || !entity.parent || visitedKeys.has(entity.parent.key)) { return; } // Skip if parent is disabled if (syntheticGetCheckDisabled(entity.parent.node)) { visitedKeys.add(parent.key); return; } var allChecked = true; var partialChecked = false; (parent.children || []).filter(function (childEntity) { return !syntheticGetCheckDisabled(childEntity.node); }).forEach(function (_ref2) { var key = _ref2.key; var checked = checkedKeys.has(key); if (allChecked && !checked) { allChecked = false; } if (!partialChecked && (checked || halfCheckedKeys.has(key))) { partialChecked = true; } }); if (allChecked) { checkedKeys.add(parent.key); } if (partialChecked) { halfCheckedKeys.add(parent.key); } visitedKeys.add(parent.key); }); } return { checkedKeys: Array.from(checkedKeys), halfCheckedKeys: Array.from(removeFromCheckedKeys(halfCheckedKeys, checkedKeys)) }; } // Remove useless key function cleanConductCheck(keys, halfKeys, levelEntities, maxLevel, syntheticGetCheckDisabled) { var checkedKeys = new Set(keys); var halfCheckedKeys = new Set(halfKeys); // Remove checked keys from top to bottom for (var level = 0; level <= maxLevel; level += 1) { var entities = levelEntities.get(level) || new Set(); entities.forEach(function (entity) { var key = entity.key, node = entity.node, _entity$children2 = entity.children, children = _entity$children2 === void 0 ? [] : _entity$children2; if (!checkedKeys.has(key) && !halfCheckedKeys.has(key) && !syntheticGetCheckDisabled(node)) { children.filter(function (childEntity) { return !syntheticGetCheckDisabled(childEntity.node); }).forEach(function (childEntity) { checkedKeys.delete(childEntity.key); }); } }); } // Remove checked keys form bottom to top halfCheckedKeys = new Set(); var visitedKeys = new Set(); for (var _level2 = maxLevel; _level2 >= 0; _level2 -= 1) { var _entities2 = levelEntities.get(_level2) || new Set(); _entities2.forEach(function (entity) { var parent = entity.parent, node = entity.node; // Skip if no need to check if (syntheticGetCheckDisabled(node) || !entity.parent || visitedKeys.has(entity.parent.key)) { return; } // Skip if parent is disabled if (syntheticGetCheckDisabled(entity.parent.node)) { visitedKeys.add(parent.key); return; } var allChecked = true; var partialChecked = false; (parent.children || []).filter(function (childEntity) { return !syntheticGetCheckDisabled(childEntity.node); }).forEach(function (_ref3) { var key = _ref3.key; var checked = checkedKeys.has(key); if (allChecked && !checked) { allChecked = false; } if (!partialChecked && (checked || halfCheckedKeys.has(key))) { partialChecked = true; } }); if (!allChecked) { checkedKeys.delete(parent.key); } if (partialChecked) { halfCheckedKeys.add(parent.key); } visitedKeys.add(parent.key); }); } return { checkedKeys: Array.from(checkedKeys), halfCheckedKeys: Array.from(removeFromCheckedKeys(halfCheckedKeys, checkedKeys)) }; } /** * Conduct with keys. * @param keyList current key list * @param keyEntities key - dataEntity map * @param mode `fill` to fill missing key, `clean` to remove useless key */ function conductCheck(keyList, checked, keyEntities, getCheckDisabled) { var warningMissKeys = []; var syntheticGetCheckDisabled; if (getCheckDisabled) { syntheticGetCheckDisabled = getCheckDisabled; } else { syntheticGetCheckDisabled = isCheckDisabled; } // We only handle exist keys var keys = new Set(keyList.filter(function (key) { var hasEntity = !!(0,_keyUtil__WEBPACK_IMPORTED_MODULE_1__["default"])(keyEntities, key); if (!hasEntity) { warningMissKeys.push(key); } return hasEntity; })); var levelEntities = new Map(); var maxLevel = 0; // Convert entities by level for calculation Object.keys(keyEntities).forEach(function (key) { var entity = keyEntities[key]; var level = entity.level; var levelSet = levelEntities.get(level); if (!levelSet) { levelSet = new Set(); levelEntities.set(level, levelSet); } levelSet.add(entity); maxLevel = Math.max(maxLevel, level); }); (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_0__["default"])(!warningMissKeys.length, "Tree missing follow keys: ".concat(warningMissKeys.slice(0, 100).map(function (key) { return "'".concat(key, "'"); }).join(', '))); var result; if (checked === true) { result = fillConductCheck(keys, levelEntities, maxLevel, syntheticGetCheckDisabled); } else { result = cleanConductCheck(keys, checked.halfCheckedKeys, levelEntities, maxLevel, syntheticGetCheckDisabled); } return result; } /***/ }), /***/ "../../../node_modules/rc-tree/es/utils/diffUtil.js": /*!**********************************************************!*\ !*** ../../../node_modules/rc-tree/es/utils/diffUtil.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ findExpandedKeys: () => (/* binding */ findExpandedKeys), /* harmony export */ getExpandRange: () => (/* binding */ getExpandRange) /* harmony export */ }); function findExpandedKeys() { var prev = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var next = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var prevLen = prev.length; var nextLen = next.length; if (Math.abs(prevLen - nextLen) !== 1) { return { add: false, key: null }; } function find(shorter, longer) { var cache = new Map(); shorter.forEach(function (key) { cache.set(key, true); }); var keys = longer.filter(function (key) { return !cache.has(key); }); return keys.length === 1 ? keys[0] : null; } if (prevLen < nextLen) { return { add: true, key: find(prev, next) }; } return { add: false, key: find(next, prev) }; } function getExpandRange(shorter, longer, key) { var shorterStartIndex = shorter.findIndex(function (data) { return data.key === key; }); var shorterEndNode = shorter[shorterStartIndex + 1]; var longerStartIndex = longer.findIndex(function (data) { return data.key === key; }); if (shorterEndNode) { var longerEndIndex = longer.findIndex(function (data) { return data.key === shorterEndNode.key; }); return longer.slice(longerStartIndex + 1, longerEndIndex); } return longer.slice(longerStartIndex + 1); } /***/ }), /***/ "../../../node_modules/rc-tree/es/utils/keyUtil.js": /*!*********************************************************!*\ !*** ../../../node_modules/rc-tree/es/utils/keyUtil.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ getEntity) /* harmony export */ }); function getEntity(keyEntities, key) { return keyEntities[key]; } /***/ }), /***/ "../../../node_modules/rc-tree/es/utils/treeUtil.js": /*!**********************************************************!*\ !*** ../../../node_modules/rc-tree/es/utils/treeUtil.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ convertDataToEntities: () => (/* binding */ convertDataToEntities), /* harmony export */ convertNodePropsToEventData: () => (/* binding */ convertNodePropsToEventData), /* harmony export */ convertTreeToData: () => (/* binding */ convertTreeToData), /* harmony export */ fillFieldNames: () => (/* binding */ fillFieldNames), /* harmony export */ flattenTreeData: () => (/* binding */ flattenTreeData), /* harmony export */ getKey: () => (/* binding */ getKey), /* harmony export */ getPosition: () => (/* binding */ getPosition), /* harmony export */ getTreeNodeProps: () => (/* binding */ getTreeNodeProps), /* harmony export */ isTreeNode: () => (/* binding */ isTreeNode), /* harmony export */ traverseDataNodes: () => (/* binding */ traverseDataNodes), /* harmony export */ warningWithoutKey: () => (/* binding */ warningWithoutKey) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ "../../../node_modules/@babel/runtime/helpers/esm/typeof.js"); /* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/esm/toConsumableArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var rc_util_es_Children_toArray__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! rc-util/es/Children/toArray */ "../../../node_modules/rc-util/es/Children/toArray.js"); /* harmony import */ var rc_util_es_omit__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! rc-util/es/omit */ "../../../node_modules/rc-util/es/omit.js"); /* harmony import */ var rc_util_es_warning__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! rc-util/es/warning */ "../../../node_modules/rc-util/es/warning.js"); /* harmony import */ var _keyUtil__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./keyUtil */ "../../../node_modules/rc-tree/es/utils/keyUtil.js"); var _excluded = ["children"]; function getPosition(level, index) { return "".concat(level, "-").concat(index); } function isTreeNode(node) { return node && node.type && node.type.isTreeNode; } function getKey(key, pos) { if (key !== null && key !== undefined) { return key; } return pos; } function fillFieldNames(fieldNames) { var _ref = fieldNames || {}, title = _ref.title, _title = _ref._title, key = _ref.key, children = _ref.children; var mergedTitle = title || 'title'; return { title: mergedTitle, _title: _title || [mergedTitle], key: key || 'key', children: children || 'children' }; } /** * Warning if TreeNode do not provides key */ function warningWithoutKey(treeData, fieldNames) { var keys = new Map(); function dig(list) { var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; (list || []).forEach(function (treeNode) { var key = treeNode[fieldNames.key]; var children = treeNode[fieldNames.children]; (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_6__["default"])(key !== null && key !== undefined, "Tree node must have a certain key: [".concat(path).concat(key, "]")); var recordKey = String(key); (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_6__["default"])(!keys.has(recordKey) || key === null || key === undefined, "Same 'key' exist in the Tree: ".concat(recordKey)); keys.set(recordKey, true); dig(children, "".concat(path).concat(recordKey, " > ")); }); } dig(treeData); } /** * Convert `children` of Tree into `treeData` structure. */ function convertTreeToData(rootNodes) { function dig(node) { var treeNodes = (0,rc_util_es_Children_toArray__WEBPACK_IMPORTED_MODULE_4__["default"])(node); return treeNodes.map(function (treeNode) { // Filter invalidate node if (!isTreeNode(treeNode)) { (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_6__["default"])(!treeNode, 'Tree/TreeNode can only accept TreeNode as children.'); return null; } var key = treeNode.key; var _treeNode$props = treeNode.props, children = _treeNode$props.children, rest = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__["default"])(_treeNode$props, _excluded); var dataNode = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({ key: key }, rest); var parsedChildren = dig(children); if (parsedChildren.length) { dataNode.children = parsedChildren; } return dataNode; }).filter(function (dataNode) { return dataNode; }); } return dig(rootNodes); } /** * Flat nest tree data into flatten list. This is used for virtual list render. * @param treeNodeList Origin data node list * @param expandedKeys * need expanded keys, provides `true` means all expanded (used in `rc-tree-select`). */ function flattenTreeData(treeNodeList, expandedKeys, fieldNames) { var _fillFieldNames = fillFieldNames(fieldNames), fieldTitles = _fillFieldNames._title, fieldKey = _fillFieldNames.key, fieldChildren = _fillFieldNames.children; var expandedKeySet = new Set(expandedKeys === true ? [] : expandedKeys); var flattenList = []; function dig(list) { var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; return list.map(function (treeNode, index) { var pos = getPosition(parent ? parent.pos : '0', index); var mergedKey = getKey(treeNode[fieldKey], pos); // Pick matched title in field title list var mergedTitle; for (var i = 0; i < fieldTitles.length; i += 1) { var fieldTitle = fieldTitles[i]; if (treeNode[fieldTitle] !== undefined) { mergedTitle = treeNode[fieldTitle]; break; } } // Add FlattenDataNode into list // We use `Object.assign` here to save perf since babel's `objectSpread` has perf issue var flattenNode = Object.assign((0,rc_util_es_omit__WEBPACK_IMPORTED_MODULE_5__["default"])(treeNode, [].concat((0,_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__["default"])(fieldTitles), [fieldKey, fieldChildren])), { title: mergedTitle, key: mergedKey, parent: parent, pos: pos, children: null, data: treeNode, isStart: [].concat((0,_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__["default"])(parent ? parent.isStart : []), [index === 0]), isEnd: [].concat((0,_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__["default"])(parent ? parent.isEnd : []), [index === list.length - 1]) }); flattenList.push(flattenNode); // Loop treeNode children if (expandedKeys === true || expandedKeySet.has(mergedKey)) { flattenNode.children = dig(treeNode[fieldChildren] || [], flattenNode); } else { flattenNode.children = []; } return flattenNode; }); } dig(treeNodeList); return flattenList; } /** * Traverse all the data by `treeData`. * Please not use it out of the `rc-tree` since we may refactor this code. */ function traverseDataNodes(dataNodes, callback, // To avoid too many params, let use config instead of origin param config) { var mergedConfig = {}; if ((0,_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__["default"])(config) === 'object') { mergedConfig = config; } else { mergedConfig = { externalGetKey: config }; } mergedConfig = mergedConfig || {}; // Init config var _mergedConfig = mergedConfig, childrenPropName = _mergedConfig.childrenPropName, externalGetKey = _mergedConfig.externalGetKey, fieldNames = _mergedConfig.fieldNames; var _fillFieldNames2 = fillFieldNames(fieldNames), fieldKey = _fillFieldNames2.key, fieldChildren = _fillFieldNames2.children; var mergeChildrenPropName = childrenPropName || fieldChildren; // Get keys var syntheticGetKey; if (externalGetKey) { if (typeof externalGetKey === 'string') { syntheticGetKey = function syntheticGetKey(node) { return node[externalGetKey]; }; } else if (typeof externalGetKey === 'function') { syntheticGetKey = function syntheticGetKey(node) { return externalGetKey(node); }; } } else { syntheticGetKey = function syntheticGetKey(node, pos) { return getKey(node[fieldKey], pos); }; } // Process function processNode(node, index, parent, pathNodes) { var children = node ? node[mergeChildrenPropName] : dataNodes; var pos = node ? getPosition(parent.pos, index) : '0'; var connectNodes = node ? [].concat((0,_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__["default"])(pathNodes), [node]) : []; // Process node if is not root if (node) { var key = syntheticGetKey(node, pos); var _data = { node: node, index: index, pos: pos, key: key, parentPos: parent.node ? parent.pos : null, level: parent.level + 1, nodes: connectNodes }; callback(_data); } // Process children node if (children) { children.forEach(function (subNode, subIndex) { processNode(subNode, subIndex, { node: node, pos: pos, level: parent ? parent.level + 1 : -1 }, connectNodes); }); } } processNode(null); } /** * Convert `treeData` into entity records. */ function convertDataToEntities(dataNodes) { var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, initWrapper = _ref2.initWrapper, processEntity = _ref2.processEntity, onProcessFinished = _ref2.onProcessFinished, externalGetKey = _ref2.externalGetKey, childrenPropName = _ref2.childrenPropName, fieldNames = _ref2.fieldNames; var /** @deprecated Use `config.externalGetKey` instead */ legacyExternalGetKey = arguments.length > 2 ? arguments[2] : undefined; // Init config var mergedExternalGetKey = externalGetKey || legacyExternalGetKey; var posEntities = {}; var keyEntities = {}; var wrapper = { posEntities: posEntities, keyEntities: keyEntities }; if (initWrapper) { wrapper = initWrapper(wrapper) || wrapper; } traverseDataNodes(dataNodes, function (item) { var node = item.node, index = item.index, pos = item.pos, key = item.key, parentPos = item.parentPos, level = item.level, nodes = item.nodes; var entity = { node: node, nodes: nodes, index: index, key: key, pos: pos, level: level }; var mergedKey = getKey(key, pos); posEntities[pos] = entity; keyEntities[mergedKey] = entity; // Fill children entity.parent = posEntities[parentPos]; if (entity.parent) { entity.parent.children = entity.parent.children || []; entity.parent.children.push(entity); } if (processEntity) { processEntity(entity, wrapper); } }, { externalGetKey: mergedExternalGetKey, childrenPropName: childrenPropName, fieldNames: fieldNames }); if (onProcessFinished) { onProcessFinished(wrapper); } return wrapper; } /** * Get TreeNode props with Tree props. */ function getTreeNodeProps(key, _ref3) { var expandedKeys = _ref3.expandedKeys, selectedKeys = _ref3.selectedKeys, loadedKeys = _ref3.loadedKeys, loadingKeys = _ref3.loadingKeys, checkedKeys = _ref3.checkedKeys, halfCheckedKeys = _ref3.halfCheckedKeys, dragOverNodeKey = _ref3.dragOverNodeKey, dropPosition = _ref3.dropPosition, keyEntities = _ref3.keyEntities; var entity = (0,_keyUtil__WEBPACK_IMPORTED_MODULE_7__["default"])(keyEntities, key); var treeNodeProps = { eventKey: key, expanded: expandedKeys.indexOf(key) !== -1, selected: selectedKeys.indexOf(key) !== -1, loaded: loadedKeys.indexOf(key) !== -1, loading: loadingKeys.indexOf(key) !== -1, checked: checkedKeys.indexOf(key) !== -1, halfChecked: halfCheckedKeys.indexOf(key) !== -1, pos: String(entity ? entity.pos : ''), // [Legacy] Drag props // Since the interaction of drag is changed, the semantic of the props are // not accuracy, I think it should be finally removed dragOver: dragOverNodeKey === key && dropPosition === 0, dragOverGapTop: dragOverNodeKey === key && dropPosition === -1, dragOverGapBottom: dragOverNodeKey === key && dropPosition === 1 }; return treeNodeProps; } function convertNodePropsToEventData(props) { var data = props.data, expanded = props.expanded, selected = props.selected, checked = props.checked, loaded = props.loaded, loading = props.loading, halfChecked = props.halfChecked, dragOver = props.dragOver, dragOverGapTop = props.dragOverGapTop, dragOverGapBottom = props.dragOverGapBottom, pos = props.pos, active = props.active, eventKey = props.eventKey; var eventData = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, data), {}, { expanded: expanded, selected: selected, checked: checked, loaded: loaded, loading: loading, halfChecked: halfChecked, dragOver: dragOver, dragOverGapTop: dragOverGapTop, dragOverGapBottom: dragOverGapBottom, pos: pos, active: active, key: eventKey }); if (!('props' in eventData)) { Object.defineProperty(eventData, 'props', { get: function get() { (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_6__["default"])(false, 'Second param return from event is node data instead of TreeNode instance. Please read value directly instead of reading from `props`.'); return props; } }); } return eventData; } /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfcmMtdGV4dGFyZWFfZXNfaW5kZXhfanMtbm9kZV9tb2R1bGVzX3JjLXRvb2x0aXBfZXNfaW5kZXhfanMtbm9kZV9tb2R1bGVzLWFlNDAxOS52b2x1bnRlZXJhcGkuZWI3ZjNmYTVhOThhN2JjZTkxZjUuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBMEQ7QUFDYztBQUNIO0FBQ2I7QUFDYztBQUNvQjtBQUMxRjtBQUNvQztBQUNZO0FBQ2U7QUFDRjtBQUM1QjtBQUNGO0FBQzRCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyw4Q0FBZ0I7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiw4RkFBd0I7O0FBRXhDO0FBQ0Esd0JBQXdCLDJFQUFjO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLHVCQUF1QixvRkFBYztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsMENBQVk7QUFDaEMsRUFBRSx1REFBeUI7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLHVCQUF1QiwyQ0FBYTtBQUNwQyxzQkFBc0IsNkVBQU87QUFDN0I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLHNCQUFzQixvRkFBYztBQUNwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixrQkFBa0I7QUFDckM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3Qiw0Q0FBYztBQUN0Qyx1QkFBdUIsb0ZBQWM7QUFDckM7QUFDQTtBQUNBLHlCQUF5Qiw0Q0FBYztBQUN2Qyx1QkFBdUIs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QTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvRkFBb0Y7QUFDcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0RBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixvRkFBYSxDQUFDLG9GQUFhLEdBQUcsV0FBVztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsUUFBUSw4REFBTztBQUNmO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy10ZXh0YXJlYS9lcy9SZXNpemFibGVUZXh0QXJlYS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy10ZXh0YXJlYS9lcy9UZXh0QXJlYS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy10ZXh0YXJlYS9lcy9jYWxjdWxhdGVOb2RlSGVpZ2h0LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXRleHRhcmVhL2VzL2luZGV4LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXRvb2x0aXAvZXMvUG9wdXAuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdG9vbHRpcC9lcy9Ub29sdGlwLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXRvb2x0aXAvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdG9vbHRpcC9lcy9wbGFjZW1lbnRzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvRHJvcEluZGljYXRvci5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy10cmVlL2VzL0luZGVudC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy10cmVlL2VzL01vdGlvblRyZWVOb2RlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvTm9kZUxpc3QuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdHJlZS9lcy9UcmVlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvVHJlZU5vZGUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdHJlZS9lcy9jb250ZXh0VHlwZXMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdHJlZS9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy10cmVlL2VzL3VzZVVubW91bnQuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdHJlZS9lcy91dGlsLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvdXRpbHMvY29uZHVjdFV0aWwuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdHJlZS9lcy91dGlscy9kaWZmVXRpbC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy10cmVlL2VzL3V0aWxzL2tleVV0aWwuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdHJlZS9lcy91dGlscy90cmVlVXRpbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcImRlZmF1bHRWYWx1ZVwiLCBcInZhbHVlXCIsIFwiYXV0b1NpemVcIiwgXCJvblJlc2l6ZVwiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiZGlzYWJsZWRcIiwgXCJvbkNoYW5nZVwiLCBcIm9uSW50ZXJuYWxBdXRvU2l6ZVwiXTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3JjLXJlc2l6ZS1vYnNlcnZlcic7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNhbGN1bGF0ZUF1dG9TaXplU3R5bGUgZnJvbSBcIi4vY2FsY3VsYXRlTm9kZUhlaWdodFwiO1xudmFyIFJFU0laRV9TVEFSVCA9IDA7XG52YXIgUkVTSVpFX01FQVNVUklORyA9IDE7XG52YXIgUkVTSVpFX1NUQUJMRSA9IDI7XG52YXIgUmVzaXphYmxlVGV4dEFyZWEgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgX3JlZiA9IHByb3BzLFxuICAgIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIGRlZmF1bHRWYWx1ZSA9IF9yZWYuZGVmYXVsdFZhbHVlLFxuICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICBhdXRvU2l6ZSA9IF9yZWYuYXV0b1NpemUsXG4gICAgb25SZXNpemUgPSBfcmVmLm9uUmVzaXplLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICBkaXNhYmxlZCA9IF9yZWYuZGlzYWJsZWQsXG4gICAgb25DaGFuZ2UgPSBfcmVmLm9uQ2hhbmdlLFxuICAgIG9uSW50ZXJuYWxBdXRvU2l6ZSA9IF9yZWYub25JbnRlcm5hbEF1dG9TaXplLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVmFsdWUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKGRlZmF1bHRWYWx1ZSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgcG9zdFN0YXRlOiBmdW5jdGlvbiBwb3N0U3RhdGUodmFsKSB7XG4gICAgICAgIHJldHVybiB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB2b2lkIDAgPyB2YWwgOiAnJztcbiAgICAgIH1cbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICBtZXJnZWRWYWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMF0sXG4gICAgc2V0TWVyZ2VkVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuICB2YXIgb25JbnRlcm5hbENoYW5nZSA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDaGFuZ2UoZXZlbnQpIHtcbiAgICBzZXRNZXJnZWRWYWx1ZShldmVudC50YXJnZXQudmFsdWUpO1xuICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgfHwgb25DaGFuZ2UoZXZlbnQpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRleHRhcmVhUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHRBcmVhOiB0ZXh0YXJlYVJlZi5jdXJyZW50XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEF1dG9TaXplID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChhdXRvU2l6ZSAmJiBfdHlwZW9mKGF1dG9TaXplKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIFthdXRvU2l6ZS5taW5Sb3dzLCBhdXRvU2l6ZS5tYXhSb3dzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9LCBbYXV0b1NpemVdKSxcbiAgICBfUmVhY3QkdXNlTWVtbzIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlTWVtbywgMiksXG4gICAgbWluUm93cyA9IF9SZWFjdCR1c2VNZW1vMlswXSxcbiAgICBtYXhSb3dzID0gX1JlYWN0JHVzZU1lbW8yWzFdO1xuICB2YXIgbmVlZEF1dG9TaXplID0gISFhdXRvU2l6ZTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNjcm9sbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzIxODcwXG4gIHZhciBmaXhGaXJlZm94QXV0b1Njcm9sbCA9IGZ1bmN0aW9uIGZpeEZpcmVmb3hBdXRvU2Nyb2xsKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBGRiBoYXMgYnVnIHdpdGgganVtcCBvZiBzY3JvbGwgdG8gdG9wLiBXZSBmb3JjZSBiYWNrIGhlcmUuXG4gICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGV4dGFyZWFSZWYuY3VycmVudCkge1xuICAgICAgICB2YXIgX3RleHRhcmVhUmVmJGN1cnJlbnQgPSB0ZXh0YXJlYVJlZi5jdXJyZW50LFxuICAgICAgICAgIHNlbGVjdGlvblN0YXJ0ID0gX3RleHRhcmVhUmVmJGN1cnJlbnQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgc2VsZWN0aW9uRW5kID0gX3RleHRhcmVhUmVmJGN1cnJlbnQuc2VsZWN0aW9uRW5kLFxuICAgICAgICAgIHNjcm9sbFRvcCA9IF90ZXh0YXJlYVJlZiRjdXJyZW50LnNjcm9sbFRvcDtcblxuICAgICAgICAvLyBGaXggU2FmYXJpIGJ1ZyB3aGljaCBub3Qgcm9sbGJhY2sgd2hlbiBicmVhayBsaW5lXG4gICAgICAgIC8vIFRoaXMgbWFrZXMgQ2hpbmVzZSBJTUUgY2FuJ3QgaW5wdXQuIERvIG5vdCBmaXggdGhpc1xuICAgICAgICAvLyBjb25zdCB7IHZhbHVlOiB0bXBWYWx1ZSB9ID0gdGV4dGFyZWFSZWYuY3VycmVudDtcbiAgICAgICAgLy8gdGV4dGFyZWFSZWYuY3VycmVudC52YWx1ZSA9ICcnO1xuICAgICAgICAvLyB0ZXh0YXJlYVJlZi5jdXJyZW50LnZhbHVlID0gdG1wVmFsdWU7XG5cbiAgICAgICAgdGV4dGFyZWFSZWYuY3VycmVudC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcbiAgICAgICAgdGV4dGFyZWFSZWYuY3VycmVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gRml4IGVycm9yIGluIENocm9tZTpcbiAgICAgIC8vIEZhaWxlZCB0byByZWFkIHRoZSAnc2VsZWN0aW9uU3RhcnQnIHByb3BlcnR5IGZyb20gJ0hUTUxJbnB1dEVsZW1lbnQnXG4gICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8yMTE3NzQ4OS8zMDQwNjA1XG4gICAgfVxuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVzaXplID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKFJFU0laRV9TVEFCTEUpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHJlc2l6ZVN0YXRlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRSZXNpemVTdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgYXV0b1NpemVTdHlsZSA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0QXV0b1NpemVTdHlsZSA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHZhciBzdGFydFJlc2l6ZSA9IGZ1bmN0aW9uIHN0YXJ0UmVzaXplKCkge1xuICAgIHNldFJlc2l6ZVN0YXRlKFJFU0laRV9TVEFSVCk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcpIHtcbiAgICAgIG9uSW50ZXJuYWxBdXRvU2l6ZSA9PT0gbnVsbCB8fCBvbkludGVybmFsQXV0b1NpemUgPT09IHZvaWQgMCB8fCBvbkludGVybmFsQXV0b1NpemUoKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gQ2hhbmdlIHRvIHRyaWdnZXIgcmVzaXplIG1lYXN1cmVcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobmVlZEF1dG9TaXplKSB7XG4gICAgICBzdGFydFJlc2l6ZSgpO1xuICAgIH1cbiAgfSwgW3ZhbHVlLCBtaW5Sb3dzLCBtYXhSb3dzLCBuZWVkQXV0b1NpemVdKTtcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocmVzaXplU3RhdGUgPT09IFJFU0laRV9TVEFSVCkge1xuICAgICAgc2V0UmVzaXplU3RhdGUoUkVTSVpFX01FQVNVUklORyk7XG4gICAgfSBlbHNlIGlmIChyZXNpemVTdGF0ZSA9PT0gUkVTSVpFX01FQVNVUklORykge1xuICAgICAgdmFyIHRleHRhcmVhU3R5bGVzID0gY2FsY3VsYXRlQXV0b1NpemVTdHlsZSh0ZXh0YXJlYVJlZi5jdXJyZW50LCBmYWxzZSwgbWluUm93cywgbWF4Um93cyk7XG5cbiAgICAgIC8vIFNhZmFyaSBoYXMgYnVnIHRoYXQgdGV4dCB3aWxsIGtlZXAgYnJlYWsgbGluZSBvbiB0ZXh0IGN1dCB3aGVuIGl0J3MgcHJldiBpcyBicmVhayBsaW5lLlxuICAgICAgLy8gWm9tYmllSjogVGhpcyBub3Qgb2Z0ZW4gaGFwcGVuLiBTbyB3ZSBqdXN0IHNraXAgaXQuXG4gICAgICAvLyBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQsIHNjcm9sbFRvcCB9ID0gdGV4dGFyZWFSZWYuY3VycmVudDtcbiAgICAgIC8vIGNvbnN0IHsgdmFsdWU6IHRtcFZhbHVlIH0gPSB0ZXh0YXJlYVJlZi5jdXJyZW50O1xuICAgICAgLy8gdGV4dGFyZWFSZWYuY3VycmVudC52YWx1ZSA9ICcnO1xuICAgICAgLy8gdGV4dGFyZWFSZWYuY3VycmVudC52YWx1ZSA9IHRtcFZhbHVlO1xuXG4gICAgICAvLyBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGV4dGFyZWFSZWYuY3VycmVudCkge1xuICAgICAgLy8gICB0ZXh0YXJlYVJlZi5jdXJyZW50LnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICAgIC8vICAgdGV4dGFyZWFSZWYuY3VycmVudC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcbiAgICAgIC8vIH1cblxuICAgICAgc2V0UmVzaXplU3RhdGUoUkVTSVpFX1NUQUJMRSk7XG4gICAgICBzZXRBdXRvU2l6ZVN0eWxlKHRleHRhcmVhU3R5bGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZml4RmlyZWZveEF1dG9TY3JvbGwoKTtcbiAgICB9XG4gIH0sIFtyZXNpemVTdGF0ZV0pO1xuXG4gIC8vIFdlIGxvY2sgcmVzaXplIHRyaWdnZXIgYnkgcmFmIHRvIGF2b2lkIFNhZmFyaSB3YXJuaW5nXG4gIHZhciByZXNpemVSYWZSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIGNsZWFuUmFmID0gZnVuY3Rpb24gY2xlYW5SYWYoKSB7XG4gICAgcmFmLmNhbmNlbChyZXNpemVSYWZSZWYuY3VycmVudCk7XG4gIH07XG4gIHZhciBvbkludGVybmFsUmVzaXplID0gZnVuY3Rpb24gb25JbnRlcm5hbFJlc2l6ZShzaXplKSB7XG4gICAgaWYgKHJlc2l6ZVN0YXRlID09PSBSRVNJWkVfU1RBQkxFKSB7XG4gICAgICBvblJlc2l6ZSA9PT0gbnVsbCB8fCBvblJlc2l6ZSA9PT0gdm9pZCAwIHx8IG9uUmVzaXplKHNpemUpO1xuICAgICAgaWYgKGF1dG9TaXplKSB7XG4gICAgICAgIGNsZWFuUmFmKCk7XG4gICAgICAgIHJlc2l6ZVJhZlJlZi5jdXJyZW50ID0gcmFmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzdGFydFJlc2l6ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNsZWFuUmFmO1xuICB9LCBbXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkQXV0b1NpemVTdHlsZSA9IG5lZWRBdXRvU2l6ZSA/IGF1dG9TaXplU3R5bGUgOiBudWxsO1xuICB2YXIgbWVyZ2VkU3R5bGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwgbWVyZ2VkQXV0b1NpemVTdHlsZSk7XG4gIGlmIChyZXNpemVTdGF0ZSA9PT0gUkVTSVpFX1NUQVJUIHx8IHJlc2l6ZVN0YXRlID09PSBSRVNJWkVfTUVBU1VSSU5HKSB7XG4gICAgbWVyZ2VkU3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbic7XG4gICAgbWVyZ2VkU3R5bGUub3ZlcmZsb3dYID0gJ2hpZGRlbic7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6ZU9ic2VydmVyLCB7XG4gICAgb25SZXNpemU6IG9uSW50ZXJuYWxSZXNpemUsXG4gICAgZGlzYWJsZWQ6ICEoYXV0b1NpemUgfHwgb25SZXNpemUpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIiwgX2V4dGVuZHMoe30sIHJlc3RQcm9wcywge1xuICAgIHJlZjogdGV4dGFyZWFSZWYsXG4gICAgc3R5bGU6IG1lcmdlZFN0eWxlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCkpLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICB2YWx1ZTogbWVyZ2VkVmFsdWUsXG4gICAgb25DaGFuZ2U6IG9uSW50ZXJuYWxDaGFuZ2VcbiAgfSkpKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgUmVzaXphYmxlVGV4dEFyZWE7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZGVmYXVsdFZhbHVlXCIsIFwidmFsdWVcIiwgXCJvbkZvY3VzXCIsIFwib25CbHVyXCIsIFwib25DaGFuZ2VcIiwgXCJhbGxvd0NsZWFyXCIsIFwibWF4TGVuZ3RoXCIsIFwib25Db21wb3NpdGlvblN0YXJ0XCIsIFwib25Db21wb3NpdGlvbkVuZFwiLCBcInN1ZmZpeFwiLCBcInByZWZpeENsc1wiLCBcInNob3dDb3VudFwiLCBcImNvdW50XCIsIFwiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJkaXNhYmxlZFwiLCBcImhpZGRlblwiLCBcImNsYXNzTmFtZXNcIiwgXCJzdHlsZXNcIiwgXCJvblJlc2l6ZVwiLCBcIm9uQ2xlYXJcIiwgXCJvblByZXNzRW50ZXJcIiwgXCJyZWFkT25seVwiLCBcImF1dG9TaXplXCIsIFwib25LZXlEb3duXCJdO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBCYXNlSW5wdXQgfSBmcm9tICdyYy1pbnB1dCc7XG5pbXBvcnQgdXNlQ291bnQgZnJvbSBcInJjLWlucHV0L2VzL2hvb2tzL3VzZUNvdW50XCI7XG5pbXBvcnQgeyByZXNvbHZlT25DaGFuZ2UgfSBmcm9tIFwicmMtaW5wdXQvZXMvdXRpbHMvY29tbW9uVXRpbHNcIjtcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlc2l6YWJsZVRleHRBcmVhIGZyb20gXCIuL1Jlc2l6YWJsZVRleHRBcmVhXCI7XG52YXIgVGV4dEFyZWEgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAoX3JlZiwgcmVmKSB7XG4gIHZhciBfY291bnRDb25maWckbWF4O1xuICB2YXIgZGVmYXVsdFZhbHVlID0gX3JlZi5kZWZhdWx0VmFsdWUsXG4gICAgY3VzdG9tVmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgIG9uRm9jdXMgPSBfcmVmLm9uRm9jdXMsXG4gICAgb25CbHVyID0gX3JlZi5vbkJsdXIsXG4gICAgb25DaGFuZ2UgPSBfcmVmLm9uQ2hhbmdlLFxuICAgIGFsbG93Q2xlYXIgPSBfcmVmLmFsbG93Q2xlYXIsXG4gICAgbWF4TGVuZ3RoID0gX3JlZi5tYXhMZW5ndGgsXG4gICAgb25Db21wb3NpdGlvblN0YXJ0ID0gX3JlZi5vbkNvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25Db21wb3NpdGlvbkVuZCA9IF9yZWYub25Db21wb3NpdGlvbkVuZCxcbiAgICBzdWZmaXggPSBfcmVmLnN1ZmZpeCxcbiAgICBfcmVmJHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9yZWYkcHJlZml4Q2xzID09PSB2b2lkIDAgPyAncmMtdGV4dGFyZWEnIDogX3JlZiRwcmVmaXhDbHMsXG4gICAgc2hvd0NvdW50ID0gX3JlZi5zaG93Q291bnQsXG4gICAgY291bnQgPSBfcmVmLmNvdW50LFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICBkaXNhYmxlZCA9IF9yZWYuZGlzYWJsZWQsXG4gICAgaGlkZGVuID0gX3JlZi5oaWRkZW4sXG4gICAgY2xhc3NOYW1lcyA9IF9yZWYuY2xhc3NOYW1lcyxcbiAgICBzdHlsZXMgPSBfcmVmLnN0eWxlcyxcbiAgICBvblJlc2l6ZSA9IF9yZWYub25SZXNpemUsXG4gICAgb25DbGVhciA9IF9yZWYub25DbGVhcixcbiAgICBvblByZXNzRW50ZXIgPSBfcmVmLm9uUHJlc3NFbnRlcixcbiAgICByZWFkT25seSA9IF9yZWYucmVhZE9ubHksXG4gICAgYXV0b1NpemUgPSBfcmVmLmF1dG9TaXplLFxuICAgIG9uS2V5RG93biA9IF9yZWYub25LZXlEb3duLFxuICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKGRlZmF1bHRWYWx1ZSwge1xuICAgICAgdmFsdWU6IGN1c3RvbVZhbHVlLFxuICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWVcbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICB2YWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMF0sXG4gICAgc2V0VmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuICB2YXIgZm9ybWF0VmFsdWUgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsID8gJycgOiBTdHJpbmcodmFsdWUpO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGZvY3VzZWQgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEZvY3VzZWQgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgY29tcG9zaXRpb25SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICB0ZXh0YXJlYVJlc2l6ZWQgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldFRleHRhcmVhUmVzaXplZCA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWYgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGhvbGRlclJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIHJlc2l6YWJsZVRleHRBcmVhUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgZ2V0VGV4dEFyZWEgPSBmdW5jdGlvbiBnZXRUZXh0QXJlYSgpIHtcbiAgICB2YXIgX3Jlc2l6YWJsZVRleHRBcmVhUmVmO1xuICAgIHJldHVybiAoX3Jlc2l6YWJsZVRleHRBcmVhUmVmID0gcmVzaXphYmxlVGV4dEFyZWFSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3Jlc2l6YWJsZVRleHRBcmVhUmVmID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcmVzaXphYmxlVGV4dEFyZWFSZWYudGV4dEFyZWE7XG4gIH07XG4gIHZhciBmb2N1cyA9IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgIGdldFRleHRBcmVhKCkuZm9jdXMoKTtcbiAgfTtcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2hvbGRlclJlZiRjdXJyZW50O1xuICAgIHJldHVybiB7XG4gICAgICByZXNpemFibGVUZXh0QXJlYTogcmVzaXphYmxlVGV4dEFyZWFSZWYuY3VycmVudCxcbiAgICAgIGZvY3VzOiBmb2N1cyxcbiAgICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICAgIGdldFRleHRBcmVhKCkuYmx1cigpO1xuICAgICAgfSxcbiAgICAgIG5hdGl2ZUVsZW1lbnQ6ICgoX2hvbGRlclJlZiRjdXJyZW50ID0gaG9sZGVyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9ob2xkZXJSZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2hvbGRlclJlZiRjdXJyZW50Lm5hdGl2ZUVsZW1lbnQpIHx8IGdldFRleHRBcmVhKClcbiAgICB9O1xuICB9KTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRGb2N1c2VkKGZ1bmN0aW9uIChwcmV2KSB7XG4gICAgICByZXR1cm4gIWRpc2FibGVkICYmIHByZXY7XG4gICAgfSk7XG4gIH0sIFtkaXNhYmxlZF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBTZWxlY3QgUmFuZ2UgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGU1ID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgX1JlYWN0JHVzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTUsIDIpLFxuICAgIHNlbGVjdGlvbiA9IF9SZWFjdCR1c2VTdGF0ZTZbMF0sXG4gICAgc2V0U2VsZWN0aW9uID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICB2YXIgX2dldFRleHRBcmVhO1xuICAgICAgKF9nZXRUZXh0QXJlYSA9IGdldFRleHRBcmVhKCkpLnNldFNlbGVjdGlvblJhbmdlLmFwcGx5KF9nZXRUZXh0QXJlYSwgX3RvQ29uc3VtYWJsZUFycmF5KHNlbGVjdGlvbikpO1xuICAgIH1cbiAgfSwgW3NlbGVjdGlvbl0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb3VudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBjb3VudENvbmZpZyA9IHVzZUNvdW50KGNvdW50LCBzaG93Q291bnQpO1xuICB2YXIgbWVyZ2VkTWF4ID0gKF9jb3VudENvbmZpZyRtYXggPSBjb3VudENvbmZpZy5tYXgpICE9PSBudWxsICYmIF9jb3VudENvbmZpZyRtYXggIT09IHZvaWQgMCA/IF9jb3VudENvbmZpZyRtYXggOiBtYXhMZW5ndGg7XG5cbiAgLy8gTWF4IGxlbmd0aCB2YWx1ZVxuICB2YXIgaGFzTWF4TGVuZ3RoID0gTnVtYmVyKG1lcmdlZE1heCkgPiAwO1xuICB2YXIgdmFsdWVMZW5ndGggPSBjb3VudENvbmZpZy5zdHJhdGVneShmb3JtYXRWYWx1ZSk7XG4gIHZhciBpc091dE9mUmFuZ2UgPSAhIW1lcmdlZE1heCAmJiB2YWx1ZUxlbmd0aCA+IG1lcmdlZE1heDtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ2hhbmdlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdHJpZ2dlckNoYW5nZSA9IGZ1bmN0aW9uIHRyaWdnZXJDaGFuZ2UoZSwgY3VycmVudFZhbHVlKSB7XG4gICAgdmFyIGN1dFZhbHVlID0gY3VycmVudFZhbHVlO1xuICAgIGlmICghY29tcG9zaXRpb25SZWYuY3VycmVudCAmJiBjb3VudENvbmZpZy5leGNlZWRGb3JtYXR0ZXIgJiYgY291bnRDb25maWcubWF4ICYmIGNvdW50Q29uZmlnLnN0cmF0ZWd5KGN1cnJlbnRWYWx1ZSkgPiBjb3VudENvbmZpZy5tYXgpIHtcbiAgICAgIGN1dFZhbHVlID0gY291bnRDb25maWcuZXhjZWVkRm9ybWF0dGVyKGN1cnJlbnRWYWx1ZSwge1xuICAgICAgICBtYXg6IGNvdW50Q29uZmlnLm1heFxuICAgICAgfSk7XG4gICAgICBpZiAoY3VycmVudFZhbHVlICE9PSBjdXRWYWx1ZSkge1xuICAgICAgICBzZXRTZWxlY3Rpb24oW2dldFRleHRBcmVhKCkuc2VsZWN0aW9uU3RhcnQgfHwgMCwgZ2V0VGV4dEFyZWEoKS5zZWxlY3Rpb25FbmQgfHwgMF0pO1xuICAgICAgfVxuICAgIH1cbiAgICBzZXRWYWx1ZShjdXRWYWx1ZSk7XG4gICAgcmVzb2x2ZU9uQ2hhbmdlKGUuY3VycmVudFRhcmdldCwgZSwgb25DaGFuZ2UsIGN1dFZhbHVlKTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gVmFsdWUgVXBkYXRlID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25JbnRlcm5hbENvbXBvc2l0aW9uU3RhcnQgPSBmdW5jdGlvbiBvbkludGVybmFsQ29tcG9zaXRpb25TdGFydChlKSB7XG4gICAgY29tcG9zaXRpb25SZWYuY3VycmVudCA9IHRydWU7XG4gICAgb25Db21wb3NpdGlvblN0YXJ0ID09PSBudWxsIHx8IG9uQ29tcG9zaXRpb25TdGFydCA9PT0gdm9pZCAwIHx8IG9uQ29tcG9zaXRpb25TdGFydChlKTtcbiAgfTtcbiAgdmFyIG9uSW50ZXJuYWxDb21wb3NpdGlvbkVuZCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDb21wb3NpdGlvbkVuZChlKSB7XG4gICAgY29tcG9zaXRpb25SZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIHRyaWdnZXJDaGFuZ2UoZSwgZS5jdXJyZW50VGFyZ2V0LnZhbHVlKTtcbiAgICBvbkNvbXBvc2l0aW9uRW5kID09PSBudWxsIHx8IG9uQ29tcG9zaXRpb25FbmQgPT09IHZvaWQgMCB8fCBvbkNvbXBvc2l0aW9uRW5kKGUpO1xuICB9O1xuICB2YXIgb25JbnRlcm5hbENoYW5nZSA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDaGFuZ2UoZSkge1xuICAgIHRyaWdnZXJDaGFuZ2UoZSwgZS50YXJnZXQudmFsdWUpO1xuICB9O1xuICB2YXIgaGFuZGxlS2V5RG93biA9IGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZSkge1xuICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiBvblByZXNzRW50ZXIpIHtcbiAgICAgIG9uUHJlc3NFbnRlcihlKTtcbiAgICB9XG4gICAgb25LZXlEb3duID09PSBudWxsIHx8IG9uS2V5RG93biA9PT0gdm9pZCAwIHx8IG9uS2V5RG93bihlKTtcbiAgfTtcbiAgdmFyIGhhbmRsZUZvY3VzID0gZnVuY3Rpb24gaGFuZGxlRm9jdXMoZSkge1xuICAgIHNldEZvY3VzZWQodHJ1ZSk7XG4gICAgb25Gb2N1cyA9PT0gbnVsbCB8fCBvbkZvY3VzID09PSB2b2lkIDAgfHwgb25Gb2N1cyhlKTtcbiAgfTtcbiAgdmFyIGhhbmRsZUJsdXIgPSBmdW5jdGlvbiBoYW5kbGVCbHVyKGUpIHtcbiAgICBzZXRGb2N1c2VkKGZhbHNlKTtcbiAgICBvbkJsdXIgPT09IG51bGwgfHwgb25CbHVyID09PSB2b2lkIDAgfHwgb25CbHVyKGUpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZXNldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBoYW5kbGVSZXNldCA9IGZ1bmN0aW9uIGhhbmRsZVJlc2V0KGUpIHtcbiAgICBzZXRWYWx1ZSgnJyk7XG4gICAgZm9jdXMoKTtcbiAgICByZXNvbHZlT25DaGFuZ2UoZ2V0VGV4dEFyZWEoKSwgZSwgb25DaGFuZ2UpO1xuICB9O1xuICB2YXIgc3VmZml4Tm9kZSA9IHN1ZmZpeDtcbiAgdmFyIGRhdGFDb3VudDtcbiAgaWYgKGNvdW50Q29uZmlnLnNob3cpIHtcbiAgICBpZiAoY291bnRDb25maWcuc2hvd0Zvcm1hdHRlcikge1xuICAgICAgZGF0YUNvdW50ID0gY291bnRDb25maWcuc2hvd0Zvcm1hdHRlcih7XG4gICAgICAgIHZhbHVlOiBmb3JtYXRWYWx1ZSxcbiAgICAgICAgY291bnQ6IHZhbHVlTGVuZ3RoLFxuICAgICAgICBtYXhMZW5ndGg6IG1lcmdlZE1heFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGFDb3VudCA9IFwiXCIuY29uY2F0KHZhbHVlTGVuZ3RoKS5jb25jYXQoaGFzTWF4TGVuZ3RoID8gXCIgLyBcIi5jb25jYXQobWVyZ2VkTWF4KSA6ICcnKTtcbiAgICB9XG4gICAgc3VmZml4Tm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBzdWZmaXhOb2RlLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGF0YS1jb3VudFwiKSwgY2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBjbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbGFzc05hbWVzLmNvdW50KSxcbiAgICAgIHN0eWxlOiBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMuY291bnRcbiAgICB9LCBkYXRhQ291bnQpKTtcbiAgfVxuICB2YXIgaGFuZGxlUmVzaXplID0gZnVuY3Rpb24gaGFuZGxlUmVzaXplKHNpemUpIHtcbiAgICB2YXIgX2dldFRleHRBcmVhMjtcbiAgICBvblJlc2l6ZSA9PT0gbnVsbCB8fCBvblJlc2l6ZSA9PT0gdm9pZCAwIHx8IG9uUmVzaXplKHNpemUpO1xuICAgIGlmICgoX2dldFRleHRBcmVhMiA9IGdldFRleHRBcmVhKCkpICE9PSBudWxsICYmIF9nZXRUZXh0QXJlYTIgIT09IHZvaWQgMCAmJiBfZ2V0VGV4dEFyZWEyLnN0eWxlLmhlaWdodCkge1xuICAgICAgc2V0VGV4dGFyZWFSZXNpemVkKHRydWUpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGlzUHVyZVRleHRBcmVhID0gIWF1dG9TaXplICYmICFzaG93Q291bnQgJiYgIWFsbG93Q2xlYXI7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCYXNlSW5wdXQsIHtcbiAgICByZWY6IGhvbGRlclJlZixcbiAgICB2YWx1ZTogZm9ybWF0VmFsdWUsXG4gICAgYWxsb3dDbGVhcjogYWxsb3dDbGVhcixcbiAgICBoYW5kbGVSZXNldDogaGFuZGxlUmVzZXQsXG4gICAgc3VmZml4OiBzdWZmaXhOb2RlLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZXM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY2xhc3NOYW1lcyksIHt9LCB7XG4gICAgICBhZmZpeFdyYXBwZXI6IGNsc3goY2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBjbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbGFzc05hbWVzLmFmZml4V3JhcHBlciwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zaG93LWNvdW50XCIpLCBzaG93Q291bnQpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRleHRhcmVhLWFsbG93LWNsZWFyXCIpLCBhbGxvd0NsZWFyKSlcbiAgICB9KSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgZm9jdXNlZDogZm9jdXNlZCxcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3NOYW1lLCBpc091dE9mUmFuZ2UgJiYgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vdXQtb2YtcmFuZ2VcIikpLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwgdGV4dGFyZWFSZXNpemVkICYmICFpc1B1cmVUZXh0QXJlYSA/IHtcbiAgICAgIGhlaWdodDogJ2F1dG8nXG4gICAgfSA6IHt9KSxcbiAgICBkYXRhQXR0cnM6IHtcbiAgICAgIGFmZml4V3JhcHBlcjoge1xuICAgICAgICAnZGF0YS1jb3VudCc6IHR5cGVvZiBkYXRhQ291bnQgPT09ICdzdHJpbmcnID8gZGF0YUNvdW50IDogdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcbiAgICBoaWRkZW46IGhpZGRlbixcbiAgICByZWFkT25seTogcmVhZE9ubHksXG4gICAgb25DbGVhcjogb25DbGVhclxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemFibGVUZXh0QXJlYSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBhdXRvU2l6ZTogYXV0b1NpemUsXG4gICAgbWF4TGVuZ3RoOiBtYXhMZW5ndGgsXG4gICAgb25LZXlEb3duOiBoYW5kbGVLZXlEb3duLFxuICAgIG9uQ2hhbmdlOiBvbkludGVybmFsQ2hhbmdlLFxuICAgIG9uRm9jdXM6IGhhbmRsZUZvY3VzLFxuICAgIG9uQmx1cjogaGFuZGxlQmx1cixcbiAgICBvbkNvbXBvc2l0aW9uU3RhcnQ6IG9uSW50ZXJuYWxDb21wb3NpdGlvblN0YXJ0LFxuICAgIG9uQ29tcG9zaXRpb25FbmQ6IG9uSW50ZXJuYWxDb21wb3NpdGlvbkVuZCxcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBjbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbGFzc05hbWVzLnRleHRhcmVhKSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMudGV4dGFyZWEpLCB7fSwge1xuICAgICAgcmVzaXplOiBzdHlsZSA9PT0gbnVsbCB8fCBzdHlsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGUucmVzaXplXG4gICAgfSksXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG9uUmVzaXplOiBoYW5kbGVSZXNpemUsXG4gICAgcmVmOiByZXNpemFibGVUZXh0QXJlYVJlZixcbiAgICByZWFkT25seTogcmVhZE9ubHlcbiAgfSkpKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgVGV4dEFyZWE7IiwiLy8gVGhhbmtzIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyZXlwb3BwL3JlYWN0LXRleHRhcmVhLWF1dG9zaXplL1xuXG4vKipcbiAqIGNhbGN1bGF0ZU5vZGVIZWlnaHQodWlUZXh0Tm9kZSwgdXNlQ2FjaGUgPSBmYWxzZSlcbiAqL1xuXG52YXIgSElEREVOX1RFWFRBUkVBX1NUWUxFID0gXCJcXG4gIG1pbi1oZWlnaHQ6MCAhaW1wb3J0YW50O1xcbiAgbWF4LWhlaWdodDpub25lICFpbXBvcnRhbnQ7XFxuICBoZWlnaHQ6MCAhaW1wb3J0YW50O1xcbiAgdmlzaWJpbGl0eTpoaWRkZW4gIWltcG9ydGFudDtcXG4gIG92ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50O1xcbiAgcG9zaXRpb246YWJzb2x1dGUgIWltcG9ydGFudDtcXG4gIHotaW5kZXg6LTEwMDAgIWltcG9ydGFudDtcXG4gIHRvcDowICFpbXBvcnRhbnQ7XFxuICByaWdodDowICFpbXBvcnRhbnQ7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZSAhaW1wb3J0YW50O1xcblwiO1xudmFyIFNJWklOR19TVFlMRSA9IFsnbGV0dGVyLXNwYWNpbmcnLCAnbGluZS1oZWlnaHQnLCAncGFkZGluZy10b3AnLCAncGFkZGluZy1ib3R0b20nLCAnZm9udC1mYW1pbHknLCAnZm9udC13ZWlnaHQnLCAnZm9udC1zaXplJywgJ2ZvbnQtdmFyaWFudCcsICd0ZXh0LXJlbmRlcmluZycsICd0ZXh0LXRyYW5zZm9ybScsICd3aWR0aCcsICd0ZXh0LWluZGVudCcsICdwYWRkaW5nLWxlZnQnLCAncGFkZGluZy1yaWdodCcsICdib3JkZXItd2lkdGgnLCAnYm94LXNpemluZycsICd3b3JkLWJyZWFrJywgJ3doaXRlLXNwYWNlJ107XG52YXIgY29tcHV0ZWRTdHlsZUNhY2hlID0ge307XG52YXIgaGlkZGVuVGV4dGFyZWE7XG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlTm9kZVN0eWxpbmcobm9kZSkge1xuICB2YXIgdXNlQ2FjaGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICB2YXIgbm9kZVJlZiA9IG5vZGUuZ2V0QXR0cmlidXRlKCdpZCcpIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlYWN0aWQnKSB8fCBub2RlLmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuICBpZiAodXNlQ2FjaGUgJiYgY29tcHV0ZWRTdHlsZUNhY2hlW25vZGVSZWZdKSB7XG4gICAgcmV0dXJuIGNvbXB1dGVkU3R5bGVDYWNoZVtub2RlUmVmXTtcbiAgfVxuICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgdmFyIGJveFNpemluZyA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JveC1zaXppbmcnKSB8fCBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctbW96LWJveC1zaXppbmcnKSB8fCBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctd2Via2l0LWJveC1zaXppbmcnKTtcbiAgdmFyIHBhZGRpbmdTaXplID0gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLWJvdHRvbScpKSArIHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy10b3AnKSk7XG4gIHZhciBib3JkZXJTaXplID0gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXItYm90dG9tLXdpZHRoJykpICsgcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXItdG9wLXdpZHRoJykpO1xuICB2YXIgc2l6aW5nU3R5bGUgPSBTSVpJTkdfU1RZTEUubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KG5hbWUsIFwiOlwiKS5jb25jYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSk7XG4gIH0pLmpvaW4oJzsnKTtcbiAgdmFyIG5vZGVJbmZvID0ge1xuICAgIHNpemluZ1N0eWxlOiBzaXppbmdTdHlsZSxcbiAgICBwYWRkaW5nU2l6ZTogcGFkZGluZ1NpemUsXG4gICAgYm9yZGVyU2l6ZTogYm9yZGVyU2l6ZSxcbiAgICBib3hTaXppbmc6IGJveFNpemluZ1xuICB9O1xuICBpZiAodXNlQ2FjaGUgJiYgbm9kZVJlZikge1xuICAgIGNvbXB1dGVkU3R5bGVDYWNoZVtub2RlUmVmXSA9IG5vZGVJbmZvO1xuICB9XG4gIHJldHVybiBub2RlSW5mbztcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNhbGN1bGF0ZUF1dG9TaXplU3R5bGUodWlUZXh0Tm9kZSkge1xuICB2YXIgdXNlQ2FjaGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICB2YXIgbWluUm93cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgdmFyIG1heFJvd3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gIGlmICghaGlkZGVuVGV4dGFyZWEpIHtcbiAgICBoaWRkZW5UZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgaGlkZGVuVGV4dGFyZWEuc2V0QXR0cmlidXRlKCd0YWItaW5kZXgnLCAnLTEnKTtcbiAgICBoaWRkZW5UZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAvLyBmaXg6IEEgZm9ybSBmaWVsZCBlbGVtZW50IHNob3VsZCBoYXZlIGFuIGlkIG9yIG5hbWUgYXR0cmlidXRlXG4gICAgLy8gQSBmb3JtIGZpZWxkIGVsZW1lbnQgaGFzIG5laXRoZXIgYW4gaWQgbm9yIGEgbmFtZSBhdHRyaWJ1dGUuIFRoaXMgbWlnaHQgcHJldmVudCB0aGUgYnJvd3NlciBmcm9tIGNvcnJlY3RseSBhdXRvZmlsbGluZyB0aGUgZm9ybS5cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvdGV4dGFyZWFcbiAgICBoaWRkZW5UZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnaGlkZGVuVGV4dGFyZWEnKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhpZGRlblRleHRhcmVhKTtcbiAgfVxuXG4gIC8vIEZpeCB3cmFwPVwib2ZmXCIgaXNzdWVcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNjU3N1xuICBpZiAodWlUZXh0Tm9kZS5nZXRBdHRyaWJ1dGUoJ3dyYXAnKSkge1xuICAgIGhpZGRlblRleHRhcmVhLnNldEF0dHJpYnV0ZSgnd3JhcCcsIHVpVGV4dE5vZGUuZ2V0QXR0cmlidXRlKCd3cmFwJykpO1xuICB9IGVsc2Uge1xuICAgIGhpZGRlblRleHRhcmVhLnJlbW92ZUF0dHJpYnV0ZSgnd3JhcCcpO1xuICB9XG5cbiAgLy8gQ29weSBhbGwgQ1NTIHByb3BlcnRpZXMgdGhhdCBoYXZlIGFuIGltcGFjdCBvbiB0aGUgaGVpZ2h0IG9mIHRoZSBjb250ZW50IGluXG4gIC8vIHRoZSB0ZXh0Ym94XG4gIHZhciBfY2FsY3VsYXRlTm9kZVN0eWxpbmcgPSBjYWxjdWxhdGVOb2RlU3R5bGluZyh1aVRleHROb2RlLCB1c2VDYWNoZSksXG4gICAgcGFkZGluZ1NpemUgPSBfY2FsY3VsYXRlTm9kZVN0eWxpbmcucGFkZGluZ1NpemUsXG4gICAgYm9yZGVyU2l6ZSA9IF9jYWxjdWxhdGVOb2RlU3R5bGluZy5ib3JkZXJTaXplLFxuICAgIGJveFNpemluZyA9IF9jYWxjdWxhdGVOb2RlU3R5bGluZy5ib3hTaXppbmcsXG4gICAgc2l6aW5nU3R5bGUgPSBfY2FsY3VsYXRlTm9kZVN0eWxpbmcuc2l6aW5nU3R5bGU7XG5cbiAgLy8gTmVlZCB0byBoYXZlIHRoZSBvdmVyZmxvdyBhdHRyaWJ1dGUgdG8gaGlkZSB0aGUgc2Nyb2xsYmFyIG90aGVyd2lzZVxuICAvLyB0ZXh0LWxpbmVzIHdpbGwgbm90IGNhbGN1bGF0ZWQgcHJvcGVybHkgYXMgdGhlIHNoYWRvdyB3aWxsIHRlY2huaWNhbGx5IGJlXG4gIC8vIG5hcnJvd2VyIGZvciBjb250ZW50XG4gIGhpZGRlblRleHRhcmVhLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBcIlwiLmNvbmNhdChzaXppbmdTdHlsZSwgXCI7XCIpLmNvbmNhdChISURERU5fVEVYVEFSRUFfU1RZTEUpKTtcbiAgaGlkZGVuVGV4dGFyZWEudmFsdWUgPSB1aVRleHROb2RlLnZhbHVlIHx8IHVpVGV4dE5vZGUucGxhY2Vob2xkZXIgfHwgJyc7XG4gIHZhciBtaW5IZWlnaHQgPSB1bmRlZmluZWQ7XG4gIHZhciBtYXhIZWlnaHQgPSB1bmRlZmluZWQ7XG4gIHZhciBvdmVyZmxvd1k7XG4gIHZhciBoZWlnaHQgPSBoaWRkZW5UZXh0YXJlYS5zY3JvbGxIZWlnaHQ7XG4gIGlmIChib3hTaXppbmcgPT09ICdib3JkZXItYm94Jykge1xuICAgIC8vIGJvcmRlci1ib3g6IGFkZCBib3JkZXIsIHNpbmNlIGhlaWdodCA9IGNvbnRlbnQgKyBwYWRkaW5nICsgYm9yZGVyXG4gICAgaGVpZ2h0ICs9IGJvcmRlclNpemU7XG4gIH0gZWxzZSBpZiAoYm94U2l6aW5nID09PSAnY29udGVudC1ib3gnKSB7XG4gICAgLy8gcmVtb3ZlIHBhZGRpbmcsIHNpbmNlIGhlaWdodCA9IGNvbnRlbnRcbiAgICBoZWlnaHQgLT0gcGFkZGluZ1NpemU7XG4gIH1cbiAgaWYgKG1pblJvd3MgIT09IG51bGwgfHwgbWF4Um93cyAhPT0gbnVsbCkge1xuICAgIC8vIG1lYXN1cmUgaGVpZ2h0IG9mIGEgdGV4dGFyZWEgd2l0aCBhIHNpbmdsZSByb3dcbiAgICBoaWRkZW5UZXh0YXJlYS52YWx1ZSA9ICcgJztcbiAgICB2YXIgc2luZ2xlUm93SGVpZ2h0ID0gaGlkZGVuVGV4dGFyZWEuc2Nyb2xsSGVpZ2h0IC0gcGFkZGluZ1NpemU7XG4gICAgaWYgKG1pblJvd3MgIT09IG51bGwpIHtcbiAgICAgIG1pbkhlaWdodCA9IHNpbmdsZVJvd0hlaWdodCAqIG1pblJvd3M7XG4gICAgICBpZiAoYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcpIHtcbiAgICAgICAgbWluSGVpZ2h0ID0gbWluSGVpZ2h0ICsgcGFkZGluZ1NpemUgKyBib3JkZXJTaXplO1xuICAgICAgfVxuICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgobWluSGVpZ2h0LCBoZWlnaHQpO1xuICAgIH1cbiAgICBpZiAobWF4Um93cyAhPT0gbnVsbCkge1xuICAgICAgbWF4SGVpZ2h0ID0gc2luZ2xlUm93SGVpZ2h0ICogbWF4Um93cztcbiAgICAgIGlmIChib3hTaXppbmcgPT09ICdib3JkZXItYm94Jykge1xuICAgICAgICBtYXhIZWlnaHQgPSBtYXhIZWlnaHQgKyBwYWRkaW5nU2l6ZSArIGJvcmRlclNpemU7XG4gICAgICB9XG4gICAgICBvdmVyZmxvd1kgPSBoZWlnaHQgPiBtYXhIZWlnaHQgPyAnJyA6ICdoaWRkZW4nO1xuICAgICAgaGVpZ2h0ID0gTWF0aC5taW4obWF4SGVpZ2h0LCBoZWlnaHQpO1xuICAgIH1cbiAgfVxuICB2YXIgc3R5bGUgPSB7XG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgb3ZlcmZsb3dZOiBvdmVyZmxvd1ksXG4gICAgcmVzaXplOiAnbm9uZSdcbiAgfTtcbiAgaWYgKG1pbkhlaWdodCkge1xuICAgIHN0eWxlLm1pbkhlaWdodCA9IG1pbkhlaWdodDtcbiAgfVxuICBpZiAobWF4SGVpZ2h0KSB7XG4gICAgc3R5bGUubWF4SGVpZ2h0ID0gbWF4SGVpZ2h0O1xuICB9XG4gIHJldHVybiBzdHlsZTtcbn0iLCJpbXBvcnQgVGV4dEFyZWEgZnJvbSBcIi4vVGV4dEFyZWFcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUmVzaXphYmxlVGV4dEFyZWEgfSBmcm9tIFwiLi9SZXNpemFibGVUZXh0QXJlYVwiO1xuZXhwb3J0IGRlZmF1bHQgVGV4dEFyZWE7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBQb3B1cChwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgaWQgPSBwcm9wcy5pZCxcbiAgICBpbm5lclN0eWxlID0gcHJvcHMub3ZlcmxheUlubmVyU3R5bGUsXG4gICAgYm9keUNsYXNzTmFtZSA9IHByb3BzLmJvZHlDbGFzc05hbWUsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGU7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudFwiKSwgY2xhc3NOYW1lKSxcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlubmVyXCIpLCBib2R5Q2xhc3NOYW1lKSxcbiAgICBpZDogaWQsXG4gICAgcm9sZTogXCJ0b29sdGlwXCIsXG4gICAgc3R5bGU6IGlubmVyU3R5bGVcbiAgfSwgdHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nID8gY2hpbGRyZW4oKSA6IGNoaWxkcmVuKSk7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJvdmVybGF5Q2xhc3NOYW1lXCIsIFwidHJpZ2dlclwiLCBcIm1vdXNlRW50ZXJEZWxheVwiLCBcIm1vdXNlTGVhdmVEZWxheVwiLCBcIm92ZXJsYXlTdHlsZVwiLCBcInByZWZpeENsc1wiLCBcImNoaWxkcmVuXCIsIFwib25WaXNpYmxlQ2hhbmdlXCIsIFwiYWZ0ZXJWaXNpYmxlQ2hhbmdlXCIsIFwidHJhbnNpdGlvbk5hbWVcIiwgXCJhbmltYXRpb25cIiwgXCJtb3Rpb25cIiwgXCJwbGFjZW1lbnRcIiwgXCJhbGlnblwiLCBcImRlc3Ryb3lUb29sdGlwT25IaWRlXCIsIFwiZGVmYXVsdFZpc2libGVcIiwgXCJnZXRUb29sdGlwQ29udGFpbmVyXCIsIFwib3ZlcmxheUlubmVyU3R5bGVcIiwgXCJhcnJvd0NvbnRlbnRcIiwgXCJvdmVybGF5XCIsIFwiaWRcIiwgXCJzaG93QXJyb3dcIiwgXCJjbGFzc05hbWVzXCIsIFwic3R5bGVzXCJdO1xuaW1wb3J0IFRyaWdnZXIgZnJvbSAnQHJjLWNvbXBvbmVudC90cmlnZ2VyJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZm9yd2FyZFJlZiwgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcGxhY2VtZW50cyB9IGZyb20gXCIuL3BsYWNlbWVudHNcIjtcbmltcG9ydCBQb3B1cCBmcm9tIFwiLi9Qb3B1cFwiO1xuaW1wb3J0IHVzZUlkIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUlkXCI7XG52YXIgVG9vbHRpcCA9IGZ1bmN0aW9uIFRvb2x0aXAocHJvcHMsIHJlZikge1xuICB2YXIgb3ZlcmxheUNsYXNzTmFtZSA9IHByb3BzLm92ZXJsYXlDbGFzc05hbWUsXG4gICAgX3Byb3BzJHRyaWdnZXIgPSBwcm9wcy50cmlnZ2VyLFxuICAgIHRyaWdnZXIgPSBfcHJvcHMkdHJpZ2dlciA9PT0gdm9pZCAwID8gWydob3ZlciddIDogX3Byb3BzJHRyaWdnZXIsXG4gICAgX3Byb3BzJG1vdXNlRW50ZXJEZWxhID0gcHJvcHMubW91c2VFbnRlckRlbGF5LFxuICAgIG1vdXNlRW50ZXJEZWxheSA9IF9wcm9wcyRtb3VzZUVudGVyRGVsYSA9PT0gdm9pZCAwID8gMCA6IF9wcm9wcyRtb3VzZUVudGVyRGVsYSxcbiAgICBfcHJvcHMkbW91c2VMZWF2ZURlbGEgPSBwcm9wcy5tb3VzZUxlYXZlRGVsYXksXG4gICAgbW91c2VMZWF2ZURlbGF5ID0gX3Byb3BzJG1vdXNlTGVhdmVEZWxhID09PSB2b2lkIDAgPyAwLjEgOiBfcHJvcHMkbW91c2VMZWF2ZURlbGEsXG4gICAgb3ZlcmxheVN0eWxlID0gcHJvcHMub3ZlcmxheVN0eWxlLFxuICAgIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXRvb2x0aXAnIDogX3Byb3BzJHByZWZpeENscyxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIG9uVmlzaWJsZUNoYW5nZSA9IHByb3BzLm9uVmlzaWJsZUNoYW5nZSxcbiAgICBhZnRlclZpc2libGVDaGFuZ2UgPSBwcm9wcy5hZnRlclZpc2libGVDaGFuZ2UsXG4gICAgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZSxcbiAgICBhbmltYXRpb24gPSBwcm9wcy5hbmltYXRpb24sXG4gICAgbW90aW9uID0gcHJvcHMubW90aW9uLFxuICAgIF9wcm9wcyRwbGFjZW1lbnQgPSBwcm9wcy5wbGFjZW1lbnQsXG4gICAgcGxhY2VtZW50ID0gX3Byb3BzJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gJ3JpZ2h0JyA6IF9wcm9wcyRwbGFjZW1lbnQsXG4gICAgX3Byb3BzJGFsaWduID0gcHJvcHMuYWxpZ24sXG4gICAgYWxpZ24gPSBfcHJvcHMkYWxpZ24gPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJGFsaWduLFxuICAgIF9wcm9wcyRkZXN0cm95VG9vbHRpcCA9IHByb3BzLmRlc3Ryb3lUb29sdGlwT25IaWRlLFxuICAgIGRlc3Ryb3lUb29sdGlwT25IaWRlID0gX3Byb3BzJGRlc3Ryb3lUb29sdGlwID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkZXN0cm95VG9vbHRpcCxcbiAgICBkZWZhdWx0VmlzaWJsZSA9IHByb3BzLmRlZmF1bHRWaXNpYmxlLFxuICAgIGdldFRvb2x0aXBDb250YWluZXIgPSBwcm9wcy5nZXRUb29sdGlwQ29udGFpbmVyLFxuICAgIG92ZXJsYXlJbm5lclN0eWxlID0gcHJvcHMub3ZlcmxheUlubmVyU3R5bGUsXG4gICAgYXJyb3dDb250ZW50ID0gcHJvcHMuYXJyb3dDb250ZW50LFxuICAgIG92ZXJsYXkgPSBwcm9wcy5vdmVybGF5LFxuICAgIGlkID0gcHJvcHMuaWQsXG4gICAgX3Byb3BzJHNob3dBcnJvdyA9IHByb3BzLnNob3dBcnJvdyxcbiAgICBzaG93QXJyb3cgPSBfcHJvcHMkc2hvd0Fycm93ID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJHNob3dBcnJvdyxcbiAgICB0b29sdGlwQ2xhc3NOYW1lcyA9IHByb3BzLmNsYXNzTmFtZXMsXG4gICAgdG9vbHRpcFN0eWxlcyA9IHByb3BzLnN0eWxlcyxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBtZXJnZWRJZCA9IHVzZUlkKGlkKTtcbiAgdmFyIHRyaWdnZXJSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRyaWdnZXJSZWYuY3VycmVudDtcbiAgfSk7XG4gIHZhciBleHRyYVByb3BzID0gX29iamVjdFNwcmVhZCh7fSwgcmVzdFByb3BzKTtcbiAgaWYgKCd2aXNpYmxlJyBpbiBwcm9wcykge1xuICAgIGV4dHJhUHJvcHMucG9wdXBWaXNpYmxlID0gcHJvcHMudmlzaWJsZTtcbiAgfVxuICB2YXIgZ2V0UG9wdXBFbGVtZW50ID0gZnVuY3Rpb24gZ2V0UG9wdXBFbGVtZW50KCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb3B1cCwge1xuICAgICAga2V5OiBcImNvbnRlbnRcIixcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgaWQ6IG1lcmdlZElkLFxuICAgICAgYm9keUNsYXNzTmFtZTogdG9vbHRpcENsYXNzTmFtZXMgPT09IG51bGwgfHwgdG9vbHRpcENsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvb2x0aXBDbGFzc05hbWVzLmJvZHksXG4gICAgICBvdmVybGF5SW5uZXJTdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvdmVybGF5SW5uZXJTdHlsZSksIHRvb2x0aXBTdHlsZXMgPT09IG51bGwgfHwgdG9vbHRpcFN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9vbHRpcFN0eWxlcy5ib2R5KVxuICAgIH0sIG92ZXJsYXkpO1xuICB9O1xuICB2YXIgZ2V0Q2hpbGRyZW4gPSBmdW5jdGlvbiBnZXRDaGlsZHJlbigpIHtcbiAgICB2YXIgY2hpbGQgPSBSZWFjdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKTtcbiAgICB2YXIgb3JpZ2luYWxQcm9wcyA9IChjaGlsZCA9PT0gbnVsbCB8fCBjaGlsZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hpbGQucHJvcHMpIHx8IHt9O1xuICAgIHZhciBjaGlsZFByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvcmlnaW5hbFByb3BzKSwge30sIHtcbiAgICAgICdhcmlhLWRlc2NyaWJlZGJ5Jzogb3ZlcmxheSA/IG1lcmdlZElkIDogbnVsbFxuICAgIH0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCBjaGlsZFByb3BzKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyaWdnZXIsIF9leHRlbmRzKHtcbiAgICBwb3B1cENsYXNzTmFtZTogY2xhc3NOYW1lcyhvdmVybGF5Q2xhc3NOYW1lLCB0b29sdGlwQ2xhc3NOYW1lcyA9PT0gbnVsbCB8fCB0b29sdGlwQ2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9vbHRpcENsYXNzTmFtZXMucm9vdCksXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcG9wdXA6IGdldFBvcHVwRWxlbWVudCxcbiAgICBhY3Rpb246IHRyaWdnZXIsXG4gICAgYnVpbHRpblBsYWNlbWVudHM6IHBsYWNlbWVudHMsXG4gICAgcG9wdXBQbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICByZWY6IHRyaWdnZXJSZWYsXG4gICAgcG9wdXBBbGlnbjogYWxpZ24sXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFRvb2x0aXBDb250YWluZXIsXG4gICAgb25Qb3B1cFZpc2libGVDaGFuZ2U6IG9uVmlzaWJsZUNoYW5nZSxcbiAgICBhZnRlclBvcHVwVmlzaWJsZUNoYW5nZTogYWZ0ZXJWaXNpYmxlQ2hhbmdlLFxuICAgIHBvcHVwVHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgIHBvcHVwQW5pbWF0aW9uOiBhbmltYXRpb24sXG4gICAgcG9wdXBNb3Rpb246IG1vdGlvbixcbiAgICBkZWZhdWx0UG9wdXBWaXNpYmxlOiBkZWZhdWx0VmlzaWJsZSxcbiAgICBhdXRvRGVzdHJveTogZGVzdHJveVRvb2x0aXBPbkhpZGUsXG4gICAgbW91c2VMZWF2ZURlbGF5OiBtb3VzZUxlYXZlRGVsYXksXG4gICAgcG9wdXBTdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvdmVybGF5U3R5bGUpLCB0b29sdGlwU3R5bGVzID09PSBudWxsIHx8IHRvb2x0aXBTdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvb2x0aXBTdHlsZXMucm9vdCksXG4gICAgbW91c2VFbnRlckRlbGF5OiBtb3VzZUVudGVyRGVsYXksXG4gICAgYXJyb3c6IHNob3dBcnJvd1xuICB9LCBleHRyYVByb3BzKSwgZ2V0Q2hpbGRyZW4oKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL2ZvcndhcmRSZWYoVG9vbHRpcCk7IiwiaW1wb3J0IFBvcHVwIGZyb20gXCIuL1BvcHVwXCI7XG5pbXBvcnQgVG9vbHRpcCBmcm9tIFwiLi9Ub29sdGlwXCI7XG5leHBvcnQgeyBQb3B1cCB9O1xuZXhwb3J0IGRlZmF1bHQgVG9vbHRpcDsiLCJ2YXIgYXV0b0FkanVzdE92ZXJmbG93VG9wQm90dG9tID0ge1xuICBzaGlmdFg6IDY0LFxuICBhZGp1c3RZOiAxXG59O1xudmFyIGF1dG9BZGp1c3RPdmVyZmxvd0xlZnRSaWdodCA9IHtcbiAgYWRqdXN0WDogMSxcbiAgc2hpZnRZOiB0cnVlXG59O1xudmFyIHRhcmdldE9mZnNldCA9IFswLCAwXTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50cyA9IHtcbiAgbGVmdDoge1xuICAgIHBvaW50czogWydjcicsICdjbCddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3dMZWZ0UmlnaHQsXG4gICAgb2Zmc2V0OiBbLTQsIDBdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ2NsJywgJ2NyJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvd0xlZnRSaWdodCxcbiAgICBvZmZzZXQ6IFs0LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICB0b3A6IHtcbiAgICBwb2ludHM6IFsnYmMnLCAndGMnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93VG9wQm90dG9tLFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b206IHtcbiAgICBwb2ludHM6IFsndGMnLCAnYmMnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93VG9wQm90dG9tLFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHRvcExlZnQ6IHtcbiAgICBwb2ludHM6IFsnYmwnLCAndGwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93VG9wQm90dG9tLFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBsZWZ0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ3RsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvd0xlZnRSaWdodCxcbiAgICBvZmZzZXQ6IFstNCwgMF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgdG9wUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnYnInLCAndHInXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93VG9wQm90dG9tLFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICByaWdodFRvcDoge1xuICAgIHBvaW50czogWyd0bCcsICd0ciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3dMZWZ0UmlnaHQsXG4gICAgb2Zmc2V0OiBbNCwgMF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgYm90dG9tUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsndHInLCAnYnInXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93VG9wQm90dG9tLFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHJpZ2h0Qm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ2JsJywgJ2JyJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvd0xlZnRSaWdodCxcbiAgICBvZmZzZXQ6IFs0LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b21MZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ2JsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvd1RvcEJvdHRvbSxcbiAgICBvZmZzZXQ6IFswLCA0XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBsZWZ0Qm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ2JyJywgJ2JsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvd0xlZnRSaWdodCxcbiAgICBvZmZzZXQ6IFstNCwgMF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHBsYWNlbWVudHM7IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBEcm9wSW5kaWNhdG9yID0gZnVuY3Rpb24gRHJvcEluZGljYXRvcihwcm9wcykge1xuICB2YXIgZHJvcFBvc2l0aW9uID0gcHJvcHMuZHJvcFBvc2l0aW9uLFxuICAgIGRyb3BMZXZlbE9mZnNldCA9IHByb3BzLmRyb3BMZXZlbE9mZnNldCxcbiAgICBpbmRlbnQgPSBwcm9wcy5pbmRlbnQ7XG4gIHZhciBzdHlsZSA9IHtcbiAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgcmlnaHQ6IDAsXG4gICAgYmFja2dyb3VuZENvbG9yOiAncmVkJyxcbiAgICBoZWlnaHQ6IDJcbiAgfTtcbiAgc3dpdGNoIChkcm9wUG9zaXRpb24pIHtcbiAgICBjYXNlIC0xOlxuICAgICAgc3R5bGUudG9wID0gMDtcbiAgICAgIHN0eWxlLmxlZnQgPSAtZHJvcExldmVsT2Zmc2V0ICogaW5kZW50O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3R5bGUuYm90dG9tID0gMDtcbiAgICAgIHN0eWxlLmxlZnQgPSAtZHJvcExldmVsT2Zmc2V0ICogaW5kZW50O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAwOlxuICAgICAgc3R5bGUuYm90dG9tID0gMDtcbiAgICAgIHN0eWxlLmxlZnQgPSBpbmRlbnQ7XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHN0eWxlOiBzdHlsZVxuICB9KTtcbn07XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBEcm9wSW5kaWNhdG9yLmRpc3BsYXlOYW1lID0gJ0Ryb3BJbmRpY2F0b3InO1xufVxuZXhwb3J0IGRlZmF1bHQgRHJvcEluZGljYXRvcjsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgSW5kZW50ID0gZnVuY3Rpb24gSW5kZW50KF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIGxldmVsID0gX3JlZi5sZXZlbCxcbiAgICBpc1N0YXJ0ID0gX3JlZi5pc1N0YXJ0LFxuICAgIGlzRW5kID0gX3JlZi5pc0VuZDtcbiAgdmFyIGJhc2VDbGFzc05hbWUgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWluZGVudC11bml0XCIpO1xuICB2YXIgbGlzdCA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxldmVsOyBpICs9IDEpIHtcbiAgICBsaXN0LnB1c2goIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBrZXk6IGksXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoYmFzZUNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoYmFzZUNsYXNzTmFtZSwgXCItc3RhcnRcIiksIGlzU3RhcnRbaV0pLCBcIlwiLmNvbmNhdChiYXNlQ2xhc3NOYW1lLCBcIi1lbmRcIiksIGlzRW5kW2ldKSlcbiAgICB9KSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5kZW50XCIpXG4gIH0sIGxpc3QpO1xufTtcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5tZW1vKEluZGVudCk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdERlc3RydWN0dXJpbmdFbXB0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0RGVzdHJ1Y3R1cmluZ0VtcHR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJtb3Rpb25cIiwgXCJtb3Rpb25Ob2Rlc1wiLCBcIm1vdGlvblR5cGVcIiwgXCJvbk1vdGlvblN0YXJ0XCIsIFwib25Nb3Rpb25FbmRcIiwgXCJhY3RpdmVcIiwgXCJ0cmVlTm9kZVJlcXVpcmVkUHJvcHNcIl07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDU1NNb3Rpb24gZnJvbSAncmMtbW90aW9uJztcbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBUcmVlQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRUeXBlc1wiO1xuaW1wb3J0IFRyZWVOb2RlIGZyb20gXCIuL1RyZWVOb2RlXCI7XG5pbXBvcnQgdXNlVW5tb3VudCBmcm9tIFwiLi91c2VVbm1vdW50XCI7XG5pbXBvcnQgeyBnZXRUcmVlTm9kZVByb3BzIH0gZnJvbSBcIi4vdXRpbHMvdHJlZVV0aWxcIjtcbnZhciBNb3Rpb25UcmVlTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChvcmlQcm9wcywgcmVmKSB7XG4gIHZhciBjbGFzc05hbWUgPSBvcmlQcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBvcmlQcm9wcy5zdHlsZSxcbiAgICBtb3Rpb24gPSBvcmlQcm9wcy5tb3Rpb24sXG4gICAgbW90aW9uTm9kZXMgPSBvcmlQcm9wcy5tb3Rpb25Ob2RlcyxcbiAgICBtb3Rpb25UeXBlID0gb3JpUHJvcHMubW90aW9uVHlwZSxcbiAgICBvbk9yaWdpbk1vdGlvblN0YXJ0ID0gb3JpUHJvcHMub25Nb3Rpb25TdGFydCxcbiAgICBvbk9yaWdpbk1vdGlvbkVuZCA9IG9yaVByb3BzLm9uTW90aW9uRW5kLFxuICAgIGFjdGl2ZSA9IG9yaVByb3BzLmFjdGl2ZSxcbiAgICB0cmVlTm9kZVJlcXVpcmVkUHJvcHMgPSBvcmlQcm9wcy50cmVlTm9kZVJlcXVpcmVkUHJvcHMsXG4gICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob3JpUHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh0cnVlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICB2aXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChUcmVlQ29udGV4dCksXG4gICAgcHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQucHJlZml4Q2xzO1xuXG4gIC8vIENhbGN1bGF0ZSB0YXJnZXQgdmlzaWJsZSBoZXJlLlxuICAvLyBBbmQgYXBwbHkgaW4gZWZmZWN0IHRvIG1ha2UgYGxlYXZlYCBtb3Rpb24gd29yay5cbiAgdmFyIHRhcmdldFZpc2libGUgPSBtb3Rpb25Ob2RlcyAmJiBtb3Rpb25UeXBlICE9PSAnaGlkZSc7XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1vdGlvbk5vZGVzKSB7XG4gICAgICBpZiAodGFyZ2V0VmlzaWJsZSAhPT0gdmlzaWJsZSkge1xuICAgICAgICBzZXRWaXNpYmxlKHRhcmdldFZpc2libGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW21vdGlvbk5vZGVzXSk7XG4gIHZhciB0cmlnZ2VyTW90aW9uU3RhcnQgPSBmdW5jdGlvbiB0cmlnZ2VyTW90aW9uU3RhcnQoKSB7XG4gICAgaWYgKG1vdGlvbk5vZGVzKSB7XG4gICAgICBvbk9yaWdpbk1vdGlvblN0YXJ0KCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIFNob3VsZCBvbmx5IHRyaWdnZXIgb25jZVxuICB2YXIgdHJpZ2dlck1vdGlvbkVuZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciB0cmlnZ2VyTW90aW9uRW5kID0gZnVuY3Rpb24gdHJpZ2dlck1vdGlvbkVuZCgpIHtcbiAgICBpZiAobW90aW9uTm9kZXMgJiYgIXRyaWdnZXJNb3Rpb25FbmRSZWYuY3VycmVudCkge1xuICAgICAgdHJpZ2dlck1vdGlvbkVuZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIG9uT3JpZ2luTW90aW9uRW5kKCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEVmZmVjdCBpZiB1bm1vdW50XG4gIHVzZVVubW91bnQodHJpZ2dlck1vdGlvblN0YXJ0LCB0cmlnZ2VyTW90aW9uRW5kKTtcblxuICAvLyBNb3Rpb24gZW5kIGV2ZW50XG4gIHZhciBvblZpc2libGVDaGFuZ2VkID0gZnVuY3Rpb24gb25WaXNpYmxlQ2hhbmdlZChuZXh0VmlzaWJsZSkge1xuICAgIGlmICh0YXJnZXRWaXNpYmxlID09PSBuZXh0VmlzaWJsZSkge1xuICAgICAgdHJpZ2dlck1vdGlvbkVuZCgpO1xuICAgIH1cbiAgfTtcbiAgaWYgKG1vdGlvbk5vZGVzKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwgX2V4dGVuZHMoe1xuICAgICAgcmVmOiByZWYsXG4gICAgICB2aXNpYmxlOiB2aXNpYmxlXG4gICAgfSwgbW90aW9uLCB7XG4gICAgICBtb3Rpb25BcHBlYXI6IG1vdGlvblR5cGUgPT09ICdzaG93JyxcbiAgICAgIG9uVmlzaWJsZUNoYW5nZWQ6IG9uVmlzaWJsZUNoYW5nZWRcbiAgICB9KSwgZnVuY3Rpb24gKF9yZWYsIG1vdGlvblJlZikge1xuICAgICAgdmFyIG1vdGlvbkNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgICBtb3Rpb25TdHlsZSA9IF9yZWYuc3R5bGU7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICByZWY6IG1vdGlvblJlZixcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdHJlZW5vZGUtbW90aW9uXCIpLCBtb3Rpb25DbGFzc05hbWUpLFxuICAgICAgICBzdHlsZTogbW90aW9uU3R5bGVcbiAgICAgIH0sIG1vdGlvbk5vZGVzLm1hcChmdW5jdGlvbiAodHJlZU5vZGUpIHtcbiAgICAgICAgdmFyIHJlc3RQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIChfb2JqZWN0RGVzdHJ1Y3R1cmluZ0VtcHR5KHRyZWVOb2RlLmRhdGEpLCB0cmVlTm9kZS5kYXRhKSksXG4gICAgICAgICAgdGl0bGUgPSB0cmVlTm9kZS50aXRsZSxcbiAgICAgICAgICBrZXkgPSB0cmVlTm9kZS5rZXksXG4gICAgICAgICAgaXNTdGFydCA9IHRyZWVOb2RlLmlzU3RhcnQsXG4gICAgICAgICAgaXNFbmQgPSB0cmVlTm9kZS5pc0VuZDtcbiAgICAgICAgZGVsZXRlIHJlc3RQcm9wcy5jaGlsZHJlbjtcbiAgICAgICAgdmFyIHRyZWVOb2RlUHJvcHMgPSBnZXRUcmVlTm9kZVByb3BzKGtleSwgdHJlZU5vZGVSZXF1aXJlZFByb3BzKTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyZWVOb2RlLCBfZXh0ZW5kcyh7fSwgcmVzdFByb3BzLCB0cmVlTm9kZVByb3BzLCB7XG4gICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgICAgICAgIGRhdGE6IHRyZWVOb2RlLmRhdGEsXG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgaXNTdGFydDogaXNTdGFydCxcbiAgICAgICAgICBpc0VuZDogaXNFbmRcbiAgICAgICAgfSkpO1xuICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmVlTm9kZSwgX2V4dGVuZHMoe1xuICAgIGRvbVJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcywge1xuICAgIGFjdGl2ZTogYWN0aXZlXG4gIH0pKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgTW90aW9uVHJlZU5vZGUuZGlzcGxheU5hbWUgPSAnTW90aW9uVHJlZU5vZGUnO1xufVxuZXhwb3J0IGRlZmF1bHQgTW90aW9uVHJlZU5vZGU7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdERlc3RydWN0dXJpbmdFbXB0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0RGVzdHJ1Y3R1cmluZ0VtcHR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wicHJlZml4Q2xzXCIsIFwiZGF0YVwiLCBcInNlbGVjdGFibGVcIiwgXCJjaGVja2FibGVcIiwgXCJleHBhbmRlZEtleXNcIiwgXCJzZWxlY3RlZEtleXNcIiwgXCJjaGVja2VkS2V5c1wiLCBcImxvYWRlZEtleXNcIiwgXCJsb2FkaW5nS2V5c1wiLCBcImhhbGZDaGVja2VkS2V5c1wiLCBcImtleUVudGl0aWVzXCIsIFwiZGlzYWJsZWRcIiwgXCJkcmFnZ2luZ1wiLCBcImRyYWdPdmVyTm9kZUtleVwiLCBcImRyb3BQb3NpdGlvblwiLCBcIm1vdGlvblwiLCBcImhlaWdodFwiLCBcIml0ZW1IZWlnaHRcIiwgXCJ2aXJ0dWFsXCIsIFwic2Nyb2xsV2lkdGhcIiwgXCJmb2N1c2FibGVcIiwgXCJhY3RpdmVJdGVtXCIsIFwiZm9jdXNlZFwiLCBcInRhYkluZGV4XCIsIFwib25LZXlEb3duXCIsIFwib25Gb2N1c1wiLCBcIm9uQmx1clwiLCBcIm9uQWN0aXZlQ2hhbmdlXCIsIFwib25MaXN0Q2hhbmdlU3RhcnRcIiwgXCJvbkxpc3RDaGFuZ2VFbmRcIl07XG4vKipcbiAqIEhhbmRsZSB2aXJ0dWFsIGxpc3Qgb2YgdGhlIFRyZWVOb2Rlcy5cbiAqL1xuXG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0IFZpcnR1YWxMaXN0IGZyb20gJ3JjLXZpcnR1YWwtbGlzdCc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTW90aW9uVHJlZU5vZGUgZnJvbSBcIi4vTW90aW9uVHJlZU5vZGVcIjtcbmltcG9ydCB7IGZpbmRFeHBhbmRlZEtleXMsIGdldEV4cGFuZFJhbmdlIH0gZnJvbSBcIi4vdXRpbHMvZGlmZlV0aWxcIjtcbmltcG9ydCB7IGdldEtleSwgZ2V0VHJlZU5vZGVQcm9wcyB9IGZyb20gXCIuL3V0aWxzL3RyZWVVdGlsXCI7XG52YXIgSElEREVOX1NUWUxFID0ge1xuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICBkaXNwbGF5OiAnZmxleCcsXG4gIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgb3BhY2l0eTogMCxcbiAgYm9yZGVyOiAwLFxuICBwYWRkaW5nOiAwLFxuICBtYXJnaW46IDBcbn07XG52YXIgbm9vcCA9IGZ1bmN0aW9uIG5vb3AoKSB7fTtcbmV4cG9ydCB2YXIgTU9USU9OX0tFWSA9IFwiUkNfVFJFRV9NT1RJT05fXCIuY29uY2F0KE1hdGgucmFuZG9tKCkpO1xudmFyIE1vdGlvbk5vZGUgPSB7XG4gIGtleTogTU9USU9OX0tFWVxufTtcbmV4cG9ydCB2YXIgTW90aW9uRW50aXR5ID0ge1xuICBrZXk6IE1PVElPTl9LRVksXG4gIGxldmVsOiAwLFxuICBpbmRleDogMCxcbiAgcG9zOiAnMCcsXG4gIG5vZGU6IE1vdGlvbk5vZGUsXG4gIG5vZGVzOiBbTW90aW9uTm9kZV1cbn07XG52YXIgTW90aW9uRmxhdHRlbkRhdGEgPSB7XG4gIHBhcmVudDogbnVsbCxcbiAgY2hpbGRyZW46IFtdLFxuICBwb3M6IE1vdGlvbkVudGl0eS5wb3MsXG4gIGRhdGE6IE1vdGlvbk5vZGUsXG4gIHRpdGxlOiBudWxsLFxuICBrZXk6IE1PVElPTl9LRVksXG4gIC8qKiBIb2xkIGVtcHR5IGxpc3QgaGVyZSBzaW5jZSB3ZSBkbyBub3QgdXNlIGl0ICovXG4gIGlzU3RhcnQ6IFtdLFxuICBpc0VuZDogW11cbn07XG4vKipcbiAqIFdlIG9ubHkgbmVlZCBnZXQgdmlzaWJsZSBjb250ZW50IGl0ZW1zIHRvIHBsYXkgdGhlIGFuaW1hdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1pbmltdW1SYW5nZVRyYW5zaXRpb25SYW5nZShsaXN0LCB2aXJ0dWFsLCBoZWlnaHQsIGl0ZW1IZWlnaHQpIHtcbiAgaWYgKHZpcnR1YWwgPT09IGZhbHNlIHx8ICFoZWlnaHQpIHtcbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuICByZXR1cm4gbGlzdC5zbGljZSgwLCBNYXRoLmNlaWwoaGVpZ2h0IC8gaXRlbUhlaWdodCkgKyAxKTtcbn1cbmZ1bmN0aW9uIGl0ZW1LZXkoaXRlbSkge1xuICB2YXIga2V5ID0gaXRlbS5rZXksXG4gICAgcG9zID0gaXRlbS5wb3M7XG4gIHJldHVybiBnZXRLZXkoa2V5LCBwb3MpO1xufVxuZnVuY3Rpb24gZ2V0QWNjZXNzaWJpbGl0eVBhdGgoaXRlbSkge1xuICB2YXIgcGF0aCA9IFN0cmluZyhpdGVtLmRhdGEua2V5KTtcbiAgdmFyIGN1cnJlbnQgPSBpdGVtO1xuICB3aGlsZSAoY3VycmVudC5wYXJlbnQpIHtcbiAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgcGF0aCA9IFwiXCIuY29uY2F0KGN1cnJlbnQuZGF0YS5rZXksIFwiID4gXCIpLmNvbmNhdChwYXRoKTtcbiAgfVxuICByZXR1cm4gcGF0aDtcbn1cbnZhciBOb2RlTGlzdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgZGF0YSA9IHByb3BzLmRhdGEsXG4gICAgc2VsZWN0YWJsZSA9IHByb3BzLnNlbGVjdGFibGUsXG4gICAgY2hlY2thYmxlID0gcHJvcHMuY2hlY2thYmxlLFxuICAgIGV4cGFuZGVkS2V5cyA9IHByb3BzLmV4cGFuZGVkS2V5cyxcbiAgICBzZWxlY3RlZEtleXMgPSBwcm9wcy5zZWxlY3RlZEtleXMsXG4gICAgY2hlY2tlZEtleXMgPSBwcm9wcy5jaGVja2VkS2V5cyxcbiAgICBsb2FkZWRLZXlzID0gcHJvcHMubG9hZGVkS2V5cyxcbiAgICBsb2FkaW5nS2V5cyA9IHByb3BzLmxvYWRpbmdLZXlzLFxuICAgIGhhbGZDaGVja2VkS2V5cyA9IHByb3BzLmhhbGZDaGVja2VkS2V5cyxcbiAgICBrZXlFbnRpdGllcyA9IHByb3BzLmtleUVudGl0aWVzLFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgZHJhZ2dpbmcgPSBwcm9wcy5kcmFnZ2luZyxcbiAgICBkcmFnT3Zlck5vZGVLZXkgPSBwcm9wcy5kcmFnT3Zlck5vZGVLZXksXG4gICAgZHJvcFBvc2l0aW9uID0gcHJvcHMuZHJvcFBvc2l0aW9uLFxuICAgIG1vdGlvbiA9IHByb3BzLm1vdGlvbixcbiAgICBoZWlnaHQgPSBwcm9wcy5oZWlnaHQsXG4gICAgaXRlbUhlaWdodCA9IHByb3BzLml0ZW1IZWlnaHQsXG4gICAgdmlydHVhbCA9IHByb3BzLnZpcnR1YWwsXG4gICAgc2Nyb2xsV2lkdGggPSBwcm9wcy5zY3JvbGxXaWR0aCxcbiAgICBmb2N1c2FibGUgPSBwcm9wcy5mb2N1c2FibGUsXG4gICAgYWN0aXZlSXRlbSA9IHByb3BzLmFjdGl2ZUl0ZW0sXG4gICAgZm9jdXNlZCA9IHByb3BzLmZvY3VzZWQsXG4gICAgdGFiSW5kZXggPSBwcm9wcy50YWJJbmRleCxcbiAgICBvbktleURvd24gPSBwcm9wcy5vbktleURvd24sXG4gICAgb25Gb2N1cyA9IHByb3BzLm9uRm9jdXMsXG4gICAgb25CbHVyID0gcHJvcHMub25CbHVyLFxuICAgIG9uQWN0aXZlQ2hhbmdlID0gcHJvcHMub25BY3RpdmVDaGFuZ2UsXG4gICAgb25MaXN0Q2hhbmdlU3RhcnQgPSBwcm9wcy5vbkxpc3RDaGFuZ2VTdGFydCxcbiAgICBvbkxpc3RDaGFuZ2VFbmQgPSBwcm9wcy5vbkxpc3RDaGFuZ2VFbmQsXG4gICAgZG9tUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWYgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGxpc3RSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBpbmRlbnRNZWFzdXJlclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2Nyb2xsVG86IGZ1bmN0aW9uIHNjcm9sbFRvKHNjcm9sbCkge1xuICAgICAgICBsaXN0UmVmLmN1cnJlbnQuc2Nyb2xsVG8oc2Nyb2xsKTtcbiAgICAgIH0sXG4gICAgICBnZXRJbmRlbnRXaWR0aDogZnVuY3Rpb24gZ2V0SW5kZW50V2lkdGgoKSB7XG4gICAgICAgIHJldHVybiBpbmRlbnRNZWFzdXJlclJlZi5jdXJyZW50Lm9mZnNldFdpZHRoO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBNb3Rpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShleHBhbmRlZEtleXMpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHByZXZFeHBhbmRlZEtleXMgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFByZXZFeHBhbmRlZEtleXMgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKGRhdGEpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBwcmV2RGF0YSA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0UHJldkRhdGEgPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlNSA9IFJlYWN0LnVzZVN0YXRlKGRhdGEpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTYgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU1LCAyKSxcbiAgICB0cmFuc2l0aW9uRGF0YSA9IF9SZWFjdCR1c2VTdGF0ZTZbMF0sXG4gICAgc2V0VHJhbnNpdGlvbkRhdGEgPSBfUmVhY3QkdXNlU3RhdGU2WzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlNyA9IFJlYWN0LnVzZVN0YXRlKFtdKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU4ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNywgMiksXG4gICAgdHJhbnNpdGlvblJhbmdlID0gX1JlYWN0JHVzZVN0YXRlOFswXSxcbiAgICBzZXRUcmFuc2l0aW9uUmFuZ2UgPSBfUmVhY3QkdXNlU3RhdGU4WzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlOSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTEwID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlOSwgMiksXG4gICAgbW90aW9uVHlwZSA9IF9SZWFjdCR1c2VTdGF0ZTEwWzBdLFxuICAgIHNldE1vdGlvblR5cGUgPSBfUmVhY3QkdXNlU3RhdGUxMFsxXTtcblxuICAvLyBXaGVuIG1vdGlvbiBlbmQgYnV0IGRhdGEgY2hhbmdlLCB0aGlzIHdpbGwgbWFrZXMgZGF0YSBiYWNrIHRvIHByZXZpb3VzIG9uZVxuICB2YXIgZGF0YVJlZiA9IFJlYWN0LnVzZVJlZihkYXRhKTtcbiAgZGF0YVJlZi5jdXJyZW50ID0gZGF0YTtcbiAgZnVuY3Rpb24gb25Nb3Rpb25FbmQoKSB7XG4gICAgdmFyIGxhdGVzdERhdGEgPSBkYXRhUmVmLmN1cnJlbnQ7XG4gICAgc2V0UHJldkRhdGEobGF0ZXN0RGF0YSk7XG4gICAgc2V0VHJhbnNpdGlvbkRhdGEobGF0ZXN0RGF0YSk7XG4gICAgc2V0VHJhbnNpdGlvblJhbmdlKFtdKTtcbiAgICBzZXRNb3Rpb25UeXBlKG51bGwpO1xuICAgIG9uTGlzdENoYW5nZUVuZCgpO1xuICB9XG5cbiAgLy8gRG8gYW5pbWF0aW9uIGlmIGV4cGFuZGVkIGtleXMgY2hhbmdlZFxuICAvLyBsYXlvdXRFZmZlY3QgaGVyZSB0byBhdm9pZCBibGluayBvZiBub2RlIHJlbW92aW5nXG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0UHJldkV4cGFuZGVkS2V5cyhleHBhbmRlZEtleXMpO1xuICAgIHZhciBkaWZmRXhwYW5kZWQgPSBmaW5kRXhwYW5kZWRLZXlzKHByZXZFeHBhbmRlZEtleXMsIGV4cGFuZGVkS2V5cyk7XG4gICAgaWYgKGRpZmZFeHBhbmRlZC5rZXkgIT09IG51bGwpIHtcbiAgICAgIGlmIChkaWZmRXhwYW5kZWQuYWRkKSB7XG4gICAgICAgIHZhciBrZXlJbmRleCA9IHByZXZEYXRhLmZpbmRJbmRleChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgIHZhciBrZXkgPSBfcmVmLmtleTtcbiAgICAgICAgICByZXR1cm4ga2V5ID09PSBkaWZmRXhwYW5kZWQua2V5O1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJhbmdlTm9kZXMgPSBnZXRNaW5pbXVtUmFuZ2VUcmFuc2l0aW9uUmFuZ2UoZ2V0RXhwYW5kUmFuZ2UocHJldkRhdGEsIGRhdGEsIGRpZmZFeHBhbmRlZC5rZXkpLCB2aXJ0dWFsLCBoZWlnaHQsIGl0ZW1IZWlnaHQpO1xuICAgICAgICB2YXIgbmV3VHJhbnNpdGlvbkRhdGEgPSBwcmV2RGF0YS5zbGljZSgpO1xuICAgICAgICBuZXdUcmFuc2l0aW9uRGF0YS5zcGxpY2Uoa2V5SW5kZXggKyAxLCAwLCBNb3Rpb25GbGF0dGVuRGF0YSk7XG4gICAgICAgIHNldFRyYW5zaXRpb25EYXRhKG5ld1RyYW5zaXRpb25EYXRhKTtcbiAgICAgICAgc2V0VHJhbnNpdGlvblJhbmdlKHJhbmdlTm9kZXMpO1xuICAgICAgICBzZXRNb3Rpb25UeXBlKCdzaG93Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX2tleUluZGV4ID0gZGF0YS5maW5kSW5kZXgoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgdmFyIGtleSA9IF9yZWYyLmtleTtcbiAgICAgICAgICByZXR1cm4ga2V5ID09PSBkaWZmRXhwYW5kZWQua2V5O1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIF9yYW5nZU5vZGVzID0gZ2V0TWluaW11bVJhbmdlVHJhbnNpdGlvblJhbmdlKGdldEV4cGFuZFJhbmdlKGRhdGEsIHByZXZEYXRhLCBkaWZmRXhwYW5kZWQua2V5KSwgdmlydHVhbCwgaGVpZ2h0LCBpdGVtSGVpZ2h0KTtcbiAgICAgICAgdmFyIF9uZXdUcmFuc2l0aW9uRGF0YSA9IGRhdGEuc2xpY2UoKTtcbiAgICAgICAgX25ld1RyYW5zaXRpb25EYXRhLnNwbGljZShfa2V5SW5kZXggKyAxLCAwLCBNb3Rpb25GbGF0dGVuRGF0YSk7XG4gICAgICAgIHNldFRyYW5zaXRpb25EYXRhKF9uZXdUcmFuc2l0aW9uRGF0YSk7XG4gICAgICAgIHNldFRyYW5zaXRpb25SYW5nZShfcmFuZ2VOb2Rlcyk7XG4gICAgICAgIHNldE1vdGlvblR5cGUoJ2hpZGUnKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByZXZEYXRhICE9PSBkYXRhKSB7XG4gICAgICAvLyBJZiB3aG9sZSBkYXRhIGNoYW5nZWQsIHdlIGp1c3QgcmVmcmVzaCB0aGUgbGlzdFxuICAgICAgc2V0UHJldkRhdGEoZGF0YSk7XG4gICAgICBzZXRUcmFuc2l0aW9uRGF0YShkYXRhKTtcbiAgICB9XG4gIH0sIFtleHBhbmRlZEtleXMsIGRhdGFdKTtcblxuICAvLyBXZSBzaG91bGQgY2xlYW4gdXAgbW90aW9uIGlmIGlzIGNoYW5nZWQgYnkgZHJhZ2dpbmdcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWRyYWdnaW5nKSB7XG4gICAgICBvbk1vdGlvbkVuZCgpO1xuICAgIH1cbiAgfSwgW2RyYWdnaW5nXSk7XG4gIHZhciBtZXJnZWREYXRhID0gbW90aW9uID8gdHJhbnNpdGlvbkRhdGEgOiBkYXRhO1xuICB2YXIgdHJlZU5vZGVSZXF1aXJlZFByb3BzID0ge1xuICAgIGV4cGFuZGVkS2V5czogZXhwYW5kZWRLZXlzLFxuICAgIHNlbGVjdGVkS2V5czogc2VsZWN0ZWRLZXlzLFxuICAgIGxvYWRlZEtleXM6IGxvYWRlZEtleXMsXG4gICAgbG9hZGluZ0tleXM6IGxvYWRpbmdLZXlzLFxuICAgIGNoZWNrZWRLZXlzOiBjaGVja2VkS2V5cyxcbiAgICBoYWxmQ2hlY2tlZEtleXM6IGhhbGZDaGVja2VkS2V5cyxcbiAgICBkcmFnT3Zlck5vZGVLZXk6IGRyYWdPdmVyTm9kZUtleSxcbiAgICBkcm9wUG9zaXRpb246IGRyb3BQb3NpdGlvbixcbiAgICBrZXlFbnRpdGllczoga2V5RW50aXRpZXNcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBmb2N1c2VkICYmIGFjdGl2ZUl0ZW0gJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBzdHlsZTogSElEREVOX1NUWUxFLFxuICAgIFwiYXJpYS1saXZlXCI6IFwiYXNzZXJ0aXZlXCJcbiAgfSwgZ2V0QWNjZXNzaWJpbGl0eVBhdGgoYWN0aXZlSXRlbSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtcbiAgICBzdHlsZTogSElEREVOX1NUWUxFLFxuICAgIGRpc2FibGVkOiBmb2N1c2FibGUgPT09IGZhbHNlIHx8IGRpc2FibGVkLFxuICAgIHRhYkluZGV4OiBmb2N1c2FibGUgIT09IGZhbHNlID8gdGFiSW5kZXggOiBudWxsLFxuICAgIG9uS2V5RG93bjogb25LZXlEb3duLFxuICAgIG9uRm9jdXM6IG9uRm9jdXMsXG4gICAgb25CbHVyOiBvbkJsdXIsXG4gICAgdmFsdWU6IFwiXCIsXG4gICAgb25DaGFuZ2U6IG5vb3AsXG4gICAgXCJhcmlhLWxhYmVsXCI6IFwiZm9yIHNjcmVlbiByZWFkZXJcIlxuICB9KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdHJlZW5vZGVcIiksXG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlLFxuICAgIHN0eWxlOiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nLFxuICAgICAgaGVpZ2h0OiAwLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgYm9yZGVyOiAwLFxuICAgICAgcGFkZGluZzogMFxuICAgIH1cbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbmRlbnRcIilcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogaW5kZW50TWVhc3VyZXJSZWYsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWluZGVudC11bml0XCIpXG4gIH0pKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFZpcnR1YWxMaXN0LCBfZXh0ZW5kcyh7fSwgZG9tUHJvcHMsIHtcbiAgICBkYXRhOiBtZXJnZWREYXRhLFxuICAgIGl0ZW1LZXk6IGl0ZW1LZXksXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgZnVsbEhlaWdodDogZmFsc2UsXG4gICAgdmlydHVhbDogdmlydHVhbCxcbiAgICBpdGVtSGVpZ2h0OiBpdGVtSGVpZ2h0LFxuICAgIHNjcm9sbFdpZHRoOiBzY3JvbGxXaWR0aCxcbiAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGlzdFwiKSxcbiAgICByZWY6IGxpc3RSZWYsXG4gICAgcm9sZTogXCJ0cmVlXCIsXG4gICAgb25WaXNpYmxlQ2hhbmdlOiBmdW5jdGlvbiBvblZpc2libGVDaGFuZ2Uob3JpZ2luTGlzdCkge1xuICAgICAgLy8gVGhlIGJlc3QgbWF0Y2ggaXMgdXNpbmcgYGZ1bGxMaXN0YCAtIGBvcmlnaW5MaXN0YCA9IGByZXN0TGlzdGBcbiAgICAgIC8vIGFuZCBjaGVjayB0aGUgYHJlc3RMaXN0YCB0byBzZWUgaWYgaGFzIHRoZSBNT1RJT05fS0VZIG5vZGVcbiAgICAgIC8vIGJ1dCB0aGlzIHdpbGwgY2F1c2UgcGVyZm9ybWFuY2UgaXNzdWUgZm9yIGxvbmcgbGlzdCBjb21wYXJlXG4gICAgICAvLyB3ZSBqdXN0IGNoZWNrIGBvcmlnaW5MaXN0YCBhbmQgcmVwZWF0IHRyaWdnZXIgYG9uTW90aW9uRW5kYFxuICAgICAgaWYgKG9yaWdpbkxpc3QuZXZlcnkoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1LZXkoaXRlbSkgIT09IE1PVElPTl9LRVk7XG4gICAgICB9KSkge1xuICAgICAgICBvbk1vdGlvbkVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSksIGZ1bmN0aW9uICh0cmVlTm9kZSkge1xuICAgIHZhciBwb3MgPSB0cmVlTm9kZS5wb3MsXG4gICAgICByZXN0UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCAoX29iamVjdERlc3RydWN0dXJpbmdFbXB0eSh0cmVlTm9kZS5kYXRhKSwgdHJlZU5vZGUuZGF0YSkpLFxuICAgICAgdGl0bGUgPSB0cmVlTm9kZS50aXRsZSxcbiAgICAgIGtleSA9IHRyZWVOb2RlLmtleSxcbiAgICAgIGlzU3RhcnQgPSB0cmVlTm9kZS5pc1N0YXJ0LFxuICAgICAgaXNFbmQgPSB0cmVlTm9kZS5pc0VuZDtcbiAgICB2YXIgbWVyZ2VkS2V5ID0gZ2V0S2V5KGtleSwgcG9zKTtcbiAgICBkZWxldGUgcmVzdFByb3BzLmtleTtcbiAgICBkZWxldGUgcmVzdFByb3BzLmNoaWxkcmVuO1xuICAgIHZhciB0cmVlTm9kZVByb3BzID0gZ2V0VHJlZU5vZGVQcm9wcyhtZXJnZWRLZXksIHRyZWVOb2RlUmVxdWlyZWRQcm9wcyk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1vdGlvblRyZWVOb2RlLCBfZXh0ZW5kcyh7fSwgcmVzdFByb3BzLCB0cmVlTm9kZVByb3BzLCB7XG4gICAgICB0aXRsZTogdGl0bGUsXG4gICAgICBhY3RpdmU6ICEhYWN0aXZlSXRlbSAmJiBrZXkgPT09IGFjdGl2ZUl0ZW0ua2V5LFxuICAgICAgcG9zOiBwb3MsXG4gICAgICBkYXRhOiB0cmVlTm9kZS5kYXRhLFxuICAgICAgaXNTdGFydDogaXNTdGFydCxcbiAgICAgIGlzRW5kOiBpc0VuZCxcbiAgICAgIG1vdGlvbjogbW90aW9uLFxuICAgICAgbW90aW9uTm9kZXM6IGtleSA9PT0gTU9USU9OX0tFWSA/IHRyYW5zaXRpb25SYW5nZSA6IG51bGwsXG4gICAgICBtb3Rpb25UeXBlOiBtb3Rpb25UeXBlLFxuICAgICAgb25Nb3Rpb25TdGFydDogb25MaXN0Q2hhbmdlU3RhcnQsXG4gICAgICBvbk1vdGlvbkVuZDogb25Nb3Rpb25FbmQsXG4gICAgICB0cmVlTm9kZVJlcXVpcmVkUHJvcHM6IHRyZWVOb2RlUmVxdWlyZWRQcm9wcyxcbiAgICAgIG9uTW91c2VNb3ZlOiBmdW5jdGlvbiBvbk1vdXNlTW92ZSgpIHtcbiAgICAgICAgb25BY3RpdmVDaGFuZ2UobnVsbCk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9KSk7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIE5vZGVMaXN0LmRpc3BsYXlOYW1lID0gJ05vZGVMaXN0Jztcbn1cbmV4cG9ydCBkZWZhdWx0IE5vZGVMaXN0OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbi8vIFRPRE86IGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE3L05PVEUtd2FpLWFyaWEtcHJhY3RpY2VzLTEuMS0yMDE3MTIxNC9leGFtcGxlcy90cmVldmlldy90cmVldmlldy0yL3RyZWV2aWV3LTJhLmh0bWxcbi8vIEZ1bGx5IGFjY2Vzc2liaWxpdHkgc3VwcG9ydFxuXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBLZXlDb2RlIGZyb20gXCJyYy11dGlsL2VzL0tleUNvZGVcIjtcbmltcG9ydCBwaWNrQXR0cnMgZnJvbSBcInJjLXV0aWwvZXMvcGlja0F0dHJzXCI7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBUcmVlQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRUeXBlc1wiO1xuaW1wb3J0IERyb3BJbmRpY2F0b3IgZnJvbSBcIi4vRHJvcEluZGljYXRvclwiO1xuaW1wb3J0IE5vZGVMaXN0LCB7IE1PVElPTl9LRVksIE1vdGlvbkVudGl0eSB9IGZyb20gXCIuL05vZGVMaXN0XCI7XG5pbXBvcnQgVHJlZU5vZGUgZnJvbSBcIi4vVHJlZU5vZGVcIjtcbmltcG9ydCB7IGFyckFkZCwgYXJyRGVsLCBjYWxjRHJvcFBvc2l0aW9uLCBjYWxjU2VsZWN0ZWRLZXlzLCBjb25kdWN0RXhwYW5kUGFyZW50LCBnZXREcmFnQ2hpbGRyZW5LZXlzLCBwYXJzZUNoZWNrZWRLZXlzLCBwb3NUb0FyciB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7IGNvbmR1Y3RDaGVjayB9IGZyb20gXCIuL3V0aWxzL2NvbmR1Y3RVdGlsXCI7XG5pbXBvcnQgZ2V0RW50aXR5IGZyb20gXCIuL3V0aWxzL2tleVV0aWxcIjtcbmltcG9ydCB7IGNvbnZlcnREYXRhVG9FbnRpdGllcywgY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhLCBjb252ZXJ0VHJlZVRvRGF0YSwgZmlsbEZpZWxkTmFtZXMsIGZsYXR0ZW5UcmVlRGF0YSwgZ2V0VHJlZU5vZGVQcm9wcywgd2FybmluZ1dpdGhvdXRLZXkgfSBmcm9tIFwiLi91dGlscy90cmVlVXRpbFwiO1xudmFyIE1BWF9SRVRSWV9USU1FUyA9IDEwO1xudmFyIFRyZWUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFRyZWUsIF9SZWFjdCRDb21wb25lbnQpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFRyZWUpO1xuICBmdW5jdGlvbiBUcmVlKCkge1xuICAgIHZhciBfdGhpcztcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJlZSk7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF9hcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgX2FyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KF9hcmdzKSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImRlc3Ryb3llZFwiLCBmYWxzZSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImRlbGF5ZWREcmFnRW50ZXJMb2dpY1wiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJsb2FkaW5nUmV0cnlUaW1lc1wiLCB7fSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInN0YXRlXCIsIHtcbiAgICAgIGtleUVudGl0aWVzOiB7fSxcbiAgICAgIGluZGVudDogbnVsbCxcbiAgICAgIHNlbGVjdGVkS2V5czogW10sXG4gICAgICBjaGVja2VkS2V5czogW10sXG4gICAgICBoYWxmQ2hlY2tlZEtleXM6IFtdLFxuICAgICAgbG9hZGVkS2V5czogW10sXG4gICAgICBsb2FkaW5nS2V5czogW10sXG4gICAgICBleHBhbmRlZEtleXM6IFtdLFxuICAgICAgZHJhZ2dpbmdOb2RlS2V5OiBudWxsLFxuICAgICAgZHJhZ0NoaWxkcmVuS2V5czogW10sXG4gICAgICAvLyBkcm9wVGFyZ2V0S2V5IGlzIHRoZSBrZXkgb2YgYWJzdHJhY3QtZHJvcC1ub2RlXG4gICAgICAvLyB0aGUgYWJzdHJhY3QtZHJvcC1ub2RlIGlzIHRoZSByZWFsIGRyb3Agbm9kZSB3aGVuIGRyYWcgYW5kIGRyb3BcbiAgICAgIC8vIG5vdCB0aGUgRE9NIGRyYWcgb3ZlciBub2RlXG4gICAgICBkcm9wVGFyZ2V0S2V5OiBudWxsLFxuICAgICAgZHJvcFBvc2l0aW9uOiBudWxsLFxuICAgICAgLy8gdGhlIGRyb3AgcG9zaXRpb24gb2YgYWJzdHJhY3QtZHJvcC1ub2RlLCBpbnNpZGUgMCwgdG9wIC0xLCBib3R0b20gMVxuICAgICAgZHJvcENvbnRhaW5lcktleTogbnVsbCxcbiAgICAgIC8vIHRoZSBjb250YWluZXIga2V5IG9mIGFic3RyYWN0LWRyb3Atbm9kZSBpZiBkcm9wUG9zaXRpb24gaXMgLTEgb3IgMVxuICAgICAgZHJvcExldmVsT2Zmc2V0OiBudWxsLFxuICAgICAgLy8gdGhlIGRyb3AgbGV2ZWwgb2Zmc2V0IG9mIGFic3RyYWN0LWRyYWctb3Zlci1ub2RlXG4gICAgICBkcm9wVGFyZ2V0UG9zOiBudWxsLFxuICAgICAgLy8gdGhlIHBvcyBvZiBhYnN0cmFjdC1kcm9wLW5vZGVcbiAgICAgIGRyb3BBbGxvd2VkOiB0cnVlLFxuICAgICAgLy8gaWYgZHJvcCB0byBhYnN0cmFjdC1kcm9wLW5vZGUgaXMgYWxsb3dlZFxuICAgICAgLy8gdGhlIGFic3RyYWN0LWRyYWctb3Zlci1ub2RlXG4gICAgICAvLyBpZiBtb3VzZSBpcyBvbiB0aGUgYm90dG9tIG9mIHRvcCBkb20gbm9kZSBvciBubyB0aGUgdG9wIG9mIHRoZSBib3R0b20gZG9tIG5vZGVcbiAgICAgIC8vIGFic3RyYWN0LWRyYWctb3Zlci1ub2RlIGlzIHRoZSB0b3Agbm9kZVxuICAgICAgZHJhZ092ZXJOb2RlS2V5OiBudWxsLFxuICAgICAgdHJlZURhdGE6IFtdLFxuICAgICAgZmxhdHRlbk5vZGVzOiBbXSxcbiAgICAgIGZvY3VzZWQ6IGZhbHNlLFxuICAgICAgYWN0aXZlS2V5OiBudWxsLFxuICAgICAgbGlzdENoYW5naW5nOiBmYWxzZSxcbiAgICAgIHByZXZQcm9wczogbnVsbCxcbiAgICAgIGZpZWxkTmFtZXM6IGZpbGxGaWVsZE5hbWVzKClcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZHJhZ1N0YXJ0TW91c2VQb3NpdGlvblwiLCBudWxsKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZHJhZ05vZGVQcm9wc1wiLCBudWxsKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiY3VycmVudE1vdXNlT3ZlckRyb3BwYWJsZU5vZGVLZXlcIiwgbnVsbCk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImxpc3RSZWZcIiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZVJlZigpKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Ob2RlRHJhZ1N0YXJ0XCIsIGZ1bmN0aW9uIChldmVudCwgbm9kZVByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgZXhwYW5kZWRLZXlzID0gX3RoaXMkc3RhdGUuZXhwYW5kZWRLZXlzLFxuICAgICAgICBrZXlFbnRpdGllcyA9IF90aGlzJHN0YXRlLmtleUVudGl0aWVzO1xuICAgICAgdmFyIG9uRHJhZ1N0YXJ0ID0gX3RoaXMucHJvcHMub25EcmFnU3RhcnQ7XG4gICAgICB2YXIgZXZlbnRLZXkgPSBub2RlUHJvcHMuZXZlbnRLZXk7XG4gICAgICBfdGhpcy5kcmFnTm9kZVByb3BzID0gbm9kZVByb3BzO1xuICAgICAgX3RoaXMuZHJhZ1N0YXJ0TW91c2VQb3NpdGlvbiA9IHtcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WVxuICAgICAgfTtcbiAgICAgIHZhciBuZXdFeHBhbmRlZEtleXMgPSBhcnJEZWwoZXhwYW5kZWRLZXlzLCBldmVudEtleSk7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdnaW5nTm9kZUtleTogZXZlbnRLZXksXG4gICAgICAgIGRyYWdDaGlsZHJlbktleXM6IGdldERyYWdDaGlsZHJlbktleXMoZXZlbnRLZXksIGtleUVudGl0aWVzKSxcbiAgICAgICAgaW5kZW50OiBfdGhpcy5saXN0UmVmLmN1cnJlbnQuZ2V0SW5kZW50V2lkdGgoKVxuICAgICAgfSk7XG4gICAgICBfdGhpcy5zZXRFeHBhbmRlZEtleXMobmV3RXhwYW5kZWRLZXlzKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgX3RoaXMub25XaW5kb3dEcmFnRW5kKTtcbiAgICAgIG9uRHJhZ1N0YXJ0ID09PSBudWxsIHx8IG9uRHJhZ1N0YXJ0ID09PSB2b2lkIDAgfHwgb25EcmFnU3RhcnQoe1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIG5vZGU6IGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShub2RlUHJvcHMpXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBbTGVnYWN5XSBTZWxlY3QgaGFuZGxlciBpcyBzbWFsbGVyIHRoYW4gbm9kZSxcbiAgICAgKiBzbyB0aGF0IHRoaXMgd2lsbCB0cmlnZ2VyIHdoZW4gZHJhZyBlbnRlciBub2RlIG9yIHNlbGVjdCBoYW5kbGVyLlxuICAgICAqIFRoaXMgaXMgYSBsaXR0bGUgdHJpY2t5IGlmIGN1c3RvbWl6ZSBjc3Mgd2l0aG91dCBwYWRkaW5nLlxuICAgICAqIEJldHRlciBmb3IgdXNlIG1vdXNlIG1vdmUgZXZlbnQgdG8gcmVmcmVzaCBkcmFnIHN0YXRlLlxuICAgICAqIEJ1dCBsZXQncyBqdXN0IGtlZXAgaXQgdG8gYXZvaWQgZXZlbnQgdHJpZ2dlciBsb2dpYyBjaGFuZ2UuXG4gICAgICovXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uTm9kZURyYWdFbnRlclwiLCBmdW5jdGlvbiAoZXZlbnQsIG5vZGVQcm9wcykge1xuICAgICAgdmFyIF90aGlzJHN0YXRlMiA9IF90aGlzLnN0YXRlLFxuICAgICAgICBleHBhbmRlZEtleXMgPSBfdGhpcyRzdGF0ZTIuZXhwYW5kZWRLZXlzLFxuICAgICAgICBrZXlFbnRpdGllcyA9IF90aGlzJHN0YXRlMi5rZXlFbnRpdGllcyxcbiAgICAgICAgZHJhZ0NoaWxkcmVuS2V5cyA9IF90aGlzJHN0YXRlMi5kcmFnQ2hpbGRyZW5LZXlzLFxuICAgICAgICBmbGF0dGVuTm9kZXMgPSBfdGhpcyRzdGF0ZTIuZmxhdHRlbk5vZGVzLFxuICAgICAgICBpbmRlbnQgPSBfdGhpcyRzdGF0ZTIuaW5kZW50O1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgIG9uRHJhZ0VudGVyID0gX3RoaXMkcHJvcHMub25EcmFnRW50ZXIsXG4gICAgICAgIG9uRXhwYW5kID0gX3RoaXMkcHJvcHMub25FeHBhbmQsXG4gICAgICAgIGFsbG93RHJvcCA9IF90aGlzJHByb3BzLmFsbG93RHJvcCxcbiAgICAgICAgZGlyZWN0aW9uID0gX3RoaXMkcHJvcHMuZGlyZWN0aW9uO1xuICAgICAgdmFyIHBvcyA9IG5vZGVQcm9wcy5wb3MsXG4gICAgICAgIGV2ZW50S2V5ID0gbm9kZVByb3BzLmV2ZW50S2V5O1xuXG4gICAgICAvLyByZWNvcmQgdGhlIGtleSBvZiBub2RlIHdoaWNoIGlzIGxhdGVzdCBlbnRlcmVkLCB1c2VkIGluIGRyYWdsZWF2ZSBldmVudC5cbiAgICAgIGlmIChfdGhpcy5jdXJyZW50TW91c2VPdmVyRHJvcHBhYmxlTm9kZUtleSAhPT0gZXZlbnRLZXkpIHtcbiAgICAgICAgX3RoaXMuY3VycmVudE1vdXNlT3ZlckRyb3BwYWJsZU5vZGVLZXkgPSBldmVudEtleTtcbiAgICAgIH1cbiAgICAgIGlmICghX3RoaXMuZHJhZ05vZGVQcm9wcykge1xuICAgICAgICBfdGhpcy5yZXNldERyYWdTdGF0ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgX2NhbGNEcm9wUG9zaXRpb24gPSBjYWxjRHJvcFBvc2l0aW9uKGV2ZW50LCBfdGhpcy5kcmFnTm9kZVByb3BzLCBub2RlUHJvcHMsIGluZGVudCwgX3RoaXMuZHJhZ1N0YXJ0TW91c2VQb3NpdGlvbiwgYWxsb3dEcm9wLCBmbGF0dGVuTm9kZXMsIGtleUVudGl0aWVzLCBleHBhbmRlZEtleXMsIGRpcmVjdGlvbiksXG4gICAgICAgIGRyb3BQb3NpdGlvbiA9IF9jYWxjRHJvcFBvc2l0aW9uLmRyb3BQb3NpdGlvbixcbiAgICAgICAgZHJvcExldmVsT2Zmc2V0ID0gX2NhbGNEcm9wUG9zaXRpb24uZHJvcExldmVsT2Zmc2V0LFxuICAgICAgICBkcm9wVGFyZ2V0S2V5ID0gX2NhbGNEcm9wUG9zaXRpb24uZHJvcFRhcmdldEtleSxcbiAgICAgICAgZHJvcENvbnRhaW5lcktleSA9IF9jYWxjRHJvcFBvc2l0aW9uLmRyb3BDb250YWluZXJLZXksXG4gICAgICAgIGRyb3BUYXJnZXRQb3MgPSBfY2FsY0Ryb3BQb3NpdGlvbi5kcm9wVGFyZ2V0UG9zLFxuICAgICAgICBkcm9wQWxsb3dlZCA9IF9jYWxjRHJvcFBvc2l0aW9uLmRyb3BBbGxvd2VkLFxuICAgICAgICBkcmFnT3Zlck5vZGVLZXkgPSBfY2FsY0Ryb3BQb3NpdGlvbi5kcmFnT3Zlck5vZGVLZXk7XG4gICAgICBpZiAoXG4gICAgICAvLyBkb24ndCBhbGxvdyBkcm9wIGluc2lkZSBpdHMgY2hpbGRyZW5cbiAgICAgIGRyYWdDaGlsZHJlbktleXMuaW5jbHVkZXMoZHJvcFRhcmdldEtleSkgfHxcbiAgICAgIC8vIGRvbid0IGFsbG93IGRyb3Agd2hlbiBkcm9wIGlzIG5vdCBhbGxvd2VkIGNhY3VsYXRlZCBieSBjYWxjRHJvcFBvc2l0aW9uXG4gICAgICAhZHJvcEFsbG93ZWQpIHtcbiAgICAgICAgX3RoaXMucmVzZXREcmFnU3RhdGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTaWRlIGVmZmVjdCBmb3IgZGVsYXkgZHJhZ1xuICAgICAgaWYgKCFfdGhpcy5kZWxheWVkRHJhZ0VudGVyTG9naWMpIHtcbiAgICAgICAgX3RoaXMuZGVsYXllZERyYWdFbnRlckxvZ2ljID0ge307XG4gICAgICB9XG4gICAgICBPYmplY3Qua2V5cyhfdGhpcy5kZWxheWVkRHJhZ0VudGVyTG9naWMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMuZGVsYXllZERyYWdFbnRlckxvZ2ljW2tleV0pO1xuICAgICAgfSk7XG4gICAgICBpZiAoX3RoaXMuZHJhZ05vZGVQcm9wcy5ldmVudEtleSAhPT0gbm9kZVByb3BzLmV2ZW50S2V5KSB7XG4gICAgICAgIC8vIGhvaXN0IGV4cGFuZCBsb2dpYyBoZXJlXG4gICAgICAgIC8vIHNpbmNlIGlmIGxvZ2ljIGlzIG9uIHRoZSBib3R0b21cbiAgICAgICAgLy8gaXQgd2lsbCBiZSBibG9ja2VkIGJ5IGFic3RyYWN0IGRyYWdvdmVyIG5vZGUgY2hlY2tcbiAgICAgICAgLy8gICA9PiBpZiB5b3UgZHJhZ2VudGVyIGZyb20gdG9wLCB5b3UgbW91c2Ugd2lsbCBzdGlsbCBiZSBjb25zaWRlciBhcyBpbiB0aGUgdG9wIG5vZGVcbiAgICAgICAgZXZlbnQucGVyc2lzdCgpO1xuICAgICAgICBfdGhpcy5kZWxheWVkRHJhZ0VudGVyTG9naWNbcG9zXSA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoX3RoaXMuc3RhdGUuZHJhZ2dpbmdOb2RlS2V5ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBuZXdFeHBhbmRlZEtleXMgPSBfdG9Db25zdW1hYmxlQXJyYXkoZXhwYW5kZWRLZXlzKTtcbiAgICAgICAgICB2YXIgZW50aXR5ID0gZ2V0RW50aXR5KGtleUVudGl0aWVzLCBub2RlUHJvcHMuZXZlbnRLZXkpO1xuICAgICAgICAgIGlmIChlbnRpdHkgJiYgKGVudGl0eS5jaGlsZHJlbiB8fCBbXSkubGVuZ3RoKSB7XG4gICAgICAgICAgICBuZXdFeHBhbmRlZEtleXMgPSBhcnJBZGQoZXhwYW5kZWRLZXlzLCBub2RlUHJvcHMuZXZlbnRLZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIV90aGlzLnByb3BzLmhhc093blByb3BlcnR5KCdleHBhbmRlZEtleXMnKSkge1xuICAgICAgICAgICAgX3RoaXMuc2V0RXhwYW5kZWRLZXlzKG5ld0V4cGFuZGVkS2V5cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9uRXhwYW5kID09PSBudWxsIHx8IG9uRXhwYW5kID09PSB2b2lkIDAgfHwgb25FeHBhbmQobmV3RXhwYW5kZWRLZXlzLCB7XG4gICAgICAgICAgICBub2RlOiBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEobm9kZVByb3BzKSxcbiAgICAgICAgICAgIGV4cGFuZGVkOiB0cnVlLFxuICAgICAgICAgICAgbmF0aXZlRXZlbnQ6IGV2ZW50Lm5hdGl2ZUV2ZW50XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIDgwMCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNraXAgaWYgZHJhZyBub2RlIGlzIHNlbGZcbiAgICAgIGlmIChfdGhpcy5kcmFnTm9kZVByb3BzLmV2ZW50S2V5ID09PSBkcm9wVGFyZ2V0S2V5ICYmIGRyb3BMZXZlbE9mZnNldCA9PT0gMCkge1xuICAgICAgICBfdGhpcy5yZXNldERyYWdTdGF0ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBkcmFnIG92ZXIgbm9kZSBhbmQgZHJhZyBzdGF0ZVxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnT3Zlck5vZGVLZXk6IGRyYWdPdmVyTm9kZUtleSxcbiAgICAgICAgZHJvcFBvc2l0aW9uOiBkcm9wUG9zaXRpb24sXG4gICAgICAgIGRyb3BMZXZlbE9mZnNldDogZHJvcExldmVsT2Zmc2V0LFxuICAgICAgICBkcm9wVGFyZ2V0S2V5OiBkcm9wVGFyZ2V0S2V5LFxuICAgICAgICBkcm9wQ29udGFpbmVyS2V5OiBkcm9wQ29udGFpbmVyS2V5LFxuICAgICAgICBkcm9wVGFyZ2V0UG9zOiBkcm9wVGFyZ2V0UG9zLFxuICAgICAgICBkcm9wQWxsb3dlZDogZHJvcEFsbG93ZWRcbiAgICAgIH0pO1xuICAgICAgb25EcmFnRW50ZXIgPT09IG51bGwgfHwgb25EcmFnRW50ZXIgPT09IHZvaWQgMCB8fCBvbkRyYWdFbnRlcih7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbm9kZTogY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKG5vZGVQcm9wcyksXG4gICAgICAgIGV4cGFuZGVkS2V5czogZXhwYW5kZWRLZXlzXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Ob2RlRHJhZ092ZXJcIiwgZnVuY3Rpb24gKGV2ZW50LCBub2RlUHJvcHMpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTMgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgZHJhZ0NoaWxkcmVuS2V5cyA9IF90aGlzJHN0YXRlMy5kcmFnQ2hpbGRyZW5LZXlzLFxuICAgICAgICBmbGF0dGVuTm9kZXMgPSBfdGhpcyRzdGF0ZTMuZmxhdHRlbk5vZGVzLFxuICAgICAgICBrZXlFbnRpdGllcyA9IF90aGlzJHN0YXRlMy5rZXlFbnRpdGllcyxcbiAgICAgICAgZXhwYW5kZWRLZXlzID0gX3RoaXMkc3RhdGUzLmV4cGFuZGVkS2V5cyxcbiAgICAgICAgaW5kZW50ID0gX3RoaXMkc3RhdGUzLmluZGVudDtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgb25EcmFnT3ZlciA9IF90aGlzJHByb3BzMi5vbkRyYWdPdmVyLFxuICAgICAgICBhbGxvd0Ryb3AgPSBfdGhpcyRwcm9wczIuYWxsb3dEcm9wLFxuICAgICAgICBkaXJlY3Rpb24gPSBfdGhpcyRwcm9wczIuZGlyZWN0aW9uO1xuICAgICAgaWYgKCFfdGhpcy5kcmFnTm9kZVByb3BzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBfY2FsY0Ryb3BQb3NpdGlvbjIgPSBjYWxjRHJvcFBvc2l0aW9uKGV2ZW50LCBfdGhpcy5kcmFnTm9kZVByb3BzLCBub2RlUHJvcHMsIGluZGVudCwgX3RoaXMuZHJhZ1N0YXJ0TW91c2VQb3NpdGlvbiwgYWxsb3dEcm9wLCBmbGF0dGVuTm9kZXMsIGtleUVudGl0aWVzLCBleHBhbmRlZEtleXMsIGRpcmVjdGlvbiksXG4gICAgICAgIGRyb3BQb3NpdGlvbiA9IF9jYWxjRHJvcFBvc2l0aW9uMi5kcm9wUG9zaXRpb24sXG4gICAgICAgIGRyb3BMZXZlbE9mZnNldCA9IF9jYWxjRHJvcFBvc2l0aW9uMi5kcm9wTGV2ZWxPZmZzZXQsXG4gICAgICAgIGRyb3BUYXJnZXRLZXkgPSBfY2FsY0Ryb3BQb3NpdGlvbjIuZHJvcFRhcmdldEtleSxcbiAgICAgICAgZHJvcENvbnRhaW5lcktleSA9IF9jYWxjRHJvcFBvc2l0aW9uMi5kcm9wQ29udGFpbmVyS2V5LFxuICAgICAgICBkcm9wVGFyZ2V0UG9zID0gX2NhbGNEcm9wUG9zaXRpb24yLmRyb3BUYXJnZXRQb3MsXG4gICAgICAgIGRyb3BBbGxvd2VkID0gX2NhbGNEcm9wUG9zaXRpb24yLmRyb3BBbGxvd2VkLFxuICAgICAgICBkcmFnT3Zlck5vZGVLZXkgPSBfY2FsY0Ryb3BQb3NpdGlvbjIuZHJhZ092ZXJOb2RlS2V5O1xuICAgICAgaWYgKGRyYWdDaGlsZHJlbktleXMuaW5jbHVkZXMoZHJvcFRhcmdldEtleSkgfHwgIWRyb3BBbGxvd2VkKSB7XG4gICAgICAgIC8vIGRvbid0IGFsbG93IGRyb3AgaW5zaWRlIGl0cyBjaGlsZHJlblxuICAgICAgICAvLyBkb24ndCBhbGxvdyBkcm9wIHdoZW4gZHJvcCBpcyBub3QgYWxsb3dlZCBjYWxjdWxhdGVkIGJ5IGNhbGNEcm9wUG9zaXRpb25cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgZHJhZyBwb3NpdGlvblxuXG4gICAgICBpZiAoX3RoaXMuZHJhZ05vZGVQcm9wcy5ldmVudEtleSA9PT0gZHJvcFRhcmdldEtleSAmJiBkcm9wTGV2ZWxPZmZzZXQgPT09IDApIHtcbiAgICAgICAgaWYgKCEoX3RoaXMuc3RhdGUuZHJvcFBvc2l0aW9uID09PSBudWxsICYmIF90aGlzLnN0YXRlLmRyb3BMZXZlbE9mZnNldCA9PT0gbnVsbCAmJiBfdGhpcy5zdGF0ZS5kcm9wVGFyZ2V0S2V5ID09PSBudWxsICYmIF90aGlzLnN0YXRlLmRyb3BDb250YWluZXJLZXkgPT09IG51bGwgJiYgX3RoaXMuc3RhdGUuZHJvcFRhcmdldFBvcyA9PT0gbnVsbCAmJiBfdGhpcy5zdGF0ZS5kcm9wQWxsb3dlZCA9PT0gZmFsc2UgJiYgX3RoaXMuc3RhdGUuZHJhZ092ZXJOb2RlS2V5ID09PSBudWxsKSkge1xuICAgICAgICAgIF90aGlzLnJlc2V0RHJhZ1N0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIShkcm9wUG9zaXRpb24gPT09IF90aGlzLnN0YXRlLmRyb3BQb3NpdGlvbiAmJiBkcm9wTGV2ZWxPZmZzZXQgPT09IF90aGlzLnN0YXRlLmRyb3BMZXZlbE9mZnNldCAmJiBkcm9wVGFyZ2V0S2V5ID09PSBfdGhpcy5zdGF0ZS5kcm9wVGFyZ2V0S2V5ICYmIGRyb3BDb250YWluZXJLZXkgPT09IF90aGlzLnN0YXRlLmRyb3BDb250YWluZXJLZXkgJiYgZHJvcFRhcmdldFBvcyA9PT0gX3RoaXMuc3RhdGUuZHJvcFRhcmdldFBvcyAmJiBkcm9wQWxsb3dlZCA9PT0gX3RoaXMuc3RhdGUuZHJvcEFsbG93ZWQgJiYgZHJhZ092ZXJOb2RlS2V5ID09PSBfdGhpcy5zdGF0ZS5kcmFnT3Zlck5vZGVLZXkpKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBkcm9wUG9zaXRpb246IGRyb3BQb3NpdGlvbixcbiAgICAgICAgICBkcm9wTGV2ZWxPZmZzZXQ6IGRyb3BMZXZlbE9mZnNldCxcbiAgICAgICAgICBkcm9wVGFyZ2V0S2V5OiBkcm9wVGFyZ2V0S2V5LFxuICAgICAgICAgIGRyb3BDb250YWluZXJLZXk6IGRyb3BDb250YWluZXJLZXksXG4gICAgICAgICAgZHJvcFRhcmdldFBvczogZHJvcFRhcmdldFBvcyxcbiAgICAgICAgICBkcm9wQWxsb3dlZDogZHJvcEFsbG93ZWQsXG4gICAgICAgICAgZHJhZ092ZXJOb2RlS2V5OiBkcmFnT3Zlck5vZGVLZXlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBvbkRyYWdPdmVyID09PSBudWxsIHx8IG9uRHJhZ092ZXIgPT09IHZvaWQgMCB8fCBvbkRyYWdPdmVyKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBub2RlOiBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEobm9kZVByb3BzKVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uTm9kZURyYWdMZWF2ZVwiLCBmdW5jdGlvbiAoZXZlbnQsIG5vZGVQcm9wcykge1xuICAgICAgLy8gaWYgaXQgaXMgb3V0c2lkZSB0aGUgZHJvcHBhYmxlIGFyZWFcbiAgICAgIC8vIGN1cnJlbnRNb3VzZU92ZXJEcm9wcGFibGVOb2RlS2V5IHdpbGwgYmUgdXBkYXRlZCBpbiBkcmFnZW50ZXIgZXZlbnQgd2hlbiBpbnRvIGFub3RoZXIgZHJvcHBhYmxlIHJlY2VpdmVyLlxuICAgICAgaWYgKF90aGlzLmN1cnJlbnRNb3VzZU92ZXJEcm9wcGFibGVOb2RlS2V5ID09PSBub2RlUHJvcHMuZXZlbnRLZXkgJiYgIWV2ZW50LmN1cnJlbnRUYXJnZXQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpIHtcbiAgICAgICAgX3RoaXMucmVzZXREcmFnU3RhdGUoKTtcbiAgICAgICAgX3RoaXMuY3VycmVudE1vdXNlT3ZlckRyb3BwYWJsZU5vZGVLZXkgPSBudWxsO1xuICAgICAgfVxuICAgICAgdmFyIG9uRHJhZ0xlYXZlID0gX3RoaXMucHJvcHMub25EcmFnTGVhdmU7XG4gICAgICBvbkRyYWdMZWF2ZSA9PT0gbnVsbCB8fCBvbkRyYWdMZWF2ZSA9PT0gdm9pZCAwIHx8IG9uRHJhZ0xlYXZlKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBub2RlOiBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEobm9kZVByb3BzKVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgLy8gc2luY2Ugc3RvcFByb3BhZ2F0aW9uKCkgaXMgY2FsbGVkIGluIHRyZWVOb2RlXG4gICAgLy8gaWYgb25XaW5kb3dEcmFnIGlzIGNhbGxlZCwgd2hpY2UgbWVhbnMgc3RhdGUgaXMga2VlcGVkLCBkcmFnIHN0YXRlIHNob3VsZCBiZSBjbGVhcmVkXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uV2luZG93RHJhZ0VuZFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIF90aGlzLm9uTm9kZURyYWdFbmQoZXZlbnQsIG51bGwsIHRydWUpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCBfdGhpcy5vbldpbmRvd0RyYWdFbmQpO1xuICAgIH0pO1xuICAgIC8vIGlmIG9uTm9kZURyYWdFbmQgaXMgY2FsbGVkLCBvbldpbmRvd0RyYWdFbmQgd29uJ3QgYmUgY2FsbGVkIHNpbmNlIHN0b3BQcm9wYWdhdGlvbigpIGlzIGNhbGxlZFxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbk5vZGVEcmFnRW5kXCIsIGZ1bmN0aW9uIChldmVudCwgbm9kZVByb3BzKSB7XG4gICAgICB2YXIgb25EcmFnRW5kID0gX3RoaXMucHJvcHMub25EcmFnRW5kO1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnT3Zlck5vZGVLZXk6IG51bGxcbiAgICAgIH0pO1xuICAgICAgX3RoaXMuY2xlYW5EcmFnU3RhdGUoKTtcbiAgICAgIG9uRHJhZ0VuZCA9PT0gbnVsbCB8fCBvbkRyYWdFbmQgPT09IHZvaWQgMCB8fCBvbkRyYWdFbmQoe1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIG5vZGU6IGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShub2RlUHJvcHMpXG4gICAgICB9KTtcbiAgICAgIF90aGlzLmRyYWdOb2RlUHJvcHMgPSBudWxsO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCBfdGhpcy5vbldpbmRvd0RyYWdFbmQpO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbk5vZGVEcm9wXCIsIGZ1bmN0aW9uIChldmVudCwgXykge1xuICAgICAgdmFyIF90aGlzJGdldEFjdGl2ZUl0ZW07XG4gICAgICB2YXIgb3V0c2lkZVRyZWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICAgICAgdmFyIF90aGlzJHN0YXRlNCA9IF90aGlzLnN0YXRlLFxuICAgICAgICBkcmFnQ2hpbGRyZW5LZXlzID0gX3RoaXMkc3RhdGU0LmRyYWdDaGlsZHJlbktleXMsXG4gICAgICAgIGRyb3BQb3NpdGlvbiA9IF90aGlzJHN0YXRlNC5kcm9wUG9zaXRpb24sXG4gICAgICAgIGRyb3BUYXJnZXRLZXkgPSBfdGhpcyRzdGF0ZTQuZHJvcFRhcmdldEtleSxcbiAgICAgICAgZHJvcFRhcmdldFBvcyA9IF90aGlzJHN0YXRlNC5kcm9wVGFyZ2V0UG9zLFxuICAgICAgICBkcm9wQWxsb3dlZCA9IF90aGlzJHN0YXRlNC5kcm9wQWxsb3dlZDtcbiAgICAgIGlmICghZHJvcEFsbG93ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG9uRHJvcCA9IF90aGlzLnByb3BzLm9uRHJvcDtcbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ092ZXJOb2RlS2V5OiBudWxsXG4gICAgICB9KTtcbiAgICAgIF90aGlzLmNsZWFuRHJhZ1N0YXRlKCk7XG4gICAgICBpZiAoZHJvcFRhcmdldEtleSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgdmFyIGFic3RyYWN0RHJvcE5vZGVQcm9wcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ2V0VHJlZU5vZGVQcm9wcyhkcm9wVGFyZ2V0S2V5LCBfdGhpcy5nZXRUcmVlTm9kZVJlcXVpcmVkUHJvcHMoKSkpLCB7fSwge1xuICAgICAgICBhY3RpdmU6ICgoX3RoaXMkZ2V0QWN0aXZlSXRlbSA9IF90aGlzLmdldEFjdGl2ZUl0ZW0oKSkgPT09IG51bGwgfHwgX3RoaXMkZ2V0QWN0aXZlSXRlbSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZ2V0QWN0aXZlSXRlbS5rZXkpID09PSBkcm9wVGFyZ2V0S2V5LFxuICAgICAgICBkYXRhOiBnZXRFbnRpdHkoX3RoaXMuc3RhdGUua2V5RW50aXRpZXMsIGRyb3BUYXJnZXRLZXkpLm5vZGVcbiAgICAgIH0pO1xuICAgICAgdmFyIGRyb3BUb0NoaWxkID0gZHJhZ0NoaWxkcmVuS2V5cy5pbmNsdWRlcyhkcm9wVGFyZ2V0S2V5KTtcbiAgICAgIHdhcm5pbmcoIWRyb3BUb0NoaWxkLCBcIkNhbiBub3QgZHJvcCB0byBkcmFnTm9kZSdzIGNoaWxkcmVuIG5vZGUuIFRoaXMgaXMgYSBidWcgb2YgcmMtdHJlZS4gUGxlYXNlIHJlcG9ydCBhbiBpc3N1ZS5cIik7XG4gICAgICB2YXIgcG9zQXJyID0gcG9zVG9BcnIoZHJvcFRhcmdldFBvcyk7XG4gICAgICB2YXIgZHJvcFJlc3VsdCA9IHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBub2RlOiBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEoYWJzdHJhY3REcm9wTm9kZVByb3BzKSxcbiAgICAgICAgZHJhZ05vZGU6IF90aGlzLmRyYWdOb2RlUHJvcHMgPyBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEoX3RoaXMuZHJhZ05vZGVQcm9wcykgOiBudWxsLFxuICAgICAgICBkcmFnTm9kZXNLZXlzOiBbX3RoaXMuZHJhZ05vZGVQcm9wcy5ldmVudEtleV0uY29uY2F0KGRyYWdDaGlsZHJlbktleXMpLFxuICAgICAgICBkcm9wVG9HYXA6IGRyb3BQb3NpdGlvbiAhPT0gMCxcbiAgICAgICAgZHJvcFBvc2l0aW9uOiBkcm9wUG9zaXRpb24gKyBOdW1iZXIocG9zQXJyW3Bvc0Fyci5sZW5ndGggLSAxXSlcbiAgICAgIH07XG4gICAgICBpZiAoIW91dHNpZGVUcmVlKSB7XG4gICAgICAgIG9uRHJvcCA9PT0gbnVsbCB8fCBvbkRyb3AgPT09IHZvaWQgMCB8fCBvbkRyb3AoZHJvcFJlc3VsdCk7XG4gICAgICB9XG4gICAgICBfdGhpcy5kcmFnTm9kZVByb3BzID0gbnVsbDtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiY2xlYW5EcmFnU3RhdGVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGRyYWdnaW5nTm9kZUtleSA9IF90aGlzLnN0YXRlLmRyYWdnaW5nTm9kZUtleTtcbiAgICAgIGlmIChkcmFnZ2luZ05vZGVLZXkgIT09IG51bGwpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nTm9kZUtleTogbnVsbCxcbiAgICAgICAgICBkcm9wUG9zaXRpb246IG51bGwsXG4gICAgICAgICAgZHJvcENvbnRhaW5lcktleTogbnVsbCxcbiAgICAgICAgICBkcm9wVGFyZ2V0S2V5OiBudWxsLFxuICAgICAgICAgIGRyb3BMZXZlbE9mZnNldDogbnVsbCxcbiAgICAgICAgICBkcm9wQWxsb3dlZDogdHJ1ZSxcbiAgICAgICAgICBkcmFnT3Zlck5vZGVLZXk6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBfdGhpcy5kcmFnU3RhcnRNb3VzZVBvc2l0aW9uID0gbnVsbDtcbiAgICAgIF90aGlzLmN1cnJlbnRNb3VzZU92ZXJEcm9wcGFibGVOb2RlS2V5ID0gbnVsbDtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidHJpZ2dlckV4cGFuZEFjdGlvbkV4cGFuZFwiLCBmdW5jdGlvbiAoZSwgdHJlZU5vZGUpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTUgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgZXhwYW5kZWRLZXlzID0gX3RoaXMkc3RhdGU1LmV4cGFuZGVkS2V5cyxcbiAgICAgICAgZmxhdHRlbk5vZGVzID0gX3RoaXMkc3RhdGU1LmZsYXR0ZW5Ob2RlcztcbiAgICAgIHZhciBleHBhbmRlZCA9IHRyZWVOb2RlLmV4cGFuZGVkLFxuICAgICAgICBrZXkgPSB0cmVlTm9kZS5rZXksXG4gICAgICAgIGlzTGVhZiA9IHRyZWVOb2RlLmlzTGVhZjtcbiAgICAgIGlmIChpc0xlYWYgfHwgZS5zaGlmdEtleSB8fCBlLm1ldGFLZXkgfHwgZS5jdHJsS2V5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBub2RlID0gZmxhdHRlbk5vZGVzLmZpbHRlcihmdW5jdGlvbiAobm9kZUl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIG5vZGVJdGVtLmtleSA9PT0ga2V5O1xuICAgICAgfSlbMF07XG4gICAgICB2YXIgZXZlbnROb2RlID0gY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ2V0VHJlZU5vZGVQcm9wcyhrZXksIF90aGlzLmdldFRyZWVOb2RlUmVxdWlyZWRQcm9wcygpKSksIHt9LCB7XG4gICAgICAgIGRhdGE6IG5vZGUuZGF0YVxuICAgICAgfSkpO1xuICAgICAgX3RoaXMuc2V0RXhwYW5kZWRLZXlzKGV4cGFuZGVkID8gYXJyRGVsKGV4cGFuZGVkS2V5cywga2V5KSA6IGFyckFkZChleHBhbmRlZEtleXMsIGtleSkpO1xuICAgICAgX3RoaXMub25Ob2RlRXhwYW5kKGUsIGV2ZW50Tm9kZSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uTm9kZUNsaWNrXCIsIGZ1bmN0aW9uIChlLCB0cmVlTm9kZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IF90aGlzLnByb3BzLFxuICAgICAgICBvbkNsaWNrID0gX3RoaXMkcHJvcHMzLm9uQ2xpY2ssXG4gICAgICAgIGV4cGFuZEFjdGlvbiA9IF90aGlzJHByb3BzMy5leHBhbmRBY3Rpb247XG4gICAgICBpZiAoZXhwYW5kQWN0aW9uID09PSAnY2xpY2snKSB7XG4gICAgICAgIF90aGlzLnRyaWdnZXJFeHBhbmRBY3Rpb25FeHBhbmQoZSwgdHJlZU5vZGUpO1xuICAgICAgfVxuICAgICAgb25DbGljayA9PT0gbnVsbCB8fCBvbkNsaWNrID09PSB2b2lkIDAgfHwgb25DbGljayhlLCB0cmVlTm9kZSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uTm9kZURvdWJsZUNsaWNrXCIsIGZ1bmN0aW9uIChlLCB0cmVlTm9kZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNCA9IF90aGlzLnByb3BzLFxuICAgICAgICBvbkRvdWJsZUNsaWNrID0gX3RoaXMkcHJvcHM0Lm9uRG91YmxlQ2xpY2ssXG4gICAgICAgIGV4cGFuZEFjdGlvbiA9IF90aGlzJHByb3BzNC5leHBhbmRBY3Rpb247XG4gICAgICBpZiAoZXhwYW5kQWN0aW9uID09PSAnZG91YmxlQ2xpY2snKSB7XG4gICAgICAgIF90aGlzLnRyaWdnZXJFeHBhbmRBY3Rpb25FeHBhbmQoZSwgdHJlZU5vZGUpO1xuICAgICAgfVxuICAgICAgb25Eb3VibGVDbGljayA9PT0gbnVsbCB8fCBvbkRvdWJsZUNsaWNrID09PSB2b2lkIDAgfHwgb25Eb3VibGVDbGljayhlLCB0cmVlTm9kZSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uTm9kZVNlbGVjdFwiLCBmdW5jdGlvbiAoZSwgdHJlZU5vZGUpIHtcbiAgICAgIHZhciBzZWxlY3RlZEtleXMgPSBfdGhpcy5zdGF0ZS5zZWxlY3RlZEtleXM7XG4gICAgICB2YXIgX3RoaXMkc3RhdGU2ID0gX3RoaXMuc3RhdGUsXG4gICAgICAgIGtleUVudGl0aWVzID0gX3RoaXMkc3RhdGU2LmtleUVudGl0aWVzLFxuICAgICAgICBmaWVsZE5hbWVzID0gX3RoaXMkc3RhdGU2LmZpZWxkTmFtZXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM1ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIG9uU2VsZWN0ID0gX3RoaXMkcHJvcHM1Lm9uU2VsZWN0LFxuICAgICAgICBtdWx0aXBsZSA9IF90aGlzJHByb3BzNS5tdWx0aXBsZTtcbiAgICAgIHZhciBzZWxlY3RlZCA9IHRyZWVOb2RlLnNlbGVjdGVkO1xuICAgICAgdmFyIGtleSA9IHRyZWVOb2RlW2ZpZWxkTmFtZXMua2V5XTtcbiAgICAgIHZhciB0YXJnZXRTZWxlY3RlZCA9ICFzZWxlY3RlZDtcblxuICAgICAgLy8gVXBkYXRlIHNlbGVjdGVkIGtleXNcbiAgICAgIGlmICghdGFyZ2V0U2VsZWN0ZWQpIHtcbiAgICAgICAgc2VsZWN0ZWRLZXlzID0gYXJyRGVsKHNlbGVjdGVkS2V5cywga2V5KTtcbiAgICAgIH0gZWxzZSBpZiAoIW11bHRpcGxlKSB7XG4gICAgICAgIHNlbGVjdGVkS2V5cyA9IFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWRLZXlzID0gYXJyQWRkKHNlbGVjdGVkS2V5cywga2V5KTtcbiAgICAgIH1cblxuICAgICAgLy8gW0xlZ2FjeV0gTm90IGZvdW5kIHJlbGF0ZWQgdXNhZ2UgaW4gZG9jIG9yIHVwcGVyIGxpYnNcbiAgICAgIHZhciBzZWxlY3RlZE5vZGVzID0gc2VsZWN0ZWRLZXlzLm1hcChmdW5jdGlvbiAoc2VsZWN0ZWRLZXkpIHtcbiAgICAgICAgdmFyIGVudGl0eSA9IGdldEVudGl0eShrZXlFbnRpdGllcywgc2VsZWN0ZWRLZXkpO1xuICAgICAgICByZXR1cm4gZW50aXR5ID8gZW50aXR5Lm5vZGUgOiBudWxsO1xuICAgICAgfSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgX3RoaXMuc2V0VW5jb250cm9sbGVkU3RhdGUoe1xuICAgICAgICBzZWxlY3RlZEtleXM6IHNlbGVjdGVkS2V5c1xuICAgICAgfSk7XG4gICAgICBvblNlbGVjdCA9PT0gbnVsbCB8fCBvblNlbGVjdCA9PT0gdm9pZCAwIHx8IG9uU2VsZWN0KHNlbGVjdGVkS2V5cywge1xuICAgICAgICBldmVudDogJ3NlbGVjdCcsXG4gICAgICAgIHNlbGVjdGVkOiB0YXJnZXRTZWxlY3RlZCxcbiAgICAgICAgbm9kZTogdHJlZU5vZGUsXG4gICAgICAgIHNlbGVjdGVkTm9kZXM6IHNlbGVjdGVkTm9kZXMsXG4gICAgICAgIG5hdGl2ZUV2ZW50OiBlLm5hdGl2ZUV2ZW50XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Ob2RlQ2hlY2tcIiwgZnVuY3Rpb24gKGUsIHRyZWVOb2RlLCBjaGVja2VkKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGU3ID0gX3RoaXMuc3RhdGUsXG4gICAgICAgIGtleUVudGl0aWVzID0gX3RoaXMkc3RhdGU3LmtleUVudGl0aWVzLFxuICAgICAgICBvcmlDaGVja2VkS2V5cyA9IF90aGlzJHN0YXRlNy5jaGVja2VkS2V5cyxcbiAgICAgICAgb3JpSGFsZkNoZWNrZWRLZXlzID0gX3RoaXMkc3RhdGU3LmhhbGZDaGVja2VkS2V5cztcbiAgICAgIHZhciBfdGhpcyRwcm9wczYgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgY2hlY2tTdHJpY3RseSA9IF90aGlzJHByb3BzNi5jaGVja1N0cmljdGx5LFxuICAgICAgICBvbkNoZWNrID0gX3RoaXMkcHJvcHM2Lm9uQ2hlY2s7XG4gICAgICB2YXIga2V5ID0gdHJlZU5vZGUua2V5O1xuXG4gICAgICAvLyBQcmVwYXJlIHRyaWdnZXIgYXJndW1lbnRzXG4gICAgICB2YXIgY2hlY2tlZE9iajtcbiAgICAgIHZhciBldmVudE9iaiA9IHtcbiAgICAgICAgZXZlbnQ6ICdjaGVjaycsXG4gICAgICAgIG5vZGU6IHRyZWVOb2RlLFxuICAgICAgICBjaGVja2VkOiBjaGVja2VkLFxuICAgICAgICBuYXRpdmVFdmVudDogZS5uYXRpdmVFdmVudFxuICAgICAgfTtcbiAgICAgIGlmIChjaGVja1N0cmljdGx5KSB7XG4gICAgICAgIHZhciBjaGVja2VkS2V5cyA9IGNoZWNrZWQgPyBhcnJBZGQob3JpQ2hlY2tlZEtleXMsIGtleSkgOiBhcnJEZWwob3JpQ2hlY2tlZEtleXMsIGtleSk7XG4gICAgICAgIHZhciBoYWxmQ2hlY2tlZEtleXMgPSBhcnJEZWwob3JpSGFsZkNoZWNrZWRLZXlzLCBrZXkpO1xuICAgICAgICBjaGVja2VkT2JqID0ge1xuICAgICAgICAgIGNoZWNrZWQ6IGNoZWNrZWRLZXlzLFxuICAgICAgICAgIGhhbGZDaGVja2VkOiBoYWxmQ2hlY2tlZEtleXNcbiAgICAgICAgfTtcbiAgICAgICAgZXZlbnRPYmouY2hlY2tlZE5vZGVzID0gY2hlY2tlZEtleXMubWFwKGZ1bmN0aW9uIChjaGVja2VkS2V5KSB7XG4gICAgICAgICAgcmV0dXJuIGdldEVudGl0eShrZXlFbnRpdGllcywgY2hlY2tlZEtleSk7XG4gICAgICAgIH0pLmZpbHRlcihCb29sZWFuKS5tYXAoZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICAgIHJldHVybiBlbnRpdHkubm9kZTtcbiAgICAgICAgfSk7XG4gICAgICAgIF90aGlzLnNldFVuY29udHJvbGxlZFN0YXRlKHtcbiAgICAgICAgICBjaGVja2VkS2V5czogY2hlY2tlZEtleXNcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBbHdheXMgZmlsbCBmaXJzdFxuICAgICAgICB2YXIgX2NvbmR1Y3RDaGVjayA9IGNvbmR1Y3RDaGVjayhbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KG9yaUNoZWNrZWRLZXlzKSwgW2tleV0pLCB0cnVlLCBrZXlFbnRpdGllcyksXG4gICAgICAgICAgX2NoZWNrZWRLZXlzID0gX2NvbmR1Y3RDaGVjay5jaGVja2VkS2V5cyxcbiAgICAgICAgICBfaGFsZkNoZWNrZWRLZXlzID0gX2NvbmR1Y3RDaGVjay5oYWxmQ2hlY2tlZEtleXM7XG5cbiAgICAgICAgLy8gSWYgcmVtb3ZlLCB3ZSBkbyBpdCBhZ2FpbiB0byBjb3JyZWN0aW9uXG4gICAgICAgIGlmICghY2hlY2tlZCkge1xuICAgICAgICAgIHZhciBrZXlTZXQgPSBuZXcgU2V0KF9jaGVja2VkS2V5cyk7XG4gICAgICAgICAga2V5U2V0LmRlbGV0ZShrZXkpO1xuICAgICAgICAgIHZhciBfY29uZHVjdENoZWNrMiA9IGNvbmR1Y3RDaGVjayhBcnJheS5mcm9tKGtleVNldCksIHtcbiAgICAgICAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgICAgICAgICAgaGFsZkNoZWNrZWRLZXlzOiBfaGFsZkNoZWNrZWRLZXlzXG4gICAgICAgICAgfSwga2V5RW50aXRpZXMpO1xuICAgICAgICAgIF9jaGVja2VkS2V5cyA9IF9jb25kdWN0Q2hlY2syLmNoZWNrZWRLZXlzO1xuICAgICAgICAgIF9oYWxmQ2hlY2tlZEtleXMgPSBfY29uZHVjdENoZWNrMi5oYWxmQ2hlY2tlZEtleXM7XG4gICAgICAgIH1cbiAgICAgICAgY2hlY2tlZE9iaiA9IF9jaGVja2VkS2V5cztcblxuICAgICAgICAvLyBbTGVnYWN5XSBUaGlzIGlzIHVzZWQgZm9yIGByYy10cmVlLXNlbGVjdGBcbiAgICAgICAgZXZlbnRPYmouY2hlY2tlZE5vZGVzID0gW107XG4gICAgICAgIGV2ZW50T2JqLmNoZWNrZWROb2Rlc1Bvc2l0aW9ucyA9IFtdO1xuICAgICAgICBldmVudE9iai5oYWxmQ2hlY2tlZEtleXMgPSBfaGFsZkNoZWNrZWRLZXlzO1xuICAgICAgICBfY2hlY2tlZEtleXMuZm9yRWFjaChmdW5jdGlvbiAoY2hlY2tlZEtleSkge1xuICAgICAgICAgIHZhciBlbnRpdHkgPSBnZXRFbnRpdHkoa2V5RW50aXRpZXMsIGNoZWNrZWRLZXkpO1xuICAgICAgICAgIGlmICghZW50aXR5KSByZXR1cm47XG4gICAgICAgICAgdmFyIG5vZGUgPSBlbnRpdHkubm9kZSxcbiAgICAgICAgICAgIHBvcyA9IGVudGl0eS5wb3M7XG4gICAgICAgICAgZXZlbnRPYmouY2hlY2tlZE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgZXZlbnRPYmouY2hlY2tlZE5vZGVzUG9zaXRpb25zLnB1c2goe1xuICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgIHBvczogcG9zXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBfdGhpcy5zZXRVbmNvbnRyb2xsZWRTdGF0ZSh7XG4gICAgICAgICAgY2hlY2tlZEtleXM6IF9jaGVja2VkS2V5c1xuICAgICAgICB9LCBmYWxzZSwge1xuICAgICAgICAgIGhhbGZDaGVja2VkS2V5czogX2hhbGZDaGVja2VkS2V5c1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIG9uQ2hlY2sgPT09IG51bGwgfHwgb25DaGVjayA9PT0gdm9pZCAwIHx8IG9uQ2hlY2soY2hlY2tlZE9iaiwgZXZlbnRPYmopO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbk5vZGVMb2FkXCIsIGZ1bmN0aW9uICh0cmVlTm9kZSkge1xuICAgICAgdmFyIF9lbnRpdHkkY2hpbGRyZW47XG4gICAgICB2YXIga2V5ID0gdHJlZU5vZGUua2V5O1xuICAgICAgdmFyIGtleUVudGl0aWVzID0gX3RoaXMuc3RhdGUua2V5RW50aXRpZXM7XG5cbiAgICAgIC8vIFNraXAgaWYgaGFzIGNoaWxkcmVuIGFscmVhZHlcbiAgICAgIHZhciBlbnRpdHkgPSBnZXRFbnRpdHkoa2V5RW50aXRpZXMsIGtleSk7XG4gICAgICBpZiAoZW50aXR5ICE9PSBudWxsICYmIGVudGl0eSAhPT0gdm9pZCAwICYmIChfZW50aXR5JGNoaWxkcmVuID0gZW50aXR5LmNoaWxkcmVuKSAhPT0gbnVsbCAmJiBfZW50aXR5JGNoaWxkcmVuICE9PSB2b2lkIDAgJiYgX2VudGl0eSRjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGxvYWRQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAvLyBXZSBuZWVkIHRvIGdldCB0aGUgbGF0ZXN0IHN0YXRlIG9mIGxvYWRpbmcvbG9hZGVkIGtleXNcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICB2YXIgX3JlZiRsb2FkZWRLZXlzID0gX3JlZi5sb2FkZWRLZXlzLFxuICAgICAgICAgICAgbG9hZGVkS2V5cyA9IF9yZWYkbG9hZGVkS2V5cyA9PT0gdm9pZCAwID8gW10gOiBfcmVmJGxvYWRlZEtleXMsXG4gICAgICAgICAgICBfcmVmJGxvYWRpbmdLZXlzID0gX3JlZi5sb2FkaW5nS2V5cyxcbiAgICAgICAgICAgIGxvYWRpbmdLZXlzID0gX3JlZiRsb2FkaW5nS2V5cyA9PT0gdm9pZCAwID8gW10gOiBfcmVmJGxvYWRpbmdLZXlzO1xuICAgICAgICAgIHZhciBfdGhpcyRwcm9wczcgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIGxvYWREYXRhID0gX3RoaXMkcHJvcHM3LmxvYWREYXRhLFxuICAgICAgICAgICAgb25Mb2FkID0gX3RoaXMkcHJvcHM3Lm9uTG9hZDtcbiAgICAgICAgICBpZiAoIWxvYWREYXRhIHx8IGxvYWRlZEtleXMuaW5jbHVkZXMoa2V5KSB8fCBsb2FkaW5nS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBQcm9jZXNzIGxvYWQgZGF0YVxuICAgICAgICAgIHZhciBwcm9taXNlID0gbG9hZERhdGEodHJlZU5vZGUpO1xuICAgICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudExvYWRlZEtleXMgPSBfdGhpcy5zdGF0ZS5sb2FkZWRLZXlzO1xuICAgICAgICAgICAgdmFyIG5ld0xvYWRlZEtleXMgPSBhcnJBZGQoY3VycmVudExvYWRlZEtleXMsIGtleSk7XG5cbiAgICAgICAgICAgIC8vIG9uTG9hZCBzaG91bGQgdHJpZ2dlciBiZWZvcmUgaW50ZXJuYWwgc2V0U3RhdGUgdG8gYXZvaWQgYGxvYWREYXRhYCB0cmlnZ2VyIHR3aWNlLlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTI0NjRcbiAgICAgICAgICAgIG9uTG9hZCA9PT0gbnVsbCB8fCBvbkxvYWQgPT09IHZvaWQgMCB8fCBvbkxvYWQobmV3TG9hZGVkS2V5cywge1xuICAgICAgICAgICAgICBldmVudDogJ2xvYWQnLFxuICAgICAgICAgICAgICBub2RlOiB0cmVlTm9kZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfdGhpcy5zZXRVbmNvbnRyb2xsZWRTdGF0ZSh7XG4gICAgICAgICAgICAgIGxvYWRlZEtleXM6IG5ld0xvYWRlZEtleXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGxvYWRpbmdLZXlzOiBhcnJEZWwocHJldlN0YXRlLmxvYWRpbmdLZXlzLCBrZXkpXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGxvYWRpbmdLZXlzOiBhcnJEZWwocHJldlN0YXRlLmxvYWRpbmdLZXlzLCBrZXkpXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gSWYgZXhjZWVkIG1heCByZXRyeSB0aW1lcywgd2UgZ2l2ZSB1cCByZXRyeVxuICAgICAgICAgICAgX3RoaXMubG9hZGluZ1JldHJ5VGltZXNba2V5XSA9IChfdGhpcy5sb2FkaW5nUmV0cnlUaW1lc1trZXldIHx8IDApICsgMTtcbiAgICAgICAgICAgIGlmIChfdGhpcy5sb2FkaW5nUmV0cnlUaW1lc1trZXldID49IE1BWF9SRVRSWV9USU1FUykge1xuICAgICAgICAgICAgICB2YXIgY3VycmVudExvYWRlZEtleXMgPSBfdGhpcy5zdGF0ZS5sb2FkZWRLZXlzO1xuICAgICAgICAgICAgICB3YXJuaW5nKGZhbHNlLCAnUmV0cnkgZm9yIGBsb2FkRGF0YWAgbWFueSB0aW1lcyBidXQgc3RpbGwgZmFpbGVkLiBObyBtb3JlIHJldHJ5LicpO1xuICAgICAgICAgICAgICBfdGhpcy5zZXRVbmNvbnRyb2xsZWRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgbG9hZGVkS2V5czogYXJyQWRkKGN1cnJlbnRMb2FkZWRLZXlzLCBrZXkpXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxvYWRpbmdLZXlzOiBhcnJBZGQobG9hZGluZ0tleXMsIGtleSlcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBOb3QgY2FyZSB3YXJuaW5nIGlmIHdlIGlnbm9yZSB0aGlzXG4gICAgICBsb2FkUHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG4gICAgICByZXR1cm4gbG9hZFByb21pc2U7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uTm9kZU1vdXNlRW50ZXJcIiwgZnVuY3Rpb24gKGV2ZW50LCBub2RlKSB7XG4gICAgICB2YXIgb25Nb3VzZUVudGVyID0gX3RoaXMucHJvcHMub25Nb3VzZUVudGVyO1xuICAgICAgb25Nb3VzZUVudGVyID09PSBudWxsIHx8IG9uTW91c2VFbnRlciA9PT0gdm9pZCAwIHx8IG9uTW91c2VFbnRlcih7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbm9kZTogbm9kZVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uTm9kZU1vdXNlTGVhdmVcIiwgZnVuY3Rpb24gKGV2ZW50LCBub2RlKSB7XG4gICAgICB2YXIgb25Nb3VzZUxlYXZlID0gX3RoaXMucHJvcHMub25Nb3VzZUxlYXZlO1xuICAgICAgb25Nb3VzZUxlYXZlID09PSBudWxsIHx8IG9uTW91c2VMZWF2ZSA9PT0gdm9pZCAwIHx8IG9uTW91c2VMZWF2ZSh7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbm9kZTogbm9kZVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uTm9kZUNvbnRleHRNZW51XCIsIGZ1bmN0aW9uIChldmVudCwgbm9kZSkge1xuICAgICAgdmFyIG9uUmlnaHRDbGljayA9IF90aGlzLnByb3BzLm9uUmlnaHRDbGljaztcbiAgICAgIGlmIChvblJpZ2h0Q2xpY2spIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb25SaWdodENsaWNrKHtcbiAgICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgICAgbm9kZTogbm9kZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Gb2N1c1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgb25Gb2N1cyA9IF90aGlzLnByb3BzLm9uRm9jdXM7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZvY3VzZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cbiAgICAgIG9uRm9jdXMgPT09IG51bGwgfHwgb25Gb2N1cyA9PT0gdm9pZCAwIHx8IG9uRm9jdXMuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25CbHVyXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBvbkJsdXIgPSBfdGhpcy5wcm9wcy5vbkJsdXI7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIF90aGlzLm9uQWN0aXZlQ2hhbmdlKG51bGwpO1xuICAgICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4zKSwgX2tleTMgPSAwOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgICAgIH1cbiAgICAgIG9uQmx1ciA9PT0gbnVsbCB8fCBvbkJsdXIgPT09IHZvaWQgMCB8fCBvbkJsdXIuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZ2V0VHJlZU5vZGVSZXF1aXJlZFByb3BzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTggPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgZXhwYW5kZWRLZXlzID0gX3RoaXMkc3RhdGU4LmV4cGFuZGVkS2V5cyxcbiAgICAgICAgc2VsZWN0ZWRLZXlzID0gX3RoaXMkc3RhdGU4LnNlbGVjdGVkS2V5cyxcbiAgICAgICAgbG9hZGVkS2V5cyA9IF90aGlzJHN0YXRlOC5sb2FkZWRLZXlzLFxuICAgICAgICBsb2FkaW5nS2V5cyA9IF90aGlzJHN0YXRlOC5sb2FkaW5nS2V5cyxcbiAgICAgICAgY2hlY2tlZEtleXMgPSBfdGhpcyRzdGF0ZTguY2hlY2tlZEtleXMsXG4gICAgICAgIGhhbGZDaGVja2VkS2V5cyA9IF90aGlzJHN0YXRlOC5oYWxmQ2hlY2tlZEtleXMsXG4gICAgICAgIGRyYWdPdmVyTm9kZUtleSA9IF90aGlzJHN0YXRlOC5kcmFnT3Zlck5vZGVLZXksXG4gICAgICAgIGRyb3BQb3NpdGlvbiA9IF90aGlzJHN0YXRlOC5kcm9wUG9zaXRpb24sXG4gICAgICAgIGtleUVudGl0aWVzID0gX3RoaXMkc3RhdGU4LmtleUVudGl0aWVzO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhwYW5kZWRLZXlzOiBleHBhbmRlZEtleXMgfHwgW10sXG4gICAgICAgIHNlbGVjdGVkS2V5czogc2VsZWN0ZWRLZXlzIHx8IFtdLFxuICAgICAgICBsb2FkZWRLZXlzOiBsb2FkZWRLZXlzIHx8IFtdLFxuICAgICAgICBsb2FkaW5nS2V5czogbG9hZGluZ0tleXMgfHwgW10sXG4gICAgICAgIGNoZWNrZWRLZXlzOiBjaGVja2VkS2V5cyB8fCBbXSxcbiAgICAgICAgaGFsZkNoZWNrZWRLZXlzOiBoYWxmQ2hlY2tlZEtleXMgfHwgW10sXG4gICAgICAgIGRyYWdPdmVyTm9kZUtleTogZHJhZ092ZXJOb2RlS2V5LFxuICAgICAgICBkcm9wUG9zaXRpb246IGRyb3BQb3NpdGlvbixcbiAgICAgICAga2V5RW50aXRpZXM6IGtleUVudGl0aWVzXG4gICAgICB9O1xuICAgIH0pO1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHBhbmRlZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvKiogU2V0IHVuY29udHJvbGxlZCBgZXhwYW5kZWRLZXlzYC4gVGhpcyB3aWxsIGFsc28gYXV0byB1cGRhdGUgYGZsYXR0ZW5Ob2Rlc2AuICovXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInNldEV4cGFuZGVkS2V5c1wiLCBmdW5jdGlvbiAoZXhwYW5kZWRLZXlzKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGU5ID0gX3RoaXMuc3RhdGUsXG4gICAgICAgIHRyZWVEYXRhID0gX3RoaXMkc3RhdGU5LnRyZWVEYXRhLFxuICAgICAgICBmaWVsZE5hbWVzID0gX3RoaXMkc3RhdGU5LmZpZWxkTmFtZXM7XG4gICAgICB2YXIgZmxhdHRlbk5vZGVzID0gZmxhdHRlblRyZWVEYXRhKHRyZWVEYXRhLCBleHBhbmRlZEtleXMsIGZpZWxkTmFtZXMpO1xuICAgICAgX3RoaXMuc2V0VW5jb250cm9sbGVkU3RhdGUoe1xuICAgICAgICBleHBhbmRlZEtleXM6IGV4cGFuZGVkS2V5cyxcbiAgICAgICAgZmxhdHRlbk5vZGVzOiBmbGF0dGVuTm9kZXNcbiAgICAgIH0sIHRydWUpO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbk5vZGVFeHBhbmRcIiwgZnVuY3Rpb24gKGUsIHRyZWVOb2RlKSB7XG4gICAgICB2YXIgZXhwYW5kZWRLZXlzID0gX3RoaXMuc3RhdGUuZXhwYW5kZWRLZXlzO1xuICAgICAgdmFyIF90aGlzJHN0YXRlMTAgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgbGlzdENoYW5naW5nID0gX3RoaXMkc3RhdGUxMC5saXN0Q2hhbmdpbmcsXG4gICAgICAgIGZpZWxkTmFtZXMgPSBfdGhpcyRzdGF0ZTEwLmZpZWxkTmFtZXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM4ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIG9uRXhwYW5kID0gX3RoaXMkcHJvcHM4Lm9uRXhwYW5kLFxuICAgICAgICBsb2FkRGF0YSA9IF90aGlzJHByb3BzOC5sb2FkRGF0YTtcbiAgICAgIHZhciBleHBhbmRlZCA9IHRyZWVOb2RlLmV4cGFuZGVkO1xuICAgICAgdmFyIGtleSA9IHRyZWVOb2RlW2ZpZWxkTmFtZXMua2V5XTtcblxuICAgICAgLy8gRG8gbm90aGluZyB3aGVuIG1vdGlvbiBpcyBpbiBwcm9ncmVzc1xuICAgICAgaWYgKGxpc3RDaGFuZ2luZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBzZWxlY3RlZCBrZXlzXG4gICAgICB2YXIgY2VydGFpbiA9IGV4cGFuZGVkS2V5cy5pbmNsdWRlcyhrZXkpO1xuICAgICAgdmFyIHRhcmdldEV4cGFuZGVkID0gIWV4cGFuZGVkO1xuICAgICAgd2FybmluZyhleHBhbmRlZCAmJiBjZXJ0YWluIHx8ICFleHBhbmRlZCAmJiAhY2VydGFpbiwgJ0V4cGFuZCBzdGF0ZSBub3Qgc3luYyB3aXRoIGluZGV4IGNoZWNrJyk7XG4gICAgICBleHBhbmRlZEtleXMgPSB0YXJnZXRFeHBhbmRlZCA/IGFyckFkZChleHBhbmRlZEtleXMsIGtleSkgOiBhcnJEZWwoZXhwYW5kZWRLZXlzLCBrZXkpO1xuICAgICAgX3RoaXMuc2V0RXhwYW5kZWRLZXlzKGV4cGFuZGVkS2V5cyk7XG4gICAgICBvbkV4cGFuZCA9PT0gbnVsbCB8fCBvbkV4cGFuZCA9PT0gdm9pZCAwIHx8IG9uRXhwYW5kKGV4cGFuZGVkS2V5cywge1xuICAgICAgICBub2RlOiB0cmVlTm9kZSxcbiAgICAgICAgZXhwYW5kZWQ6IHRhcmdldEV4cGFuZGVkLFxuICAgICAgICBuYXRpdmVFdmVudDogZS5uYXRpdmVFdmVudFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEFzeW5jIExvYWQgZGF0YVxuICAgICAgaWYgKHRhcmdldEV4cGFuZGVkICYmIGxvYWREYXRhKSB7XG4gICAgICAgIHZhciBsb2FkUHJvbWlzZSA9IF90aGlzLm9uTm9kZUxvYWQodHJlZU5vZGUpO1xuICAgICAgICBpZiAobG9hZFByb21pc2UpIHtcbiAgICAgICAgICBsb2FkUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIFtMZWdhY3ldIFJlZnJlc2ggbG9naWNcbiAgICAgICAgICAgIHZhciBuZXdGbGF0dGVuVHJlZURhdGEgPSBmbGF0dGVuVHJlZURhdGEoX3RoaXMuc3RhdGUudHJlZURhdGEsIGV4cGFuZGVkS2V5cywgZmllbGROYW1lcyk7XG4gICAgICAgICAgICBfdGhpcy5zZXRVbmNvbnRyb2xsZWRTdGF0ZSh7XG4gICAgICAgICAgICAgIGZsYXR0ZW5Ob2RlczogbmV3RmxhdHRlblRyZWVEYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudEV4cGFuZGVkS2V5cyA9IF90aGlzLnN0YXRlLmV4cGFuZGVkS2V5cztcbiAgICAgICAgICAgIHZhciBleHBhbmRlZEtleXNUb1Jlc3RvcmUgPSBhcnJEZWwoY3VycmVudEV4cGFuZGVkS2V5cywga2V5KTtcbiAgICAgICAgICAgIF90aGlzLnNldEV4cGFuZGVkS2V5cyhleHBhbmRlZEtleXNUb1Jlc3RvcmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uTGlzdENoYW5nZVN0YXJ0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnNldFVuY29udHJvbGxlZFN0YXRlKHtcbiAgICAgICAgbGlzdENoYW5naW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25MaXN0Q2hhbmdlRW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy5zZXRVbmNvbnRyb2xsZWRTdGF0ZSh7XG4gICAgICAgICAgbGlzdENoYW5naW5nOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBLZXlib2FyZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25BY3RpdmVDaGFuZ2VcIiwgZnVuY3Rpb24gKG5ld0FjdGl2ZUtleSkge1xuICAgICAgdmFyIGFjdGl2ZUtleSA9IF90aGlzLnN0YXRlLmFjdGl2ZUtleTtcbiAgICAgIHZhciBfdGhpcyRwcm9wczkgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgb25BY3RpdmVDaGFuZ2UgPSBfdGhpcyRwcm9wczkub25BY3RpdmVDaGFuZ2UsXG4gICAgICAgIF90aGlzJHByb3BzOSRpdGVtU2NybyA9IF90aGlzJHByb3BzOS5pdGVtU2Nyb2xsT2Zmc2V0LFxuICAgICAgICBpdGVtU2Nyb2xsT2Zmc2V0ID0gX3RoaXMkcHJvcHM5JGl0ZW1TY3JvID09PSB2b2lkIDAgPyAwIDogX3RoaXMkcHJvcHM5JGl0ZW1TY3JvO1xuICAgICAgaWYgKGFjdGl2ZUtleSA9PT0gbmV3QWN0aXZlS2V5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgYWN0aXZlS2V5OiBuZXdBY3RpdmVLZXlcbiAgICAgIH0pO1xuICAgICAgaWYgKG5ld0FjdGl2ZUtleSAhPT0gbnVsbCkge1xuICAgICAgICBfdGhpcy5zY3JvbGxUbyh7XG4gICAgICAgICAga2V5OiBuZXdBY3RpdmVLZXksXG4gICAgICAgICAgb2Zmc2V0OiBpdGVtU2Nyb2xsT2Zmc2V0XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgb25BY3RpdmVDaGFuZ2UgPT09IG51bGwgfHwgb25BY3RpdmVDaGFuZ2UgPT09IHZvaWQgMCB8fCBvbkFjdGl2ZUNoYW5nZShuZXdBY3RpdmVLZXkpO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJnZXRBY3RpdmVJdGVtXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTExID0gX3RoaXMuc3RhdGUsXG4gICAgICAgIGFjdGl2ZUtleSA9IF90aGlzJHN0YXRlMTEuYWN0aXZlS2V5LFxuICAgICAgICBmbGF0dGVuTm9kZXMgPSBfdGhpcyRzdGF0ZTExLmZsYXR0ZW5Ob2RlcztcbiAgICAgIGlmIChhY3RpdmVLZXkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmxhdHRlbk5vZGVzLmZpbmQoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgIHZhciBrZXkgPSBfcmVmMi5rZXk7XG4gICAgICAgIHJldHVybiBrZXkgPT09IGFjdGl2ZUtleTtcbiAgICAgIH0pIHx8IG51bGw7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9mZnNldEFjdGl2ZUtleVwiLCBmdW5jdGlvbiAob2Zmc2V0KSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUxMiA9IF90aGlzLnN0YXRlLFxuICAgICAgICBmbGF0dGVuTm9kZXMgPSBfdGhpcyRzdGF0ZTEyLmZsYXR0ZW5Ob2RlcyxcbiAgICAgICAgYWN0aXZlS2V5ID0gX3RoaXMkc3RhdGUxMi5hY3RpdmVLZXk7XG4gICAgICB2YXIgaW5kZXggPSBmbGF0dGVuTm9kZXMuZmluZEluZGV4KGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIga2V5ID0gX3JlZjMua2V5O1xuICAgICAgICByZXR1cm4ga2V5ID09PSBhY3RpdmVLZXk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxpZ24gd2l0aCBpbmRleFxuICAgICAgaWYgKGluZGV4ID09PSAtMSAmJiBvZmZzZXQgPCAwKSB7XG4gICAgICAgIGluZGV4ID0gZmxhdHRlbk5vZGVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGluZGV4ID0gKGluZGV4ICsgb2Zmc2V0ICsgZmxhdHRlbk5vZGVzLmxlbmd0aCkgJSBmbGF0dGVuTm9kZXMubGVuZ3RoO1xuICAgICAgdmFyIGl0ZW0gPSBmbGF0dGVuTm9kZXNbaW5kZXhdO1xuICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgdmFyIF9rZXk0ID0gaXRlbS5rZXk7XG4gICAgICAgIF90aGlzLm9uQWN0aXZlQ2hhbmdlKF9rZXk0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLm9uQWN0aXZlQ2hhbmdlKG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbktleURvd25cIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUxMyA9IF90aGlzLnN0YXRlLFxuICAgICAgICBhY3RpdmVLZXkgPSBfdGhpcyRzdGF0ZTEzLmFjdGl2ZUtleSxcbiAgICAgICAgZXhwYW5kZWRLZXlzID0gX3RoaXMkc3RhdGUxMy5leHBhbmRlZEtleXMsXG4gICAgICAgIGNoZWNrZWRLZXlzID0gX3RoaXMkc3RhdGUxMy5jaGVja2VkS2V5cyxcbiAgICAgICAgZmllbGROYW1lcyA9IF90aGlzJHN0YXRlMTMuZmllbGROYW1lcztcbiAgICAgIHZhciBfdGhpcyRwcm9wczEwID0gX3RoaXMucHJvcHMsXG4gICAgICAgIG9uS2V5RG93biA9IF90aGlzJHByb3BzMTAub25LZXlEb3duLFxuICAgICAgICBjaGVja2FibGUgPSBfdGhpcyRwcm9wczEwLmNoZWNrYWJsZSxcbiAgICAgICAgc2VsZWN0YWJsZSA9IF90aGlzJHByb3BzMTAuc2VsZWN0YWJsZTtcblxuICAgICAgLy8gPj4+Pj4+Pj4+PiBEaXJlY3Rpb25cbiAgICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHtcbiAgICAgICAgY2FzZSBLZXlDb2RlLlVQOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIF90aGlzLm9mZnNldEFjdGl2ZUtleSgtMSk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIEtleUNvZGUuRE9XTjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBfdGhpcy5vZmZzZXRBY3RpdmVLZXkoMSk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyA+Pj4+Pj4+Pj4+IEV4cGFuZCAmIFNlbGVjdGlvblxuICAgICAgdmFyIGFjdGl2ZUl0ZW0gPSBfdGhpcy5nZXRBY3RpdmVJdGVtKCk7XG4gICAgICBpZiAoYWN0aXZlSXRlbSAmJiBhY3RpdmVJdGVtLmRhdGEpIHtcbiAgICAgICAgdmFyIHRyZWVOb2RlUmVxdWlyZWRQcm9wcyA9IF90aGlzLmdldFRyZWVOb2RlUmVxdWlyZWRQcm9wcygpO1xuICAgICAgICB2YXIgZXhwYW5kYWJsZSA9IGFjdGl2ZUl0ZW0uZGF0YS5pc0xlYWYgPT09IGZhbHNlIHx8ICEhKGFjdGl2ZUl0ZW0uZGF0YVtmaWVsZE5hbWVzLmNoaWxkcmVuXSB8fCBbXSkubGVuZ3RoO1xuICAgICAgICB2YXIgZXZlbnROb2RlID0gY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ2V0VHJlZU5vZGVQcm9wcyhhY3RpdmVLZXksIHRyZWVOb2RlUmVxdWlyZWRQcm9wcykpLCB7fSwge1xuICAgICAgICAgIGRhdGE6IGFjdGl2ZUl0ZW0uZGF0YSxcbiAgICAgICAgICBhY3RpdmU6IHRydWVcbiAgICAgICAgfSkpO1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LndoaWNoKSB7XG4gICAgICAgICAgLy8gPj4+IEV4cGFuZFxuICAgICAgICAgIGNhc2UgS2V5Q29kZS5MRUZUOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBDb2xsYXBzZSBpZiBwb3NzaWJsZVxuICAgICAgICAgICAgICBpZiAoZXhwYW5kYWJsZSAmJiBleHBhbmRlZEtleXMuaW5jbHVkZXMoYWN0aXZlS2V5KSkge1xuICAgICAgICAgICAgICAgIF90aGlzLm9uTm9kZUV4cGFuZCh7fSwgZXZlbnROb2RlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3RpdmVJdGVtLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIF90aGlzLm9uQWN0aXZlQ2hhbmdlKGFjdGl2ZUl0ZW0ucGFyZW50LmtleSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBLZXlDb2RlLlJJR0hUOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBFeHBhbmQgaWYgcG9zc2libGVcbiAgICAgICAgICAgICAgaWYgKGV4cGFuZGFibGUgJiYgIWV4cGFuZGVkS2V5cy5pbmNsdWRlcyhhY3RpdmVLZXkpKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMub25Ob2RlRXhwYW5kKHt9LCBldmVudE5vZGUpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZUl0ZW0uY2hpbGRyZW4gJiYgYWN0aXZlSXRlbS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5vbkFjdGl2ZUNoYW5nZShhY3RpdmVJdGVtLmNoaWxkcmVuWzBdLmtleSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZWxlY3Rpb25cbiAgICAgICAgICBjYXNlIEtleUNvZGUuRU5URVI6XG4gICAgICAgICAgY2FzZSBLZXlDb2RlLlNQQUNFOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoY2hlY2thYmxlICYmICFldmVudE5vZGUuZGlzYWJsZWQgJiYgZXZlbnROb2RlLmNoZWNrYWJsZSAhPT0gZmFsc2UgJiYgIWV2ZW50Tm9kZS5kaXNhYmxlQ2hlY2tib3gpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5vbk5vZGVDaGVjayh7fSwgZXZlbnROb2RlLCAhY2hlY2tlZEtleXMuaW5jbHVkZXMoYWN0aXZlS2V5KSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNoZWNrYWJsZSAmJiBzZWxlY3RhYmxlICYmICFldmVudE5vZGUuZGlzYWJsZWQgJiYgZXZlbnROb2RlLnNlbGVjdGFibGUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMub25Ob2RlU2VsZWN0KHt9LCBldmVudE5vZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvbktleURvd24gPT09IG51bGwgfHwgb25LZXlEb3duID09PSB2b2lkIDAgfHwgb25LZXlEb3duKGV2ZW50KTtcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBPbmx5IHVwZGF0ZSB0aGUgdmFsdWUgd2hpY2ggaXMgbm90IGluIHByb3BzXG4gICAgICovXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInNldFVuY29udHJvbGxlZFN0YXRlXCIsIGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgdmFyIGF0b21pYyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgICB2YXIgZm9yY2VTdGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgICAgIGlmICghX3RoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHZhciBuZWVkU3luYyA9IGZhbHNlO1xuICAgICAgICB2YXIgYWxsUGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgdmFyIG5ld1N0YXRlID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKHN0YXRlKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgaWYgKF90aGlzLnByb3BzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICBhbGxQYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmVlZFN5bmMgPSB0cnVlO1xuICAgICAgICAgIG5ld1N0YXRlW25hbWVdID0gc3RhdGVbbmFtZV07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobmVlZFN5bmMgJiYgKCFhdG9taWMgfHwgYWxsUGFzc2VkKSkge1xuICAgICAgICAgIF90aGlzLnNldFN0YXRlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbmV3U3RhdGUpLCBmb3JjZVN0YXRlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwic2Nyb2xsVG9cIiwgZnVuY3Rpb24gKHNjcm9sbCkge1xuICAgICAgX3RoaXMubGlzdFJlZi5jdXJyZW50LnNjcm9sbFRvKHNjcm9sbCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhUcmVlLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgICB0aGlzLm9uVXBkYXRlZCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgdGhpcy5vblVwZGF0ZWQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25VcGRhdGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uVXBkYXRlZCgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczExID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYWN0aXZlS2V5ID0gX3RoaXMkcHJvcHMxMS5hY3RpdmVLZXksXG4gICAgICAgIF90aGlzJHByb3BzMTEkaXRlbVNjciA9IF90aGlzJHByb3BzMTEuaXRlbVNjcm9sbE9mZnNldCxcbiAgICAgICAgaXRlbVNjcm9sbE9mZnNldCA9IF90aGlzJHByb3BzMTEkaXRlbVNjciA9PT0gdm9pZCAwID8gMCA6IF90aGlzJHByb3BzMTEkaXRlbVNjcjtcbiAgICAgIGlmIChhY3RpdmVLZXkgIT09IHVuZGVmaW5lZCAmJiBhY3RpdmVLZXkgIT09IHRoaXMuc3RhdGUuYWN0aXZlS2V5KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGFjdGl2ZUtleTogYWN0aXZlS2V5XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYWN0aXZlS2V5ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5zY3JvbGxUbyh7XG4gICAgICAgICAgICBrZXk6IGFjdGl2ZUtleSxcbiAgICAgICAgICAgIG9mZnNldDogaXRlbVNjcm9sbE9mZnNldFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCB0aGlzLm9uV2luZG93RHJhZ0VuZCk7XG4gICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlc2V0RHJhZ1N0YXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0RHJhZ1N0YXRlKCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdPdmVyTm9kZUtleTogbnVsbCxcbiAgICAgICAgZHJvcFBvc2l0aW9uOiBudWxsLFxuICAgICAgICBkcm9wTGV2ZWxPZmZzZXQ6IG51bGwsXG4gICAgICAgIGRyb3BUYXJnZXRLZXk6IG51bGwsXG4gICAgICAgIGRyb3BDb250YWluZXJLZXk6IG51bGwsXG4gICAgICAgIGRyb3BUYXJnZXRQb3M6IG51bGwsXG4gICAgICAgIGRyb3BBbGxvd2VkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUxNCA9IHRoaXMuc3RhdGUsXG4gICAgICAgIGZvY3VzZWQgPSBfdGhpcyRzdGF0ZTE0LmZvY3VzZWQsXG4gICAgICAgIGZsYXR0ZW5Ob2RlcyA9IF90aGlzJHN0YXRlMTQuZmxhdHRlbk5vZGVzLFxuICAgICAgICBrZXlFbnRpdGllcyA9IF90aGlzJHN0YXRlMTQua2V5RW50aXRpZXMsXG4gICAgICAgIGRyYWdnaW5nTm9kZUtleSA9IF90aGlzJHN0YXRlMTQuZHJhZ2dpbmdOb2RlS2V5LFxuICAgICAgICBhY3RpdmVLZXkgPSBfdGhpcyRzdGF0ZTE0LmFjdGl2ZUtleSxcbiAgICAgICAgZHJvcExldmVsT2Zmc2V0ID0gX3RoaXMkc3RhdGUxNC5kcm9wTGV2ZWxPZmZzZXQsXG4gICAgICAgIGRyb3BDb250YWluZXJLZXkgPSBfdGhpcyRzdGF0ZTE0LmRyb3BDb250YWluZXJLZXksXG4gICAgICAgIGRyb3BUYXJnZXRLZXkgPSBfdGhpcyRzdGF0ZTE0LmRyb3BUYXJnZXRLZXksXG4gICAgICAgIGRyb3BQb3NpdGlvbiA9IF90aGlzJHN0YXRlMTQuZHJvcFBvc2l0aW9uLFxuICAgICAgICBkcmFnT3Zlck5vZGVLZXkgPSBfdGhpcyRzdGF0ZTE0LmRyYWdPdmVyTm9kZUtleSxcbiAgICAgICAgaW5kZW50ID0gX3RoaXMkc3RhdGUxNC5pbmRlbnQ7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMxMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzMTIucHJlZml4Q2xzLFxuICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczEyLmNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczEyLnN0eWxlLFxuICAgICAgICBzaG93TGluZSA9IF90aGlzJHByb3BzMTIuc2hvd0xpbmUsXG4gICAgICAgIGZvY3VzYWJsZSA9IF90aGlzJHByb3BzMTIuZm9jdXNhYmxlLFxuICAgICAgICBfdGhpcyRwcm9wczEyJHRhYkluZGUgPSBfdGhpcyRwcm9wczEyLnRhYkluZGV4LFxuICAgICAgICB0YWJJbmRleCA9IF90aGlzJHByb3BzMTIkdGFiSW5kZSA9PT0gdm9pZCAwID8gMCA6IF90aGlzJHByb3BzMTIkdGFiSW5kZSxcbiAgICAgICAgc2VsZWN0YWJsZSA9IF90aGlzJHByb3BzMTIuc2VsZWN0YWJsZSxcbiAgICAgICAgc2hvd0ljb24gPSBfdGhpcyRwcm9wczEyLnNob3dJY29uLFxuICAgICAgICBpY29uID0gX3RoaXMkcHJvcHMxMi5pY29uLFxuICAgICAgICBzd2l0Y2hlckljb24gPSBfdGhpcyRwcm9wczEyLnN3aXRjaGVySWNvbixcbiAgICAgICAgZHJhZ2dhYmxlID0gX3RoaXMkcHJvcHMxMi5kcmFnZ2FibGUsXG4gICAgICAgIGNoZWNrYWJsZSA9IF90aGlzJHByb3BzMTIuY2hlY2thYmxlLFxuICAgICAgICBjaGVja1N0cmljdGx5ID0gX3RoaXMkcHJvcHMxMi5jaGVja1N0cmljdGx5LFxuICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzMTIuZGlzYWJsZWQsXG4gICAgICAgIG1vdGlvbiA9IF90aGlzJHByb3BzMTIubW90aW9uLFxuICAgICAgICBsb2FkRGF0YSA9IF90aGlzJHByb3BzMTIubG9hZERhdGEsXG4gICAgICAgIGZpbHRlclRyZWVOb2RlID0gX3RoaXMkcHJvcHMxMi5maWx0ZXJUcmVlTm9kZSxcbiAgICAgICAgaGVpZ2h0ID0gX3RoaXMkcHJvcHMxMi5oZWlnaHQsXG4gICAgICAgIGl0ZW1IZWlnaHQgPSBfdGhpcyRwcm9wczEyLml0ZW1IZWlnaHQsXG4gICAgICAgIHNjcm9sbFdpZHRoID0gX3RoaXMkcHJvcHMxMi5zY3JvbGxXaWR0aCxcbiAgICAgICAgdmlydHVhbCA9IF90aGlzJHByb3BzMTIudmlydHVhbCxcbiAgICAgICAgdGl0bGVSZW5kZXIgPSBfdGhpcyRwcm9wczEyLnRpdGxlUmVuZGVyLFxuICAgICAgICBkcm9wSW5kaWNhdG9yUmVuZGVyID0gX3RoaXMkcHJvcHMxMi5kcm9wSW5kaWNhdG9yUmVuZGVyLFxuICAgICAgICBvbkNvbnRleHRNZW51ID0gX3RoaXMkcHJvcHMxMi5vbkNvbnRleHRNZW51LFxuICAgICAgICBvblNjcm9sbCA9IF90aGlzJHByb3BzMTIub25TY3JvbGwsXG4gICAgICAgIGRpcmVjdGlvbiA9IF90aGlzJHByb3BzMTIuZGlyZWN0aW9uLFxuICAgICAgICByb290Q2xhc3NOYW1lID0gX3RoaXMkcHJvcHMxMi5yb290Q2xhc3NOYW1lLFxuICAgICAgICByb290U3R5bGUgPSBfdGhpcyRwcm9wczEyLnJvb3RTdHlsZTtcbiAgICAgIHZhciBkb21Qcm9wcyA9IHBpY2tBdHRycyh0aGlzLnByb3BzLCB7XG4gICAgICAgIGFyaWE6IHRydWUsXG4gICAgICAgIGRhdGE6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJdCdzIGJldHRlciBtb3ZlIHRvIGhvb2tzIGJ1dCB3ZSBqdXN0IHNpbXBseSBrZWVwIGhlcmVcbiAgICAgIHZhciBkcmFnZ2FibGVDb25maWc7XG4gICAgICBpZiAoZHJhZ2dhYmxlKSB7XG4gICAgICAgIGlmIChfdHlwZW9mKGRyYWdnYWJsZSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZHJhZ2dhYmxlQ29uZmlnID0gZHJhZ2dhYmxlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkcmFnZ2FibGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBkcmFnZ2FibGVDb25maWcgPSB7XG4gICAgICAgICAgICBub2RlRHJhZ2dhYmxlOiBkcmFnZ2FibGVcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRyYWdnYWJsZUNvbmZpZyA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgY29udGV4dFZhbHVlID0ge1xuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgc2VsZWN0YWJsZTogc2VsZWN0YWJsZSxcbiAgICAgICAgc2hvd0ljb246IHNob3dJY29uLFxuICAgICAgICBpY29uOiBpY29uLFxuICAgICAgICBzd2l0Y2hlckljb246IHN3aXRjaGVySWNvbixcbiAgICAgICAgZHJhZ2dhYmxlOiBkcmFnZ2FibGVDb25maWcsXG4gICAgICAgIGRyYWdnaW5nTm9kZUtleTogZHJhZ2dpbmdOb2RlS2V5LFxuICAgICAgICBjaGVja2FibGU6IGNoZWNrYWJsZSxcbiAgICAgICAgY2hlY2tTdHJpY3RseTogY2hlY2tTdHJpY3RseSxcbiAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICBrZXlFbnRpdGllczoga2V5RW50aXRpZXMsXG4gICAgICAgIGRyb3BMZXZlbE9mZnNldDogZHJvcExldmVsT2Zmc2V0LFxuICAgICAgICBkcm9wQ29udGFpbmVyS2V5OiBkcm9wQ29udGFpbmVyS2V5LFxuICAgICAgICBkcm9wVGFyZ2V0S2V5OiBkcm9wVGFyZ2V0S2V5LFxuICAgICAgICBkcm9wUG9zaXRpb246IGRyb3BQb3NpdGlvbixcbiAgICAgICAgZHJhZ092ZXJOb2RlS2V5OiBkcmFnT3Zlck5vZGVLZXksXG4gICAgICAgIGluZGVudDogaW5kZW50LFxuICAgICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgICAgZHJvcEluZGljYXRvclJlbmRlcjogZHJvcEluZGljYXRvclJlbmRlcixcbiAgICAgICAgbG9hZERhdGE6IGxvYWREYXRhLFxuICAgICAgICBmaWx0ZXJUcmVlTm9kZTogZmlsdGVyVHJlZU5vZGUsXG4gICAgICAgIHRpdGxlUmVuZGVyOiB0aXRsZVJlbmRlcixcbiAgICAgICAgb25Ob2RlQ2xpY2s6IHRoaXMub25Ob2RlQ2xpY2ssXG4gICAgICAgIG9uTm9kZURvdWJsZUNsaWNrOiB0aGlzLm9uTm9kZURvdWJsZUNsaWNrLFxuICAgICAgICBvbk5vZGVFeHBhbmQ6IHRoaXMub25Ob2RlRXhwYW5kLFxuICAgICAgICBvbk5vZGVTZWxlY3Q6IHRoaXMub25Ob2RlU2VsZWN0LFxuICAgICAgICBvbk5vZGVDaGVjazogdGhpcy5vbk5vZGVDaGVjayxcbiAgICAgICAgb25Ob2RlTG9hZDogdGhpcy5vbk5vZGVMb2FkLFxuICAgICAgICBvbk5vZGVNb3VzZUVudGVyOiB0aGlzLm9uTm9kZU1vdXNlRW50ZXIsXG4gICAgICAgIG9uTm9kZU1vdXNlTGVhdmU6IHRoaXMub25Ob2RlTW91c2VMZWF2ZSxcbiAgICAgICAgb25Ob2RlQ29udGV4dE1lbnU6IHRoaXMub25Ob2RlQ29udGV4dE1lbnUsXG4gICAgICAgIG9uTm9kZURyYWdTdGFydDogdGhpcy5vbk5vZGVEcmFnU3RhcnQsXG4gICAgICAgIG9uTm9kZURyYWdFbnRlcjogdGhpcy5vbk5vZGVEcmFnRW50ZXIsXG4gICAgICAgIG9uTm9kZURyYWdPdmVyOiB0aGlzLm9uTm9kZURyYWdPdmVyLFxuICAgICAgICBvbk5vZGVEcmFnTGVhdmU6IHRoaXMub25Ob2RlRHJhZ0xlYXZlLFxuICAgICAgICBvbk5vZGVEcmFnRW5kOiB0aGlzLm9uTm9kZURyYWdFbmQsXG4gICAgICAgIG9uTm9kZURyb3A6IHRoaXMub25Ob2RlRHJvcFxuICAgICAgfTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmVlQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICB2YWx1ZTogY29udGV4dFZhbHVlXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGNsYXNzTmFtZSwgcm9vdENsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2hvdy1saW5lXCIpLCBzaG93TGluZSksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZm9jdXNlZFwiKSwgZm9jdXNlZCksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYWN0aXZlLWZvY3VzZWRcIiksIGFjdGl2ZUtleSAhPT0gbnVsbCkpLFxuICAgICAgICBzdHlsZTogcm9vdFN0eWxlXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChOb2RlTGlzdCwgX2V4dGVuZHMoe1xuICAgICAgICByZWY6IHRoaXMubGlzdFJlZixcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgZGF0YTogZmxhdHRlbk5vZGVzLFxuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgIHNlbGVjdGFibGU6IHNlbGVjdGFibGUsXG4gICAgICAgIGNoZWNrYWJsZTogISFjaGVja2FibGUsXG4gICAgICAgIG1vdGlvbjogbW90aW9uLFxuICAgICAgICBkcmFnZ2luZzogZHJhZ2dpbmdOb2RlS2V5ICE9PSBudWxsLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgaXRlbUhlaWdodDogaXRlbUhlaWdodCxcbiAgICAgICAgdmlydHVhbDogdmlydHVhbCxcbiAgICAgICAgZm9jdXNhYmxlOiBmb2N1c2FibGUsXG4gICAgICAgIGZvY3VzZWQ6IGZvY3VzZWQsXG4gICAgICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICAgICAgYWN0aXZlSXRlbTogdGhpcy5nZXRBY3RpdmVJdGVtKCksXG4gICAgICAgIG9uRm9jdXM6IHRoaXMub25Gb2N1cyxcbiAgICAgICAgb25CbHVyOiB0aGlzLm9uQmx1cixcbiAgICAgICAgb25LZXlEb3duOiB0aGlzLm9uS2V5RG93bixcbiAgICAgICAgb25BY3RpdmVDaGFuZ2U6IHRoaXMub25BY3RpdmVDaGFuZ2UsXG4gICAgICAgIG9uTGlzdENoYW5nZVN0YXJ0OiB0aGlzLm9uTGlzdENoYW5nZVN0YXJ0LFxuICAgICAgICBvbkxpc3RDaGFuZ2VFbmQ6IHRoaXMub25MaXN0Q2hhbmdlRW5kLFxuICAgICAgICBvbkNvbnRleHRNZW51OiBvbkNvbnRleHRNZW51LFxuICAgICAgICBvblNjcm9sbDogb25TY3JvbGwsXG4gICAgICAgIHNjcm9sbFdpZHRoOiBzY3JvbGxXaWR0aFxuICAgICAgfSwgdGhpcy5nZXRUcmVlTm9kZVJlcXVpcmVkUHJvcHMoKSwgZG9tUHJvcHMpKSkpO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgdmFyIHByZXZQcm9wcyA9IHByZXZTdGF0ZS5wcmV2UHJvcHM7XG4gICAgICB2YXIgbmV3U3RhdGUgPSB7XG4gICAgICAgIHByZXZQcm9wczogcHJvcHNcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBuZWVkU3luYyhuYW1lKSB7XG4gICAgICAgIHJldHVybiAhcHJldlByb3BzICYmIHByb3BzLmhhc093blByb3BlcnR5KG5hbWUpIHx8IHByZXZQcm9wcyAmJiBwcmV2UHJvcHNbbmFtZV0gIT09IHByb3BzW25hbWVdO1xuICAgICAgfVxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT0gVHJlZSBOb2RlID09PT09PT09PT09PT09PT09PVxuICAgICAgdmFyIHRyZWVEYXRhO1xuXG4gICAgICAvLyBmaWVsZE5hbWVzXG4gICAgICB2YXIgZmllbGROYW1lcyA9IHByZXZTdGF0ZS5maWVsZE5hbWVzO1xuICAgICAgaWYgKG5lZWRTeW5jKCdmaWVsZE5hbWVzJykpIHtcbiAgICAgICAgZmllbGROYW1lcyA9IGZpbGxGaWVsZE5hbWVzKHByb3BzLmZpZWxkTmFtZXMpO1xuICAgICAgICBuZXdTdGF0ZS5maWVsZE5hbWVzID0gZmllbGROYW1lcztcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgYHRyZWVEYXRhYCBvciBgY2hpbGRyZW5gIGNoYW5nZWQgYW5kIHNhdmUgaW50byB0aGUgc3RhdGUuXG4gICAgICBpZiAobmVlZFN5bmMoJ3RyZWVEYXRhJykpIHtcbiAgICAgICAgdHJlZURhdGEgPSBwcm9wcy50cmVlRGF0YTtcbiAgICAgIH0gZWxzZSBpZiAobmVlZFN5bmMoJ2NoaWxkcmVuJykpIHtcbiAgICAgICAgd2FybmluZyhmYWxzZSwgJ2BjaGlsZHJlbmAgb2YgVHJlZSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGB0cmVlRGF0YWAgaW5zdGVhZC4nKTtcbiAgICAgICAgdHJlZURhdGEgPSBjb252ZXJ0VHJlZVRvRGF0YShwcm9wcy5jaGlsZHJlbik7XG4gICAgICB9XG5cbiAgICAgIC8vIFNhdmUgZmxhdHRlbiBub2RlcyBpbmZvIGFuZCBjb252ZXJ0IGB0cmVlRGF0YWAgaW50byBrZXlFbnRpdGllc1xuICAgICAgaWYgKHRyZWVEYXRhKSB7XG4gICAgICAgIG5ld1N0YXRlLnRyZWVEYXRhID0gdHJlZURhdGE7XG4gICAgICAgIHZhciBlbnRpdGllc01hcCA9IGNvbnZlcnREYXRhVG9FbnRpdGllcyh0cmVlRGF0YSwge1xuICAgICAgICAgIGZpZWxkTmFtZXM6IGZpZWxkTmFtZXNcbiAgICAgICAgfSk7XG4gICAgICAgIG5ld1N0YXRlLmtleUVudGl0aWVzID0gX29iamVjdFNwcmVhZChfZGVmaW5lUHJvcGVydHkoe30sIE1PVElPTl9LRVksIE1vdGlvbkVudGl0eSksIGVudGl0aWVzTWFwLmtleUVudGl0aWVzKTtcblxuICAgICAgICAvLyBXYXJuaW5nIGlmIHRyZWVOb2RlIG5vdCBwcm92aWRlIGtleVxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHdhcm5pbmdXaXRob3V0S2V5KHRyZWVEYXRhLCBmaWVsZE5hbWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGtleUVudGl0aWVzID0gbmV3U3RhdGUua2V5RW50aXRpZXMgfHwgcHJldlN0YXRlLmtleUVudGl0aWVzO1xuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09IGV4cGFuZGVkS2V5cyA9PT09PT09PT09PT09PT09PVxuICAgICAgaWYgKG5lZWRTeW5jKCdleHBhbmRlZEtleXMnKSB8fCBwcmV2UHJvcHMgJiYgbmVlZFN5bmMoJ2F1dG9FeHBhbmRQYXJlbnQnKSkge1xuICAgICAgICBuZXdTdGF0ZS5leHBhbmRlZEtleXMgPSBwcm9wcy5hdXRvRXhwYW5kUGFyZW50IHx8ICFwcmV2UHJvcHMgJiYgcHJvcHMuZGVmYXVsdEV4cGFuZFBhcmVudCA/IGNvbmR1Y3RFeHBhbmRQYXJlbnQocHJvcHMuZXhwYW5kZWRLZXlzLCBrZXlFbnRpdGllcykgOiBwcm9wcy5leHBhbmRlZEtleXM7XG4gICAgICB9IGVsc2UgaWYgKCFwcmV2UHJvcHMgJiYgcHJvcHMuZGVmYXVsdEV4cGFuZEFsbCkge1xuICAgICAgICB2YXIgY2xvbmVLZXlFbnRpdGllcyA9IF9vYmplY3RTcHJlYWQoe30sIGtleUVudGl0aWVzKTtcbiAgICAgICAgZGVsZXRlIGNsb25lS2V5RW50aXRpZXNbTU9USU9OX0tFWV07XG5cbiAgICAgICAgLy8gT25seSB0YWtlIHRoZSBrZXkgd2hvIGhhcyB0aGUgY2hpbGRyZW4gdG8gZW5oYW5jZSB0aGUgcGVyZm9ybWFuY2VcbiAgICAgICAgdmFyIG5leHRFeHBhbmRlZEtleXMgPSBbXTtcbiAgICAgICAgT2JqZWN0LmtleXMoY2xvbmVLZXlFbnRpdGllcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgdmFyIGVudGl0eSA9IGNsb25lS2V5RW50aXRpZXNba2V5XTtcbiAgICAgICAgICBpZiAoZW50aXR5LmNoaWxkcmVuICYmIGVudGl0eS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIG5leHRFeHBhbmRlZEtleXMucHVzaChlbnRpdHkua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBuZXdTdGF0ZS5leHBhbmRlZEtleXMgPSBuZXh0RXhwYW5kZWRLZXlzO1xuICAgICAgfSBlbHNlIGlmICghcHJldlByb3BzICYmIHByb3BzLmRlZmF1bHRFeHBhbmRlZEtleXMpIHtcbiAgICAgICAgbmV3U3RhdGUuZXhwYW5kZWRLZXlzID0gcHJvcHMuYXV0b0V4cGFuZFBhcmVudCB8fCBwcm9wcy5kZWZhdWx0RXhwYW5kUGFyZW50ID8gY29uZHVjdEV4cGFuZFBhcmVudChwcm9wcy5kZWZhdWx0RXhwYW5kZWRLZXlzLCBrZXlFbnRpdGllcykgOiBwcm9wcy5kZWZhdWx0RXhwYW5kZWRLZXlzO1xuICAgICAgfVxuICAgICAgaWYgKCFuZXdTdGF0ZS5leHBhbmRlZEtleXMpIHtcbiAgICAgICAgZGVsZXRlIG5ld1N0YXRlLmV4cGFuZGVkS2V5cztcbiAgICAgIH1cblxuICAgICAgLy8gPT09PT09PT09PT09PT09PSBmbGF0dGVuTm9kZXMgPT09PT09PT09PT09PT09PT1cbiAgICAgIGlmICh0cmVlRGF0YSB8fCBuZXdTdGF0ZS5leHBhbmRlZEtleXMpIHtcbiAgICAgICAgdmFyIGZsYXR0ZW5Ob2RlcyA9IGZsYXR0ZW5UcmVlRGF0YSh0cmVlRGF0YSB8fCBwcmV2U3RhdGUudHJlZURhdGEsIG5ld1N0YXRlLmV4cGFuZGVkS2V5cyB8fCBwcmV2U3RhdGUuZXhwYW5kZWRLZXlzLCBmaWVsZE5hbWVzKTtcbiAgICAgICAgbmV3U3RhdGUuZmxhdHRlbk5vZGVzID0gZmxhdHRlbk5vZGVzO1xuICAgICAgfVxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09IHNlbGVjdGVkS2V5cyA9PT09PT09PT09PT09PT09PVxuICAgICAgaWYgKHByb3BzLnNlbGVjdGFibGUpIHtcbiAgICAgICAgaWYgKG5lZWRTeW5jKCdzZWxlY3RlZEtleXMnKSkge1xuICAgICAgICAgIG5ld1N0YXRlLnNlbGVjdGVkS2V5cyA9IGNhbGNTZWxlY3RlZEtleXMocHJvcHMuc2VsZWN0ZWRLZXlzLCBwcm9wcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXByZXZQcm9wcyAmJiBwcm9wcy5kZWZhdWx0U2VsZWN0ZWRLZXlzKSB7XG4gICAgICAgICAgbmV3U3RhdGUuc2VsZWN0ZWRLZXlzID0gY2FsY1NlbGVjdGVkS2V5cyhwcm9wcy5kZWZhdWx0U2VsZWN0ZWRLZXlzLCBwcm9wcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT0gY2hlY2tlZEtleXMgPT09PT09PT09PT09PT09PT1cbiAgICAgIGlmIChwcm9wcy5jaGVja2FibGUpIHtcbiAgICAgICAgdmFyIGNoZWNrZWRLZXlFbnRpdHk7XG4gICAgICAgIGlmIChuZWVkU3luYygnY2hlY2tlZEtleXMnKSkge1xuICAgICAgICAgIGNoZWNrZWRLZXlFbnRpdHkgPSBwYXJzZUNoZWNrZWRLZXlzKHByb3BzLmNoZWNrZWRLZXlzKSB8fCB7fTtcbiAgICAgICAgfSBlbHNlIGlmICghcHJldlByb3BzICYmIHByb3BzLmRlZmF1bHRDaGVja2VkS2V5cykge1xuICAgICAgICAgIGNoZWNrZWRLZXlFbnRpdHkgPSBwYXJzZUNoZWNrZWRLZXlzKHByb3BzLmRlZmF1bHRDaGVja2VkS2V5cykgfHwge307XG4gICAgICAgIH0gZWxzZSBpZiAodHJlZURhdGEpIHtcbiAgICAgICAgICAvLyBJZiBgdHJlZURhdGFgIGNoYW5nZWQsIHdlIGFsc28gbmVlZCBjaGVjayBpdFxuICAgICAgICAgIGNoZWNrZWRLZXlFbnRpdHkgPSBwYXJzZUNoZWNrZWRLZXlzKHByb3BzLmNoZWNrZWRLZXlzKSB8fCB7XG4gICAgICAgICAgICBjaGVja2VkS2V5czogcHJldlN0YXRlLmNoZWNrZWRLZXlzLFxuICAgICAgICAgICAgaGFsZkNoZWNrZWRLZXlzOiBwcmV2U3RhdGUuaGFsZkNoZWNrZWRLZXlzXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tlZEtleUVudGl0eSkge1xuICAgICAgICAgIHZhciBfY2hlY2tlZEtleUVudGl0eSA9IGNoZWNrZWRLZXlFbnRpdHksXG4gICAgICAgICAgICBfY2hlY2tlZEtleUVudGl0eSRjaGUgPSBfY2hlY2tlZEtleUVudGl0eS5jaGVja2VkS2V5cyxcbiAgICAgICAgICAgIGNoZWNrZWRLZXlzID0gX2NoZWNrZWRLZXlFbnRpdHkkY2hlID09PSB2b2lkIDAgPyBbXSA6IF9jaGVja2VkS2V5RW50aXR5JGNoZSxcbiAgICAgICAgICAgIF9jaGVja2VkS2V5RW50aXR5JGhhbCA9IF9jaGVja2VkS2V5RW50aXR5LmhhbGZDaGVja2VkS2V5cyxcbiAgICAgICAgICAgIGhhbGZDaGVja2VkS2V5cyA9IF9jaGVja2VkS2V5RW50aXR5JGhhbCA9PT0gdm9pZCAwID8gW10gOiBfY2hlY2tlZEtleUVudGl0eSRoYWw7XG4gICAgICAgICAgaWYgKCFwcm9wcy5jaGVja1N0cmljdGx5KSB7XG4gICAgICAgICAgICB2YXIgY29uZHVjdEtleXMgPSBjb25kdWN0Q2hlY2soY2hlY2tlZEtleXMsIHRydWUsIGtleUVudGl0aWVzKTtcbiAgICAgICAgICAgIGNoZWNrZWRLZXlzID0gY29uZHVjdEtleXMuY2hlY2tlZEtleXM7XG4gICAgICAgICAgICBoYWxmQ2hlY2tlZEtleXMgPSBjb25kdWN0S2V5cy5oYWxmQ2hlY2tlZEtleXM7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5ld1N0YXRlLmNoZWNrZWRLZXlzID0gY2hlY2tlZEtleXM7XG4gICAgICAgICAgbmV3U3RhdGUuaGFsZkNoZWNrZWRLZXlzID0gaGFsZkNoZWNrZWRLZXlzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09IGxvYWRlZEtleXMgPT09PT09PT09PT09PT09PT09XG4gICAgICBpZiAobmVlZFN5bmMoJ2xvYWRlZEtleXMnKSkge1xuICAgICAgICBuZXdTdGF0ZS5sb2FkZWRLZXlzID0gcHJvcHMubG9hZGVkS2V5cztcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFRyZWU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5fZGVmaW5lUHJvcGVydHkoVHJlZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBwcmVmaXhDbHM6ICdyYy10cmVlJyxcbiAgc2hvd0xpbmU6IGZhbHNlLFxuICBzaG93SWNvbjogdHJ1ZSxcbiAgc2VsZWN0YWJsZTogdHJ1ZSxcbiAgbXVsdGlwbGU6IGZhbHNlLFxuICBjaGVja2FibGU6IGZhbHNlLFxuICBkaXNhYmxlZDogZmFsc2UsXG4gIGNoZWNrU3RyaWN0bHk6IGZhbHNlLFxuICBkcmFnZ2FibGU6IGZhbHNlLFxuICBkZWZhdWx0RXhwYW5kUGFyZW50OiB0cnVlLFxuICBhdXRvRXhwYW5kUGFyZW50OiBmYWxzZSxcbiAgZGVmYXVsdEV4cGFuZEFsbDogZmFsc2UsXG4gIGRlZmF1bHRFeHBhbmRlZEtleXM6IFtdLFxuICBkZWZhdWx0Q2hlY2tlZEtleXM6IFtdLFxuICBkZWZhdWx0U2VsZWN0ZWRLZXlzOiBbXSxcbiAgZHJvcEluZGljYXRvclJlbmRlcjogRHJvcEluZGljYXRvcixcbiAgYWxsb3dEcm9wOiBmdW5jdGlvbiBhbGxvd0Ryb3AoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGV4cGFuZEFjdGlvbjogZmFsc2Vcbn0pO1xuX2RlZmluZVByb3BlcnR5KFRyZWUsIFwiVHJlZU5vZGVcIiwgVHJlZU5vZGUpO1xuZXhwb3J0IGRlZmF1bHQgVHJlZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImV2ZW50S2V5XCIsIFwiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJkcmFnT3ZlclwiLCBcImRyYWdPdmVyR2FwVG9wXCIsIFwiZHJhZ092ZXJHYXBCb3R0b21cIiwgXCJpc0xlYWZcIiwgXCJpc1N0YXJ0XCIsIFwiaXNFbmRcIiwgXCJleHBhbmRlZFwiLCBcInNlbGVjdGVkXCIsIFwiY2hlY2tlZFwiLCBcImhhbGZDaGVja2VkXCIsIFwibG9hZGluZ1wiLCBcImRvbVJlZlwiLCBcImFjdGl2ZVwiLCBcImRhdGFcIiwgXCJvbk1vdXNlTW92ZVwiLCBcInNlbGVjdGFibGVcIl07XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgcGlja0F0dHJzIGZyb20gXCJyYy11dGlsL2VzL3BpY2tBdHRyc1wiO1xuaW1wb3J0IHsgVHJlZUNvbnRleHQsIFVuc3RhYmxlQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRUeXBlc1wiO1xuaW1wb3J0IEluZGVudCBmcm9tIFwiLi9JbmRlbnRcIjtcbmltcG9ydCBnZXRFbnRpdHkgZnJvbSBcIi4vdXRpbHMva2V5VXRpbFwiO1xuaW1wb3J0IHsgY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhIH0gZnJvbSBcIi4vdXRpbHMvdHJlZVV0aWxcIjtcbnZhciBJQ09OX09QRU4gPSAnb3Blbic7XG52YXIgSUNPTl9DTE9TRSA9ICdjbG9zZSc7XG52YXIgZGVmYXVsdFRpdGxlID0gJy0tLSc7XG52YXIgVHJlZU5vZGUgPSBmdW5jdGlvbiBUcmVlTm9kZShwcm9wcykge1xuICB2YXIgX3Vuc3RhYmxlQ29udGV4dCRub2RlLCBfY29udGV4dCRmaWx0ZXJUcmVlTm8sIF9jbGFzc05hbWVzNDtcbiAgdmFyIGV2ZW50S2V5ID0gcHJvcHMuZXZlbnRLZXksXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgZHJhZ092ZXIgPSBwcm9wcy5kcmFnT3ZlcixcbiAgICBkcmFnT3ZlckdhcFRvcCA9IHByb3BzLmRyYWdPdmVyR2FwVG9wLFxuICAgIGRyYWdPdmVyR2FwQm90dG9tID0gcHJvcHMuZHJhZ092ZXJHYXBCb3R0b20sXG4gICAgaXNMZWFmID0gcHJvcHMuaXNMZWFmLFxuICAgIGlzU3RhcnQgPSBwcm9wcy5pc1N0YXJ0LFxuICAgIGlzRW5kID0gcHJvcHMuaXNFbmQsXG4gICAgZXhwYW5kZWQgPSBwcm9wcy5leHBhbmRlZCxcbiAgICBzZWxlY3RlZCA9IHByb3BzLnNlbGVjdGVkLFxuICAgIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkLFxuICAgIGhhbGZDaGVja2VkID0gcHJvcHMuaGFsZkNoZWNrZWQsXG4gICAgbG9hZGluZyA9IHByb3BzLmxvYWRpbmcsXG4gICAgZG9tUmVmID0gcHJvcHMuZG9tUmVmLFxuICAgIGFjdGl2ZSA9IHByb3BzLmFjdGl2ZSxcbiAgICBkYXRhID0gcHJvcHMuZGF0YSxcbiAgICBvbk1vdXNlTW92ZSA9IHByb3BzLm9uTW91c2VNb3ZlLFxuICAgIHNlbGVjdGFibGUgPSBwcm9wcy5zZWxlY3RhYmxlLFxuICAgIG90aGVyUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChUcmVlQ29udGV4dCk7XG4gIHZhciB1bnN0YWJsZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFVuc3RhYmxlQ29udGV4dCk7XG4gIHZhciBzZWxlY3RIYW5kbGVSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgZHJhZ05vZGVIaWdobGlnaHQgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldERyYWdOb2RlSGlnaGxpZ2h0ID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICAvLyA9PT09PT09IFN0YXRlOiBEaXNhYmxlZCBTdGF0ZSA9PT09PT09XG4gIHZhciBpc0Rpc2FibGVkID0gISEoY29udGV4dC5kaXNhYmxlZCB8fCBwcm9wcy5kaXNhYmxlZCB8fCAoX3Vuc3RhYmxlQ29udGV4dCRub2RlID0gdW5zdGFibGVDb250ZXh0Lm5vZGVEaXNhYmxlZCkgIT09IG51bGwgJiYgX3Vuc3RhYmxlQ29udGV4dCRub2RlICE9PSB2b2lkIDAgJiYgX3Vuc3RhYmxlQ29udGV4dCRub2RlLmNhbGwodW5zdGFibGVDb250ZXh0LCBkYXRhKSk7XG4gIHZhciBpc0NoZWNrYWJsZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIC8vIFJldHVybiBmYWxzZSBpZiB0cmVlIG9yIHRyZWVOb2RlIGlzIG5vdCBjaGVja2FibGVcbiAgICBpZiAoIWNvbnRleHQuY2hlY2thYmxlIHx8IHByb3BzLmNoZWNrYWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQuY2hlY2thYmxlO1xuICB9LCBbY29udGV4dC5jaGVja2FibGUsIHByb3BzLmNoZWNrYWJsZV0pO1xuXG4gIC8vID09PT09PT0gRXZlbnQgSGFuZGxlcnM6IFNlbGVjdGlvbiBhbmQgQ2hlY2sgPT09PT09PVxuICB2YXIgb25TZWxlY3QgPSBmdW5jdGlvbiBvblNlbGVjdChlKSB7XG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29udGV4dC5vbk5vZGVTZWxlY3QoZSwgY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKHByb3BzKSk7XG4gIH07XG4gIHZhciBvbkNoZWNrID0gZnVuY3Rpb24gb25DaGVjayhlKSB7XG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFpc0NoZWNrYWJsZSB8fCBwcm9wcy5kaXNhYmxlQ2hlY2tib3gpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29udGV4dC5vbk5vZGVDaGVjayhlLCBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEocHJvcHMpLCAhY2hlY2tlZCk7XG4gIH07XG5cbiAgLy8gPT09PT09PSBTdGF0ZTogU2VsZWN0YWJsZSBDaGVjayA9PT09PT09XG4gIHZhciBpc1NlbGVjdGFibGUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBJZ25vcmUgd2hlbiBzZWxlY3RhYmxlIGlzIHVuZGVmaW5lZCBvciBudWxsXG4gICAgaWYgKHR5cGVvZiBzZWxlY3RhYmxlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiBzZWxlY3RhYmxlO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dC5zZWxlY3RhYmxlO1xuICB9LCBbc2VsZWN0YWJsZSwgY29udGV4dC5zZWxlY3RhYmxlXSk7XG4gIHZhciBvblNlbGVjdG9yQ2xpY2sgPSBmdW5jdGlvbiBvblNlbGVjdG9yQ2xpY2soZSkge1xuICAgIC8vIENsaWNrIHRyaWdnZXIgYmVmb3JlIHNlbGVjdC9jaGVjayBvcGVyYXRpb25cbiAgICBjb250ZXh0Lm9uTm9kZUNsaWNrKGUsIGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShwcm9wcykpO1xuICAgIGlmIChpc1NlbGVjdGFibGUpIHtcbiAgICAgIG9uU2VsZWN0KGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvbkNoZWNrKGUpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uU2VsZWN0b3JEb3VibGVDbGljayA9IGZ1bmN0aW9uIG9uU2VsZWN0b3JEb3VibGVDbGljayhlKSB7XG4gICAgY29udGV4dC5vbk5vZGVEb3VibGVDbGljayhlLCBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEocHJvcHMpKTtcbiAgfTtcbiAgdmFyIG9uTW91c2VFbnRlciA9IGZ1bmN0aW9uIG9uTW91c2VFbnRlcihlKSB7XG4gICAgY29udGV4dC5vbk5vZGVNb3VzZUVudGVyKGUsIGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShwcm9wcykpO1xuICB9O1xuICB2YXIgb25Nb3VzZUxlYXZlID0gZnVuY3Rpb24gb25Nb3VzZUxlYXZlKGUpIHtcbiAgICBjb250ZXh0Lm9uTm9kZU1vdXNlTGVhdmUoZSwgY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKHByb3BzKSk7XG4gIH07XG4gIHZhciBvbkNvbnRleHRNZW51ID0gZnVuY3Rpb24gb25Db250ZXh0TWVudShlKSB7XG4gICAgY29udGV4dC5vbk5vZGVDb250ZXh0TWVudShlLCBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEocHJvcHMpKTtcbiAgfTtcblxuICAvLyA9PT09PT09IERyYWc6IERyYWcgRW5hYmxlZCA9PT09PT09XG4gIHZhciBpc0RyYWdnYWJsZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIShjb250ZXh0LmRyYWdnYWJsZSAmJiAoIWNvbnRleHQuZHJhZ2dhYmxlLm5vZGVEcmFnZ2FibGUgfHwgY29udGV4dC5kcmFnZ2FibGUubm9kZURyYWdnYWJsZShkYXRhKSkpO1xuICB9LCBbY29udGV4dC5kcmFnZ2FibGUsIGRhdGFdKTtcblxuICAvLyA9PT09PT09IERyYWc6IERyYWcgRXZlbnQgSGFuZGxlcnMgPT09PT09PVxuICB2YXIgb25EcmFnU3RhcnQgPSBmdW5jdGlvbiBvbkRyYWdTdGFydChlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZXREcmFnTm9kZUhpZ2hsaWdodCh0cnVlKTtcbiAgICBjb250ZXh0Lm9uTm9kZURyYWdTdGFydChlLCBwcm9wcyk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGllIHRocm93IGVycm9yXG4gICAgICAvLyBmaXJlZm94LW5lZWQtaXRcbiAgICAgIGUuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvcGxhaW4nLCAnJyk7XG4gICAgfSBjYXRjaCAoX3VudXNlZCkge1xuICAgICAgLy8gZW1wdHlcbiAgICB9XG4gIH07XG4gIHZhciBvbkRyYWdFbnRlciA9IGZ1bmN0aW9uIG9uRHJhZ0VudGVyKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb250ZXh0Lm9uTm9kZURyYWdFbnRlcihlLCBwcm9wcyk7XG4gIH07XG4gIHZhciBvbkRyYWdPdmVyID0gZnVuY3Rpb24gb25EcmFnT3ZlcihlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29udGV4dC5vbk5vZGVEcmFnT3ZlcihlLCBwcm9wcyk7XG4gIH07XG4gIHZhciBvbkRyYWdMZWF2ZSA9IGZ1bmN0aW9uIG9uRHJhZ0xlYXZlKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnRleHQub25Ob2RlRHJhZ0xlYXZlKGUsIHByb3BzKTtcbiAgfTtcbiAgdmFyIG9uRHJhZ0VuZCA9IGZ1bmN0aW9uIG9uRHJhZ0VuZChlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZXREcmFnTm9kZUhpZ2hsaWdodChmYWxzZSk7XG4gICAgY29udGV4dC5vbk5vZGVEcmFnRW5kKGUsIHByb3BzKTtcbiAgfTtcbiAgdmFyIG9uRHJvcCA9IGZ1bmN0aW9uIG9uRHJvcChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgc2V0RHJhZ05vZGVIaWdobGlnaHQoZmFsc2UpO1xuICAgIGNvbnRleHQub25Ob2RlRHJvcChlLCBwcm9wcyk7XG4gIH07XG5cbiAgLy8gPT09PT09PSBFeHBhbmQ6IE5vZGUgRXhwYW5zaW9uID09PT09PT1cbiAgdmFyIG9uRXhwYW5kID0gZnVuY3Rpb24gb25FeHBhbmQoZSkge1xuICAgIGlmIChsb2FkaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnRleHQub25Ob2RlRXhwYW5kKGUsIGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShwcm9wcykpO1xuICB9O1xuXG4gIC8vID09PT09PT0gU3RhdGU6IEhhcyBDaGlsZHJlbiA9PT09PT09XG4gIHZhciBoYXNDaGlsZHJlbiA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmID0gZ2V0RW50aXR5KGNvbnRleHQua2V5RW50aXRpZXMsIGV2ZW50S2V5KSB8fCB7fSxcbiAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgICByZXR1cm4gQm9vbGVhbigoY2hpbGRyZW4gfHwgW10pLmxlbmd0aCk7XG4gIH0sIFtjb250ZXh0LmtleUVudGl0aWVzLCBldmVudEtleV0pO1xuXG4gIC8vID09PT09PT0gU3RhdGU6IExlYWYgQ2hlY2sgPT09PT09PVxuICB2YXIgbWVtb2l6ZWRJc0xlYWYgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaXNMZWFmID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaXNMZWFmIHx8ICFjb250ZXh0LmxvYWREYXRhICYmICFoYXNDaGlsZHJlbiB8fCBjb250ZXh0LmxvYWREYXRhICYmIHByb3BzLmxvYWRlZCAmJiAhaGFzQ2hpbGRyZW47XG4gIH0sIFtpc0xlYWYsIGNvbnRleHQubG9hZERhdGEsIGhhc0NoaWxkcmVuLCBwcm9wcy5sb2FkZWRdKTtcblxuICAvLyA9PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT1cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBMb2FkIGRhdGEgdG8gYXZvaWQgZGVmYXVsdCBleHBhbmRlZCB0cmVlIHdpdGhvdXQgZGF0YVxuICAgIGlmIChsb2FkaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIHJlYWQgZnJvbSBzdGF0ZSB0byBhdm9pZCBsb2FkRGF0YSBhdCBzYW1lIHRpbWVcbiAgICBpZiAodHlwZW9mIGNvbnRleHQubG9hZERhdGEgPT09ICdmdW5jdGlvbicgJiYgZXhwYW5kZWQgJiYgIW1lbW9pemVkSXNMZWFmICYmICFwcm9wcy5sb2FkZWQpIHtcbiAgICAgIC8vIFdlIG5lZWRuJ3QgcmVsb2FkIGRhdGEgd2hlbiBoYXMgY2hpbGRyZW4gaW4gc3luYyBsb2dpY1xuICAgICAgLy8gSXQncyBvbmx5IG5lZWRlZCBpbiBub2RlIGV4cGFuZGVkXG4gICAgICBjb250ZXh0Lm9uTm9kZUxvYWQoY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKHByb3BzKSk7XG4gICAgfVxuICB9LCBbbG9hZGluZywgY29udGV4dC5sb2FkRGF0YSwgY29udGV4dC5vbk5vZGVMb2FkLCBleHBhbmRlZCwgbWVtb2l6ZWRJc0xlYWYsIHByb3BzXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gUmVuZGVyOiBEcmFnIEhhbmRsZXIgPT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGRyYWdIYW5kbGVyTm9kZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBfY29udGV4dCRkcmFnZ2FibGU7XG4gICAgaWYgKCEoKF9jb250ZXh0JGRyYWdnYWJsZSA9IGNvbnRleHQuZHJhZ2dhYmxlKSAhPT0gbnVsbCAmJiBfY29udGV4dCRkcmFnZ2FibGUgIT09IHZvaWQgMCAmJiBfY29udGV4dCRkcmFnZ2FibGUuaWNvbikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLWRyYWdnYWJsZS1pY29uXCIpXG4gICAgfSwgY29udGV4dC5kcmFnZ2FibGUuaWNvbik7XG4gIH0sIFtjb250ZXh0LmRyYWdnYWJsZV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyOiBTd2l0Y2hlciA9PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciByZW5kZXJTd2l0Y2hlckljb25Eb20gPSBmdW5jdGlvbiByZW5kZXJTd2l0Y2hlckljb25Eb20oaXNJbnRlcm5hbExlYWYpIHtcbiAgICB2YXIgc3dpdGNoZXJJY29uID0gcHJvcHMuc3dpdGNoZXJJY29uIHx8IGNvbnRleHQuc3dpdGNoZXJJY29uO1xuICAgIC8vIGlmIHN3aXRjaGVySWNvbkRvbSBpcyBudWxsLCBubyByZW5kZXIgc3dpdGNoZXIgc3BhblxuICAgIGlmICh0eXBlb2Ygc3dpdGNoZXJJY29uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gc3dpdGNoZXJJY29uKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgICAgICBpc0xlYWY6IGlzSW50ZXJuYWxMZWFmXG4gICAgICB9KSk7XG4gICAgfVxuICAgIHJldHVybiBzd2l0Y2hlckljb247XG4gIH07XG5cbiAgLy8gU3dpdGNoZXJcbiAgdmFyIHJlbmRlclN3aXRjaGVyID0gZnVuY3Rpb24gcmVuZGVyU3dpdGNoZXIoKSB7XG4gICAgaWYgKG1lbW9pemVkSXNMZWFmKSB7XG4gICAgICAvLyBpZiBzd2l0Y2hlckljb25Eb20gaXMgbnVsbCwgbm8gcmVuZGVyIHN3aXRjaGVyIHNwYW5cbiAgICAgIHZhciBfc3dpdGNoZXJJY29uRG9tID0gcmVuZGVyU3dpdGNoZXJJY29uRG9tKHRydWUpO1xuICAgICAgcmV0dXJuIF9zd2l0Y2hlckljb25Eb20gIT09IGZhbHNlID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi1zd2l0Y2hlclwiKSwgXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLXN3aXRjaGVyLW5vb3BcIikpXG4gICAgICB9LCBfc3dpdGNoZXJJY29uRG9tKSA6IG51bGw7XG4gICAgfVxuICAgIHZhciBzd2l0Y2hlckljb25Eb20gPSByZW5kZXJTd2l0Y2hlckljb25Eb20oZmFsc2UpO1xuICAgIHJldHVybiBzd2l0Y2hlckljb25Eb20gIT09IGZhbHNlID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIG9uQ2xpY2s6IG9uRXhwYW5kLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi1zd2l0Y2hlclwiKSwgXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLXN3aXRjaGVyX1wiKS5jb25jYXQoZXhwYW5kZWQgPyBJQ09OX09QRU4gOiBJQ09OX0NMT1NFKSlcbiAgICB9LCBzd2l0Y2hlckljb25Eb20pIDogbnVsbDtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IENoZWNrYm94ID09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNoZWNrYm94Tm9kZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICghaXNDaGVja2FibGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFtMZWdhY3ldIEN1c3RvbSBlbGVtZW50IHNob3VsZCBiZSBzZXBhcmF0ZSB3aXRoIGBjaGVja2FibGVgIGluIGZ1dHVyZVxuICAgIHZhciAkY3VzdG9tID0gdHlwZW9mIGlzQ2hlY2thYmxlICE9PSAnYm9vbGVhbicgPyBpc0NoZWNrYWJsZSA6IG51bGw7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLWNoZWNrYm94XCIpLCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLWNoZWNrYm94LWNoZWNrZWRcIiksIGNoZWNrZWQpLCBcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVwiKSwgIWNoZWNrZWQgJiYgaGFsZkNoZWNrZWQpLCBcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItY2hlY2tib3gtZGlzYWJsZWRcIiksIGlzRGlzYWJsZWQgfHwgcHJvcHMuZGlzYWJsZUNoZWNrYm94KSksXG4gICAgICBvbkNsaWNrOiBvbkNoZWNrLFxuICAgICAgcm9sZTogXCJjaGVja2JveFwiLFxuICAgICAgXCJhcmlhLWNoZWNrZWRcIjogaGFsZkNoZWNrZWQgPyAnbWl4ZWQnIDogY2hlY2tlZCxcbiAgICAgIFwiYXJpYS1kaXNhYmxlZFwiOiBpc0Rpc2FibGVkIHx8IHByb3BzLmRpc2FibGVDaGVja2JveCxcbiAgICAgIFwiYXJpYS1sYWJlbFwiOiBcIlNlbGVjdCBcIi5jb25jYXQodHlwZW9mIHByb3BzLnRpdGxlID09PSAnc3RyaW5nJyA/IHByb3BzLnRpdGxlIDogJ3RyZWUgbm9kZScpXG4gICAgfSwgJGN1c3RvbSk7XG4gIH0sIFtpc0NoZWNrYWJsZSwgY2hlY2tlZCwgaGFsZkNoZWNrZWQsIGlzRGlzYWJsZWQsIHByb3BzLmRpc2FibGVDaGVja2JveCwgcHJvcHMudGl0bGVdKTtcblxuICAvLyA9PT09PT09PT09PT09PSBTdGF0ZTogTm9kZSBTdGF0ZSAoT3Blbi9DbG9zZSkgPT09PT09PT09PT09PT1cbiAgdmFyIG5vZGVTdGF0ZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChtZW1vaXplZElzTGVhZikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBleHBhbmRlZCA/IElDT05fT1BFTiA6IElDT05fQ0xPU0U7XG4gIH0sIFttZW1vaXplZElzTGVhZiwgZXhwYW5kZWRdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBSZW5kZXI6IFRpdGxlICsgSWNvbiA9PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaWNvbk5vZGUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItaWNvbkVsZVwiKSwgXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLWljb25fX1wiKS5jb25jYXQobm9kZVN0YXRlIHx8ICdkb2N1JyksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLWljb25fbG9hZGluZ1wiKSwgbG9hZGluZykpXG4gICAgfSk7XG4gIH0sIFtjb250ZXh0LnByZWZpeENscywgbm9kZVN0YXRlLCBsb2FkaW5nXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PSBEcm9wIEluZGljYXRvciA9PT09PT09PT09PT09PT09PT09XG4gIHZhciBkcm9wSW5kaWNhdG9yTm9kZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciByb290RHJhZ2dhYmxlID0gQm9vbGVhbihjb250ZXh0LmRyYWdnYWJsZSk7XG4gICAgLy8gYWxsb3dEcm9wIGlzIGNhbGN1bGF0ZWQgaW4gVHJlZS50c3gsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGNhbGMgaXQgaGVyZVxuICAgIHZhciBzaG93SW5kaWNhdG9yID0gIXByb3BzLmRpc2FibGVkICYmIHJvb3REcmFnZ2FibGUgJiYgY29udGV4dC5kcmFnT3Zlck5vZGVLZXkgPT09IGV2ZW50S2V5O1xuICAgIGlmICghc2hvd0luZGljYXRvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0LmRyb3BJbmRpY2F0b3JSZW5kZXIoe1xuICAgICAgZHJvcFBvc2l0aW9uOiBjb250ZXh0LmRyb3BQb3NpdGlvbixcbiAgICAgIGRyb3BMZXZlbE9mZnNldDogY29udGV4dC5kcm9wTGV2ZWxPZmZzZXQsXG4gICAgICBpbmRlbnQ6IGNvbnRleHQuaW5kZW50LFxuICAgICAgcHJlZml4Q2xzOiBjb250ZXh0LnByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbjogY29udGV4dC5kaXJlY3Rpb25cbiAgICB9KTtcbiAgfSwgW2NvbnRleHQuZHJvcFBvc2l0aW9uLCBjb250ZXh0LmRyb3BMZXZlbE9mZnNldCwgY29udGV4dC5pbmRlbnQsIGNvbnRleHQucHJlZml4Q2xzLCBjb250ZXh0LmRpcmVjdGlvbiwgY29udGV4dC5kcmFnZ2FibGUsIGNvbnRleHQuZHJhZ092ZXJOb2RlS2V5LCBjb250ZXh0LmRyb3BJbmRpY2F0b3JSZW5kZXJdKTtcblxuICAvLyBJY29uICsgVGl0bGVcbiAgdmFyIHNlbGVjdG9yTm9kZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcHJvcHMkdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgIHRpdGxlID0gX3Byb3BzJHRpdGxlID09PSB2b2lkIDAgPyBkZWZhdWx0VGl0bGUgOiBfcHJvcHMkdGl0bGU7XG4gICAgdmFyIHdyYXBDbGFzcyA9IFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi1ub2RlLWNvbnRlbnQtd3JhcHBlclwiKTtcblxuICAgIC8vIEljb24gLSBTdGlsbCBzaG93IGxvYWRpbmcgaWNvbiB3aGVuIGxvYWRpbmcgd2l0aG91dCBzaG93SWNvblxuICAgIHZhciAkaWNvbjtcbiAgICBpZiAoY29udGV4dC5zaG93SWNvbikge1xuICAgICAgdmFyIGN1cnJlbnRJY29uID0gcHJvcHMuaWNvbiB8fCBjb250ZXh0Lmljb247XG4gICAgICAkaWNvbiA9IGN1cnJlbnRJY29uID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi1pY29uRWxlXCIpLCBcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItaWNvbl9fY3VzdG9taXplXCIpKVxuICAgICAgfSwgdHlwZW9mIGN1cnJlbnRJY29uID09PSAnZnVuY3Rpb24nID8gY3VycmVudEljb24ocHJvcHMpIDogY3VycmVudEljb24pIDogaWNvbk5vZGU7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0LmxvYWREYXRhICYmIGxvYWRpbmcpIHtcbiAgICAgICRpY29uID0gaWNvbk5vZGU7XG4gICAgfVxuXG4gICAgLy8gVGl0bGVcbiAgICB2YXIgdGl0bGVOb2RlO1xuICAgIGlmICh0eXBlb2YgdGl0bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRpdGxlTm9kZSA9IHRpdGxlKGRhdGEpO1xuICAgIH0gZWxzZSBpZiAoY29udGV4dC50aXRsZVJlbmRlcikge1xuICAgICAgdGl0bGVOb2RlID0gY29udGV4dC50aXRsZVJlbmRlcihkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGl0bGVOb2RlID0gdGl0bGU7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgcmVmOiBzZWxlY3RIYW5kbGVSZWYsXG4gICAgICB0aXRsZTogdHlwZW9mIHRpdGxlID09PSAnc3RyaW5nJyA/IHRpdGxlIDogJycsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMod3JhcENsYXNzLCBcIlwiLmNvbmNhdCh3cmFwQ2xhc3MsIFwiLVwiKS5jb25jYXQobm9kZVN0YXRlIHx8ICdub3JtYWwnKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItbm9kZS1zZWxlY3RlZFwiKSwgIWlzRGlzYWJsZWQgJiYgKHNlbGVjdGVkIHx8IGRyYWdOb2RlSGlnaGxpZ2h0KSkpLFxuICAgICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsXG4gICAgICBvbk1vdXNlTGVhdmU6IG9uTW91c2VMZWF2ZSxcbiAgICAgIG9uQ29udGV4dE1lbnU6IG9uQ29udGV4dE1lbnUsXG4gICAgICBvbkNsaWNrOiBvblNlbGVjdG9yQ2xpY2ssXG4gICAgICBvbkRvdWJsZUNsaWNrOiBvblNlbGVjdG9yRG91YmxlQ2xpY2tcbiAgICB9LCAkaWNvbiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLXRpdGxlXCIpXG4gICAgfSwgdGl0bGVOb2RlKSwgZHJvcEluZGljYXRvck5vZGUpO1xuICB9LCBbY29udGV4dC5wcmVmaXhDbHMsIGNvbnRleHQuc2hvd0ljb24sIHByb3BzLCBjb250ZXh0Lmljb24sIGljb25Ob2RlLCBjb250ZXh0LnRpdGxlUmVuZGVyLCBkYXRhLCBub2RlU3RhdGUsIG9uTW91c2VFbnRlciwgb25Nb3VzZUxlYXZlLCBvbkNvbnRleHRNZW51LCBvblNlbGVjdG9yQ2xpY2ssIG9uU2VsZWN0b3JEb3VibGVDbGlja10pO1xuICB2YXIgZGF0YU9yQXJpYUF0dHJpYnV0ZVByb3BzID0gcGlja0F0dHJzKG90aGVyUHJvcHMsIHtcbiAgICBhcmlhOiB0cnVlLFxuICAgIGRhdGE6IHRydWVcbiAgfSk7XG4gIHZhciBfcmVmMiA9IGdldEVudGl0eShjb250ZXh0LmtleUVudGl0aWVzLCBldmVudEtleSkgfHwge30sXG4gICAgbGV2ZWwgPSBfcmVmMi5sZXZlbDtcbiAgdmFyIGlzRW5kTm9kZSA9IGlzRW5kW2lzRW5kLmxlbmd0aCAtIDFdO1xuICB2YXIgZHJhZ2dhYmxlV2l0aG91dERpc2FibGVkID0gIWlzRGlzYWJsZWQgJiYgaXNEcmFnZ2FibGU7XG4gIHZhciBkcmFnZ2luZyA9IGNvbnRleHQuZHJhZ2dpbmdOb2RlS2V5ID09PSBldmVudEtleTtcbiAgdmFyIGFyaWFTZWxlY3RlZCA9IHNlbGVjdGFibGUgIT09IHVuZGVmaW5lZCA/IHtcbiAgICAnYXJpYS1zZWxlY3RlZCc6ICEhc2VsZWN0YWJsZVxuICB9IDogdW5kZWZpbmVkO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIHJlZjogZG9tUmVmLFxuICAgIHJvbGU6IFwidHJlZWl0ZW1cIixcbiAgICBcImFyaWEtZXhwYW5kZWRcIjogaXNMZWFmID8gdW5kZWZpbmVkIDogZXhwYW5kZWQsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLXRyZWVub2RlXCIpLCAoX2NsYXNzTmFtZXM0ID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczQsIFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi10cmVlbm9kZS1kaXNhYmxlZFwiKSwgaXNEaXNhYmxlZCksIFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi10cmVlbm9kZS1zd2l0Y2hlci1cIikuY29uY2F0KGV4cGFuZGVkID8gJ29wZW4nIDogJ2Nsb3NlJyksICFpc0xlYWYpLCBcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItdHJlZW5vZGUtY2hlY2tib3gtY2hlY2tlZFwiKSwgY2hlY2tlZCksIFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi10cmVlbm9kZS1jaGVja2JveC1pbmRldGVybWluYXRlXCIpLCBoYWxmQ2hlY2tlZCksIFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi10cmVlbm9kZS1zZWxlY3RlZFwiKSwgc2VsZWN0ZWQpLCBcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItdHJlZW5vZGUtbG9hZGluZ1wiKSwgbG9hZGluZyksIFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi10cmVlbm9kZS1hY3RpdmVcIiksIGFjdGl2ZSksIFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi10cmVlbm9kZS1sZWFmLWxhc3RcIiksIGlzRW5kTm9kZSksIFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi10cmVlbm9kZS1kcmFnZ2FibGVcIiksIGlzRHJhZ2dhYmxlKSwgXCJkcmFnZ2luZ1wiLCBkcmFnZ2luZyksIF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczQsICdkcm9wLXRhcmdldCcsIGNvbnRleHQuZHJvcFRhcmdldEtleSA9PT0gZXZlbnRLZXkpLCAnZHJvcC1jb250YWluZXInLCBjb250ZXh0LmRyb3BDb250YWluZXJLZXkgPT09IGV2ZW50S2V5KSwgJ2RyYWctb3ZlcicsICFpc0Rpc2FibGVkICYmIGRyYWdPdmVyKSwgJ2RyYWctb3Zlci1nYXAtdG9wJywgIWlzRGlzYWJsZWQgJiYgZHJhZ092ZXJHYXBUb3ApLCAnZHJhZy1vdmVyLWdhcC1ib3R0b20nLCAhaXNEaXNhYmxlZCAmJiBkcmFnT3ZlckdhcEJvdHRvbSksICdmaWx0ZXItbm9kZScsIChfY29udGV4dCRmaWx0ZXJUcmVlTm8gPSBjb250ZXh0LmZpbHRlclRyZWVOb2RlKSA9PT0gbnVsbCB8fCBfY29udGV4dCRmaWx0ZXJUcmVlTm8gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jb250ZXh0JGZpbHRlclRyZWVOby5jYWxsKGNvbnRleHQsIGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShwcm9wcykpKSwgXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLXRyZWVub2RlLWxlYWZcIiksIG1lbW9pemVkSXNMZWFmKSkpLFxuICAgIHN0eWxlOiBzdHlsZVxuICAgIC8vIERyYWdnYWJsZSBjb25maWdcbiAgICAsXG4gICAgZHJhZ2dhYmxlOiBkcmFnZ2FibGVXaXRob3V0RGlzYWJsZWQsXG4gICAgb25EcmFnU3RhcnQ6IGRyYWdnYWJsZVdpdGhvdXREaXNhYmxlZCA/IG9uRHJhZ1N0YXJ0IDogdW5kZWZpbmVkXG4gICAgLy8gRHJvcCBjb25maWdcbiAgICAsXG4gICAgb25EcmFnRW50ZXI6IGlzRHJhZ2dhYmxlID8gb25EcmFnRW50ZXIgOiB1bmRlZmluZWQsXG4gICAgb25EcmFnT3ZlcjogaXNEcmFnZ2FibGUgPyBvbkRyYWdPdmVyIDogdW5kZWZpbmVkLFxuICAgIG9uRHJhZ0xlYXZlOiBpc0RyYWdnYWJsZSA/IG9uRHJhZ0xlYXZlIDogdW5kZWZpbmVkLFxuICAgIG9uRHJvcDogaXNEcmFnZ2FibGUgPyBvbkRyb3AgOiB1bmRlZmluZWQsXG4gICAgb25EcmFnRW5kOiBpc0RyYWdnYWJsZSA/IG9uRHJhZ0VuZCA6IHVuZGVmaW5lZCxcbiAgICBvbk1vdXNlTW92ZTogb25Nb3VzZU1vdmVcbiAgfSwgYXJpYVNlbGVjdGVkLCBkYXRhT3JBcmlhQXR0cmlidXRlUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbmRlbnQsIHtcbiAgICBwcmVmaXhDbHM6IGNvbnRleHQucHJlZml4Q2xzLFxuICAgIGxldmVsOiBsZXZlbCxcbiAgICBpc1N0YXJ0OiBpc1N0YXJ0LFxuICAgIGlzRW5kOiBpc0VuZFxuICB9KSwgZHJhZ0hhbmRsZXJOb2RlLCByZW5kZXJTd2l0Y2hlcigpLCBjaGVja2JveE5vZGUsIHNlbGVjdG9yTm9kZSk7XG59O1xuVHJlZU5vZGUuaXNUcmVlTm9kZSA9IDE7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBUcmVlTm9kZS5kaXNwbGF5TmFtZSA9ICdUcmVlTm9kZSc7XG59XG5leHBvcnQgZGVmYXVsdCBUcmVlTm9kZTsiLCIvKipcbiAqIFdlYnBhY2sgaGFzIGJ1ZyBmb3IgaW1wb3J0IGxvb3AsIHdoaWNoIGlzIG5vdCB0aGUgc2FtZSBiZWhhdmlvciBhcyBFUyBtb2R1bGUuXG4gKiBXaGVuIHV0aWwuanMgaW1wb3J0cyB0aGUgVHJlZU5vZGUgZm9yIHRyZWUgZ2VuZXJhdGUgd2lsbCBjYXVzZSB0cmVlQ29udGV4dFR5cGVzIGJlIGVtcHR5LlxuICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIFRyZWVDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5cbi8qKiBJbnRlcm5hbCB1c2FnZSwgc2FmZSB0byByZW1vdmUuIERvIG5vdCB1c2UgaW4gcHJvZCAqL1xuZXhwb3J0IHZhciBVbnN0YWJsZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7IiwiaW1wb3J0IFRyZWUgZnJvbSBcIi4vVHJlZVwiO1xuaW1wb3J0IFRyZWVOb2RlIGZyb20gXCIuL1RyZWVOb2RlXCI7XG5pbXBvcnQgeyBVbnN0YWJsZUNvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0VHlwZXNcIjtcbmV4cG9ydCB7IFRyZWVOb2RlLCBVbnN0YWJsZUNvbnRleHQgfTtcbmV4cG9ydCBkZWZhdWx0IFRyZWU7IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuXG4vKipcbiAqIFRyaWdnZXIgb25seSB3aGVuIGNvbXBvbmVudCB1bm1vdW50XG4gKi9cbmZ1bmN0aW9uIHVzZVVubW91bnQodHJpZ2dlclN0YXJ0LCB0cmlnZ2VyRW5kKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgZmlyc3RNb3VudCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0Rmlyc3RNb3VudCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGZpcnN0TW91bnQpIHtcbiAgICAgIHRyaWdnZXJTdGFydCgpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJpZ2dlckVuZCgpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtmaXJzdE1vdW50XSk7XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0Rmlyc3RNb3VudCh0cnVlKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgc2V0Rmlyc3RNb3VudChmYWxzZSk7XG4gICAgfTtcbiAgfSwgW10pO1xufVxuZXhwb3J0IGRlZmF1bHQgdXNlVW5tb3VudDsiLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImNoaWxkcmVuXCJdO1xuLyogZXNsaW50LWRpc2FibGUgbm8tbG9uZWx5LWlmICovXG4vKipcbiAqIExlZ2FjeSBjb2RlLiBTaG91bGQgYXZvaWQgdG8gdXNlIGlmIHlvdSBhcmUgbmV3IHRvIGltcG9ydCB0aGVzZSBjb2RlLlxuICovXG5cbmltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVHJlZU5vZGUgZnJvbSBcIi4vVHJlZU5vZGVcIjtcbmltcG9ydCBnZXRFbnRpdHkgZnJvbSBcIi4vdXRpbHMva2V5VXRpbFwiO1xuZXhwb3J0IHsgZ2V0UG9zaXRpb24sIGlzVHJlZU5vZGUgfSBmcm9tIFwiLi91dGlscy90cmVlVXRpbFwiO1xuZXhwb3J0IGZ1bmN0aW9uIGFyckRlbChsaXN0LCB2YWx1ZSkge1xuICBpZiAoIWxpc3QpIHJldHVybiBbXTtcbiAgdmFyIGNsb25lID0gbGlzdC5zbGljZSgpO1xuICB2YXIgaW5kZXggPSBjbG9uZS5pbmRleE9mKHZhbHVlKTtcbiAgaWYgKGluZGV4ID49IDApIHtcbiAgICBjbG9uZS5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG4gIHJldHVybiBjbG9uZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcnJBZGQobGlzdCwgdmFsdWUpIHtcbiAgdmFyIGNsb25lID0gKGxpc3QgfHwgW10pLnNsaWNlKCk7XG4gIGlmIChjbG9uZS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICBjbG9uZS5wdXNoKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gY2xvbmU7XG59XG5leHBvcnQgZnVuY3Rpb24gcG9zVG9BcnIocG9zKSB7XG4gIHJldHVybiBwb3Muc3BsaXQoJy0nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREcmFnQ2hpbGRyZW5LZXlzKGRyYWdOb2RlS2V5LCBrZXlFbnRpdGllcykge1xuICAvLyBub3QgY29udGFpbnMgc2VsZlxuICAvLyBzZWxmIGZvciBsZWZ0IG9yIHJpZ2h0IGRyYWdcbiAgdmFyIGRyYWdDaGlsZHJlbktleXMgPSBbXTtcbiAgdmFyIGVudGl0eSA9IGdldEVudGl0eShrZXlFbnRpdGllcywgZHJhZ05vZGVLZXkpO1xuICBmdW5jdGlvbiBkaWcoKSB7XG4gICAgdmFyIGxpc3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGtleSA9IF9yZWYua2V5LFxuICAgICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gICAgICBkcmFnQ2hpbGRyZW5LZXlzLnB1c2goa2V5KTtcbiAgICAgIGRpZyhjaGlsZHJlbik7XG4gICAgfSk7XG4gIH1cbiAgZGlnKGVudGl0eS5jaGlsZHJlbik7XG4gIHJldHVybiBkcmFnQ2hpbGRyZW5LZXlzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTGFzdENoaWxkKHRyZWVOb2RlRW50aXR5KSB7XG4gIGlmICh0cmVlTm9kZUVudGl0eS5wYXJlbnQpIHtcbiAgICB2YXIgcG9zQXJyID0gcG9zVG9BcnIodHJlZU5vZGVFbnRpdHkucG9zKTtcbiAgICByZXR1cm4gTnVtYmVyKHBvc0Fycltwb3NBcnIubGVuZ3RoIC0gMV0pID09PSB0cmVlTm9kZUVudGl0eS5wYXJlbnQuY2hpbGRyZW4ubGVuZ3RoIC0gMTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGaXJzdENoaWxkKHRyZWVOb2RlRW50aXR5KSB7XG4gIHZhciBwb3NBcnIgPSBwb3NUb0Fycih0cmVlTm9kZUVudGl0eS5wb3MpO1xuICByZXR1cm4gTnVtYmVyKHBvc0Fycltwb3NBcnIubGVuZ3RoIC0gMV0pID09PSAwO1xufVxuXG4vLyBPbmx5IHVzZWQgd2hlbiBkcmFnLCBub3QgYWZmZWN0IFNTUi5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjRHJvcFBvc2l0aW9uKGV2ZW50LCBkcmFnTm9kZVByb3BzLCB0YXJnZXROb2RlUHJvcHMsIGluZGVudCwgc3RhcnRNb3VzZVBvc2l0aW9uLCBhbGxvd0Ryb3AsIGZsYXR0ZW5lZE5vZGVzLCBrZXlFbnRpdGllcywgZXhwYW5kS2V5cywgZGlyZWN0aW9uKSB7XG4gIHZhciBfYWJzdHJhY3REcm9wTm9kZUVudGk7XG4gIHZhciBjbGllbnRYID0gZXZlbnQuY2xpZW50WCxcbiAgICBjbGllbnRZID0gZXZlbnQuY2xpZW50WTtcbiAgdmFyIF9nZXRCb3VuZGluZ0NsaWVudFJlYyA9IGV2ZW50LnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICB0b3AgPSBfZ2V0Qm91bmRpbmdDbGllbnRSZWMudG9wLFxuICAgIGhlaWdodCA9IF9nZXRCb3VuZGluZ0NsaWVudFJlYy5oZWlnaHQ7XG4gIC8vIG9wdGlvbmFsIGNoYWluIGZvciB0ZXN0aW5nXG4gIHZhciBob3Jpem9udGFsTW91c2VPZmZzZXQgPSAoZGlyZWN0aW9uID09PSAncnRsJyA/IC0xIDogMSkgKiAoKChzdGFydE1vdXNlUG9zaXRpb24gPT09IG51bGwgfHwgc3RhcnRNb3VzZVBvc2l0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdGFydE1vdXNlUG9zaXRpb24ueCkgfHwgMCkgLSBjbGllbnRYKTtcbiAgdmFyIHJhd0Ryb3BMZXZlbE9mZnNldCA9IChob3Jpem9udGFsTW91c2VPZmZzZXQgLSAxMikgLyBpbmRlbnQ7XG5cbiAgLy8gRmlsdGVyIHRoZSBleHBhbmRlZCBrZXlzIHRvIGV4Y2x1ZGUgdGhlIG5vZGUgdGhhdCBub3QgaGFzIGNoaWxkcmVuIGN1cnJlbnRseSAobGlrZSBhc3luYyBub2RlcykuXG4gIHZhciBmaWx0ZXJlZEV4cGFuZEtleXMgPSBleHBhbmRLZXlzLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIF9rZXlFbnRpdGllcyRrZXk7XG4gICAgcmV0dXJuIChfa2V5RW50aXRpZXMka2V5ID0ga2V5RW50aXRpZXNba2V5XSkgPT09IG51bGwgfHwgX2tleUVudGl0aWVzJGtleSA9PT0gdm9pZCAwIHx8IChfa2V5RW50aXRpZXMka2V5ID0gX2tleUVudGl0aWVzJGtleS5jaGlsZHJlbikgPT09IG51bGwgfHwgX2tleUVudGl0aWVzJGtleSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2tleUVudGl0aWVzJGtleS5sZW5ndGg7XG4gIH0pO1xuXG4gIC8vIGZpbmQgYWJzdHJhY3QgZHJvcCBub2RlIGJ5IGhvcml6b250YWwgb2Zmc2V0XG4gIHZhciBhYnN0cmFjdERyb3BOb2RlRW50aXR5ID0gZ2V0RW50aXR5KGtleUVudGl0aWVzLCB0YXJnZXROb2RlUHJvcHMuZXZlbnRLZXkpO1xuICBpZiAoY2xpZW50WSA8IHRvcCArIGhlaWdodCAvIDIpIHtcbiAgICAvLyBmaXJzdCBoYWxmLCBzZXQgYWJzdHJhY3QgZHJvcCBub2RlIHRvIHByZXZpb3VzIG5vZGVcbiAgICB2YXIgbm9kZUluZGV4ID0gZmxhdHRlbmVkTm9kZXMuZmluZEluZGV4KGZ1bmN0aW9uIChmbGF0dGVuZWROb2RlKSB7XG4gICAgICByZXR1cm4gZmxhdHRlbmVkTm9kZS5rZXkgPT09IGFic3RyYWN0RHJvcE5vZGVFbnRpdHkua2V5O1xuICAgIH0pO1xuICAgIHZhciBwcmV2Tm9kZUluZGV4ID0gbm9kZUluZGV4IDw9IDAgPyAwIDogbm9kZUluZGV4IC0gMTtcbiAgICB2YXIgcHJldk5vZGVLZXkgPSBmbGF0dGVuZWROb2Rlc1twcmV2Tm9kZUluZGV4XS5rZXk7XG4gICAgYWJzdHJhY3REcm9wTm9kZUVudGl0eSA9IGdldEVudGl0eShrZXlFbnRpdGllcywgcHJldk5vZGVLZXkpO1xuICB9XG4gIHZhciBpbml0aWFsQWJzdHJhY3REcm9wTm9kZUtleSA9IGFic3RyYWN0RHJvcE5vZGVFbnRpdHkua2V5O1xuICB2YXIgYWJzdHJhY3REcmFnT3ZlckVudGl0eSA9IGFic3RyYWN0RHJvcE5vZGVFbnRpdHk7XG4gIHZhciBkcmFnT3Zlck5vZGVLZXkgPSBhYnN0cmFjdERyb3BOb2RlRW50aXR5LmtleTtcbiAgdmFyIGRyb3BQb3NpdGlvbiA9IDA7XG4gIHZhciBkcm9wTGV2ZWxPZmZzZXQgPSAwO1xuXG4gIC8vIE9ubHkgYWxsb3cgY3Jvc3MgbGV2ZWwgZHJvcCB3aGVuIGRyYWdnaW5nIG9uIGEgbm9uLWV4cGFuZGVkIG5vZGVcbiAgaWYgKCFmaWx0ZXJlZEV4cGFuZEtleXMuaW5jbHVkZXMoaW5pdGlhbEFic3RyYWN0RHJvcE5vZGVLZXkpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYXdEcm9wTGV2ZWxPZmZzZXQ7IGkgKz0gMSkge1xuICAgICAgaWYgKGlzTGFzdENoaWxkKGFic3RyYWN0RHJvcE5vZGVFbnRpdHkpKSB7XG4gICAgICAgIGFic3RyYWN0RHJvcE5vZGVFbnRpdHkgPSBhYnN0cmFjdERyb3BOb2RlRW50aXR5LnBhcmVudDtcbiAgICAgICAgZHJvcExldmVsT2Zmc2V0ICs9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGFic3RyYWN0RHJhZ0RhdGFOb2RlID0gZHJhZ05vZGVQcm9wcy5kYXRhO1xuICB2YXIgYWJzdHJhY3REcm9wRGF0YU5vZGUgPSBhYnN0cmFjdERyb3BOb2RlRW50aXR5Lm5vZGU7XG4gIHZhciBkcm9wQWxsb3dlZCA9IHRydWU7XG4gIGlmIChpc0ZpcnN0Q2hpbGQoYWJzdHJhY3REcm9wTm9kZUVudGl0eSkgJiYgYWJzdHJhY3REcm9wTm9kZUVudGl0eS5sZXZlbCA9PT0gMCAmJiBjbGllbnRZIDwgdG9wICsgaGVpZ2h0IC8gMiAmJiBhbGxvd0Ryb3Aoe1xuICAgIGRyYWdOb2RlOiBhYnN0cmFjdERyYWdEYXRhTm9kZSxcbiAgICBkcm9wTm9kZTogYWJzdHJhY3REcm9wRGF0YU5vZGUsXG4gICAgZHJvcFBvc2l0aW9uOiAtMVxuICB9KSAmJiBhYnN0cmFjdERyb3BOb2RlRW50aXR5LmtleSA9PT0gdGFyZ2V0Tm9kZVByb3BzLmV2ZW50S2V5KSB7XG4gICAgLy8gZmlyc3QgaGFsZiBvZiBmaXJzdCBub2RlIGluIGZpcnN0IGxldmVsXG4gICAgZHJvcFBvc2l0aW9uID0gLTE7XG4gIH0gZWxzZSBpZiAoKGFic3RyYWN0RHJhZ092ZXJFbnRpdHkuY2hpbGRyZW4gfHwgW10pLmxlbmd0aCAmJiBmaWx0ZXJlZEV4cGFuZEtleXMuaW5jbHVkZXMoZHJhZ092ZXJOb2RlS2V5KSkge1xuICAgIC8vIGRyb3Agb24gZXhwYW5kZWQgbm9kZVxuICAgIC8vIG9ubHkgYWxsb3cgZHJvcCBpbnNpZGVcbiAgICBpZiAoYWxsb3dEcm9wKHtcbiAgICAgIGRyYWdOb2RlOiBhYnN0cmFjdERyYWdEYXRhTm9kZSxcbiAgICAgIGRyb3BOb2RlOiBhYnN0cmFjdERyb3BEYXRhTm9kZSxcbiAgICAgIGRyb3BQb3NpdGlvbjogMFxuICAgIH0pKSB7XG4gICAgICBkcm9wUG9zaXRpb24gPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBkcm9wQWxsb3dlZCA9IGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkcm9wTGV2ZWxPZmZzZXQgPT09IDApIHtcbiAgICBpZiAocmF3RHJvcExldmVsT2Zmc2V0ID4gLTEuNSkge1xuICAgICAgLy8gfCBOb2RlICAgICB8IDwtIGFic3RyYWN0RHJvcE5vZGVcbiAgICAgIC8vIHwgLV4tPT09PT0gfCA8LSBtb3VzZVBvc2l0aW9uXG4gICAgICAvLyAxLiB0cnkgZHJvcCBhZnRlclxuICAgICAgLy8gMi4gZG8gbm90IGFsbG93IGRyb3BcbiAgICAgIGlmIChhbGxvd0Ryb3Aoe1xuICAgICAgICBkcmFnTm9kZTogYWJzdHJhY3REcmFnRGF0YU5vZGUsXG4gICAgICAgIGRyb3BOb2RlOiBhYnN0cmFjdERyb3BEYXRhTm9kZSxcbiAgICAgICAgZHJvcFBvc2l0aW9uOiAxXG4gICAgICB9KSkge1xuICAgICAgICBkcm9wUG9zaXRpb24gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJvcEFsbG93ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gfCBOb2RlICAgICB8IDwtIGFic3RyYWN0RHJvcE5vZGVcbiAgICAgIC8vIHwgLS0tPT1ePT0gfCA8LSBtb3VzZVBvc2l0aW9uXG4gICAgICAvLyB3aGV0aGVyIGl0IGhhcyBjaGlsZHJlbiBvciBkb2Vzbid0IGhhcyBjaGlsZHJlblxuICAgICAgLy8gYWx3YXlzXG4gICAgICAvLyAxLiB0cnkgZHJvcCBpbnNpZGVcbiAgICAgIC8vIDIuIHRyeSBkcm9wIGFmdGVyXG4gICAgICAvLyAzLiBkbyBub3QgYWxsb3cgZHJvcFxuICAgICAgaWYgKGFsbG93RHJvcCh7XG4gICAgICAgIGRyYWdOb2RlOiBhYnN0cmFjdERyYWdEYXRhTm9kZSxcbiAgICAgICAgZHJvcE5vZGU6IGFic3RyYWN0RHJvcERhdGFOb2RlLFxuICAgICAgICBkcm9wUG9zaXRpb246IDBcbiAgICAgIH0pKSB7XG4gICAgICAgIGRyb3BQb3NpdGlvbiA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGFsbG93RHJvcCh7XG4gICAgICAgIGRyYWdOb2RlOiBhYnN0cmFjdERyYWdEYXRhTm9kZSxcbiAgICAgICAgZHJvcE5vZGU6IGFic3RyYWN0RHJvcERhdGFOb2RlLFxuICAgICAgICBkcm9wUG9zaXRpb246IDFcbiAgICAgIH0pKSB7XG4gICAgICAgIGRyb3BQb3NpdGlvbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcm9wQWxsb3dlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyB8IE5vZGUxIHwgPC0gYWJzdHJhY3REcm9wTm9kZVxuICAgIC8vICAgICAgfCAgTm9kZTIgIHxcbiAgICAvLyAtLV4tLXwtLS0tPT09PT18IDwtIG1vdXNlUG9zaXRpb25cbiAgICAvLyAxLiB0cnkgaW5zZXJ0IGFmdGVyIE5vZGUxXG4gICAgLy8gMi4gZG8gbm90IGFsbG93IGRyb3BcbiAgICBpZiAoYWxsb3dEcm9wKHtcbiAgICAgIGRyYWdOb2RlOiBhYnN0cmFjdERyYWdEYXRhTm9kZSxcbiAgICAgIGRyb3BOb2RlOiBhYnN0cmFjdERyb3BEYXRhTm9kZSxcbiAgICAgIGRyb3BQb3NpdGlvbjogMVxuICAgIH0pKSB7XG4gICAgICBkcm9wUG9zaXRpb24gPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBkcm9wQWxsb3dlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGRyb3BQb3NpdGlvbjogZHJvcFBvc2l0aW9uLFxuICAgIGRyb3BMZXZlbE9mZnNldDogZHJvcExldmVsT2Zmc2V0LFxuICAgIGRyb3BUYXJnZXRLZXk6IGFic3RyYWN0RHJvcE5vZGVFbnRpdHkua2V5LFxuICAgIGRyb3BUYXJnZXRQb3M6IGFic3RyYWN0RHJvcE5vZGVFbnRpdHkucG9zLFxuICAgIGRyYWdPdmVyTm9kZUtleTogZHJhZ092ZXJOb2RlS2V5LFxuICAgIGRyb3BDb250YWluZXJLZXk6IGRyb3BQb3NpdGlvbiA9PT0gMCA/IG51bGwgOiAoKF9hYnN0cmFjdERyb3BOb2RlRW50aSA9IGFic3RyYWN0RHJvcE5vZGVFbnRpdHkucGFyZW50KSA9PT0gbnVsbCB8fCBfYWJzdHJhY3REcm9wTm9kZUVudGkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hYnN0cmFjdERyb3BOb2RlRW50aS5rZXkpIHx8IG51bGwsXG4gICAgZHJvcEFsbG93ZWQ6IGRyb3BBbGxvd2VkXG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJuIHNlbGVjdGVkS2V5cyBhY2NvcmRpbmcgd2l0aCBtdWx0aXBsZSBwcm9wXG4gKiBAcGFyYW0gc2VsZWN0ZWRLZXlzXG4gKiBAcGFyYW0gcHJvcHNcbiAqIEByZXR1cm5zIFtzdHJpbmddXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjU2VsZWN0ZWRLZXlzKHNlbGVjdGVkS2V5cywgcHJvcHMpIHtcbiAgaWYgKCFzZWxlY3RlZEtleXMpIHJldHVybiB1bmRlZmluZWQ7XG4gIHZhciBtdWx0aXBsZSA9IHByb3BzLm11bHRpcGxlO1xuICBpZiAobXVsdGlwbGUpIHtcbiAgICByZXR1cm4gc2VsZWN0ZWRLZXlzLnNsaWNlKCk7XG4gIH1cbiAgaWYgKHNlbGVjdGVkS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gW3NlbGVjdGVkS2V5c1swXV07XG4gIH1cbiAgcmV0dXJuIHNlbGVjdGVkS2V5cztcbn1cbnZhciBpbnRlcm5hbFByb2Nlc3NQcm9wcyA9IGZ1bmN0aW9uIGludGVybmFsUHJvY2Vzc1Byb3BzKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcztcbn07XG5leHBvcnQgZnVuY3Rpb24gY29udmVydERhdGFUb1RyZWUodHJlZURhdGEsIHByb2Nlc3Nvcikge1xuICBpZiAoIXRyZWVEYXRhKSByZXR1cm4gW107XG4gIHZhciBfcmVmMiA9IHByb2Nlc3NvciB8fCB7fSxcbiAgICBfcmVmMiRwcm9jZXNzUHJvcHMgPSBfcmVmMi5wcm9jZXNzUHJvcHMsXG4gICAgcHJvY2Vzc1Byb3BzID0gX3JlZjIkcHJvY2Vzc1Byb3BzID09PSB2b2lkIDAgPyBpbnRlcm5hbFByb2Nlc3NQcm9wcyA6IF9yZWYyJHByb2Nlc3NQcm9wcztcbiAgdmFyIGxpc3QgPSBBcnJheS5pc0FycmF5KHRyZWVEYXRhKSA/IHRyZWVEYXRhIDogW3RyZWVEYXRhXTtcbiAgcmV0dXJuIGxpc3QubWFwKGZ1bmN0aW9uIChfcmVmMykge1xuICAgIHZhciBjaGlsZHJlbiA9IF9yZWYzLmNoaWxkcmVuLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjMsIF9leGNsdWRlZCk7XG4gICAgdmFyIGNoaWxkcmVuTm9kZXMgPSBjb252ZXJ0RGF0YVRvVHJlZShjaGlsZHJlbiwgcHJvY2Vzc29yKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJlZU5vZGUsIF9leHRlbmRzKHtcbiAgICAgIGtleTogcHJvcHMua2V5XG4gICAgfSwgcHJvY2Vzc1Byb3BzKHByb3BzKSksIGNoaWxkcmVuTm9kZXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZSBgY2hlY2tlZEtleXNgIHRvIHsgY2hlY2tlZEtleXMsIGhhbGZDaGVja2VkS2V5cyB9IHN0eWxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNoZWNrZWRLZXlzKGtleXMpIHtcbiAgaWYgKCFrZXlzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBDb252ZXJ0IGtleXMgdG8gb2JqZWN0IGZvcm1hdFxuICB2YXIga2V5UHJvcHM7XG4gIGlmIChBcnJheS5pc0FycmF5KGtleXMpKSB7XG4gICAgLy8gW0xlZ2FjeV0gRm9sbG93IHRoZSBhcGkgZG9jXG4gICAga2V5UHJvcHMgPSB7XG4gICAgICBjaGVja2VkS2V5czoga2V5cyxcbiAgICAgIGhhbGZDaGVja2VkS2V5czogdW5kZWZpbmVkXG4gICAgfTtcbiAgfSBlbHNlIGlmIChfdHlwZW9mKGtleXMpID09PSAnb2JqZWN0Jykge1xuICAgIGtleVByb3BzID0ge1xuICAgICAgY2hlY2tlZEtleXM6IGtleXMuY2hlY2tlZCB8fCB1bmRlZmluZWQsXG4gICAgICBoYWxmQ2hlY2tlZEtleXM6IGtleXMuaGFsZkNoZWNrZWQgfHwgdW5kZWZpbmVkXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB3YXJuaW5nKGZhbHNlLCAnYGNoZWNrZWRLZXlzYCBpcyBub3QgYW4gYXJyYXkgb3IgYW4gb2JqZWN0Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGtleVByb3BzO1xufVxuXG4vKipcbiAqIElmIHVzZXIgdXNlIGBhdXRvRXhwYW5kUGFyZW50YCB3ZSBzaG91bGQgZ2V0IHRoZSBsaXN0IG9mIHBhcmVudCBub2RlXG4gKiBAcGFyYW0ga2V5TGlzdFxuICogQHBhcmFtIGtleUVudGl0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25kdWN0RXhwYW5kUGFyZW50KGtleUxpc3QsIGtleUVudGl0aWVzKSB7XG4gIHZhciBleHBhbmRlZEtleXMgPSBuZXcgU2V0KCk7XG4gIGZ1bmN0aW9uIGNvbmR1Y3RVcChrZXkpIHtcbiAgICBpZiAoZXhwYW5kZWRLZXlzLmhhcyhrZXkpKSByZXR1cm47XG4gICAgdmFyIGVudGl0eSA9IGdldEVudGl0eShrZXlFbnRpdGllcywga2V5KTtcbiAgICBpZiAoIWVudGl0eSkgcmV0dXJuO1xuICAgIGV4cGFuZGVkS2V5cy5hZGQoa2V5KTtcbiAgICB2YXIgcGFyZW50ID0gZW50aXR5LnBhcmVudCxcbiAgICAgIG5vZGUgPSBlbnRpdHkubm9kZTtcbiAgICBpZiAobm9kZS5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIGNvbmR1Y3RVcChwYXJlbnQua2V5KTtcbiAgICB9XG4gIH1cbiAgKGtleUxpc3QgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGNvbmR1Y3RVcChrZXkpO1xuICB9KTtcbiAgcmV0dXJuIF90b0NvbnN1bWFibGVBcnJheShleHBhbmRlZEtleXMpO1xufSIsImltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCBnZXRFbnRpdHkgZnJvbSBcIi4va2V5VXRpbFwiO1xuZnVuY3Rpb24gcmVtb3ZlRnJvbUNoZWNrZWRLZXlzKGhhbGZDaGVja2VkS2V5cywgY2hlY2tlZEtleXMpIHtcbiAgdmFyIGZpbHRlcmVkS2V5cyA9IG5ldyBTZXQoKTtcbiAgaGFsZkNoZWNrZWRLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmICghY2hlY2tlZEtleXMuaGFzKGtleSkpIHtcbiAgICAgIGZpbHRlcmVkS2V5cy5hZGQoa2V5KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZmlsdGVyZWRLZXlzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2hlY2tEaXNhYmxlZChub2RlKSB7XG4gIHZhciBfcmVmID0gbm9kZSB8fCB7fSxcbiAgICBkaXNhYmxlZCA9IF9yZWYuZGlzYWJsZWQsXG4gICAgZGlzYWJsZUNoZWNrYm94ID0gX3JlZi5kaXNhYmxlQ2hlY2tib3gsXG4gICAgY2hlY2thYmxlID0gX3JlZi5jaGVja2FibGU7XG4gIHJldHVybiAhIShkaXNhYmxlZCB8fCBkaXNhYmxlQ2hlY2tib3gpIHx8IGNoZWNrYWJsZSA9PT0gZmFsc2U7XG59XG5cbi8vIEZpbGwgbWlzcyBrZXlzXG5mdW5jdGlvbiBmaWxsQ29uZHVjdENoZWNrKGtleXMsIGxldmVsRW50aXRpZXMsIG1heExldmVsLCBzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKSB7XG4gIHZhciBjaGVja2VkS2V5cyA9IG5ldyBTZXQoa2V5cyk7XG4gIHZhciBoYWxmQ2hlY2tlZEtleXMgPSBuZXcgU2V0KCk7XG5cbiAgLy8gQWRkIGNoZWNrZWQga2V5cyB0b3AgdG8gYm90dG9tXG4gIGZvciAodmFyIGxldmVsID0gMDsgbGV2ZWwgPD0gbWF4TGV2ZWw7IGxldmVsICs9IDEpIHtcbiAgICB2YXIgZW50aXRpZXMgPSBsZXZlbEVudGl0aWVzLmdldChsZXZlbCkgfHwgbmV3IFNldCgpO1xuICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgdmFyIGtleSA9IGVudGl0eS5rZXksXG4gICAgICAgIG5vZGUgPSBlbnRpdHkubm9kZSxcbiAgICAgICAgX2VudGl0eSRjaGlsZHJlbiA9IGVudGl0eS5jaGlsZHJlbixcbiAgICAgICAgY2hpbGRyZW4gPSBfZW50aXR5JGNoaWxkcmVuID09PSB2b2lkIDAgPyBbXSA6IF9lbnRpdHkkY2hpbGRyZW47XG4gICAgICBpZiAoY2hlY2tlZEtleXMuaGFzKGtleSkgJiYgIXN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQobm9kZSkpIHtcbiAgICAgICAgY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjaGlsZEVudGl0eSkge1xuICAgICAgICAgIHJldHVybiAhc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZChjaGlsZEVudGl0eS5ub2RlKTtcbiAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGRFbnRpdHkpIHtcbiAgICAgICAgICBjaGVja2VkS2V5cy5hZGQoY2hpbGRFbnRpdHkua2V5KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBBZGQgY2hlY2tlZCBrZXlzIGZyb20gYm90dG9tIHRvIHRvcFxuICB2YXIgdmlzaXRlZEtleXMgPSBuZXcgU2V0KCk7XG4gIGZvciAodmFyIF9sZXZlbCA9IG1heExldmVsOyBfbGV2ZWwgPj0gMDsgX2xldmVsIC09IDEpIHtcbiAgICB2YXIgX2VudGl0aWVzID0gbGV2ZWxFbnRpdGllcy5nZXQoX2xldmVsKSB8fCBuZXcgU2V0KCk7XG4gICAgX2VudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgdmFyIHBhcmVudCA9IGVudGl0eS5wYXJlbnQsXG4gICAgICAgIG5vZGUgPSBlbnRpdHkubm9kZTtcblxuICAgICAgLy8gU2tpcCBpZiBubyBuZWVkIHRvIGNoZWNrXG4gICAgICBpZiAoc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZChub2RlKSB8fCAhZW50aXR5LnBhcmVudCB8fCB2aXNpdGVkS2V5cy5oYXMoZW50aXR5LnBhcmVudC5rZXkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2tpcCBpZiBwYXJlbnQgaXMgZGlzYWJsZWRcbiAgICAgIGlmIChzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKGVudGl0eS5wYXJlbnQubm9kZSkpIHtcbiAgICAgICAgdmlzaXRlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgYWxsQ2hlY2tlZCA9IHRydWU7XG4gICAgICB2YXIgcGFydGlhbENoZWNrZWQgPSBmYWxzZTtcbiAgICAgIChwYXJlbnQuY2hpbGRyZW4gfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoY2hpbGRFbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuICFzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKGNoaWxkRW50aXR5Lm5vZGUpO1xuICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgdmFyIGtleSA9IF9yZWYyLmtleTtcbiAgICAgICAgdmFyIGNoZWNrZWQgPSBjaGVja2VkS2V5cy5oYXMoa2V5KTtcbiAgICAgICAgaWYgKGFsbENoZWNrZWQgJiYgIWNoZWNrZWQpIHtcbiAgICAgICAgICBhbGxDaGVja2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXJ0aWFsQ2hlY2tlZCAmJiAoY2hlY2tlZCB8fCBoYWxmQ2hlY2tlZEtleXMuaGFzKGtleSkpKSB7XG4gICAgICAgICAgcGFydGlhbENoZWNrZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChhbGxDaGVja2VkKSB7XG4gICAgICAgIGNoZWNrZWRLZXlzLmFkZChwYXJlbnQua2V5KTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJ0aWFsQ2hlY2tlZCkge1xuICAgICAgICBoYWxmQ2hlY2tlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgICAgfVxuICAgICAgdmlzaXRlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgY2hlY2tlZEtleXM6IEFycmF5LmZyb20oY2hlY2tlZEtleXMpLFxuICAgIGhhbGZDaGVja2VkS2V5czogQXJyYXkuZnJvbShyZW1vdmVGcm9tQ2hlY2tlZEtleXMoaGFsZkNoZWNrZWRLZXlzLCBjaGVja2VkS2V5cykpXG4gIH07XG59XG5cbi8vIFJlbW92ZSB1c2VsZXNzIGtleVxuZnVuY3Rpb24gY2xlYW5Db25kdWN0Q2hlY2soa2V5cywgaGFsZktleXMsIGxldmVsRW50aXRpZXMsIG1heExldmVsLCBzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKSB7XG4gIHZhciBjaGVja2VkS2V5cyA9IG5ldyBTZXQoa2V5cyk7XG4gIHZhciBoYWxmQ2hlY2tlZEtleXMgPSBuZXcgU2V0KGhhbGZLZXlzKTtcblxuICAvLyBSZW1vdmUgY2hlY2tlZCBrZXlzIGZyb20gdG9wIHRvIGJvdHRvbVxuICBmb3IgKHZhciBsZXZlbCA9IDA7IGxldmVsIDw9IG1heExldmVsOyBsZXZlbCArPSAxKSB7XG4gICAgdmFyIGVudGl0aWVzID0gbGV2ZWxFbnRpdGllcy5nZXQobGV2ZWwpIHx8IG5ldyBTZXQoKTtcbiAgICBlbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgIHZhciBrZXkgPSBlbnRpdHkua2V5LFxuICAgICAgICBub2RlID0gZW50aXR5Lm5vZGUsXG4gICAgICAgIF9lbnRpdHkkY2hpbGRyZW4yID0gZW50aXR5LmNoaWxkcmVuLFxuICAgICAgICBjaGlsZHJlbiA9IF9lbnRpdHkkY2hpbGRyZW4yID09PSB2b2lkIDAgPyBbXSA6IF9lbnRpdHkkY2hpbGRyZW4yO1xuICAgICAgaWYgKCFjaGVja2VkS2V5cy5oYXMoa2V5KSAmJiAhaGFsZkNoZWNrZWRLZXlzLmhhcyhrZXkpICYmICFzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKG5vZGUpKSB7XG4gICAgICAgIGNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbiAoY2hpbGRFbnRpdHkpIHtcbiAgICAgICAgICByZXR1cm4gIXN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQoY2hpbGRFbnRpdHkubm9kZSk7XG4gICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkRW50aXR5KSB7XG4gICAgICAgICAgY2hlY2tlZEtleXMuZGVsZXRlKGNoaWxkRW50aXR5LmtleSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gUmVtb3ZlIGNoZWNrZWQga2V5cyBmb3JtIGJvdHRvbSB0byB0b3BcbiAgaGFsZkNoZWNrZWRLZXlzID0gbmV3IFNldCgpO1xuICB2YXIgdmlzaXRlZEtleXMgPSBuZXcgU2V0KCk7XG4gIGZvciAodmFyIF9sZXZlbDIgPSBtYXhMZXZlbDsgX2xldmVsMiA+PSAwOyBfbGV2ZWwyIC09IDEpIHtcbiAgICB2YXIgX2VudGl0aWVzMiA9IGxldmVsRW50aXRpZXMuZ2V0KF9sZXZlbDIpIHx8IG5ldyBTZXQoKTtcbiAgICBfZW50aXRpZXMyLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgdmFyIHBhcmVudCA9IGVudGl0eS5wYXJlbnQsXG4gICAgICAgIG5vZGUgPSBlbnRpdHkubm9kZTtcblxuICAgICAgLy8gU2tpcCBpZiBubyBuZWVkIHRvIGNoZWNrXG4gICAgICBpZiAoc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZChub2RlKSB8fCAhZW50aXR5LnBhcmVudCB8fCB2aXNpdGVkS2V5cy5oYXMoZW50aXR5LnBhcmVudC5rZXkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2tpcCBpZiBwYXJlbnQgaXMgZGlzYWJsZWRcbiAgICAgIGlmIChzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKGVudGl0eS5wYXJlbnQubm9kZSkpIHtcbiAgICAgICAgdmlzaXRlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgYWxsQ2hlY2tlZCA9IHRydWU7XG4gICAgICB2YXIgcGFydGlhbENoZWNrZWQgPSBmYWxzZTtcbiAgICAgIChwYXJlbnQuY2hpbGRyZW4gfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoY2hpbGRFbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuICFzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKGNoaWxkRW50aXR5Lm5vZGUpO1xuICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgICAgdmFyIGtleSA9IF9yZWYzLmtleTtcbiAgICAgICAgdmFyIGNoZWNrZWQgPSBjaGVja2VkS2V5cy5oYXMoa2V5KTtcbiAgICAgICAgaWYgKGFsbENoZWNrZWQgJiYgIWNoZWNrZWQpIHtcbiAgICAgICAgICBhbGxDaGVja2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXJ0aWFsQ2hlY2tlZCAmJiAoY2hlY2tlZCB8fCBoYWxmQ2hlY2tlZEtleXMuaGFzKGtleSkpKSB7XG4gICAgICAgICAgcGFydGlhbENoZWNrZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghYWxsQ2hlY2tlZCkge1xuICAgICAgICBjaGVja2VkS2V5cy5kZWxldGUocGFyZW50LmtleSk7XG4gICAgICB9XG4gICAgICBpZiAocGFydGlhbENoZWNrZWQpIHtcbiAgICAgICAgaGFsZkNoZWNrZWRLZXlzLmFkZChwYXJlbnQua2V5KTtcbiAgICAgIH1cbiAgICAgIHZpc2l0ZWRLZXlzLmFkZChwYXJlbnQua2V5KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNoZWNrZWRLZXlzOiBBcnJheS5mcm9tKGNoZWNrZWRLZXlzKSxcbiAgICBoYWxmQ2hlY2tlZEtleXM6IEFycmF5LmZyb20ocmVtb3ZlRnJvbUNoZWNrZWRLZXlzKGhhbGZDaGVja2VkS2V5cywgY2hlY2tlZEtleXMpKVxuICB9O1xufVxuXG4vKipcbiAqIENvbmR1Y3Qgd2l0aCBrZXlzLlxuICogQHBhcmFtIGtleUxpc3QgY3VycmVudCBrZXkgbGlzdFxuICogQHBhcmFtIGtleUVudGl0aWVzIGtleSAtIGRhdGFFbnRpdHkgbWFwXG4gKiBAcGFyYW0gbW9kZSBgZmlsbGAgdG8gZmlsbCBtaXNzaW5nIGtleSwgYGNsZWFuYCB0byByZW1vdmUgdXNlbGVzcyBrZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmR1Y3RDaGVjayhrZXlMaXN0LCBjaGVja2VkLCBrZXlFbnRpdGllcywgZ2V0Q2hlY2tEaXNhYmxlZCkge1xuICB2YXIgd2FybmluZ01pc3NLZXlzID0gW107XG4gIHZhciBzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkO1xuICBpZiAoZ2V0Q2hlY2tEaXNhYmxlZCkge1xuICAgIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQgPSBnZXRDaGVja0Rpc2FibGVkO1xuICB9IGVsc2Uge1xuICAgIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQgPSBpc0NoZWNrRGlzYWJsZWQ7XG4gIH1cblxuICAvLyBXZSBvbmx5IGhhbmRsZSBleGlzdCBrZXlzXG4gIHZhciBrZXlzID0gbmV3IFNldChrZXlMaXN0LmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGhhc0VudGl0eSA9ICEhZ2V0RW50aXR5KGtleUVudGl0aWVzLCBrZXkpO1xuICAgIGlmICghaGFzRW50aXR5KSB7XG4gICAgICB3YXJuaW5nTWlzc0tleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gaGFzRW50aXR5O1xuICB9KSk7XG4gIHZhciBsZXZlbEVudGl0aWVzID0gbmV3IE1hcCgpO1xuICB2YXIgbWF4TGV2ZWwgPSAwO1xuXG4gIC8vIENvbnZlcnQgZW50aXRpZXMgYnkgbGV2ZWwgZm9yIGNhbGN1bGF0aW9uXG4gIE9iamVjdC5rZXlzKGtleUVudGl0aWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgZW50aXR5ID0ga2V5RW50aXRpZXNba2V5XTtcbiAgICB2YXIgbGV2ZWwgPSBlbnRpdHkubGV2ZWw7XG4gICAgdmFyIGxldmVsU2V0ID0gbGV2ZWxFbnRpdGllcy5nZXQobGV2ZWwpO1xuICAgIGlmICghbGV2ZWxTZXQpIHtcbiAgICAgIGxldmVsU2V0ID0gbmV3IFNldCgpO1xuICAgICAgbGV2ZWxFbnRpdGllcy5zZXQobGV2ZWwsIGxldmVsU2V0KTtcbiAgICB9XG4gICAgbGV2ZWxTZXQuYWRkKGVudGl0eSk7XG4gICAgbWF4TGV2ZWwgPSBNYXRoLm1heChtYXhMZXZlbCwgbGV2ZWwpO1xuICB9KTtcbiAgd2FybmluZyghd2FybmluZ01pc3NLZXlzLmxlbmd0aCwgXCJUcmVlIG1pc3NpbmcgZm9sbG93IGtleXM6IFwiLmNvbmNhdCh3YXJuaW5nTWlzc0tleXMuc2xpY2UoMCwgMTAwKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBcIidcIi5jb25jYXQoa2V5LCBcIidcIik7XG4gIH0pLmpvaW4oJywgJykpKTtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKGNoZWNrZWQgPT09IHRydWUpIHtcbiAgICByZXN1bHQgPSBmaWxsQ29uZHVjdENoZWNrKGtleXMsIGxldmVsRW50aXRpZXMsIG1heExldmVsLCBzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBjbGVhbkNvbmR1Y3RDaGVjayhrZXlzLCBjaGVja2VkLmhhbGZDaGVja2VkS2V5cywgbGV2ZWxFbnRpdGllcywgbWF4TGV2ZWwsIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59IiwiZXhwb3J0IGZ1bmN0aW9uIGZpbmRFeHBhbmRlZEtleXMoKSB7XG4gIHZhciBwcmV2ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgdmFyIG5leHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFtdO1xuICB2YXIgcHJldkxlbiA9IHByZXYubGVuZ3RoO1xuICB2YXIgbmV4dExlbiA9IG5leHQubGVuZ3RoO1xuICBpZiAoTWF0aC5hYnMocHJldkxlbiAtIG5leHRMZW4pICE9PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZDogZmFsc2UsXG4gICAgICBrZXk6IG51bGxcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGZpbmQoc2hvcnRlciwgbG9uZ2VyKSB7XG4gICAgdmFyIGNhY2hlID0gbmV3IE1hcCgpO1xuICAgIHNob3J0ZXIuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBjYWNoZS5zZXQoa2V5LCB0cnVlKTtcbiAgICB9KTtcbiAgICB2YXIga2V5cyA9IGxvbmdlci5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuICFjYWNoZS5oYXMoa2V5KTtcbiAgICB9KTtcbiAgICByZXR1cm4ga2V5cy5sZW5ndGggPT09IDEgPyBrZXlzWzBdIDogbnVsbDtcbiAgfVxuICBpZiAocHJldkxlbiA8IG5leHRMZW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWRkOiB0cnVlLFxuICAgICAga2V5OiBmaW5kKHByZXYsIG5leHQpXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGFkZDogZmFsc2UsXG4gICAga2V5OiBmaW5kKG5leHQsIHByZXYpXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwYW5kUmFuZ2Uoc2hvcnRlciwgbG9uZ2VyLCBrZXkpIHtcbiAgdmFyIHNob3J0ZXJTdGFydEluZGV4ID0gc2hvcnRlci5maW5kSW5kZXgoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YS5rZXkgPT09IGtleTtcbiAgfSk7XG4gIHZhciBzaG9ydGVyRW5kTm9kZSA9IHNob3J0ZXJbc2hvcnRlclN0YXJ0SW5kZXggKyAxXTtcbiAgdmFyIGxvbmdlclN0YXJ0SW5kZXggPSBsb25nZXIuZmluZEluZGV4KGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEua2V5ID09PSBrZXk7XG4gIH0pO1xuICBpZiAoc2hvcnRlckVuZE5vZGUpIHtcbiAgICB2YXIgbG9uZ2VyRW5kSW5kZXggPSBsb25nZXIuZmluZEluZGV4KGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICByZXR1cm4gZGF0YS5rZXkgPT09IHNob3J0ZXJFbmROb2RlLmtleTtcbiAgICB9KTtcbiAgICByZXR1cm4gbG9uZ2VyLnNsaWNlKGxvbmdlclN0YXJ0SW5kZXggKyAxLCBsb25nZXJFbmRJbmRleCk7XG4gIH1cbiAgcmV0dXJuIGxvbmdlci5zbGljZShsb25nZXJTdGFydEluZGV4ICsgMSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RW50aXR5KGtleUVudGl0aWVzLCBrZXkpIHtcbiAgcmV0dXJuIGtleUVudGl0aWVzW2tleV07XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImNoaWxkcmVuXCJdO1xuaW1wb3J0IHRvQXJyYXkgZnJvbSBcInJjLXV0aWwvZXMvQ2hpbGRyZW4vdG9BcnJheVwiO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IGdldEVudGl0eSBmcm9tIFwiLi9rZXlVdGlsXCI7XG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9zaXRpb24obGV2ZWwsIGluZGV4KSB7XG4gIHJldHVybiBcIlwiLmNvbmNhdChsZXZlbCwgXCItXCIpLmNvbmNhdChpbmRleCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUcmVlTm9kZShub2RlKSB7XG4gIHJldHVybiBub2RlICYmIG5vZGUudHlwZSAmJiBub2RlLnR5cGUuaXNUcmVlTm9kZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXkoa2V5LCBwb3MpIHtcbiAgaWYgKGtleSAhPT0gbnVsbCAmJiBrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBrZXk7XG4gIH1cbiAgcmV0dXJuIHBvcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaWxsRmllbGROYW1lcyhmaWVsZE5hbWVzKSB7XG4gIHZhciBfcmVmID0gZmllbGROYW1lcyB8fCB7fSxcbiAgICB0aXRsZSA9IF9yZWYudGl0bGUsXG4gICAgX3RpdGxlID0gX3JlZi5fdGl0bGUsXG4gICAga2V5ID0gX3JlZi5rZXksXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICB2YXIgbWVyZ2VkVGl0bGUgPSB0aXRsZSB8fCAndGl0bGUnO1xuICByZXR1cm4ge1xuICAgIHRpdGxlOiBtZXJnZWRUaXRsZSxcbiAgICBfdGl0bGU6IF90aXRsZSB8fCBbbWVyZ2VkVGl0bGVdLFxuICAgIGtleToga2V5IHx8ICdrZXknLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbiB8fCAnY2hpbGRyZW4nXG4gIH07XG59XG5cbi8qKlxuICogV2FybmluZyBpZiBUcmVlTm9kZSBkbyBub3QgcHJvdmlkZXMga2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXJuaW5nV2l0aG91dEtleSh0cmVlRGF0YSwgZmllbGROYW1lcykge1xuICB2YXIga2V5cyA9IG5ldyBNYXAoKTtcbiAgZnVuY3Rpb24gZGlnKGxpc3QpIHtcbiAgICB2YXIgcGF0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJyc7XG4gICAgKGxpc3QgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHRyZWVOb2RlKSB7XG4gICAgICB2YXIga2V5ID0gdHJlZU5vZGVbZmllbGROYW1lcy5rZXldO1xuICAgICAgdmFyIGNoaWxkcmVuID0gdHJlZU5vZGVbZmllbGROYW1lcy5jaGlsZHJlbl07XG4gICAgICB3YXJuaW5nKGtleSAhPT0gbnVsbCAmJiBrZXkgIT09IHVuZGVmaW5lZCwgXCJUcmVlIG5vZGUgbXVzdCBoYXZlIGEgY2VydGFpbiBrZXk6IFtcIi5jb25jYXQocGF0aCkuY29uY2F0KGtleSwgXCJdXCIpKTtcbiAgICAgIHZhciByZWNvcmRLZXkgPSBTdHJpbmcoa2V5KTtcbiAgICAgIHdhcm5pbmcoIWtleXMuaGFzKHJlY29yZEtleSkgfHwga2V5ID09PSBudWxsIHx8IGtleSA9PT0gdW5kZWZpbmVkLCBcIlNhbWUgJ2tleScgZXhpc3QgaW4gdGhlIFRyZWU6IFwiLmNvbmNhdChyZWNvcmRLZXkpKTtcbiAgICAgIGtleXMuc2V0KHJlY29yZEtleSwgdHJ1ZSk7XG4gICAgICBkaWcoY2hpbGRyZW4sIFwiXCIuY29uY2F0KHBhdGgpLmNvbmNhdChyZWNvcmRLZXksIFwiID4gXCIpKTtcbiAgICB9KTtcbiAgfVxuICBkaWcodHJlZURhdGEpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYGNoaWxkcmVuYCBvZiBUcmVlIGludG8gYHRyZWVEYXRhYCBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VHJlZVRvRGF0YShyb290Tm9kZXMpIHtcbiAgZnVuY3Rpb24gZGlnKG5vZGUpIHtcbiAgICB2YXIgdHJlZU5vZGVzID0gdG9BcnJheShub2RlKTtcbiAgICByZXR1cm4gdHJlZU5vZGVzLm1hcChmdW5jdGlvbiAodHJlZU5vZGUpIHtcbiAgICAgIC8vIEZpbHRlciBpbnZhbGlkYXRlIG5vZGVcbiAgICAgIGlmICghaXNUcmVlTm9kZSh0cmVlTm9kZSkpIHtcbiAgICAgICAgd2FybmluZyghdHJlZU5vZGUsICdUcmVlL1RyZWVOb2RlIGNhbiBvbmx5IGFjY2VwdCBUcmVlTm9kZSBhcyBjaGlsZHJlbi4nKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB2YXIga2V5ID0gdHJlZU5vZGUua2V5O1xuICAgICAgdmFyIF90cmVlTm9kZSRwcm9wcyA9IHRyZWVOb2RlLnByb3BzLFxuICAgICAgICBjaGlsZHJlbiA9IF90cmVlTm9kZSRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdHJlZU5vZGUkcHJvcHMsIF9leGNsdWRlZCk7XG4gICAgICB2YXIgZGF0YU5vZGUgPSBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAga2V5OiBrZXlcbiAgICAgIH0sIHJlc3QpO1xuICAgICAgdmFyIHBhcnNlZENoaWxkcmVuID0gZGlnKGNoaWxkcmVuKTtcbiAgICAgIGlmIChwYXJzZWRDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgZGF0YU5vZGUuY2hpbGRyZW4gPSBwYXJzZWRDaGlsZHJlbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhTm9kZTtcbiAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGRhdGFOb2RlKSB7XG4gICAgICByZXR1cm4gZGF0YU5vZGU7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGRpZyhyb290Tm9kZXMpO1xufVxuXG4vKipcbiAqIEZsYXQgbmVzdCB0cmVlIGRhdGEgaW50byBmbGF0dGVuIGxpc3QuIFRoaXMgaXMgdXNlZCBmb3IgdmlydHVhbCBsaXN0IHJlbmRlci5cbiAqIEBwYXJhbSB0cmVlTm9kZUxpc3QgT3JpZ2luIGRhdGEgbm9kZSBsaXN0XG4gKiBAcGFyYW0gZXhwYW5kZWRLZXlzXG4gKiBuZWVkIGV4cGFuZGVkIGtleXMsIHByb3ZpZGVzIGB0cnVlYCBtZWFucyBhbGwgZXhwYW5kZWQgKHVzZWQgaW4gYHJjLXRyZWUtc2VsZWN0YCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuVHJlZURhdGEodHJlZU5vZGVMaXN0LCBleHBhbmRlZEtleXMsIGZpZWxkTmFtZXMpIHtcbiAgdmFyIF9maWxsRmllbGROYW1lcyA9IGZpbGxGaWVsZE5hbWVzKGZpZWxkTmFtZXMpLFxuICAgIGZpZWxkVGl0bGVzID0gX2ZpbGxGaWVsZE5hbWVzLl90aXRsZSxcbiAgICBmaWVsZEtleSA9IF9maWxsRmllbGROYW1lcy5rZXksXG4gICAgZmllbGRDaGlsZHJlbiA9IF9maWxsRmllbGROYW1lcy5jaGlsZHJlbjtcbiAgdmFyIGV4cGFuZGVkS2V5U2V0ID0gbmV3IFNldChleHBhbmRlZEtleXMgPT09IHRydWUgPyBbXSA6IGV4cGFuZGVkS2V5cyk7XG4gIHZhciBmbGF0dGVuTGlzdCA9IFtdO1xuICBmdW5jdGlvbiBkaWcobGlzdCkge1xuICAgIHZhciBwYXJlbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgcmV0dXJuIGxpc3QubWFwKGZ1bmN0aW9uICh0cmVlTm9kZSwgaW5kZXgpIHtcbiAgICAgIHZhciBwb3MgPSBnZXRQb3NpdGlvbihwYXJlbnQgPyBwYXJlbnQucG9zIDogJzAnLCBpbmRleCk7XG4gICAgICB2YXIgbWVyZ2VkS2V5ID0gZ2V0S2V5KHRyZWVOb2RlW2ZpZWxkS2V5XSwgcG9zKTtcblxuICAgICAgLy8gUGljayBtYXRjaGVkIHRpdGxlIGluIGZpZWxkIHRpdGxlIGxpc3RcbiAgICAgIHZhciBtZXJnZWRUaXRsZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRUaXRsZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGZpZWxkVGl0bGUgPSBmaWVsZFRpdGxlc1tpXTtcbiAgICAgICAgaWYgKHRyZWVOb2RlW2ZpZWxkVGl0bGVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBtZXJnZWRUaXRsZSA9IHRyZWVOb2RlW2ZpZWxkVGl0bGVdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBGbGF0dGVuRGF0YU5vZGUgaW50byBsaXN0XG4gICAgICAvLyBXZSB1c2UgYE9iamVjdC5hc3NpZ25gIGhlcmUgdG8gc2F2ZSBwZXJmIHNpbmNlIGJhYmVsJ3MgYG9iamVjdFNwcmVhZGAgaGFzIHBlcmYgaXNzdWVcbiAgICAgIHZhciBmbGF0dGVuTm9kZSA9IE9iamVjdC5hc3NpZ24ob21pdCh0cmVlTm9kZSwgW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShmaWVsZFRpdGxlcyksIFtmaWVsZEtleSwgZmllbGRDaGlsZHJlbl0pKSwge1xuICAgICAgICB0aXRsZTogbWVyZ2VkVGl0bGUsXG4gICAgICAgIGtleTogbWVyZ2VkS2V5LFxuICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgcG9zOiBwb3MsXG4gICAgICAgIGNoaWxkcmVuOiBudWxsLFxuICAgICAgICBkYXRhOiB0cmVlTm9kZSxcbiAgICAgICAgaXNTdGFydDogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwYXJlbnQgPyBwYXJlbnQuaXNTdGFydCA6IFtdKSwgW2luZGV4ID09PSAwXSksXG4gICAgICAgIGlzRW5kOiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHBhcmVudCA/IHBhcmVudC5pc0VuZCA6IFtdKSwgW2luZGV4ID09PSBsaXN0Lmxlbmd0aCAtIDFdKVxuICAgICAgfSk7XG4gICAgICBmbGF0dGVuTGlzdC5wdXNoKGZsYXR0ZW5Ob2RlKTtcblxuICAgICAgLy8gTG9vcCB0cmVlTm9kZSBjaGlsZHJlblxuICAgICAgaWYgKGV4cGFuZGVkS2V5cyA9PT0gdHJ1ZSB8fCBleHBhbmRlZEtleVNldC5oYXMobWVyZ2VkS2V5KSkge1xuICAgICAgICBmbGF0dGVuTm9kZS5jaGlsZHJlbiA9IGRpZyh0cmVlTm9kZVtmaWVsZENoaWxkcmVuXSB8fCBbXSwgZmxhdHRlbk5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmxhdHRlbk5vZGUuY2hpbGRyZW4gPSBbXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmbGF0dGVuTm9kZTtcbiAgICB9KTtcbiAgfVxuICBkaWcodHJlZU5vZGVMaXN0KTtcbiAgcmV0dXJuIGZsYXR0ZW5MaXN0O1xufVxuLyoqXG4gKiBUcmF2ZXJzZSBhbGwgdGhlIGRhdGEgYnkgYHRyZWVEYXRhYC5cbiAqIFBsZWFzZSBub3QgdXNlIGl0IG91dCBvZiB0aGUgYHJjLXRyZWVgIHNpbmNlIHdlIG1heSByZWZhY3RvciB0aGlzIGNvZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmF2ZXJzZURhdGFOb2RlcyhkYXRhTm9kZXMsIGNhbGxiYWNrLFxuLy8gVG8gYXZvaWQgdG9vIG1hbnkgcGFyYW1zLCBsZXQgdXNlIGNvbmZpZyBpbnN0ZWFkIG9mIG9yaWdpbiBwYXJhbVxuY29uZmlnKSB7XG4gIHZhciBtZXJnZWRDb25maWcgPSB7fTtcbiAgaWYgKF90eXBlb2YoY29uZmlnKSA9PT0gJ29iamVjdCcpIHtcbiAgICBtZXJnZWRDb25maWcgPSBjb25maWc7XG4gIH0gZWxzZSB7XG4gICAgbWVyZ2VkQ29uZmlnID0ge1xuICAgICAgZXh0ZXJuYWxHZXRLZXk6IGNvbmZpZ1xuICAgIH07XG4gIH1cbiAgbWVyZ2VkQ29uZmlnID0gbWVyZ2VkQ29uZmlnIHx8IHt9O1xuXG4gIC8vIEluaXQgY29uZmlnXG4gIHZhciBfbWVyZ2VkQ29uZmlnID0gbWVyZ2VkQ29uZmlnLFxuICAgIGNoaWxkcmVuUHJvcE5hbWUgPSBfbWVyZ2VkQ29uZmlnLmNoaWxkcmVuUHJvcE5hbWUsXG4gICAgZXh0ZXJuYWxHZXRLZXkgPSBfbWVyZ2VkQ29uZmlnLmV4dGVybmFsR2V0S2V5LFxuICAgIGZpZWxkTmFtZXMgPSBfbWVyZ2VkQ29uZmlnLmZpZWxkTmFtZXM7XG4gIHZhciBfZmlsbEZpZWxkTmFtZXMyID0gZmlsbEZpZWxkTmFtZXMoZmllbGROYW1lcyksXG4gICAgZmllbGRLZXkgPSBfZmlsbEZpZWxkTmFtZXMyLmtleSxcbiAgICBmaWVsZENoaWxkcmVuID0gX2ZpbGxGaWVsZE5hbWVzMi5jaGlsZHJlbjtcbiAgdmFyIG1lcmdlQ2hpbGRyZW5Qcm9wTmFtZSA9IGNoaWxkcmVuUHJvcE5hbWUgfHwgZmllbGRDaGlsZHJlbjtcblxuICAvLyBHZXQga2V5c1xuICB2YXIgc3ludGhldGljR2V0S2V5O1xuICBpZiAoZXh0ZXJuYWxHZXRLZXkpIHtcbiAgICBpZiAodHlwZW9mIGV4dGVybmFsR2V0S2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgc3ludGhldGljR2V0S2V5ID0gZnVuY3Rpb24gc3ludGhldGljR2V0S2V5KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVbZXh0ZXJuYWxHZXRLZXldO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHRlcm5hbEdldEtleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3ludGhldGljR2V0S2V5ID0gZnVuY3Rpb24gc3ludGhldGljR2V0S2V5KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVybmFsR2V0S2V5KG5vZGUpO1xuICAgICAgfTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3ludGhldGljR2V0S2V5ID0gZnVuY3Rpb24gc3ludGhldGljR2V0S2V5KG5vZGUsIHBvcykge1xuICAgICAgcmV0dXJuIGdldEtleShub2RlW2ZpZWxkS2V5XSwgcG9zKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gUHJvY2Vzc1xuICBmdW5jdGlvbiBwcm9jZXNzTm9kZShub2RlLCBpbmRleCwgcGFyZW50LCBwYXRoTm9kZXMpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlID8gbm9kZVttZXJnZUNoaWxkcmVuUHJvcE5hbWVdIDogZGF0YU5vZGVzO1xuICAgIHZhciBwb3MgPSBub2RlID8gZ2V0UG9zaXRpb24ocGFyZW50LnBvcywgaW5kZXgpIDogJzAnO1xuICAgIHZhciBjb25uZWN0Tm9kZXMgPSBub2RlID8gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwYXRoTm9kZXMpLCBbbm9kZV0pIDogW107XG5cbiAgICAvLyBQcm9jZXNzIG5vZGUgaWYgaXMgbm90IHJvb3RcbiAgICBpZiAobm9kZSkge1xuICAgICAgdmFyIGtleSA9IHN5bnRoZXRpY0dldEtleShub2RlLCBwb3MpO1xuICAgICAgdmFyIF9kYXRhID0ge1xuICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgIHBvczogcG9zLFxuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgcGFyZW50UG9zOiBwYXJlbnQubm9kZSA/IHBhcmVudC5wb3MgOiBudWxsLFxuICAgICAgICBsZXZlbDogcGFyZW50LmxldmVsICsgMSxcbiAgICAgICAgbm9kZXM6IGNvbm5lY3ROb2Rlc1xuICAgICAgfTtcbiAgICAgIGNhbGxiYWNrKF9kYXRhKTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGNoaWxkcmVuIG5vZGVcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKHN1Yk5vZGUsIHN1YkluZGV4KSB7XG4gICAgICAgIHByb2Nlc3NOb2RlKHN1Yk5vZGUsIHN1YkluZGV4LCB7XG4gICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICBwb3M6IHBvcyxcbiAgICAgICAgICBsZXZlbDogcGFyZW50ID8gcGFyZW50LmxldmVsICsgMSA6IC0xXG4gICAgICAgIH0sIGNvbm5lY3ROb2Rlcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcHJvY2Vzc05vZGUobnVsbCk7XG59XG4vKipcbiAqIENvbnZlcnQgYHRyZWVEYXRhYCBpbnRvIGVudGl0eSByZWNvcmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydERhdGFUb0VudGl0aWVzKGRhdGFOb2Rlcykge1xuICB2YXIgX3JlZjIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgIGluaXRXcmFwcGVyID0gX3JlZjIuaW5pdFdyYXBwZXIsXG4gICAgcHJvY2Vzc0VudGl0eSA9IF9yZWYyLnByb2Nlc3NFbnRpdHksXG4gICAgb25Qcm9jZXNzRmluaXNoZWQgPSBfcmVmMi5vblByb2Nlc3NGaW5pc2hlZCxcbiAgICBleHRlcm5hbEdldEtleSA9IF9yZWYyLmV4dGVybmFsR2V0S2V5LFxuICAgIGNoaWxkcmVuUHJvcE5hbWUgPSBfcmVmMi5jaGlsZHJlblByb3BOYW1lLFxuICAgIGZpZWxkTmFtZXMgPSBfcmVmMi5maWVsZE5hbWVzO1xuICB2YXIgLyoqIEBkZXByZWNhdGVkIFVzZSBgY29uZmlnLmV4dGVybmFsR2V0S2V5YCBpbnN0ZWFkICovXG4gIGxlZ2FjeUV4dGVybmFsR2V0S2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIC8vIEluaXQgY29uZmlnXG4gIHZhciBtZXJnZWRFeHRlcm5hbEdldEtleSA9IGV4dGVybmFsR2V0S2V5IHx8IGxlZ2FjeUV4dGVybmFsR2V0S2V5O1xuICB2YXIgcG9zRW50aXRpZXMgPSB7fTtcbiAgdmFyIGtleUVudGl0aWVzID0ge307XG4gIHZhciB3cmFwcGVyID0ge1xuICAgIHBvc0VudGl0aWVzOiBwb3NFbnRpdGllcyxcbiAgICBrZXlFbnRpdGllczoga2V5RW50aXRpZXNcbiAgfTtcbiAgaWYgKGluaXRXcmFwcGVyKSB7XG4gICAgd3JhcHBlciA9IGluaXRXcmFwcGVyKHdyYXBwZXIpIHx8IHdyYXBwZXI7XG4gIH1cbiAgdHJhdmVyc2VEYXRhTm9kZXMoZGF0YU5vZGVzLCBmdW5jdGlvbiAoaXRlbSkge1xuICAgIHZhciBub2RlID0gaXRlbS5ub2RlLFxuICAgICAgaW5kZXggPSBpdGVtLmluZGV4LFxuICAgICAgcG9zID0gaXRlbS5wb3MsXG4gICAgICBrZXkgPSBpdGVtLmtleSxcbiAgICAgIHBhcmVudFBvcyA9IGl0ZW0ucGFyZW50UG9zLFxuICAgICAgbGV2ZWwgPSBpdGVtLmxldmVsLFxuICAgICAgbm9kZXMgPSBpdGVtLm5vZGVzO1xuICAgIHZhciBlbnRpdHkgPSB7XG4gICAgICBub2RlOiBub2RlLFxuICAgICAgbm9kZXM6IG5vZGVzLFxuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAga2V5OiBrZXksXG4gICAgICBwb3M6IHBvcyxcbiAgICAgIGxldmVsOiBsZXZlbFxuICAgIH07XG4gICAgdmFyIG1lcmdlZEtleSA9IGdldEtleShrZXksIHBvcyk7XG4gICAgcG9zRW50aXRpZXNbcG9zXSA9IGVudGl0eTtcbiAgICBrZXlFbnRpdGllc1ttZXJnZWRLZXldID0gZW50aXR5O1xuXG4gICAgLy8gRmlsbCBjaGlsZHJlblxuICAgIGVudGl0eS5wYXJlbnQgPSBwb3NFbnRpdGllc1twYXJlbnRQb3NdO1xuICAgIGlmIChlbnRpdHkucGFyZW50KSB7XG4gICAgICBlbnRpdHkucGFyZW50LmNoaWxkcmVuID0gZW50aXR5LnBhcmVudC5jaGlsZHJlbiB8fCBbXTtcbiAgICAgIGVudGl0eS5wYXJlbnQuY2hpbGRyZW4ucHVzaChlbnRpdHkpO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzc0VudGl0eSkge1xuICAgICAgcHJvY2Vzc0VudGl0eShlbnRpdHksIHdyYXBwZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGV4dGVybmFsR2V0S2V5OiBtZXJnZWRFeHRlcm5hbEdldEtleSxcbiAgICBjaGlsZHJlblByb3BOYW1lOiBjaGlsZHJlblByb3BOYW1lLFxuICAgIGZpZWxkTmFtZXM6IGZpZWxkTmFtZXNcbiAgfSk7XG4gIGlmIChvblByb2Nlc3NGaW5pc2hlZCkge1xuICAgIG9uUHJvY2Vzc0ZpbmlzaGVkKHdyYXBwZXIpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuLyoqXG4gKiBHZXQgVHJlZU5vZGUgcHJvcHMgd2l0aCBUcmVlIHByb3BzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJlZU5vZGVQcm9wcyhrZXksIF9yZWYzKSB7XG4gIHZhciBleHBhbmRlZEtleXMgPSBfcmVmMy5leHBhbmRlZEtleXMsXG4gICAgc2VsZWN0ZWRLZXlzID0gX3JlZjMuc2VsZWN0ZWRLZXlzLFxuICAgIGxvYWRlZEtleXMgPSBfcmVmMy5sb2FkZWRLZXlzLFxuICAgIGxvYWRpbmdLZXlzID0gX3JlZjMubG9hZGluZ0tleXMsXG4gICAgY2hlY2tlZEtleXMgPSBfcmVmMy5jaGVja2VkS2V5cyxcbiAgICBoYWxmQ2hlY2tlZEtleXMgPSBfcmVmMy5oYWxmQ2hlY2tlZEtleXMsXG4gICAgZHJhZ092ZXJOb2RlS2V5ID0gX3JlZjMuZHJhZ092ZXJOb2RlS2V5LFxuICAgIGRyb3BQb3NpdGlvbiA9IF9yZWYzLmRyb3BQb3NpdGlvbixcbiAgICBrZXlFbnRpdGllcyA9IF9yZWYzLmtleUVudGl0aWVzO1xuICB2YXIgZW50aXR5ID0gZ2V0RW50aXR5KGtleUVudGl0aWVzLCBrZXkpO1xuICB2YXIgdHJlZU5vZGVQcm9wcyA9IHtcbiAgICBldmVudEtleToga2V5LFxuICAgIGV4cGFuZGVkOiBleHBhbmRlZEtleXMuaW5kZXhPZihrZXkpICE9PSAtMSxcbiAgICBzZWxlY3RlZDogc2VsZWN0ZWRLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEsXG4gICAgbG9hZGVkOiBsb2FkZWRLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEsXG4gICAgbG9hZGluZzogbG9hZGluZ0tleXMuaW5kZXhPZihrZXkpICE9PSAtMSxcbiAgICBjaGVja2VkOiBjaGVja2VkS2V5cy5pbmRleE9mKGtleSkgIT09IC0xLFxuICAgIGhhbGZDaGVja2VkOiBoYWxmQ2hlY2tlZEtleXMuaW5kZXhPZihrZXkpICE9PSAtMSxcbiAgICBwb3M6IFN0cmluZyhlbnRpdHkgPyBlbnRpdHkucG9zIDogJycpLFxuICAgIC8vIFtMZWdhY3ldIERyYWcgcHJvcHNcbiAgICAvLyBTaW5jZSB0aGUgaW50ZXJhY3Rpb24gb2YgZHJhZyBpcyBjaGFuZ2VkLCB0aGUgc2VtYW50aWMgb2YgdGhlIHByb3BzIGFyZVxuICAgIC8vIG5vdCBhY2N1cmFjeSwgSSB0aGluayBpdCBzaG91bGQgYmUgZmluYWxseSByZW1vdmVkXG4gICAgZHJhZ092ZXI6IGRyYWdPdmVyTm9kZUtleSA9PT0ga2V5ICYmIGRyb3BQb3NpdGlvbiA9PT0gMCxcbiAgICBkcmFnT3ZlckdhcFRvcDogZHJhZ092ZXJOb2RlS2V5ID09PSBrZXkgJiYgZHJvcFBvc2l0aW9uID09PSAtMSxcbiAgICBkcmFnT3ZlckdhcEJvdHRvbTogZHJhZ092ZXJOb2RlS2V5ID09PSBrZXkgJiYgZHJvcFBvc2l0aW9uID09PSAxXG4gIH07XG4gIHJldHVybiB0cmVlTm9kZVByb3BzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShwcm9wcykge1xuICB2YXIgZGF0YSA9IHByb3BzLmRhdGEsXG4gICAgZXhwYW5kZWQgPSBwcm9wcy5leHBhbmRlZCxcbiAgICBzZWxlY3RlZCA9IHByb3BzLnNlbGVjdGVkLFxuICAgIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkLFxuICAgIGxvYWRlZCA9IHByb3BzLmxvYWRlZCxcbiAgICBsb2FkaW5nID0gcHJvcHMubG9hZGluZyxcbiAgICBoYWxmQ2hlY2tlZCA9IHByb3BzLmhhbGZDaGVja2VkLFxuICAgIGRyYWdPdmVyID0gcHJvcHMuZHJhZ092ZXIsXG4gICAgZHJhZ092ZXJHYXBUb3AgPSBwcm9wcy5kcmFnT3ZlckdhcFRvcCxcbiAgICBkcmFnT3ZlckdhcEJvdHRvbSA9IHByb3BzLmRyYWdPdmVyR2FwQm90dG9tLFxuICAgIHBvcyA9IHByb3BzLnBvcyxcbiAgICBhY3RpdmUgPSBwcm9wcy5hY3RpdmUsXG4gICAgZXZlbnRLZXkgPSBwcm9wcy5ldmVudEtleTtcbiAgdmFyIGV2ZW50RGF0YSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZGF0YSksIHt9LCB7XG4gICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgIHNlbGVjdGVkOiBzZWxlY3RlZCxcbiAgICBjaGVja2VkOiBjaGVja2VkLFxuICAgIGxvYWRlZDogbG9hZGVkLFxuICAgIGxvYWRpbmc6IGxvYWRpbmcsXG4gICAgaGFsZkNoZWNrZWQ6IGhhbGZDaGVja2VkLFxuICAgIGRyYWdPdmVyOiBkcmFnT3ZlcixcbiAgICBkcmFnT3ZlckdhcFRvcDogZHJhZ092ZXJHYXBUb3AsXG4gICAgZHJhZ092ZXJHYXBCb3R0b206IGRyYWdPdmVyR2FwQm90dG9tLFxuICAgIHBvczogcG9zLFxuICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgIGtleTogZXZlbnRLZXlcbiAgfSk7XG4gIGlmICghKCdwcm9wcycgaW4gZXZlbnREYXRhKSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShldmVudERhdGEsICdwcm9wcycsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCAnU2Vjb25kIHBhcmFtIHJldHVybiBmcm9tIGV2ZW50IGlzIG5vZGUgZGF0YSBpbnN0ZWFkIG9mIFRyZWVOb2RlIGluc3RhbmNlLiBQbGVhc2UgcmVhZCB2YWx1ZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHJlYWRpbmcgZnJvbSBgcHJvcHNgLicpO1xuICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGV2ZW50RGF0YTtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=