"use strict"; (self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_antd_lib_style_compact-item-vertical_js-node_modules_antd_lib_style_comp-3a3284"],{ /***/ "../../../node_modules/antd/lib/style/compact-item-vertical.js": /*!*********************************************************************!*\ !*** ../../../node_modules/antd/lib/style/compact-item-vertical.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.genCompactItemVerticalStyle = genCompactItemVerticalStyle; function compactItemVerticalBorder(token, parentCls) { return { // border collapse [`&-item:not(${parentCls}-last-item)`]: { marginBottom: token.calc(token.lineWidth).mul(-1).equal() }, '&-item': { '&:hover,&:focus,&:active': { zIndex: 2 }, '&[disabled]': { zIndex: 0 } } }; } function compactItemBorderVerticalRadius(prefixCls, parentCls) { return { [`&-item:not(${parentCls}-first-item):not(${parentCls}-last-item)`]: { borderRadius: 0 }, [`&-item${parentCls}-first-item:not(${parentCls}-last-item)`]: { [`&, &${prefixCls}-sm, &${prefixCls}-lg`]: { borderEndEndRadius: 0, borderEndStartRadius: 0 } }, [`&-item${parentCls}-last-item:not(${parentCls}-first-item)`]: { [`&, &${prefixCls}-sm, &${prefixCls}-lg`]: { borderStartStartRadius: 0, borderStartEndRadius: 0 } } }; } function genCompactItemVerticalStyle(token) { const compactCls = `${token.componentCls}-compact-vertical`; return { [compactCls]: Object.assign(Object.assign({}, compactItemVerticalBorder(token, compactCls)), compactItemBorderVerticalRadius(token.componentCls, compactCls)) }; } /***/ }), /***/ "../../../node_modules/antd/lib/style/compact-item.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/style/compact-item.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.genCompactItemStyle = genCompactItemStyle; // handle border collapse function compactItemBorder(token, parentCls, options) { const { focusElCls, focus, borderElCls } = options; const childCombinator = borderElCls ? '> *' : ''; const hoverEffects = ['hover', focus ? 'focus' : null, 'active'].filter(Boolean).map(n => `&:${n} ${childCombinator}`).join(','); return { [`&-item:not(${parentCls}-last-item)`]: { marginInlineEnd: token.calc(token.lineWidth).mul(-1).equal() }, '&-item': Object.assign(Object.assign({ [hoverEffects]: { zIndex: 2 } }, focusElCls ? { [`&${focusElCls}`]: { zIndex: 2 } } : {}), { [`&[disabled] ${childCombinator}`]: { zIndex: 0 } }) }; } // handle border-radius function compactItemBorderRadius(prefixCls, parentCls, options) { const { borderElCls } = options; const childCombinator = borderElCls ? `> ${borderElCls}` : ''; return { [`&-item:not(${parentCls}-first-item):not(${parentCls}-last-item) ${childCombinator}`]: { borderRadius: 0 }, [`&-item:not(${parentCls}-last-item)${parentCls}-first-item`]: { [`& ${childCombinator}, &${prefixCls}-sm ${childCombinator}, &${prefixCls}-lg ${childCombinator}`]: { borderStartEndRadius: 0, borderEndEndRadius: 0 } }, [`&-item:not(${parentCls}-first-item)${parentCls}-last-item`]: { [`& ${childCombinator}, &${prefixCls}-sm ${childCombinator}, &${prefixCls}-lg ${childCombinator}`]: { borderStartStartRadius: 0, borderEndStartRadius: 0 } } }; } function genCompactItemStyle(token, options = { focus: true }) { const { componentCls } = token; const compactCls = `${componentCls}-compact`; return { [compactCls]: Object.assign(Object.assign({}, compactItemBorder(token, compactCls, options)), compactItemBorderRadius(componentCls, compactCls, options)) }; } /***/ }), /***/ "../../../node_modules/antd/lib/style/index.js": /*!*****************************************************!*\ !*** ../../../node_modules/antd/lib/style/index.js ***! \*****************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.textEllipsis = exports.resetIcon = exports.resetComponent = exports.operationUnit = exports.genLinkStyle = exports.genIconStyle = exports.genFocusStyle = exports.genFocusOutline = exports.genCommonStyle = exports.clearFix = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const textEllipsis = exports.textEllipsis = { overflow: 'hidden', whiteSpace: 'nowrap', textOverflow: 'ellipsis' }; const resetComponent = (token, needInheritFontFamily = false) => ({ boxSizing: 'border-box', margin: 0, padding: 0, color: token.colorText, fontSize: token.fontSize, // font-variant: @font-variant-base; lineHeight: token.lineHeight, listStyle: 'none', // font-feature-settings: @font-feature-settings-base; fontFamily: needInheritFontFamily ? 'inherit' : token.fontFamily }); exports.resetComponent = resetComponent; const resetIcon = () => ({ display: 'inline-flex', alignItems: 'center', color: 'inherit', fontStyle: 'normal', lineHeight: 0, textAlign: 'center', textTransform: 'none', // for SVG icon, see https://blog.prototypr.io/align-svg-icons-to-text-and-say-goodbye-to-font-icons-d44b3d7b26b4 verticalAlign: '-0.125em', textRendering: 'optimizeLegibility', '-webkit-font-smoothing': 'antialiased', '-moz-osx-font-smoothing': 'grayscale', '> *': { lineHeight: 1 }, svg: { display: 'inline-block' } }); exports.resetIcon = resetIcon; const clearFix = () => ({ // https://github.com/ant-design/ant-design/issues/21301#issuecomment-583955229 '&::before': { display: 'table', content: '""' }, '&::after': { // https://github.com/ant-design/ant-design/issues/21864 display: 'table', clear: 'both', content: '""' } }); exports.clearFix = clearFix; const genLinkStyle = token => ({ a: { color: token.colorLink, textDecoration: token.linkDecoration, backgroundColor: 'transparent', // remove the gray background on active links in IE 10. outline: 'none', cursor: 'pointer', transition: `color ${token.motionDurationSlow}`, '-webkit-text-decoration-skip': 'objects', // remove gaps in links underline in iOS 8+ and Safari 8+. '&:hover': { color: token.colorLinkHover }, '&:active': { color: token.colorLinkActive }, '&:active, &:hover': { textDecoration: token.linkHoverDecoration, outline: 0 }, // https://github.com/ant-design/ant-design/issues/22503 '&:focus': { textDecoration: token.linkFocusDecoration, outline: 0 }, '&[disabled]': { color: token.colorTextDisabled, cursor: 'not-allowed' } } }); exports.genLinkStyle = genLinkStyle; const genCommonStyle = (token, componentPrefixCls, rootCls, resetFont) => { const prefixSelector = `[class^="${componentPrefixCls}"], [class*=" ${componentPrefixCls}"]`; const rootPrefixSelector = rootCls ? `.${rootCls}` : prefixSelector; const resetStyle = { boxSizing: 'border-box', '&::before, &::after': { boxSizing: 'border-box' } }; let resetFontStyle = {}; if (resetFont !== false) { resetFontStyle = { fontFamily: token.fontFamily, fontSize: token.fontSize }; } return { [rootPrefixSelector]: Object.assign(Object.assign(Object.assign({}, resetFontStyle), resetStyle), { [prefixSelector]: resetStyle }) }; }; exports.genCommonStyle = genCommonStyle; const genFocusOutline = (token, offset) => ({ outline: `${(0, _cssinjs.unit)(token.lineWidthFocus)} solid ${token.colorPrimaryBorder}`, outlineOffset: offset !== null && offset !== void 0 ? offset : 1, transition: 'outline-offset 0s, outline 0s' }); exports.genFocusOutline = genFocusOutline; const genFocusStyle = (token, offset) => ({ '&:focus-visible': Object.assign({}, genFocusOutline(token, offset)) }); exports.genFocusStyle = genFocusStyle; const genIconStyle = iconPrefixCls => ({ [`.${iconPrefixCls}`]: Object.assign(Object.assign({}, resetIcon()), { [`.${iconPrefixCls} .${iconPrefixCls}-icon`]: { display: 'block' } }) }); exports.genIconStyle = genIconStyle; const operationUnit = token => Object.assign(Object.assign({ // FIXME: This use link but is a operation unit. Seems should be a colorPrimary. // And Typography use this to generate link style which should not do this. color: token.colorLink, textDecoration: token.linkDecoration, outline: 'none', cursor: 'pointer', transition: `all ${token.motionDurationSlow}`, border: 0, padding: 0, background: 'none', userSelect: 'none' }, genFocusStyle(token)), { '&:focus, &:hover': { color: token.colorLinkHover }, '&:active': { color: token.colorLinkActive } }); exports.operationUnit = operationUnit; /***/ }), /***/ "../../../node_modules/antd/lib/style/motion/collapse.js": /*!***************************************************************!*\ !*** ../../../node_modules/antd/lib/style/motion/collapse.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; const genCollapseMotion = token => ({ [token.componentCls]: { // For common/openAnimation [`${token.antCls}-motion-collapse-legacy`]: { overflow: 'hidden', '&-active': { transition: `height ${token.motionDurationMid} ${token.motionEaseInOut}, opacity ${token.motionDurationMid} ${token.motionEaseInOut} !important` } }, [`${token.antCls}-motion-collapse`]: { overflow: 'hidden', transition: `height ${token.motionDurationMid} ${token.motionEaseInOut}, opacity ${token.motionDurationMid} ${token.motionEaseInOut} !important` } } }); var _default = exports["default"] = genCollapseMotion; /***/ }), /***/ "../../../node_modules/antd/lib/style/motion/fade.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/style/motion/fade.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.initFadeMotion = exports.fadeOut = exports.fadeIn = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); var _motion = __webpack_require__(/*! ./motion */ "../../../node_modules/antd/lib/style/motion/motion.js"); const fadeIn = exports.fadeIn = new _cssinjs.Keyframes('antFadeIn', { '0%': { opacity: 0 }, '100%': { opacity: 1 } }); const fadeOut = exports.fadeOut = new _cssinjs.Keyframes('antFadeOut', { '0%': { opacity: 1 }, '100%': { opacity: 0 } }); const initFadeMotion = (token, sameLevel = false) => { const { antCls } = token; const motionCls = `${antCls}-fade`; const sameLevelPrefix = sameLevel ? '&' : ''; return [(0, _motion.initMotion)(motionCls, fadeIn, fadeOut, token.motionDurationMid, sameLevel), { [` ${sameLevelPrefix}${motionCls}-enter, ${sameLevelPrefix}${motionCls}-appear `]: { opacity: 0, animationTimingFunction: 'linear' }, [`${sameLevelPrefix}${motionCls}-leave`]: { animationTimingFunction: 'linear' } }]; }; exports.initFadeMotion = initFadeMotion; /***/ }), /***/ "../../../node_modules/antd/lib/style/motion/index.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/style/motion/index.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "fadeIn", ({ enumerable: true, get: function () { return _fade.fadeIn; } })); Object.defineProperty(exports, "fadeOut", ({ enumerable: true, get: function () { return _fade.fadeOut; } })); Object.defineProperty(exports, "genCollapseMotion", ({ enumerable: true, get: function () { return _collapse.default; } })); Object.defineProperty(exports, "initFadeMotion", ({ enumerable: true, get: function () { return _fade.initFadeMotion; } })); Object.defineProperty(exports, "initMoveMotion", ({ enumerable: true, get: function () { return _move.initMoveMotion; } })); Object.defineProperty(exports, "initSlideMotion", ({ enumerable: true, get: function () { return _slide.initSlideMotion; } })); Object.defineProperty(exports, "initZoomMotion", ({ enumerable: true, get: function () { return _zoom.initZoomMotion; } })); Object.defineProperty(exports, "moveDownIn", ({ enumerable: true, get: function () { return _move.moveDownIn; } })); Object.defineProperty(exports, "moveDownOut", ({ enumerable: true, get: function () { return _move.moveDownOut; } })); Object.defineProperty(exports, "moveLeftIn", ({ enumerable: true, get: function () { return _move.moveLeftIn; } })); Object.defineProperty(exports, "moveLeftOut", ({ enumerable: true, get: function () { return _move.moveLeftOut; } })); Object.defineProperty(exports, "moveRightIn", ({ enumerable: true, get: function () { return _move.moveRightIn; } })); Object.defineProperty(exports, "moveRightOut", ({ enumerable: true, get: function () { return _move.moveRightOut; } })); Object.defineProperty(exports, "moveUpIn", ({ enumerable: true, get: function () { return _move.moveUpIn; } })); Object.defineProperty(exports, "moveUpOut", ({ enumerable: true, get: function () { return _move.moveUpOut; } })); Object.defineProperty(exports, "slideDownIn", ({ enumerable: true, get: function () { return _slide.slideDownIn; } })); Object.defineProperty(exports, "slideDownOut", ({ enumerable: true, get: function () { return _slide.slideDownOut; } })); Object.defineProperty(exports, "slideLeftIn", ({ enumerable: true, get: function () { return _slide.slideLeftIn; } })); Object.defineProperty(exports, "slideLeftOut", ({ enumerable: true, get: function () { return _slide.slideLeftOut; } })); Object.defineProperty(exports, "slideRightIn", ({ enumerable: true, get: function () { return _slide.slideRightIn; } })); Object.defineProperty(exports, "slideRightOut", ({ enumerable: true, get: function () { return _slide.slideRightOut; } })); Object.defineProperty(exports, "slideUpIn", ({ enumerable: true, get: function () { return _slide.slideUpIn; } })); Object.defineProperty(exports, "slideUpOut", ({ enumerable: true, get: function () { return _slide.slideUpOut; } })); Object.defineProperty(exports, "zoomBigIn", ({ enumerable: true, get: function () { return _zoom.zoomBigIn; } })); Object.defineProperty(exports, "zoomBigOut", ({ enumerable: true, get: function () { return _zoom.zoomBigOut; } })); Object.defineProperty(exports, "zoomDownIn", ({ enumerable: true, get: function () { return _zoom.zoomDownIn; } })); Object.defineProperty(exports, "zoomDownOut", ({ enumerable: true, get: function () { return _zoom.zoomDownOut; } })); Object.defineProperty(exports, "zoomIn", ({ enumerable: true, get: function () { return _zoom.zoomIn; } })); Object.defineProperty(exports, "zoomLeftIn", ({ enumerable: true, get: function () { return _zoom.zoomLeftIn; } })); Object.defineProperty(exports, "zoomLeftOut", ({ enumerable: true, get: function () { return _zoom.zoomLeftOut; } })); Object.defineProperty(exports, "zoomOut", ({ enumerable: true, get: function () { return _zoom.zoomOut; } })); Object.defineProperty(exports, "zoomRightIn", ({ enumerable: true, get: function () { return _zoom.zoomRightIn; } })); Object.defineProperty(exports, "zoomRightOut", ({ enumerable: true, get: function () { return _zoom.zoomRightOut; } })); Object.defineProperty(exports, "zoomUpIn", ({ enumerable: true, get: function () { return _zoom.zoomUpIn; } })); Object.defineProperty(exports, "zoomUpOut", ({ enumerable: true, get: function () { return _zoom.zoomUpOut; } })); var _collapse = _interopRequireDefault(__webpack_require__(/*! ./collapse */ "../../../node_modules/antd/lib/style/motion/collapse.js")); var _fade = __webpack_require__(/*! ./fade */ "../../../node_modules/antd/lib/style/motion/fade.js"); var _move = __webpack_require__(/*! ./move */ "../../../node_modules/antd/lib/style/motion/move.js"); var _slide = __webpack_require__(/*! ./slide */ "../../../node_modules/antd/lib/style/motion/slide.js"); var _zoom = __webpack_require__(/*! ./zoom */ "../../../node_modules/antd/lib/style/motion/zoom.js"); /***/ }), /***/ "../../../node_modules/antd/lib/style/motion/motion.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/style/motion/motion.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.initMotion = void 0; const initMotionCommon = duration => ({ animationDuration: duration, animationFillMode: 'both' }); // FIXME: origin less code seems same as initMotionCommon. Maybe we can safe remove const initMotionCommonLeave = duration => ({ animationDuration: duration, animationFillMode: 'both' }); const initMotion = (motionCls, inKeyframes, outKeyframes, duration, sameLevel = false) => { const sameLevelPrefix = sameLevel ? '&' : ''; return { [` ${sameLevelPrefix}${motionCls}-enter, ${sameLevelPrefix}${motionCls}-appear `]: Object.assign(Object.assign({}, initMotionCommon(duration)), { animationPlayState: 'paused' }), [`${sameLevelPrefix}${motionCls}-leave`]: Object.assign(Object.assign({}, initMotionCommonLeave(duration)), { animationPlayState: 'paused' }), [` ${sameLevelPrefix}${motionCls}-enter${motionCls}-enter-active, ${sameLevelPrefix}${motionCls}-appear${motionCls}-appear-active `]: { animationName: inKeyframes, animationPlayState: 'running' }, [`${sameLevelPrefix}${motionCls}-leave${motionCls}-leave-active`]: { animationName: outKeyframes, animationPlayState: 'running', pointerEvents: 'none' } }; }; exports.initMotion = initMotion; /***/ }), /***/ "../../../node_modules/antd/lib/style/motion/move.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/style/motion/move.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.moveUpOut = exports.moveUpIn = exports.moveRightOut = exports.moveRightIn = exports.moveLeftOut = exports.moveLeftIn = exports.moveDownOut = exports.moveDownIn = exports.initMoveMotion = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); var _motion = __webpack_require__(/*! ./motion */ "../../../node_modules/antd/lib/style/motion/motion.js"); const moveDownIn = exports.moveDownIn = new _cssinjs.Keyframes('antMoveDownIn', { '0%': { transform: 'translate3d(0, 100%, 0)', transformOrigin: '0 0', opacity: 0 }, '100%': { transform: 'translate3d(0, 0, 0)', transformOrigin: '0 0', opacity: 1 } }); const moveDownOut = exports.moveDownOut = new _cssinjs.Keyframes('antMoveDownOut', { '0%': { transform: 'translate3d(0, 0, 0)', transformOrigin: '0 0', opacity: 1 }, '100%': { transform: 'translate3d(0, 100%, 0)', transformOrigin: '0 0', opacity: 0 } }); const moveLeftIn = exports.moveLeftIn = new _cssinjs.Keyframes('antMoveLeftIn', { '0%': { transform: 'translate3d(-100%, 0, 0)', transformOrigin: '0 0', opacity: 0 }, '100%': { transform: 'translate3d(0, 0, 0)', transformOrigin: '0 0', opacity: 1 } }); const moveLeftOut = exports.moveLeftOut = new _cssinjs.Keyframes('antMoveLeftOut', { '0%': { transform: 'translate3d(0, 0, 0)', transformOrigin: '0 0', opacity: 1 }, '100%': { transform: 'translate3d(-100%, 0, 0)', transformOrigin: '0 0', opacity: 0 } }); const moveRightIn = exports.moveRightIn = new _cssinjs.Keyframes('antMoveRightIn', { '0%': { transform: 'translate3d(100%, 0, 0)', transformOrigin: '0 0', opacity: 0 }, '100%': { transform: 'translate3d(0, 0, 0)', transformOrigin: '0 0', opacity: 1 } }); const moveRightOut = exports.moveRightOut = new _cssinjs.Keyframes('antMoveRightOut', { '0%': { transform: 'translate3d(0, 0, 0)', transformOrigin: '0 0', opacity: 1 }, '100%': { transform: 'translate3d(100%, 0, 0)', transformOrigin: '0 0', opacity: 0 } }); const moveUpIn = exports.moveUpIn = new _cssinjs.Keyframes('antMoveUpIn', { '0%': { transform: 'translate3d(0, -100%, 0)', transformOrigin: '0 0', opacity: 0 }, '100%': { transform: 'translate3d(0, 0, 0)', transformOrigin: '0 0', opacity: 1 } }); const moveUpOut = exports.moveUpOut = new _cssinjs.Keyframes('antMoveUpOut', { '0%': { transform: 'translate3d(0, 0, 0)', transformOrigin: '0 0', opacity: 1 }, '100%': { transform: 'translate3d(0, -100%, 0)', transformOrigin: '0 0', opacity: 0 } }); const moveMotion = { 'move-up': { inKeyframes: moveUpIn, outKeyframes: moveUpOut }, 'move-down': { inKeyframes: moveDownIn, outKeyframes: moveDownOut }, 'move-left': { inKeyframes: moveLeftIn, outKeyframes: moveLeftOut }, 'move-right': { inKeyframes: moveRightIn, outKeyframes: moveRightOut } }; const initMoveMotion = (token, motionName) => { const { antCls } = token; const motionCls = `${antCls}-${motionName}`; const { inKeyframes, outKeyframes } = moveMotion[motionName]; return [(0, _motion.initMotion)(motionCls, inKeyframes, outKeyframes, token.motionDurationMid), { [` ${motionCls}-enter, ${motionCls}-appear `]: { opacity: 0, animationTimingFunction: token.motionEaseOutCirc }, [`${motionCls}-leave`]: { animationTimingFunction: token.motionEaseInOutCirc } }]; }; exports.initMoveMotion = initMoveMotion; /***/ }), /***/ "../../../node_modules/antd/lib/style/motion/slide.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/style/motion/slide.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.slideUpOut = exports.slideUpIn = exports.slideRightOut = exports.slideRightIn = exports.slideLeftOut = exports.slideLeftIn = exports.slideDownOut = exports.slideDownIn = exports.initSlideMotion = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); var _motion = __webpack_require__(/*! ./motion */ "../../../node_modules/antd/lib/style/motion/motion.js"); const slideUpIn = exports.slideUpIn = new _cssinjs.Keyframes('antSlideUpIn', { '0%': { transform: 'scaleY(0.8)', transformOrigin: '0% 0%', opacity: 0 }, '100%': { transform: 'scaleY(1)', transformOrigin: '0% 0%', opacity: 1 } }); const slideUpOut = exports.slideUpOut = new _cssinjs.Keyframes('antSlideUpOut', { '0%': { transform: 'scaleY(1)', transformOrigin: '0% 0%', opacity: 1 }, '100%': { transform: 'scaleY(0.8)', transformOrigin: '0% 0%', opacity: 0 } }); const slideDownIn = exports.slideDownIn = new _cssinjs.Keyframes('antSlideDownIn', { '0%': { transform: 'scaleY(0.8)', transformOrigin: '100% 100%', opacity: 0 }, '100%': { transform: 'scaleY(1)', transformOrigin: '100% 100%', opacity: 1 } }); const slideDownOut = exports.slideDownOut = new _cssinjs.Keyframes('antSlideDownOut', { '0%': { transform: 'scaleY(1)', transformOrigin: '100% 100%', opacity: 1 }, '100%': { transform: 'scaleY(0.8)', transformOrigin: '100% 100%', opacity: 0 } }); const slideLeftIn = exports.slideLeftIn = new _cssinjs.Keyframes('antSlideLeftIn', { '0%': { transform: 'scaleX(0.8)', transformOrigin: '0% 0%', opacity: 0 }, '100%': { transform: 'scaleX(1)', transformOrigin: '0% 0%', opacity: 1 } }); const slideLeftOut = exports.slideLeftOut = new _cssinjs.Keyframes('antSlideLeftOut', { '0%': { transform: 'scaleX(1)', transformOrigin: '0% 0%', opacity: 1 }, '100%': { transform: 'scaleX(0.8)', transformOrigin: '0% 0%', opacity: 0 } }); const slideRightIn = exports.slideRightIn = new _cssinjs.Keyframes('antSlideRightIn', { '0%': { transform: 'scaleX(0.8)', transformOrigin: '100% 0%', opacity: 0 }, '100%': { transform: 'scaleX(1)', transformOrigin: '100% 0%', opacity: 1 } }); const slideRightOut = exports.slideRightOut = new _cssinjs.Keyframes('antSlideRightOut', { '0%': { transform: 'scaleX(1)', transformOrigin: '100% 0%', opacity: 1 }, '100%': { transform: 'scaleX(0.8)', transformOrigin: '100% 0%', opacity: 0 } }); const slideMotion = { 'slide-up': { inKeyframes: slideUpIn, outKeyframes: slideUpOut }, 'slide-down': { inKeyframes: slideDownIn, outKeyframes: slideDownOut }, 'slide-left': { inKeyframes: slideLeftIn, outKeyframes: slideLeftOut }, 'slide-right': { inKeyframes: slideRightIn, outKeyframes: slideRightOut } }; const initSlideMotion = (token, motionName) => { const { antCls } = token; const motionCls = `${antCls}-${motionName}`; const { inKeyframes, outKeyframes } = slideMotion[motionName]; return [(0, _motion.initMotion)(motionCls, inKeyframes, outKeyframes, token.motionDurationMid), { [` ${motionCls}-enter, ${motionCls}-appear `]: { transform: 'scale(0)', transformOrigin: '0% 0%', opacity: 0, animationTimingFunction: token.motionEaseOutQuint, '&-prepare': { transform: 'scale(1)' } }, [`${motionCls}-leave`]: { animationTimingFunction: token.motionEaseInQuint } }]; }; exports.initSlideMotion = initSlideMotion; /***/ }), /***/ "../../../node_modules/antd/lib/style/motion/zoom.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/style/motion/zoom.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.zoomUpOut = exports.zoomUpIn = exports.zoomRightOut = exports.zoomRightIn = exports.zoomOut = exports.zoomLeftOut = exports.zoomLeftIn = exports.zoomIn = exports.zoomDownOut = exports.zoomDownIn = exports.zoomBigOut = exports.zoomBigIn = exports.initZoomMotion = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); var _motion = __webpack_require__(/*! ./motion */ "../../../node_modules/antd/lib/style/motion/motion.js"); const zoomIn = exports.zoomIn = new _cssinjs.Keyframes('antZoomIn', { '0%': { transform: 'scale(0.2)', opacity: 0 }, '100%': { transform: 'scale(1)', opacity: 1 } }); const zoomOut = exports.zoomOut = new _cssinjs.Keyframes('antZoomOut', { '0%': { transform: 'scale(1)' }, '100%': { transform: 'scale(0.2)', opacity: 0 } }); const zoomBigIn = exports.zoomBigIn = new _cssinjs.Keyframes('antZoomBigIn', { '0%': { transform: 'scale(0.8)', opacity: 0 }, '100%': { transform: 'scale(1)', opacity: 1 } }); const zoomBigOut = exports.zoomBigOut = new _cssinjs.Keyframes('antZoomBigOut', { '0%': { transform: 'scale(1)' }, '100%': { transform: 'scale(0.8)', opacity: 0 } }); const zoomUpIn = exports.zoomUpIn = new _cssinjs.Keyframes('antZoomUpIn', { '0%': { transform: 'scale(0.8)', transformOrigin: '50% 0%', opacity: 0 }, '100%': { transform: 'scale(1)', transformOrigin: '50% 0%' } }); const zoomUpOut = exports.zoomUpOut = new _cssinjs.Keyframes('antZoomUpOut', { '0%': { transform: 'scale(1)', transformOrigin: '50% 0%' }, '100%': { transform: 'scale(0.8)', transformOrigin: '50% 0%', opacity: 0 } }); const zoomLeftIn = exports.zoomLeftIn = new _cssinjs.Keyframes('antZoomLeftIn', { '0%': { transform: 'scale(0.8)', transformOrigin: '0% 50%', opacity: 0 }, '100%': { transform: 'scale(1)', transformOrigin: '0% 50%' } }); const zoomLeftOut = exports.zoomLeftOut = new _cssinjs.Keyframes('antZoomLeftOut', { '0%': { transform: 'scale(1)', transformOrigin: '0% 50%' }, '100%': { transform: 'scale(0.8)', transformOrigin: '0% 50%', opacity: 0 } }); const zoomRightIn = exports.zoomRightIn = new _cssinjs.Keyframes('antZoomRightIn', { '0%': { transform: 'scale(0.8)', transformOrigin: '100% 50%', opacity: 0 }, '100%': { transform: 'scale(1)', transformOrigin: '100% 50%' } }); const zoomRightOut = exports.zoomRightOut = new _cssinjs.Keyframes('antZoomRightOut', { '0%': { transform: 'scale(1)', transformOrigin: '100% 50%' }, '100%': { transform: 'scale(0.8)', transformOrigin: '100% 50%', opacity: 0 } }); const zoomDownIn = exports.zoomDownIn = new _cssinjs.Keyframes('antZoomDownIn', { '0%': { transform: 'scale(0.8)', transformOrigin: '50% 100%', opacity: 0 }, '100%': { transform: 'scale(1)', transformOrigin: '50% 100%' } }); const zoomDownOut = exports.zoomDownOut = new _cssinjs.Keyframes('antZoomDownOut', { '0%': { transform: 'scale(1)', transformOrigin: '50% 100%' }, '100%': { transform: 'scale(0.8)', transformOrigin: '50% 100%', opacity: 0 } }); const zoomMotion = { zoom: { inKeyframes: zoomIn, outKeyframes: zoomOut }, 'zoom-big': { inKeyframes: zoomBigIn, outKeyframes: zoomBigOut }, 'zoom-big-fast': { inKeyframes: zoomBigIn, outKeyframes: zoomBigOut }, 'zoom-left': { inKeyframes: zoomLeftIn, outKeyframes: zoomLeftOut }, 'zoom-right': { inKeyframes: zoomRightIn, outKeyframes: zoomRightOut }, 'zoom-up': { inKeyframes: zoomUpIn, outKeyframes: zoomUpOut }, 'zoom-down': { inKeyframes: zoomDownIn, outKeyframes: zoomDownOut } }; const initZoomMotion = (token, motionName) => { const { antCls } = token; const motionCls = `${antCls}-${motionName}`; const { inKeyframes, outKeyframes } = zoomMotion[motionName]; return [(0, _motion.initMotion)(motionCls, inKeyframes, outKeyframes, motionName === 'zoom-big-fast' ? token.motionDurationFast : token.motionDurationMid), { [` ${motionCls}-enter, ${motionCls}-appear `]: { transform: 'scale(0)', opacity: 0, animationTimingFunction: token.motionEaseOutCirc, '&-prepare': { transform: 'none' } }, [`${motionCls}-leave`]: { animationTimingFunction: token.motionEaseInOutCirc } }]; }; exports.initZoomMotion = initZoomMotion; /***/ }), /***/ "../../../node_modules/antd/lib/style/placementArrow.js": /*!**************************************************************!*\ !*** ../../../node_modules/antd/lib/style/placementArrow.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.MAX_VERTICAL_CONTENT_RADIUS = void 0; exports["default"] = getArrowStyle; exports.getArrowOffsetToken = getArrowOffsetToken; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); var _roundedArrow = __webpack_require__(/*! ./roundedArrow */ "../../../node_modules/antd/lib/style/roundedArrow.js"); const MAX_VERTICAL_CONTENT_RADIUS = exports.MAX_VERTICAL_CONTENT_RADIUS = 8; function getArrowOffsetToken(options) { const { contentRadius, limitVerticalRadius } = options; const arrowOffset = contentRadius > 12 ? contentRadius + 2 : 12; const arrowOffsetVertical = limitVerticalRadius ? MAX_VERTICAL_CONTENT_RADIUS : arrowOffset; return { arrowOffsetHorizontal: arrowOffset, arrowOffsetVertical }; } function isInject(valid, code) { if (!valid) { return {}; } return code; } function getArrowStyle(token, colorBg, options) { const { componentCls, boxShadowPopoverArrow, arrowOffsetVertical, arrowOffsetHorizontal } = token; const { arrowDistance = 0, arrowPlacement = { left: true, right: true, top: true, bottom: true } } = options || {}; return { [componentCls]: Object.assign(Object.assign(Object.assign(Object.assign({ // ============================ Basic ============================ [`${componentCls}-arrow`]: [Object.assign(Object.assign({ position: 'absolute', zIndex: 1, display: 'block' }, (0, _roundedArrow.genRoundedArrow)(token, colorBg, boxShadowPopoverArrow)), { '&:before': { background: colorBg } })] }, isInject(!!arrowPlacement.top, { [[`&-placement-top > ${componentCls}-arrow`, `&-placement-topLeft > ${componentCls}-arrow`, `&-placement-topRight > ${componentCls}-arrow`].join(',')]: { bottom: arrowDistance, transform: 'translateY(100%) rotate(180deg)' }, [`&-placement-top > ${componentCls}-arrow`]: { left: { _skip_check_: true, value: '50%' }, transform: 'translateX(-50%) translateY(100%) rotate(180deg)' }, '&-placement-topLeft': { '--arrow-offset-horizontal': arrowOffsetHorizontal, [`> ${componentCls}-arrow`]: { left: { _skip_check_: true, value: arrowOffsetHorizontal } } }, '&-placement-topRight': { '--arrow-offset-horizontal': `calc(100% - ${(0, _cssinjs.unit)(arrowOffsetHorizontal)})`, [`> ${componentCls}-arrow`]: { right: { _skip_check_: true, value: arrowOffsetHorizontal } } } })), isInject(!!arrowPlacement.bottom, { [[`&-placement-bottom > ${componentCls}-arrow`, `&-placement-bottomLeft > ${componentCls}-arrow`, `&-placement-bottomRight > ${componentCls}-arrow`].join(',')]: { top: arrowDistance, transform: `translateY(-100%)` }, [`&-placement-bottom > ${componentCls}-arrow`]: { left: { _skip_check_: true, value: '50%' }, transform: `translateX(-50%) translateY(-100%)` }, '&-placement-bottomLeft': { '--arrow-offset-horizontal': arrowOffsetHorizontal, [`> ${componentCls}-arrow`]: { left: { _skip_check_: true, value: arrowOffsetHorizontal } } }, '&-placement-bottomRight': { '--arrow-offset-horizontal': `calc(100% - ${(0, _cssinjs.unit)(arrowOffsetHorizontal)})`, [`> ${componentCls}-arrow`]: { right: { _skip_check_: true, value: arrowOffsetHorizontal } } } })), isInject(!!arrowPlacement.left, { [[`&-placement-left > ${componentCls}-arrow`, `&-placement-leftTop > ${componentCls}-arrow`, `&-placement-leftBottom > ${componentCls}-arrow`].join(',')]: { right: { _skip_check_: true, value: arrowDistance }, transform: 'translateX(100%) rotate(90deg)' }, [`&-placement-left > ${componentCls}-arrow`]: { top: { _skip_check_: true, value: '50%' }, transform: 'translateY(-50%) translateX(100%) rotate(90deg)' }, [`&-placement-leftTop > ${componentCls}-arrow`]: { top: arrowOffsetVertical }, [`&-placement-leftBottom > ${componentCls}-arrow`]: { bottom: arrowOffsetVertical } })), isInject(!!arrowPlacement.right, { [[`&-placement-right > ${componentCls}-arrow`, `&-placement-rightTop > ${componentCls}-arrow`, `&-placement-rightBottom > ${componentCls}-arrow`].join(',')]: { left: { _skip_check_: true, value: arrowDistance }, transform: 'translateX(-100%) rotate(-90deg)' }, [`&-placement-right > ${componentCls}-arrow`]: { top: { _skip_check_: true, value: '50%' }, transform: 'translateY(-50%) translateX(-100%) rotate(-90deg)' }, [`&-placement-rightTop > ${componentCls}-arrow`]: { top: arrowOffsetVertical }, [`&-placement-rightBottom > ${componentCls}-arrow`]: { bottom: arrowOffsetVertical } })) }; } /***/ }), /***/ "../../../node_modules/antd/lib/style/roundedArrow.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/style/roundedArrow.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.genRoundedArrow = void 0; exports.getArrowToken = getArrowToken; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); function getArrowToken(token) { const { sizePopupArrow, borderRadiusXS, borderRadiusOuter } = token; const unitWidth = sizePopupArrow / 2; const ax = 0; const ay = unitWidth; const bx = borderRadiusOuter * 1 / Math.sqrt(2); const by = unitWidth - borderRadiusOuter * (1 - 1 / Math.sqrt(2)); const cx = unitWidth - borderRadiusXS * (1 / Math.sqrt(2)); const cy = borderRadiusOuter * (Math.sqrt(2) - 1) + borderRadiusXS * (1 / Math.sqrt(2)); const dx = 2 * unitWidth - cx; const dy = cy; const ex = 2 * unitWidth - bx; const ey = by; const fx = 2 * unitWidth - ax; const fy = ay; const shadowWidth = unitWidth * Math.sqrt(2) + borderRadiusOuter * (Math.sqrt(2) - 2); const polygonOffset = borderRadiusOuter * (Math.sqrt(2) - 1); const arrowPolygon = `polygon(${polygonOffset}px 100%, 50% ${polygonOffset}px, ${2 * unitWidth - polygonOffset}px 100%, ${polygonOffset}px 100%)`; const arrowPath = `path('M ${ax} ${ay} A ${borderRadiusOuter} ${borderRadiusOuter} 0 0 0 ${bx} ${by} L ${cx} ${cy} A ${borderRadiusXS} ${borderRadiusXS} 0 0 1 ${dx} ${dy} L ${ex} ${ey} A ${borderRadiusOuter} ${borderRadiusOuter} 0 0 0 ${fx} ${fy} Z')`; return { arrowShadowWidth: shadowWidth, arrowPath, arrowPolygon }; } const genRoundedArrow = (token, bgColor, boxShadow) => { const { sizePopupArrow, arrowPolygon, arrowPath, arrowShadowWidth, borderRadiusXS, calc } = token; return { pointerEvents: 'none', width: sizePopupArrow, height: sizePopupArrow, overflow: 'hidden', '&::before': { position: 'absolute', bottom: 0, insetInlineStart: 0, width: sizePopupArrow, height: calc(sizePopupArrow).div(2).equal(), background: bgColor, clipPath: { _multi_value_: true, value: [arrowPolygon, arrowPath] }, content: '""' }, '&::after': { content: '""', position: 'absolute', width: arrowShadowWidth, height: arrowShadowWidth, bottom: 0, insetInline: 0, margin: 'auto', borderRadius: { _skip_check_: true, value: `0 0 ${(0, _cssinjs.unit)(borderRadiusXS)} 0` }, transform: 'translateY(50%) rotate(-135deg)', boxShadow, zIndex: 0, background: 'transparent' } }; }; exports.genRoundedArrow = genRoundedArrow; /***/ }), /***/ "../../../node_modules/antd/lib/table/Column.js": /*!******************************************************!*\ !*** ../../../node_modules/antd/lib/table/Column.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; /* istanbul ignore next */ /** This is a syntactic sugar for `columns` prop. So HOC will not work on this. */ const Column = _ => null; var _default = exports["default"] = Column; /***/ }), /***/ "../../../node_modules/antd/lib/table/ColumnGroup.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/table/ColumnGroup.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; /* istanbul ignore next */ /** This is a syntactic sugar for `columns` prop. So HOC will not work on this. */ const ColumnGroup = _ => null; var _default = exports["default"] = ColumnGroup; /***/ }), /***/ "../../../node_modules/antd/lib/table/ExpandIcon.js": /*!**********************************************************!*\ !*** ../../../node_modules/antd/lib/table/ExpandIcon.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); function renderExpandIcon(locale) { return props => { const { prefixCls, onExpand, record, expanded, expandable } = props; const iconPrefix = `${prefixCls}-row-expand-icon`; return /*#__PURE__*/React.createElement("button", { type: "button", onClick: e => { onExpand(record, e); e.stopPropagation(); }, className: (0, _classnames.default)(iconPrefix, { [`${iconPrefix}-spaced`]: !expandable, [`${iconPrefix}-expanded`]: expandable && expanded, [`${iconPrefix}-collapsed`]: expandable && !expanded }), "aria-label": expanded ? locale.collapse : locale.expand, "aria-expanded": expanded }); }; } var _default = exports["default"] = renderExpandIcon; /***/ }), /***/ "../../../node_modules/antd/lib/table/InternalTable.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/table/InternalTable.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); var _rcTable = __webpack_require__(/*! rc-table */ "../../../node_modules/rc-table/es/index.js"); var _useColumns = __webpack_require__(/*! rc-table/lib/hooks/useColumns */ "../../../node_modules/rc-table/lib/hooks/useColumns/index.js"); var _omit = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/omit */ "../../../node_modules/rc-util/lib/omit.js")); var _useProxyImperativeHandle = _interopRequireDefault(__webpack_require__(/*! ../_util/hooks/useProxyImperativeHandle */ "../../../node_modules/antd/lib/_util/hooks/useProxyImperativeHandle.js")); var _scrollTo = _interopRequireDefault(__webpack_require__(/*! ../_util/scrollTo */ "../../../node_modules/antd/lib/_util/scrollTo.js")); var _warning = __webpack_require__(/*! ../_util/warning */ "../../../node_modules/antd/lib/_util/warning.js"); var _context = __webpack_require__(/*! ../config-provider/context */ "../../../node_modules/antd/lib/config-provider/context.js"); var _defaultRenderEmpty = _interopRequireDefault(__webpack_require__(/*! ../config-provider/defaultRenderEmpty */ "../../../node_modules/antd/lib/config-provider/defaultRenderEmpty.js")); var _useCSSVarCls = _interopRequireDefault(__webpack_require__(/*! ../config-provider/hooks/useCSSVarCls */ "../../../node_modules/antd/lib/config-provider/hooks/useCSSVarCls.js")); var _useSize = _interopRequireDefault(__webpack_require__(/*! ../config-provider/hooks/useSize */ "../../../node_modules/antd/lib/config-provider/hooks/useSize.js")); var _useBreakpoint = _interopRequireDefault(__webpack_require__(/*! ../grid/hooks/useBreakpoint */ "../../../node_modules/antd/lib/grid/hooks/useBreakpoint.js")); var _en_US = _interopRequireDefault(__webpack_require__(/*! ../locale/en_US */ "../../../node_modules/antd/lib/locale/en_US.js")); var _pagination = _interopRequireDefault(__webpack_require__(/*! ../pagination */ "../../../node_modules/antd/lib/pagination/index.js")); var _spin = _interopRequireDefault(__webpack_require__(/*! ../spin */ "../../../node_modules/antd/lib/spin/index.js")); var _internal = __webpack_require__(/*! ../theme/internal */ "../../../node_modules/antd/lib/theme/internal.js"); var _ExpandIcon = _interopRequireDefault(__webpack_require__(/*! ./ExpandIcon */ "../../../node_modules/antd/lib/table/ExpandIcon.js")); var _useContainerWidth = _interopRequireDefault(__webpack_require__(/*! ./hooks/useContainerWidth */ "../../../node_modules/antd/lib/table/hooks/useContainerWidth.js")); var _useFilter = _interopRequireWildcard(__webpack_require__(/*! ./hooks/useFilter */ "../../../node_modules/antd/lib/table/hooks/useFilter/index.js")); var _useLazyKVMap = _interopRequireDefault(__webpack_require__(/*! ./hooks/useLazyKVMap */ "../../../node_modules/antd/lib/table/hooks/useLazyKVMap.js")); var _usePagination = _interopRequireWildcard(__webpack_require__(/*! ./hooks/usePagination */ "../../../node_modules/antd/lib/table/hooks/usePagination.js")); var _useSelection = _interopRequireDefault(__webpack_require__(/*! ./hooks/useSelection */ "../../../node_modules/antd/lib/table/hooks/useSelection.js")); var _useSorter = _interopRequireWildcard(__webpack_require__(/*! ./hooks/useSorter */ "../../../node_modules/antd/lib/table/hooks/useSorter.js")); var _useTitleColumns = _interopRequireDefault(__webpack_require__(/*! ./hooks/useTitleColumns */ "../../../node_modules/antd/lib/table/hooks/useTitleColumns.js")); var _RcTable = _interopRequireDefault(__webpack_require__(/*! ./RcTable */ "../../../node_modules/antd/lib/table/RcTable/index.js")); var _VirtualTable = _interopRequireDefault(__webpack_require__(/*! ./RcTable/VirtualTable */ "../../../node_modules/antd/lib/table/RcTable/VirtualTable.js")); var _style = _interopRequireDefault(__webpack_require__(/*! ./style */ "../../../node_modules/antd/lib/table/style/index.js")); const EMPTY_LIST = []; const InternalTable = (props, ref) => { var _a, _b; const { prefixCls: customizePrefixCls, className, rootClassName, style, size: customizeSize, bordered, dropdownPrefixCls: customizeDropdownPrefixCls, dataSource, pagination, rowSelection, rowKey = 'key', rowClassName, columns, children, childrenColumnName: legacyChildrenColumnName, onChange, getPopupContainer, loading, expandIcon, expandable, expandedRowRender, expandIconColumnIndex, indentSize, scroll, sortDirections, locale, showSorterTooltip = { target: 'full-header' }, virtual } = props; const warning = (0, _warning.devUseWarning)('Table'); if (true) { true ? warning(!(typeof rowKey === 'function' && rowKey.length > 1), 'usage', '`index` parameter of `rowKey` function is deprecated. There is no guarantee that it will work as expected.') : 0; } const baseColumns = React.useMemo(() => columns || (0, _useColumns.convertChildrenToColumns)(children), [columns, children]); const needResponsive = React.useMemo(() => baseColumns.some(col => col.responsive), [baseColumns]); const screens = (0, _useBreakpoint.default)(needResponsive); const mergedColumns = React.useMemo(() => { const matched = new Set(Object.keys(screens).filter(m => screens[m])); return baseColumns.filter(c => !c.responsive || c.responsive.some(r => matched.has(r))); }, [baseColumns, screens]); const tableProps = (0, _omit.default)(props, ['className', 'style', 'columns']); const { locale: contextLocale = _en_US.default, direction, table, renderEmpty, getPrefixCls, getPopupContainer: getContextPopupContainer } = React.useContext(_context.ConfigContext); const mergedSize = (0, _useSize.default)(customizeSize); const tableLocale = Object.assign(Object.assign({}, contextLocale.Table), locale); const rawData = dataSource || EMPTY_LIST; const prefixCls = getPrefixCls('table', customizePrefixCls); const dropdownPrefixCls = getPrefixCls('dropdown', customizeDropdownPrefixCls); const [, token] = (0, _internal.useToken)(); const rootCls = (0, _useCSSVarCls.default)(prefixCls); const [wrapCSSVar, hashId, cssVarCls] = (0, _style.default)(prefixCls, rootCls); const mergedExpandable = Object.assign(Object.assign({ childrenColumnName: legacyChildrenColumnName, expandIconColumnIndex }, expandable), { expandIcon: (_a = expandable === null || expandable === void 0 ? void 0 : expandable.expandIcon) !== null && _a !== void 0 ? _a : (_b = table === null || table === void 0 ? void 0 : table.expandable) === null || _b === void 0 ? void 0 : _b.expandIcon }); const { childrenColumnName = 'children' } = mergedExpandable; const expandType = React.useMemo(() => { if (rawData.some(item => item === null || item === void 0 ? void 0 : item[childrenColumnName])) { return 'nest'; } if (expandedRowRender || (expandable === null || expandable === void 0 ? void 0 : expandable.expandedRowRender)) { return 'row'; } return null; }, [rawData]); const internalRefs = { body: React.useRef(null) }; // ============================ Width ============================= const getContainerWidth = (0, _useContainerWidth.default)(prefixCls); // ============================= Refs ============================= const rootRef = React.useRef(null); const tblRef = React.useRef(null); (0, _useProxyImperativeHandle.default)(ref, () => Object.assign(Object.assign({}, tblRef.current), { nativeElement: rootRef.current })); // ============================ RowKey ============================ const getRowKey = React.useMemo(() => { if (typeof rowKey === 'function') { return rowKey; } return record => record === null || record === void 0 ? void 0 : record[rowKey]; }, [rowKey]); const [getRecordByKey] = (0, _useLazyKVMap.default)(rawData, childrenColumnName, getRowKey); // ============================ Events ============================= const changeEventInfo = {}; const triggerOnChange = (info, action, reset = false) => { var _a, _b, _c, _d; const changeInfo = Object.assign(Object.assign({}, changeEventInfo), info); if (reset) { (_a = changeEventInfo.resetPagination) === null || _a === void 0 ? void 0 : _a.call(changeEventInfo); // Reset event param if ((_b = changeInfo.pagination) === null || _b === void 0 ? void 0 : _b.current) { changeInfo.pagination.current = 1; } // Trigger pagination events if (pagination) { (_c = pagination.onChange) === null || _c === void 0 ? void 0 : _c.call(pagination, 1, (_d = changeInfo.pagination) === null || _d === void 0 ? void 0 : _d.pageSize); } } if (scroll && scroll.scrollToFirstRowOnChange !== false && internalRefs.body.current) { (0, _scrollTo.default)(0, { getContainer: () => internalRefs.body.current }); } onChange === null || onChange === void 0 ? void 0 : onChange(changeInfo.pagination, changeInfo.filters, changeInfo.sorter, { currentDataSource: (0, _useFilter.getFilterData)((0, _useSorter.getSortData)(rawData, changeInfo.sorterStates, childrenColumnName), changeInfo.filterStates, childrenColumnName), action }); }; /** * Controlled state in `columns` is not a good idea that makes too many code (1000+ line?) to read * state out and then put it back to title render. Move these code into `hooks` but still too * complex. We should provides Table props like `sorter` & `filter` to handle control in next big * version. */ // ============================ Sorter ============================= const onSorterChange = (sorter, sorterStates) => { triggerOnChange({ sorter, sorterStates }, 'sort', false); }; const [transformSorterColumns, sortStates, sorterTitleProps, getSorters] = (0, _useSorter.default)({ prefixCls, mergedColumns, onSorterChange, sortDirections: sortDirections || ['ascend', 'descend'], tableLocale, showSorterTooltip }); const sortedData = React.useMemo(() => (0, _useSorter.getSortData)(rawData, sortStates, childrenColumnName), [rawData, sortStates]); changeEventInfo.sorter = getSorters(); changeEventInfo.sorterStates = sortStates; // ============================ Filter ============================ const onFilterChange = (filters, filterStates) => { triggerOnChange({ filters, filterStates }, 'filter', true); }; const [transformFilterColumns, filterStates, filters] = (0, _useFilter.default)({ prefixCls, locale: tableLocale, dropdownPrefixCls, mergedColumns, onFilterChange, getPopupContainer: getPopupContainer || getContextPopupContainer, rootClassName: (0, _classnames.default)(rootClassName, rootCls) }); const mergedData = (0, _useFilter.getFilterData)(sortedData, filterStates, childrenColumnName); changeEventInfo.filters = filters; changeEventInfo.filterStates = filterStates; // ============================ Column ============================ const columnTitleProps = React.useMemo(() => { const mergedFilters = {}; Object.keys(filters).forEach(filterKey => { if (filters[filterKey] !== null) { mergedFilters[filterKey] = filters[filterKey]; } }); return Object.assign(Object.assign({}, sorterTitleProps), { filters: mergedFilters }); }, [sorterTitleProps, filters]); const [transformTitleColumns] = (0, _useTitleColumns.default)(columnTitleProps); // ========================== Pagination ========================== const onPaginationChange = (current, pageSize) => { triggerOnChange({ pagination: Object.assign(Object.assign({}, changeEventInfo.pagination), { current, pageSize }) }, 'paginate'); }; const [mergedPagination, resetPagination] = (0, _usePagination.default)(mergedData.length, onPaginationChange, pagination); changeEventInfo.pagination = pagination === false ? {} : (0, _usePagination.getPaginationParam)(mergedPagination, pagination); changeEventInfo.resetPagination = resetPagination; // ============================= Data ============================= const pageData = React.useMemo(() => { if (pagination === false || !mergedPagination.pageSize) { return mergedData; } const { current = 1, total, pageSize = _usePagination.DEFAULT_PAGE_SIZE } = mergedPagination; true ? warning(current > 0, 'usage', '`current` should be positive number.') : 0; // Dynamic table data if (mergedData.length < total) { if (mergedData.length > pageSize) { true ? warning(false, 'usage', '`dataSource` length is less than `pagination.total` but large than `pagination.pageSize`. Please make sure your config correct data with async mode.') : 0; return mergedData.slice((current - 1) * pageSize, current * pageSize); } return mergedData; } return mergedData.slice((current - 1) * pageSize, current * pageSize); }, [!!pagination, mergedData, mergedPagination === null || mergedPagination === void 0 ? void 0 : mergedPagination.current, mergedPagination === null || mergedPagination === void 0 ? void 0 : mergedPagination.pageSize, mergedPagination === null || mergedPagination === void 0 ? void 0 : mergedPagination.total]); // ========================== Selections ========================== const [transformSelectionColumns, selectedKeySet] = (0, _useSelection.default)({ prefixCls, data: mergedData, pageData, getRowKey, getRecordByKey, expandType, childrenColumnName, locale: tableLocale, getPopupContainer: getPopupContainer || getContextPopupContainer }, rowSelection); const internalRowClassName = (record, index, indent) => { let mergedRowClassName; if (typeof rowClassName === 'function') { mergedRowClassName = (0, _classnames.default)(rowClassName(record, index, indent)); } else { mergedRowClassName = (0, _classnames.default)(rowClassName); } return (0, _classnames.default)({ [`${prefixCls}-row-selected`]: selectedKeySet.has(getRowKey(record, index)) }, mergedRowClassName); }; // ========================== Expandable ========================== // Pass origin render status into `rc-table`, this can be removed when refactor with `rc-table` mergedExpandable.__PARENT_RENDER_ICON__ = mergedExpandable.expandIcon; // Customize expandable icon mergedExpandable.expandIcon = mergedExpandable.expandIcon || expandIcon || (0, _ExpandIcon.default)(tableLocale); // Adjust expand icon index, no overwrite expandIconColumnIndex if set. if (expandType === 'nest' && mergedExpandable.expandIconColumnIndex === undefined) { mergedExpandable.expandIconColumnIndex = rowSelection ? 1 : 0; } else if (mergedExpandable.expandIconColumnIndex > 0 && rowSelection) { mergedExpandable.expandIconColumnIndex -= 1; } // Indent size if (typeof mergedExpandable.indentSize !== 'number') { mergedExpandable.indentSize = typeof indentSize === 'number' ? indentSize : 15; } // ============================ Render ============================ const transformColumns = React.useCallback(innerColumns => transformTitleColumns(transformSelectionColumns(transformFilterColumns(transformSorterColumns(innerColumns)))), [transformSorterColumns, transformFilterColumns, transformSelectionColumns]); let topPaginationNode; let bottomPaginationNode; if (pagination !== false && (mergedPagination === null || mergedPagination === void 0 ? void 0 : mergedPagination.total)) { let paginationSize; if (mergedPagination.size) { paginationSize = mergedPagination.size; } else { paginationSize = mergedSize === 'small' || mergedSize === 'middle' ? 'small' : undefined; } const renderPagination = position => (/*#__PURE__*/React.createElement(_pagination.default, Object.assign({}, mergedPagination, { className: (0, _classnames.default)(`${prefixCls}-pagination ${prefixCls}-pagination-${position}`, mergedPagination.className), size: paginationSize }))); const defaultPosition = direction === 'rtl' ? 'left' : 'right'; const { position } = mergedPagination; if (position !== null && Array.isArray(position)) { const topPos = position.find(p => p.includes('top')); const bottomPos = position.find(p => p.includes('bottom')); const isDisable = position.every(p => `${p}` === 'none'); if (!topPos && !bottomPos && !isDisable) { bottomPaginationNode = renderPagination(defaultPosition); } if (topPos) { topPaginationNode = renderPagination(topPos.toLowerCase().replace('top', '')); } if (bottomPos) { bottomPaginationNode = renderPagination(bottomPos.toLowerCase().replace('bottom', '')); } } else { bottomPaginationNode = renderPagination(defaultPosition); } } // >>>>>>>>> Spinning let spinProps; if (typeof loading === 'boolean') { spinProps = { spinning: loading }; } else if (typeof loading === 'object') { spinProps = Object.assign({ spinning: true }, loading); } const wrapperClassNames = (0, _classnames.default)(cssVarCls, rootCls, `${prefixCls}-wrapper`, table === null || table === void 0 ? void 0 : table.className, { [`${prefixCls}-wrapper-rtl`]: direction === 'rtl' }, className, rootClassName, hashId); const mergedStyle = Object.assign(Object.assign({}, table === null || table === void 0 ? void 0 : table.style), style); const emptyText = typeof (locale === null || locale === void 0 ? void 0 : locale.emptyText) !== 'undefined' ? locale.emptyText : (renderEmpty === null || renderEmpty === void 0 ? void 0 : renderEmpty('Table')) || /*#__PURE__*/React.createElement(_defaultRenderEmpty.default, { componentName: "Table" }); // ========================== Render ========================== const TableComponent = virtual ? _VirtualTable.default : _RcTable.default; // >>> Virtual Table props. We set height here since it will affect height collection const virtualProps = {}; const listItemHeight = React.useMemo(() => { const { fontSize, lineHeight, lineWidth, padding, paddingXS, paddingSM } = token; const fontHeight = Math.floor(fontSize * lineHeight); switch (mergedSize) { case 'middle': return paddingSM * 2 + fontHeight + lineWidth; case 'small': return paddingXS * 2 + fontHeight + lineWidth; default: return padding * 2 + fontHeight + lineWidth; } }, [token, mergedSize]); if (virtual) { virtualProps.listItemHeight = listItemHeight; } return wrapCSSVar(/*#__PURE__*/React.createElement("div", { ref: rootRef, className: wrapperClassNames, style: mergedStyle }, /*#__PURE__*/React.createElement(_spin.default, Object.assign({ spinning: false }, spinProps), topPaginationNode, /*#__PURE__*/React.createElement(TableComponent, Object.assign({}, virtualProps, tableProps, { ref: tblRef, columns: mergedColumns, direction: direction, expandable: mergedExpandable, prefixCls: prefixCls, className: (0, _classnames.default)({ [`${prefixCls}-middle`]: mergedSize === 'middle', [`${prefixCls}-small`]: mergedSize === 'small', [`${prefixCls}-bordered`]: bordered, [`${prefixCls}-empty`]: rawData.length === 0 }, cssVarCls, rootCls, hashId), data: pageData, rowKey: getRowKey, rowClassName: internalRowClassName, emptyText: emptyText, // Internal internalHooks: _rcTable.INTERNAL_HOOKS, internalRefs: internalRefs, transformColumns: transformColumns, getContainerWidth: getContainerWidth })), bottomPaginationNode))); }; var _default = exports["default"] = /*#__PURE__*/React.forwardRef(InternalTable); /***/ }), /***/ "../../../node_modules/antd/lib/table/RcTable/VirtualTable.js": /*!********************************************************************!*\ !*** ../../../node_modules/antd/lib/table/RcTable/VirtualTable.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _rcTable = __webpack_require__(/*! rc-table */ "../../../node_modules/rc-table/es/index.js"); /** * Same as `rc-table` but we modify trigger children update logic instead. */ const RcVirtualTable = (0, _rcTable.genVirtualTable)((prev, next) => { const { _renderTimes: prevRenderTimes } = prev; const { _renderTimes: nextRenderTimes } = next; return prevRenderTimes !== nextRenderTimes; }); var _default = exports["default"] = RcVirtualTable; /***/ }), /***/ "../../../node_modules/antd/lib/table/RcTable/index.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/table/RcTable/index.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _rcTable = __webpack_require__(/*! rc-table */ "../../../node_modules/rc-table/es/index.js"); /** * Same as `rc-table` but we modify trigger children update logic instead. */ const RcTable = (0, _rcTable.genTable)((prev, next) => { const { _renderTimes: prevRenderTimes } = prev; const { _renderTimes: nextRenderTimes } = next; return prevRenderTimes !== nextRenderTimes; }); var _default = exports["default"] = RcTable; /***/ }), /***/ "../../../node_modules/antd/lib/table/Table.js": /*!*****************************************************!*\ !*** ../../../node_modules/antd/lib/table/Table.js ***! \*****************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _rcTable = __webpack_require__(/*! rc-table */ "../../../node_modules/rc-table/es/index.js"); var _Column = _interopRequireDefault(__webpack_require__(/*! ./Column */ "../../../node_modules/antd/lib/table/Column.js")); var _ColumnGroup = _interopRequireDefault(__webpack_require__(/*! ./ColumnGroup */ "../../../node_modules/antd/lib/table/ColumnGroup.js")); var _useSelection = __webpack_require__(/*! ./hooks/useSelection */ "../../../node_modules/antd/lib/table/hooks/useSelection.js"); var _InternalTable = _interopRequireDefault(__webpack_require__(/*! ./InternalTable */ "../../../node_modules/antd/lib/table/InternalTable.js")); const Table = (props, ref) => { const renderTimesRef = React.useRef(0); renderTimesRef.current += 1; return /*#__PURE__*/React.createElement(_InternalTable.default, Object.assign({}, props, { ref: ref, _renderTimes: renderTimesRef.current })); }; const ForwardTable = /*#__PURE__*/React.forwardRef(Table); ForwardTable.SELECTION_COLUMN = _useSelection.SELECTION_COLUMN; ForwardTable.EXPAND_COLUMN = _rcTable.EXPAND_COLUMN; ForwardTable.SELECTION_ALL = _useSelection.SELECTION_ALL; ForwardTable.SELECTION_INVERT = _useSelection.SELECTION_INVERT; ForwardTable.SELECTION_NONE = _useSelection.SELECTION_NONE; ForwardTable.Column = _Column.default; ForwardTable.ColumnGroup = _ColumnGroup.default; ForwardTable.Summary = _rcTable.Summary; if (true) { ForwardTable.displayName = 'Table'; } var _default = exports["default"] = ForwardTable; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useContainerWidth.js": /*!***********************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useContainerWidth.js ***! \***********************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useContainerWidth; function useContainerWidth(prefixCls) { const getContainerWidth = (ele, width) => { const container = ele.querySelector(`.${prefixCls}-container`); let returnWidth = width; if (container) { const style = getComputedStyle(container); const borderLeft = parseInt(style.borderLeftWidth, 10); const borderRight = parseInt(style.borderRightWidth, 10); returnWidth = width - borderLeft - borderRight; } return returnWidth; }; return getContainerWidth; } /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useFilter/FilterDropdown.js": /*!******************************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useFilter/FilterDropdown.js ***! \******************************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; exports.flattenKeys = flattenKeys; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/toConsumableArray.js")); var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _FilterFilled = _interopRequireDefault(__webpack_require__(/*! @ant-design/icons/FilterFilled */ "../../../node_modules/@ant-design/icons/FilterFilled.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); var _isEqual = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/isEqual */ "../../../node_modules/rc-util/lib/isEqual.js")); var _extendsObject = _interopRequireDefault(__webpack_require__(/*! ../../../_util/extendsObject */ "../../../node_modules/antd/lib/_util/extendsObject.js")); var _useSyncState = _interopRequireDefault(__webpack_require__(/*! ../../../_util/hooks/useSyncState */ "../../../node_modules/antd/lib/_util/hooks/useSyncState.js")); var _warning = __webpack_require__(/*! ../../../_util/warning */ "../../../node_modules/antd/lib/_util/warning.js"); var _button = _interopRequireDefault(__webpack_require__(/*! ../../../button */ "../../../node_modules/antd/lib/button/index.js")); var _checkbox = _interopRequireDefault(__webpack_require__(/*! ../../../checkbox */ "../../../node_modules/antd/lib/checkbox/index.js")); var _context = __webpack_require__(/*! ../../../config-provider/context */ "../../../node_modules/antd/lib/config-provider/context.js"); var _dropdown = _interopRequireDefault(__webpack_require__(/*! ../../../dropdown */ "../../../node_modules/antd/lib/dropdown/index.js")); var _empty = _interopRequireDefault(__webpack_require__(/*! ../../../empty */ "../../../node_modules/antd/lib/empty/index.js")); var _menu = _interopRequireDefault(__webpack_require__(/*! ../../../menu */ "../../../node_modules/antd/lib/menu/index.js")); var _OverrideContext = __webpack_require__(/*! ../../../menu/OverrideContext */ "../../../node_modules/antd/lib/menu/OverrideContext.js"); var _radio = _interopRequireDefault(__webpack_require__(/*! ../../../radio */ "../../../node_modules/antd/lib/radio/index.js")); var _tree = _interopRequireDefault(__webpack_require__(/*! ../../../tree */ "../../../node_modules/antd/lib/tree/index.js")); var _FilterSearch = _interopRequireDefault(__webpack_require__(/*! ./FilterSearch */ "../../../node_modules/antd/lib/table/hooks/useFilter/FilterSearch.js")); var _FilterWrapper = _interopRequireDefault(__webpack_require__(/*! ./FilterWrapper */ "../../../node_modules/antd/lib/table/hooks/useFilter/FilterWrapper.js")); function flattenKeys(filters) { let keys = []; (filters || []).forEach(({ value, children }) => { keys.push(value); if (children) { keys = [].concat((0, _toConsumableArray2.default)(keys), (0, _toConsumableArray2.default)(flattenKeys(children))); } }); return keys; } function hasSubMenu(filters) { return filters.some(({ children }) => children); } function searchValueMatched(searchValue, text) { if (typeof text === 'string' || typeof text === 'number') { return text === null || text === void 0 ? void 0 : text.toString().toLowerCase().includes(searchValue.trim().toLowerCase()); } return false; } function renderFilterItems({ filters, prefixCls, filteredKeys, filterMultiple, searchValue, filterSearch }) { return filters.map((filter, index) => { const key = String(filter.value); if (filter.children) { return { key: key || index, label: filter.text, popupClassName: `${prefixCls}-dropdown-submenu`, children: renderFilterItems({ filters: filter.children, prefixCls, filteredKeys, filterMultiple, searchValue, filterSearch }) }; } const Component = filterMultiple ? _checkbox.default : _radio.default; const item = { key: filter.value !== undefined ? key : index, label: (/*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Component, { checked: filteredKeys.includes(key) }), /*#__PURE__*/React.createElement("span", null, filter.text))) }; if (searchValue.trim()) { if (typeof filterSearch === 'function') { return filterSearch(searchValue, filter) ? item : null; } return searchValueMatched(searchValue, filter.text) ? item : null; } return item; }); } function wrapStringListType(keys) { return keys || []; } const FilterDropdown = props => { var _a, _b, _c, _d; const { tablePrefixCls, prefixCls, column, dropdownPrefixCls, columnKey, filterOnClose, filterMultiple, filterMode = 'menu', filterSearch = false, filterState, triggerFilter, locale, children, getPopupContainer, rootClassName } = props; const { filterResetToDefaultFilteredValue, defaultFilteredValue, filterDropdownProps = {}, // Deprecated filterDropdownOpen, filterDropdownVisible, onFilterDropdownVisibleChange, onFilterDropdownOpenChange } = column; const [visible, setVisible] = React.useState(false); const filtered = !!(filterState && (((_a = filterState.filteredKeys) === null || _a === void 0 ? void 0 : _a.length) || filterState.forceFiltered)); const triggerVisible = newVisible => { var _a; setVisible(newVisible); (_a = filterDropdownProps.onOpenChange) === null || _a === void 0 ? void 0 : _a.call(filterDropdownProps, newVisible); // deprecated onFilterDropdownOpenChange === null || onFilterDropdownOpenChange === void 0 ? void 0 : onFilterDropdownOpenChange(newVisible); onFilterDropdownVisibleChange === null || onFilterDropdownVisibleChange === void 0 ? void 0 : onFilterDropdownVisibleChange(newVisible); }; // =================Warning=================== if (true) { const warning = (0, _warning.devUseWarning)('Table'); const deprecatedList = [['filterDropdownOpen', 'filterDropdownProps.open'], ['filterDropdownVisible', 'filterDropdownProps.open'], ['onFilterDropdownOpenChange', 'filterDropdownProps.onOpenChange'], ['onFilterDropdownVisibleChange', 'filterDropdownProps.onOpenChange']]; deprecatedList.forEach(([deprecatedName, newName]) => { warning.deprecated(!(deprecatedName in column), deprecatedName, newName); }); warning.deprecated(!('filterCheckall' in locale), 'filterCheckall', 'locale.filterCheckAll'); } const mergedVisible = (_d = (_c = (_b = filterDropdownProps.open) !== null && _b !== void 0 ? _b : filterDropdownOpen) !== null && _c !== void 0 ? _c : filterDropdownVisible) !== null && _d !== void 0 ? _d : visible; // inner state // ===================== Select Keys ===================== const propFilteredKeys = filterState === null || filterState === void 0 ? void 0 : filterState.filteredKeys; const [getFilteredKeysSync, setFilteredKeysSync] = (0, _useSyncState.default)(wrapStringListType(propFilteredKeys)); const onSelectKeys = ({ selectedKeys }) => { setFilteredKeysSync(selectedKeys); }; const onCheck = (keys, { node, checked }) => { if (!filterMultiple) { onSelectKeys({ selectedKeys: checked && node.key ? [node.key] : [] }); } else { onSelectKeys({ selectedKeys: keys }); } }; React.useEffect(() => { if (!visible) { return; } onSelectKeys({ selectedKeys: wrapStringListType(propFilteredKeys) }); }, [propFilteredKeys]); // ====================== Open Keys ====================== const [openKeys, setOpenKeys] = React.useState([]); const onOpenChange = keys => { setOpenKeys(keys); }; // search in tree mode column filter const [searchValue, setSearchValue] = React.useState(''); const onSearch = e => { const { value } = e.target; setSearchValue(value); }; // clear search value after close filter dropdown React.useEffect(() => { if (!visible) { setSearchValue(''); } }, [visible]); // ======================= Submit ======================== const internalTriggerFilter = keys => { const mergedKeys = (keys === null || keys === void 0 ? void 0 : keys.length) ? keys : null; if (mergedKeys === null && (!filterState || !filterState.filteredKeys)) { return null; } if ((0, _isEqual.default)(mergedKeys, filterState === null || filterState === void 0 ? void 0 : filterState.filteredKeys, true)) { return null; } triggerFilter({ column, key: columnKey, filteredKeys: mergedKeys }); }; const onConfirm = () => { triggerVisible(false); internalTriggerFilter(getFilteredKeysSync()); }; const onReset = ({ confirm, closeDropdown } = { confirm: false, closeDropdown: false }) => { if (confirm) { internalTriggerFilter([]); } if (closeDropdown) { triggerVisible(false); } setSearchValue(''); if (filterResetToDefaultFilteredValue) { setFilteredKeysSync((defaultFilteredValue || []).map(key => String(key))); } else { setFilteredKeysSync([]); } }; const doFilter = ({ closeDropdown } = { closeDropdown: true }) => { if (closeDropdown) { triggerVisible(false); } internalTriggerFilter(getFilteredKeysSync()); }; const onVisibleChange = (newVisible, info) => { if (info.source === 'trigger') { if (newVisible && propFilteredKeys !== undefined) { // Sync filteredKeys on appear in controlled mode (propFilteredKeys !== undefined) setFilteredKeysSync(wrapStringListType(propFilteredKeys)); } triggerVisible(newVisible); if (!newVisible && !column.filterDropdown && filterOnClose) { onConfirm(); } } }; // ======================== Style ======================== const dropdownMenuClass = (0, _classnames.default)({ [`${dropdownPrefixCls}-menu-without-submenu`]: !hasSubMenu(column.filters || []) }); const onCheckAll = e => { if (e.target.checked) { const allFilterKeys = flattenKeys(column === null || column === void 0 ? void 0 : column.filters).map(key => String(key)); setFilteredKeysSync(allFilterKeys); } else { setFilteredKeysSync([]); } }; const getTreeData = ({ filters }) => (filters || []).map((filter, index) => { const key = String(filter.value); const item = { title: filter.text, key: filter.value !== undefined ? key : String(index) }; if (filter.children) { item.children = getTreeData({ filters: filter.children }); } return item; }); const getFilterData = node => { var _a; return Object.assign(Object.assign({}, node), { text: node.title, value: node.key, children: ((_a = node.children) === null || _a === void 0 ? void 0 : _a.map(item => getFilterData(item))) || [] }); }; let dropdownContent; const { direction, renderEmpty } = React.useContext(_context.ConfigContext); if (typeof column.filterDropdown === 'function') { dropdownContent = column.filterDropdown({ prefixCls: `${dropdownPrefixCls}-custom`, setSelectedKeys: selectedKeys => onSelectKeys({ selectedKeys: selectedKeys }), selectedKeys: getFilteredKeysSync(), confirm: doFilter, clearFilters: onReset, filters: column.filters, visible: mergedVisible, close: () => { triggerVisible(false); } }); } else if (column.filterDropdown) { dropdownContent = column.filterDropdown; } else { const selectedKeys = getFilteredKeysSync() || []; const getFilterComponent = () => { var _a, _b; const empty = (_a = renderEmpty === null || renderEmpty === void 0 ? void 0 : renderEmpty('Table.filter')) !== null && _a !== void 0 ? _a : (/*#__PURE__*/React.createElement(_empty.default, { image: _empty.default.PRESENTED_IMAGE_SIMPLE, description: locale.filterEmptyText, styles: { image: { height: 24 } }, style: { margin: 0, padding: '16px 0' } })); if ((column.filters || []).length === 0) { return empty; } if (filterMode === 'tree') { return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_FilterSearch.default, { filterSearch: filterSearch, value: searchValue, onChange: onSearch, tablePrefixCls: tablePrefixCls, locale: locale }), /*#__PURE__*/React.createElement("div", { className: `${tablePrefixCls}-filter-dropdown-tree` }, filterMultiple ? (/*#__PURE__*/React.createElement(_checkbox.default, { checked: selectedKeys.length === flattenKeys(column.filters).length, indeterminate: selectedKeys.length > 0 && selectedKeys.length < flattenKeys(column.filters).length, className: `${tablePrefixCls}-filter-dropdown-checkall`, onChange: onCheckAll }, (_b = locale === null || locale === void 0 ? void 0 : locale.filterCheckall) !== null && _b !== void 0 ? _b : locale === null || locale === void 0 ? void 0 : locale.filterCheckAll)) : null, /*#__PURE__*/React.createElement(_tree.default, { checkable: true, selectable: false, blockNode: true, multiple: filterMultiple, checkStrictly: !filterMultiple, className: `${dropdownPrefixCls}-menu`, onCheck: onCheck, checkedKeys: selectedKeys, selectedKeys: selectedKeys, showIcon: false, treeData: getTreeData({ filters: column.filters }), autoExpandParent: true, defaultExpandAll: true, filterTreeNode: searchValue.trim() ? node => { if (typeof filterSearch === 'function') { return filterSearch(searchValue, getFilterData(node)); } return searchValueMatched(searchValue, node.title); } : undefined }))); } const items = renderFilterItems({ filters: column.filters || [], filterSearch, prefixCls, filteredKeys: getFilteredKeysSync(), filterMultiple, searchValue }); const isEmpty = items.every(item => item === null); return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_FilterSearch.default, { filterSearch: filterSearch, value: searchValue, onChange: onSearch, tablePrefixCls: tablePrefixCls, locale: locale }), isEmpty ? empty : (/*#__PURE__*/React.createElement(_menu.default, { selectable: true, multiple: filterMultiple, prefixCls: `${dropdownPrefixCls}-menu`, className: dropdownMenuClass, onSelect: onSelectKeys, onDeselect: onSelectKeys, selectedKeys: selectedKeys, getPopupContainer: getPopupContainer, openKeys: openKeys, onOpenChange: onOpenChange, items: items }))); }; const getResetDisabled = () => { if (filterResetToDefaultFilteredValue) { return (0, _isEqual.default)((defaultFilteredValue || []).map(key => String(key)), selectedKeys, true); } return selectedKeys.length === 0; }; dropdownContent = /*#__PURE__*/React.createElement(React.Fragment, null, getFilterComponent(), /*#__PURE__*/React.createElement("div", { className: `${prefixCls}-dropdown-btns` }, /*#__PURE__*/React.createElement(_button.default, { type: "link", size: "small", disabled: getResetDisabled(), onClick: () => onReset() }, locale.filterReset), /*#__PURE__*/React.createElement(_button.default, { type: "primary", size: "small", onClick: onConfirm }, locale.filterConfirm))); } // We should not block customize Menu with additional props if (column.filterDropdown) { dropdownContent = /*#__PURE__*/React.createElement(_OverrideContext.OverrideProvider, { selectable: undefined }, dropdownContent); } dropdownContent = /*#__PURE__*/React.createElement(_FilterWrapper.default, { className: `${prefixCls}-dropdown` }, dropdownContent); const getDropdownTrigger = () => { let filterIcon; if (typeof column.filterIcon === 'function') { filterIcon = column.filterIcon(filtered); } else if (column.filterIcon) { filterIcon = column.filterIcon; } else { filterIcon = /*#__PURE__*/React.createElement(_FilterFilled.default, null); } return /*#__PURE__*/React.createElement("span", { role: "button", tabIndex: -1, className: (0, _classnames.default)(`${prefixCls}-trigger`, { active: filtered }), onClick: e => { e.stopPropagation(); } }, filterIcon); }; const mergedDropdownProps = (0, _extendsObject.default)({ trigger: ['click'], placement: direction === 'rtl' ? 'bottomLeft' : 'bottomRight', children: getDropdownTrigger(), getPopupContainer }, Object.assign(Object.assign({}, filterDropdownProps), { rootClassName: (0, _classnames.default)(rootClassName, filterDropdownProps.rootClassName), open: mergedVisible, onOpenChange: onVisibleChange, popupRender: () => { if (typeof (filterDropdownProps === null || filterDropdownProps === void 0 ? void 0 : filterDropdownProps.dropdownRender) === 'function') { return filterDropdownProps.dropdownRender(dropdownContent); } return dropdownContent; } })); return /*#__PURE__*/React.createElement("div", { className: `${prefixCls}-column` }, /*#__PURE__*/React.createElement("span", { className: `${tablePrefixCls}-column-title` }, children), /*#__PURE__*/React.createElement(_dropdown.default, Object.assign({}, mergedDropdownProps))); }; var _default = exports["default"] = FilterDropdown; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useFilter/FilterSearch.js": /*!****************************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useFilter/FilterSearch.js ***! \****************************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _SearchOutlined = _interopRequireDefault(__webpack_require__(/*! @ant-design/icons/SearchOutlined */ "../../../node_modules/@ant-design/icons/SearchOutlined.js")); var _Input = _interopRequireDefault(__webpack_require__(/*! ../../../input/Input */ "../../../node_modules/antd/lib/input/Input.js")); const FilterSearch = props => { const { value, filterSearch, tablePrefixCls, locale, onChange } = props; if (!filterSearch) { return null; } return /*#__PURE__*/React.createElement("div", { className: `${tablePrefixCls}-filter-dropdown-search` }, /*#__PURE__*/React.createElement(_Input.default, { prefix: /*#__PURE__*/React.createElement(_SearchOutlined.default, null), placeholder: locale.filterSearchPlaceholder, onChange: onChange, value: value, // for skip min-width of input htmlSize: 1, className: `${tablePrefixCls}-filter-dropdown-search-input` })); }; var _default = exports["default"] = FilterSearch; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useFilter/FilterWrapper.js": /*!*****************************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useFilter/FilterWrapper.js ***! \*****************************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _KeyCode = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/KeyCode */ "../../../node_modules/rc-util/lib/KeyCode.js")); const onKeyDown = event => { const { keyCode } = event; if (keyCode === _KeyCode.default.ENTER) { event.stopPropagation(); } }; const FilterDropdownMenuWrapper = /*#__PURE__*/React.forwardRef((props, ref) => (/*#__PURE__*/React.createElement("div", { className: props.className, onClick: e => e.stopPropagation(), onKeyDown: onKeyDown, ref: ref }, props.children))); if (true) { FilterDropdownMenuWrapper.displayName = 'FilterDropdownMenuWrapper'; } var _default = exports["default"] = FilterDropdownMenuWrapper; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useFilter/index.js": /*!*********************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useFilter/index.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; Object.defineProperty(exports, "flattenKeys", ({ enumerable: true, get: function () { return _FilterDropdown.flattenKeys; } })); exports.getFilterData = void 0; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/toConsumableArray.js")); var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _warning = __webpack_require__(/*! ../../../_util/warning */ "../../../node_modules/antd/lib/_util/warning.js"); var _util = __webpack_require__(/*! ../../util */ "../../../node_modules/antd/lib/table/util.js"); var _FilterDropdown = _interopRequireWildcard(__webpack_require__(/*! ./FilterDropdown */ "../../../node_modules/antd/lib/table/hooks/useFilter/FilterDropdown.js")); const collectFilterStates = (columns, init, pos) => { let filterStates = []; (columns || []).forEach((column, index) => { var _a; const columnPos = (0, _util.getColumnPos)(index, pos); const filterDropdownIsDefined = column.filterDropdown !== undefined; if (column.filters || filterDropdownIsDefined || 'onFilter' in column) { if ('filteredValue' in column) { // Controlled let filteredValues = column.filteredValue; if (!filterDropdownIsDefined) { filteredValues = (_a = filteredValues === null || filteredValues === void 0 ? void 0 : filteredValues.map(String)) !== null && _a !== void 0 ? _a : filteredValues; } filterStates.push({ column, key: (0, _util.getColumnKey)(column, columnPos), filteredKeys: filteredValues, forceFiltered: column.filtered }); } else { // Uncontrolled filterStates.push({ column, key: (0, _util.getColumnKey)(column, columnPos), filteredKeys: init && column.defaultFilteredValue ? column.defaultFilteredValue : undefined, forceFiltered: column.filtered }); } } if ('children' in column) { filterStates = [].concat((0, _toConsumableArray2.default)(filterStates), (0, _toConsumableArray2.default)(collectFilterStates(column.children, init, columnPos))); } }); return filterStates; }; function injectFilter(prefixCls, dropdownPrefixCls, columns, filterStates, locale, triggerFilter, getPopupContainer, pos, rootClassName) { return columns.map((column, index) => { const columnPos = (0, _util.getColumnPos)(index, pos); const { filterOnClose = true, filterMultiple = true, filterMode, filterSearch } = column; let newColumn = column; if (newColumn.filters || newColumn.filterDropdown) { const columnKey = (0, _util.getColumnKey)(newColumn, columnPos); const filterState = filterStates.find(({ key }) => columnKey === key); newColumn = Object.assign(Object.assign({}, newColumn), { title: renderProps => (/*#__PURE__*/React.createElement(_FilterDropdown.default, { tablePrefixCls: prefixCls, prefixCls: `${prefixCls}-filter`, dropdownPrefixCls: dropdownPrefixCls, column: newColumn, columnKey: columnKey, filterState: filterState, filterOnClose: filterOnClose, filterMultiple: filterMultiple, filterMode: filterMode, filterSearch: filterSearch, triggerFilter: triggerFilter, locale: locale, getPopupContainer: getPopupContainer, rootClassName: rootClassName }, (0, _util.renderColumnTitle)(column.title, renderProps))) }); } if ('children' in newColumn) { newColumn = Object.assign(Object.assign({}, newColumn), { children: injectFilter(prefixCls, dropdownPrefixCls, newColumn.children, filterStates, locale, triggerFilter, getPopupContainer, columnPos, rootClassName) }); } return newColumn; }); } const generateFilterInfo = filterStates => { const currentFilters = {}; filterStates.forEach(({ key, filteredKeys, column }) => { const keyAsString = key; const { filters, filterDropdown } = column; if (filterDropdown) { currentFilters[keyAsString] = filteredKeys || null; } else if (Array.isArray(filteredKeys)) { const keys = (0, _FilterDropdown.flattenKeys)(filters); currentFilters[keyAsString] = keys.filter(originKey => filteredKeys.includes(String(originKey))); } else { currentFilters[keyAsString] = null; } }); return currentFilters; }; const getFilterData = (data, filterStates, childrenColumnName) => { const filterDatas = filterStates.reduce((currentData, filterState) => { const { column: { onFilter, filters }, filteredKeys } = filterState; if (onFilter && filteredKeys && filteredKeys.length) { return currentData // shallow copy .map(record => Object.assign({}, record)).filter(record => filteredKeys.some(key => { const keys = (0, _FilterDropdown.flattenKeys)(filters); const keyIndex = keys.findIndex(k => String(k) === String(key)); const realKey = keyIndex !== -1 ? keys[keyIndex] : key; // filter children if (record[childrenColumnName]) { record[childrenColumnName] = getFilterData(record[childrenColumnName], filterStates, childrenColumnName); } return onFilter(realKey, record); })); } return currentData; }, data); return filterDatas; }; exports.getFilterData = getFilterData; const getMergedColumns = rawMergedColumns => rawMergedColumns.flatMap(column => { if ('children' in column) { return [column].concat((0, _toConsumableArray2.default)(getMergedColumns(column.children || []))); } return [column]; }); const useFilter = props => { const { prefixCls, dropdownPrefixCls, mergedColumns: rawMergedColumns, onFilterChange, getPopupContainer, locale: tableLocale, rootClassName } = props; const warning = (0, _warning.devUseWarning)('Table'); const mergedColumns = React.useMemo(() => getMergedColumns(rawMergedColumns || []), [rawMergedColumns]); const [filterStates, setFilterStates] = React.useState(() => collectFilterStates(mergedColumns, true)); const mergedFilterStates = React.useMemo(() => { const collectedStates = collectFilterStates(mergedColumns, false); if (collectedStates.length === 0) { return collectedStates; } let filteredKeysIsAllNotControlled = true; let filteredKeysIsAllControlled = true; collectedStates.forEach(({ filteredKeys }) => { if (filteredKeys !== undefined) { filteredKeysIsAllNotControlled = false; } else { filteredKeysIsAllControlled = false; } }); // Return if not controlled if (filteredKeysIsAllNotControlled) { // Filter column may have been removed const keyList = (mergedColumns || []).map((column, index) => (0, _util.getColumnKey)(column, (0, _util.getColumnPos)(index))); return filterStates.filter(({ key }) => keyList.includes(key)).map(item => { const col = mergedColumns[keyList.findIndex(key => key === item.key)]; return Object.assign(Object.assign({}, item), { column: Object.assign(Object.assign({}, item.column), col), forceFiltered: col.filtered }); }); } true ? warning(filteredKeysIsAllControlled, 'usage', 'Columns should all contain `filteredValue` or not contain `filteredValue`.') : 0; return collectedStates; }, [mergedColumns, filterStates]); const filters = React.useMemo(() => generateFilterInfo(mergedFilterStates), [mergedFilterStates]); const triggerFilter = filterState => { const newFilterStates = mergedFilterStates.filter(({ key }) => key !== filterState.key); newFilterStates.push(filterState); setFilterStates(newFilterStates); onFilterChange(generateFilterInfo(newFilterStates), newFilterStates); }; const transformColumns = innerColumns => injectFilter(prefixCls, dropdownPrefixCls, innerColumns, mergedFilterStates, tableLocale, triggerFilter, getPopupContainer, undefined, rootClassName); return [transformColumns, mergedFilterStates, filters]; }; var _default = exports["default"] = useFilter; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useLazyKVMap.js": /*!******************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useLazyKVMap.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); const useLazyKVMap = (data, childrenColumnName, getRowKey) => { const mapCacheRef = React.useRef({}); function getRecordByKey(key) { var _a; if (!mapCacheRef.current || mapCacheRef.current.data !== data || mapCacheRef.current.childrenColumnName !== childrenColumnName || mapCacheRef.current.getRowKey !== getRowKey) { const kvMap = new Map(); function dig(records) { records.forEach((record, index) => { const rowKey = getRowKey(record, index); kvMap.set(rowKey, record); if (record && typeof record === 'object' && childrenColumnName in record) { dig(record[childrenColumnName] || []); } }); } dig(data); mapCacheRef.current = { data, childrenColumnName, kvMap, getRowKey }; } return (_a = mapCacheRef.current.kvMap) === null || _a === void 0 ? void 0 : _a.get(key); } return [getRecordByKey]; }; var _default = exports["default"] = useLazyKVMap; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/usePagination.js": /*!*******************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/usePagination.js ***! \*******************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = exports.DEFAULT_PAGE_SIZE = void 0; exports.getPaginationParam = getPaginationParam; var _react = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); var _extendsObject = _interopRequireDefault(__webpack_require__(/*! ../../_util/extendsObject */ "../../../node_modules/antd/lib/_util/extendsObject.js")); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; const DEFAULT_PAGE_SIZE = exports.DEFAULT_PAGE_SIZE = 10; function getPaginationParam(mergedPagination, pagination) { const param = { current: mergedPagination.current, pageSize: mergedPagination.pageSize }; const paginationObj = pagination && typeof pagination === 'object' ? pagination : {}; Object.keys(paginationObj).forEach(pageProp => { const value = mergedPagination[pageProp]; if (typeof value !== 'function') { param[pageProp] = value; } }); return param; } function usePagination(total, onChange, pagination) { const _a = pagination && typeof pagination === 'object' ? pagination : {}, { total: paginationTotal = 0 } = _a, paginationObj = __rest(_a, ["total"]); const [innerPagination, setInnerPagination] = (0, _react.useState)(() => ({ current: 'defaultCurrent' in paginationObj ? paginationObj.defaultCurrent : 1, pageSize: 'defaultPageSize' in paginationObj ? paginationObj.defaultPageSize : DEFAULT_PAGE_SIZE })); // ============ Basic Pagination Config ============ const mergedPagination = (0, _extendsObject.default)(innerPagination, paginationObj, { total: paginationTotal > 0 ? paginationTotal : total }); // Reset `current` if data length or pageSize changed const maxPage = Math.ceil((paginationTotal || total) / mergedPagination.pageSize); if (mergedPagination.current > maxPage) { // Prevent a maximum page count of 0 mergedPagination.current = maxPage || 1; } const refreshPagination = (current, pageSize) => { setInnerPagination({ current: current !== null && current !== void 0 ? current : 1, pageSize: pageSize || mergedPagination.pageSize }); }; const onInternalChange = (current, pageSize) => { var _a; if (pagination) { (_a = pagination.onChange) === null || _a === void 0 ? void 0 : _a.call(pagination, current, pageSize); } refreshPagination(current, pageSize); onChange(current, pageSize || (mergedPagination === null || mergedPagination === void 0 ? void 0 : mergedPagination.pageSize)); }; if (pagination === false) { return [{}, () => {}]; } return [Object.assign(Object.assign({}, mergedPagination), { onChange: onInternalChange }), refreshPagination]; } var _default = exports["default"] = usePagination; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useSelection.js": /*!******************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useSelection.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = exports.SELECTION_NONE = exports.SELECTION_INVERT = exports.SELECTION_COLUMN = exports.SELECTION_ALL = void 0; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/toConsumableArray.js")); var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var React = _react; var _DownOutlined = _interopRequireDefault(__webpack_require__(/*! @ant-design/icons/DownOutlined */ "../../../node_modules/@ant-design/icons/DownOutlined.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); var _rcTable = __webpack_require__(/*! rc-table */ "../../../node_modules/rc-table/es/index.js"); var _util = __webpack_require__(/*! rc-tree/lib/util */ "../../../node_modules/rc-tree/lib/util.js"); var _conductUtil = __webpack_require__(/*! rc-tree/lib/utils/conductUtil */ "../../../node_modules/rc-tree/lib/utils/conductUtil.js"); var _treeUtil = __webpack_require__(/*! rc-tree/lib/utils/treeUtil */ "../../../node_modules/rc-tree/lib/utils/treeUtil.js"); var _useMergedState = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/hooks/useMergedState */ "../../../node_modules/rc-util/lib/hooks/useMergedState.js")); var _useMultipleSelect = _interopRequireDefault(__webpack_require__(/*! ../../_util/hooks/useMultipleSelect */ "../../../node_modules/antd/lib/_util/hooks/useMultipleSelect.js")); var _warning = __webpack_require__(/*! ../../_util/warning */ "../../../node_modules/antd/lib/_util/warning.js"); var _checkbox = _interopRequireDefault(__webpack_require__(/*! ../../checkbox */ "../../../node_modules/antd/lib/checkbox/index.js")); var _dropdown = _interopRequireDefault(__webpack_require__(/*! ../../dropdown */ "../../../node_modules/antd/lib/dropdown/index.js")); var _radio = _interopRequireDefault(__webpack_require__(/*! ../../radio */ "../../../node_modules/antd/lib/radio/index.js")); // TODO: warning if use ajax!!! const SELECTION_COLUMN = exports.SELECTION_COLUMN = {}; const SELECTION_ALL = exports.SELECTION_ALL = 'SELECT_ALL'; const SELECTION_INVERT = exports.SELECTION_INVERT = 'SELECT_INVERT'; const SELECTION_NONE = exports.SELECTION_NONE = 'SELECT_NONE'; const EMPTY_LIST = []; const flattenData = (childrenColumnName, data) => { let list = []; (data || []).forEach(record => { list.push(record); if (record && typeof record === 'object' && childrenColumnName in record) { list = [].concat((0, _toConsumableArray2.default)(list), (0, _toConsumableArray2.default)(flattenData(childrenColumnName, record[childrenColumnName]))); } }); return list; }; const useSelection = (config, rowSelection) => { const { preserveSelectedRowKeys, selectedRowKeys, defaultSelectedRowKeys, getCheckboxProps, onChange: onSelectionChange, onSelect, onSelectAll, onSelectInvert, onSelectNone, onSelectMultiple, columnWidth: selectionColWidth, type: selectionType, selections, fixed, renderCell: customizeRenderCell, hideSelectAll, checkStrictly = true } = rowSelection || {}; const { prefixCls, data, pageData, getRecordByKey, getRowKey, expandType, childrenColumnName, locale: tableLocale, getPopupContainer } = config; const warning = (0, _warning.devUseWarning)('Table'); // ========================= MultipleSelect ========================= const [multipleSelect, updatePrevSelectedIndex] = (0, _useMultipleSelect.default)(item => item); // ========================= Keys ========================= const [mergedSelectedKeys, setMergedSelectedKeys] = (0, _useMergedState.default)(selectedRowKeys || defaultSelectedRowKeys || EMPTY_LIST, { value: selectedRowKeys }); // ======================== Caches ======================== const preserveRecordsRef = React.useRef(new Map()); const updatePreserveRecordsCache = (0, _react.useCallback)(keys => { if (preserveSelectedRowKeys) { const newCache = new Map(); // Keep key if mark as preserveSelectedRowKeys keys.forEach(key => { let record = getRecordByKey(key); if (!record && preserveRecordsRef.current.has(key)) { record = preserveRecordsRef.current.get(key); } newCache.set(key, record); }); // Refresh to new cache preserveRecordsRef.current = newCache; } }, [getRecordByKey, preserveSelectedRowKeys]); // Update cache with selectedKeys React.useEffect(() => { updatePreserveRecordsCache(mergedSelectedKeys); }, [mergedSelectedKeys]); // Get flatten data const flattedData = (0, _react.useMemo)(() => flattenData(childrenColumnName, pageData), [childrenColumnName, pageData]); const { keyEntities } = (0, _react.useMemo)(() => { if (checkStrictly) { return { keyEntities: null }; } let convertData = data; if (preserveSelectedRowKeys) { // use flattedData keys const keysSet = new Set(flattedData.map((record, index) => getRowKey(record, index))); // remove preserveRecords that duplicate data const preserveRecords = Array.from(preserveRecordsRef.current).reduce((total, [key, value]) => keysSet.has(key) ? total : total.concat(value), []); convertData = [].concat((0, _toConsumableArray2.default)(convertData), (0, _toConsumableArray2.default)(preserveRecords)); } return (0, _treeUtil.convertDataToEntities)(convertData, { externalGetKey: getRowKey, childrenPropName: childrenColumnName }); }, [data, getRowKey, checkStrictly, childrenColumnName, preserveSelectedRowKeys, flattedData]); // Get all checkbox props const checkboxPropsMap = (0, _react.useMemo)(() => { const map = new Map(); flattedData.forEach((record, index) => { const key = getRowKey(record, index); const checkboxProps = (getCheckboxProps ? getCheckboxProps(record) : null) || {}; map.set(key, checkboxProps); true ? warning(!('checked' in checkboxProps || 'defaultChecked' in checkboxProps), 'usage', 'Do not set `checked` or `defaultChecked` in `getCheckboxProps`. Please use `selectedRowKeys` instead.') : 0; }); return map; }, [flattedData, getRowKey, getCheckboxProps]); const isCheckboxDisabled = (0, _react.useCallback)(r => { const rowKey = getRowKey(r); let checkboxProps; if (checkboxPropsMap.has(rowKey)) { checkboxProps = checkboxPropsMap.get(getRowKey(r)); } else { checkboxProps = getCheckboxProps ? getCheckboxProps(r) : undefined; } return !!(checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.disabled); }, [checkboxPropsMap, getRowKey]); const [derivedSelectedKeys, derivedHalfSelectedKeys] = (0, _react.useMemo)(() => { if (checkStrictly) { return [mergedSelectedKeys || [], []]; } const { checkedKeys, halfCheckedKeys } = (0, _conductUtil.conductCheck)(mergedSelectedKeys, true, keyEntities, isCheckboxDisabled); return [checkedKeys || [], halfCheckedKeys]; }, [mergedSelectedKeys, checkStrictly, keyEntities, isCheckboxDisabled]); const derivedSelectedKeySet = (0, _react.useMemo)(() => { const keys = selectionType === 'radio' ? derivedSelectedKeys.slice(0, 1) : derivedSelectedKeys; return new Set(keys); }, [derivedSelectedKeys, selectionType]); const derivedHalfSelectedKeySet = (0, _react.useMemo)(() => selectionType === 'radio' ? new Set() : new Set(derivedHalfSelectedKeys), [derivedHalfSelectedKeys, selectionType]); // Reset if rowSelection reset React.useEffect(() => { if (!rowSelection) { setMergedSelectedKeys(EMPTY_LIST); } }, [!!rowSelection]); const setSelectedKeys = (0, _react.useCallback)((keys, method) => { let availableKeys; let records; updatePreserveRecordsCache(keys); if (preserveSelectedRowKeys) { availableKeys = keys; records = keys.map(key => preserveRecordsRef.current.get(key)); } else { // Filter key which not exist in the `dataSource` availableKeys = []; records = []; keys.forEach(key => { const record = getRecordByKey(key); if (record !== undefined) { availableKeys.push(key); records.push(record); } }); } setMergedSelectedKeys(availableKeys); onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(availableKeys, records, { type: method }); }, [setMergedSelectedKeys, getRecordByKey, onSelectionChange, preserveSelectedRowKeys]); // ====================== Selections ====================== // Trigger single `onSelect` event const triggerSingleSelection = (0, _react.useCallback)((key, selected, keys, event) => { if (onSelect) { const rows = keys.map(k => getRecordByKey(k)); onSelect(getRecordByKey(key), selected, rows, event); } setSelectedKeys(keys, 'single'); }, [onSelect, getRecordByKey, setSelectedKeys]); const mergedSelections = (0, _react.useMemo)(() => { if (!selections || hideSelectAll) { return null; } const selectionList = selections === true ? [SELECTION_ALL, SELECTION_INVERT, SELECTION_NONE] : selections; return selectionList.map(selection => { if (selection === SELECTION_ALL) { return { key: 'all', text: tableLocale.selectionAll, onSelect() { setSelectedKeys(data.map((record, index) => getRowKey(record, index)).filter(key => { const checkProps = checkboxPropsMap.get(key); return !(checkProps === null || checkProps === void 0 ? void 0 : checkProps.disabled) || derivedSelectedKeySet.has(key); }), 'all'); } }; } if (selection === SELECTION_INVERT) { return { key: 'invert', text: tableLocale.selectInvert, onSelect() { const keySet = new Set(derivedSelectedKeySet); pageData.forEach((record, index) => { const key = getRowKey(record, index); const checkProps = checkboxPropsMap.get(key); if (!(checkProps === null || checkProps === void 0 ? void 0 : checkProps.disabled)) { if (keySet.has(key)) { keySet.delete(key); } else { keySet.add(key); } } }); const keys = Array.from(keySet); if (onSelectInvert) { warning.deprecated(false, 'onSelectInvert', 'onChange'); onSelectInvert(keys); } setSelectedKeys(keys, 'invert'); } }; } if (selection === SELECTION_NONE) { return { key: 'none', text: tableLocale.selectNone, onSelect() { onSelectNone === null || onSelectNone === void 0 ? void 0 : onSelectNone(); setSelectedKeys(Array.from(derivedSelectedKeySet).filter(key => { const checkProps = checkboxPropsMap.get(key); return checkProps === null || checkProps === void 0 ? void 0 : checkProps.disabled; }), 'none'); } }; } return selection; }).map(selection => Object.assign(Object.assign({}, selection), { onSelect: (...rest) => { var _a2; var _a; (_a = selection.onSelect) === null || _a === void 0 ? void 0 : (_a2 = _a).call.apply(_a2, [selection].concat(rest)); updatePrevSelectedIndex(null); } })); }, [selections, derivedSelectedKeySet, pageData, getRowKey, onSelectInvert, setSelectedKeys]); // ======================= Columns ======================== const transformColumns = (0, _react.useCallback)(columns => { var _a; // >>>>>>>>>>> Skip if not exists `rowSelection` if (!rowSelection) { true ? warning(!columns.includes(SELECTION_COLUMN), 'usage', '`rowSelection` is not config but `SELECTION_COLUMN` exists in the `columns`.') : 0; return columns.filter(col => col !== SELECTION_COLUMN); } // >>>>>>>>>>> Support selection let cloneColumns = (0, _toConsumableArray2.default)(columns); const keySet = new Set(derivedSelectedKeySet); // Record key only need check with enabled const recordKeys = flattedData.map(getRowKey).filter(key => !checkboxPropsMap.get(key).disabled); const checkedCurrentAll = recordKeys.every(key => keySet.has(key)); const checkedCurrentSome = recordKeys.some(key => keySet.has(key)); const onSelectAllChange = () => { const changeKeys = []; if (checkedCurrentAll) { recordKeys.forEach(key => { keySet.delete(key); changeKeys.push(key); }); } else { recordKeys.forEach(key => { if (!keySet.has(key)) { keySet.add(key); changeKeys.push(key); } }); } const keys = Array.from(keySet); onSelectAll === null || onSelectAll === void 0 ? void 0 : onSelectAll(!checkedCurrentAll, keys.map(k => getRecordByKey(k)), changeKeys.map(k => getRecordByKey(k))); setSelectedKeys(keys, 'all'); updatePrevSelectedIndex(null); }; // ===================== Render ===================== // Title Cell let title; let columnTitleCheckbox; if (selectionType !== 'radio') { let customizeSelections; if (mergedSelections) { const menu = { getPopupContainer, items: mergedSelections.map((selection, index) => { const { key, text, onSelect: onSelectionClick } = selection; return { key: key !== null && key !== void 0 ? key : index, onClick: () => { onSelectionClick === null || onSelectionClick === void 0 ? void 0 : onSelectionClick(recordKeys); }, label: text }; }) }; customizeSelections = /*#__PURE__*/React.createElement("div", { className: `${prefixCls}-selection-extra` }, /*#__PURE__*/React.createElement(_dropdown.default, { menu: menu, getPopupContainer: getPopupContainer }, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(_DownOutlined.default, null)))); } const allDisabledData = flattedData.map((record, index) => { const key = getRowKey(record, index); const checkboxProps = checkboxPropsMap.get(key) || {}; return Object.assign({ checked: keySet.has(key) }, checkboxProps); }).filter(({ disabled }) => disabled); const allDisabled = !!allDisabledData.length && allDisabledData.length === flattedData.length; const allDisabledAndChecked = allDisabled && allDisabledData.every(({ checked }) => checked); const allDisabledSomeChecked = allDisabled && allDisabledData.some(({ checked }) => checked); columnTitleCheckbox = /*#__PURE__*/React.createElement(_checkbox.default, { checked: !allDisabled ? !!flattedData.length && checkedCurrentAll : allDisabledAndChecked, indeterminate: !allDisabled ? !checkedCurrentAll && checkedCurrentSome : !allDisabledAndChecked && allDisabledSomeChecked, onChange: onSelectAllChange, disabled: flattedData.length === 0 || allDisabled, "aria-label": customizeSelections ? 'Custom selection' : 'Select all', skipGroup: true }); title = !hideSelectAll && (/*#__PURE__*/React.createElement("div", { className: `${prefixCls}-selection` }, columnTitleCheckbox, customizeSelections)); } // Body Cell let renderCell; if (selectionType === 'radio') { renderCell = (_, record, index) => { const key = getRowKey(record, index); const checked = keySet.has(key); const checkboxProps = checkboxPropsMap.get(key); return { node: (/*#__PURE__*/React.createElement(_radio.default, Object.assign({}, checkboxProps, { checked: checked, onClick: e => { var _a; e.stopPropagation(); (_a = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.onClick) === null || _a === void 0 ? void 0 : _a.call(checkboxProps, e); }, onChange: event => { var _a; if (!keySet.has(key)) { triggerSingleSelection(key, true, [key], event.nativeEvent); } (_a = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.onChange) === null || _a === void 0 ? void 0 : _a.call(checkboxProps, event); } }))), checked }; }; } else { renderCell = (_, record, index) => { var _a; const key = getRowKey(record, index); const checked = keySet.has(key); const indeterminate = derivedHalfSelectedKeySet.has(key); const checkboxProps = checkboxPropsMap.get(key); let mergedIndeterminate; if (expandType === 'nest') { mergedIndeterminate = indeterminate; true ? warning(typeof (checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.indeterminate) !== 'boolean', 'usage', 'set `indeterminate` using `rowSelection.getCheckboxProps` is not allowed with tree structured dataSource.') : 0; } else { mergedIndeterminate = (_a = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.indeterminate) !== null && _a !== void 0 ? _a : indeterminate; } // Record checked return { node: (/*#__PURE__*/React.createElement(_checkbox.default, Object.assign({}, checkboxProps, { indeterminate: mergedIndeterminate, checked: checked, skipGroup: true, onClick: e => { var _a; e.stopPropagation(); (_a = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.onClick) === null || _a === void 0 ? void 0 : _a.call(checkboxProps, e); }, onChange: event => { var _a; const { nativeEvent } = event; const { shiftKey } = nativeEvent; const currentSelectedIndex = recordKeys.findIndex(item => item === key); const isMultiple = derivedSelectedKeys.some(item => recordKeys.includes(item)); if (shiftKey && checkStrictly && isMultiple) { const changedKeys = multipleSelect(currentSelectedIndex, recordKeys, keySet); const keys = Array.from(keySet); onSelectMultiple === null || onSelectMultiple === void 0 ? void 0 : onSelectMultiple(!checked, keys.map(recordKey => getRecordByKey(recordKey)), changedKeys.map(recordKey => getRecordByKey(recordKey))); setSelectedKeys(keys, 'multiple'); } else { // Single record selected const originCheckedKeys = derivedSelectedKeys; if (checkStrictly) { const checkedKeys = checked ? (0, _util.arrDel)(originCheckedKeys, key) : (0, _util.arrAdd)(originCheckedKeys, key); triggerSingleSelection(key, !checked, checkedKeys, nativeEvent); } else { // Always fill first const result = (0, _conductUtil.conductCheck)([].concat((0, _toConsumableArray2.default)(originCheckedKeys), [key]), true, keyEntities, isCheckboxDisabled); const { checkedKeys, halfCheckedKeys } = result; let nextCheckedKeys = checkedKeys; // If remove, we do it again to correction if (checked) { const tempKeySet = new Set(checkedKeys); tempKeySet.delete(key); nextCheckedKeys = (0, _conductUtil.conductCheck)(Array.from(tempKeySet), { checked: false, halfCheckedKeys }, keyEntities, isCheckboxDisabled).checkedKeys; } triggerSingleSelection(key, !checked, nextCheckedKeys, nativeEvent); } } if (checked) { updatePrevSelectedIndex(null); } else { updatePrevSelectedIndex(currentSelectedIndex); } (_a = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.onChange) === null || _a === void 0 ? void 0 : _a.call(checkboxProps, event); } }))), checked }; }; } const renderSelectionCell = (_, record, index) => { const { node, checked } = renderCell(_, record, index); if (customizeRenderCell) { return customizeRenderCell(checked, record, index, node); } return node; }; // Insert selection column if not exist if (!cloneColumns.includes(SELECTION_COLUMN)) { // Always after expand icon if (cloneColumns.findIndex(col => { var _a; return ((_a = col[_rcTable.INTERNAL_COL_DEFINE]) === null || _a === void 0 ? void 0 : _a.columnType) === 'EXPAND_COLUMN'; }) === 0) { const [expandColumn, ...restColumns] = cloneColumns; cloneColumns = [expandColumn, SELECTION_COLUMN].concat((0, _toConsumableArray2.default)(restColumns)); } else { // Normal insert at first column cloneColumns = [SELECTION_COLUMN].concat((0, _toConsumableArray2.default)(cloneColumns)); } } // Deduplicate selection column const selectionColumnIndex = cloneColumns.indexOf(SELECTION_COLUMN); true ? warning(cloneColumns.filter(col => col === SELECTION_COLUMN).length <= 1, 'usage', 'Multiple `SELECTION_COLUMN` exist in `columns`.') : 0; cloneColumns = cloneColumns.filter((column, index) => column !== SELECTION_COLUMN || index === selectionColumnIndex); // Fixed column logic const prevCol = cloneColumns[selectionColumnIndex - 1]; const nextCol = cloneColumns[selectionColumnIndex + 1]; let mergedFixed = fixed; if (mergedFixed === undefined) { if ((nextCol === null || nextCol === void 0 ? void 0 : nextCol.fixed) !== undefined) { mergedFixed = nextCol.fixed; } else if ((prevCol === null || prevCol === void 0 ? void 0 : prevCol.fixed) !== undefined) { mergedFixed = prevCol.fixed; } } if (mergedFixed && prevCol && ((_a = prevCol[_rcTable.INTERNAL_COL_DEFINE]) === null || _a === void 0 ? void 0 : _a.columnType) === 'EXPAND_COLUMN' && prevCol.fixed === undefined) { prevCol.fixed = mergedFixed; } const columnCls = (0, _classnames.default)(`${prefixCls}-selection-col`, { [`${prefixCls}-selection-col-with-dropdown`]: selections && selectionType === 'checkbox' }); const renderColumnTitle = () => { if (!(rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.columnTitle)) { return title; } if (typeof rowSelection.columnTitle === 'function') { return rowSelection.columnTitle(columnTitleCheckbox); } return rowSelection.columnTitle; }; // Replace with real selection column const selectionColumn = { fixed: mergedFixed, width: selectionColWidth, className: `${prefixCls}-selection-column`, title: renderColumnTitle(), render: renderSelectionCell, onCell: rowSelection.onCell, align: rowSelection.align, [_rcTable.INTERNAL_COL_DEFINE]: { className: columnCls } }; return cloneColumns.map(col => col === SELECTION_COLUMN ? selectionColumn : col); }, [getRowKey, flattedData, rowSelection, derivedSelectedKeys, derivedSelectedKeySet, derivedHalfSelectedKeySet, selectionColWidth, mergedSelections, expandType, checkboxPropsMap, onSelectMultiple, triggerSingleSelection, isCheckboxDisabled]); return [transformColumns, derivedSelectedKeySet]; }; var _default = exports["default"] = useSelection; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useSorter.js": /*!***************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useSorter.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getSortData = exports["default"] = void 0; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/toConsumableArray.js")); var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _CaretDownOutlined = _interopRequireDefault(__webpack_require__(/*! @ant-design/icons/CaretDownOutlined */ "../../../node_modules/@ant-design/icons/CaretDownOutlined.js")); var _CaretUpOutlined = _interopRequireDefault(__webpack_require__(/*! @ant-design/icons/CaretUpOutlined */ "../../../node_modules/@ant-design/icons/CaretUpOutlined.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); var _KeyCode = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/KeyCode */ "../../../node_modules/rc-util/lib/KeyCode.js")); var _tooltip = _interopRequireDefault(__webpack_require__(/*! ../../tooltip */ "../../../node_modules/antd/lib/tooltip/index.js")); var _util = __webpack_require__(/*! ../util */ "../../../node_modules/antd/lib/table/util.js"); const ASCEND = 'ascend'; const DESCEND = 'descend'; const getMultiplePriority = column => { if (typeof column.sorter === 'object' && typeof column.sorter.multiple === 'number') { return column.sorter.multiple; } return false; }; const getSortFunction = sorter => { if (typeof sorter === 'function') { return sorter; } if (sorter && typeof sorter === 'object' && sorter.compare) { return sorter.compare; } return false; }; const nextSortDirection = (sortDirections, current) => { if (!current) { return sortDirections[0]; } return sortDirections[sortDirections.indexOf(current) + 1]; }; const collectSortStates = (columns, init, pos) => { let sortStates = []; const pushState = (column, columnPos) => { sortStates.push({ column, key: (0, _util.getColumnKey)(column, columnPos), multiplePriority: getMultiplePriority(column), sortOrder: column.sortOrder }); }; (columns || []).forEach((column, index) => { const columnPos = (0, _util.getColumnPos)(index, pos); if (column.children) { if ('sortOrder' in column) { // Controlled pushState(column, columnPos); } sortStates = [].concat((0, _toConsumableArray2.default)(sortStates), (0, _toConsumableArray2.default)(collectSortStates(column.children, init, columnPos))); } else if (column.sorter) { if ('sortOrder' in column) { // Controlled pushState(column, columnPos); } else if (init && column.defaultSortOrder) { // Default sorter sortStates.push({ column, key: (0, _util.getColumnKey)(column, columnPos), multiplePriority: getMultiplePriority(column), sortOrder: column.defaultSortOrder }); } } }); return sortStates; }; const injectSorter = (prefixCls, columns, sorterStates, triggerSorter, defaultSortDirections, tableLocale, tableShowSorterTooltip, pos) => { const finalColumns = (columns || []).map((column, index) => { const columnPos = (0, _util.getColumnPos)(index, pos); let newColumn = column; if (newColumn.sorter) { const sortDirections = newColumn.sortDirections || defaultSortDirections; const showSorterTooltip = newColumn.showSorterTooltip === undefined ? tableShowSorterTooltip : newColumn.showSorterTooltip; const columnKey = (0, _util.getColumnKey)(newColumn, columnPos); const sorterState = sorterStates.find(({ key }) => key === columnKey); const sortOrder = sorterState ? sorterState.sortOrder : null; const nextSortOrder = nextSortDirection(sortDirections, sortOrder); let sorter; if (column.sortIcon) { sorter = column.sortIcon({ sortOrder }); } else { const upNode = sortDirections.includes(ASCEND) && (/*#__PURE__*/React.createElement(_CaretUpOutlined.default, { className: (0, _classnames.default)(`${prefixCls}-column-sorter-up`, { active: sortOrder === ASCEND }) })); const downNode = sortDirections.includes(DESCEND) && (/*#__PURE__*/React.createElement(_CaretDownOutlined.default, { className: (0, _classnames.default)(`${prefixCls}-column-sorter-down`, { active: sortOrder === DESCEND }) })); sorter = /*#__PURE__*/React.createElement("span", { className: (0, _classnames.default)(`${prefixCls}-column-sorter`, { [`${prefixCls}-column-sorter-full`]: !!(upNode && downNode) }) }, /*#__PURE__*/React.createElement("span", { className: `${prefixCls}-column-sorter-inner`, "aria-hidden": "true" }, upNode, downNode)); } const { cancelSort, triggerAsc, triggerDesc } = tableLocale || {}; let sortTip = cancelSort; if (nextSortOrder === DESCEND) { sortTip = triggerDesc; } else if (nextSortOrder === ASCEND) { sortTip = triggerAsc; } const tooltipProps = typeof showSorterTooltip === 'object' ? Object.assign({ title: sortTip }, showSorterTooltip) : { title: sortTip }; newColumn = Object.assign(Object.assign({}, newColumn), { className: (0, _classnames.default)(newColumn.className, { [`${prefixCls}-column-sort`]: sortOrder }), title: renderProps => { const columnSortersClass = `${prefixCls}-column-sorters`; const renderColumnTitleWrapper = /*#__PURE__*/React.createElement("span", { className: `${prefixCls}-column-title` }, (0, _util.renderColumnTitle)(column.title, renderProps)); const renderSortTitle = /*#__PURE__*/React.createElement("div", { className: columnSortersClass }, renderColumnTitleWrapper, sorter); if (showSorterTooltip) { if (typeof showSorterTooltip !== 'boolean' && (showSorterTooltip === null || showSorterTooltip === void 0 ? void 0 : showSorterTooltip.target) === 'sorter-icon') { return /*#__PURE__*/React.createElement("div", { className: `${columnSortersClass} ${prefixCls}-column-sorters-tooltip-target-sorter` }, renderColumnTitleWrapper, /*#__PURE__*/React.createElement(_tooltip.default, Object.assign({}, tooltipProps), sorter)); } return /*#__PURE__*/React.createElement(_tooltip.default, Object.assign({}, tooltipProps), renderSortTitle); } return renderSortTitle; }, onHeaderCell: col => { var _a; const cell = ((_a = column.onHeaderCell) === null || _a === void 0 ? void 0 : _a.call(column, col)) || {}; const originOnClick = cell.onClick; const originOKeyDown = cell.onKeyDown; cell.onClick = event => { triggerSorter({ column, key: columnKey, sortOrder: nextSortOrder, multiplePriority: getMultiplePriority(column) }); originOnClick === null || originOnClick === void 0 ? void 0 : originOnClick(event); }; cell.onKeyDown = event => { if (event.keyCode === _KeyCode.default.ENTER) { triggerSorter({ column, key: columnKey, sortOrder: nextSortOrder, multiplePriority: getMultiplePriority(column) }); originOKeyDown === null || originOKeyDown === void 0 ? void 0 : originOKeyDown(event); } }; const renderTitle = (0, _util.safeColumnTitle)(column.title, {}); const displayTitle = renderTitle === null || renderTitle === void 0 ? void 0 : renderTitle.toString(); // Inform the screen-reader so it can tell the visually impaired user which column is sorted if (sortOrder) { cell['aria-sort'] = sortOrder === 'ascend' ? 'ascending' : 'descending'; } cell['aria-label'] = displayTitle || ''; cell.className = (0, _classnames.default)(cell.className, `${prefixCls}-column-has-sorters`); cell.tabIndex = 0; if (column.ellipsis) { cell.title = (renderTitle !== null && renderTitle !== void 0 ? renderTitle : '').toString(); } return cell; } }); } if ('children' in newColumn) { newColumn = Object.assign(Object.assign({}, newColumn), { children: injectSorter(prefixCls, newColumn.children, sorterStates, triggerSorter, defaultSortDirections, tableLocale, tableShowSorterTooltip, columnPos) }); } return newColumn; }); return finalColumns; }; const stateToInfo = sorterState => { const { column, sortOrder } = sorterState; return { column, order: sortOrder, field: column.dataIndex, columnKey: column.key }; }; const generateSorterInfo = sorterStates => { const activeSorters = sorterStates.filter(({ sortOrder }) => sortOrder).map(stateToInfo); // =========== Legacy compatible support =========== // https://github.com/ant-design/ant-design/pull/19226 if (activeSorters.length === 0 && sorterStates.length) { const lastIndex = sorterStates.length - 1; return Object.assign(Object.assign({}, stateToInfo(sorterStates[lastIndex])), { column: undefined, order: undefined, field: undefined, columnKey: undefined }); } if (activeSorters.length <= 1) { return activeSorters[0] || {}; } return activeSorters; }; const getSortData = (data, sortStates, childrenColumnName) => { const innerSorterStates = sortStates.slice().sort((a, b) => b.multiplePriority - a.multiplePriority); const cloneData = data.slice(); const runningSorters = innerSorterStates.filter(({ column: { sorter }, sortOrder }) => getSortFunction(sorter) && sortOrder); // Skip if no sorter needed if (!runningSorters.length) { return cloneData; } return cloneData.sort((record1, record2) => { for (let i = 0; i < runningSorters.length; i += 1) { const sorterState = runningSorters[i]; const { column: { sorter }, sortOrder } = sorterState; const compareFn = getSortFunction(sorter); if (compareFn && sortOrder) { const compareResult = compareFn(record1, record2, sortOrder); if (compareResult !== 0) { return sortOrder === ASCEND ? compareResult : -compareResult; } } } return 0; }).map(record => { const subRecords = record[childrenColumnName]; if (subRecords) { return Object.assign(Object.assign({}, record), { [childrenColumnName]: getSortData(subRecords, sortStates, childrenColumnName) }); } return record; }); }; exports.getSortData = getSortData; const useFilterSorter = props => { const { prefixCls, mergedColumns, sortDirections, tableLocale, showSorterTooltip, onSorterChange } = props; const [sortStates, setSortStates] = React.useState(() => collectSortStates(mergedColumns, true)); const getColumnKeys = (columns, pos) => { const newKeys = []; columns.forEach((item, index) => { const columnPos = (0, _util.getColumnPos)(index, pos); newKeys.push((0, _util.getColumnKey)(item, columnPos)); if (Array.isArray(item.children)) { const childKeys = getColumnKeys(item.children, columnPos); newKeys.push.apply(newKeys, (0, _toConsumableArray2.default)(childKeys)); } }); return newKeys; }; const mergedSorterStates = React.useMemo(() => { let validate = true; const collectedStates = collectSortStates(mergedColumns, false); // Return if not controlled if (!collectedStates.length) { const mergedColumnsKeys = getColumnKeys(mergedColumns); return sortStates.filter(({ key }) => mergedColumnsKeys.includes(key)); } const validateStates = []; function patchStates(state) { if (validate) { validateStates.push(state); } else { validateStates.push(Object.assign(Object.assign({}, state), { sortOrder: null })); } } let multipleMode = null; collectedStates.forEach(state => { if (multipleMode === null) { patchStates(state); if (state.sortOrder) { if (state.multiplePriority === false) { validate = false; } else { multipleMode = true; } } } else if (multipleMode && state.multiplePriority !== false) { patchStates(state); } else { validate = false; patchStates(state); } }); return validateStates; }, [mergedColumns, sortStates]); // Get render columns title required props const columnTitleSorterProps = React.useMemo(() => { var _a, _b; const sortColumns = mergedSorterStates.map(({ column, sortOrder }) => ({ column, order: sortOrder })); return { sortColumns, // Legacy sortColumn: (_a = sortColumns[0]) === null || _a === void 0 ? void 0 : _a.column, sortOrder: (_b = sortColumns[0]) === null || _b === void 0 ? void 0 : _b.order }; }, [mergedSorterStates]); const triggerSorter = sortState => { let newSorterStates; if (sortState.multiplePriority === false || !mergedSorterStates.length || mergedSorterStates[0].multiplePriority === false) { newSorterStates = [sortState]; } else { newSorterStates = [].concat((0, _toConsumableArray2.default)(mergedSorterStates.filter(({ key }) => key !== sortState.key)), [sortState]); } setSortStates(newSorterStates); onSorterChange(generateSorterInfo(newSorterStates), newSorterStates); }; const transformColumns = innerColumns => injectSorter(prefixCls, innerColumns, mergedSorterStates, triggerSorter, sortDirections, tableLocale, showSorterTooltip); const getSorters = () => generateSorterInfo(mergedSorterStates); return [transformColumns, mergedSorterStates, columnTitleSorterProps, getSorters]; }; var _default = exports["default"] = useFilterSorter; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useTitleColumns.js": /*!*********************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useTitleColumns.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _util = __webpack_require__(/*! ../util */ "../../../node_modules/antd/lib/table/util.js"); const fillTitle = (columns, columnTitleProps) => { const finalColumns = columns.map(column => { const cloneColumn = Object.assign({}, column); cloneColumn.title = (0, _util.renderColumnTitle)(column.title, columnTitleProps); if ('children' in cloneColumn) { cloneColumn.children = fillTitle(cloneColumn.children, columnTitleProps); } return cloneColumn; }); return finalColumns; }; const useTitleColumns = columnTitleProps => { const filledColumns = React.useCallback(columns => fillTitle(columns, columnTitleProps), [columnTitleProps]); return [filledColumns]; }; var _default = exports["default"] = useTitleColumns; /***/ }), /***/ "../../../node_modules/antd/lib/table/index.js": /*!*****************************************************!*\ !*** ../../../node_modules/antd/lib/table/index.js ***! \*****************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _Table = _interopRequireDefault(__webpack_require__(/*! ./Table */ "../../../node_modules/antd/lib/table/Table.js")); var _default = exports["default"] = _Table.default; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/bordered.js": /*!**************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/bordered.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const genBorderedStyle = token => { const { componentCls, lineWidth, lineType, tableBorderColor, tableHeaderBg, tablePaddingVertical, tablePaddingHorizontal, calc } = token; const tableBorder = `${(0, _cssinjs.unit)(lineWidth)} ${lineType} ${tableBorderColor}`; const getSizeBorderStyle = (size, paddingVertical, paddingHorizontal) => ({ [`&${componentCls}-${size}`]: { [`> ${componentCls}-container`]: { [`> ${componentCls}-content, > ${componentCls}-body`]: { [` > table > tbody > tr > th, > table > tbody > tr > td `]: { [`> ${componentCls}-expanded-row-fixed`]: { margin: `${(0, _cssinjs.unit)(calc(paddingVertical).mul(-1).equal())} ${(0, _cssinjs.unit)(calc(calc(paddingHorizontal).add(lineWidth)).mul(-1).equal())}` } } } } } }); return { [`${componentCls}-wrapper`]: { [`${componentCls}${componentCls}-bordered`]: Object.assign(Object.assign(Object.assign({ // ============================ Title ============================= [`> ${componentCls}-title`]: { border: tableBorder, borderBottom: 0 }, // ============================ Content ============================ [`> ${componentCls}-container`]: { borderInlineStart: tableBorder, borderTop: tableBorder, [` > ${componentCls}-content, > ${componentCls}-header, > ${componentCls}-body, > ${componentCls}-summary `]: { '> table': { // ============================= Cell ============================= [` > thead > tr > th, > thead > tr > td, > tbody > tr > th, > tbody > tr > td, > tfoot > tr > th, > tfoot > tr > td `]: { borderInlineEnd: tableBorder }, // ============================ Header ============================ '> thead': { '> tr:not(:last-child) > th': { borderBottom: tableBorder }, '> tr > th::before': { backgroundColor: 'transparent !important' } }, // Fixed right should provides additional border [` > thead > tr, > tbody > tr, > tfoot > tr `]: { [`> ${componentCls}-cell-fix-right-first::after`]: { borderInlineEnd: tableBorder } }, // ========================== Expandable ========================== [` > tbody > tr > th, > tbody > tr > td `]: { [`> ${componentCls}-expanded-row-fixed`]: { margin: `${(0, _cssinjs.unit)(calc(tablePaddingVertical).mul(-1).equal())} ${(0, _cssinjs.unit)(calc(calc(tablePaddingHorizontal).add(lineWidth)).mul(-1).equal())}`, '&::after': { position: 'absolute', top: 0, insetInlineEnd: lineWidth, bottom: 0, borderInlineEnd: tableBorder, content: '""' } } } } } }, // ============================ Scroll ============================ [`&${componentCls}-scroll-horizontal`]: { [`> ${componentCls}-container > ${componentCls}-body`]: { '> table > tbody': { [` > tr${componentCls}-expanded-row, > tr${componentCls}-placeholder `]: { '> th, > td': { borderInlineEnd: 0 } } } } } }, getSizeBorderStyle('middle', token.tablePaddingVerticalMiddle, token.tablePaddingHorizontalMiddle)), getSizeBorderStyle('small', token.tablePaddingVerticalSmall, token.tablePaddingHorizontalSmall)), { // ============================ Footer ============================ [`> ${componentCls}-footer`]: { border: tableBorder, borderTop: 0 } }), // ============================ Nested ============================ [`${componentCls}-cell`]: { [`${componentCls}-container:first-child`]: { // :first-child to avoid the case when bordered and title is set borderTop: 0 }, // https://github.com/ant-design/ant-design/issues/35577 '&-scrollbar:not([rowspan])': { boxShadow: `0 ${(0, _cssinjs.unit)(lineWidth)} 0 ${(0, _cssinjs.unit)(lineWidth)} ${tableHeaderBg}` } }, [`${componentCls}-bordered ${componentCls}-cell-scrollbar`]: { borderInlineEnd: tableBorder } } }; }; var _default = exports["default"] = genBorderedStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/ellipsis.js": /*!**************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/ellipsis.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _style = __webpack_require__(/*! ../../style */ "../../../node_modules/antd/lib/style/index.js"); const genEllipsisStyle = token => { const { componentCls } = token; return { [`${componentCls}-wrapper`]: { [`${componentCls}-cell-ellipsis`]: Object.assign(Object.assign({}, _style.textEllipsis), { wordBreak: 'keep-all', // Fixed first or last should special process [` &${componentCls}-cell-fix-left-last, &${componentCls}-cell-fix-right-first `]: { overflow: 'visible', [`${componentCls}-cell-content`]: { display: 'block', overflow: 'hidden', textOverflow: 'ellipsis' } }, [`${componentCls}-column-title`]: { overflow: 'hidden', textOverflow: 'ellipsis', wordBreak: 'keep-all' } }) } }; }; var _default = exports["default"] = genEllipsisStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/empty.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/empty.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; // ========================= Placeholder ========================== const genEmptyStyle = token => { const { componentCls } = token; return { [`${componentCls}-wrapper`]: { [`${componentCls}-tbody > tr${componentCls}-placeholder`]: { textAlign: 'center', color: token.colorTextDisabled, [` &:hover > th, &:hover > td, `]: { background: token.colorBgContainer } } } }; }; var _default = exports["default"] = genEmptyStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/expand.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/expand.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); var _style = __webpack_require__(/*! ../../style */ "../../../node_modules/antd/lib/style/index.js"); const genExpandStyle = token => { const { componentCls, antCls, motionDurationSlow, lineWidth, paddingXS, lineType, tableBorderColor, tableExpandIconBg, tableExpandColumnWidth, borderRadius, tablePaddingVertical, tablePaddingHorizontal, tableExpandedRowBg, paddingXXS, expandIconMarginTop, expandIconSize, expandIconHalfInner, expandIconScale, calc } = token; const tableBorder = `${(0, _cssinjs.unit)(lineWidth)} ${lineType} ${tableBorderColor}`; const expandIconLineOffset = calc(paddingXXS).sub(lineWidth).equal(); return { [`${componentCls}-wrapper`]: { [`${componentCls}-expand-icon-col`]: { width: tableExpandColumnWidth }, [`${componentCls}-row-expand-icon-cell`]: { textAlign: 'center', [`${componentCls}-row-expand-icon`]: { display: 'inline-flex', float: 'none', verticalAlign: 'sub' } }, [`${componentCls}-row-indent`]: { height: 1, float: 'left' }, [`${componentCls}-row-expand-icon`]: Object.assign(Object.assign({}, (0, _style.operationUnit)(token)), { position: 'relative', float: 'left', width: expandIconSize, height: expandIconSize, color: 'inherit', lineHeight: (0, _cssinjs.unit)(expandIconSize), background: tableExpandIconBg, border: tableBorder, borderRadius, transform: `scale(${expandIconScale})`, '&:focus, &:hover, &:active': { borderColor: 'currentcolor' }, '&::before, &::after': { position: 'absolute', background: 'currentcolor', transition: `transform ${motionDurationSlow} ease-out`, content: '""' }, '&::before': { top: expandIconHalfInner, insetInlineEnd: expandIconLineOffset, insetInlineStart: expandIconLineOffset, height: lineWidth }, '&::after': { top: expandIconLineOffset, bottom: expandIconLineOffset, insetInlineStart: expandIconHalfInner, width: lineWidth, transform: 'rotate(90deg)' }, // Motion effect '&-collapsed::before': { transform: 'rotate(-180deg)' }, '&-collapsed::after': { transform: 'rotate(0deg)' }, '&-spaced': { '&::before, &::after': { display: 'none', content: 'none' }, background: 'transparent', border: 0, visibility: 'hidden' } }), [`${componentCls}-row-indent + ${componentCls}-row-expand-icon`]: { marginTop: expandIconMarginTop, marginInlineEnd: paddingXS }, [`tr${componentCls}-expanded-row`]: { '&, &:hover': { '> th, > td': { background: tableExpandedRowBg } }, // https://github.com/ant-design/ant-design/issues/25573 [`${antCls}-descriptions-view`]: { display: 'flex', table: { flex: 'auto', width: '100%' } } }, // With fixed [`${componentCls}-expanded-row-fixed`]: { position: 'relative', margin: `${(0, _cssinjs.unit)(calc(tablePaddingVertical).mul(-1).equal())} ${(0, _cssinjs.unit)(calc(tablePaddingHorizontal).mul(-1).equal())}`, padding: `${(0, _cssinjs.unit)(tablePaddingVertical)} ${(0, _cssinjs.unit)(tablePaddingHorizontal)}` } } }; }; var _default = exports["default"] = genExpandStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/filter.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/filter.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); var _style = __webpack_require__(/*! ../../style */ "../../../node_modules/antd/lib/style/index.js"); const genFilterStyle = token => { const { componentCls, antCls, iconCls, tableFilterDropdownWidth, tableFilterDropdownSearchWidth, paddingXXS, paddingXS, colorText, lineWidth, lineType, tableBorderColor, headerIconColor, fontSizeSM, tablePaddingHorizontal, borderRadius, motionDurationSlow, colorIcon, colorPrimary, tableHeaderFilterActiveBg, colorTextDisabled, tableFilterDropdownBg, tableFilterDropdownHeight, controlItemBgHover, controlItemBgActive, boxShadowSecondary, filterDropdownMenuBg, calc } = token; const dropdownPrefixCls = `${antCls}-dropdown`; const tableFilterDropdownPrefixCls = `${componentCls}-filter-dropdown`; const treePrefixCls = `${antCls}-tree`; const tableBorder = `${(0, _cssinjs.unit)(lineWidth)} ${lineType} ${tableBorderColor}`; return [{ [`${componentCls}-wrapper`]: { [`${componentCls}-filter-column`]: { display: 'flex', justifyContent: 'space-between' }, [`${componentCls}-filter-trigger`]: { position: 'relative', display: 'flex', alignItems: 'center', marginBlock: calc(paddingXXS).mul(-1).equal(), marginInline: `${(0, _cssinjs.unit)(paddingXXS)} ${(0, _cssinjs.unit)(calc(tablePaddingHorizontal).div(2).mul(-1).equal())}`, padding: `0 ${(0, _cssinjs.unit)(paddingXXS)}`, color: headerIconColor, fontSize: fontSizeSM, borderRadius, cursor: 'pointer', transition: `all ${motionDurationSlow}`, '&:hover': { color: colorIcon, background: tableHeaderFilterActiveBg }, '&.active': { color: colorPrimary } } } }, { // Dropdown [`${antCls}-dropdown`]: { [tableFilterDropdownPrefixCls]: Object.assign(Object.assign({}, (0, _style.resetComponent)(token)), { minWidth: tableFilterDropdownWidth, backgroundColor: tableFilterDropdownBg, borderRadius, boxShadow: boxShadowSecondary, overflow: 'hidden', // Reset menu [`${dropdownPrefixCls}-menu`]: { // https://github.com/ant-design/ant-design/issues/4916 // https://github.com/ant-design/ant-design/issues/19542 maxHeight: tableFilterDropdownHeight, overflowX: 'hidden', border: 0, boxShadow: 'none', borderRadius: 'unset', backgroundColor: filterDropdownMenuBg, '&:empty::after': { display: 'block', padding: `${(0, _cssinjs.unit)(paddingXS)} 0`, color: colorTextDisabled, fontSize: fontSizeSM, textAlign: 'center', content: '"Not Found"' } }, [`${tableFilterDropdownPrefixCls}-tree`]: { paddingBlock: `${(0, _cssinjs.unit)(paddingXS)} 0`, paddingInline: paddingXS, [treePrefixCls]: { padding: 0 }, [`${treePrefixCls}-treenode ${treePrefixCls}-node-content-wrapper:hover`]: { backgroundColor: controlItemBgHover }, [`${treePrefixCls}-treenode-checkbox-checked ${treePrefixCls}-node-content-wrapper`]: { '&, &:hover': { backgroundColor: controlItemBgActive } } }, [`${tableFilterDropdownPrefixCls}-search`]: { padding: paddingXS, borderBottom: tableBorder, '&-input': { input: { minWidth: tableFilterDropdownSearchWidth }, [iconCls]: { color: colorTextDisabled } } }, [`${tableFilterDropdownPrefixCls}-checkall`]: { width: '100%', marginBottom: paddingXXS, marginInlineStart: paddingXXS }, // Operation [`${tableFilterDropdownPrefixCls}-btns`]: { display: 'flex', justifyContent: 'space-between', padding: `${(0, _cssinjs.unit)(calc(paddingXS).sub(lineWidth).equal())} ${(0, _cssinjs.unit)(paddingXS)}`, overflow: 'hidden', borderTop: tableBorder } }) } }, // Dropdown Menu & SubMenu { // submenu of table filter dropdown [`${antCls}-dropdown ${tableFilterDropdownPrefixCls}, ${tableFilterDropdownPrefixCls}-submenu`]: { // Checkbox [`${antCls}-checkbox-wrapper + span`]: { paddingInlineStart: paddingXS, color: colorText }, '> ul': { maxHeight: 'calc(100vh - 130px)', overflowX: 'hidden', overflowY: 'auto' } } }]; }; var _default = exports["default"] = genFilterStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/fixed.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/fixed.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; const genFixedStyle = token => { const { componentCls, lineWidth, colorSplit, motionDurationSlow, zIndexTableFixed, tableBg, zIndexTableSticky, calc } = token; const shadowColor = colorSplit; // Follow style is magic of shadow which should not follow token: return { [`${componentCls}-wrapper`]: { [` ${componentCls}-cell-fix-left, ${componentCls}-cell-fix-right `]: { position: 'sticky !important', zIndex: zIndexTableFixed, background: tableBg }, [` ${componentCls}-cell-fix-left-first::after, ${componentCls}-cell-fix-left-last::after `]: { position: 'absolute', top: 0, right: { _skip_check_: true, value: 0 }, bottom: calc(lineWidth).mul(-1).equal(), width: 30, transform: 'translateX(100%)', transition: `box-shadow ${motionDurationSlow}`, content: '""', pointerEvents: 'none' }, [`${componentCls}-cell-fix-left-all::after`]: { display: 'none' }, [` ${componentCls}-cell-fix-right-first::after, ${componentCls}-cell-fix-right-last::after `]: { position: 'absolute', top: 0, bottom: calc(lineWidth).mul(-1).equal(), left: { _skip_check_: true, value: 0 }, width: 30, transform: 'translateX(-100%)', transition: `box-shadow ${motionDurationSlow}`, content: '""', pointerEvents: 'none' }, [`${componentCls}-container`]: { position: 'relative', '&::before, &::after': { position: 'absolute', top: 0, bottom: 0, zIndex: calc(zIndexTableSticky).add(1).equal({ unit: false }), width: 30, transition: `box-shadow ${motionDurationSlow}`, content: '""', pointerEvents: 'none' }, '&::before': { insetInlineStart: 0 }, '&::after': { insetInlineEnd: 0 } }, [`${componentCls}-ping-left`]: { [`&:not(${componentCls}-has-fix-left) ${componentCls}-container::before`]: { boxShadow: `inset 10px 0 8px -8px ${shadowColor}` }, [` ${componentCls}-cell-fix-left-first::after, ${componentCls}-cell-fix-left-last::after `]: { boxShadow: `inset 10px 0 8px -8px ${shadowColor}` }, [`${componentCls}-cell-fix-left-last::before`]: { backgroundColor: 'transparent !important' } }, [`${componentCls}-ping-right`]: { [`&:not(${componentCls}-has-fix-right) ${componentCls}-container::after`]: { boxShadow: `inset -10px 0 8px -8px ${shadowColor}` }, [` ${componentCls}-cell-fix-right-first::after, ${componentCls}-cell-fix-right-last::after `]: { boxShadow: `inset -10px 0 8px -8px ${shadowColor}` } }, // Gapped fixed Columns do not show the shadow [`${componentCls}-fixed-column-gapped`]: { [` ${componentCls}-cell-fix-left-first::after, ${componentCls}-cell-fix-left-last::after, ${componentCls}-cell-fix-right-first::after, ${componentCls}-cell-fix-right-last::after `]: { boxShadow: 'none' } } } }; }; var _default = exports["default"] = genFixedStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/index.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/index.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.prepareComponentToken = exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); var _fastColor = __webpack_require__(/*! @ant-design/fast-color */ "../../../node_modules/@ant-design/fast-color/es/index.js"); var _style = __webpack_require__(/*! ../../style */ "../../../node_modules/antd/lib/style/index.js"); var _internal = __webpack_require__(/*! ../../theme/internal */ "../../../node_modules/antd/lib/theme/internal.js"); var _bordered = _interopRequireDefault(__webpack_require__(/*! ./bordered */ "../../../node_modules/antd/lib/table/style/bordered.js")); var _ellipsis = _interopRequireDefault(__webpack_require__(/*! ./ellipsis */ "../../../node_modules/antd/lib/table/style/ellipsis.js")); var _empty = _interopRequireDefault(__webpack_require__(/*! ./empty */ "../../../node_modules/antd/lib/table/style/empty.js")); var _expand = _interopRequireDefault(__webpack_require__(/*! ./expand */ "../../../node_modules/antd/lib/table/style/expand.js")); var _filter = _interopRequireDefault(__webpack_require__(/*! ./filter */ "../../../node_modules/antd/lib/table/style/filter.js")); var _fixed = _interopRequireDefault(__webpack_require__(/*! ./fixed */ "../../../node_modules/antd/lib/table/style/fixed.js")); var _pagination = _interopRequireDefault(__webpack_require__(/*! ./pagination */ "../../../node_modules/antd/lib/table/style/pagination.js")); var _radius = _interopRequireDefault(__webpack_require__(/*! ./radius */ "../../../node_modules/antd/lib/table/style/radius.js")); var _rtl = _interopRequireDefault(__webpack_require__(/*! ./rtl */ "../../../node_modules/antd/lib/table/style/rtl.js")); var _selection = _interopRequireDefault(__webpack_require__(/*! ./selection */ "../../../node_modules/antd/lib/table/style/selection.js")); var _size = _interopRequireDefault(__webpack_require__(/*! ./size */ "../../../node_modules/antd/lib/table/style/size.js")); var _sorter = _interopRequireDefault(__webpack_require__(/*! ./sorter */ "../../../node_modules/antd/lib/table/style/sorter.js")); var _sticky = _interopRequireDefault(__webpack_require__(/*! ./sticky */ "../../../node_modules/antd/lib/table/style/sticky.js")); var _summary = _interopRequireDefault(__webpack_require__(/*! ./summary */ "../../../node_modules/antd/lib/table/style/summary.js")); var _virtual = _interopRequireDefault(__webpack_require__(/*! ./virtual */ "../../../node_modules/antd/lib/table/style/virtual.js")); const genTableStyle = token => { const { componentCls, fontWeightStrong, tablePaddingVertical, tablePaddingHorizontal, tableExpandColumnWidth, lineWidth, lineType, tableBorderColor, tableFontSize, tableBg, tableRadius, tableHeaderTextColor, motionDurationMid, tableHeaderBg, tableHeaderCellSplitColor, tableFooterTextColor, tableFooterBg, calc } = token; const tableBorder = `${(0, _cssinjs.unit)(lineWidth)} ${lineType} ${tableBorderColor}`; return { [`${componentCls}-wrapper`]: Object.assign(Object.assign({ clear: 'both', maxWidth: '100%' }, (0, _style.clearFix)()), { [componentCls]: Object.assign(Object.assign({}, (0, _style.resetComponent)(token)), { fontSize: tableFontSize, background: tableBg, borderRadius: `${(0, _cssinjs.unit)(tableRadius)} ${(0, _cssinjs.unit)(tableRadius)} 0 0`, // https://github.com/ant-design/ant-design/issues/47486 scrollbarColor: `${token.tableScrollThumbBg} ${token.tableScrollBg}` }), // https://github.com/ant-design/ant-design/issues/17611 table: { width: '100%', textAlign: 'start', borderRadius: `${(0, _cssinjs.unit)(tableRadius)} ${(0, _cssinjs.unit)(tableRadius)} 0 0`, borderCollapse: 'separate', borderSpacing: 0 }, // ============================= Cell ============================== [` ${componentCls}-cell, ${componentCls}-thead > tr > th, ${componentCls}-tbody > tr > th, ${componentCls}-tbody > tr > td, tfoot > tr > th, tfoot > tr > td `]: { position: 'relative', padding: `${(0, _cssinjs.unit)(tablePaddingVertical)} ${(0, _cssinjs.unit)(tablePaddingHorizontal)}`, overflowWrap: 'break-word' }, // ============================ Title ============================= [`${componentCls}-title`]: { padding: `${(0, _cssinjs.unit)(tablePaddingVertical)} ${(0, _cssinjs.unit)(tablePaddingHorizontal)}` }, // ============================ Header ============================ [`${componentCls}-thead`]: { [` > tr > th, > tr > td `]: { position: 'relative', color: tableHeaderTextColor, fontWeight: fontWeightStrong, textAlign: 'start', background: tableHeaderBg, borderBottom: tableBorder, transition: `background ${motionDurationMid} ease`, "&[colspan]:not([colspan='1'])": { textAlign: 'center' }, [`&:not(:last-child):not(${componentCls}-selection-column):not(${componentCls}-row-expand-icon-cell):not([colspan])::before`]: { position: 'absolute', top: '50%', insetInlineEnd: 0, width: 1, height: '1.6em', backgroundColor: tableHeaderCellSplitColor, transform: 'translateY(-50%)', transition: `background-color ${motionDurationMid}`, content: '""' } }, '> tr:not(:last-child) > th[colspan]': { borderBottom: 0 } }, // ============================ Body ============================ [`${componentCls}-tbody`]: { '> tr': { '> th, > td': { transition: `background ${motionDurationMid}, border-color ${motionDurationMid}`, borderBottom: tableBorder, // ========================= Nest Table =========================== [` > ${componentCls}-wrapper:only-child, > ${componentCls}-expanded-row-fixed > ${componentCls}-wrapper:only-child `]: { [componentCls]: { marginBlock: (0, _cssinjs.unit)(calc(tablePaddingVertical).mul(-1).equal()), marginInline: `${(0, _cssinjs.unit)(calc(tableExpandColumnWidth).sub(tablePaddingHorizontal).equal())} ${(0, _cssinjs.unit)(calc(tablePaddingHorizontal).mul(-1).equal())}`, [`${componentCls}-tbody > tr:last-child > td`]: { borderBottomWidth: 0, '&:first-child, &:last-child': { borderRadius: 0 } } } } }, '> th': { position: 'relative', color: tableHeaderTextColor, fontWeight: fontWeightStrong, textAlign: 'start', background: tableHeaderBg, borderBottom: tableBorder, transition: `background ${motionDurationMid} ease` } } }, // ============================ Footer ============================ [`${componentCls}-footer`]: { padding: `${(0, _cssinjs.unit)(tablePaddingVertical)} ${(0, _cssinjs.unit)(tablePaddingHorizontal)}`, color: tableFooterTextColor, background: tableFooterBg } }) }; }; const prepareComponentToken = token => { const { colorFillAlter, colorBgContainer, colorTextHeading, colorFillSecondary, colorFillContent, controlItemBgActive, controlItemBgActiveHover, padding, paddingSM, paddingXS, colorBorderSecondary, borderRadiusLG, controlHeight, colorTextPlaceholder, fontSize, fontSizeSM, lineHeight, lineWidth, colorIcon, colorIconHover, opacityLoading, controlInteractiveSize } = token; const colorFillSecondarySolid = new _fastColor.FastColor(colorFillSecondary).onBackground(colorBgContainer).toHexString(); const colorFillContentSolid = new _fastColor.FastColor(colorFillContent).onBackground(colorBgContainer).toHexString(); const colorFillAlterSolid = new _fastColor.FastColor(colorFillAlter).onBackground(colorBgContainer).toHexString(); const baseColorAction = new _fastColor.FastColor(colorIcon); const baseColorActionHover = new _fastColor.FastColor(colorIconHover); const expandIconHalfInner = controlInteractiveSize / 2 - lineWidth; const expandIconSize = expandIconHalfInner * 2 + lineWidth * 3; return { headerBg: colorFillAlterSolid, headerColor: colorTextHeading, headerSortActiveBg: colorFillSecondarySolid, headerSortHoverBg: colorFillContentSolid, bodySortBg: colorFillAlterSolid, rowHoverBg: colorFillAlterSolid, rowSelectedBg: controlItemBgActive, rowSelectedHoverBg: controlItemBgActiveHover, rowExpandedBg: colorFillAlter, cellPaddingBlock: padding, cellPaddingInline: padding, cellPaddingBlockMD: paddingSM, cellPaddingInlineMD: paddingXS, cellPaddingBlockSM: paddingXS, cellPaddingInlineSM: paddingXS, borderColor: colorBorderSecondary, headerBorderRadius: borderRadiusLG, footerBg: colorFillAlterSolid, footerColor: colorTextHeading, cellFontSize: fontSize, cellFontSizeMD: fontSize, cellFontSizeSM: fontSize, headerSplitColor: colorBorderSecondary, fixedHeaderSortActiveBg: colorFillSecondarySolid, headerFilterHoverBg: colorFillContent, filterDropdownMenuBg: colorBgContainer, filterDropdownBg: colorBgContainer, expandIconBg: colorBgContainer, selectionColumnWidth: controlHeight, stickyScrollBarBg: colorTextPlaceholder, stickyScrollBarBorderRadius: 100, expandIconMarginTop: (fontSize * lineHeight - lineWidth * 3) / 2 - Math.ceil((fontSizeSM * 1.4 - lineWidth * 3) / 2), headerIconColor: baseColorAction.clone().setA(baseColorAction.a * opacityLoading).toRgbString(), headerIconHoverColor: baseColorActionHover.clone().setA(baseColorActionHover.a * opacityLoading).toRgbString(), expandIconHalfInner, expandIconSize, expandIconScale: controlInteractiveSize / expandIconSize }; }; exports.prepareComponentToken = prepareComponentToken; const zIndexTableFixed = 2; // ============================== Export ============================== var _default = exports["default"] = (0, _internal.genStyleHooks)('Table', token => { const { colorTextHeading, colorSplit, colorBgContainer, controlInteractiveSize: checkboxSize, headerBg, headerColor, headerSortActiveBg, headerSortHoverBg, bodySortBg, rowHoverBg, rowSelectedBg, rowSelectedHoverBg, rowExpandedBg, cellPaddingBlock, cellPaddingInline, cellPaddingBlockMD, cellPaddingInlineMD, cellPaddingBlockSM, cellPaddingInlineSM, borderColor, footerBg, footerColor, headerBorderRadius, cellFontSize, cellFontSizeMD, cellFontSizeSM, headerSplitColor, fixedHeaderSortActiveBg, headerFilterHoverBg, filterDropdownBg, expandIconBg, selectionColumnWidth, stickyScrollBarBg, calc } = token; const tableToken = (0, _internal.mergeToken)(token, { tableFontSize: cellFontSize, tableBg: colorBgContainer, tableRadius: headerBorderRadius, tablePaddingVertical: cellPaddingBlock, tablePaddingHorizontal: cellPaddingInline, tablePaddingVerticalMiddle: cellPaddingBlockMD, tablePaddingHorizontalMiddle: cellPaddingInlineMD, tablePaddingVerticalSmall: cellPaddingBlockSM, tablePaddingHorizontalSmall: cellPaddingInlineSM, tableBorderColor: borderColor, tableHeaderTextColor: headerColor, tableHeaderBg: headerBg, tableFooterTextColor: footerColor, tableFooterBg: footerBg, tableHeaderCellSplitColor: headerSplitColor, tableHeaderSortBg: headerSortActiveBg, tableHeaderSortHoverBg: headerSortHoverBg, tableBodySortBg: bodySortBg, tableFixedHeaderSortActiveBg: fixedHeaderSortActiveBg, tableHeaderFilterActiveBg: headerFilterHoverBg, tableFilterDropdownBg: filterDropdownBg, tableRowHoverBg: rowHoverBg, tableSelectedRowBg: rowSelectedBg, tableSelectedRowHoverBg: rowSelectedHoverBg, zIndexTableFixed, zIndexTableSticky: calc(zIndexTableFixed).add(1).equal({ unit: false }), tableFontSizeMiddle: cellFontSizeMD, tableFontSizeSmall: cellFontSizeSM, tableSelectionColumnWidth: selectionColumnWidth, tableExpandIconBg: expandIconBg, tableExpandColumnWidth: calc(checkboxSize).add(calc(token.padding).mul(2)).equal(), tableExpandedRowBg: rowExpandedBg, // Dropdown tableFilterDropdownWidth: 120, tableFilterDropdownHeight: 264, tableFilterDropdownSearchWidth: 140, // Virtual Scroll Bar tableScrollThumbSize: 8, // Mac scroll bar size tableScrollThumbBg: stickyScrollBarBg, tableScrollThumbBgHover: colorTextHeading, tableScrollBg: colorSplit }); return [genTableStyle(tableToken), (0, _pagination.default)(tableToken), (0, _summary.default)(tableToken), (0, _sorter.default)(tableToken), (0, _filter.default)(tableToken), (0, _bordered.default)(tableToken), (0, _radius.default)(tableToken), (0, _expand.default)(tableToken), (0, _summary.default)(tableToken), (0, _empty.default)(tableToken), (0, _selection.default)(tableToken), (0, _fixed.default)(tableToken), (0, _sticky.default)(tableToken), (0, _ellipsis.default)(tableToken), (0, _size.default)(tableToken), (0, _rtl.default)(tableToken), (0, _virtual.default)(tableToken)]; }, prepareComponentToken, { unitless: { expandIconScale: true } }); /***/ }), /***/ "../../../node_modules/antd/lib/table/style/pagination.js": /*!****************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/pagination.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const genPaginationStyle = token => { const { componentCls, antCls, margin } = token; return { [`${componentCls}-wrapper`]: { // ========================== Pagination ========================== [`${componentCls}-pagination${antCls}-pagination`]: { margin: `${(0, _cssinjs.unit)(margin)} 0` }, [`${componentCls}-pagination`]: { display: 'flex', flexWrap: 'wrap', rowGap: token.paddingXS, '> *': { flex: 'none' }, '&-left': { justifyContent: 'flex-start' }, '&-center': { justifyContent: 'center' }, '&-right': { justifyContent: 'flex-end' } } } }; }; var _default = exports["default"] = genPaginationStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/radius.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/radius.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const genRadiusStyle = token => { const { componentCls, tableRadius } = token; return { [`${componentCls}-wrapper`]: { [componentCls]: { // https://github.com/ant-design/ant-design/issues/39115#issuecomment-1362314574 [`${componentCls}-title, ${componentCls}-header`]: { borderRadius: `${(0, _cssinjs.unit)(tableRadius)} ${(0, _cssinjs.unit)(tableRadius)} 0 0` }, [`${componentCls}-title + ${componentCls}-container`]: { borderStartStartRadius: 0, borderStartEndRadius: 0, // https://github.com/ant-design/ant-design/issues/41975 [`${componentCls}-header, table`]: { borderRadius: 0 }, 'table > thead > tr:first-child': { 'th:first-child, th:last-child, td:first-child, td:last-child': { borderRadius: 0 } } }, '&-container': { borderStartStartRadius: tableRadius, borderStartEndRadius: tableRadius, 'table > thead > tr:first-child': { '> *:first-child': { borderStartStartRadius: tableRadius }, '> *:last-child': { borderStartEndRadius: tableRadius } } }, '&-footer': { borderRadius: `0 0 ${(0, _cssinjs.unit)(tableRadius)} ${(0, _cssinjs.unit)(tableRadius)}` } } } }; }; var _default = exports["default"] = genRadiusStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/rtl.js": /*!*********************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/rtl.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; const genStyle = token => { const { componentCls } = token; return { [`${componentCls}-wrapper-rtl`]: { direction: 'rtl', table: { direction: 'rtl' }, [`${componentCls}-pagination-left`]: { justifyContent: 'flex-end' }, [`${componentCls}-pagination-right`]: { justifyContent: 'flex-start' }, [`${componentCls}-row-expand-icon`]: { float: 'right', '&::after': { transform: 'rotate(-90deg)' }, '&-collapsed::before': { transform: 'rotate(180deg)' }, '&-collapsed::after': { transform: 'rotate(0deg)' } }, [`${componentCls}-container`]: { '&::before': { insetInlineStart: 'unset', insetInlineEnd: 0 }, '&::after': { insetInlineStart: 0, insetInlineEnd: 'unset' }, [`${componentCls}-row-indent`]: { float: 'right' } } } }; }; var _default = exports["default"] = genStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/selection.js": /*!***************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/selection.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const genSelectionStyle = token => { const { componentCls, antCls, iconCls, fontSizeIcon, padding, paddingXS, headerIconColor, headerIconHoverColor, tableSelectionColumnWidth, tableSelectedRowBg, tableSelectedRowHoverBg, tableRowHoverBg, tablePaddingHorizontal, calc } = token; return { [`${componentCls}-wrapper`]: { // ========================== Selections ========================== [`${componentCls}-selection-col`]: { width: tableSelectionColumnWidth, [`&${componentCls}-selection-col-with-dropdown`]: { width: calc(tableSelectionColumnWidth).add(fontSizeIcon).add(calc(padding).div(4)).equal() } }, [`${componentCls}-bordered ${componentCls}-selection-col`]: { width: calc(tableSelectionColumnWidth).add(calc(paddingXS).mul(2)).equal(), [`&${componentCls}-selection-col-with-dropdown`]: { width: calc(tableSelectionColumnWidth).add(fontSizeIcon).add(calc(padding).div(4)).add(calc(paddingXS).mul(2)).equal() } }, [` table tr th${componentCls}-selection-column, table tr td${componentCls}-selection-column, ${componentCls}-selection-column `]: { paddingInlineEnd: token.paddingXS, paddingInlineStart: token.paddingXS, textAlign: 'center', [`${antCls}-radio-wrapper`]: { marginInlineEnd: 0 } }, [`table tr th${componentCls}-selection-column${componentCls}-cell-fix-left`]: { zIndex: calc(token.zIndexTableFixed).add(1).equal({ unit: false }) }, [`table tr th${componentCls}-selection-column::after`]: { backgroundColor: 'transparent !important' }, [`${componentCls}-selection`]: { position: 'relative', display: 'inline-flex', flexDirection: 'column' }, [`${componentCls}-selection-extra`]: { position: 'absolute', top: 0, zIndex: 1, cursor: 'pointer', transition: `all ${token.motionDurationSlow}`, marginInlineStart: '100%', paddingInlineStart: (0, _cssinjs.unit)(calc(tablePaddingHorizontal).div(4).equal()), [iconCls]: { color: headerIconColor, fontSize: fontSizeIcon, verticalAlign: 'baseline', '&:hover': { color: headerIconHoverColor } } }, // ============================= Rows ============================= [`${componentCls}-tbody`]: { [`${componentCls}-row`]: { [`&${componentCls}-row-selected`]: { [`> ${componentCls}-cell`]: { background: tableSelectedRowBg, '&-row-hover': { background: tableSelectedRowHoverBg } } }, [`> ${componentCls}-cell-row-hover`]: { background: tableRowHoverBg } } } } }; }; var _default = exports["default"] = genSelectionStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/size.js": /*!**********************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/size.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const genSizeStyle = token => { const { componentCls, tableExpandColumnWidth, calc } = token; const getSizeStyle = (size, paddingVertical, paddingHorizontal, fontSize) => ({ [`${componentCls}${componentCls}-${size}`]: { fontSize, [` ${componentCls}-title, ${componentCls}-footer, ${componentCls}-cell, ${componentCls}-thead > tr > th, ${componentCls}-tbody > tr > th, ${componentCls}-tbody > tr > td, tfoot > tr > th, tfoot > tr > td `]: { padding: `${(0, _cssinjs.unit)(paddingVertical)} ${(0, _cssinjs.unit)(paddingHorizontal)}` }, [`${componentCls}-filter-trigger`]: { marginInlineEnd: (0, _cssinjs.unit)(calc(paddingHorizontal).div(2).mul(-1).equal()) }, [`${componentCls}-expanded-row-fixed`]: { margin: `${(0, _cssinjs.unit)(calc(paddingVertical).mul(-1).equal())} ${(0, _cssinjs.unit)(calc(paddingHorizontal).mul(-1).equal())}` }, [`${componentCls}-tbody`]: { // ========================= Nest Table =========================== [`${componentCls}-wrapper:only-child ${componentCls}`]: { marginBlock: (0, _cssinjs.unit)(calc(paddingVertical).mul(-1).equal()), marginInline: `${(0, _cssinjs.unit)(calc(tableExpandColumnWidth).sub(paddingHorizontal).equal())} ${(0, _cssinjs.unit)(calc(paddingHorizontal).mul(-1).equal())}` } }, // https://github.com/ant-design/ant-design/issues/35167 [`${componentCls}-selection-extra`]: { paddingInlineStart: (0, _cssinjs.unit)(calc(paddingHorizontal).div(4).equal()) } } }); return { [`${componentCls}-wrapper`]: Object.assign(Object.assign({}, getSizeStyle('middle', token.tablePaddingVerticalMiddle, token.tablePaddingHorizontalMiddle, token.tableFontSizeMiddle)), getSizeStyle('small', token.tablePaddingVerticalSmall, token.tablePaddingHorizontalSmall, token.tableFontSizeSmall)) }; }; var _default = exports["default"] = genSizeStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/sorter.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/sorter.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; const genSorterStyle = token => { const { componentCls, marginXXS, fontSizeIcon, headerIconColor, headerIconHoverColor } = token; return { [`${componentCls}-wrapper`]: { [`${componentCls}-thead th${componentCls}-column-has-sorters`]: { outline: 'none', cursor: 'pointer', // why left 0s? Avoid column header move with transition when left is changed // https://github.com/ant-design/ant-design/issues/50588 transition: `all ${token.motionDurationSlow}, left 0s`, '&:hover': { background: token.tableHeaderSortHoverBg, '&::before': { backgroundColor: 'transparent !important' } }, '&:focus-visible': { color: token.colorPrimary }, // https://github.com/ant-design/ant-design/issues/30969 [` &${componentCls}-cell-fix-left:hover, &${componentCls}-cell-fix-right:hover `]: { background: token.tableFixedHeaderSortActiveBg } }, [`${componentCls}-thead th${componentCls}-column-sort`]: { background: token.tableHeaderSortBg, '&::before': { backgroundColor: 'transparent !important' } }, [`td${componentCls}-column-sort`]: { background: token.tableBodySortBg }, [`${componentCls}-column-title`]: { position: 'relative', zIndex: 1, flex: 1, minWidth: 0 }, [`${componentCls}-column-sorters`]: { display: 'flex', flex: 'auto', alignItems: 'center', justifyContent: 'space-between', '&::after': { position: 'absolute', inset: 0, width: '100%', height: '100%', content: '""' } }, [`${componentCls}-column-sorters-tooltip-target-sorter`]: { '&::after': { content: 'none' } }, [`${componentCls}-column-sorter`]: { marginInlineStart: marginXXS, color: headerIconColor, fontSize: 0, transition: `color ${token.motionDurationSlow}`, '&-inner': { display: 'inline-flex', flexDirection: 'column', alignItems: 'center' }, '&-up, &-down': { fontSize: fontSizeIcon, '&.active': { color: token.colorPrimary } }, [`${componentCls}-column-sorter-up + ${componentCls}-column-sorter-down`]: { marginTop: '-0.3em' } }, [`${componentCls}-column-sorters:hover ${componentCls}-column-sorter`]: { color: headerIconHoverColor } } }; }; var _default = exports["default"] = genSorterStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/sticky.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/sticky.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const genStickyStyle = token => { const { componentCls, opacityLoading, tableScrollThumbBg, tableScrollThumbBgHover, tableScrollThumbSize, tableScrollBg, zIndexTableSticky, stickyScrollBarBorderRadius, lineWidth, lineType, tableBorderColor } = token; const tableBorder = `${(0, _cssinjs.unit)(lineWidth)} ${lineType} ${tableBorderColor}`; return { [`${componentCls}-wrapper`]: { [`${componentCls}-sticky`]: { '&-holder': { position: 'sticky', zIndex: zIndexTableSticky, background: token.colorBgContainer }, '&-scroll': { position: 'sticky', bottom: 0, height: `${(0, _cssinjs.unit)(tableScrollThumbSize)} !important`, zIndex: zIndexTableSticky, display: 'flex', alignItems: 'center', background: tableScrollBg, borderTop: tableBorder, opacity: opacityLoading, '&:hover': { transformOrigin: 'center bottom' }, // fake scrollbar style of sticky '&-bar': { height: tableScrollThumbSize, backgroundColor: tableScrollThumbBg, borderRadius: stickyScrollBarBorderRadius, transition: `all ${token.motionDurationSlow}, transform 0s`, position: 'absolute', bottom: 0, '&:hover, &-active': { backgroundColor: tableScrollThumbBgHover } } } } } }; }; var _default = exports["default"] = genStickyStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/summary.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/summary.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const genSummaryStyle = token => { const { componentCls, lineWidth, tableBorderColor, calc } = token; const tableBorder = `${(0, _cssinjs.unit)(lineWidth)} ${token.lineType} ${tableBorderColor}`; return { [`${componentCls}-wrapper`]: { [`${componentCls}-summary`]: { position: 'relative', zIndex: token.zIndexTableFixed, background: token.tableBg, '> tr': { '> th, > td': { borderBottom: tableBorder } } }, [`div${componentCls}-summary`]: { boxShadow: `0 ${(0, _cssinjs.unit)(calc(lineWidth).mul(-1).equal())} 0 ${tableBorderColor}` } } }; }; var _default = exports["default"] = genSummaryStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/virtual.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/virtual.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const genVirtualStyle = token => { const { componentCls, motionDurationMid, lineWidth, lineType, tableBorderColor, calc } = token; const tableBorder = `${(0, _cssinjs.unit)(lineWidth)} ${lineType} ${tableBorderColor}`; const rowCellCls = `${componentCls}-expanded-row-cell`; return { [`${componentCls}-wrapper`]: { // ========================== Row ========================== [`${componentCls}-tbody-virtual`]: { [`${componentCls}-tbody-virtual-holder-inner`]: { [` & > ${componentCls}-row, & > div:not(${componentCls}-row) > ${componentCls}-row `]: { display: 'flex', boxSizing: 'border-box', width: '100%' } }, [`${componentCls}-cell`]: { borderBottom: tableBorder, transition: `background ${motionDurationMid}` }, [`${componentCls}-expanded-row`]: { [`${rowCellCls}${rowCellCls}-fixed`]: { position: 'sticky', insetInlineStart: 0, overflow: 'hidden', width: `calc(var(--virtual-width) - ${(0, _cssinjs.unit)(lineWidth)})`, borderInlineEnd: 'none' } } }, // ======================== Border ========================= [`${componentCls}-bordered`]: { [`${componentCls}-tbody-virtual`]: { '&:after': { content: '""', insetInline: 0, bottom: 0, borderBottom: tableBorder, position: 'absolute' }, [`${componentCls}-cell`]: { borderInlineEnd: tableBorder, [`&${componentCls}-cell-fix-right-first:before`]: { content: '""', position: 'absolute', insetBlock: 0, insetInlineStart: calc(lineWidth).mul(-1).equal(), borderInlineStart: tableBorder } } }, // Empty placeholder [`&${componentCls}-virtual`]: { [`${componentCls}-placeholder ${componentCls}-cell`]: { borderInlineEnd: tableBorder, borderBottom: tableBorder } } } } }; }; var _default = exports["default"] = genVirtualStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/util.js": /*!****************************************************!*\ !*** ../../../node_modules/antd/lib/table/util.js ***! \****************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getColumnKey = void 0; exports.getColumnPos = getColumnPos; exports.safeColumnTitle = exports.renderColumnTitle = void 0; const getColumnKey = (column, defaultKey) => { if ('key' in column && column.key !== undefined && column.key !== null) { return column.key; } if (column.dataIndex) { return Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex; } return defaultKey; }; exports.getColumnKey = getColumnKey; function getColumnPos(index, pos) { return pos ? `${pos}-${index}` : `${index}`; } const renderColumnTitle = (title, props) => { if (typeof title === 'function') { return title(props); } return title; }; /** * Safe get column title * * Should filter [object Object] * * @param title */ exports.renderColumnTitle = renderColumnTitle; const safeColumnTitle = (title, props) => { const res = renderColumnTitle(title, props); if (Object.prototype.toString.call(res) === '[object Object]') { return ''; } return res; }; exports.safeColumnTitle = safeColumnTitle; /***/ }), /***/ "../../../node_modules/antd/lib/tabs/TabPane.js": /*!******************************************************!*\ !*** ../../../node_modules/antd/lib/tabs/TabPane.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; const TabPane = () => null; if (true) { TabPane.displayName = 'DeprecatedTabPane'; } var _default = exports["default"] = TabPane; /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfYW50ZF9saWJfc3R5bGVfY29tcGFjdC1pdGVtLXZlcnRpY2FsX2pzLW5vZGVfbW9kdWxlc19hbnRkX2xpYl9zdHlsZV9jb21wLTNhMzI4NC52b2x1bnRlZXJhcGkuMWEwOGJlYjI0OGIyN2ZkMWRhMGUuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFhOztBQUViLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQztBQUNGLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsVUFBVTtBQUM3QjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixVQUFVLG1CQUFtQixVQUFVO0FBQzFEO0FBQ0EsS0FBSztBQUNMLGNBQWMsVUFBVSxrQkFBa0IsVUFBVTtBQUNwRCxjQUFjLFVBQVUsUUFBUSxVQUFVO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxjQUFjLFVBQVUsaUJBQWlCLFVBQVU7QUFDbkQsY0FBYyxVQUFVLFFBQVEsVUFBVTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixtQkFBbUI7QUFDM0M7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQSxDOzs7Ozs7Ozs7O0FDOUNhOztBQUViLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQztBQUNGLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxpR0FBaUcsR0FBRyxFQUFFLGdCQUFnQjtBQUN0SDtBQUNBLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLFdBQVcsV0FBVztBQUN0QjtBQUNBO0FBQ0EsTUFBTSxJQUFJO0FBQ1Ysc0JBQXNCLGdCQUFnQjtBQUN0QztBQUNBO0FBQ0Es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LENBQUMsRUFBQztBQUNGLGtEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLGtEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLG1EQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLGtEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLDhDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLCtDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLDhDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLCtDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLCtDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLGdEQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLDRDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLDZDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLCtDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLGdEQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLCtDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLGdEQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLGdEQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLGlEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLDZDQUE0QztBQUM1QztBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFlLG1COzs7Ozs7Ozs7O0FDOUVqQjs7QUFFYiw4Q0FBNkM7QUFDN0M7QUFDQSxDQUFDLEVBQUM7QUFDRixvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLHVCQUF1QixHQUFHLHlCQUF5QjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQSxrQkFBa0IsSUFBSSxHQUFHLE1BQU0sT0FBTyxNQUFNO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsbUI7Ozs7Ozs7Ozs7QUMxQ1Y7O0FBRWIsOENBQTZDO0FBQzdDO0FBQ0EsQ0FBQyxFQUFDO0FBQ0Ysa0JBQWU7QUFDZjtBQUNBLElBQUksSUFBcUM7QUFDekM7QUFDQTtBQUNBLGVBQWUsa0JBQWUsVyIsInNvdXJjZXMiOlsid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3N0eWxlL2NvbXBhY3QtaXRlbS12ZXJ0aWNhbC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9zdHlsZS9jb21wYWN0LWl0ZW0uanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvc3R5bGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvc3R5bGUvbW90aW9uL2NvbGxhcHNlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3N0eWxlL21vdGlvbi9mYWRlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3N0eWxlL21vdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9zdHlsZS9tb3Rpb24vbW90aW9uLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3N0eWxlL21vdGlvbi9tb3ZlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3N0eWxlL21vdGlvbi9zbGlkZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9zdHlsZS9tb3Rpb24vem9vbS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9zdHlsZS9wbGFjZW1lbnRBcnJvdy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9zdHlsZS9yb3VuZGVkQXJyb3cuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvQ29sdW1uLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL0NvbHVtbkdyb3VwLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL0V4cGFuZEljb24uanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvSW50ZXJuYWxUYWJsZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9SY1RhYmxlL1ZpcnR1YWxUYWJsZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9SY1RhYmxlL2luZGV4LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL1RhYmxlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL2hvb2tzL3VzZUNvbnRhaW5lcldpZHRoLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL2hvb2tzL3VzZUZpbHRlci9GaWx0ZXJEcm9wZG93bi5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9ob29rcy91c2VGaWx0ZXIvRmlsdGVyU2VhcmNoLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL2hvb2tzL3VzZUZpbHRlci9GaWx0ZXJXcmFwcGVyLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL2hvb2tzL3VzZUZpbHRlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9ob29rcy91c2VMYXp5S1ZNYXAuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvaG9va3MvdXNlUGFnaW5hdGlvbi5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9ob29rcy91c2VTZWxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvaG9va3MvdXNlU29ydGVyLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL2hvb2tzL3VzZVRpdGxlQ29sdW1ucy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9zdHlsZS9ib3JkZXJlZC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9zdHlsZS9lbGxpcHNpcy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9zdHlsZS9lbXB0eS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9zdHlsZS9leHBhbmQuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvc3R5bGUvZmlsdGVyLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL3N0eWxlL2ZpeGVkLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL3N0eWxlL2luZGV4LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL3N0eWxlL3BhZ2luYXRpb24uanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvc3R5bGUvcmFkaXVzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL3N0eWxlL3J0bC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9zdHlsZS9zZWxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvc3R5bGUvc2l6ZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9zdHlsZS9zb3J0ZXIuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvc3R5bGUvc3RpY2t5LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL3N0eWxlL3N1bW1hcnkuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvc3R5bGUvdmlydHVhbC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS91dGlsLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYnMvVGFiUGFuZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2VuQ29tcGFjdEl0ZW1WZXJ0aWNhbFN0eWxlID0gZ2VuQ29tcGFjdEl0ZW1WZXJ0aWNhbFN0eWxlO1xuZnVuY3Rpb24gY29tcGFjdEl0ZW1WZXJ0aWNhbEJvcmRlcih0b2tlbiwgcGFyZW50Q2xzKSB7XG4gIHJldHVybiB7XG4gICAgLy8gYm9yZGVyIGNvbGxhcHNlXG4gICAgW2AmLWl0ZW06bm90KCR7cGFyZW50Q2xzfS1sYXN0LWl0ZW0pYF06IHtcbiAgICAgIG1hcmdpbkJvdHRvbTogdG9rZW4uY2FsYyh0b2tlbi5saW5lV2lkdGgpLm11bCgtMSkuZXF1YWwoKVxuICAgIH0sXG4gICAgJyYtaXRlbSc6IHtcbiAgICAgICcmOmhvdmVyLCY6Zm9jdXMsJjphY3RpdmUnOiB7XG4gICAgICAgIHpJbmRleDogMlxuICAgICAgfSxcbiAgICAgICcmW2Rpc2FibGVkXSc6IHtcbiAgICAgICAgekluZGV4OiAwXG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gY29tcGFjdEl0ZW1Cb3JkZXJWZXJ0aWNhbFJhZGl1cyhwcmVmaXhDbHMsIHBhcmVudENscykge1xuICByZXR1cm4ge1xuICAgIFtgJi1pdGVtOm5vdCgke3BhcmVudENsc30tZmlyc3QtaXRlbSk6bm90KCR7cGFyZW50Q2xzfS1sYXN0LWl0ZW0pYF06IHtcbiAgICAgIGJvcmRlclJhZGl1czogMFxuICAgIH0sXG4gICAgW2AmLWl0ZW0ke3BhcmVudENsc30tZmlyc3QtaXRlbTpub3QoJHtwYXJlbnRDbHN9LWxhc3QtaXRlbSlgXToge1xuICAgICAgW2AmLCAmJHtwcmVmaXhDbHN9LXNtLCAmJHtwcmVmaXhDbHN9LWxnYF06IHtcbiAgICAgICAgYm9yZGVyRW5kRW5kUmFkaXVzOiAwLFxuICAgICAgICBib3JkZXJFbmRTdGFydFJhZGl1czogMFxuICAgICAgfVxuICAgIH0sXG4gICAgW2AmLWl0ZW0ke3BhcmVudENsc30tbGFzdC1pdGVtOm5vdCgke3BhcmVudENsc30tZmlyc3QtaXRlbSlgXToge1xuICAgICAgW2AmLCAmJHtwcmVmaXhDbHN9LXNtLCAmJHtwcmVmaXhDbHN9LWxnYF06IHtcbiAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogMCxcbiAgICAgICAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IDBcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBnZW5Db21wYWN0SXRlbVZlcnRpY2FsU3R5bGUodG9rZW4pIHtcbiAgY29uc3QgY29tcGFjdENscyA9IGAke3Rva2VuLmNvbXBvbmVudENsc30tY29tcGFjdC12ZXJ0aWNhbGA7XG4gIHJldHVybiB7XG4gICAgW2NvbXBhY3RDbHNdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbXBhY3RJdGVtVmVydGljYWxCb3JkZXIodG9rZW4sIGNvbXBhY3RDbHMpKSwgY29tcGFjdEl0ZW1Cb3JkZXJWZXJ0aWNhbFJhZGl1cyh0b2tlbi5jb21wb25lbnRDbHMsIGNvbXBhY3RDbHMpKVxuICB9O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZW5Db21wYWN0SXRlbVN0eWxlID0gZ2VuQ29tcGFjdEl0ZW1TdHlsZTtcbi8vIGhhbmRsZSBib3JkZXIgY29sbGFwc2VcbmZ1bmN0aW9uIGNvbXBhY3RJdGVtQm9yZGVyKHRva2VuLCBwYXJlbnRDbHMsIG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIGZvY3VzRWxDbHMsXG4gICAgZm9jdXMsXG4gICAgYm9yZGVyRWxDbHNcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNoaWxkQ29tYmluYXRvciA9IGJvcmRlckVsQ2xzID8gJz4gKicgOiAnJztcbiAgY29uc3QgaG92ZXJFZmZlY3RzID0gWydob3ZlcicsIGZvY3VzID8gJ2ZvY3VzJyA6IG51bGwsICdhY3RpdmUnXS5maWx0ZXIoQm9vbGVhbikubWFwKG4gPT4gYCY6JHtufSAke2NoaWxkQ29tYmluYXRvcn1gKS5qb2luKCcsJyk7XG4gIHJldHVybiB7XG4gICAgW2AmLWl0ZW06bm90KCR7cGFyZW50Q2xzfS1sYXN0LWl0ZW0pYF06IHtcbiAgICAgIG1hcmdpbklubGluZUVuZDogdG9rZW4uY2FsYyh0b2tlbi5saW5lV2lkdGgpLm11bCgtMSkuZXF1YWwoKVxuICAgIH0sXG4gICAgJyYtaXRlbSc6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICBbaG92ZXJFZmZlY3RzXToge1xuICAgICAgICB6SW5kZXg6IDJcbiAgICAgIH1cbiAgICB9LCBmb2N1c0VsQ2xzID8ge1xuICAgICAgW2AmJHtmb2N1c0VsQ2xzfWBdOiB7XG4gICAgICAgIHpJbmRleDogMlxuICAgICAgfVxuICAgIH0gOiB7fSksIHtcbiAgICAgIFtgJltkaXNhYmxlZF0gJHtjaGlsZENvbWJpbmF0b3J9YF06IHtcbiAgICAgICAgekluZGV4OiAwXG4gICAgICB9XG4gICAgfSlcbiAgfTtcbn1cbi8vIGhhbmRsZSBib3JkZXItcmFkaXVzXG5mdW5jdGlvbiBjb21wYWN0SXRlbUJvcmRlclJhZGl1cyhwcmVmaXhDbHMsIHBhcmVudENscywgb3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgYm9yZGVyRWxDbHNcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNoaWxkQ29tYmluYXRvciA9IGJvcmRlckVsQ2xzID8gYD4gJHtib3JkZXJFbENsc31gIDogJyc7XG4gIHJldHVybiB7XG4gICAgW2AmLWl0ZW06bm90KCR7cGFyZW50Q2xzfS1maXJzdC1pdGVtKTpub3QoJHtwYXJlbnRDbHN9LWxhc3QtaXRlbSkgJHtjaGlsZENvbWJpbmF0b3J9YF06IHtcbiAgICAgIGJvcmRlclJhZGl1czogMFxuICAgIH0sXG4gICAgW2AmLWl0ZW06bm90KCR7cGFyZW50Q2xzfS1sYXN0LWl0ZW0pJHtwYXJlbnRDbHN9LWZpcnN0LWl0ZW1gXToge1xuICAgICAgW2AmICR7Y2hpbGRDb21iaW5hdG9yfSwgJiR7cHJlZml4Q2xzfS1zbSAke2NoaWxkQ29tYmluYXRvcn0sICYke3ByZWZpeENsc30tbGcgJHtjaGlsZENvbWJpbmF0b3J9YF06IHtcbiAgICAgICAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IDAsXG4gICAgICAgIGJvcmRlckVuZEVuZFJhZGl1czogMFxuICAgICAgfVxuICAgIH0sXG4gICAgW2AmLWl0ZW06bm90KCR7cGFyZW50Q2xzfS1maXJzdC1pdGVtKSR7cGFyZW50Q2xzfS1sYXN0LWl0ZW1gXToge1xuICAgICAgW2AmICR7Y2hpbGRDb21iaW5hdG9yfSwgJiR7cHJlZml4Q2xzfS1zbSAke2NoaWxkQ29tYmluYXRvcn0sICYke3ByZWZpeENsc30tbGcgJHtjaGlsZENvbWJpbmF0b3J9YF06IHtcbiAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogMCxcbiAgICAgICAgYm9yZGVyRW5kU3RhcnRSYWRpdXM6IDBcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBnZW5Db21wYWN0SXRlbVN0eWxlKHRva2VuLCBvcHRpb25zID0ge1xuICBmb2N1czogdHJ1ZVxufSkge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgY29tcGFjdENscyA9IGAke2NvbXBvbmVudENsc30tY29tcGFjdGA7XG4gIHJldHVybiB7XG4gICAgW2NvbXBhY3RDbHNdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbXBhY3RJdGVtQm9yZGVyKHRva2VuLCBjb21wYWN0Q2xzLCBvcHRpb25zKSksIGNvbXBhY3RJdGVtQm9yZGVyUmFkaXVzKGNvbXBvbmVudENscywgY29tcGFjdENscywgb3B0aW9ucykpXG4gIH07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cInVzZSBjbGllbnRcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudGV4dEVsbGlwc2lzID0gZXhwb3J0cy5yZXNldEljb24gPSBleHBvcnRzLnJlc2V0Q29tcG9uZW50ID0gZXhwb3J0cy5vcGVyYXRpb25Vbml0ID0gZXhwb3J0cy5nZW5MaW5rU3R5bGUgPSBleHBvcnRzLmdlbkljb25TdHlsZSA9IGV4cG9ydHMuZ2VuRm9jdXNTdHlsZSA9IGV4cG9ydHMuZ2VuRm9jdXNPdXRsaW5lID0gZXhwb3J0cy5nZW5Db21tb25TdHlsZSA9IGV4cG9ydHMuY2xlYXJGaXggPSB2b2lkIDA7XG52YXIgX2Nzc2luanMgPSByZXF1aXJlKFwiQGFudC1kZXNpZ24vY3NzaW5qc1wiKTtcbmNvbnN0IHRleHRFbGxpcHNpcyA9IGV4cG9ydHMudGV4dEVsbGlwc2lzID0ge1xuICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICB0ZXh0T3ZlcmZsb3c6ICdlbGxpcHNpcydcbn07XG5jb25zdCByZXNldENvbXBvbmVudCA9ICh0b2tlbiwgbmVlZEluaGVyaXRGb250RmFtaWx5ID0gZmFsc2UpID0+ICh7XG4gIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICBtYXJnaW46IDAsXG4gIHBhZGRpbmc6IDAsXG4gIGNvbG9yOiB0b2tlbi5jb2xvclRleHQsXG4gIGZvbnRTaXplOiB0b2tlbi5mb250U2l6ZSxcbiAgLy8gZm9udC12YXJpYW50OiBAZm9udC12YXJpYW50LWJhc2U7XG4gIGxpbmVIZWlnaHQ6IHRva2VuLmxpbmVIZWlnaHQsXG4gIGxpc3RTdHlsZTogJ25vbmUnLFxuICAvLyBmb250LWZlYXR1cmUtc2V0dGluZ3M6IEBmb250LWZlYXR1cmUtc2V0dGluZ3MtYmFzZTtcbiAgZm9udEZhbWlseTogbmVlZEluaGVyaXRGb250RmFtaWx5ID8gJ2luaGVyaXQnIDogdG9rZW4uZm9udEZhbWlseVxufSk7XG5leHBvcnRzLnJlc2V0Q29tcG9uZW50ID0gcmVzZXRDb21wb25lbnQ7XG5jb25zdCByZXNldEljb24gPSAoKSA9PiAoe1xuICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgY29sb3I6ICdpbmhlcml0JyxcbiAgZm9udFN0eWxlOiAnbm9ybWFsJyxcbiAgbGluZUhlaWdodDogMCxcbiAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgdGV4dFRyYW5zZm9ybTogJ25vbmUnLFxuICAvLyBmb3IgU1ZHIGljb24sIHNlZSBodHRwczovL2Jsb2cucHJvdG90eXByLmlvL2FsaWduLXN2Zy1pY29ucy10by10ZXh0LWFuZC1zYXktZ29vZGJ5ZS10by1mb250LWljb25zLWQ0NGIzZDdiMjZiNFxuICB2ZXJ0aWNhbEFsaWduOiAnLTAuMTI1ZW0nLFxuICB0ZXh0UmVuZGVyaW5nOiAnb3B0aW1pemVMZWdpYmlsaXR5JyxcbiAgJy13ZWJraXQtZm9udC1zbW9vdGhpbmcnOiAnYW50aWFsaWFzZWQnLFxuICAnLW1vei1vc3gtZm9udC1zbW9vdGhpbmcnOiAnZ3JheXNjYWxlJyxcbiAgJz4gKic6IHtcbiAgICBsaW5lSGVpZ2h0OiAxXG4gIH0sXG4gIHN2Zzoge1xuICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snXG4gIH1cbn0pO1xuZXhwb3J0cy5yZXNldEljb24gPSByZXNldEljb247XG5jb25zdCBjbGVhckZpeCA9ICgpID0+ICh7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzIxMzAxI2lzc3VlY29tbWVudC01ODM5NTUyMjlcbiAgJyY6OmJlZm9yZSc6IHtcbiAgICBkaXNwbGF5OiAndGFibGUnLFxuICAgIGNvbnRlbnQ6ICdcIlwiJ1xuICB9LFxuICAnJjo6YWZ0ZXInOiB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjE4NjRcbiAgICBkaXNwbGF5OiAndGFibGUnLFxuICAgIGNsZWFyOiAnYm90aCcsXG4gICAgY29udGVudDogJ1wiXCInXG4gIH1cbn0pO1xuZXhwb3J0cy5jbGVhckZpeCA9IGNsZWFyRml4O1xuY29uc3QgZ2VuTGlua1N0eWxlID0gdG9rZW4gPT4gKHtcbiAgYToge1xuICAgIGNvbG9yOiB0b2tlbi5jb2xvckxpbmssXG4gICAgdGV4dERlY29yYXRpb246IHRva2VuLmxpbmtEZWNvcmF0aW9uLFxuICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAvLyByZW1vdmUgdGhlIGdyYXkgYmFja2dyb3VuZCBvbiBhY3RpdmUgbGlua3MgaW4gSUUgMTAuXG4gICAgb3V0bGluZTogJ25vbmUnLFxuICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgIHRyYW5zaXRpb246IGBjb2xvciAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd31gLFxuICAgICctd2Via2l0LXRleHQtZGVjb3JhdGlvbi1za2lwJzogJ29iamVjdHMnLFxuICAgIC8vIHJlbW92ZSBnYXBzIGluIGxpbmtzIHVuZGVybGluZSBpbiBpT1MgOCsgYW5kIFNhZmFyaSA4Ky5cbiAgICAnJjpob3Zlcic6IHtcbiAgICAgIGNvbG9yOiB0b2tlbi5jb2xvckxpbmtIb3ZlclxuICAgIH0sXG4gICAgJyY6YWN0aXZlJzoge1xuICAgICAgY29sb3I6IHRva2VuLmNvbG9yTGlua0FjdGl2ZVxuICAgIH0sXG4gICAgJyY6YWN0aXZlLCAmOmhvdmVyJzoge1xuICAgICAgdGV4dERlY29yYXRpb246IHRva2VuLmxpbmtIb3ZlckRlY29yYXRpb24sXG4gICAgICBvdXRsaW5lOiAwXG4gICAgfSxcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yMjUwM1xuICAgICcmOmZvY3VzJzoge1xuICAgICAgdGV4dERlY29yYXRpb246IHRva2VuLmxpbmtGb2N1c0RlY29yYXRpb24sXG4gICAgICBvdXRsaW5lOiAwXG4gICAgfSxcbiAgICAnJltkaXNhYmxlZF0nOiB7XG4gICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGlzYWJsZWQsXG4gICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCdcbiAgICB9XG4gIH1cbn0pO1xuZXhwb3J0cy5nZW5MaW5rU3R5bGUgPSBnZW5MaW5rU3R5bGU7XG5jb25zdCBnZW5Db21tb25TdHlsZSA9ICh0b2tlbiwgY29tcG9uZW50UHJlZml4Q2xzLCByb290Q2xzLCByZXNldEZvbnQpID0+IHtcbiAgY29uc3QgcHJlZml4U2VsZWN0b3IgPSBgW2NsYXNzXj1cIiR7Y29tcG9uZW50UHJlZml4Q2xzfVwiXSwgW2NsYXNzKj1cIiAke2NvbXBvbmVudFByZWZpeENsc31cIl1gO1xuICBjb25zdCByb290UHJlZml4U2VsZWN0b3IgPSByb290Q2xzID8gYC4ke3Jvb3RDbHN9YCA6IHByZWZpeFNlbGVjdG9yO1xuICBjb25zdCByZXNldFN0eWxlID0ge1xuICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICcmOjpiZWZvcmUsICY6OmFmdGVyJzoge1xuICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCdcbiAgICB9XG4gIH07XG4gIGxldCByZXNldEZvbnRTdHlsZSA9IHt9O1xuICBpZiAocmVzZXRGb250ICE9PSBmYWxzZSkge1xuICAgIHJlc2V0Rm9udFN0eWxlID0ge1xuICAgICAgZm9udEZhbWlseTogdG9rZW4uZm9udEZhbWlseSxcbiAgICAgIGZvbnRTaXplOiB0b2tlbi5mb250U2l6ZVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBbcm9vdFByZWZpeFNlbGVjdG9yXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc2V0Rm9udFN0eWxlKSwgcmVzZXRTdHlsZSksIHtcbiAgICAgIFtwcmVmaXhTZWxlY3Rvcl06IHJlc2V0U3R5bGVcbiAgICB9KVxuICB9O1xufTtcbmV4cG9ydHMuZ2VuQ29tbW9uU3R5bGUgPSBnZW5Db21tb25TdHlsZTtcbmNvbnN0IGdlbkZvY3VzT3V0bGluZSA9ICh0b2tlbiwgb2Zmc2V0KSA9PiAoe1xuICBvdXRsaW5lOiBgJHsoMCwgX2Nzc2luanMudW5pdCkodG9rZW4ubGluZVdpZHRoRm9jdXMpfSBzb2xpZCAke3Rva2VuLmNvbG9yUHJpbWFyeUJvcmRlcn1gLFxuICBvdXRsaW5lT2Zmc2V0OiBvZmZzZXQgIT09IG51bGwgJiYgb2Zmc2V0ICE9PSB2b2lkIDAgPyBvZmZzZXQgOiAxLFxuICB0cmFuc2l0aW9uOiAnb3V0bGluZS1vZmZzZXQgMHMsIG91dGxpbmUgMHMnXG59KTtcbmV4cG9ydHMuZ2VuRm9jdXNPdXRsaW5lID0gZ2VuRm9jdXNPdXRsaW5lO1xuY29uc3QgZ2VuRm9jdXNTdHlsZSA9ICh0b2tlbiwgb2Zmc2V0KSA9PiAoe1xuICAnJjpmb2N1cy12aXNpYmxlJzogT2JqZWN0LmFzc2lnbih7fSwgZ2VuRm9jdXNPdXRsaW5lKHRva2VuLCBvZmZzZXQpKVxufSk7XG5leHBvcnRzLmdlbkZvY3VzU3R5bGUgPSBnZW5Gb2N1c1N0eWxlO1xuY29uc3QgZ2VuSWNvblN0eWxlID0gaWNvblByZWZpeENscyA9PiAoe1xuICBbYC4ke2ljb25QcmVmaXhDbHN9YF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzZXRJY29uKCkpLCB7XG4gICAgW2AuJHtpY29uUHJlZml4Q2xzfSAuJHtpY29uUHJlZml4Q2xzfS1pY29uYF06IHtcbiAgICAgIGRpc3BsYXk6ICdibG9jaydcbiAgICB9XG4gIH0pXG59KTtcbmV4cG9ydHMuZ2VuSWNvblN0eWxlID0gZ2VuSWNvblN0eWxlO1xuY29uc3Qgb3BlcmF0aW9uVW5pdCA9IHRva2VuID0+IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gIC8vIEZJWE1FOiBUaGlzIHVzZSBsaW5rIGJ1dCBpcyBhIG9wZXJhdGlvbiB1bml0LiBTZWVtcyBzaG91bGQgYmUgYSBjb2xvclByaW1hcnkuXG4gIC8vIEFuZCBUeXBvZ3JhcGh5IHVzZSB0aGlzIHRvIGdlbmVyYXRlIGxpbmsgc3R5bGUgd2hpY2ggc2hvdWxkIG5vdCBkbyB0aGlzLlxuICBjb2xvcjogdG9rZW4uY29sb3JMaW5rLFxuICB0ZXh0RGVjb3JhdGlvbjogdG9rZW4ubGlua0RlY29yYXRpb24sXG4gIG91dGxpbmU6ICdub25lJyxcbiAgY3Vyc29yOiAncG9pbnRlcicsXG4gIHRyYW5zaXRpb246IGBhbGwgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgYm9yZGVyOiAwLFxuICBwYWRkaW5nOiAwLFxuICBiYWNrZ3JvdW5kOiAnbm9uZScsXG4gIHVzZXJTZWxlY3Q6ICdub25lJ1xufSwgZ2VuRm9jdXNTdHlsZSh0b2tlbikpLCB7XG4gICcmOmZvY3VzLCAmOmhvdmVyJzoge1xuICAgIGNvbG9yOiB0b2tlbi5jb2xvckxpbmtIb3ZlclxuICB9LFxuICAnJjphY3RpdmUnOiB7XG4gICAgY29sb3I6IHRva2VuLmNvbG9yTGlua0FjdGl2ZVxuICB9XG59KTtcbmV4cG9ydHMub3BlcmF0aW9uVW5pdCA9IG9wZXJhdGlvblVuaXQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5jb25zdCBnZW5Db2xsYXBzZU1vdGlvbiA9IHRva2VuID0+ICh7XG4gIFt0b2tlbi5jb21wb25lbnRDbHNdOiB7XG4gICAgLy8gRm9yIGNvbW1vbi9vcGVuQW5pbWF0aW9uXG4gICAgW2Ake3Rva2VuLmFudENsc30tbW90aW9uLWNvbGxhcHNlLWxlZ2FjeWBdOiB7XG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAnJi1hY3RpdmUnOiB7XG4gICAgICAgIHRyYW5zaXRpb246IGBoZWlnaHQgJHt0b2tlbi5tb3Rpb25EdXJhdGlvbk1pZH0gJHt0b2tlbi5tb3Rpb25FYXNlSW5PdXR9LFxuICAgICAgICBvcGFjaXR5ICR7dG9rZW4ubW90aW9uRHVyYXRpb25NaWR9ICR7dG9rZW4ubW90aW9uRWFzZUluT3V0fSAhaW1wb3J0YW50YFxuICAgICAgfVxuICAgIH0sXG4gICAgW2Ake3Rva2VuLmFudENsc30tbW90aW9uLWNvbGxhcHNlYF06IHtcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgIHRyYW5zaXRpb246IGBoZWlnaHQgJHt0b2tlbi5tb3Rpb25EdXJhdGlvbk1pZH0gJHt0b2tlbi5tb3Rpb25FYXNlSW5PdXR9LFxuICAgICAgICBvcGFjaXR5ICR7dG9rZW4ubW90aW9uRHVyYXRpb25NaWR9ICR7dG9rZW4ubW90aW9uRWFzZUluT3V0fSAhaW1wb3J0YW50YFxuICAgIH1cbiAgfVxufSk7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZW5Db2xsYXBzZU1vdGlvbjsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuaW5pdEZhZGVNb3Rpb24gPSBleHBvcnRzLmZhZGVPdXQgPSBleHBvcnRzLmZhZGVJbiA9IHZvaWQgMDtcbnZhciBfY3NzaW5qcyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jc3NpbmpzXCIpO1xudmFyIF9tb3Rpb24gPSByZXF1aXJlKFwiLi9tb3Rpb25cIik7XG5jb25zdCBmYWRlSW4gPSBleHBvcnRzLmZhZGVJbiA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudEZhZGVJbicsIHtcbiAgJzAlJzoge1xuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgb3BhY2l0eTogMVxuICB9XG59KTtcbmNvbnN0IGZhZGVPdXQgPSBleHBvcnRzLmZhZGVPdXQgPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRGYWRlT3V0Jywge1xuICAnMCUnOiB7XG4gICAgb3BhY2l0eTogMVxuICB9LFxuICAnMTAwJSc6IHtcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuY29uc3QgaW5pdEZhZGVNb3Rpb24gPSAodG9rZW4sIHNhbWVMZXZlbCA9IGZhbHNlKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhbnRDbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBtb3Rpb25DbHMgPSBgJHthbnRDbHN9LWZhZGVgO1xuICBjb25zdCBzYW1lTGV2ZWxQcmVmaXggPSBzYW1lTGV2ZWwgPyAnJicgOiAnJztcbiAgcmV0dXJuIFsoMCwgX21vdGlvbi5pbml0TW90aW9uKShtb3Rpb25DbHMsIGZhZGVJbiwgZmFkZU91dCwgdG9rZW4ubW90aW9uRHVyYXRpb25NaWQsIHNhbWVMZXZlbCksIHtcbiAgICBbYFxuICAgICAgICAke3NhbWVMZXZlbFByZWZpeH0ke21vdGlvbkNsc30tZW50ZXIsXG4gICAgICAgICR7c2FtZUxldmVsUHJlZml4fSR7bW90aW9uQ2xzfS1hcHBlYXJcbiAgICAgIGBdOiB7XG4gICAgICBvcGFjaXR5OiAwLFxuICAgICAgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb246ICdsaW5lYXInXG4gICAgfSxcbiAgICBbYCR7c2FtZUxldmVsUHJlZml4fSR7bW90aW9uQ2xzfS1sZWF2ZWBdOiB7XG4gICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogJ2xpbmVhcidcbiAgICB9XG4gIH1dO1xufTtcbmV4cG9ydHMuaW5pdEZhZGVNb3Rpb24gPSBpbml0RmFkZU1vdGlvbjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJmYWRlSW5cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2ZhZGUuZmFkZUluO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImZhZGVPdXRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2ZhZGUuZmFkZU91dDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJnZW5Db2xsYXBzZU1vdGlvblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfY29sbGFwc2UuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpbml0RmFkZU1vdGlvblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfZmFkZS5pbml0RmFkZU1vdGlvbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpbml0TW92ZU1vdGlvblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfbW92ZS5pbml0TW92ZU1vdGlvbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpbml0U2xpZGVNb3Rpb25cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3NsaWRlLmluaXRTbGlkZU1vdGlvbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpbml0Wm9vbU1vdGlvblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfem9vbS5pbml0Wm9vbU1vdGlvbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJtb3ZlRG93bkluXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9tb3ZlLm1vdmVEb3duSW47XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibW92ZURvd25PdXRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX21vdmUubW92ZURvd25PdXQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibW92ZUxlZnRJblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfbW92ZS5tb3ZlTGVmdEluO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm1vdmVMZWZ0T3V0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9tb3ZlLm1vdmVMZWZ0T3V0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm1vdmVSaWdodEluXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9tb3ZlLm1vdmVSaWdodEluO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm1vdmVSaWdodE91dFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfbW92ZS5tb3ZlUmlnaHRPdXQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibW92ZVVwSW5cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX21vdmUubW92ZVVwSW47XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibW92ZVVwT3V0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9tb3ZlLm1vdmVVcE91dDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzbGlkZURvd25JblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfc2xpZGUuc2xpZGVEb3duSW47XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic2xpZGVEb3duT3V0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9zbGlkZS5zbGlkZURvd25PdXQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic2xpZGVMZWZ0SW5cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3NsaWRlLnNsaWRlTGVmdEluO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInNsaWRlTGVmdE91dFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfc2xpZGUuc2xpZGVMZWZ0T3V0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInNsaWRlUmlnaHRJblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfc2xpZGUuc2xpZGVSaWdodEluO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInNsaWRlUmlnaHRPdXRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3NsaWRlLnNsaWRlUmlnaHRPdXQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic2xpZGVVcEluXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9zbGlkZS5zbGlkZVVwSW47XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic2xpZGVVcE91dFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfc2xpZGUuc2xpZGVVcE91dDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ6b29tQmlnSW5cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3pvb20uem9vbUJpZ0luO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInpvb21CaWdPdXRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3pvb20uem9vbUJpZ091dDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ6b29tRG93bkluXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF96b29tLnpvb21Eb3duSW47XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiem9vbURvd25PdXRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3pvb20uem9vbURvd25PdXQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiem9vbUluXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF96b29tLnpvb21JbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ6b29tTGVmdEluXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF96b29tLnpvb21MZWZ0SW47XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiem9vbUxlZnRPdXRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3pvb20uem9vbUxlZnRPdXQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiem9vbU91dFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfem9vbS56b29tT3V0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInpvb21SaWdodEluXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF96b29tLnpvb21SaWdodEluO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInpvb21SaWdodE91dFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfem9vbS56b29tUmlnaHRPdXQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiem9vbVVwSW5cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3pvb20uem9vbVVwSW47XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiem9vbVVwT3V0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF96b29tLnpvb21VcE91dDtcbiAgfVxufSk7XG52YXIgX2NvbGxhcHNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9jb2xsYXBzZVwiKSk7XG52YXIgX2ZhZGUgPSByZXF1aXJlKFwiLi9mYWRlXCIpO1xudmFyIF9tb3ZlID0gcmVxdWlyZShcIi4vbW92ZVwiKTtcbnZhciBfc2xpZGUgPSByZXF1aXJlKFwiLi9zbGlkZVwiKTtcbnZhciBfem9vbSA9IHJlcXVpcmUoXCIuL3pvb21cIik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmluaXRNb3Rpb24gPSB2b2lkIDA7XG5jb25zdCBpbml0TW90aW9uQ29tbW9uID0gZHVyYXRpb24gPT4gKHtcbiAgYW5pbWF0aW9uRHVyYXRpb246IGR1cmF0aW9uLFxuICBhbmltYXRpb25GaWxsTW9kZTogJ2JvdGgnXG59KTtcbi8vIEZJWE1FOiBvcmlnaW4gbGVzcyBjb2RlIHNlZW1zIHNhbWUgYXMgaW5pdE1vdGlvbkNvbW1vbi4gTWF5YmUgd2UgY2FuIHNhZmUgcmVtb3ZlXG5jb25zdCBpbml0TW90aW9uQ29tbW9uTGVhdmUgPSBkdXJhdGlvbiA9PiAoe1xuICBhbmltYXRpb25EdXJhdGlvbjogZHVyYXRpb24sXG4gIGFuaW1hdGlvbkZpbGxNb2RlOiAnYm90aCdcbn0pO1xuY29uc3QgaW5pdE1vdGlvbiA9IChtb3Rpb25DbHMsIGluS2V5ZnJhbWVzLCBvdXRLZXlmcmFtZXMsIGR1cmF0aW9uLCBzYW1lTGV2ZWwgPSBmYWxzZSkgPT4ge1xuICBjb25zdCBzYW1lTGV2ZWxQcmVmaXggPSBzYW1lTGV2ZWwgPyAnJicgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBbYFxuICAgICAgJHtzYW1lTGV2ZWxQcmVmaXh9JHttb3Rpb25DbHN9LWVudGVyLFxuICAgICAgJHtzYW1lTGV2ZWxQcmVmaXh9JHttb3Rpb25DbHN9LWFwcGVhclxuICAgIGBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGluaXRNb3Rpb25Db21tb24oZHVyYXRpb24pKSwge1xuICAgICAgYW5pbWF0aW9uUGxheVN0YXRlOiAncGF1c2VkJ1xuICAgIH0pLFxuICAgIFtgJHtzYW1lTGV2ZWxQcmVmaXh9JHttb3Rpb25DbHN9LWxlYXZlYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaW5pdE1vdGlvbkNvbW1vbkxlYXZlKGR1cmF0aW9uKSksIHtcbiAgICAgIGFuaW1hdGlvblBsYXlTdGF0ZTogJ3BhdXNlZCdcbiAgICB9KSxcbiAgICBbYFxuICAgICAgJHtzYW1lTGV2ZWxQcmVmaXh9JHttb3Rpb25DbHN9LWVudGVyJHttb3Rpb25DbHN9LWVudGVyLWFjdGl2ZSxcbiAgICAgICR7c2FtZUxldmVsUHJlZml4fSR7bW90aW9uQ2xzfS1hcHBlYXIke21vdGlvbkNsc30tYXBwZWFyLWFjdGl2ZVxuICAgIGBdOiB7XG4gICAgICBhbmltYXRpb25OYW1lOiBpbktleWZyYW1lcyxcbiAgICAgIGFuaW1hdGlvblBsYXlTdGF0ZTogJ3J1bm5pbmcnXG4gICAgfSxcbiAgICBbYCR7c2FtZUxldmVsUHJlZml4fSR7bW90aW9uQ2xzfS1sZWF2ZSR7bW90aW9uQ2xzfS1sZWF2ZS1hY3RpdmVgXToge1xuICAgICAgYW5pbWF0aW9uTmFtZTogb3V0S2V5ZnJhbWVzLFxuICAgICAgYW5pbWF0aW9uUGxheVN0YXRlOiAncnVubmluZycsXG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZSdcbiAgICB9XG4gIH07XG59O1xuZXhwb3J0cy5pbml0TW90aW9uID0gaW5pdE1vdGlvbjsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMubW92ZVVwT3V0ID0gZXhwb3J0cy5tb3ZlVXBJbiA9IGV4cG9ydHMubW92ZVJpZ2h0T3V0ID0gZXhwb3J0cy5tb3ZlUmlnaHRJbiA9IGV4cG9ydHMubW92ZUxlZnRPdXQgPSBleHBvcnRzLm1vdmVMZWZ0SW4gPSBleHBvcnRzLm1vdmVEb3duT3V0ID0gZXhwb3J0cy5tb3ZlRG93bkluID0gZXhwb3J0cy5pbml0TW92ZU1vdGlvbiA9IHZvaWQgMDtcbnZhciBfY3NzaW5qcyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jc3NpbmpzXCIpO1xudmFyIF9tb3Rpb24gPSByZXF1aXJlKFwiLi9tb3Rpb25cIik7XG5jb25zdCBtb3ZlRG93bkluID0gZXhwb3J0cy5tb3ZlRG93bkluID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50TW92ZURvd25JbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDEwMCUsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMVxuICB9XG59KTtcbmNvbnN0IG1vdmVEb3duT3V0ID0gZXhwb3J0cy5tb3ZlRG93bk91dCA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudE1vdmVEb3duT3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMVxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAxMDAlLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuY29uc3QgbW92ZUxlZnRJbiA9IGV4cG9ydHMubW92ZUxlZnRJbiA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudE1vdmVMZWZ0SW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAxXG4gIH1cbn0pO1xuY29uc3QgbW92ZUxlZnRPdXQgPSBleHBvcnRzLm1vdmVMZWZ0T3V0ID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50TW92ZUxlZnRPdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAxXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC0xMDAlLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuY29uc3QgbW92ZVJpZ2h0SW4gPSBleHBvcnRzLm1vdmVSaWdodEluID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50TW92ZVJpZ2h0SW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5jb25zdCBtb3ZlUmlnaHRPdXQgPSBleHBvcnRzLm1vdmVSaWdodE91dCA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudE1vdmVSaWdodE91dCcsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDFcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMTAwJSwgMCwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMFxuICB9XG59KTtcbmNvbnN0IG1vdmVVcEluID0gZXhwb3J0cy5tb3ZlVXBJbiA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudE1vdmVVcEluJywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgLTEwMCUsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMVxuICB9XG59KTtcbmNvbnN0IG1vdmVVcE91dCA9IGV4cG9ydHMubW92ZVVwT3V0ID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50TW92ZVVwT3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMVxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAtMTAwJSwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMFxuICB9XG59KTtcbmNvbnN0IG1vdmVNb3Rpb24gPSB7XG4gICdtb3ZlLXVwJzoge1xuICAgIGluS2V5ZnJhbWVzOiBtb3ZlVXBJbixcbiAgICBvdXRLZXlmcmFtZXM6IG1vdmVVcE91dFxuICB9LFxuICAnbW92ZS1kb3duJzoge1xuICAgIGluS2V5ZnJhbWVzOiBtb3ZlRG93bkluLFxuICAgIG91dEtleWZyYW1lczogbW92ZURvd25PdXRcbiAgfSxcbiAgJ21vdmUtbGVmdCc6IHtcbiAgICBpbktleWZyYW1lczogbW92ZUxlZnRJbixcbiAgICBvdXRLZXlmcmFtZXM6IG1vdmVMZWZ0T3V0XG4gIH0sXG4gICdtb3ZlLXJpZ2h0Jzoge1xuICAgIGluS2V5ZnJhbWVzOiBtb3ZlUmlnaHRJbixcbiAgICBvdXRLZXlmcmFtZXM6IG1vdmVSaWdodE91dFxuICB9XG59O1xuY29uc3QgaW5pdE1vdmVNb3Rpb24gPSAodG9rZW4sIG1vdGlvbk5hbWUpID0+IHtcbiAgY29uc3Qge1xuICAgIGFudENsc1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IG1vdGlvbkNscyA9IGAke2FudENsc30tJHttb3Rpb25OYW1lfWA7XG4gIGNvbnN0IHtcbiAgICBpbktleWZyYW1lcyxcbiAgICBvdXRLZXlmcmFtZXNcbiAgfSA9IG1vdmVNb3Rpb25bbW90aW9uTmFtZV07XG4gIHJldHVybiBbKDAsIF9tb3Rpb24uaW5pdE1vdGlvbikobW90aW9uQ2xzLCBpbktleWZyYW1lcywgb3V0S2V5ZnJhbWVzLCB0b2tlbi5tb3Rpb25EdXJhdGlvbk1pZCksIHtcbiAgICBbYFxuICAgICAgICAke21vdGlvbkNsc30tZW50ZXIsXG4gICAgICAgICR7bW90aW9uQ2xzfS1hcHBlYXJcbiAgICAgIGBdOiB7XG4gICAgICBvcGFjaXR5OiAwLFxuICAgICAgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb246IHRva2VuLm1vdGlvbkVhc2VPdXRDaXJjXG4gICAgfSxcbiAgICBbYCR7bW90aW9uQ2xzfS1sZWF2ZWBdOiB7XG4gICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogdG9rZW4ubW90aW9uRWFzZUluT3V0Q2lyY1xuICAgIH1cbiAgfV07XG59O1xuZXhwb3J0cy5pbml0TW92ZU1vdGlvbiA9IGluaXRNb3ZlTW90aW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5zbGlkZVVwT3V0ID0gZXhwb3J0cy5zbGlkZVVwSW4gPSBleHBvcnRzLnNsaWRlUmlnaHRPdXQgPSBleHBvcnRzLnNsaWRlUmlnaHRJbiA9IGV4cG9ydHMuc2xpZGVMZWZ0T3V0ID0gZXhwb3J0cy5zbGlkZUxlZnRJbiA9IGV4cG9ydHMuc2xpZGVEb3duT3V0ID0gZXhwb3J0cy5zbGlkZURvd25JbiA9IGV4cG9ydHMuaW5pdFNsaWRlTW90aW9uID0gdm9pZCAwO1xudmFyIF9jc3NpbmpzID0gcmVxdWlyZShcIkBhbnQtZGVzaWduL2Nzc2luanNcIik7XG52YXIgX21vdGlvbiA9IHJlcXVpcmUoXCIuL21vdGlvblwiKTtcbmNvbnN0IHNsaWRlVXBJbiA9IGV4cG9ydHMuc2xpZGVVcEluID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50U2xpZGVVcEluJywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVZKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnLFxuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5jb25zdCBzbGlkZVVwT3V0ID0gZXhwb3J0cy5zbGlkZVVwT3V0ID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50U2xpZGVVcE91dCcsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnLFxuICAgIG9wYWNpdHk6IDFcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVZKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuY29uc3Qgc2xpZGVEb3duSW4gPSBleHBvcnRzLnNsaWRlRG93bkluID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50U2xpZGVEb3duSW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVkoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSAxMDAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSAxMDAlJyxcbiAgICBvcGFjaXR5OiAxXG4gIH1cbn0pO1xuY29uc3Qgc2xpZGVEb3duT3V0ID0gZXhwb3J0cy5zbGlkZURvd25PdXQgPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRTbGlkZURvd25PdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVkoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzEwMCUgMTAwJScsXG4gICAgb3BhY2l0eTogMVxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVkoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSAxMDAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuY29uc3Qgc2xpZGVMZWZ0SW4gPSBleHBvcnRzLnNsaWRlTGVmdEluID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50U2xpZGVMZWZ0SW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVgoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVYKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJScsXG4gICAgb3BhY2l0eTogMVxuICB9XG59KTtcbmNvbnN0IHNsaWRlTGVmdE91dCA9IGV4cG9ydHMuc2xpZGVMZWZ0T3V0ID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50U2xpZGVMZWZ0T3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVYKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJScsXG4gICAgb3BhY2l0eTogMVxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVgoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5jb25zdCBzbGlkZVJpZ2h0SW4gPSBleHBvcnRzLnNsaWRlUmlnaHRJbiA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudFNsaWRlUmlnaHRJbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWCgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWCgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSAwJScsXG4gICAgb3BhY2l0eTogMVxuICB9XG59KTtcbmNvbnN0IHNsaWRlUmlnaHRPdXQgPSBleHBvcnRzLnNsaWRlUmlnaHRPdXQgPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRTbGlkZVJpZ2h0T3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVYKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDAlJyxcbiAgICBvcGFjaXR5OiAxXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWCgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuY29uc3Qgc2xpZGVNb3Rpb24gPSB7XG4gICdzbGlkZS11cCc6IHtcbiAgICBpbktleWZyYW1lczogc2xpZGVVcEluLFxuICAgIG91dEtleWZyYW1lczogc2xpZGVVcE91dFxuICB9LFxuICAnc2xpZGUtZG93bic6IHtcbiAgICBpbktleWZyYW1lczogc2xpZGVEb3duSW4sXG4gICAgb3V0S2V5ZnJhbWVzOiBzbGlkZURvd25PdXRcbiAgfSxcbiAgJ3NsaWRlLWxlZnQnOiB7XG4gICAgaW5LZXlmcmFtZXM6IHNsaWRlTGVmdEluLFxuICAgIG91dEtleWZyYW1lczogc2xpZGVMZWZ0T3V0XG4gIH0sXG4gICdzbGlkZS1yaWdodCc6IHtcbiAgICBpbktleWZyYW1lczogc2xpZGVSaWdodEluLFxuICAgIG91dEtleWZyYW1lczogc2xpZGVSaWdodE91dFxuICB9XG59O1xuY29uc3QgaW5pdFNsaWRlTW90aW9uID0gKHRva2VuLCBtb3Rpb25OYW1lKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhbnRDbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBtb3Rpb25DbHMgPSBgJHthbnRDbHN9LSR7bW90aW9uTmFtZX1gO1xuICBjb25zdCB7XG4gICAgaW5LZXlmcmFtZXMsXG4gICAgb3V0S2V5ZnJhbWVzXG4gIH0gPSBzbGlkZU1vdGlvblttb3Rpb25OYW1lXTtcbiAgcmV0dXJuIFsoMCwgX21vdGlvbi5pbml0TW90aW9uKShtb3Rpb25DbHMsIGluS2V5ZnJhbWVzLCBvdXRLZXlmcmFtZXMsIHRva2VuLm1vdGlvbkR1cmF0aW9uTWlkKSwge1xuICAgIFtgXG4gICAgICAke21vdGlvbkNsc30tZW50ZXIsXG4gICAgICAke21vdGlvbkNsc30tYXBwZWFyXG4gICAgYF06IHtcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDApJyxcbiAgICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJyxcbiAgICAgIG9wYWNpdHk6IDAsXG4gICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogdG9rZW4ubW90aW9uRWFzZU91dFF1aW50LFxuICAgICAgJyYtcHJlcGFyZSc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknXG4gICAgICB9XG4gICAgfSxcbiAgICBbYCR7bW90aW9uQ2xzfS1sZWF2ZWBdOiB7XG4gICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogdG9rZW4ubW90aW9uRWFzZUluUXVpbnRcbiAgICB9XG4gIH1dO1xufTtcbmV4cG9ydHMuaW5pdFNsaWRlTW90aW9uID0gaW5pdFNsaWRlTW90aW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy56b29tVXBPdXQgPSBleHBvcnRzLnpvb21VcEluID0gZXhwb3J0cy56b29tUmlnaHRPdXQgPSBleHBvcnRzLnpvb21SaWdodEluID0gZXhwb3J0cy56b29tT3V0ID0gZXhwb3J0cy56b29tTGVmdE91dCA9IGV4cG9ydHMuem9vbUxlZnRJbiA9IGV4cG9ydHMuem9vbUluID0gZXhwb3J0cy56b29tRG93bk91dCA9IGV4cG9ydHMuem9vbURvd25JbiA9IGV4cG9ydHMuem9vbUJpZ091dCA9IGV4cG9ydHMuem9vbUJpZ0luID0gZXhwb3J0cy5pbml0Wm9vbU1vdGlvbiA9IHZvaWQgMDtcbnZhciBfY3NzaW5qcyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jc3NpbmpzXCIpO1xudmFyIF9tb3Rpb24gPSByZXF1aXJlKFwiLi9tb3Rpb25cIik7XG5jb25zdCB6b29tSW4gPSBleHBvcnRzLnpvb21JbiA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudFpvb21JbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuMiknLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknLFxuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5jb25zdCB6b29tT3V0ID0gZXhwb3J0cy56b29tT3V0ID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50Wm9vbU91dCcsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJ1xuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjIpJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuY29uc3Qgem9vbUJpZ0luID0gZXhwb3J0cy56b29tQmlnSW4gPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRab29tQmlnSW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjgpJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyxcbiAgICBvcGFjaXR5OiAxXG4gIH1cbn0pO1xuY29uc3Qgem9vbUJpZ091dCA9IGV4cG9ydHMuem9vbUJpZ091dCA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudFpvb21CaWdPdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKSdcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMC44KScsXG4gICAgb3BhY2l0eTogMFxuICB9XG59KTtcbmNvbnN0IHpvb21VcEluID0gZXhwb3J0cy56b29tVXBJbiA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudFpvb21VcEluJywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnNTAlIDAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICc1MCUgMCUnXG4gIH1cbn0pO1xuY29uc3Qgem9vbVVwT3V0ID0gZXhwb3J0cy56b29tVXBPdXQgPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRab29tVXBPdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnNTAlIDAlJ1xuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICc1MCUgMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5jb25zdCB6b29tTGVmdEluID0gZXhwb3J0cy56b29tTGVmdEluID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50Wm9vbUxlZnRJbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDUwJScsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgNTAlJ1xuICB9XG59KTtcbmNvbnN0IHpvb21MZWZ0T3V0ID0gZXhwb3J0cy56b29tTGVmdE91dCA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudFpvb21MZWZ0T3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDUwJSdcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgNTAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuY29uc3Qgem9vbVJpZ2h0SW4gPSBleHBvcnRzLnpvb21SaWdodEluID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50Wm9vbVJpZ2h0SW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDUwJScsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSA1MCUnXG4gIH1cbn0pO1xuY29uc3Qgem9vbVJpZ2h0T3V0ID0gZXhwb3J0cy56b29tUmlnaHRPdXQgPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRab29tUmlnaHRPdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSA1MCUnXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzEwMCUgNTAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuY29uc3Qgem9vbURvd25JbiA9IGV4cG9ydHMuem9vbURvd25JbiA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudFpvb21Eb3duSW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICc1MCUgMTAwJScsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnNTAlIDEwMCUnXG4gIH1cbn0pO1xuY29uc3Qgem9vbURvd25PdXQgPSBleHBvcnRzLnpvb21Eb3duT3V0ID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50Wm9vbURvd25PdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnNTAlIDEwMCUnXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzUwJSAxMDAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuY29uc3Qgem9vbU1vdGlvbiA9IHtcbiAgem9vbToge1xuICAgIGluS2V5ZnJhbWVzOiB6b29tSW4sXG4gICAgb3V0S2V5ZnJhbWVzOiB6b29tT3V0XG4gIH0sXG4gICd6b29tLWJpZyc6IHtcbiAgICBpbktleWZyYW1lczogem9vbUJpZ0luLFxuICAgIG91dEtleWZyYW1lczogem9vbUJpZ091dFxuICB9LFxuICAnem9vbS1iaWctZmFzdCc6IHtcbiAgICBpbktleWZyYW1lczogem9vbUJpZ0luLFxuICAgIG91dEtleWZyYW1lczogem9vbUJpZ091dFxuICB9LFxuICAnem9vbS1sZWZ0Jzoge1xuICAgIGluS2V5ZnJhbWVzOiB6b29tTGVmdEluLFxuICAgIG91dEtleWZyYW1lczogem9vbUxlZnRPdXRcbiAgfSxcbiAgJ3pvb20tcmlnaHQnOiB7XG4gICAgaW5LZXlmcmFtZXM6IHpvb21SaWdodEluLFxuICAgIG91dEtleWZyYW1lczogem9vbVJpZ2h0T3V0XG4gIH0sXG4gICd6b29tLXVwJzoge1xuICAgIGluS2V5ZnJhbWVzOiB6b29tVXBJbixcbiAgICBvdXRLZXlmcmFtZXM6IHpvb21VcE91dFxuICB9LFxuICAnem9vbS1kb3duJzoge1xuICAgIGluS2V5ZnJhbWVzOiB6b29tRG93bkluLFxuICAgIG91dEtleWZyYW1lczogem9vbURvd25PdXRcbiAgfVxufTtcbmNvbnN0IGluaXRab29tTW90aW9uID0gKHRva2VuLCBtb3Rpb25OYW1lKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhbnRDbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBtb3Rpb25DbHMgPSBgJHthbnRDbHN9LSR7bW90aW9uTmFtZX1gO1xuICBjb25zdCB7XG4gICAgaW5LZXlmcmFtZXMsXG4gICAgb3V0S2V5ZnJhbWVzXG4gIH0gPSB6b29tTW90aW9uW21vdGlvbk5hbWVdO1xuICByZXR1cm4gWygwLCBfbW90aW9uLmluaXRNb3Rpb24pKG1vdGlvbkNscywgaW5LZXlmcmFtZXMsIG91dEtleWZyYW1lcywgbW90aW9uTmFtZSA9PT0gJ3pvb20tYmlnLWZhc3QnID8gdG9rZW4ubW90aW9uRHVyYXRpb25GYXN0IDogdG9rZW4ubW90aW9uRHVyYXRpb25NaWQpLCB7XG4gICAgW2BcbiAgICAgICAgJHttb3Rpb25DbHN9LWVudGVyLFxuICAgICAgICAke21vdGlvbkNsc30tYXBwZWFyXG4gICAgICBgXToge1xuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMCknLFxuICAgICAgb3BhY2l0eTogMCxcbiAgICAgIGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOiB0b2tlbi5tb3Rpb25FYXNlT3V0Q2lyYyxcbiAgICAgICcmLXByZXBhcmUnOiB7XG4gICAgICAgIHRyYW5zZm9ybTogJ25vbmUnXG4gICAgICB9XG4gICAgfSxcbiAgICBbYCR7bW90aW9uQ2xzfS1sZWF2ZWBdOiB7XG4gICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogdG9rZW4ubW90aW9uRWFzZUluT3V0Q2lyY1xuICAgIH1cbiAgfV07XG59O1xuZXhwb3J0cy5pbml0Wm9vbU1vdGlvbiA9IGluaXRab29tTW90aW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5NQVhfVkVSVElDQUxfQ09OVEVOVF9SQURJVVMgPSB2b2lkIDA7XG5leHBvcnRzLmRlZmF1bHQgPSBnZXRBcnJvd1N0eWxlO1xuZXhwb3J0cy5nZXRBcnJvd09mZnNldFRva2VuID0gZ2V0QXJyb3dPZmZzZXRUb2tlbjtcbnZhciBfY3NzaW5qcyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jc3NpbmpzXCIpO1xudmFyIF9yb3VuZGVkQXJyb3cgPSByZXF1aXJlKFwiLi9yb3VuZGVkQXJyb3dcIik7XG5jb25zdCBNQVhfVkVSVElDQUxfQ09OVEVOVF9SQURJVVMgPSBleHBvcnRzLk1BWF9WRVJUSUNBTF9DT05URU5UX1JBRElVUyA9IDg7XG5mdW5jdGlvbiBnZXRBcnJvd09mZnNldFRva2VuKG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIGNvbnRlbnRSYWRpdXMsXG4gICAgbGltaXRWZXJ0aWNhbFJhZGl1c1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgYXJyb3dPZmZzZXQgPSBjb250ZW50UmFkaXVzID4gMTIgPyBjb250ZW50UmFkaXVzICsgMiA6IDEyO1xuICBjb25zdCBhcnJvd09mZnNldFZlcnRpY2FsID0gbGltaXRWZXJ0aWNhbFJhZGl1cyA/IE1BWF9WRVJUSUNBTF9DT05URU5UX1JBRElVUyA6IGFycm93T2Zmc2V0O1xuICByZXR1cm4ge1xuICAgIGFycm93T2Zmc2V0SG9yaXpvbnRhbDogYXJyb3dPZmZzZXQsXG4gICAgYXJyb3dPZmZzZXRWZXJ0aWNhbFxuICB9O1xufVxuZnVuY3Rpb24gaXNJbmplY3QodmFsaWQsIGNvZGUpIHtcbiAgaWYgKCF2YWxpZCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICByZXR1cm4gY29kZTtcbn1cbmZ1bmN0aW9uIGdldEFycm93U3R5bGUodG9rZW4sIGNvbG9yQmcsIG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBib3hTaGFkb3dQb3BvdmVyQXJyb3csXG4gICAgYXJyb3dPZmZzZXRWZXJ0aWNhbCxcbiAgICBhcnJvd09mZnNldEhvcml6b250YWxcbiAgfSA9IHRva2VuO1xuICBjb25zdCB7XG4gICAgYXJyb3dEaXN0YW5jZSA9IDAsXG4gICAgYXJyb3dQbGFjZW1lbnQgPSB7XG4gICAgICBsZWZ0OiB0cnVlLFxuICAgICAgcmlnaHQ6IHRydWUsXG4gICAgICB0b3A6IHRydWUsXG4gICAgICBib3R0b206IHRydWVcbiAgICB9XG4gIH0gPSBvcHRpb25zIHx8IHt9O1xuICByZXR1cm4ge1xuICAgIFtjb21wb25lbnRDbHNdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQmFzaWMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tYXJyb3dgXTogW09iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgIGRpc3BsYXk6ICdibG9jaydcbiAgICAgIH0sICgwLCBfcm91bmRlZEFycm93LmdlblJvdW5kZWRBcnJvdykodG9rZW4sIGNvbG9yQmcsIGJveFNoYWRvd1BvcG92ZXJBcnJvdykpLCB7XG4gICAgICAgICcmOmJlZm9yZSc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiBjb2xvckJnXG4gICAgICAgIH1cbiAgICAgIH0pXVxuICAgIH0sIGlzSW5qZWN0KCEhYXJyb3dQbGFjZW1lbnQudG9wLCB7XG4gICAgICBbW2AmLXBsYWNlbWVudC10b3AgPiAke2NvbXBvbmVudENsc30tYXJyb3dgLCBgJi1wbGFjZW1lbnQtdG9wTGVmdCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2AsIGAmLXBsYWNlbWVudC10b3BSaWdodCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdLmpvaW4oJywnKV06IHtcbiAgICAgICAgYm90dG9tOiBhcnJvd0Rpc3RhbmNlLFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDEwMCUpIHJvdGF0ZSgxODBkZWcpJ1xuICAgICAgfSxcbiAgICAgIFtgJi1wbGFjZW1lbnQtdG9wID4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgbGVmdDoge1xuICAgICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogJzUwJSdcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKDEwMCUpIHJvdGF0ZSgxODBkZWcpJ1xuICAgICAgfSxcbiAgICAgICcmLXBsYWNlbWVudC10b3BMZWZ0Jzoge1xuICAgICAgICAnLS1hcnJvdy1vZmZzZXQtaG9yaXpvbnRhbCc6IGFycm93T2Zmc2V0SG9yaXpvbnRhbCxcbiAgICAgICAgW2A+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdOiB7XG4gICAgICAgICAgbGVmdDoge1xuICAgICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IGFycm93T2Zmc2V0SG9yaXpvbnRhbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmLXBsYWNlbWVudC10b3BSaWdodCc6IHtcbiAgICAgICAgJy0tYXJyb3ctb2Zmc2V0LWhvcml6b250YWwnOiBgY2FsYygxMDAlIC0gJHsoMCwgX2Nzc2luanMudW5pdCkoYXJyb3dPZmZzZXRIb3Jpem9udGFsKX0pYCxcbiAgICAgICAgW2A+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdOiB7XG4gICAgICAgICAgcmlnaHQ6IHtcbiAgICAgICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBhcnJvd09mZnNldEhvcml6b250YWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSksIGlzSW5qZWN0KCEhYXJyb3dQbGFjZW1lbnQuYm90dG9tLCB7XG4gICAgICBbW2AmLXBsYWNlbWVudC1ib3R0b20gPiAke2NvbXBvbmVudENsc30tYXJyb3dgLCBgJi1wbGFjZW1lbnQtYm90dG9tTGVmdCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2AsIGAmLXBsYWNlbWVudC1ib3R0b21SaWdodCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdLmpvaW4oJywnKV06IHtcbiAgICAgICAgdG9wOiBhcnJvd0Rpc3RhbmNlLFxuICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKC0xMDAlKWBcbiAgICAgIH0sXG4gICAgICBbYCYtcGxhY2VtZW50LWJvdHRvbSA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdOiB7XG4gICAgICAgIGxlZnQ6IHtcbiAgICAgICAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgICAgICAgdmFsdWU6ICc1MCUnXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtMTAwJSlgXG4gICAgICB9LFxuICAgICAgJyYtcGxhY2VtZW50LWJvdHRvbUxlZnQnOiB7XG4gICAgICAgICctLWFycm93LW9mZnNldC1ob3Jpem9udGFsJzogYXJyb3dPZmZzZXRIb3Jpem9udGFsLFxuICAgICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgICBsZWZ0OiB7XG4gICAgICAgICAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogYXJyb3dPZmZzZXRIb3Jpem9udGFsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYtcGxhY2VtZW50LWJvdHRvbVJpZ2h0Jzoge1xuICAgICAgICAnLS1hcnJvdy1vZmZzZXQtaG9yaXpvbnRhbCc6IGBjYWxjKDEwMCUgLSAkeygwLCBfY3NzaW5qcy51bml0KShhcnJvd09mZnNldEhvcml6b250YWwpfSlgLFxuICAgICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgICByaWdodDoge1xuICAgICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IGFycm93T2Zmc2V0SG9yaXpvbnRhbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKSwgaXNJbmplY3QoISFhcnJvd1BsYWNlbWVudC5sZWZ0LCB7XG4gICAgICBbW2AmLXBsYWNlbWVudC1sZWZ0ID4gJHtjb21wb25lbnRDbHN9LWFycm93YCwgYCYtcGxhY2VtZW50LWxlZnRUb3AgPiAke2NvbXBvbmVudENsc30tYXJyb3dgLCBgJi1wbGFjZW1lbnQtbGVmdEJvdHRvbSA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdLmpvaW4oJywnKV06IHtcbiAgICAgICAgcmlnaHQ6IHtcbiAgICAgICAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgICAgICAgdmFsdWU6IGFycm93RGlzdGFuY2VcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgxMDAlKSByb3RhdGUoOTBkZWcpJ1xuICAgICAgfSxcbiAgICAgIFtgJi1wbGFjZW1lbnQtbGVmdCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdOiB7XG4gICAgICAgIHRvcDoge1xuICAgICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogJzUwJSdcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtNTAlKSB0cmFuc2xhdGVYKDEwMCUpIHJvdGF0ZSg5MGRlZyknXG4gICAgICB9LFxuICAgICAgW2AmLXBsYWNlbWVudC1sZWZ0VG9wID4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgdG9wOiBhcnJvd09mZnNldFZlcnRpY2FsXG4gICAgICB9LFxuICAgICAgW2AmLXBsYWNlbWVudC1sZWZ0Qm90dG9tID4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgYm90dG9tOiBhcnJvd09mZnNldFZlcnRpY2FsXG4gICAgICB9XG4gICAgfSkpLCBpc0luamVjdCghIWFycm93UGxhY2VtZW50LnJpZ2h0LCB7XG4gICAgICBbW2AmLXBsYWNlbWVudC1yaWdodCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2AsIGAmLXBsYWNlbWVudC1yaWdodFRvcCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2AsIGAmLXBsYWNlbWVudC1yaWdodEJvdHRvbSA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdLmpvaW4oJywnKV06IHtcbiAgICAgICAgbGVmdDoge1xuICAgICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogYXJyb3dEaXN0YW5jZVxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC0xMDAlKSByb3RhdGUoLTkwZGVnKSdcbiAgICAgIH0sXG4gICAgICBbYCYtcGxhY2VtZW50LXJpZ2h0ID4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgdG9wOiB7XG4gICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiAnNTAlJ1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC01MCUpIHRyYW5zbGF0ZVgoLTEwMCUpIHJvdGF0ZSgtOTBkZWcpJ1xuICAgICAgfSxcbiAgICAgIFtgJi1wbGFjZW1lbnQtcmlnaHRUb3AgPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICB0b3A6IGFycm93T2Zmc2V0VmVydGljYWxcbiAgICAgIH0sXG4gICAgICBbYCYtcGxhY2VtZW50LXJpZ2h0Qm90dG9tID4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgYm90dG9tOiBhcnJvd09mZnNldFZlcnRpY2FsXG4gICAgICB9XG4gICAgfSkpXG4gIH07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdlblJvdW5kZWRBcnJvdyA9IHZvaWQgMDtcbmV4cG9ydHMuZ2V0QXJyb3dUb2tlbiA9IGdldEFycm93VG9rZW47XG52YXIgX2Nzc2luanMgPSByZXF1aXJlKFwiQGFudC1kZXNpZ24vY3NzaW5qc1wiKTtcbmZ1bmN0aW9uIGdldEFycm93VG9rZW4odG9rZW4pIHtcbiAgY29uc3Qge1xuICAgIHNpemVQb3B1cEFycm93LFxuICAgIGJvcmRlclJhZGl1c1hTLFxuICAgIGJvcmRlclJhZGl1c091dGVyXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgdW5pdFdpZHRoID0gc2l6ZVBvcHVwQXJyb3cgLyAyO1xuICBjb25zdCBheCA9IDA7XG4gIGNvbnN0IGF5ID0gdW5pdFdpZHRoO1xuICBjb25zdCBieCA9IGJvcmRlclJhZGl1c091dGVyICogMSAvIE1hdGguc3FydCgyKTtcbiAgY29uc3QgYnkgPSB1bml0V2lkdGggLSBib3JkZXJSYWRpdXNPdXRlciAqICgxIC0gMSAvIE1hdGguc3FydCgyKSk7XG4gIGNvbnN0IGN4ID0gdW5pdFdpZHRoIC0gYm9yZGVyUmFkaXVzWFMgKiAoMSAvIE1hdGguc3FydCgyKSk7XG4gIGNvbnN0IGN5ID0gYm9yZGVyUmFkaXVzT3V0ZXIgKiAoTWF0aC5zcXJ0KDIpIC0gMSkgKyBib3JkZXJSYWRpdXNYUyAqICgxIC8gTWF0aC5zcXJ0KDIpKTtcbiAgY29uc3QgZHggPSAyICogdW5pdFdpZHRoIC0gY3g7XG4gIGNvbnN0IGR5ID0gY3k7XG4gIGNvbnN0IGV4ID0gMiAqIHVuaXRXaWR0aCAtIGJ4O1xuICBjb25zdCBleSA9IGJ5O1xuICBjb25zdCBmeCA9IDIgKiB1bml0V2lkdGggLSBheDtcbiAgY29uc3QgZnkgPSBheTtcbiAgY29uc3Qgc2hhZG93V2lkdGggPSB1bml0V2lkdGggKiBNYXRoLnNxcnQoMikgKyBib3JkZXJSYWRpdXNPdXRlciAqIChNYXRoLnNxcnQoMikgLSAyKTtcbiAgY29uc3QgcG9seWdvbk9mZnNldCA9IGJvcmRlclJhZGl1c091dGVyICogKE1hdGguc3FydCgyKSAtIDEpO1xuICBjb25zdCBhcnJvd1BvbHlnb24gPSBgcG9seWdvbigke3BvbHlnb25PZmZzZXR9cHggMTAwJSwgNTAlICR7cG9seWdvbk9mZnNldH1weCwgJHsyICogdW5pdFdpZHRoIC0gcG9seWdvbk9mZnNldH1weCAxMDAlLCAke3BvbHlnb25PZmZzZXR9cHggMTAwJSlgO1xuICBjb25zdCBhcnJvd1BhdGggPSBgcGF0aCgnTSAke2F4fSAke2F5fSBBICR7Ym9yZGVyUmFkaXVzT3V0ZXJ9ICR7Ym9yZGVyUmFkaXVzT3V0ZXJ9IDAgMCAwICR7Ynh9ICR7Ynl9IEwgJHtjeH0gJHtjeX0gQSAke2JvcmRlclJhZGl1c1hTfSAke2JvcmRlclJhZGl1c1hTfSAwIDAgMSAke2R4fSAke2R5fSBMICR7ZXh9ICR7ZXl9IEEgJHtib3JkZXJSYWRpdXNPdXRlcn0gJHtib3JkZXJSYWRpdXNPdXRlcn0gMCAwIDAgJHtmeH0gJHtmeX0gWicpYDtcbiAgcmV0dXJuIHtcbiAgICBhcnJvd1NoYWRvd1dpZHRoOiBzaGFkb3dXaWR0aCxcbiAgICBhcnJvd1BhdGgsXG4gICAgYXJyb3dQb2x5Z29uXG4gIH07XG59XG5jb25zdCBnZW5Sb3VuZGVkQXJyb3cgPSAodG9rZW4sIGJnQ29sb3IsIGJveFNoYWRvdykgPT4ge1xuICBjb25zdCB7XG4gICAgc2l6ZVBvcHVwQXJyb3csXG4gICAgYXJyb3dQb2x5Z29uLFxuICAgIGFycm93UGF0aCxcbiAgICBhcnJvd1NoYWRvd1dpZHRoLFxuICAgIGJvcmRlclJhZGl1c1hTLFxuICAgIGNhbGNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICB3aWR0aDogc2l6ZVBvcHVwQXJyb3csXG4gICAgaGVpZ2h0OiBzaXplUG9wdXBBcnJvdyxcbiAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgJyY6OmJlZm9yZSc6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgYm90dG9tOiAwLFxuICAgICAgaW5zZXRJbmxpbmVTdGFydDogMCxcbiAgICAgIHdpZHRoOiBzaXplUG9wdXBBcnJvdyxcbiAgICAgIGhlaWdodDogY2FsYyhzaXplUG9wdXBBcnJvdykuZGl2KDIpLmVxdWFsKCksXG4gICAgICBiYWNrZ3JvdW5kOiBiZ0NvbG9yLFxuICAgICAgY2xpcFBhdGg6IHtcbiAgICAgICAgX211bHRpX3ZhbHVlXzogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IFthcnJvd1BvbHlnb24sIGFycm93UGF0aF1cbiAgICAgIH0sXG4gICAgICBjb250ZW50OiAnXCJcIidcbiAgICB9LFxuICAgICcmOjphZnRlcic6IHtcbiAgICAgIGNvbnRlbnQ6ICdcIlwiJyxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgd2lkdGg6IGFycm93U2hhZG93V2lkdGgsXG4gICAgICBoZWlnaHQ6IGFycm93U2hhZG93V2lkdGgsXG4gICAgICBib3R0b206IDAsXG4gICAgICBpbnNldElubGluZTogMCxcbiAgICAgIG1hcmdpbjogJ2F1dG8nLFxuICAgICAgYm9yZGVyUmFkaXVzOiB7XG4gICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGAwIDAgJHsoMCwgX2Nzc2luanMudW5pdCkoYm9yZGVyUmFkaXVzWFMpfSAwYFxuICAgICAgfSxcbiAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoNTAlKSByb3RhdGUoLTEzNWRlZyknLFxuICAgICAgYm94U2hhZG93LFxuICAgICAgekluZGV4OiAwLFxuICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50J1xuICAgIH1cbiAgfTtcbn07XG5leHBvcnRzLmdlblJvdW5kZWRBcnJvdyA9IGdlblJvdW5kZWRBcnJvdzsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogVGhpcyBpcyBhIHN5bnRhY3RpYyBzdWdhciBmb3IgYGNvbHVtbnNgIHByb3AuIFNvIEhPQyB3aWxsIG5vdCB3b3JrIG9uIHRoaXMuICovXG5jb25zdCBDb2x1bW4gPSBfID0+IG51bGw7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBDb2x1bW47IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuLyoqIFRoaXMgaXMgYSBzeW50YWN0aWMgc3VnYXIgZm9yIGBjb2x1bW5zYCBwcm9wLiBTbyBIT0Mgd2lsbCBub3Qgd29yayBvbiB0aGlzLiAqL1xuY29uc3QgQ29sdW1uR3JvdXAgPSBfID0+IG51bGw7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBDb2x1bW5Hcm91cDsiLCJcInVzZSBzdHJpY3RcIjtcblwidXNlIGNsaWVudFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcbmZ1bmN0aW9uIHJlbmRlckV4cGFuZEljb24obG9jYWxlKSB7XG4gIHJldHVybiBwcm9wcyA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgcHJlZml4Q2xzLFxuICAgICAgb25FeHBhbmQsXG4gICAgICByZWNvcmQsXG4gICAgICBleHBhbmRlZCxcbiAgICAgIGV4cGFuZGFibGVcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3QgaWNvblByZWZpeCA9IGAke3ByZWZpeENsc30tcm93LWV4cGFuZC1pY29uYDtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgIG9uQ2xpY2s6IGUgPT4ge1xuICAgICAgICBvbkV4cGFuZChyZWNvcmQsIGUpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfSxcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGljb25QcmVmaXgsIHtcbiAgICAgICAgW2Ake2ljb25QcmVmaXh9LXNwYWNlZGBdOiAhZXhwYW5kYWJsZSxcbiAgICAgICAgW2Ake2ljb25QcmVmaXh9LWV4cGFuZGVkYF06IGV4cGFuZGFibGUgJiYgZXhwYW5kZWQsXG4gICAgICAgIFtgJHtpY29uUHJlZml4fS1jb2xsYXBzZWRgXTogZXhwYW5kYWJsZSAmJiAhZXhwYW5kZWRcbiAgICAgIH0pLFxuICAgICAgXCJhcmlhLWxhYmVsXCI6IGV4cGFuZGVkID8gbG9jYWxlLmNvbGxhcHNlIDogbG9jYWxlLmV4cGFuZCxcbiAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiBleHBhbmRlZFxuICAgIH0pO1xuICB9O1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gcmVuZGVyRXhwYW5kSWNvbjsiLCJcInVzZSBzdHJpY3RcIjtcblwidXNlIGNsaWVudFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcbnZhciBfcmNUYWJsZSA9IHJlcXVpcmUoXCJyYy10YWJsZVwiKTtcbnZhciBfdXNlQ29sdW1ucyA9IHJlcXVpcmUoXCJyYy10YWJsZS9saWIvaG9va3MvdXNlQ29sdW1uc1wiKTtcbnZhciBfb21pdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL29taXRcIikpO1xudmFyIF91c2VQcm94eUltcGVyYXRpdmVIYW5kbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9fdXRpbC9ob29rcy91c2VQcm94eUltcGVyYXRpdmVIYW5kbGVcIikpO1xudmFyIF9zY3JvbGxUbyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL3Njcm9sbFRvXCIpKTtcbnZhciBfd2FybmluZyA9IHJlcXVpcmUoXCIuLi9fdXRpbC93YXJuaW5nXCIpO1xudmFyIF9jb250ZXh0ID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlci9jb250ZXh0XCIpO1xudmFyIF9kZWZhdWx0UmVuZGVyRW1wdHkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXIvZGVmYXVsdFJlbmRlckVtcHR5XCIpKTtcbnZhciBfdXNlQ1NTVmFyQ2xzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZUNTU1ZhckNsc1wiKSk7XG52YXIgX3VzZVNpemUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlU2l6ZVwiKSk7XG52YXIgX3VzZUJyZWFrcG9pbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9ncmlkL2hvb2tzL3VzZUJyZWFrcG9pbnRcIikpO1xudmFyIF9lbl9VUyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2xvY2FsZS9lbl9VU1wiKSk7XG52YXIgX3BhZ2luYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9wYWdpbmF0aW9uXCIpKTtcbnZhciBfc3BpbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL3NwaW5cIikpO1xudmFyIF9pbnRlcm5hbCA9IHJlcXVpcmUoXCIuLi90aGVtZS9pbnRlcm5hbFwiKTtcbnZhciBfRXhwYW5kSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRXhwYW5kSWNvblwiKSk7XG52YXIgX3VzZUNvbnRhaW5lcldpZHRoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VDb250YWluZXJXaWR0aFwiKSk7XG52YXIgX3VzZUZpbHRlciA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL2hvb2tzL3VzZUZpbHRlclwiKSk7XG52YXIgX3VzZUxhenlLVk1hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlTGF6eUtWTWFwXCIpKTtcbnZhciBfdXNlUGFnaW5hdGlvbiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL2hvb2tzL3VzZVBhZ2luYXRpb25cIikpO1xudmFyIF91c2VTZWxlY3Rpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hvb2tzL3VzZVNlbGVjdGlvblwiKSk7XG52YXIgX3VzZVNvcnRlciA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL2hvb2tzL3VzZVNvcnRlclwiKSk7XG52YXIgX3VzZVRpdGxlQ29sdW1ucyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlVGl0bGVDb2x1bW5zXCIpKTtcbnZhciBfUmNUYWJsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUmNUYWJsZVwiKSk7XG52YXIgX1ZpcnR1YWxUYWJsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUmNUYWJsZS9WaXJ0dWFsVGFibGVcIikpO1xudmFyIF9zdHlsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc3R5bGVcIikpO1xuY29uc3QgRU1QVFlfTElTVCA9IFtdO1xuY29uc3QgSW50ZXJuYWxUYWJsZSA9IChwcm9wcywgcmVmKSA9PiB7XG4gIHZhciBfYSwgX2I7XG4gIGNvbnN0IHtcbiAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVByZWZpeENscyxcbiAgICBjbGFzc05hbWUsXG4gICAgcm9vdENsYXNzTmFtZSxcbiAgICBzdHlsZSxcbiAgICBzaXplOiBjdXN0b21pemVTaXplLFxuICAgIGJvcmRlcmVkLFxuICAgIGRyb3Bkb3duUHJlZml4Q2xzOiBjdXN0b21pemVEcm9wZG93blByZWZpeENscyxcbiAgICBkYXRhU291cmNlLFxuICAgIHBhZ2luYXRpb24sXG4gICAgcm93U2VsZWN0aW9uLFxuICAgIHJvd0tleSA9ICdrZXknLFxuICAgIHJvd0NsYXNzTmFtZSxcbiAgICBjb2x1bW5zLFxuICAgIGNoaWxkcmVuLFxuICAgIGNoaWxkcmVuQ29sdW1uTmFtZTogbGVnYWN5Q2hpbGRyZW5Db2x1bW5OYW1lLFxuICAgIG9uQ2hhbmdlLFxuICAgIGdldFBvcHVwQ29udGFpbmVyLFxuICAgIGxvYWRpbmcsXG4gICAgZXhwYW5kSWNvbixcbiAgICBleHBhbmRhYmxlLFxuICAgIGV4cGFuZGVkUm93UmVuZGVyLFxuICAgIGV4cGFuZEljb25Db2x1bW5JbmRleCxcbiAgICBpbmRlbnRTaXplLFxuICAgIHNjcm9sbCxcbiAgICBzb3J0RGlyZWN0aW9ucyxcbiAgICBsb2NhbGUsXG4gICAgc2hvd1NvcnRlclRvb2x0aXAgPSB7XG4gICAgICB0YXJnZXQ6ICdmdWxsLWhlYWRlcidcbiAgICB9LFxuICAgIHZpcnR1YWxcbiAgfSA9IHByb3BzO1xuICBjb25zdCB3YXJuaW5nID0gKDAsIF93YXJuaW5nLmRldlVzZVdhcm5pbmcpKCdUYWJsZScpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoISh0eXBlb2Ygcm93S2V5ID09PSAnZnVuY3Rpb24nICYmIHJvd0tleS5sZW5ndGggPiAxKSwgJ3VzYWdlJywgJ2BpbmRleGAgcGFyYW1ldGVyIG9mIGByb3dLZXlgIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGl0IHdpbGwgd29yayBhcyBleHBlY3RlZC4nKSA6IHZvaWQgMDtcbiAgfVxuICBjb25zdCBiYXNlQ29sdW1ucyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gY29sdW1ucyB8fCAoMCwgX3VzZUNvbHVtbnMuY29udmVydENoaWxkcmVuVG9Db2x1bW5zKShjaGlsZHJlbiksIFtjb2x1bW5zLCBjaGlsZHJlbl0pO1xuICBjb25zdCBuZWVkUmVzcG9uc2l2ZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gYmFzZUNvbHVtbnMuc29tZShjb2wgPT4gY29sLnJlc3BvbnNpdmUpLCBbYmFzZUNvbHVtbnNdKTtcbiAgY29uc3Qgc2NyZWVucyA9ICgwLCBfdXNlQnJlYWtwb2ludC5kZWZhdWx0KShuZWVkUmVzcG9uc2l2ZSk7XG4gIGNvbnN0IG1lcmdlZENvbHVtbnMgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBtYXRjaGVkID0gbmV3IFNldChPYmplY3Qua2V5cyhzY3JlZW5zKS5maWx0ZXIobSA9PiBzY3JlZW5zW21dKSk7XG4gICAgcmV0dXJuIGJhc2VDb2x1bW5zLmZpbHRlcihjID0+ICFjLnJlc3BvbnNpdmUgfHwgYy5yZXNwb25zaXZlLnNvbWUociA9PiBtYXRjaGVkLmhhcyhyKSkpO1xuICB9LCBbYmFzZUNvbHVtbnMsIHNjcmVlbnNdKTtcbiAgY29uc3QgdGFibGVQcm9wcyA9ICgwLCBfb21pdC5kZWZhdWx0KShwcm9wcywgWydjbGFzc05hbWUnLCAnc3R5bGUnLCAnY29sdW1ucyddKTtcbiAgY29uc3Qge1xuICAgIGxvY2FsZTogY29udGV4dExvY2FsZSA9IF9lbl9VUy5kZWZhdWx0LFxuICAgIGRpcmVjdGlvbixcbiAgICB0YWJsZSxcbiAgICByZW5kZXJFbXB0eSxcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldENvbnRleHRQb3B1cENvbnRhaW5lclxuICB9ID0gUmVhY3QudXNlQ29udGV4dChfY29udGV4dC5Db25maWdDb250ZXh0KTtcbiAgY29uc3QgbWVyZ2VkU2l6ZSA9ICgwLCBfdXNlU2l6ZS5kZWZhdWx0KShjdXN0b21pemVTaXplKTtcbiAgY29uc3QgdGFibGVMb2NhbGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbnRleHRMb2NhbGUuVGFibGUpLCBsb2NhbGUpO1xuICBjb25zdCByYXdEYXRhID0gZGF0YVNvdXJjZSB8fCBFTVBUWV9MSVNUO1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3RhYmxlJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgY29uc3QgZHJvcGRvd25QcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2Ryb3Bkb3duJywgY3VzdG9taXplRHJvcGRvd25QcmVmaXhDbHMpO1xuICBjb25zdCBbLCB0b2tlbl0gPSAoMCwgX2ludGVybmFsLnVzZVRva2VuKSgpO1xuICBjb25zdCByb290Q2xzID0gKDAsIF91c2VDU1NWYXJDbHMuZGVmYXVsdCkocHJlZml4Q2xzKTtcbiAgY29uc3QgW3dyYXBDU1NWYXIsIGhhc2hJZCwgY3NzVmFyQ2xzXSA9ICgwLCBfc3R5bGUuZGVmYXVsdCkocHJlZml4Q2xzLCByb290Q2xzKTtcbiAgY29uc3QgbWVyZ2VkRXhwYW5kYWJsZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgY2hpbGRyZW5Db2x1bW5OYW1lOiBsZWdhY3lDaGlsZHJlbkNvbHVtbk5hbWUsXG4gICAgZXhwYW5kSWNvbkNvbHVtbkluZGV4XG4gIH0sIGV4cGFuZGFibGUpLCB7XG4gICAgZXhwYW5kSWNvbjogKF9hID0gZXhwYW5kYWJsZSA9PT0gbnVsbCB8fCBleHBhbmRhYmxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBleHBhbmRhYmxlLmV4cGFuZEljb24pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IChfYiA9IHRhYmxlID09PSBudWxsIHx8IHRhYmxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0YWJsZS5leHBhbmRhYmxlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZXhwYW5kSWNvblxuICB9KTtcbiAgY29uc3Qge1xuICAgIGNoaWxkcmVuQ29sdW1uTmFtZSA9ICdjaGlsZHJlbidcbiAgfSA9IG1lcmdlZEV4cGFuZGFibGU7XG4gIGNvbnN0IGV4cGFuZFR5cGUgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAocmF3RGF0YS5zb21lKGl0ZW0gPT4gaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpdGVtW2NoaWxkcmVuQ29sdW1uTmFtZV0pKSB7XG4gICAgICByZXR1cm4gJ25lc3QnO1xuICAgIH1cbiAgICBpZiAoZXhwYW5kZWRSb3dSZW5kZXIgfHwgKGV4cGFuZGFibGUgPT09IG51bGwgfHwgZXhwYW5kYWJsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXhwYW5kYWJsZS5leHBhbmRlZFJvd1JlbmRlcikpIHtcbiAgICAgIHJldHVybiAncm93JztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sIFtyYXdEYXRhXSk7XG4gIGNvbnN0IGludGVybmFsUmVmcyA9IHtcbiAgICBib2R5OiBSZWFjdC51c2VSZWYobnVsbClcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXaWR0aCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBnZXRDb250YWluZXJXaWR0aCA9ICgwLCBfdXNlQ29udGFpbmVyV2lkdGguZGVmYXVsdCkocHJlZml4Q2xzKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCByb290UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCB0YmxSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICgwLCBfdXNlUHJveHlJbXBlcmF0aXZlSGFuZGxlLmRlZmF1bHQpKHJlZiwgKCkgPT4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0YmxSZWYuY3VycmVudCksIHtcbiAgICBuYXRpdmVFbGVtZW50OiByb290UmVmLmN1cnJlbnRcbiAgfSkpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJvd0tleSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGdldFJvd0tleSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygcm93S2V5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcm93S2V5O1xuICAgIH1cbiAgICByZXR1cm4gcmVjb3JkID0+IHJlY29yZCA9PT0gbnVsbCB8fCByZWNvcmQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlY29yZFtyb3dLZXldO1xuICB9LCBbcm93S2V5XSk7XG4gIGNvbnN0IFtnZXRSZWNvcmRCeUtleV0gPSAoMCwgX3VzZUxhenlLVk1hcC5kZWZhdWx0KShyYXdEYXRhLCBjaGlsZHJlbkNvbHVtbk5hbWUsIGdldFJvd0tleSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRXZlbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGNoYW5nZUV2ZW50SW5mbyA9IHt9O1xuICBjb25zdCB0cmlnZ2VyT25DaGFuZ2UgPSAoaW5mbywgYWN0aW9uLCByZXNldCA9IGZhbHNlKSA9PiB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIGNvbnN0IGNoYW5nZUluZm8gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNoYW5nZUV2ZW50SW5mbyksIGluZm8pO1xuICAgIGlmIChyZXNldCkge1xuICAgICAgKF9hID0gY2hhbmdlRXZlbnRJbmZvLnJlc2V0UGFnaW5hdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoY2hhbmdlRXZlbnRJbmZvKTtcbiAgICAgIC8vIFJlc2V0IGV2ZW50IHBhcmFtXG4gICAgICBpZiAoKF9iID0gY2hhbmdlSW5mby5wYWdpbmF0aW9uKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY3VycmVudCkge1xuICAgICAgICBjaGFuZ2VJbmZvLnBhZ2luYXRpb24uY3VycmVudCA9IDE7XG4gICAgICB9XG4gICAgICAvLyBUcmlnZ2VyIHBhZ2luYXRpb24gZXZlbnRzXG4gICAgICBpZiAocGFnaW5hdGlvbikge1xuICAgICAgICAoX2MgPSBwYWdpbmF0aW9uLm9uQ2hhbmdlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY2FsbChwYWdpbmF0aW9uLCAxLCAoX2QgPSBjaGFuZ2VJbmZvLnBhZ2luYXRpb24pID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5wYWdlU2l6ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzY3JvbGwgJiYgc2Nyb2xsLnNjcm9sbFRvRmlyc3RSb3dPbkNoYW5nZSAhPT0gZmFsc2UgJiYgaW50ZXJuYWxSZWZzLmJvZHkuY3VycmVudCkge1xuICAgICAgKDAsIF9zY3JvbGxUby5kZWZhdWx0KSgwLCB7XG4gICAgICAgIGdldENvbnRhaW5lcjogKCkgPT4gaW50ZXJuYWxSZWZzLmJvZHkuY3VycmVudFxuICAgICAgfSk7XG4gICAgfVxuICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShjaGFuZ2VJbmZvLnBhZ2luYXRpb24sIGNoYW5nZUluZm8uZmlsdGVycywgY2hhbmdlSW5mby5zb3J0ZXIsIHtcbiAgICAgIGN1cnJlbnREYXRhU291cmNlOiAoMCwgX3VzZUZpbHRlci5nZXRGaWx0ZXJEYXRhKSgoMCwgX3VzZVNvcnRlci5nZXRTb3J0RGF0YSkocmF3RGF0YSwgY2hhbmdlSW5mby5zb3J0ZXJTdGF0ZXMsIGNoaWxkcmVuQ29sdW1uTmFtZSksIGNoYW5nZUluZm8uZmlsdGVyU3RhdGVzLCBjaGlsZHJlbkNvbHVtbk5hbWUpLFxuICAgICAgYWN0aW9uXG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiBDb250cm9sbGVkIHN0YXRlIGluIGBjb2x1bW5zYCBpcyBub3QgYSBnb29kIGlkZWEgdGhhdCBtYWtlcyB0b28gbWFueSBjb2RlICgxMDAwKyBsaW5lPykgdG8gcmVhZFxuICAgKiBzdGF0ZSBvdXQgYW5kIHRoZW4gcHV0IGl0IGJhY2sgdG8gdGl0bGUgcmVuZGVyLiBNb3ZlIHRoZXNlIGNvZGUgaW50byBgaG9va3NgIGJ1dCBzdGlsbCB0b29cbiAgICogY29tcGxleC4gV2Ugc2hvdWxkIHByb3ZpZGVzIFRhYmxlIHByb3BzIGxpa2UgYHNvcnRlcmAgJiBgZmlsdGVyYCB0byBoYW5kbGUgY29udHJvbCBpbiBuZXh0IGJpZ1xuICAgKiB2ZXJzaW9uLlxuICAgKi9cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTb3J0ZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3Qgb25Tb3J0ZXJDaGFuZ2UgPSAoc29ydGVyLCBzb3J0ZXJTdGF0ZXMpID0+IHtcbiAgICB0cmlnZ2VyT25DaGFuZ2Uoe1xuICAgICAgc29ydGVyLFxuICAgICAgc29ydGVyU3RhdGVzXG4gICAgfSwgJ3NvcnQnLCBmYWxzZSk7XG4gIH07XG4gIGNvbnN0IFt0cmFuc2Zvcm1Tb3J0ZXJDb2x1bW5zLCBzb3J0U3RhdGVzLCBzb3J0ZXJUaXRsZVByb3BzLCBnZXRTb3J0ZXJzXSA9ICgwLCBfdXNlU29ydGVyLmRlZmF1bHQpKHtcbiAgICBwcmVmaXhDbHMsXG4gICAgbWVyZ2VkQ29sdW1ucyxcbiAgICBvblNvcnRlckNoYW5nZSxcbiAgICBzb3J0RGlyZWN0aW9uczogc29ydERpcmVjdGlvbnMgfHwgWydhc2NlbmQnLCAnZGVzY2VuZCddLFxuICAgIHRhYmxlTG9jYWxlLFxuICAgIHNob3dTb3J0ZXJUb29sdGlwXG4gIH0pO1xuICBjb25zdCBzb3J0ZWREYXRhID0gUmVhY3QudXNlTWVtbygoKSA9PiAoMCwgX3VzZVNvcnRlci5nZXRTb3J0RGF0YSkocmF3RGF0YSwgc29ydFN0YXRlcywgY2hpbGRyZW5Db2x1bW5OYW1lKSwgW3Jhd0RhdGEsIHNvcnRTdGF0ZXNdKTtcbiAgY2hhbmdlRXZlbnRJbmZvLnNvcnRlciA9IGdldFNvcnRlcnMoKTtcbiAgY2hhbmdlRXZlbnRJbmZvLnNvcnRlclN0YXRlcyA9IHNvcnRTdGF0ZXM7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRmlsdGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3Qgb25GaWx0ZXJDaGFuZ2UgPSAoZmlsdGVycywgZmlsdGVyU3RhdGVzKSA9PiB7XG4gICAgdHJpZ2dlck9uQ2hhbmdlKHtcbiAgICAgIGZpbHRlcnMsXG4gICAgICBmaWx0ZXJTdGF0ZXNcbiAgICB9LCAnZmlsdGVyJywgdHJ1ZSk7XG4gIH07XG4gIGNvbnN0IFt0cmFuc2Zvcm1GaWx0ZXJDb2x1bW5zLCBmaWx0ZXJTdGF0ZXMsIGZpbHRlcnNdID0gKDAsIF91c2VGaWx0ZXIuZGVmYXVsdCkoe1xuICAgIHByZWZpeENscyxcbiAgICBsb2NhbGU6IHRhYmxlTG9jYWxlLFxuICAgIGRyb3Bkb3duUHJlZml4Q2xzLFxuICAgIG1lcmdlZENvbHVtbnMsXG4gICAgb25GaWx0ZXJDaGFuZ2UsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyIHx8IGdldENvbnRleHRQb3B1cENvbnRhaW5lcixcbiAgICByb290Q2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkocm9vdENsYXNzTmFtZSwgcm9vdENscylcbiAgfSk7XG4gIGNvbnN0IG1lcmdlZERhdGEgPSAoMCwgX3VzZUZpbHRlci5nZXRGaWx0ZXJEYXRhKShzb3J0ZWREYXRhLCBmaWx0ZXJTdGF0ZXMsIGNoaWxkcmVuQ29sdW1uTmFtZSk7XG4gIGNoYW5nZUV2ZW50SW5mby5maWx0ZXJzID0gZmlsdGVycztcbiAgY2hhbmdlRXZlbnRJbmZvLmZpbHRlclN0YXRlcyA9IGZpbHRlclN0YXRlcztcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb2x1bW4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBjb2x1bW5UaXRsZVByb3BzID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbWVyZ2VkRmlsdGVycyA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGZpbHRlcnMpLmZvckVhY2goZmlsdGVyS2V5ID0+IHtcbiAgICAgIGlmIChmaWx0ZXJzW2ZpbHRlcktleV0gIT09IG51bGwpIHtcbiAgICAgICAgbWVyZ2VkRmlsdGVyc1tmaWx0ZXJLZXldID0gZmlsdGVyc1tmaWx0ZXJLZXldO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHNvcnRlclRpdGxlUHJvcHMpLCB7XG4gICAgICBmaWx0ZXJzOiBtZXJnZWRGaWx0ZXJzXG4gICAgfSk7XG4gIH0sIFtzb3J0ZXJUaXRsZVByb3BzLCBmaWx0ZXJzXSk7XG4gIGNvbnN0IFt0cmFuc2Zvcm1UaXRsZUNvbHVtbnNdID0gKDAsIF91c2VUaXRsZUNvbHVtbnMuZGVmYXVsdCkoY29sdW1uVGl0bGVQcm9wcyk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFBhZ2luYXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3Qgb25QYWdpbmF0aW9uQ2hhbmdlID0gKGN1cnJlbnQsIHBhZ2VTaXplKSA9PiB7XG4gICAgdHJpZ2dlck9uQ2hhbmdlKHtcbiAgICAgIHBhZ2luYXRpb246IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY2hhbmdlRXZlbnRJbmZvLnBhZ2luYXRpb24pLCB7XG4gICAgICAgIGN1cnJlbnQsXG4gICAgICAgIHBhZ2VTaXplXG4gICAgICB9KVxuICAgIH0sICdwYWdpbmF0ZScpO1xuICB9O1xuICBjb25zdCBbbWVyZ2VkUGFnaW5hdGlvbiwgcmVzZXRQYWdpbmF0aW9uXSA9ICgwLCBfdXNlUGFnaW5hdGlvbi5kZWZhdWx0KShtZXJnZWREYXRhLmxlbmd0aCwgb25QYWdpbmF0aW9uQ2hhbmdlLCBwYWdpbmF0aW9uKTtcbiAgY2hhbmdlRXZlbnRJbmZvLnBhZ2luYXRpb24gPSBwYWdpbmF0aW9uID09PSBmYWxzZSA/IHt9IDogKDAsIF91c2VQYWdpbmF0aW9uLmdldFBhZ2luYXRpb25QYXJhbSkobWVyZ2VkUGFnaW5hdGlvbiwgcGFnaW5hdGlvbik7XG4gIGNoYW5nZUV2ZW50SW5mby5yZXNldFBhZ2luYXRpb24gPSByZXNldFBhZ2luYXRpb247XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IERhdGEgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgcGFnZURhdGEgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAocGFnaW5hdGlvbiA9PT0gZmFsc2UgfHwgIW1lcmdlZFBhZ2luYXRpb24ucGFnZVNpemUpIHtcbiAgICAgIHJldHVybiBtZXJnZWREYXRhO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBjdXJyZW50ID0gMSxcbiAgICAgIHRvdGFsLFxuICAgICAgcGFnZVNpemUgPSBfdXNlUGFnaW5hdGlvbi5ERUZBVUxUX1BBR0VfU0laRVxuICAgIH0gPSBtZXJnZWRQYWdpbmF0aW9uO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoY3VycmVudCA+IDAsICd1c2FnZScsICdgY3VycmVudGAgc2hvdWxkIGJlIHBvc2l0aXZlIG51bWJlci4nKSA6IHZvaWQgMDtcbiAgICAvLyBEeW5hbWljIHRhYmxlIGRhdGFcbiAgICBpZiAobWVyZ2VkRGF0YS5sZW5ndGggPCB0b3RhbCkge1xuICAgICAgaWYgKG1lcmdlZERhdGEubGVuZ3RoID4gcGFnZVNpemUpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgJ3VzYWdlJywgJ2BkYXRhU291cmNlYCBsZW5ndGggaXMgbGVzcyB0aGFuIGBwYWdpbmF0aW9uLnRvdGFsYCBidXQgbGFyZ2UgdGhhbiBgcGFnaW5hdGlvbi5wYWdlU2l6ZWAuIFBsZWFzZSBtYWtlIHN1cmUgeW91ciBjb25maWcgY29ycmVjdCBkYXRhIHdpdGggYXN5bmMgbW9kZS4nKSA6IHZvaWQgMDtcbiAgICAgICAgcmV0dXJuIG1lcmdlZERhdGEuc2xpY2UoKGN1cnJlbnQgLSAxKSAqIHBhZ2VTaXplLCBjdXJyZW50ICogcGFnZVNpemUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1lcmdlZERhdGE7XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWREYXRhLnNsaWNlKChjdXJyZW50IC0gMSkgKiBwYWdlU2l6ZSwgY3VycmVudCAqIHBhZ2VTaXplKTtcbiAgfSwgWyEhcGFnaW5hdGlvbiwgbWVyZ2VkRGF0YSwgbWVyZ2VkUGFnaW5hdGlvbiA9PT0gbnVsbCB8fCBtZXJnZWRQYWdpbmF0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXJnZWRQYWdpbmF0aW9uLmN1cnJlbnQsIG1lcmdlZFBhZ2luYXRpb24gPT09IG51bGwgfHwgbWVyZ2VkUGFnaW5hdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWVyZ2VkUGFnaW5hdGlvbi5wYWdlU2l6ZSwgbWVyZ2VkUGFnaW5hdGlvbiA9PT0gbnVsbCB8fCBtZXJnZWRQYWdpbmF0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXJnZWRQYWdpbmF0aW9uLnRvdGFsXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgW3RyYW5zZm9ybVNlbGVjdGlvbkNvbHVtbnMsIHNlbGVjdGVkS2V5U2V0XSA9ICgwLCBfdXNlU2VsZWN0aW9uLmRlZmF1bHQpKHtcbiAgICBwcmVmaXhDbHMsXG4gICAgZGF0YTogbWVyZ2VkRGF0YSxcbiAgICBwYWdlRGF0YSxcbiAgICBnZXRSb3dLZXksXG4gICAgZ2V0UmVjb3JkQnlLZXksXG4gICAgZXhwYW5kVHlwZSxcbiAgICBjaGlsZHJlbkNvbHVtbk5hbWUsXG4gICAgbG9jYWxlOiB0YWJsZUxvY2FsZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIgfHwgZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyXG4gIH0sIHJvd1NlbGVjdGlvbik7XG4gIGNvbnN0IGludGVybmFsUm93Q2xhc3NOYW1lID0gKHJlY29yZCwgaW5kZXgsIGluZGVudCkgPT4ge1xuICAgIGxldCBtZXJnZWRSb3dDbGFzc05hbWU7XG4gICAgaWYgKHR5cGVvZiByb3dDbGFzc05hbWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG1lcmdlZFJvd0NsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShyb3dDbGFzc05hbWUocmVjb3JkLCBpbmRleCwgaW5kZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlZFJvd0NsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShyb3dDbGFzc05hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHtcbiAgICAgIFtgJHtwcmVmaXhDbHN9LXJvdy1zZWxlY3RlZGBdOiBzZWxlY3RlZEtleVNldC5oYXMoZ2V0Um93S2V5KHJlY29yZCwgaW5kZXgpKVxuICAgIH0sIG1lcmdlZFJvd0NsYXNzTmFtZSk7XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEV4cGFuZGFibGUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUGFzcyBvcmlnaW4gcmVuZGVyIHN0YXR1cyBpbnRvIGByYy10YWJsZWAsIHRoaXMgY2FuIGJlIHJlbW92ZWQgd2hlbiByZWZhY3RvciB3aXRoIGByYy10YWJsZWBcbiAgbWVyZ2VkRXhwYW5kYWJsZS5fX1BBUkVOVF9SRU5ERVJfSUNPTl9fID0gbWVyZ2VkRXhwYW5kYWJsZS5leHBhbmRJY29uO1xuICAvLyBDdXN0b21pemUgZXhwYW5kYWJsZSBpY29uXG4gIG1lcmdlZEV4cGFuZGFibGUuZXhwYW5kSWNvbiA9IG1lcmdlZEV4cGFuZGFibGUuZXhwYW5kSWNvbiB8fCBleHBhbmRJY29uIHx8ICgwLCBfRXhwYW5kSWNvbi5kZWZhdWx0KSh0YWJsZUxvY2FsZSk7XG4gIC8vIEFkanVzdCBleHBhbmQgaWNvbiBpbmRleCwgbm8gb3ZlcndyaXRlIGV4cGFuZEljb25Db2x1bW5JbmRleCBpZiBzZXQuXG4gIGlmIChleHBhbmRUeXBlID09PSAnbmVzdCcgJiYgbWVyZ2VkRXhwYW5kYWJsZS5leHBhbmRJY29uQ29sdW1uSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgIG1lcmdlZEV4cGFuZGFibGUuZXhwYW5kSWNvbkNvbHVtbkluZGV4ID0gcm93U2VsZWN0aW9uID8gMSA6IDA7XG4gIH0gZWxzZSBpZiAobWVyZ2VkRXhwYW5kYWJsZS5leHBhbmRJY29uQ29sdW1uSW5kZXggPiAwICYmIHJvd1NlbGVjdGlvbikge1xuICAgIG1lcmdlZEV4cGFuZGFibGUuZXhwYW5kSWNvbkNvbHVtbkluZGV4IC09IDE7XG4gIH1cbiAgLy8gSW5kZW50IHNpemVcbiAgaWYgKHR5cGVvZiBtZXJnZWRFeHBhbmRhYmxlLmluZGVudFNpemUgIT09ICdudW1iZXInKSB7XG4gICAgbWVyZ2VkRXhwYW5kYWJsZS5pbmRlbnRTaXplID0gdHlwZW9mIGluZGVudFNpemUgPT09ICdudW1iZXInID8gaW5kZW50U2l6ZSA6IDE1O1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgdHJhbnNmb3JtQ29sdW1ucyA9IFJlYWN0LnVzZUNhbGxiYWNrKGlubmVyQ29sdW1ucyA9PiB0cmFuc2Zvcm1UaXRsZUNvbHVtbnModHJhbnNmb3JtU2VsZWN0aW9uQ29sdW1ucyh0cmFuc2Zvcm1GaWx0ZXJDb2x1bW5zKHRyYW5zZm9ybVNvcnRlckNvbHVtbnMoaW5uZXJDb2x1bW5zKSkpKSwgW3RyYW5zZm9ybVNvcnRlckNvbHVtbnMsIHRyYW5zZm9ybUZpbHRlckNvbHVtbnMsIHRyYW5zZm9ybVNlbGVjdGlvbkNvbHVtbnNdKTtcbiAgbGV0IHRvcFBhZ2luYXRpb25Ob2RlO1xuICBsZXQgYm90dG9tUGFnaW5hdGlvbk5vZGU7XG4gIGlmIChwYWdpbmF0aW9uICE9PSBmYWxzZSAmJiAobWVyZ2VkUGFnaW5hdGlvbiA9PT0gbnVsbCB8fCBtZXJnZWRQYWdpbmF0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXJnZWRQYWdpbmF0aW9uLnRvdGFsKSkge1xuICAgIGxldCBwYWdpbmF0aW9uU2l6ZTtcbiAgICBpZiAobWVyZ2VkUGFnaW5hdGlvbi5zaXplKSB7XG4gICAgICBwYWdpbmF0aW9uU2l6ZSA9IG1lcmdlZFBhZ2luYXRpb24uc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFnaW5hdGlvblNpemUgPSBtZXJnZWRTaXplID09PSAnc21hbGwnIHx8IG1lcmdlZFNpemUgPT09ICdtaWRkbGUnID8gJ3NtYWxsJyA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcmVuZGVyUGFnaW5hdGlvbiA9IHBvc2l0aW9uID0+ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfcGFnaW5hdGlvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBtZXJnZWRQYWdpbmF0aW9uLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShgJHtwcmVmaXhDbHN9LXBhZ2luYXRpb24gJHtwcmVmaXhDbHN9LXBhZ2luYXRpb24tJHtwb3NpdGlvbn1gLCBtZXJnZWRQYWdpbmF0aW9uLmNsYXNzTmFtZSksXG4gICAgICBzaXplOiBwYWdpbmF0aW9uU2l6ZVxuICAgIH0pKSk7XG4gICAgY29uc3QgZGVmYXVsdFBvc2l0aW9uID0gZGlyZWN0aW9uID09PSAncnRsJyA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgY29uc3Qge1xuICAgICAgcG9zaXRpb25cbiAgICB9ID0gbWVyZ2VkUGFnaW5hdGlvbjtcbiAgICBpZiAocG9zaXRpb24gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShwb3NpdGlvbikpIHtcbiAgICAgIGNvbnN0IHRvcFBvcyA9IHBvc2l0aW9uLmZpbmQocCA9PiBwLmluY2x1ZGVzKCd0b3AnKSk7XG4gICAgICBjb25zdCBib3R0b21Qb3MgPSBwb3NpdGlvbi5maW5kKHAgPT4gcC5pbmNsdWRlcygnYm90dG9tJykpO1xuICAgICAgY29uc3QgaXNEaXNhYmxlID0gcG9zaXRpb24uZXZlcnkocCA9PiBgJHtwfWAgPT09ICdub25lJyk7XG4gICAgICBpZiAoIXRvcFBvcyAmJiAhYm90dG9tUG9zICYmICFpc0Rpc2FibGUpIHtcbiAgICAgICAgYm90dG9tUGFnaW5hdGlvbk5vZGUgPSByZW5kZXJQYWdpbmF0aW9uKGRlZmF1bHRQb3NpdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAodG9wUG9zKSB7XG4gICAgICAgIHRvcFBhZ2luYXRpb25Ob2RlID0gcmVuZGVyUGFnaW5hdGlvbih0b3BQb3MudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCd0b3AnLCAnJykpO1xuICAgICAgfVxuICAgICAgaWYgKGJvdHRvbVBvcykge1xuICAgICAgICBib3R0b21QYWdpbmF0aW9uTm9kZSA9IHJlbmRlclBhZ2luYXRpb24oYm90dG9tUG9zLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnYm90dG9tJywgJycpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYm90dG9tUGFnaW5hdGlvbk5vZGUgPSByZW5kZXJQYWdpbmF0aW9uKGRlZmF1bHRQb3NpdGlvbik7XG4gICAgfVxuICB9XG4gIC8vID4+Pj4+Pj4+PiBTcGlubmluZ1xuICBsZXQgc3BpblByb3BzO1xuICBpZiAodHlwZW9mIGxvYWRpbmcgPT09ICdib29sZWFuJykge1xuICAgIHNwaW5Qcm9wcyA9IHtcbiAgICAgIHNwaW5uaW5nOiBsb2FkaW5nXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbG9hZGluZyA9PT0gJ29iamVjdCcpIHtcbiAgICBzcGluUHJvcHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIHNwaW5uaW5nOiB0cnVlXG4gICAgfSwgbG9hZGluZyk7XG4gIH1cbiAgY29uc3Qgd3JhcHBlckNsYXNzTmFtZXMgPSAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoY3NzVmFyQ2xzLCByb290Q2xzLCBgJHtwcmVmaXhDbHN9LXdyYXBwZXJgLCB0YWJsZSA9PT0gbnVsbCB8fCB0YWJsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFibGUuY2xhc3NOYW1lLCB7XG4gICAgW2Ake3ByZWZpeENsc30td3JhcHBlci1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJ1xuICB9LCBjbGFzc05hbWUsIHJvb3RDbGFzc05hbWUsIGhhc2hJZCk7XG4gIGNvbnN0IG1lcmdlZFN0eWxlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0YWJsZSA9PT0gbnVsbCB8fCB0YWJsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFibGUuc3R5bGUpLCBzdHlsZSk7XG4gIGNvbnN0IGVtcHR5VGV4dCA9IHR5cGVvZiAobG9jYWxlID09PSBudWxsIHx8IGxvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9jYWxlLmVtcHR5VGV4dCkgIT09ICd1bmRlZmluZWQnID8gbG9jYWxlLmVtcHR5VGV4dCA6IChyZW5kZXJFbXB0eSA9PT0gbnVsbCB8fCByZW5kZXJFbXB0eSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVuZGVyRW1wdHkoJ1RhYmxlJykpIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9kZWZhdWx0UmVuZGVyRW1wdHkuZGVmYXVsdCwge1xuICAgIGNvbXBvbmVudE5hbWU6IFwiVGFibGVcIlxuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IFRhYmxlQ29tcG9uZW50ID0gdmlydHVhbCA/IF9WaXJ0dWFsVGFibGUuZGVmYXVsdCA6IF9SY1RhYmxlLmRlZmF1bHQ7XG4gIC8vID4+PiBWaXJ0dWFsIFRhYmxlIHByb3BzLiBXZSBzZXQgaGVpZ2h0IGhlcmUgc2luY2UgaXQgd2lsbCBhZmZlY3QgaGVpZ2h0IGNvbGxlY3Rpb25cbiAgY29uc3QgdmlydHVhbFByb3BzID0ge307XG4gIGNvbnN0IGxpc3RJdGVtSGVpZ2h0ID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZm9udFNpemUsXG4gICAgICBsaW5lSGVpZ2h0LFxuICAgICAgbGluZVdpZHRoLFxuICAgICAgcGFkZGluZyxcbiAgICAgIHBhZGRpbmdYUyxcbiAgICAgIHBhZGRpbmdTTVxuICAgIH0gPSB0b2tlbjtcbiAgICBjb25zdCBmb250SGVpZ2h0ID0gTWF0aC5mbG9vcihmb250U2l6ZSAqIGxpbmVIZWlnaHQpO1xuICAgIHN3aXRjaCAobWVyZ2VkU2l6ZSkge1xuICAgICAgY2FzZSAnbWlkZGxlJzpcbiAgICAgICAgcmV0dXJuIHBhZGRpbmdTTSAqIDIgKyBmb250SGVpZ2h0ICsgbGluZVdpZHRoO1xuICAgICAgY2FzZSAnc21hbGwnOlxuICAgICAgICByZXR1cm4gcGFkZGluZ1hTICogMiArIGZvbnRIZWlnaHQgKyBsaW5lV2lkdGg7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gcGFkZGluZyAqIDIgKyBmb250SGVpZ2h0ICsgbGluZVdpZHRoO1xuICAgIH1cbiAgfSwgW3Rva2VuLCBtZXJnZWRTaXplXSk7XG4gIGlmICh2aXJ0dWFsKSB7XG4gICAgdmlydHVhbFByb3BzLmxpc3RJdGVtSGVpZ2h0ID0gbGlzdEl0ZW1IZWlnaHQ7XG4gIH1cbiAgcmV0dXJuIHdyYXBDU1NWYXIoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogcm9vdFJlZixcbiAgICBjbGFzc05hbWU6IHdyYXBwZXJDbGFzc05hbWVzLFxuICAgIHN0eWxlOiBtZXJnZWRTdHlsZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfc3Bpbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHtcbiAgICBzcGlubmluZzogZmFsc2VcbiAgfSwgc3BpblByb3BzKSwgdG9wUGFnaW5hdGlvbk5vZGUsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRhYmxlQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCB2aXJ0dWFsUHJvcHMsIHRhYmxlUHJvcHMsIHtcbiAgICByZWY6IHRibFJlZixcbiAgICBjb2x1bW5zOiBtZXJnZWRDb2x1bW5zLFxuICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgIGV4cGFuZGFibGU6IG1lcmdlZEV4cGFuZGFibGUsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoe1xuICAgICAgW2Ake3ByZWZpeENsc30tbWlkZGxlYF06IG1lcmdlZFNpemUgPT09ICdtaWRkbGUnLFxuICAgICAgW2Ake3ByZWZpeENsc30tc21hbGxgXTogbWVyZ2VkU2l6ZSA9PT0gJ3NtYWxsJyxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LWJvcmRlcmVkYF06IGJvcmRlcmVkLFxuICAgICAgW2Ake3ByZWZpeENsc30tZW1wdHlgXTogcmF3RGF0YS5sZW5ndGggPT09IDBcbiAgICB9LCBjc3NWYXJDbHMsIHJvb3RDbHMsIGhhc2hJZCksXG4gICAgZGF0YTogcGFnZURhdGEsXG4gICAgcm93S2V5OiBnZXRSb3dLZXksXG4gICAgcm93Q2xhc3NOYW1lOiBpbnRlcm5hbFJvd0NsYXNzTmFtZSxcbiAgICBlbXB0eVRleHQ6IGVtcHR5VGV4dCxcbiAgICAvLyBJbnRlcm5hbFxuICAgIGludGVybmFsSG9va3M6IF9yY1RhYmxlLklOVEVSTkFMX0hPT0tTLFxuICAgIGludGVybmFsUmVmczogaW50ZXJuYWxSZWZzLFxuICAgIHRyYW5zZm9ybUNvbHVtbnM6IHRyYW5zZm9ybUNvbHVtbnMsXG4gICAgZ2V0Q29udGFpbmVyV2lkdGg6IGdldENvbnRhaW5lcldpZHRoXG4gIH0pKSwgYm90dG9tUGFnaW5hdGlvbk5vZGUpKSk7XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoSW50ZXJuYWxUYWJsZSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cInVzZSBjbGllbnRcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcmNUYWJsZSA9IHJlcXVpcmUoXCJyYy10YWJsZVwiKTtcbi8qKlxuICogU2FtZSBhcyBgcmMtdGFibGVgIGJ1dCB3ZSBtb2RpZnkgdHJpZ2dlciBjaGlsZHJlbiB1cGRhdGUgbG9naWMgaW5zdGVhZC5cbiAqL1xuY29uc3QgUmNWaXJ0dWFsVGFibGUgPSAoMCwgX3JjVGFibGUuZ2VuVmlydHVhbFRhYmxlKSgocHJldiwgbmV4dCkgPT4ge1xuICBjb25zdCB7XG4gICAgX3JlbmRlclRpbWVzOiBwcmV2UmVuZGVyVGltZXNcbiAgfSA9IHByZXY7XG4gIGNvbnN0IHtcbiAgICBfcmVuZGVyVGltZXM6IG5leHRSZW5kZXJUaW1lc1xuICB9ID0gbmV4dDtcbiAgcmV0dXJuIHByZXZSZW5kZXJUaW1lcyAhPT0gbmV4dFJlbmRlclRpbWVzO1xufSk7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBSY1ZpcnR1YWxUYWJsZTsiLCJcInVzZSBzdHJpY3RcIjtcblwidXNlIGNsaWVudFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9yY1RhYmxlID0gcmVxdWlyZShcInJjLXRhYmxlXCIpO1xuLyoqXG4gKiBTYW1lIGFzIGByYy10YWJsZWAgYnV0IHdlIG1vZGlmeSB0cmlnZ2VyIGNoaWxkcmVuIHVwZGF0ZSBsb2dpYyBpbnN0ZWFkLlxuICovXG5jb25zdCBSY1RhYmxlID0gKDAsIF9yY1RhYmxlLmdlblRhYmxlKSgocHJldiwgbmV4dCkgPT4ge1xuICBjb25zdCB7XG4gICAgX3JlbmRlclRpbWVzOiBwcmV2UmVuZGVyVGltZXNcbiAgfSA9IHByZXY7XG4gIGNvbnN0IHtcbiAgICBfcmVuZGVyVGltZXM6IG5leHRSZW5kZXJUaW1lc1xuICB9ID0gbmV4dDtcbiAgcmV0dXJuIHByZXZSZW5kZXJUaW1lcyAhPT0gbmV4dFJlbmRlclRpbWVzO1xufSk7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBSY1RhYmxlOyIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfcmNUYWJsZSA9IHJlcXVpcmUoXCJyYy10YWJsZVwiKTtcbnZhciBfQ29sdW1uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db2x1bW5cIikpO1xudmFyIF9Db2x1bW5Hcm91cCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29sdW1uR3JvdXBcIikpO1xudmFyIF91c2VTZWxlY3Rpb24gPSByZXF1aXJlKFwiLi9ob29rcy91c2VTZWxlY3Rpb25cIik7XG52YXIgX0ludGVybmFsVGFibGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0ludGVybmFsVGFibGVcIikpO1xuY29uc3QgVGFibGUgPSAocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCByZW5kZXJUaW1lc1JlZiA9IFJlYWN0LnVzZVJlZigwKTtcbiAgcmVuZGVyVGltZXNSZWYuY3VycmVudCArPSAxO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0ludGVybmFsVGFibGUuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBfcmVuZGVyVGltZXM6IHJlbmRlclRpbWVzUmVmLmN1cnJlbnRcbiAgfSkpO1xufTtcbmNvbnN0IEZvcndhcmRUYWJsZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFRhYmxlKTtcbkZvcndhcmRUYWJsZS5TRUxFQ1RJT05fQ09MVU1OID0gX3VzZVNlbGVjdGlvbi5TRUxFQ1RJT05fQ09MVU1OO1xuRm9yd2FyZFRhYmxlLkVYUEFORF9DT0xVTU4gPSBfcmNUYWJsZS5FWFBBTkRfQ09MVU1OO1xuRm9yd2FyZFRhYmxlLlNFTEVDVElPTl9BTEwgPSBfdXNlU2VsZWN0aW9uLlNFTEVDVElPTl9BTEw7XG5Gb3J3YXJkVGFibGUuU0VMRUNUSU9OX0lOVkVSVCA9IF91c2VTZWxlY3Rpb24uU0VMRUNUSU9OX0lOVkVSVDtcbkZvcndhcmRUYWJsZS5TRUxFQ1RJT05fTk9ORSA9IF91c2VTZWxlY3Rpb24uU0VMRUNUSU9OX05PTkU7XG5Gb3J3YXJkVGFibGUuQ29sdW1uID0gX0NvbHVtbi5kZWZhdWx0O1xuRm9yd2FyZFRhYmxlLkNvbHVtbkdyb3VwID0gX0NvbHVtbkdyb3VwLmRlZmF1bHQ7XG5Gb3J3YXJkVGFibGUuU3VtbWFyeSA9IF9yY1RhYmxlLlN1bW1hcnk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBGb3J3YXJkVGFibGUuZGlzcGxheU5hbWUgPSAnVGFibGUnO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gRm9yd2FyZFRhYmxlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlQ29udGFpbmVyV2lkdGg7XG5mdW5jdGlvbiB1c2VDb250YWluZXJXaWR0aChwcmVmaXhDbHMpIHtcbiAgY29uc3QgZ2V0Q29udGFpbmVyV2lkdGggPSAoZWxlLCB3aWR0aCkgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsZS5xdWVyeVNlbGVjdG9yKGAuJHtwcmVmaXhDbHN9LWNvbnRhaW5lcmApO1xuICAgIGxldCByZXR1cm5XaWR0aCA9IHdpZHRoO1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpO1xuICAgICAgY29uc3QgYm9yZGVyTGVmdCA9IHBhcnNlSW50KHN0eWxlLmJvcmRlckxlZnRXaWR0aCwgMTApO1xuICAgICAgY29uc3QgYm9yZGVyUmlnaHQgPSBwYXJzZUludChzdHlsZS5ib3JkZXJSaWdodFdpZHRoLCAxMCk7XG4gICAgICByZXR1cm5XaWR0aCA9IHdpZHRoIC0gYm9yZGVyTGVmdCAtIGJvcmRlclJpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuV2lkdGg7XG4gIH07XG4gIHJldHVybiBnZXRDb250YWluZXJXaWR0aDtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblwidXNlIGNsaWVudFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbmV4cG9ydHMuZmxhdHRlbktleXMgPSBmbGF0dGVuS2V5cztcbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9GaWx0ZXJGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9GaWx0ZXJGaWxsZWRcIikpO1xudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG52YXIgX2lzRXF1YWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9pc0VxdWFsXCIpKTtcbnZhciBfZXh0ZW5kc09iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL191dGlsL2V4dGVuZHNPYmplY3RcIikpO1xudmFyIF91c2VTeW5jU3RhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi8uLi9fdXRpbC9ob29rcy91c2VTeW5jU3RhdGVcIikpO1xudmFyIF93YXJuaW5nID0gcmVxdWlyZShcIi4uLy4uLy4uL191dGlsL3dhcm5pbmdcIik7XG52YXIgX2J1dHRvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL2J1dHRvblwiKSk7XG52YXIgX2NoZWNrYm94ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vLi4vY2hlY2tib3hcIikpO1xudmFyIF9jb250ZXh0ID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbmZpZy1wcm92aWRlci9jb250ZXh0XCIpO1xudmFyIF9kcm9wZG93biA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL2Ryb3Bkb3duXCIpKTtcbnZhciBfZW1wdHkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi8uLi9lbXB0eVwiKSk7XG52YXIgX21lbnUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi8uLi9tZW51XCIpKTtcbnZhciBfT3ZlcnJpZGVDb250ZXh0ID0gcmVxdWlyZShcIi4uLy4uLy4uL21lbnUvT3ZlcnJpZGVDb250ZXh0XCIpO1xudmFyIF9yYWRpbyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL3JhZGlvXCIpKTtcbnZhciBfdHJlZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL3RyZWVcIikpO1xudmFyIF9GaWx0ZXJTZWFyY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0ZpbHRlclNlYXJjaFwiKSk7XG52YXIgX0ZpbHRlcldyYXBwZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0ZpbHRlcldyYXBwZXJcIikpO1xuZnVuY3Rpb24gZmxhdHRlbktleXMoZmlsdGVycykge1xuICBsZXQga2V5cyA9IFtdO1xuICAoZmlsdGVycyB8fCBbXSkuZm9yRWFjaCgoe1xuICAgIHZhbHVlLFxuICAgIGNoaWxkcmVuXG4gIH0pID0+IHtcbiAgICBrZXlzLnB1c2godmFsdWUpO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAga2V5cyA9IFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShrZXlzKSwgKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoZmxhdHRlbktleXMoY2hpbGRyZW4pKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGtleXM7XG59XG5mdW5jdGlvbiBoYXNTdWJNZW51KGZpbHRlcnMpIHtcbiAgcmV0dXJuIGZpbHRlcnMuc29tZSgoe1xuICAgIGNoaWxkcmVuXG4gIH0pID0+IGNoaWxkcmVuKTtcbn1cbmZ1bmN0aW9uIHNlYXJjaFZhbHVlTWF0Y2hlZChzZWFyY2hWYWx1ZSwgdGV4dCkge1xuICBpZiAodHlwZW9mIHRleHQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0ZXh0ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB0ZXh0ID09PSBudWxsIHx8IHRleHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiByZW5kZXJGaWx0ZXJJdGVtcyh7XG4gIGZpbHRlcnMsXG4gIHByZWZpeENscyxcbiAgZmlsdGVyZWRLZXlzLFxuICBmaWx0ZXJNdWx0aXBsZSxcbiAgc2VhcmNoVmFsdWUsXG4gIGZpbHRlclNlYXJjaFxufSkge1xuICByZXR1cm4gZmlsdGVycy5tYXAoKGZpbHRlciwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBTdHJpbmcoZmlsdGVyLnZhbHVlKTtcbiAgICBpZiAoZmlsdGVyLmNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXk6IGtleSB8fCBpbmRleCxcbiAgICAgICAgbGFiZWw6IGZpbHRlci50ZXh0LFxuICAgICAgICBwb3B1cENsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1kcm9wZG93bi1zdWJtZW51YCxcbiAgICAgICAgY2hpbGRyZW46IHJlbmRlckZpbHRlckl0ZW1zKHtcbiAgICAgICAgICBmaWx0ZXJzOiBmaWx0ZXIuY2hpbGRyZW4sXG4gICAgICAgICAgcHJlZml4Q2xzLFxuICAgICAgICAgIGZpbHRlcmVkS2V5cyxcbiAgICAgICAgICBmaWx0ZXJNdWx0aXBsZSxcbiAgICAgICAgICBzZWFyY2hWYWx1ZSxcbiAgICAgICAgICBmaWx0ZXJTZWFyY2hcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IENvbXBvbmVudCA9IGZpbHRlck11bHRpcGxlID8gX2NoZWNrYm94LmRlZmF1bHQgOiBfcmFkaW8uZGVmYXVsdDtcbiAgICBjb25zdCBpdGVtID0ge1xuICAgICAga2V5OiBmaWx0ZXIudmFsdWUgIT09IHVuZGVmaW5lZCA/IGtleSA6IGluZGV4LFxuICAgICAgbGFiZWw6ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCB7XG4gICAgICAgIGNoZWNrZWQ6IGZpbHRlcmVkS2V5cy5pbmNsdWRlcyhrZXkpXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGZpbHRlci50ZXh0KSkpXG4gICAgfTtcbiAgICBpZiAoc2VhcmNoVmFsdWUudHJpbSgpKSB7XG4gICAgICBpZiAodHlwZW9mIGZpbHRlclNlYXJjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZmlsdGVyU2VhcmNoKHNlYXJjaFZhbHVlLCBmaWx0ZXIpID8gaXRlbSA6IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VhcmNoVmFsdWVNYXRjaGVkKHNlYXJjaFZhbHVlLCBmaWx0ZXIudGV4dCkgPyBpdGVtIDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW07XG4gIH0pO1xufVxuZnVuY3Rpb24gd3JhcFN0cmluZ0xpc3RUeXBlKGtleXMpIHtcbiAgcmV0dXJuIGtleXMgfHwgW107XG59XG5jb25zdCBGaWx0ZXJEcm9wZG93biA9IHByb3BzID0+IHtcbiAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICBjb25zdCB7XG4gICAgdGFibGVQcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzLFxuICAgIGNvbHVtbixcbiAgICBkcm9wZG93blByZWZpeENscyxcbiAgICBjb2x1bW5LZXksXG4gICAgZmlsdGVyT25DbG9zZSxcbiAgICBmaWx0ZXJNdWx0aXBsZSxcbiAgICBmaWx0ZXJNb2RlID0gJ21lbnUnLFxuICAgIGZpbHRlclNlYXJjaCA9IGZhbHNlLFxuICAgIGZpbHRlclN0YXRlLFxuICAgIHRyaWdnZXJGaWx0ZXIsXG4gICAgbG9jYWxlLFxuICAgIGNoaWxkcmVuLFxuICAgIGdldFBvcHVwQ29udGFpbmVyLFxuICAgIHJvb3RDbGFzc05hbWVcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7XG4gICAgZmlsdGVyUmVzZXRUb0RlZmF1bHRGaWx0ZXJlZFZhbHVlLFxuICAgIGRlZmF1bHRGaWx0ZXJlZFZhbHVlLFxuICAgIGZpbHRlckRyb3Bkb3duUHJvcHMgPSB7fSxcbiAgICAvLyBEZXByZWNhdGVkXG4gICAgZmlsdGVyRHJvcGRvd25PcGVuLFxuICAgIGZpbHRlckRyb3Bkb3duVmlzaWJsZSxcbiAgICBvbkZpbHRlckRyb3Bkb3duVmlzaWJsZUNoYW5nZSxcbiAgICBvbkZpbHRlckRyb3Bkb3duT3BlbkNoYW5nZVxuICB9ID0gY29sdW1uO1xuICBjb25zdCBbdmlzaWJsZSwgc2V0VmlzaWJsZV0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IGZpbHRlcmVkID0gISEoZmlsdGVyU3RhdGUgJiYgKCgoX2EgPSBmaWx0ZXJTdGF0ZS5maWx0ZXJlZEtleXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpIHx8IGZpbHRlclN0YXRlLmZvcmNlRmlsdGVyZWQpKTtcbiAgY29uc3QgdHJpZ2dlclZpc2libGUgPSBuZXdWaXNpYmxlID0+IHtcbiAgICB2YXIgX2E7XG4gICAgc2V0VmlzaWJsZShuZXdWaXNpYmxlKTtcbiAgICAoX2EgPSBmaWx0ZXJEcm9wZG93blByb3BzLm9uT3BlbkNoYW5nZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoZmlsdGVyRHJvcGRvd25Qcm9wcywgbmV3VmlzaWJsZSk7XG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIG9uRmlsdGVyRHJvcGRvd25PcGVuQ2hhbmdlID09PSBudWxsIHx8IG9uRmlsdGVyRHJvcGRvd25PcGVuQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkZpbHRlckRyb3Bkb3duT3BlbkNoYW5nZShuZXdWaXNpYmxlKTtcbiAgICBvbkZpbHRlckRyb3Bkb3duVmlzaWJsZUNoYW5nZSA9PT0gbnVsbCB8fCBvbkZpbHRlckRyb3Bkb3duVmlzaWJsZUNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25GaWx0ZXJEcm9wZG93blZpc2libGVDaGFuZ2UobmV3VmlzaWJsZSk7XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09V2FybmluZz09PT09PT09PT09PT09PT09PT1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB3YXJuaW5nID0gKDAsIF93YXJuaW5nLmRldlVzZVdhcm5pbmcpKCdUYWJsZScpO1xuICAgIGNvbnN0IGRlcHJlY2F0ZWRMaXN0ID0gW1snZmlsdGVyRHJvcGRvd25PcGVuJywgJ2ZpbHRlckRyb3Bkb3duUHJvcHMub3BlbiddLCBbJ2ZpbHRlckRyb3Bkb3duVmlzaWJsZScsICdmaWx0ZXJEcm9wZG93blByb3BzLm9wZW4nXSwgWydvbkZpbHRlckRyb3Bkb3duT3BlbkNoYW5nZScsICdmaWx0ZXJEcm9wZG93blByb3BzLm9uT3BlbkNoYW5nZSddLCBbJ29uRmlsdGVyRHJvcGRvd25WaXNpYmxlQ2hhbmdlJywgJ2ZpbHRlckRyb3Bkb3duUHJvcHMub25PcGVuQ2hhbmdlJ11dO1xuICAgIGRlcHJlY2F0ZWRMaXN0LmZvckVhY2goKFtkZXByZWNhdGVkTmFtZSwgbmV3TmFtZV0pID0+IHtcbiAgICAgIHdhcm5pbmcuZGVwcmVjYXRlZCghKGRlcHJlY2F0ZWROYW1lIGluIGNvbHVtbiksIGRlcHJlY2F0ZWROYW1lLCBuZXdOYW1lKTtcbiAgICB9KTtcbiAgICB3YXJuaW5nLmRlcHJlY2F0ZWQoISgnZmlsdGVyQ2hlY2thbGwnIGluIGxvY2FsZSksICdmaWx0ZXJDaGVja2FsbCcsICdsb2NhbGUuZmlsdGVyQ2hlY2tBbGwnKTtcbiAgfVxuICBjb25zdCBtZXJnZWRWaXNpYmxlID0gKF9kID0gKF9jID0gKF9iID0gZmlsdGVyRHJvcGRvd25Qcm9wcy5vcGVuKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmaWx0ZXJEcm9wZG93bk9wZW4pICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGZpbHRlckRyb3Bkb3duVmlzaWJsZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogdmlzaWJsZTsgLy8gaW5uZXIgc3RhdGVcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IFNlbGVjdCBLZXlzID09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBwcm9wRmlsdGVyZWRLZXlzID0gZmlsdGVyU3RhdGUgPT09IG51bGwgfHwgZmlsdGVyU3RhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpbHRlclN0YXRlLmZpbHRlcmVkS2V5cztcbiAgY29uc3QgW2dldEZpbHRlcmVkS2V5c1N5bmMsIHNldEZpbHRlcmVkS2V5c1N5bmNdID0gKDAsIF91c2VTeW5jU3RhdGUuZGVmYXVsdCkod3JhcFN0cmluZ0xpc3RUeXBlKHByb3BGaWx0ZXJlZEtleXMpKTtcbiAgY29uc3Qgb25TZWxlY3RLZXlzID0gKHtcbiAgICBzZWxlY3RlZEtleXNcbiAgfSkgPT4ge1xuICAgIHNldEZpbHRlcmVkS2V5c1N5bmMoc2VsZWN0ZWRLZXlzKTtcbiAgfTtcbiAgY29uc3Qgb25DaGVjayA9IChrZXlzLCB7XG4gICAgbm9kZSxcbiAgICBjaGVja2VkXG4gIH0pID0+IHtcbiAgICBpZiAoIWZpbHRlck11bHRpcGxlKSB7XG4gICAgICBvblNlbGVjdEtleXMoe1xuICAgICAgICBzZWxlY3RlZEtleXM6IGNoZWNrZWQgJiYgbm9kZS5rZXkgPyBbbm9kZS5rZXldIDogW11cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvblNlbGVjdEtleXMoe1xuICAgICAgICBzZWxlY3RlZEtleXM6IGtleXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgb25TZWxlY3RLZXlzKHtcbiAgICAgIHNlbGVjdGVkS2V5czogd3JhcFN0cmluZ0xpc3RUeXBlKHByb3BGaWx0ZXJlZEtleXMpXG4gICAgfSk7XG4gIH0sIFtwcm9wRmlsdGVyZWRLZXlzXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gT3BlbiBLZXlzID09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgW29wZW5LZXlzLCBzZXRPcGVuS2V5c10gPSBSZWFjdC51c2VTdGF0ZShbXSk7XG4gIGNvbnN0IG9uT3BlbkNoYW5nZSA9IGtleXMgPT4ge1xuICAgIHNldE9wZW5LZXlzKGtleXMpO1xuICB9O1xuICAvLyBzZWFyY2ggaW4gdHJlZSBtb2RlIGNvbHVtbiBmaWx0ZXJcbiAgY29uc3QgW3NlYXJjaFZhbHVlLCBzZXRTZWFyY2hWYWx1ZV0gPSBSZWFjdC51c2VTdGF0ZSgnJyk7XG4gIGNvbnN0IG9uU2VhcmNoID0gZSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgdmFsdWVcbiAgICB9ID0gZS50YXJnZXQ7XG4gICAgc2V0U2VhcmNoVmFsdWUodmFsdWUpO1xuICB9O1xuICAvLyBjbGVhciBzZWFyY2ggdmFsdWUgYWZ0ZXIgY2xvc2UgZmlsdGVyIGRyb3Bkb3duXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCF2aXNpYmxlKSB7XG4gICAgICBzZXRTZWFyY2hWYWx1ZSgnJyk7XG4gICAgfVxuICB9LCBbdmlzaWJsZV0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBTdWJtaXQgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGludGVybmFsVHJpZ2dlckZpbHRlciA9IGtleXMgPT4ge1xuICAgIGNvbnN0IG1lcmdlZEtleXMgPSAoa2V5cyA9PT0gbnVsbCB8fCBrZXlzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBrZXlzLmxlbmd0aCkgPyBrZXlzIDogbnVsbDtcbiAgICBpZiAobWVyZ2VkS2V5cyA9PT0gbnVsbCAmJiAoIWZpbHRlclN0YXRlIHx8ICFmaWx0ZXJTdGF0ZS5maWx0ZXJlZEtleXMpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKCgwLCBfaXNFcXVhbC5kZWZhdWx0KShtZXJnZWRLZXlzLCBmaWx0ZXJTdGF0ZSA9PT0gbnVsbCB8fCBmaWx0ZXJTdGF0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmlsdGVyU3RhdGUuZmlsdGVyZWRLZXlzLCB0cnVlKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRyaWdnZXJGaWx0ZXIoe1xuICAgICAgY29sdW1uLFxuICAgICAga2V5OiBjb2x1bW5LZXksXG4gICAgICBmaWx0ZXJlZEtleXM6IG1lcmdlZEtleXNcbiAgICB9KTtcbiAgfTtcbiAgY29uc3Qgb25Db25maXJtID0gKCkgPT4ge1xuICAgIHRyaWdnZXJWaXNpYmxlKGZhbHNlKTtcbiAgICBpbnRlcm5hbFRyaWdnZXJGaWx0ZXIoZ2V0RmlsdGVyZWRLZXlzU3luYygpKTtcbiAgfTtcbiAgY29uc3Qgb25SZXNldCA9ICh7XG4gICAgY29uZmlybSxcbiAgICBjbG9zZURyb3Bkb3duXG4gIH0gPSB7XG4gICAgY29uZmlybTogZmFsc2UsXG4gICAgY2xvc2VEcm9wZG93bjogZmFsc2VcbiAgfSkgPT4ge1xuICAgIGlmIChjb25maXJtKSB7XG4gICAgICBpbnRlcm5hbFRyaWdnZXJGaWx0ZXIoW10pO1xuICAgIH1cbiAgICBpZiAoY2xvc2VEcm9wZG93bikge1xuICAgICAgdHJpZ2dlclZpc2libGUoZmFsc2UpO1xuICAgIH1cbiAgICBzZXRTZWFyY2hWYWx1ZSgnJyk7XG4gICAgaWYgKGZpbHRlclJlc2V0VG9EZWZhdWx0RmlsdGVyZWRWYWx1ZSkge1xuICAgICAgc2V0RmlsdGVyZWRLZXlzU3luYygoZGVmYXVsdEZpbHRlcmVkVmFsdWUgfHwgW10pLm1hcChrZXkgPT4gU3RyaW5nKGtleSkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RmlsdGVyZWRLZXlzU3luYyhbXSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBkb0ZpbHRlciA9ICh7XG4gICAgY2xvc2VEcm9wZG93blxuICB9ID0ge1xuICAgIGNsb3NlRHJvcGRvd246IHRydWVcbiAgfSkgPT4ge1xuICAgIGlmIChjbG9zZURyb3Bkb3duKSB7XG4gICAgICB0cmlnZ2VyVmlzaWJsZShmYWxzZSk7XG4gICAgfVxuICAgIGludGVybmFsVHJpZ2dlckZpbHRlcihnZXRGaWx0ZXJlZEtleXNTeW5jKCkpO1xuICB9O1xuICBjb25zdCBvblZpc2libGVDaGFuZ2UgPSAobmV3VmlzaWJsZSwgaW5mbykgPT4ge1xuICAgIGlmIChpbmZvLnNvdXJjZSA9PT0gJ3RyaWdnZXInKSB7XG4gICAgICBpZiAobmV3VmlzaWJsZSAmJiBwcm9wRmlsdGVyZWRLZXlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gU3luYyBmaWx0ZXJlZEtleXMgb24gYXBwZWFyIGluIGNvbnRyb2xsZWQgbW9kZSAocHJvcEZpbHRlcmVkS2V5cyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICBzZXRGaWx0ZXJlZEtleXNTeW5jKHdyYXBTdHJpbmdMaXN0VHlwZShwcm9wRmlsdGVyZWRLZXlzKSk7XG4gICAgICB9XG4gICAgICB0cmlnZ2VyVmlzaWJsZShuZXdWaXNpYmxlKTtcbiAgICAgIGlmICghbmV3VmlzaWJsZSAmJiAhY29sdW1uLmZpbHRlckRyb3Bkb3duICYmIGZpbHRlck9uQ2xvc2UpIHtcbiAgICAgICAgb25Db25maXJtKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gU3R5bGUgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGRyb3Bkb3duTWVudUNsYXNzID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHtcbiAgICBbYCR7ZHJvcGRvd25QcmVmaXhDbHN9LW1lbnUtd2l0aG91dC1zdWJtZW51YF06ICFoYXNTdWJNZW51KGNvbHVtbi5maWx0ZXJzIHx8IFtdKVxuICB9KTtcbiAgY29uc3Qgb25DaGVja0FsbCA9IGUgPT4ge1xuICAgIGlmIChlLnRhcmdldC5jaGVja2VkKSB7XG4gICAgICBjb25zdCBhbGxGaWx0ZXJLZXlzID0gZmxhdHRlbktleXMoY29sdW1uID09PSBudWxsIHx8IGNvbHVtbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29sdW1uLmZpbHRlcnMpLm1hcChrZXkgPT4gU3RyaW5nKGtleSkpO1xuICAgICAgc2V0RmlsdGVyZWRLZXlzU3luYyhhbGxGaWx0ZXJLZXlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RmlsdGVyZWRLZXlzU3luYyhbXSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBnZXRUcmVlRGF0YSA9ICh7XG4gICAgZmlsdGVyc1xuICB9KSA9PiAoZmlsdGVycyB8fCBbXSkubWFwKChmaWx0ZXIsIGluZGV4KSA9PiB7XG4gICAgY29uc3Qga2V5ID0gU3RyaW5nKGZpbHRlci52YWx1ZSk7XG4gICAgY29uc3QgaXRlbSA9IHtcbiAgICAgIHRpdGxlOiBmaWx0ZXIudGV4dCxcbiAgICAgIGtleTogZmlsdGVyLnZhbHVlICE9PSB1bmRlZmluZWQgPyBrZXkgOiBTdHJpbmcoaW5kZXgpXG4gICAgfTtcbiAgICBpZiAoZmlsdGVyLmNoaWxkcmVuKSB7XG4gICAgICBpdGVtLmNoaWxkcmVuID0gZ2V0VHJlZURhdGEoe1xuICAgICAgICBmaWx0ZXJzOiBmaWx0ZXIuY2hpbGRyZW5cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbiAgfSk7XG4gIGNvbnN0IGdldEZpbHRlckRhdGEgPSBub2RlID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbm9kZSksIHtcbiAgICAgIHRleHQ6IG5vZGUudGl0bGUsXG4gICAgICB2YWx1ZTogbm9kZS5rZXksXG4gICAgICBjaGlsZHJlbjogKChfYSA9IG5vZGUuY2hpbGRyZW4pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoaXRlbSA9PiBnZXRGaWx0ZXJEYXRhKGl0ZW0pKSkgfHwgW11cbiAgICB9KTtcbiAgfTtcbiAgbGV0IGRyb3Bkb3duQ29udGVudDtcbiAgY29uc3Qge1xuICAgIGRpcmVjdGlvbixcbiAgICByZW5kZXJFbXB0eVxuICB9ID0gUmVhY3QudXNlQ29udGV4dChfY29udGV4dC5Db25maWdDb250ZXh0KTtcbiAgaWYgKHR5cGVvZiBjb2x1bW4uZmlsdGVyRHJvcGRvd24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBkcm9wZG93bkNvbnRlbnQgPSBjb2x1bW4uZmlsdGVyRHJvcGRvd24oe1xuICAgICAgcHJlZml4Q2xzOiBgJHtkcm9wZG93blByZWZpeENsc30tY3VzdG9tYCxcbiAgICAgIHNldFNlbGVjdGVkS2V5czogc2VsZWN0ZWRLZXlzID0+IG9uU2VsZWN0S2V5cyh7XG4gICAgICAgIHNlbGVjdGVkS2V5czogc2VsZWN0ZWRLZXlzXG4gICAgICB9KSxcbiAgICAgIHNlbGVjdGVkS2V5czogZ2V0RmlsdGVyZWRLZXlzU3luYygpLFxuICAgICAgY29uZmlybTogZG9GaWx0ZXIsXG4gICAgICBjbGVhckZpbHRlcnM6IG9uUmVzZXQsXG4gICAgICBmaWx0ZXJzOiBjb2x1bW4uZmlsdGVycyxcbiAgICAgIHZpc2libGU6IG1lcmdlZFZpc2libGUsXG4gICAgICBjbG9zZTogKCkgPT4ge1xuICAgICAgICB0cmlnZ2VyVmlzaWJsZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoY29sdW1uLmZpbHRlckRyb3Bkb3duKSB7XG4gICAgZHJvcGRvd25Db250ZW50ID0gY29sdW1uLmZpbHRlckRyb3Bkb3duO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNlbGVjdGVkS2V5cyA9IGdldEZpbHRlcmVkS2V5c1N5bmMoKSB8fCBbXTtcbiAgICBjb25zdCBnZXRGaWx0ZXJDb21wb25lbnQgPSAoKSA9PiB7XG4gICAgICB2YXIgX2EsIF9iO1xuICAgICAgY29uc3QgZW1wdHkgPSAoX2EgPSByZW5kZXJFbXB0eSA9PT0gbnVsbCB8fCByZW5kZXJFbXB0eSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVuZGVyRW1wdHkoJ1RhYmxlLmZpbHRlcicpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2VtcHR5LmRlZmF1bHQsIHtcbiAgICAgICAgaW1hZ2U6IF9lbXB0eS5kZWZhdWx0LlBSRVNFTlRFRF9JTUFHRV9TSU1QTEUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBsb2NhbGUuZmlsdGVyRW1wdHlUZXh0LFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICBpbWFnZToge1xuICAgICAgICAgICAgaGVpZ2h0OiAyNFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgICAgcGFkZGluZzogJzE2cHggMCdcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgICAgaWYgKChjb2x1bW4uZmlsdGVycyB8fCBbXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBlbXB0eTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWx0ZXJNb2RlID09PSAndHJlZScpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRmlsdGVyU2VhcmNoLmRlZmF1bHQsIHtcbiAgICAgICAgICBmaWx0ZXJTZWFyY2g6IGZpbHRlclNlYXJjaCxcbiAgICAgICAgICB2YWx1ZTogc2VhcmNoVmFsdWUsXG4gICAgICAgICAgb25DaGFuZ2U6IG9uU2VhcmNoLFxuICAgICAgICAgIHRhYmxlUHJlZml4Q2xzOiB0YWJsZVByZWZpeENscyxcbiAgICAgICAgICBsb2NhbGU6IGxvY2FsZVxuICAgICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogYCR7dGFibGVQcmVmaXhDbHN9LWZpbHRlci1kcm9wZG93bi10cmVlYFxuICAgICAgICB9LCBmaWx0ZXJNdWx0aXBsZSA/ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY2hlY2tib3guZGVmYXVsdCwge1xuICAgICAgICAgIGNoZWNrZWQ6IHNlbGVjdGVkS2V5cy5sZW5ndGggPT09IGZsYXR0ZW5LZXlzKGNvbHVtbi5maWx0ZXJzKS5sZW5ndGgsXG4gICAgICAgICAgaW5kZXRlcm1pbmF0ZTogc2VsZWN0ZWRLZXlzLmxlbmd0aCA+IDAgJiYgc2VsZWN0ZWRLZXlzLmxlbmd0aCA8IGZsYXR0ZW5LZXlzKGNvbHVtbi5maWx0ZXJzKS5sZW5ndGgsXG4gICAgICAgICAgY2xhc3NOYW1lOiBgJHt0YWJsZVByZWZpeENsc30tZmlsdGVyLWRyb3Bkb3duLWNoZWNrYWxsYCxcbiAgICAgICAgICBvbkNoYW5nZTogb25DaGVja0FsbFxuICAgICAgICB9LCAoX2IgPSBsb2NhbGUgPT09IG51bGwgfHwgbG9jYWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsb2NhbGUuZmlsdGVyQ2hlY2thbGwpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGxvY2FsZSA9PT0gbnVsbCB8fCBsb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxvY2FsZS5maWx0ZXJDaGVja0FsbCkpIDogbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3RyZWUuZGVmYXVsdCwge1xuICAgICAgICAgIGNoZWNrYWJsZTogdHJ1ZSxcbiAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgICBibG9ja05vZGU6IHRydWUsXG4gICAgICAgICAgbXVsdGlwbGU6IGZpbHRlck11bHRpcGxlLFxuICAgICAgICAgIGNoZWNrU3RyaWN0bHk6ICFmaWx0ZXJNdWx0aXBsZSxcbiAgICAgICAgICBjbGFzc05hbWU6IGAke2Ryb3Bkb3duUHJlZml4Q2xzfS1tZW51YCxcbiAgICAgICAgICBvbkNoZWNrOiBvbkNoZWNrLFxuICAgICAgICAgIGNoZWNrZWRLZXlzOiBzZWxlY3RlZEtleXMsXG4gICAgICAgICAgc2VsZWN0ZWRLZXlzOiBzZWxlY3RlZEtleXMsXG4gICAgICAgICAgc2hvd0ljb246IGZhbHNlLFxuICAgICAgICAgIHRyZWVEYXRhOiBnZXRUcmVlRGF0YSh7XG4gICAgICAgICAgICBmaWx0ZXJzOiBjb2x1bW4uZmlsdGVyc1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGF1dG9FeHBhbmRQYXJlbnQ6IHRydWUsXG4gICAgICAgICAgZGVmYXVsdEV4cGFuZEFsbDogdHJ1ZSxcbiAgICAgICAgICBmaWx0ZXJUcmVlTm9kZTogc2VhcmNoVmFsdWUudHJpbSgpID8gbm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZpbHRlclNlYXJjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyU2VhcmNoKHNlYXJjaFZhbHVlLCBnZXRGaWx0ZXJEYXRhKG5vZGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzZWFyY2hWYWx1ZU1hdGNoZWQoc2VhcmNoVmFsdWUsIG5vZGUudGl0bGUpO1xuICAgICAgICAgIH0gOiB1bmRlZmluZWRcbiAgICAgICAgfSkpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW1zID0gcmVuZGVyRmlsdGVySXRlbXMoe1xuICAgICAgICBmaWx0ZXJzOiBjb2x1bW4uZmlsdGVycyB8fCBbXSxcbiAgICAgICAgZmlsdGVyU2VhcmNoLFxuICAgICAgICBwcmVmaXhDbHMsXG4gICAgICAgIGZpbHRlcmVkS2V5czogZ2V0RmlsdGVyZWRLZXlzU3luYygpLFxuICAgICAgICBmaWx0ZXJNdWx0aXBsZSxcbiAgICAgICAgc2VhcmNoVmFsdWVcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaXNFbXB0eSA9IGl0ZW1zLmV2ZXJ5KGl0ZW0gPT4gaXRlbSA9PT0gbnVsbCk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9GaWx0ZXJTZWFyY2guZGVmYXVsdCwge1xuICAgICAgICBmaWx0ZXJTZWFyY2g6IGZpbHRlclNlYXJjaCxcbiAgICAgICAgdmFsdWU6IHNlYXJjaFZhbHVlLFxuICAgICAgICBvbkNoYW5nZTogb25TZWFyY2gsXG4gICAgICAgIHRhYmxlUHJlZml4Q2xzOiB0YWJsZVByZWZpeENscyxcbiAgICAgICAgbG9jYWxlOiBsb2NhbGVcbiAgICAgIH0pLCBpc0VtcHR5ID8gZW1wdHkgOiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX21lbnUuZGVmYXVsdCwge1xuICAgICAgICBzZWxlY3RhYmxlOiB0cnVlLFxuICAgICAgICBtdWx0aXBsZTogZmlsdGVyTXVsdGlwbGUsXG4gICAgICAgIHByZWZpeENsczogYCR7ZHJvcGRvd25QcmVmaXhDbHN9LW1lbnVgLFxuICAgICAgICBjbGFzc05hbWU6IGRyb3Bkb3duTWVudUNsYXNzLFxuICAgICAgICBvblNlbGVjdDogb25TZWxlY3RLZXlzLFxuICAgICAgICBvbkRlc2VsZWN0OiBvblNlbGVjdEtleXMsXG4gICAgICAgIHNlbGVjdGVkS2V5czogc2VsZWN0ZWRLZXlzLFxuICAgICAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIsXG4gICAgICAgIG9wZW5LZXlzOiBvcGVuS2V5cyxcbiAgICAgICAgb25PcGVuQ2hhbmdlOiBvbk9wZW5DaGFuZ2UsXG4gICAgICAgIGl0ZW1zOiBpdGVtc1xuICAgICAgfSkpKTtcbiAgICB9O1xuICAgIGNvbnN0IGdldFJlc2V0RGlzYWJsZWQgPSAoKSA9PiB7XG4gICAgICBpZiAoZmlsdGVyUmVzZXRUb0RlZmF1bHRGaWx0ZXJlZFZhbHVlKSB7XG4gICAgICAgIHJldHVybiAoMCwgX2lzRXF1YWwuZGVmYXVsdCkoKGRlZmF1bHRGaWx0ZXJlZFZhbHVlIHx8IFtdKS5tYXAoa2V5ID0+IFN0cmluZyhrZXkpKSwgc2VsZWN0ZWRLZXlzLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxlY3RlZEtleXMubGVuZ3RoID09PSAwO1xuICAgIH07XG4gICAgZHJvcGRvd25Db250ZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGdldEZpbHRlckNvbXBvbmVudCgpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30tZHJvcGRvd24tYnRuc2BcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfYnV0dG9uLmRlZmF1bHQsIHtcbiAgICAgIHR5cGU6IFwibGlua1wiLFxuICAgICAgc2l6ZTogXCJzbWFsbFwiLFxuICAgICAgZGlzYWJsZWQ6IGdldFJlc2V0RGlzYWJsZWQoKSxcbiAgICAgIG9uQ2xpY2s6ICgpID0+IG9uUmVzZXQoKVxuICAgIH0sIGxvY2FsZS5maWx0ZXJSZXNldCksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9idXR0b24uZGVmYXVsdCwge1xuICAgICAgdHlwZTogXCJwcmltYXJ5XCIsXG4gICAgICBzaXplOiBcInNtYWxsXCIsXG4gICAgICBvbkNsaWNrOiBvbkNvbmZpcm1cbiAgICB9LCBsb2NhbGUuZmlsdGVyQ29uZmlybSkpKTtcbiAgfVxuICAvLyBXZSBzaG91bGQgbm90IGJsb2NrIGN1c3RvbWl6ZSBNZW51IHdpdGggYWRkaXRpb25hbCBwcm9wc1xuICBpZiAoY29sdW1uLmZpbHRlckRyb3Bkb3duKSB7XG4gICAgZHJvcGRvd25Db250ZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX092ZXJyaWRlQ29udGV4dC5PdmVycmlkZVByb3ZpZGVyLCB7XG4gICAgICBzZWxlY3RhYmxlOiB1bmRlZmluZWRcbiAgICB9LCBkcm9wZG93bkNvbnRlbnQpO1xuICB9XG4gIGRyb3Bkb3duQ29udGVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9GaWx0ZXJXcmFwcGVyLmRlZmF1bHQsIHtcbiAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30tZHJvcGRvd25gXG4gIH0sIGRyb3Bkb3duQ29udGVudCk7XG4gIGNvbnN0IGdldERyb3Bkb3duVHJpZ2dlciA9ICgpID0+IHtcbiAgICBsZXQgZmlsdGVySWNvbjtcbiAgICBpZiAodHlwZW9mIGNvbHVtbi5maWx0ZXJJY29uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmaWx0ZXJJY29uID0gY29sdW1uLmZpbHRlckljb24oZmlsdGVyZWQpO1xuICAgIH0gZWxzZSBpZiAoY29sdW1uLmZpbHRlckljb24pIHtcbiAgICAgIGZpbHRlckljb24gPSBjb2x1bW4uZmlsdGVySWNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsdGVySWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9GaWx0ZXJGaWxsZWQuZGVmYXVsdCwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgcm9sZTogXCJidXR0b25cIixcbiAgICAgIHRhYkluZGV4OiAtMSxcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGAke3ByZWZpeENsc30tdHJpZ2dlcmAsIHtcbiAgICAgICAgYWN0aXZlOiBmaWx0ZXJlZFxuICAgICAgfSksXG4gICAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9LCBmaWx0ZXJJY29uKTtcbiAgfTtcbiAgY29uc3QgbWVyZ2VkRHJvcGRvd25Qcm9wcyA9ICgwLCBfZXh0ZW5kc09iamVjdC5kZWZhdWx0KSh7XG4gICAgdHJpZ2dlcjogWydjbGljayddLFxuICAgIHBsYWNlbWVudDogZGlyZWN0aW9uID09PSAncnRsJyA/ICdib3R0b21MZWZ0JyA6ICdib3R0b21SaWdodCcsXG4gICAgY2hpbGRyZW46IGdldERyb3Bkb3duVHJpZ2dlcigpLFxuICAgIGdldFBvcHVwQ29udGFpbmVyXG4gIH0sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZmlsdGVyRHJvcGRvd25Qcm9wcyksIHtcbiAgICByb290Q2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkocm9vdENsYXNzTmFtZSwgZmlsdGVyRHJvcGRvd25Qcm9wcy5yb290Q2xhc3NOYW1lKSxcbiAgICBvcGVuOiBtZXJnZWRWaXNpYmxlLFxuICAgIG9uT3BlbkNoYW5nZTogb25WaXNpYmxlQ2hhbmdlLFxuICAgIHBvcHVwUmVuZGVyOiAoKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIChmaWx0ZXJEcm9wZG93blByb3BzID09PSBudWxsIHx8IGZpbHRlckRyb3Bkb3duUHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpbHRlckRyb3Bkb3duUHJvcHMuZHJvcGRvd25SZW5kZXIpID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJEcm9wZG93blByb3BzLmRyb3Bkb3duUmVuZGVyKGRyb3Bkb3duQ29udGVudCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZHJvcGRvd25Db250ZW50O1xuICAgIH1cbiAgfSkpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1jb2x1bW5gXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBgJHt0YWJsZVByZWZpeENsc30tY29sdW1uLXRpdGxlYFxuICB9LCBjaGlsZHJlbiksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9kcm9wZG93bi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBtZXJnZWREcm9wZG93blByb3BzKSkpO1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IEZpbHRlckRyb3Bkb3duOyIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfU2VhcmNoT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9TZWFyY2hPdXRsaW5lZFwiKSk7XG52YXIgX0lucHV0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vLi4vaW5wdXQvSW5wdXRcIikpO1xuY29uc3QgRmlsdGVyU2VhcmNoID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgdmFsdWUsXG4gICAgZmlsdGVyU2VhcmNoLFxuICAgIHRhYmxlUHJlZml4Q2xzLFxuICAgIGxvY2FsZSxcbiAgICBvbkNoYW5nZVxuICB9ID0gcHJvcHM7XG4gIGlmICghZmlsdGVyU2VhcmNoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGAke3RhYmxlUHJlZml4Q2xzfS1maWx0ZXItZHJvcGRvd24tc2VhcmNoYFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfSW5wdXQuZGVmYXVsdCwge1xuICAgIHByZWZpeDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1NlYXJjaE91dGxpbmVkLmRlZmF1bHQsIG51bGwpLFxuICAgIHBsYWNlaG9sZGVyOiBsb2NhbGUuZmlsdGVyU2VhcmNoUGxhY2Vob2xkZXIsXG4gICAgb25DaGFuZ2U6IG9uQ2hhbmdlLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAvLyBmb3Igc2tpcCBtaW4td2lkdGggb2YgaW5wdXRcbiAgICBodG1sU2l6ZTogMSxcbiAgICBjbGFzc05hbWU6IGAke3RhYmxlUHJlZml4Q2xzfS1maWx0ZXItZHJvcGRvd24tc2VhcmNoLWlucHV0YFxuICB9KSk7XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gRmlsdGVyU2VhcmNoOyIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfS2V5Q29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0tleUNvZGVcIikpO1xuY29uc3Qgb25LZXlEb3duID0gZXZlbnQgPT4ge1xuICBjb25zdCB7XG4gICAga2V5Q29kZVxuICB9ID0gZXZlbnQ7XG4gIGlmIChrZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LkVOVEVSKSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbn07XG5jb25zdCBGaWx0ZXJEcm9wZG93bk1lbnVXcmFwcGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICBvbkNsaWNrOiBlID0+IGUuc3RvcFByb3BhZ2F0aW9uKCksXG4gIG9uS2V5RG93bjogb25LZXlEb3duLFxuICByZWY6IHJlZlxufSwgcHJvcHMuY2hpbGRyZW4pKSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBGaWx0ZXJEcm9wZG93bk1lbnVXcmFwcGVyLmRpc3BsYXlOYW1lID0gJ0ZpbHRlckRyb3Bkb3duTWVudVdyYXBwZXInO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gRmlsdGVyRHJvcGRvd25NZW51V3JhcHBlcjsiLCJcInVzZSBzdHJpY3RcIjtcblwidXNlIGNsaWVudFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImZsYXR0ZW5LZXlzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9GaWx0ZXJEcm9wZG93bi5mbGF0dGVuS2V5cztcbiAgfVxufSk7XG5leHBvcnRzLmdldEZpbHRlckRhdGEgPSB2b2lkIDA7XG52YXIgX3RvQ29uc3VtYWJsZUFycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIikpO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfd2FybmluZyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9fdXRpbC93YXJuaW5nXCIpO1xudmFyIF91dGlsID0gcmVxdWlyZShcIi4uLy4uL3V0aWxcIik7XG52YXIgX0ZpbHRlckRyb3Bkb3duID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vRmlsdGVyRHJvcGRvd25cIikpO1xuY29uc3QgY29sbGVjdEZpbHRlclN0YXRlcyA9IChjb2x1bW5zLCBpbml0LCBwb3MpID0+IHtcbiAgbGV0IGZpbHRlclN0YXRlcyA9IFtdO1xuICAoY29sdW1ucyB8fCBbXSkuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBjb2x1bW5Qb3MgPSAoMCwgX3V0aWwuZ2V0Q29sdW1uUG9zKShpbmRleCwgcG9zKTtcbiAgICBjb25zdCBmaWx0ZXJEcm9wZG93bklzRGVmaW5lZCA9IGNvbHVtbi5maWx0ZXJEcm9wZG93biAhPT0gdW5kZWZpbmVkO1xuICAgIGlmIChjb2x1bW4uZmlsdGVycyB8fCBmaWx0ZXJEcm9wZG93bklzRGVmaW5lZCB8fCAnb25GaWx0ZXInIGluIGNvbHVtbikge1xuICAgICAgaWYgKCdmaWx0ZXJlZFZhbHVlJyBpbiBjb2x1bW4pIHtcbiAgICAgICAgLy8gQ29udHJvbGxlZFxuICAgICAgICBsZXQgZmlsdGVyZWRWYWx1ZXMgPSBjb2x1bW4uZmlsdGVyZWRWYWx1ZTtcbiAgICAgICAgaWYgKCFmaWx0ZXJEcm9wZG93bklzRGVmaW5lZCkge1xuICAgICAgICAgIGZpbHRlcmVkVmFsdWVzID0gKF9hID0gZmlsdGVyZWRWYWx1ZXMgPT09IG51bGwgfHwgZmlsdGVyZWRWYWx1ZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpbHRlcmVkVmFsdWVzLm1hcChTdHJpbmcpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmaWx0ZXJlZFZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICBmaWx0ZXJTdGF0ZXMucHVzaCh7XG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIGtleTogKDAsIF91dGlsLmdldENvbHVtbktleSkoY29sdW1uLCBjb2x1bW5Qb3MpLFxuICAgICAgICAgIGZpbHRlcmVkS2V5czogZmlsdGVyZWRWYWx1ZXMsXG4gICAgICAgICAgZm9yY2VGaWx0ZXJlZDogY29sdW1uLmZpbHRlcmVkXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVW5jb250cm9sbGVkXG4gICAgICAgIGZpbHRlclN0YXRlcy5wdXNoKHtcbiAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAga2V5OiAoMCwgX3V0aWwuZ2V0Q29sdW1uS2V5KShjb2x1bW4sIGNvbHVtblBvcyksXG4gICAgICAgICAgZmlsdGVyZWRLZXlzOiBpbml0ICYmIGNvbHVtbi5kZWZhdWx0RmlsdGVyZWRWYWx1ZSA/IGNvbHVtbi5kZWZhdWx0RmlsdGVyZWRWYWx1ZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBmb3JjZUZpbHRlcmVkOiBjb2x1bW4uZmlsdGVyZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgnY2hpbGRyZW4nIGluIGNvbHVtbikge1xuICAgICAgZmlsdGVyU3RhdGVzID0gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGZpbHRlclN0YXRlcyksICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGNvbGxlY3RGaWx0ZXJTdGF0ZXMoY29sdW1uLmNoaWxkcmVuLCBpbml0LCBjb2x1bW5Qb3MpKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGZpbHRlclN0YXRlcztcbn07XG5mdW5jdGlvbiBpbmplY3RGaWx0ZXIocHJlZml4Q2xzLCBkcm9wZG93blByZWZpeENscywgY29sdW1ucywgZmlsdGVyU3RhdGVzLCBsb2NhbGUsIHRyaWdnZXJGaWx0ZXIsIGdldFBvcHVwQ29udGFpbmVyLCBwb3MsIHJvb3RDbGFzc05hbWUpIHtcbiAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgY29sdW1uUG9zID0gKDAsIF91dGlsLmdldENvbHVtblBvcykoaW5kZXgsIHBvcyk7XG4gICAgY29uc3Qge1xuICAgICAgZmlsdGVyT25DbG9zZSA9IHRydWUsXG4gICAgICBmaWx0ZXJNdWx0aXBsZSA9IHRydWUsXG4gICAgICBmaWx0ZXJNb2RlLFxuICAgICAgZmlsdGVyU2VhcmNoXG4gICAgfSA9IGNvbHVtbjtcbiAgICBsZXQgbmV3Q29sdW1uID0gY29sdW1uO1xuICAgIGlmIChuZXdDb2x1bW4uZmlsdGVycyB8fCBuZXdDb2x1bW4uZmlsdGVyRHJvcGRvd24pIHtcbiAgICAgIGNvbnN0IGNvbHVtbktleSA9ICgwLCBfdXRpbC5nZXRDb2x1bW5LZXkpKG5ld0NvbHVtbiwgY29sdW1uUG9zKTtcbiAgICAgIGNvbnN0IGZpbHRlclN0YXRlID0gZmlsdGVyU3RhdGVzLmZpbmQoKHtcbiAgICAgICAga2V5XG4gICAgICB9KSA9PiBjb2x1bW5LZXkgPT09IGtleSk7XG4gICAgICBuZXdDb2x1bW4gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG5ld0NvbHVtbiksIHtcbiAgICAgICAgdGl0bGU6IHJlbmRlclByb3BzID0+ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRmlsdGVyRHJvcGRvd24uZGVmYXVsdCwge1xuICAgICAgICAgIHRhYmxlUHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgICAgcHJlZml4Q2xzOiBgJHtwcmVmaXhDbHN9LWZpbHRlcmAsXG4gICAgICAgICAgZHJvcGRvd25QcmVmaXhDbHM6IGRyb3Bkb3duUHJlZml4Q2xzLFxuICAgICAgICAgIGNvbHVtbjogbmV3Q29sdW1uLFxuICAgICAgICAgIGNvbHVtbktleTogY29sdW1uS2V5LFxuICAgICAgICAgIGZpbHRlclN0YXRlOiBmaWx0ZXJTdGF0ZSxcbiAgICAgICAgICBmaWx0ZXJPbkNsb3NlOiBmaWx0ZXJPbkNsb3NlLFxuICAgICAgICAgIGZpbHRlck11bHRpcGxlOiBmaWx0ZXJNdWx0aXBsZSxcbiAgICAgICAgICBmaWx0ZXJNb2RlOiBmaWx0ZXJNb2RlLFxuICAgICAgICAgIGZpbHRlclNlYXJjaDogZmlsdGVyU2VhcmNoLFxuICAgICAgICAgIHRyaWdnZXJGaWx0ZXI6IHRyaWdnZXJGaWx0ZXIsXG4gICAgICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICAgICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgICAgIHJvb3RDbGFzc05hbWU6IHJvb3RDbGFzc05hbWVcbiAgICAgICAgfSwgKDAsIF91dGlsLnJlbmRlckNvbHVtblRpdGxlKShjb2x1bW4udGl0bGUsIHJlbmRlclByb3BzKSkpXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCdjaGlsZHJlbicgaW4gbmV3Q29sdW1uKSB7XG4gICAgICBuZXdDb2x1bW4gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG5ld0NvbHVtbiksIHtcbiAgICAgICAgY2hpbGRyZW46IGluamVjdEZpbHRlcihwcmVmaXhDbHMsIGRyb3Bkb3duUHJlZml4Q2xzLCBuZXdDb2x1bW4uY2hpbGRyZW4sIGZpbHRlclN0YXRlcywgbG9jYWxlLCB0cmlnZ2VyRmlsdGVyLCBnZXRQb3B1cENvbnRhaW5lciwgY29sdW1uUG9zLCByb290Q2xhc3NOYW1lKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH0pO1xufVxuY29uc3QgZ2VuZXJhdGVGaWx0ZXJJbmZvID0gZmlsdGVyU3RhdGVzID0+IHtcbiAgY29uc3QgY3VycmVudEZpbHRlcnMgPSB7fTtcbiAgZmlsdGVyU3RhdGVzLmZvckVhY2goKHtcbiAgICBrZXksXG4gICAgZmlsdGVyZWRLZXlzLFxuICAgIGNvbHVtblxuICB9KSA9PiB7XG4gICAgY29uc3Qga2V5QXNTdHJpbmcgPSBrZXk7XG4gICAgY29uc3Qge1xuICAgICAgZmlsdGVycyxcbiAgICAgIGZpbHRlckRyb3Bkb3duXG4gICAgfSA9IGNvbHVtbjtcbiAgICBpZiAoZmlsdGVyRHJvcGRvd24pIHtcbiAgICAgIGN1cnJlbnRGaWx0ZXJzW2tleUFzU3RyaW5nXSA9IGZpbHRlcmVkS2V5cyB8fCBudWxsO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJlZEtleXMpKSB7XG4gICAgICBjb25zdCBrZXlzID0gKDAsIF9GaWx0ZXJEcm9wZG93bi5mbGF0dGVuS2V5cykoZmlsdGVycyk7XG4gICAgICBjdXJyZW50RmlsdGVyc1trZXlBc1N0cmluZ10gPSBrZXlzLmZpbHRlcihvcmlnaW5LZXkgPT4gZmlsdGVyZWRLZXlzLmluY2x1ZGVzKFN0cmluZyhvcmlnaW5LZXkpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRGaWx0ZXJzW2tleUFzU3RyaW5nXSA9IG51bGw7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGN1cnJlbnRGaWx0ZXJzO1xufTtcbmNvbnN0IGdldEZpbHRlckRhdGEgPSAoZGF0YSwgZmlsdGVyU3RhdGVzLCBjaGlsZHJlbkNvbHVtbk5hbWUpID0+IHtcbiAgY29uc3QgZmlsdGVyRGF0YXMgPSBmaWx0ZXJTdGF0ZXMucmVkdWNlKChjdXJyZW50RGF0YSwgZmlsdGVyU3RhdGUpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBjb2x1bW46IHtcbiAgICAgICAgb25GaWx0ZXIsXG4gICAgICAgIGZpbHRlcnNcbiAgICAgIH0sXG4gICAgICBmaWx0ZXJlZEtleXNcbiAgICB9ID0gZmlsdGVyU3RhdGU7XG4gICAgaWYgKG9uRmlsdGVyICYmIGZpbHRlcmVkS2V5cyAmJiBmaWx0ZXJlZEtleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gY3VycmVudERhdGFcbiAgICAgIC8vIHNoYWxsb3cgY29weVxuICAgICAgLm1hcChyZWNvcmQgPT4gT2JqZWN0LmFzc2lnbih7fSwgcmVjb3JkKSkuZmlsdGVyKHJlY29yZCA9PiBmaWx0ZXJlZEtleXMuc29tZShrZXkgPT4ge1xuICAgICAgICBjb25zdCBrZXlzID0gKDAsIF9GaWx0ZXJEcm9wZG93bi5mbGF0dGVuS2V5cykoZmlsdGVycyk7XG4gICAgICAgIGNvbnN0IGtleUluZGV4ID0ga2V5cy5maW5kSW5kZXgoayA9PiBTdHJpbmcoaykgPT09IFN0cmluZyhrZXkpKTtcbiAgICAgICAgY29uc3QgcmVhbEtleSA9IGtleUluZGV4ICE9PSAtMSA/IGtleXNba2V5SW5kZXhdIDoga2V5O1xuICAgICAgICAvLyBmaWx0ZXIgY2hpbGRyZW5cbiAgICAgICAgaWYgKHJlY29yZFtjaGlsZHJlbkNvbHVtbk5hbWVdKSB7XG4gICAgICAgICAgcmVjb3JkW2NoaWxkcmVuQ29sdW1uTmFtZV0gPSBnZXRGaWx0ZXJEYXRhKHJlY29yZFtjaGlsZHJlbkNvbHVtbk5hbWVdLCBmaWx0ZXJTdGF0ZXMsIGNoaWxkcmVuQ29sdW1uTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9uRmlsdGVyKHJlYWxLZXksIHJlY29yZCk7XG4gICAgICB9KSk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50RGF0YTtcbiAgfSwgZGF0YSk7XG4gIHJldHVybiBmaWx0ZXJEYXRhcztcbn07XG5leHBvcnRzLmdldEZpbHRlckRhdGEgPSBnZXRGaWx0ZXJEYXRhO1xuY29uc3QgZ2V0TWVyZ2VkQ29sdW1ucyA9IHJhd01lcmdlZENvbHVtbnMgPT4gcmF3TWVyZ2VkQ29sdW1ucy5mbGF0TWFwKGNvbHVtbiA9PiB7XG4gIGlmICgnY2hpbGRyZW4nIGluIGNvbHVtbikge1xuICAgIHJldHVybiBbY29sdW1uXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoZ2V0TWVyZ2VkQ29sdW1ucyhjb2x1bW4uY2hpbGRyZW4gfHwgW10pKSk7XG4gIH1cbiAgcmV0dXJuIFtjb2x1bW5dO1xufSk7XG5jb25zdCB1c2VGaWx0ZXIgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICBwcmVmaXhDbHMsXG4gICAgZHJvcGRvd25QcmVmaXhDbHMsXG4gICAgbWVyZ2VkQ29sdW1uczogcmF3TWVyZ2VkQ29sdW1ucyxcbiAgICBvbkZpbHRlckNoYW5nZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lcixcbiAgICBsb2NhbGU6IHRhYmxlTG9jYWxlLFxuICAgIHJvb3RDbGFzc05hbWVcbiAgfSA9IHByb3BzO1xuICBjb25zdCB3YXJuaW5nID0gKDAsIF93YXJuaW5nLmRldlVzZVdhcm5pbmcpKCdUYWJsZScpO1xuICBjb25zdCBtZXJnZWRDb2x1bW5zID0gUmVhY3QudXNlTWVtbygoKSA9PiBnZXRNZXJnZWRDb2x1bW5zKHJhd01lcmdlZENvbHVtbnMgfHwgW10pLCBbcmF3TWVyZ2VkQ29sdW1uc10pO1xuICBjb25zdCBbZmlsdGVyU3RhdGVzLCBzZXRGaWx0ZXJTdGF0ZXNdID0gUmVhY3QudXNlU3RhdGUoKCkgPT4gY29sbGVjdEZpbHRlclN0YXRlcyhtZXJnZWRDb2x1bW5zLCB0cnVlKSk7XG4gIGNvbnN0IG1lcmdlZEZpbHRlclN0YXRlcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGNvbGxlY3RlZFN0YXRlcyA9IGNvbGxlY3RGaWx0ZXJTdGF0ZXMobWVyZ2VkQ29sdW1ucywgZmFsc2UpO1xuICAgIGlmIChjb2xsZWN0ZWRTdGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGVkU3RhdGVzO1xuICAgIH1cbiAgICBsZXQgZmlsdGVyZWRLZXlzSXNBbGxOb3RDb250cm9sbGVkID0gdHJ1ZTtcbiAgICBsZXQgZmlsdGVyZWRLZXlzSXNBbGxDb250cm9sbGVkID0gdHJ1ZTtcbiAgICBjb2xsZWN0ZWRTdGF0ZXMuZm9yRWFjaCgoe1xuICAgICAgZmlsdGVyZWRLZXlzXG4gICAgfSkgPT4ge1xuICAgICAgaWYgKGZpbHRlcmVkS2V5cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZpbHRlcmVkS2V5c0lzQWxsTm90Q29udHJvbGxlZCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlsdGVyZWRLZXlzSXNBbGxDb250cm9sbGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gUmV0dXJuIGlmIG5vdCBjb250cm9sbGVkXG4gICAgaWYgKGZpbHRlcmVkS2V5c0lzQWxsTm90Q29udHJvbGxlZCkge1xuICAgICAgLy8gRmlsdGVyIGNvbHVtbiBtYXkgaGF2ZSBiZWVuIHJlbW92ZWRcbiAgICAgIGNvbnN0IGtleUxpc3QgPSAobWVyZ2VkQ29sdW1ucyB8fCBbXSkubWFwKChjb2x1bW4sIGluZGV4KSA9PiAoMCwgX3V0aWwuZ2V0Q29sdW1uS2V5KShjb2x1bW4sICgwLCBfdXRpbC5nZXRDb2x1bW5Qb3MpKGluZGV4KSkpO1xuICAgICAgcmV0dXJuIGZpbHRlclN0YXRlcy5maWx0ZXIoKHtcbiAgICAgICAga2V5XG4gICAgICB9KSA9PiBrZXlMaXN0LmluY2x1ZGVzKGtleSkpLm1hcChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgY29sID0gbWVyZ2VkQ29sdW1uc1trZXlMaXN0LmZpbmRJbmRleChrZXkgPT4ga2V5ID09PSBpdGVtLmtleSldO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpdGVtKSwge1xuICAgICAgICAgIGNvbHVtbjogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpdGVtLmNvbHVtbiksIGNvbCksXG4gICAgICAgICAgZm9yY2VGaWx0ZXJlZDogY29sLmZpbHRlcmVkXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoZmlsdGVyZWRLZXlzSXNBbGxDb250cm9sbGVkLCAndXNhZ2UnLCAnQ29sdW1ucyBzaG91bGQgYWxsIGNvbnRhaW4gYGZpbHRlcmVkVmFsdWVgIG9yIG5vdCBjb250YWluIGBmaWx0ZXJlZFZhbHVlYC4nKSA6IHZvaWQgMDtcbiAgICByZXR1cm4gY29sbGVjdGVkU3RhdGVzO1xuICB9LCBbbWVyZ2VkQ29sdW1ucywgZmlsdGVyU3RhdGVzXSk7XG4gIGNvbnN0IGZpbHRlcnMgPSBSZWFjdC51c2VNZW1vKCgpID0+IGdlbmVyYXRlRmlsdGVySW5mbyhtZXJnZWRGaWx0ZXJTdGF0ZXMpLCBbbWVyZ2VkRmlsdGVyU3RhdGVzXSk7XG4gIGNvbnN0IHRyaWdnZXJGaWx0ZXIgPSBmaWx0ZXJTdGF0ZSA9PiB7XG4gICAgY29uc3QgbmV3RmlsdGVyU3RhdGVzID0gbWVyZ2VkRmlsdGVyU3RhdGVzLmZpbHRlcigoe1xuICAgICAga2V5XG4gICAgfSkgPT4ga2V5ICE9PSBmaWx0ZXJTdGF0ZS5rZXkpO1xuICAgIG5ld0ZpbHRlclN0YXRlcy5wdXNoKGZpbHRlclN0YXRlKTtcbiAgICBzZXRGaWx0ZXJTdGF0ZXMobmV3RmlsdGVyU3RhdGVzKTtcbiAgICBvbkZpbHRlckNoYW5nZShnZW5lcmF0ZUZpbHRlckluZm8obmV3RmlsdGVyU3RhdGVzKSwgbmV3RmlsdGVyU3RhdGVzKTtcbiAgfTtcbiAgY29uc3QgdHJhbnNmb3JtQ29sdW1ucyA9IGlubmVyQ29sdW1ucyA9PiBpbmplY3RGaWx0ZXIocHJlZml4Q2xzLCBkcm9wZG93blByZWZpeENscywgaW5uZXJDb2x1bW5zLCBtZXJnZWRGaWx0ZXJTdGF0ZXMsIHRhYmxlTG9jYWxlLCB0cmlnZ2VyRmlsdGVyLCBnZXRQb3B1cENvbnRhaW5lciwgdW5kZWZpbmVkLCByb290Q2xhc3NOYW1lKTtcbiAgcmV0dXJuIFt0cmFuc2Zvcm1Db2x1bW5zLCBtZXJnZWRGaWx0ZXJTdGF0ZXMsIGZpbHRlcnNdO1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHVzZUZpbHRlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5jb25zdCB1c2VMYXp5S1ZNYXAgPSAoZGF0YSwgY2hpbGRyZW5Db2x1bW5OYW1lLCBnZXRSb3dLZXkpID0+IHtcbiAgY29uc3QgbWFwQ2FjaGVSZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuICBmdW5jdGlvbiBnZXRSZWNvcmRCeUtleShrZXkpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKCFtYXBDYWNoZVJlZi5jdXJyZW50IHx8IG1hcENhY2hlUmVmLmN1cnJlbnQuZGF0YSAhPT0gZGF0YSB8fCBtYXBDYWNoZVJlZi5jdXJyZW50LmNoaWxkcmVuQ29sdW1uTmFtZSAhPT0gY2hpbGRyZW5Db2x1bW5OYW1lIHx8IG1hcENhY2hlUmVmLmN1cnJlbnQuZ2V0Um93S2V5ICE9PSBnZXRSb3dLZXkpIHtcbiAgICAgIGNvbnN0IGt2TWFwID0gbmV3IE1hcCgpO1xuICAgICAgZnVuY3Rpb24gZGlnKHJlY29yZHMpIHtcbiAgICAgICAgcmVjb3Jkcy5mb3JFYWNoKChyZWNvcmQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3Qgcm93S2V5ID0gZ2V0Um93S2V5KHJlY29yZCwgaW5kZXgpO1xuICAgICAgICAgIGt2TWFwLnNldChyb3dLZXksIHJlY29yZCk7XG4gICAgICAgICAgaWYgKHJlY29yZCAmJiB0eXBlb2YgcmVjb3JkID09PSAnb2JqZWN0JyAmJiBjaGlsZHJlbkNvbHVtbk5hbWUgaW4gcmVjb3JkKSB7XG4gICAgICAgICAgICBkaWcocmVjb3JkW2NoaWxkcmVuQ29sdW1uTmFtZV0gfHwgW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBkaWcoZGF0YSk7XG4gICAgICBtYXBDYWNoZVJlZi5jdXJyZW50ID0ge1xuICAgICAgICBkYXRhLFxuICAgICAgICBjaGlsZHJlbkNvbHVtbk5hbWUsXG4gICAgICAgIGt2TWFwLFxuICAgICAgICBnZXRSb3dLZXlcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiAoX2EgPSBtYXBDYWNoZVJlZi5jdXJyZW50Lmt2TWFwKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0KGtleSk7XG4gIH1cbiAgcmV0dXJuIFtnZXRSZWNvcmRCeUtleV07XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdXNlTGF6eUtWTWFwOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuREVGQVVMVF9QQUdFX1NJWkUgPSB2b2lkIDA7XG5leHBvcnRzLmdldFBhZ2luYXRpb25QYXJhbSA9IGdldFBhZ2luYXRpb25QYXJhbTtcbnZhciBfcmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIik7XG52YXIgX2V4dGVuZHNPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9fdXRpbC9leHRlbmRzT2JqZWN0XCIpKTtcbnZhciBfX3Jlc3QgPSB2b2lkIDAgJiYgKHZvaWQgMCkuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5jb25zdCBERUZBVUxUX1BBR0VfU0laRSA9IGV4cG9ydHMuREVGQVVMVF9QQUdFX1NJWkUgPSAxMDtcbmZ1bmN0aW9uIGdldFBhZ2luYXRpb25QYXJhbShtZXJnZWRQYWdpbmF0aW9uLCBwYWdpbmF0aW9uKSB7XG4gIGNvbnN0IHBhcmFtID0ge1xuICAgIGN1cnJlbnQ6IG1lcmdlZFBhZ2luYXRpb24uY3VycmVudCxcbiAgICBwYWdlU2l6ZTogbWVyZ2VkUGFnaW5hdGlvbi5wYWdlU2l6ZVxuICB9O1xuICBjb25zdCBwYWdpbmF0aW9uT2JqID0gcGFnaW5hdGlvbiAmJiB0eXBlb2YgcGFnaW5hdGlvbiA9PT0gJ29iamVjdCcgPyBwYWdpbmF0aW9uIDoge307XG4gIE9iamVjdC5rZXlzKHBhZ2luYXRpb25PYmopLmZvckVhY2gocGFnZVByb3AgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gbWVyZ2VkUGFnaW5hdGlvbltwYWdlUHJvcF07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGFyYW1bcGFnZVByb3BdID0gdmFsdWU7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHBhcmFtO1xufVxuZnVuY3Rpb24gdXNlUGFnaW5hdGlvbih0b3RhbCwgb25DaGFuZ2UsIHBhZ2luYXRpb24pIHtcbiAgY29uc3QgX2EgPSBwYWdpbmF0aW9uICYmIHR5cGVvZiBwYWdpbmF0aW9uID09PSAnb2JqZWN0JyA/IHBhZ2luYXRpb24gOiB7fSxcbiAgICB7XG4gICAgICB0b3RhbDogcGFnaW5hdGlvblRvdGFsID0gMFxuICAgIH0gPSBfYSxcbiAgICBwYWdpbmF0aW9uT2JqID0gX19yZXN0KF9hLCBbXCJ0b3RhbFwiXSk7XG4gIGNvbnN0IFtpbm5lclBhZ2luYXRpb24sIHNldElubmVyUGFnaW5hdGlvbl0gPSAoMCwgX3JlYWN0LnVzZVN0YXRlKSgoKSA9PiAoe1xuICAgIGN1cnJlbnQ6ICdkZWZhdWx0Q3VycmVudCcgaW4gcGFnaW5hdGlvbk9iaiA/IHBhZ2luYXRpb25PYmouZGVmYXVsdEN1cnJlbnQgOiAxLFxuICAgIHBhZ2VTaXplOiAnZGVmYXVsdFBhZ2VTaXplJyBpbiBwYWdpbmF0aW9uT2JqID8gcGFnaW5hdGlvbk9iai5kZWZhdWx0UGFnZVNpemUgOiBERUZBVUxUX1BBR0VfU0laRVxuICB9KSk7XG4gIC8vID09PT09PT09PT09PSBCYXNpYyBQYWdpbmF0aW9uIENvbmZpZyA9PT09PT09PT09PT1cbiAgY29uc3QgbWVyZ2VkUGFnaW5hdGlvbiA9ICgwLCBfZXh0ZW5kc09iamVjdC5kZWZhdWx0KShpbm5lclBhZ2luYXRpb24sIHBhZ2luYXRpb25PYmosIHtcbiAgICB0b3RhbDogcGFnaW5hdGlvblRvdGFsID4gMCA/IHBhZ2luYXRpb25Ub3RhbCA6IHRvdGFsXG4gIH0pO1xuICAvLyBSZXNldCBgY3VycmVudGAgaWYgZGF0YSBsZW5ndGggb3IgcGFnZVNpemUgY2hhbmdlZFxuICBjb25zdCBtYXhQYWdlID0gTWF0aC5jZWlsKChwYWdpbmF0aW9uVG90YWwgfHwgdG90YWwpIC8gbWVyZ2VkUGFnaW5hdGlvbi5wYWdlU2l6ZSk7XG4gIGlmIChtZXJnZWRQYWdpbmF0aW9uLmN1cnJlbnQgPiBtYXhQYWdlKSB7XG4gICAgLy8gUHJldmVudCBhIG1heGltdW0gcGFnZSBjb3VudCBvZiAwXG4gICAgbWVyZ2VkUGFnaW5hdGlvbi5jdXJyZW50ID0gbWF4UGFnZSB8fCAxO1xuICB9XG4gIGNvbnN0IHJlZnJlc2hQYWdpbmF0aW9uID0gKGN1cnJlbnQsIHBhZ2VTaXplKSA9PiB7XG4gICAgc2V0SW5uZXJQYWdpbmF0aW9uKHtcbiAgICAgIGN1cnJlbnQ6IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudCAhPT0gdm9pZCAwID8gY3VycmVudCA6IDEsXG4gICAgICBwYWdlU2l6ZTogcGFnZVNpemUgfHwgbWVyZ2VkUGFnaW5hdGlvbi5wYWdlU2l6ZVxuICAgIH0pO1xuICB9O1xuICBjb25zdCBvbkludGVybmFsQ2hhbmdlID0gKGN1cnJlbnQsIHBhZ2VTaXplKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChwYWdpbmF0aW9uKSB7XG4gICAgICAoX2EgPSBwYWdpbmF0aW9uLm9uQ2hhbmdlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChwYWdpbmF0aW9uLCBjdXJyZW50LCBwYWdlU2l6ZSk7XG4gICAgfVxuICAgIHJlZnJlc2hQYWdpbmF0aW9uKGN1cnJlbnQsIHBhZ2VTaXplKTtcbiAgICBvbkNoYW5nZShjdXJyZW50LCBwYWdlU2l6ZSB8fCAobWVyZ2VkUGFnaW5hdGlvbiA9PT0gbnVsbCB8fCBtZXJnZWRQYWdpbmF0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXJnZWRQYWdpbmF0aW9uLnBhZ2VTaXplKSk7XG4gIH07XG4gIGlmIChwYWdpbmF0aW9uID09PSBmYWxzZSkge1xuICAgIHJldHVybiBbe30sICgpID0+IHt9XTtcbiAgfVxuICByZXR1cm4gW09iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbWVyZ2VkUGFnaW5hdGlvbiksIHtcbiAgICBvbkNoYW5nZTogb25JbnRlcm5hbENoYW5nZVxuICB9KSwgcmVmcmVzaFBhZ2luYXRpb25dO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdXNlUGFnaW5hdGlvbjsiLCJcInVzZSBzdHJpY3RcIjtcblwidXNlIGNsaWVudFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuU0VMRUNUSU9OX05PTkUgPSBleHBvcnRzLlNFTEVDVElPTl9JTlZFUlQgPSBleHBvcnRzLlNFTEVDVElPTl9DT0xVTU4gPSBleHBvcnRzLlNFTEVDVElPTl9BTEwgPSB2b2lkIDA7XG52YXIgX3RvQ29uc3VtYWJsZUFycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIikpO1xudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgUmVhY3QgPSBfcmVhY3Q7XG52YXIgX0Rvd25PdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Rvd25PdXRsaW5lZFwiKSk7XG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcbnZhciBfcmNUYWJsZSA9IHJlcXVpcmUoXCJyYy10YWJsZVwiKTtcbnZhciBfdXRpbCA9IHJlcXVpcmUoXCJyYy10cmVlL2xpYi91dGlsXCIpO1xudmFyIF9jb25kdWN0VXRpbCA9IHJlcXVpcmUoXCJyYy10cmVlL2xpYi91dGlscy9jb25kdWN0VXRpbFwiKTtcbnZhciBfdHJlZVV0aWwgPSByZXF1aXJlKFwicmMtdHJlZS9saWIvdXRpbHMvdHJlZVV0aWxcIik7XG52YXIgX3VzZU1lcmdlZFN0YXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIikpO1xudmFyIF91c2VNdWx0aXBsZVNlbGVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL191dGlsL2hvb2tzL3VzZU11bHRpcGxlU2VsZWN0XCIpKTtcbnZhciBfd2FybmluZyA9IHJlcXVpcmUoXCIuLi8uLi9fdXRpbC93YXJuaW5nXCIpO1xudmFyIF9jaGVja2JveCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL2NoZWNrYm94XCIpKTtcbnZhciBfZHJvcGRvd24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9kcm9wZG93blwiKSk7XG52YXIgX3JhZGlvID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vcmFkaW9cIikpO1xuLy8gVE9ETzogd2FybmluZyBpZiB1c2UgYWpheCEhIVxuY29uc3QgU0VMRUNUSU9OX0NPTFVNTiA9IGV4cG9ydHMuU0VMRUNUSU9OX0NPTFVNTiA9IHt9O1xuY29uc3QgU0VMRUNUSU9OX0FMTCA9IGV4cG9ydHMuU0VMRUNUSU9OX0FMTCA9ICdTRUxFQ1RfQUxMJztcbmNvbnN0IFNFTEVDVElPTl9JTlZFUlQgPSBleHBvcnRzLlNFTEVDVElPTl9JTlZFUlQgPSAnU0VMRUNUX0lOVkVSVCc7XG5jb25zdCBTRUxFQ1RJT05fTk9ORSA9IGV4cG9ydHMuU0VMRUNUSU9OX05PTkUgPSAnU0VMRUNUX05PTkUnO1xuY29uc3QgRU1QVFlfTElTVCA9IFtdO1xuY29uc3QgZmxhdHRlbkRhdGEgPSAoY2hpbGRyZW5Db2x1bW5OYW1lLCBkYXRhKSA9PiB7XG4gIGxldCBsaXN0ID0gW107XG4gIChkYXRhIHx8IFtdKS5mb3JFYWNoKHJlY29yZCA9PiB7XG4gICAgbGlzdC5wdXNoKHJlY29yZCk7XG4gICAgaWYgKHJlY29yZCAmJiB0eXBlb2YgcmVjb3JkID09PSAnb2JqZWN0JyAmJiBjaGlsZHJlbkNvbHVtbk5hbWUgaW4gcmVjb3JkKSB7XG4gICAgICBsaXN0ID0gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGxpc3QpLCAoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShmbGF0dGVuRGF0YShjaGlsZHJlbkNvbHVtbk5hbWUsIHJlY29yZFtjaGlsZHJlbkNvbHVtbk5hbWVdKSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsaXN0O1xufTtcbmNvbnN0IHVzZVNlbGVjdGlvbiA9IChjb25maWcsIHJvd1NlbGVjdGlvbikgPT4ge1xuICBjb25zdCB7XG4gICAgcHJlc2VydmVTZWxlY3RlZFJvd0tleXMsXG4gICAgc2VsZWN0ZWRSb3dLZXlzLFxuICAgIGRlZmF1bHRTZWxlY3RlZFJvd0tleXMsXG4gICAgZ2V0Q2hlY2tib3hQcm9wcyxcbiAgICBvbkNoYW5nZTogb25TZWxlY3Rpb25DaGFuZ2UsXG4gICAgb25TZWxlY3QsXG4gICAgb25TZWxlY3RBbGwsXG4gICAgb25TZWxlY3RJbnZlcnQsXG4gICAgb25TZWxlY3ROb25lLFxuICAgIG9uU2VsZWN0TXVsdGlwbGUsXG4gICAgY29sdW1uV2lkdGg6IHNlbGVjdGlvbkNvbFdpZHRoLFxuICAgIHR5cGU6IHNlbGVjdGlvblR5cGUsXG4gICAgc2VsZWN0aW9ucyxcbiAgICBmaXhlZCxcbiAgICByZW5kZXJDZWxsOiBjdXN0b21pemVSZW5kZXJDZWxsLFxuICAgIGhpZGVTZWxlY3RBbGwsXG4gICAgY2hlY2tTdHJpY3RseSA9IHRydWVcbiAgfSA9IHJvd1NlbGVjdGlvbiB8fCB7fTtcbiAgY29uc3Qge1xuICAgIHByZWZpeENscyxcbiAgICBkYXRhLFxuICAgIHBhZ2VEYXRhLFxuICAgIGdldFJlY29yZEJ5S2V5LFxuICAgIGdldFJvd0tleSxcbiAgICBleHBhbmRUeXBlLFxuICAgIGNoaWxkcmVuQ29sdW1uTmFtZSxcbiAgICBsb2NhbGU6IHRhYmxlTG9jYWxlLFxuICAgIGdldFBvcHVwQ29udGFpbmVyXG4gIH0gPSBjb25maWc7XG4gIGNvbnN0IHdhcm5pbmcgPSAoMCwgX3dhcm5pbmcuZGV2VXNlV2FybmluZykoJ1RhYmxlJyk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gTXVsdGlwbGVTZWxlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBbbXVsdGlwbGVTZWxlY3QsIHVwZGF0ZVByZXZTZWxlY3RlZEluZGV4XSA9ICgwLCBfdXNlTXVsdGlwbGVTZWxlY3QuZGVmYXVsdCkoaXRlbSA9PiBpdGVtKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBLZXlzID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgW21lcmdlZFNlbGVjdGVkS2V5cywgc2V0TWVyZ2VkU2VsZWN0ZWRLZXlzXSA9ICgwLCBfdXNlTWVyZ2VkU3RhdGUuZGVmYXVsdCkoc2VsZWN0ZWRSb3dLZXlzIHx8IGRlZmF1bHRTZWxlY3RlZFJvd0tleXMgfHwgRU1QVFlfTElTVCwge1xuICAgIHZhbHVlOiBzZWxlY3RlZFJvd0tleXNcbiAgfSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBDYWNoZXMgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHByZXNlcnZlUmVjb3Jkc1JlZiA9IFJlYWN0LnVzZVJlZihuZXcgTWFwKCkpO1xuICBjb25zdCB1cGRhdGVQcmVzZXJ2ZVJlY29yZHNDYWNoZSA9ICgwLCBfcmVhY3QudXNlQ2FsbGJhY2spKGtleXMgPT4ge1xuICAgIGlmIChwcmVzZXJ2ZVNlbGVjdGVkUm93S2V5cykge1xuICAgICAgY29uc3QgbmV3Q2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAvLyBLZWVwIGtleSBpZiBtYXJrIGFzIHByZXNlcnZlU2VsZWN0ZWRSb3dLZXlzXG4gICAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgbGV0IHJlY29yZCA9IGdldFJlY29yZEJ5S2V5KGtleSk7XG4gICAgICAgIGlmICghcmVjb3JkICYmIHByZXNlcnZlUmVjb3Jkc1JlZi5jdXJyZW50LmhhcyhrZXkpKSB7XG4gICAgICAgICAgcmVjb3JkID0gcHJlc2VydmVSZWNvcmRzUmVmLmN1cnJlbnQuZ2V0KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3Q2FjaGUuc2V0KGtleSwgcmVjb3JkKTtcbiAgICAgIH0pO1xuICAgICAgLy8gUmVmcmVzaCB0byBuZXcgY2FjaGVcbiAgICAgIHByZXNlcnZlUmVjb3Jkc1JlZi5jdXJyZW50ID0gbmV3Q2FjaGU7XG4gICAgfVxuICB9LCBbZ2V0UmVjb3JkQnlLZXksIHByZXNlcnZlU2VsZWN0ZWRSb3dLZXlzXSk7XG4gIC8vIFVwZGF0ZSBjYWNoZSB3aXRoIHNlbGVjdGVkS2V5c1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHVwZGF0ZVByZXNlcnZlUmVjb3Jkc0NhY2hlKG1lcmdlZFNlbGVjdGVkS2V5cyk7XG4gIH0sIFttZXJnZWRTZWxlY3RlZEtleXNdKTtcbiAgLy8gR2V0IGZsYXR0ZW4gZGF0YVxuICBjb25zdCBmbGF0dGVkRGF0YSA9ICgwLCBfcmVhY3QudXNlTWVtbykoKCkgPT4gZmxhdHRlbkRhdGEoY2hpbGRyZW5Db2x1bW5OYW1lLCBwYWdlRGF0YSksIFtjaGlsZHJlbkNvbHVtbk5hbWUsIHBhZ2VEYXRhXSk7XG4gIGNvbnN0IHtcbiAgICBrZXlFbnRpdGllc1xuICB9ID0gKDAsIF9yZWFjdC51c2VNZW1vKSgoKSA9PiB7XG4gICAgaWYgKGNoZWNrU3RyaWN0bHkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleUVudGl0aWVzOiBudWxsXG4gICAgICB9O1xuICAgIH1cbiAgICBsZXQgY29udmVydERhdGEgPSBkYXRhO1xuICAgIGlmIChwcmVzZXJ2ZVNlbGVjdGVkUm93S2V5cykge1xuICAgICAgLy8gdXNlIGZsYXR0ZWREYXRhIGtleXNcbiAgICAgIGNvbnN0IGtleXNTZXQgPSBuZXcgU2V0KGZsYXR0ZWREYXRhLm1hcCgocmVjb3JkLCBpbmRleCkgPT4gZ2V0Um93S2V5KHJlY29yZCwgaW5kZXgpKSk7XG4gICAgICAvLyByZW1vdmUgcHJlc2VydmVSZWNvcmRzIHRoYXQgZHVwbGljYXRlIGRhdGFcbiAgICAgIGNvbnN0IHByZXNlcnZlUmVjb3JkcyA9IEFycmF5LmZyb20ocHJlc2VydmVSZWNvcmRzUmVmLmN1cnJlbnQpLnJlZHVjZSgodG90YWwsIFtrZXksIHZhbHVlXSkgPT4ga2V5c1NldC5oYXMoa2V5KSA/IHRvdGFsIDogdG90YWwuY29uY2F0KHZhbHVlKSwgW10pO1xuICAgICAgY29udmVydERhdGEgPSBbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoY29udmVydERhdGEpLCAoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShwcmVzZXJ2ZVJlY29yZHMpKTtcbiAgICB9XG4gICAgcmV0dXJuICgwLCBfdHJlZVV0aWwuY29udmVydERhdGFUb0VudGl0aWVzKShjb252ZXJ0RGF0YSwge1xuICAgICAgZXh0ZXJuYWxHZXRLZXk6IGdldFJvd0tleSxcbiAgICAgIGNoaWxkcmVuUHJvcE5hbWU6IGNoaWxkcmVuQ29sdW1uTmFtZVxuICAgIH0pO1xuICB9LCBbZGF0YSwgZ2V0Um93S2V5LCBjaGVja1N0cmljdGx5LCBjaGlsZHJlbkNvbHVtbk5hbWUsIHByZXNlcnZlU2VsZWN0ZWRSb3dLZXlzLCBmbGF0dGVkRGF0YV0pO1xuICAvLyBHZXQgYWxsIGNoZWNrYm94IHByb3BzXG4gIGNvbnN0IGNoZWNrYm94UHJvcHNNYXAgPSAoMCwgX3JlYWN0LnVzZU1lbW8pKCgpID0+IHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG4gICAgZmxhdHRlZERhdGEuZm9yRWFjaCgocmVjb3JkLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZ2V0Um93S2V5KHJlY29yZCwgaW5kZXgpO1xuICAgICAgY29uc3QgY2hlY2tib3hQcm9wcyA9IChnZXRDaGVja2JveFByb3BzID8gZ2V0Q2hlY2tib3hQcm9wcyhyZWNvcmQpIDogbnVsbCkgfHwge307XG4gICAgICBtYXAuc2V0KGtleSwgY2hlY2tib3hQcm9wcyk7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEoJ2NoZWNrZWQnIGluIGNoZWNrYm94UHJvcHMgfHwgJ2RlZmF1bHRDaGVja2VkJyBpbiBjaGVja2JveFByb3BzKSwgJ3VzYWdlJywgJ0RvIG5vdCBzZXQgYGNoZWNrZWRgIG9yIGBkZWZhdWx0Q2hlY2tlZGAgaW4gYGdldENoZWNrYm94UHJvcHNgLiBQbGVhc2UgdXNlIGBzZWxlY3RlZFJvd0tleXNgIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gICAgfSk7XG4gICAgcmV0dXJuIG1hcDtcbiAgfSwgW2ZsYXR0ZWREYXRhLCBnZXRSb3dLZXksIGdldENoZWNrYm94UHJvcHNdKTtcbiAgY29uc3QgaXNDaGVja2JveERpc2FibGVkID0gKDAsIF9yZWFjdC51c2VDYWxsYmFjaykociA9PiB7XG4gICAgY29uc3Qgcm93S2V5ID0gZ2V0Um93S2V5KHIpO1xuICAgIGxldCBjaGVja2JveFByb3BzO1xuICAgIGlmIChjaGVja2JveFByb3BzTWFwLmhhcyhyb3dLZXkpKSB7XG4gICAgICBjaGVja2JveFByb3BzID0gY2hlY2tib3hQcm9wc01hcC5nZXQoZ2V0Um93S2V5KHIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hlY2tib3hQcm9wcyA9IGdldENoZWNrYm94UHJvcHMgPyBnZXRDaGVja2JveFByb3BzKHIpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gISEoY2hlY2tib3hQcm9wcyA9PT0gbnVsbCB8fCBjaGVja2JveFByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGVja2JveFByb3BzLmRpc2FibGVkKTtcbiAgfSwgW2NoZWNrYm94UHJvcHNNYXAsIGdldFJvd0tleV0pO1xuICBjb25zdCBbZGVyaXZlZFNlbGVjdGVkS2V5cywgZGVyaXZlZEhhbGZTZWxlY3RlZEtleXNdID0gKDAsIF9yZWFjdC51c2VNZW1vKSgoKSA9PiB7XG4gICAgaWYgKGNoZWNrU3RyaWN0bHkpIHtcbiAgICAgIHJldHVybiBbbWVyZ2VkU2VsZWN0ZWRLZXlzIHx8IFtdLCBbXV07XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGNoZWNrZWRLZXlzLFxuICAgICAgaGFsZkNoZWNrZWRLZXlzXG4gICAgfSA9ICgwLCBfY29uZHVjdFV0aWwuY29uZHVjdENoZWNrKShtZXJnZWRTZWxlY3RlZEtleXMsIHRydWUsIGtleUVudGl0aWVzLCBpc0NoZWNrYm94RGlzYWJsZWQpO1xuICAgIHJldHVybiBbY2hlY2tlZEtleXMgfHwgW10sIGhhbGZDaGVja2VkS2V5c107XG4gIH0sIFttZXJnZWRTZWxlY3RlZEtleXMsIGNoZWNrU3RyaWN0bHksIGtleUVudGl0aWVzLCBpc0NoZWNrYm94RGlzYWJsZWRdKTtcbiAgY29uc3QgZGVyaXZlZFNlbGVjdGVkS2V5U2V0ID0gKDAsIF9yZWFjdC51c2VNZW1vKSgoKSA9PiB7XG4gICAgY29uc3Qga2V5cyA9IHNlbGVjdGlvblR5cGUgPT09ICdyYWRpbycgPyBkZXJpdmVkU2VsZWN0ZWRLZXlzLnNsaWNlKDAsIDEpIDogZGVyaXZlZFNlbGVjdGVkS2V5cztcbiAgICByZXR1cm4gbmV3IFNldChrZXlzKTtcbiAgfSwgW2Rlcml2ZWRTZWxlY3RlZEtleXMsIHNlbGVjdGlvblR5cGVdKTtcbiAgY29uc3QgZGVyaXZlZEhhbGZTZWxlY3RlZEtleVNldCA9ICgwLCBfcmVhY3QudXNlTWVtbykoKCkgPT4gc2VsZWN0aW9uVHlwZSA9PT0gJ3JhZGlvJyA/IG5ldyBTZXQoKSA6IG5ldyBTZXQoZGVyaXZlZEhhbGZTZWxlY3RlZEtleXMpLCBbZGVyaXZlZEhhbGZTZWxlY3RlZEtleXMsIHNlbGVjdGlvblR5cGVdKTtcbiAgLy8gUmVzZXQgaWYgcm93U2VsZWN0aW9uIHJlc2V0XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFyb3dTZWxlY3Rpb24pIHtcbiAgICAgIHNldE1lcmdlZFNlbGVjdGVkS2V5cyhFTVBUWV9MSVNUKTtcbiAgICB9XG4gIH0sIFshIXJvd1NlbGVjdGlvbl0pO1xuICBjb25zdCBzZXRTZWxlY3RlZEtleXMgPSAoMCwgX3JlYWN0LnVzZUNhbGxiYWNrKSgoa2V5cywgbWV0aG9kKSA9PiB7XG4gICAgbGV0IGF2YWlsYWJsZUtleXM7XG4gICAgbGV0IHJlY29yZHM7XG4gICAgdXBkYXRlUHJlc2VydmVSZWNvcmRzQ2FjaGUoa2V5cyk7XG4gICAgaWYgKHByZXNlcnZlU2VsZWN0ZWRSb3dLZXlzKSB7XG4gICAgICBhdmFpbGFibGVLZXlzID0ga2V5cztcbiAgICAgIHJlY29yZHMgPSBrZXlzLm1hcChrZXkgPT4gcHJlc2VydmVSZWNvcmRzUmVmLmN1cnJlbnQuZ2V0KGtleSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaWx0ZXIga2V5IHdoaWNoIG5vdCBleGlzdCBpbiB0aGUgYGRhdGFTb3VyY2VgXG4gICAgICBhdmFpbGFibGVLZXlzID0gW107XG4gICAgICByZWNvcmRzID0gW107XG4gICAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gZ2V0UmVjb3JkQnlLZXkoa2V5KTtcbiAgICAgICAgaWYgKHJlY29yZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYXZhaWxhYmxlS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBzZXRNZXJnZWRTZWxlY3RlZEtleXMoYXZhaWxhYmxlS2V5cyk7XG4gICAgb25TZWxlY3Rpb25DaGFuZ2UgPT09IG51bGwgfHwgb25TZWxlY3Rpb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uU2VsZWN0aW9uQ2hhbmdlKGF2YWlsYWJsZUtleXMsIHJlY29yZHMsIHtcbiAgICAgIHR5cGU6IG1ldGhvZFxuICAgIH0pO1xuICB9LCBbc2V0TWVyZ2VkU2VsZWN0ZWRLZXlzLCBnZXRSZWNvcmRCeUtleSwgb25TZWxlY3Rpb25DaGFuZ2UsIHByZXNlcnZlU2VsZWN0ZWRSb3dLZXlzXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRyaWdnZXIgc2luZ2xlIGBvblNlbGVjdGAgZXZlbnRcbiAgY29uc3QgdHJpZ2dlclNpbmdsZVNlbGVjdGlvbiA9ICgwLCBfcmVhY3QudXNlQ2FsbGJhY2spKChrZXksIHNlbGVjdGVkLCBrZXlzLCBldmVudCkgPT4ge1xuICAgIGlmIChvblNlbGVjdCkge1xuICAgICAgY29uc3Qgcm93cyA9IGtleXMubWFwKGsgPT4gZ2V0UmVjb3JkQnlLZXkoaykpO1xuICAgICAgb25TZWxlY3QoZ2V0UmVjb3JkQnlLZXkoa2V5KSwgc2VsZWN0ZWQsIHJvd3MsIGV2ZW50KTtcbiAgICB9XG4gICAgc2V0U2VsZWN0ZWRLZXlzKGtleXMsICdzaW5nbGUnKTtcbiAgfSwgW29uU2VsZWN0LCBnZXRSZWNvcmRCeUtleSwgc2V0U2VsZWN0ZWRLZXlzXSk7XG4gIGNvbnN0IG1lcmdlZFNlbGVjdGlvbnMgPSAoMCwgX3JlYWN0LnVzZU1lbW8pKCgpID0+IHtcbiAgICBpZiAoIXNlbGVjdGlvbnMgfHwgaGlkZVNlbGVjdEFsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGlvbkxpc3QgPSBzZWxlY3Rpb25zID09PSB0cnVlID8gW1NFTEVDVElPTl9BTEwsIFNFTEVDVElPTl9JTlZFUlQsIFNFTEVDVElPTl9OT05FXSA6IHNlbGVjdGlvbnM7XG4gICAgcmV0dXJuIHNlbGVjdGlvbkxpc3QubWFwKHNlbGVjdGlvbiA9PiB7XG4gICAgICBpZiAoc2VsZWN0aW9uID09PSBTRUxFQ1RJT05fQUxMKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5OiAnYWxsJyxcbiAgICAgICAgICB0ZXh0OiB0YWJsZUxvY2FsZS5zZWxlY3Rpb25BbGwsXG4gICAgICAgICAgb25TZWxlY3QoKSB7XG4gICAgICAgICAgICBzZXRTZWxlY3RlZEtleXMoZGF0YS5tYXAoKHJlY29yZCwgaW5kZXgpID0+IGdldFJvd0tleShyZWNvcmQsIGluZGV4KSkuZmlsdGVyKGtleSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGNoZWNrUHJvcHMgPSBjaGVja2JveFByb3BzTWFwLmdldChrZXkpO1xuICAgICAgICAgICAgICByZXR1cm4gIShjaGVja1Byb3BzID09PSBudWxsIHx8IGNoZWNrUHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrUHJvcHMuZGlzYWJsZWQpIHx8IGRlcml2ZWRTZWxlY3RlZEtleVNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgIH0pLCAnYWxsJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHNlbGVjdGlvbiA9PT0gU0VMRUNUSU9OX0lOVkVSVCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleTogJ2ludmVydCcsXG4gICAgICAgICAgdGV4dDogdGFibGVMb2NhbGUuc2VsZWN0SW52ZXJ0LFxuICAgICAgICAgIG9uU2VsZWN0KCkge1xuICAgICAgICAgICAgY29uc3Qga2V5U2V0ID0gbmV3IFNldChkZXJpdmVkU2VsZWN0ZWRLZXlTZXQpO1xuICAgICAgICAgICAgcGFnZURhdGEuZm9yRWFjaCgocmVjb3JkLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBrZXkgPSBnZXRSb3dLZXkocmVjb3JkLCBpbmRleCk7XG4gICAgICAgICAgICAgIGNvbnN0IGNoZWNrUHJvcHMgPSBjaGVja2JveFByb3BzTWFwLmdldChrZXkpO1xuICAgICAgICAgICAgICBpZiAoIShjaGVja1Byb3BzID09PSBudWxsIHx8IGNoZWNrUHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrUHJvcHMuZGlzYWJsZWQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleVNldC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAga2V5U2V0LmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBrZXlTZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBBcnJheS5mcm9tKGtleVNldCk7XG4gICAgICAgICAgICBpZiAob25TZWxlY3RJbnZlcnQpIHtcbiAgICAgICAgICAgICAgd2FybmluZy5kZXByZWNhdGVkKGZhbHNlLCAnb25TZWxlY3RJbnZlcnQnLCAnb25DaGFuZ2UnKTtcbiAgICAgICAgICAgICAgb25TZWxlY3RJbnZlcnQoa2V5cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRTZWxlY3RlZEtleXMoa2V5cywgJ2ludmVydCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWxlY3Rpb24gPT09IFNFTEVDVElPTl9OT05FKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5OiAnbm9uZScsXG4gICAgICAgICAgdGV4dDogdGFibGVMb2NhbGUuc2VsZWN0Tm9uZSxcbiAgICAgICAgICBvblNlbGVjdCgpIHtcbiAgICAgICAgICAgIG9uU2VsZWN0Tm9uZSA9PT0gbnVsbCB8fCBvblNlbGVjdE5vbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uU2VsZWN0Tm9uZSgpO1xuICAgICAgICAgICAgc2V0U2VsZWN0ZWRLZXlzKEFycmF5LmZyb20oZGVyaXZlZFNlbGVjdGVkS2V5U2V0KS5maWx0ZXIoa2V5ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tQcm9wcyA9IGNoZWNrYm94UHJvcHNNYXAuZ2V0KGtleSk7XG4gICAgICAgICAgICAgIHJldHVybiBjaGVja1Byb3BzID09PSBudWxsIHx8IGNoZWNrUHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrUHJvcHMuZGlzYWJsZWQ7XG4gICAgICAgICAgICB9KSwgJ25vbmUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZWN0aW9uO1xuICAgIH0pLm1hcChzZWxlY3Rpb24gPT4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzZWxlY3Rpb24pLCB7XG4gICAgICBvblNlbGVjdDogKC4uLnJlc3QpID0+IHtcbiAgICAgICAgdmFyIF9hMjtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSBzZWxlY3Rpb24ub25TZWxlY3QpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2EyID0gX2EpLmNhbGwuYXBwbHkoX2EyLCBbc2VsZWN0aW9uXS5jb25jYXQocmVzdCkpO1xuICAgICAgICB1cGRhdGVQcmV2U2VsZWN0ZWRJbmRleChudWxsKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH0sIFtzZWxlY3Rpb25zLCBkZXJpdmVkU2VsZWN0ZWRLZXlTZXQsIHBhZ2VEYXRhLCBnZXRSb3dLZXksIG9uU2VsZWN0SW52ZXJ0LCBzZXRTZWxlY3RlZEtleXNdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gQ29sdW1ucyA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgdHJhbnNmb3JtQ29sdW1ucyA9ICgwLCBfcmVhY3QudXNlQ2FsbGJhY2spKGNvbHVtbnMgPT4ge1xuICAgIHZhciBfYTtcbiAgICAvLyA+Pj4+Pj4+Pj4+PiBTa2lwIGlmIG5vdCBleGlzdHMgYHJvd1NlbGVjdGlvbmBcbiAgICBpZiAoIXJvd1NlbGVjdGlvbikge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghY29sdW1ucy5pbmNsdWRlcyhTRUxFQ1RJT05fQ09MVU1OKSwgJ3VzYWdlJywgJ2Byb3dTZWxlY3Rpb25gIGlzIG5vdCBjb25maWcgYnV0IGBTRUxFQ1RJT05fQ09MVU1OYCBleGlzdHMgaW4gdGhlIGBjb2x1bW5zYC4nKSA6IHZvaWQgMDtcbiAgICAgIHJldHVybiBjb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sICE9PSBTRUxFQ1RJT05fQ09MVU1OKTtcbiAgICB9XG4gICAgLy8gPj4+Pj4+Pj4+Pj4gU3VwcG9ydCBzZWxlY3Rpb25cbiAgICBsZXQgY2xvbmVDb2x1bW5zID0gKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoY29sdW1ucyk7XG4gICAgY29uc3Qga2V5U2V0ID0gbmV3IFNldChkZXJpdmVkU2VsZWN0ZWRLZXlTZXQpO1xuICAgIC8vIFJlY29yZCBrZXkgb25seSBuZWVkIGNoZWNrIHdpdGggZW5hYmxlZFxuICAgIGNvbnN0IHJlY29yZEtleXMgPSBmbGF0dGVkRGF0YS5tYXAoZ2V0Um93S2V5KS5maWx0ZXIoa2V5ID0+ICFjaGVja2JveFByb3BzTWFwLmdldChrZXkpLmRpc2FibGVkKTtcbiAgICBjb25zdCBjaGVja2VkQ3VycmVudEFsbCA9IHJlY29yZEtleXMuZXZlcnkoa2V5ID0+IGtleVNldC5oYXMoa2V5KSk7XG4gICAgY29uc3QgY2hlY2tlZEN1cnJlbnRTb21lID0gcmVjb3JkS2V5cy5zb21lKGtleSA9PiBrZXlTZXQuaGFzKGtleSkpO1xuICAgIGNvbnN0IG9uU2VsZWN0QWxsQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgY29uc3QgY2hhbmdlS2V5cyA9IFtdO1xuICAgICAgaWYgKGNoZWNrZWRDdXJyZW50QWxsKSB7XG4gICAgICAgIHJlY29yZEtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGtleVNldC5kZWxldGUoa2V5KTtcbiAgICAgICAgICBjaGFuZ2VLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWNvcmRLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBpZiAoIWtleVNldC5oYXMoa2V5KSkge1xuICAgICAgICAgICAga2V5U2V0LmFkZChrZXkpO1xuICAgICAgICAgICAgY2hhbmdlS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleXMgPSBBcnJheS5mcm9tKGtleVNldCk7XG4gICAgICBvblNlbGVjdEFsbCA9PT0gbnVsbCB8fCBvblNlbGVjdEFsbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TZWxlY3RBbGwoIWNoZWNrZWRDdXJyZW50QWxsLCBrZXlzLm1hcChrID0+IGdldFJlY29yZEJ5S2V5KGspKSwgY2hhbmdlS2V5cy5tYXAoayA9PiBnZXRSZWNvcmRCeUtleShrKSkpO1xuICAgICAgc2V0U2VsZWN0ZWRLZXlzKGtleXMsICdhbGwnKTtcbiAgICAgIHVwZGF0ZVByZXZTZWxlY3RlZEluZGV4KG51bGwpO1xuICAgIH07XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBUaXRsZSBDZWxsXG4gICAgbGV0IHRpdGxlO1xuICAgIGxldCBjb2x1bW5UaXRsZUNoZWNrYm94O1xuICAgIGlmIChzZWxlY3Rpb25UeXBlICE9PSAncmFkaW8nKSB7XG4gICAgICBsZXQgY3VzdG9taXplU2VsZWN0aW9ucztcbiAgICAgIGlmIChtZXJnZWRTZWxlY3Rpb25zKSB7XG4gICAgICAgIGNvbnN0IG1lbnUgPSB7XG4gICAgICAgICAgZ2V0UG9wdXBDb250YWluZXIsXG4gICAgICAgICAgaXRlbXM6IG1lcmdlZFNlbGVjdGlvbnMubWFwKChzZWxlY3Rpb24sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgb25TZWxlY3Q6IG9uU2VsZWN0aW9uQ2xpY2tcbiAgICAgICAgICAgIH0gPSBzZWxlY3Rpb247XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBrZXk6IGtleSAhPT0gbnVsbCAmJiBrZXkgIT09IHZvaWQgMCA/IGtleSA6IGluZGV4LFxuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgb25TZWxlY3Rpb25DbGljayA9PT0gbnVsbCB8fCBvblNlbGVjdGlvbkNsaWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblNlbGVjdGlvbkNsaWNrKHJlY29yZEtleXMpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBsYWJlbDogdGV4dFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgICBjdXN0b21pemVTZWxlY3Rpb25zID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1zZWxlY3Rpb24tZXh0cmFgXG4gICAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9kcm9wZG93bi5kZWZhdWx0LCB7XG4gICAgICAgICAgbWVudTogbWVudSxcbiAgICAgICAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXJcbiAgICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Eb3duT3V0bGluZWQuZGVmYXVsdCwgbnVsbCkpKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBhbGxEaXNhYmxlZERhdGEgPSBmbGF0dGVkRGF0YS5tYXAoKHJlY29yZCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0Um93S2V5KHJlY29yZCwgaW5kZXgpO1xuICAgICAgICBjb25zdCBjaGVja2JveFByb3BzID0gY2hlY2tib3hQcm9wc01hcC5nZXQoa2V5KSB8fCB7fTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgIGNoZWNrZWQ6IGtleVNldC5oYXMoa2V5KVxuICAgICAgICB9LCBjaGVja2JveFByb3BzKTtcbiAgICAgIH0pLmZpbHRlcigoe1xuICAgICAgICBkaXNhYmxlZFxuICAgICAgfSkgPT4gZGlzYWJsZWQpO1xuICAgICAgY29uc3QgYWxsRGlzYWJsZWQgPSAhIWFsbERpc2FibGVkRGF0YS5sZW5ndGggJiYgYWxsRGlzYWJsZWREYXRhLmxlbmd0aCA9PT0gZmxhdHRlZERhdGEubGVuZ3RoO1xuICAgICAgY29uc3QgYWxsRGlzYWJsZWRBbmRDaGVja2VkID0gYWxsRGlzYWJsZWQgJiYgYWxsRGlzYWJsZWREYXRhLmV2ZXJ5KCh7XG4gICAgICAgIGNoZWNrZWRcbiAgICAgIH0pID0+IGNoZWNrZWQpO1xuICAgICAgY29uc3QgYWxsRGlzYWJsZWRTb21lQ2hlY2tlZCA9IGFsbERpc2FibGVkICYmIGFsbERpc2FibGVkRGF0YS5zb21lKCh7XG4gICAgICAgIGNoZWNrZWRcbiAgICAgIH0pID0+IGNoZWNrZWQpO1xuICAgICAgY29sdW1uVGl0bGVDaGVja2JveCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jaGVja2JveC5kZWZhdWx0LCB7XG4gICAgICAgIGNoZWNrZWQ6ICFhbGxEaXNhYmxlZCA/ICEhZmxhdHRlZERhdGEubGVuZ3RoICYmIGNoZWNrZWRDdXJyZW50QWxsIDogYWxsRGlzYWJsZWRBbmRDaGVja2VkLFxuICAgICAgICBpbmRldGVybWluYXRlOiAhYWxsRGlzYWJsZWQgPyAhY2hlY2tlZEN1cnJlbnRBbGwgJiYgY2hlY2tlZEN1cnJlbnRTb21lIDogIWFsbERpc2FibGVkQW5kQ2hlY2tlZCAmJiBhbGxEaXNhYmxlZFNvbWVDaGVja2VkLFxuICAgICAgICBvbkNoYW5nZTogb25TZWxlY3RBbGxDaGFuZ2UsXG4gICAgICAgIGRpc2FibGVkOiBmbGF0dGVkRGF0YS5sZW5ndGggPT09IDAgfHwgYWxsRGlzYWJsZWQsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBjdXN0b21pemVTZWxlY3Rpb25zID8gJ0N1c3RvbSBzZWxlY3Rpb24nIDogJ1NlbGVjdCBhbGwnLFxuICAgICAgICBza2lwR3JvdXA6IHRydWVcbiAgICAgIH0pO1xuICAgICAgdGl0bGUgPSAhaGlkZVNlbGVjdEFsbCAmJiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30tc2VsZWN0aW9uYFxuICAgICAgfSwgY29sdW1uVGl0bGVDaGVja2JveCwgY3VzdG9taXplU2VsZWN0aW9ucykpO1xuICAgIH1cbiAgICAvLyBCb2R5IENlbGxcbiAgICBsZXQgcmVuZGVyQ2VsbDtcbiAgICBpZiAoc2VsZWN0aW9uVHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmVuZGVyQ2VsbCA9IChfLCByZWNvcmQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGdldFJvd0tleShyZWNvcmQsIGluZGV4KTtcbiAgICAgICAgY29uc3QgY2hlY2tlZCA9IGtleVNldC5oYXMoa2V5KTtcbiAgICAgICAgY29uc3QgY2hlY2tib3hQcm9wcyA9IGNoZWNrYm94UHJvcHNNYXAuZ2V0KGtleSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm9kZTogKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yYWRpby5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBjaGVja2JveFByb3BzLCB7XG4gICAgICAgICAgICBjaGVja2VkOiBjaGVja2VkLFxuICAgICAgICAgICAgb25DbGljazogZSA9PiB7XG4gICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgKF9hID0gY2hlY2tib3hQcm9wcyA9PT0gbnVsbCB8fCBjaGVja2JveFByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGVja2JveFByb3BzLm9uQ2xpY2spID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGNoZWNrYm94UHJvcHMsIGUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBldmVudCA9PiB7XG4gICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgaWYgKCFrZXlTZXQuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyU2luZ2xlU2VsZWN0aW9uKGtleSwgdHJ1ZSwgW2tleV0sIGV2ZW50Lm5hdGl2ZUV2ZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAoX2EgPSBjaGVja2JveFByb3BzID09PSBudWxsIHx8IGNoZWNrYm94UHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrYm94UHJvcHMub25DaGFuZ2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGNoZWNrYm94UHJvcHMsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSkpLFxuICAgICAgICAgIGNoZWNrZWRcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbmRlckNlbGwgPSAoXywgcmVjb3JkLCBpbmRleCkgPT4ge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGtleSA9IGdldFJvd0tleShyZWNvcmQsIGluZGV4KTtcbiAgICAgICAgY29uc3QgY2hlY2tlZCA9IGtleVNldC5oYXMoa2V5KTtcbiAgICAgICAgY29uc3QgaW5kZXRlcm1pbmF0ZSA9IGRlcml2ZWRIYWxmU2VsZWN0ZWRLZXlTZXQuaGFzKGtleSk7XG4gICAgICAgIGNvbnN0IGNoZWNrYm94UHJvcHMgPSBjaGVja2JveFByb3BzTWFwLmdldChrZXkpO1xuICAgICAgICBsZXQgbWVyZ2VkSW5kZXRlcm1pbmF0ZTtcbiAgICAgICAgaWYgKGV4cGFuZFR5cGUgPT09ICduZXN0Jykge1xuICAgICAgICAgIG1lcmdlZEluZGV0ZXJtaW5hdGUgPSBpbmRldGVybWluYXRlO1xuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcodHlwZW9mIChjaGVja2JveFByb3BzID09PSBudWxsIHx8IGNoZWNrYm94UHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrYm94UHJvcHMuaW5kZXRlcm1pbmF0ZSkgIT09ICdib29sZWFuJywgJ3VzYWdlJywgJ3NldCBgaW5kZXRlcm1pbmF0ZWAgdXNpbmcgYHJvd1NlbGVjdGlvbi5nZXRDaGVja2JveFByb3BzYCBpcyBub3QgYWxsb3dlZCB3aXRoIHRyZWUgc3RydWN0dXJlZCBkYXRhU291cmNlLicpIDogdm9pZCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lcmdlZEluZGV0ZXJtaW5hdGUgPSAoX2EgPSBjaGVja2JveFByb3BzID09PSBudWxsIHx8IGNoZWNrYm94UHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrYm94UHJvcHMuaW5kZXRlcm1pbmF0ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogaW5kZXRlcm1pbmF0ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWNvcmQgY2hlY2tlZFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGU6ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY2hlY2tib3guZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgY2hlY2tib3hQcm9wcywge1xuICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZTogbWVyZ2VkSW5kZXRlcm1pbmF0ZSxcbiAgICAgICAgICAgIGNoZWNrZWQ6IGNoZWNrZWQsXG4gICAgICAgICAgICBza2lwR3JvdXA6IHRydWUsXG4gICAgICAgICAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAoX2EgPSBjaGVja2JveFByb3BzID09PSBudWxsIHx8IGNoZWNrYm94UHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrYm94UHJvcHMub25DbGljaykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoY2hlY2tib3hQcm9wcywgZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25DaGFuZ2U6IGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgbmF0aXZlRXZlbnRcbiAgICAgICAgICAgICAgfSA9IGV2ZW50O1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgc2hpZnRLZXlcbiAgICAgICAgICAgICAgfSA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0ZWRJbmRleCA9IHJlY29yZEtleXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbSA9PT0ga2V5KTtcbiAgICAgICAgICAgICAgY29uc3QgaXNNdWx0aXBsZSA9IGRlcml2ZWRTZWxlY3RlZEtleXMuc29tZShpdGVtID0+IHJlY29yZEtleXMuaW5jbHVkZXMoaXRlbSkpO1xuICAgICAgICAgICAgICBpZiAoc2hpZnRLZXkgJiYgY2hlY2tTdHJpY3RseSAmJiBpc011bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlZEtleXMgPSBtdWx0aXBsZVNlbGVjdChjdXJyZW50U2VsZWN0ZWRJbmRleCwgcmVjb3JkS2V5cywga2V5U2V0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gQXJyYXkuZnJvbShrZXlTZXQpO1xuICAgICAgICAgICAgICAgIG9uU2VsZWN0TXVsdGlwbGUgPT09IG51bGwgfHwgb25TZWxlY3RNdWx0aXBsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TZWxlY3RNdWx0aXBsZSghY2hlY2tlZCwga2V5cy5tYXAocmVjb3JkS2V5ID0+IGdldFJlY29yZEJ5S2V5KHJlY29yZEtleSkpLCBjaGFuZ2VkS2V5cy5tYXAocmVjb3JkS2V5ID0+IGdldFJlY29yZEJ5S2V5KHJlY29yZEtleSkpKTtcbiAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZEtleXMoa2V5cywgJ211bHRpcGxlJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU2luZ2xlIHJlY29yZCBzZWxlY3RlZFxuICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbkNoZWNrZWRLZXlzID0gZGVyaXZlZFNlbGVjdGVkS2V5cztcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tTdHJpY3RseSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZEtleXMgPSBjaGVja2VkID8gKDAsIF91dGlsLmFyckRlbCkob3JpZ2luQ2hlY2tlZEtleXMsIGtleSkgOiAoMCwgX3V0aWwuYXJyQWRkKShvcmlnaW5DaGVja2VkS2V5cywga2V5KTtcbiAgICAgICAgICAgICAgICAgIHRyaWdnZXJTaW5nbGVTZWxlY3Rpb24oa2V5LCAhY2hlY2tlZCwgY2hlY2tlZEtleXMsIG5hdGl2ZUV2ZW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gQWx3YXlzIGZpbGwgZmlyc3RcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9ICgwLCBfY29uZHVjdFV0aWwuY29uZHVjdENoZWNrKShbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkob3JpZ2luQ2hlY2tlZEtleXMpLCBba2V5XSksIHRydWUsIGtleUVudGl0aWVzLCBpc0NoZWNrYm94RGlzYWJsZWQpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgICAgICBjaGVja2VkS2V5cyxcbiAgICAgICAgICAgICAgICAgICAgaGFsZkNoZWNrZWRLZXlzXG4gICAgICAgICAgICAgICAgICB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgbGV0IG5leHRDaGVja2VkS2V5cyA9IGNoZWNrZWRLZXlzO1xuICAgICAgICAgICAgICAgICAgLy8gSWYgcmVtb3ZlLCB3ZSBkbyBpdCBhZ2FpbiB0byBjb3JyZWN0aW9uXG4gICAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wS2V5U2V0ID0gbmV3IFNldChjaGVja2VkS2V5cyk7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBLZXlTZXQuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIG5leHRDaGVja2VkS2V5cyA9ICgwLCBfY29uZHVjdFV0aWwuY29uZHVjdENoZWNrKShBcnJheS5mcm9tKHRlbXBLZXlTZXQpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgaGFsZkNoZWNrZWRLZXlzXG4gICAgICAgICAgICAgICAgICAgIH0sIGtleUVudGl0aWVzLCBpc0NoZWNrYm94RGlzYWJsZWQpLmNoZWNrZWRLZXlzO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdHJpZ2dlclNpbmdsZVNlbGVjdGlvbihrZXksICFjaGVja2VkLCBuZXh0Q2hlY2tlZEtleXMsIG5hdGl2ZUV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVQcmV2U2VsZWN0ZWRJbmRleChudWxsKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVQcmV2U2VsZWN0ZWRJbmRleChjdXJyZW50U2VsZWN0ZWRJbmRleCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKF9hID0gY2hlY2tib3hQcm9wcyA9PT0gbnVsbCB8fCBjaGVja2JveFByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGVja2JveFByb3BzLm9uQ2hhbmdlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChjaGVja2JveFByb3BzLCBldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpKSxcbiAgICAgICAgICBjaGVja2VkXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCByZW5kZXJTZWxlY3Rpb25DZWxsID0gKF8sIHJlY29yZCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbm9kZSxcbiAgICAgICAgY2hlY2tlZFxuICAgICAgfSA9IHJlbmRlckNlbGwoXywgcmVjb3JkLCBpbmRleCk7XG4gICAgICBpZiAoY3VzdG9taXplUmVuZGVyQ2VsbCkge1xuICAgICAgICByZXR1cm4gY3VzdG9taXplUmVuZGVyQ2VsbChjaGVja2VkLCByZWNvcmQsIGluZGV4LCBub2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH07XG4gICAgLy8gSW5zZXJ0IHNlbGVjdGlvbiBjb2x1bW4gaWYgbm90IGV4aXN0XG4gICAgaWYgKCFjbG9uZUNvbHVtbnMuaW5jbHVkZXMoU0VMRUNUSU9OX0NPTFVNTikpIHtcbiAgICAgIC8vIEFsd2F5cyBhZnRlciBleHBhbmQgaWNvblxuICAgICAgaWYgKGNsb25lQ29sdW1ucy5maW5kSW5kZXgoY29sID0+IHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKChfYSA9IGNvbFtfcmNUYWJsZS5JTlRFUk5BTF9DT0xfREVGSU5FXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbHVtblR5cGUpID09PSAnRVhQQU5EX0NPTFVNTic7XG4gICAgICB9KSA9PT0gMCkge1xuICAgICAgICBjb25zdCBbZXhwYW5kQ29sdW1uLCAuLi5yZXN0Q29sdW1uc10gPSBjbG9uZUNvbHVtbnM7XG4gICAgICAgIGNsb25lQ29sdW1ucyA9IFtleHBhbmRDb2x1bW4sIFNFTEVDVElPTl9DT0xVTU5dLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShyZXN0Q29sdW1ucykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm9ybWFsIGluc2VydCBhdCBmaXJzdCBjb2x1bW5cbiAgICAgICAgY2xvbmVDb2x1bW5zID0gW1NFTEVDVElPTl9DT0xVTU5dLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShjbG9uZUNvbHVtbnMpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRGVkdXBsaWNhdGUgc2VsZWN0aW9uIGNvbHVtblxuICAgIGNvbnN0IHNlbGVjdGlvbkNvbHVtbkluZGV4ID0gY2xvbmVDb2x1bW5zLmluZGV4T2YoU0VMRUNUSU9OX0NPTFVNTik7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhjbG9uZUNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wgPT09IFNFTEVDVElPTl9DT0xVTU4pLmxlbmd0aCA8PSAxLCAndXNhZ2UnLCAnTXVsdGlwbGUgYFNFTEVDVElPTl9DT0xVTU5gIGV4aXN0IGluIGBjb2x1bW5zYC4nKSA6IHZvaWQgMDtcbiAgICBjbG9uZUNvbHVtbnMgPSBjbG9uZUNvbHVtbnMuZmlsdGVyKChjb2x1bW4sIGluZGV4KSA9PiBjb2x1bW4gIT09IFNFTEVDVElPTl9DT0xVTU4gfHwgaW5kZXggPT09IHNlbGVjdGlvbkNvbHVtbkluZGV4KTtcbiAgICAvLyBGaXhlZCBjb2x1bW4gbG9naWNcbiAgICBjb25zdCBwcmV2Q29sID0gY2xvbmVDb2x1bW5zW3NlbGVjdGlvbkNvbHVtbkluZGV4IC0gMV07XG4gICAgY29uc3QgbmV4dENvbCA9IGNsb25lQ29sdW1uc1tzZWxlY3Rpb25Db2x1bW5JbmRleCArIDFdO1xuICAgIGxldCBtZXJnZWRGaXhlZCA9IGZpeGVkO1xuICAgIGlmIChtZXJnZWRGaXhlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoKG5leHRDb2wgPT09IG51bGwgfHwgbmV4dENvbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmV4dENvbC5maXhlZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXJnZWRGaXhlZCA9IG5leHRDb2wuZml4ZWQ7XG4gICAgICB9IGVsc2UgaWYgKChwcmV2Q29sID09PSBudWxsIHx8IHByZXZDb2wgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByZXZDb2wuZml4ZWQpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWVyZ2VkRml4ZWQgPSBwcmV2Q29sLmZpeGVkO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWVyZ2VkRml4ZWQgJiYgcHJldkNvbCAmJiAoKF9hID0gcHJldkNvbFtfcmNUYWJsZS5JTlRFUk5BTF9DT0xfREVGSU5FXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbHVtblR5cGUpID09PSAnRVhQQU5EX0NPTFVNTicgJiYgcHJldkNvbC5maXhlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcmV2Q29sLmZpeGVkID0gbWVyZ2VkRml4ZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbkNscyA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShgJHtwcmVmaXhDbHN9LXNlbGVjdGlvbi1jb2xgLCB7XG4gICAgICBbYCR7cHJlZml4Q2xzfS1zZWxlY3Rpb24tY29sLXdpdGgtZHJvcGRvd25gXTogc2VsZWN0aW9ucyAmJiBzZWxlY3Rpb25UeXBlID09PSAnY2hlY2tib3gnXG4gICAgfSk7XG4gICAgY29uc3QgcmVuZGVyQ29sdW1uVGl0bGUgPSAoKSA9PiB7XG4gICAgICBpZiAoIShyb3dTZWxlY3Rpb24gPT09IG51bGwgfHwgcm93U2VsZWN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiByb3dTZWxlY3Rpb24uY29sdW1uVGl0bGUpKSB7XG4gICAgICAgIHJldHVybiB0aXRsZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygcm93U2VsZWN0aW9uLmNvbHVtblRpdGxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiByb3dTZWxlY3Rpb24uY29sdW1uVGl0bGUoY29sdW1uVGl0bGVDaGVja2JveCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcm93U2VsZWN0aW9uLmNvbHVtblRpdGxlO1xuICAgIH07XG4gICAgLy8gUmVwbGFjZSB3aXRoIHJlYWwgc2VsZWN0aW9uIGNvbHVtblxuICAgIGNvbnN0IHNlbGVjdGlvbkNvbHVtbiA9IHtcbiAgICAgIGZpeGVkOiBtZXJnZWRGaXhlZCxcbiAgICAgIHdpZHRoOiBzZWxlY3Rpb25Db2xXaWR0aCxcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1zZWxlY3Rpb24tY29sdW1uYCxcbiAgICAgIHRpdGxlOiByZW5kZXJDb2x1bW5UaXRsZSgpLFxuICAgICAgcmVuZGVyOiByZW5kZXJTZWxlY3Rpb25DZWxsLFxuICAgICAgb25DZWxsOiByb3dTZWxlY3Rpb24ub25DZWxsLFxuICAgICAgYWxpZ246IHJvd1NlbGVjdGlvbi5hbGlnbixcbiAgICAgIFtfcmNUYWJsZS5JTlRFUk5BTF9DT0xfREVGSU5FXToge1xuICAgICAgICBjbGFzc05hbWU6IGNvbHVtbkNsc1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGNsb25lQ29sdW1ucy5tYXAoY29sID0+IGNvbCA9PT0gU0VMRUNUSU9OX0NPTFVNTiA/IHNlbGVjdGlvbkNvbHVtbiA6IGNvbCk7XG4gIH0sIFtnZXRSb3dLZXksIGZsYXR0ZWREYXRhLCByb3dTZWxlY3Rpb24sIGRlcml2ZWRTZWxlY3RlZEtleXMsIGRlcml2ZWRTZWxlY3RlZEtleVNldCwgZGVyaXZlZEhhbGZTZWxlY3RlZEtleVNldCwgc2VsZWN0aW9uQ29sV2lkdGgsIG1lcmdlZFNlbGVjdGlvbnMsIGV4cGFuZFR5cGUsIGNoZWNrYm94UHJvcHNNYXAsIG9uU2VsZWN0TXVsdGlwbGUsIHRyaWdnZXJTaW5nbGVTZWxlY3Rpb24sIGlzQ2hlY2tib3hEaXNhYmxlZF0pO1xuICByZXR1cm4gW3RyYW5zZm9ybUNvbHVtbnMsIGRlcml2ZWRTZWxlY3RlZEtleVNldF07XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdXNlU2VsZWN0aW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRTb3J0RGF0YSA9IGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9DYXJldERvd25PdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0NhcmV0RG93bk91dGxpbmVkXCIpKTtcbnZhciBfQ2FyZXRVcE91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2FyZXRVcE91dGxpbmVkXCIpKTtcbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xudmFyIF9LZXlDb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvS2V5Q29kZVwiKSk7XG52YXIgX3Rvb2x0aXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi90b29sdGlwXCIpKTtcbnZhciBfdXRpbCA9IHJlcXVpcmUoXCIuLi91dGlsXCIpO1xuY29uc3QgQVNDRU5EID0gJ2FzY2VuZCc7XG5jb25zdCBERVNDRU5EID0gJ2Rlc2NlbmQnO1xuY29uc3QgZ2V0TXVsdGlwbGVQcmlvcml0eSA9IGNvbHVtbiA9PiB7XG4gIGlmICh0eXBlb2YgY29sdW1uLnNvcnRlciA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGNvbHVtbi5zb3J0ZXIubXVsdGlwbGUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGNvbHVtbi5zb3J0ZXIubXVsdGlwbGU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcbmNvbnN0IGdldFNvcnRGdW5jdGlvbiA9IHNvcnRlciA9PiB7XG4gIGlmICh0eXBlb2Ygc29ydGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHNvcnRlcjtcbiAgfVxuICBpZiAoc29ydGVyICYmIHR5cGVvZiBzb3J0ZXIgPT09ICdvYmplY3QnICYmIHNvcnRlci5jb21wYXJlKSB7XG4gICAgcmV0dXJuIHNvcnRlci5jb21wYXJlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5jb25zdCBuZXh0U29ydERpcmVjdGlvbiA9IChzb3J0RGlyZWN0aW9ucywgY3VycmVudCkgPT4ge1xuICBpZiAoIWN1cnJlbnQpIHtcbiAgICByZXR1cm4gc29ydERpcmVjdGlvbnNbMF07XG4gIH1cbiAgcmV0dXJuIHNvcnREaXJlY3Rpb25zW3NvcnREaXJlY3Rpb25zLmluZGV4T2YoY3VycmVudCkgKyAxXTtcbn07XG5jb25zdCBjb2xsZWN0U29ydFN0YXRlcyA9IChjb2x1bW5zLCBpbml0LCBwb3MpID0+IHtcbiAgbGV0IHNvcnRTdGF0ZXMgPSBbXTtcbiAgY29uc3QgcHVzaFN0YXRlID0gKGNvbHVtbiwgY29sdW1uUG9zKSA9PiB7XG4gICAgc29ydFN0YXRlcy5wdXNoKHtcbiAgICAgIGNvbHVtbixcbiAgICAgIGtleTogKDAsIF91dGlsLmdldENvbHVtbktleSkoY29sdW1uLCBjb2x1bW5Qb3MpLFxuICAgICAgbXVsdGlwbGVQcmlvcml0eTogZ2V0TXVsdGlwbGVQcmlvcml0eShjb2x1bW4pLFxuICAgICAgc29ydE9yZGVyOiBjb2x1bW4uc29ydE9yZGVyXG4gICAgfSk7XG4gIH07XG4gIChjb2x1bW5zIHx8IFtdKS5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgY29sdW1uUG9zID0gKDAsIF91dGlsLmdldENvbHVtblBvcykoaW5kZXgsIHBvcyk7XG4gICAgaWYgKGNvbHVtbi5jaGlsZHJlbikge1xuICAgICAgaWYgKCdzb3J0T3JkZXInIGluIGNvbHVtbikge1xuICAgICAgICAvLyBDb250cm9sbGVkXG4gICAgICAgIHB1c2hTdGF0ZShjb2x1bW4sIGNvbHVtblBvcyk7XG4gICAgICB9XG4gICAgICBzb3J0U3RhdGVzID0gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKHNvcnRTdGF0ZXMpLCAoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShjb2xsZWN0U29ydFN0YXRlcyhjb2x1bW4uY2hpbGRyZW4sIGluaXQsIGNvbHVtblBvcykpKTtcbiAgICB9IGVsc2UgaWYgKGNvbHVtbi5zb3J0ZXIpIHtcbiAgICAgIGlmICgnc29ydE9yZGVyJyBpbiBjb2x1bW4pIHtcbiAgICAgICAgLy8gQ29udHJvbGxlZFxuICAgICAgICBwdXNoU3RhdGUoY29sdW1uLCBjb2x1bW5Qb3MpO1xuICAgICAgfSBlbHNlIGlmIChpbml0ICYmIGNvbHVtbi5kZWZhdWx0U29ydE9yZGVyKSB7XG4gICAgICAgIC8vIERlZmF1bHQgc29ydGVyXG4gICAgICAgIHNvcnRTdGF0ZXMucHVzaCh7XG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIGtleTogKDAsIF91dGlsLmdldENvbHVtbktleSkoY29sdW1uLCBjb2x1bW5Qb3MpLFxuICAgICAgICAgIG11bHRpcGxlUHJpb3JpdHk6IGdldE11bHRpcGxlUHJpb3JpdHkoY29sdW1uKSxcbiAgICAgICAgICBzb3J0T3JkZXI6IGNvbHVtbi5kZWZhdWx0U29ydE9yZGVyXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBzb3J0U3RhdGVzO1xufTtcbmNvbnN0IGluamVjdFNvcnRlciA9IChwcmVmaXhDbHMsIGNvbHVtbnMsIHNvcnRlclN0YXRlcywgdHJpZ2dlclNvcnRlciwgZGVmYXVsdFNvcnREaXJlY3Rpb25zLCB0YWJsZUxvY2FsZSwgdGFibGVTaG93U29ydGVyVG9vbHRpcCwgcG9zKSA9PiB7XG4gIGNvbnN0IGZpbmFsQ29sdW1ucyA9IChjb2x1bW5zIHx8IFtdKS5tYXAoKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBjb2x1bW5Qb3MgPSAoMCwgX3V0aWwuZ2V0Q29sdW1uUG9zKShpbmRleCwgcG9zKTtcbiAgICBsZXQgbmV3Q29sdW1uID0gY29sdW1uO1xuICAgIGlmIChuZXdDb2x1bW4uc29ydGVyKSB7XG4gICAgICBjb25zdCBzb3J0RGlyZWN0aW9ucyA9IG5ld0NvbHVtbi5zb3J0RGlyZWN0aW9ucyB8fCBkZWZhdWx0U29ydERpcmVjdGlvbnM7XG4gICAgICBjb25zdCBzaG93U29ydGVyVG9vbHRpcCA9IG5ld0NvbHVtbi5zaG93U29ydGVyVG9vbHRpcCA9PT0gdW5kZWZpbmVkID8gdGFibGVTaG93U29ydGVyVG9vbHRpcCA6IG5ld0NvbHVtbi5zaG93U29ydGVyVG9vbHRpcDtcbiAgICAgIGNvbnN0IGNvbHVtbktleSA9ICgwLCBfdXRpbC5nZXRDb2x1bW5LZXkpKG5ld0NvbHVtbiwgY29sdW1uUG9zKTtcbiAgICAgIGNvbnN0IHNvcnRlclN0YXRlID0gc29ydGVyU3RhdGVzLmZpbmQoKHtcbiAgICAgICAga2V5XG4gICAgICB9KSA9PiBrZXkgPT09IGNvbHVtbktleSk7XG4gICAgICBjb25zdCBzb3J0T3JkZXIgPSBzb3J0ZXJTdGF0ZSA/IHNvcnRlclN0YXRlLnNvcnRPcmRlciA6IG51bGw7XG4gICAgICBjb25zdCBuZXh0U29ydE9yZGVyID0gbmV4dFNvcnREaXJlY3Rpb24oc29ydERpcmVjdGlvbnMsIHNvcnRPcmRlcik7XG4gICAgICBsZXQgc29ydGVyO1xuICAgICAgaWYgKGNvbHVtbi5zb3J0SWNvbikge1xuICAgICAgICBzb3J0ZXIgPSBjb2x1bW4uc29ydEljb24oe1xuICAgICAgICAgIHNvcnRPcmRlclxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHVwTm9kZSA9IHNvcnREaXJlY3Rpb25zLmluY2x1ZGVzKEFTQ0VORCkgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DYXJldFVwT3V0bGluZWQuZGVmYXVsdCwge1xuICAgICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGAke3ByZWZpeENsc30tY29sdW1uLXNvcnRlci11cGAsIHtcbiAgICAgICAgICAgIGFjdGl2ZTogc29ydE9yZGVyID09PSBBU0NFTkRcbiAgICAgICAgICB9KVxuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IGRvd25Ob2RlID0gc29ydERpcmVjdGlvbnMuaW5jbHVkZXMoREVTQ0VORCkgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DYXJldERvd25PdXRsaW5lZC5kZWZhdWx0LCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoYCR7cHJlZml4Q2xzfS1jb2x1bW4tc29ydGVyLWRvd25gLCB7XG4gICAgICAgICAgICBhY3RpdmU6IHNvcnRPcmRlciA9PT0gREVTQ0VORFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pKTtcbiAgICAgICAgc29ydGVyID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShgJHtwcmVmaXhDbHN9LWNvbHVtbi1zb3J0ZXJgLCB7XG4gICAgICAgICAgICBbYCR7cHJlZml4Q2xzfS1jb2x1bW4tc29ydGVyLWZ1bGxgXTogISEodXBOb2RlICYmIGRvd25Ob2RlKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWNvbHVtbi1zb3J0ZXItaW5uZXJgLFxuICAgICAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcbiAgICAgICAgfSwgdXBOb2RlLCBkb3duTm9kZSkpO1xuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICBjYW5jZWxTb3J0LFxuICAgICAgICB0cmlnZ2VyQXNjLFxuICAgICAgICB0cmlnZ2VyRGVzY1xuICAgICAgfSA9IHRhYmxlTG9jYWxlIHx8IHt9O1xuICAgICAgbGV0IHNvcnRUaXAgPSBjYW5jZWxTb3J0O1xuICAgICAgaWYgKG5leHRTb3J0T3JkZXIgPT09IERFU0NFTkQpIHtcbiAgICAgICAgc29ydFRpcCA9IHRyaWdnZXJEZXNjO1xuICAgICAgfSBlbHNlIGlmIChuZXh0U29ydE9yZGVyID09PSBBU0NFTkQpIHtcbiAgICAgICAgc29ydFRpcCA9IHRyaWdnZXJBc2M7XG4gICAgICB9XG4gICAgICBjb25zdCB0b29sdGlwUHJvcHMgPSB0eXBlb2Ygc2hvd1NvcnRlclRvb2x0aXAgPT09ICdvYmplY3QnID8gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIHRpdGxlOiBzb3J0VGlwXG4gICAgICB9LCBzaG93U29ydGVyVG9vbHRpcCkgOiB7XG4gICAgICAgIHRpdGxlOiBzb3J0VGlwXG4gICAgICB9O1xuICAgICAgbmV3Q29sdW1uID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBuZXdDb2x1bW4pLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKG5ld0NvbHVtbi5jbGFzc05hbWUsIHtcbiAgICAgICAgICBbYCR7cHJlZml4Q2xzfS1jb2x1bW4tc29ydGBdOiBzb3J0T3JkZXJcbiAgICAgICAgfSksXG4gICAgICAgIHRpdGxlOiByZW5kZXJQcm9wcyA9PiB7XG4gICAgICAgICAgY29uc3QgY29sdW1uU29ydGVyc0NsYXNzID0gYCR7cHJlZml4Q2xzfS1jb2x1bW4tc29ydGVyc2A7XG4gICAgICAgICAgY29uc3QgcmVuZGVyQ29sdW1uVGl0bGVXcmFwcGVyID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1jb2x1bW4tdGl0bGVgXG4gICAgICAgICAgfSwgKDAsIF91dGlsLnJlbmRlckNvbHVtblRpdGxlKShjb2x1bW4udGl0bGUsIHJlbmRlclByb3BzKSk7XG4gICAgICAgICAgY29uc3QgcmVuZGVyU29ydFRpdGxlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBjb2x1bW5Tb3J0ZXJzQ2xhc3NcbiAgICAgICAgICB9LCByZW5kZXJDb2x1bW5UaXRsZVdyYXBwZXIsIHNvcnRlcik7XG4gICAgICAgICAgaWYgKHNob3dTb3J0ZXJUb29sdGlwKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNob3dTb3J0ZXJUb29sdGlwICE9PSAnYm9vbGVhbicgJiYgKHNob3dTb3J0ZXJUb29sdGlwID09PSBudWxsIHx8IHNob3dTb3J0ZXJUb29sdGlwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzaG93U29ydGVyVG9vbHRpcC50YXJnZXQpID09PSAnc29ydGVyLWljb24nKSB7XG4gICAgICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBgJHtjb2x1bW5Tb3J0ZXJzQ2xhc3N9ICR7cHJlZml4Q2xzfS1jb2x1bW4tc29ydGVycy10b29sdGlwLXRhcmdldC1zb3J0ZXJgXG4gICAgICAgICAgICAgIH0sIHJlbmRlckNvbHVtblRpdGxlV3JhcHBlciwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3Rvb2x0aXAuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgdG9vbHRpcFByb3BzKSwgc29ydGVyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3Rvb2x0aXAuZGVmYXVsdCwgT2JqZWN0LmFzc2lnbih7fSwgdG9vbHRpcFByb3BzKSwgcmVuZGVyU29ydFRpdGxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlbmRlclNvcnRUaXRsZTtcbiAgICAgICAgfSxcbiAgICAgICAgb25IZWFkZXJDZWxsOiBjb2wgPT4ge1xuICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICBjb25zdCBjZWxsID0gKChfYSA9IGNvbHVtbi5vbkhlYWRlckNlbGwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGNvbHVtbiwgY29sKSkgfHwge307XG4gICAgICAgICAgY29uc3Qgb3JpZ2luT25DbGljayA9IGNlbGwub25DbGljaztcbiAgICAgICAgICBjb25zdCBvcmlnaW5PS2V5RG93biA9IGNlbGwub25LZXlEb3duO1xuICAgICAgICAgIGNlbGwub25DbGljayA9IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIHRyaWdnZXJTb3J0ZXIoe1xuICAgICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgICAgIGtleTogY29sdW1uS2V5LFxuICAgICAgICAgICAgICBzb3J0T3JkZXI6IG5leHRTb3J0T3JkZXIsXG4gICAgICAgICAgICAgIG11bHRpcGxlUHJpb3JpdHk6IGdldE11bHRpcGxlUHJpb3JpdHkoY29sdW1uKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvcmlnaW5PbkNsaWNrID09PSBudWxsIHx8IG9yaWdpbk9uQ2xpY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbk9uQ2xpY2soZXZlbnQpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgY2VsbC5vbktleURvd24gPSBldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gX0tleUNvZGUuZGVmYXVsdC5FTlRFUikge1xuICAgICAgICAgICAgICB0cmlnZ2VyU29ydGVyKHtcbiAgICAgICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgICAgICAga2V5OiBjb2x1bW5LZXksXG4gICAgICAgICAgICAgICAgc29ydE9yZGVyOiBuZXh0U29ydE9yZGVyLFxuICAgICAgICAgICAgICAgIG11bHRpcGxlUHJpb3JpdHk6IGdldE11bHRpcGxlUHJpb3JpdHkoY29sdW1uKVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgb3JpZ2luT0tleURvd24gPT09IG51bGwgfHwgb3JpZ2luT0tleURvd24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbk9LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHJlbmRlclRpdGxlID0gKDAsIF91dGlsLnNhZmVDb2x1bW5UaXRsZSkoY29sdW1uLnRpdGxlLCB7fSk7XG4gICAgICAgICAgY29uc3QgZGlzcGxheVRpdGxlID0gcmVuZGVyVGl0bGUgPT09IG51bGwgfHwgcmVuZGVyVGl0bGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlbmRlclRpdGxlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgLy8gSW5mb3JtIHRoZSBzY3JlZW4tcmVhZGVyIHNvIGl0IGNhbiB0ZWxsIHRoZSB2aXN1YWxseSBpbXBhaXJlZCB1c2VyIHdoaWNoIGNvbHVtbiBpcyBzb3J0ZWRcbiAgICAgICAgICBpZiAoc29ydE9yZGVyKSB7XG4gICAgICAgICAgICBjZWxsWydhcmlhLXNvcnQnXSA9IHNvcnRPcmRlciA9PT0gJ2FzY2VuZCcgPyAnYXNjZW5kaW5nJyA6ICdkZXNjZW5kaW5nJztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2VsbFsnYXJpYS1sYWJlbCddID0gZGlzcGxheVRpdGxlIHx8ICcnO1xuICAgICAgICAgIGNlbGwuY2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGNlbGwuY2xhc3NOYW1lLCBgJHtwcmVmaXhDbHN9LWNvbHVtbi1oYXMtc29ydGVyc2ApO1xuICAgICAgICAgIGNlbGwudGFiSW5kZXggPSAwO1xuICAgICAgICAgIGlmIChjb2x1bW4uZWxsaXBzaXMpIHtcbiAgICAgICAgICAgIGNlbGwudGl0bGUgPSAocmVuZGVyVGl0bGUgIT09IG51bGwgJiYgcmVuZGVyVGl0bGUgIT09IHZvaWQgMCA/IHJlbmRlclRpdGxlIDogJycpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjZWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCdjaGlsZHJlbicgaW4gbmV3Q29sdW1uKSB7XG4gICAgICBuZXdDb2x1bW4gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG5ld0NvbHVtbiksIHtcbiAgICAgICAgY2hpbGRyZW46IGluamVjdFNvcnRlcihwcmVmaXhDbHMsIG5ld0NvbHVtbi5jaGlsZHJlbiwgc29ydGVyU3RhdGVzLCB0cmlnZ2VyU29ydGVyLCBkZWZhdWx0U29ydERpcmVjdGlvbnMsIHRhYmxlTG9jYWxlLCB0YWJsZVNob3dTb3J0ZXJUb29sdGlwLCBjb2x1bW5Qb3MpXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0NvbHVtbjtcbiAgfSk7XG4gIHJldHVybiBmaW5hbENvbHVtbnM7XG59O1xuY29uc3Qgc3RhdGVUb0luZm8gPSBzb3J0ZXJTdGF0ZSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb2x1bW4sXG4gICAgc29ydE9yZGVyXG4gIH0gPSBzb3J0ZXJTdGF0ZTtcbiAgcmV0dXJuIHtcbiAgICBjb2x1bW4sXG4gICAgb3JkZXI6IHNvcnRPcmRlcixcbiAgICBmaWVsZDogY29sdW1uLmRhdGFJbmRleCxcbiAgICBjb2x1bW5LZXk6IGNvbHVtbi5rZXlcbiAgfTtcbn07XG5jb25zdCBnZW5lcmF0ZVNvcnRlckluZm8gPSBzb3J0ZXJTdGF0ZXMgPT4ge1xuICBjb25zdCBhY3RpdmVTb3J0ZXJzID0gc29ydGVyU3RhdGVzLmZpbHRlcigoe1xuICAgIHNvcnRPcmRlclxuICB9KSA9PiBzb3J0T3JkZXIpLm1hcChzdGF0ZVRvSW5mbyk7XG4gIC8vID09PT09PT09PT09IExlZ2FjeSBjb21wYXRpYmxlIHN1cHBvcnQgPT09PT09PT09PT1cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9wdWxsLzE5MjI2XG4gIGlmIChhY3RpdmVTb3J0ZXJzLmxlbmd0aCA9PT0gMCAmJiBzb3J0ZXJTdGF0ZXMubGVuZ3RoKSB7XG4gICAgY29uc3QgbGFzdEluZGV4ID0gc29ydGVyU3RhdGVzLmxlbmd0aCAtIDE7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGVUb0luZm8oc29ydGVyU3RhdGVzW2xhc3RJbmRleF0pKSwge1xuICAgICAgY29sdW1uOiB1bmRlZmluZWQsXG4gICAgICBvcmRlcjogdW5kZWZpbmVkLFxuICAgICAgZmllbGQ6IHVuZGVmaW5lZCxcbiAgICAgIGNvbHVtbktleTogdW5kZWZpbmVkXG4gICAgfSk7XG4gIH1cbiAgaWYgKGFjdGl2ZVNvcnRlcnMubGVuZ3RoIDw9IDEpIHtcbiAgICByZXR1cm4gYWN0aXZlU29ydGVyc1swXSB8fCB7fTtcbiAgfVxuICByZXR1cm4gYWN0aXZlU29ydGVycztcbn07XG5jb25zdCBnZXRTb3J0RGF0YSA9IChkYXRhLCBzb3J0U3RhdGVzLCBjaGlsZHJlbkNvbHVtbk5hbWUpID0+IHtcbiAgY29uc3QgaW5uZXJTb3J0ZXJTdGF0ZXMgPSBzb3J0U3RhdGVzLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gYi5tdWx0aXBsZVByaW9yaXR5IC0gYS5tdWx0aXBsZVByaW9yaXR5KTtcbiAgY29uc3QgY2xvbmVEYXRhID0gZGF0YS5zbGljZSgpO1xuICBjb25zdCBydW5uaW5nU29ydGVycyA9IGlubmVyU29ydGVyU3RhdGVzLmZpbHRlcigoe1xuICAgIGNvbHVtbjoge1xuICAgICAgc29ydGVyXG4gICAgfSxcbiAgICBzb3J0T3JkZXJcbiAgfSkgPT4gZ2V0U29ydEZ1bmN0aW9uKHNvcnRlcikgJiYgc29ydE9yZGVyKTtcbiAgLy8gU2tpcCBpZiBubyBzb3J0ZXIgbmVlZGVkXG4gIGlmICghcnVubmluZ1NvcnRlcnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGNsb25lRGF0YTtcbiAgfVxuICByZXR1cm4gY2xvbmVEYXRhLnNvcnQoKHJlY29yZDEsIHJlY29yZDIpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJ1bm5pbmdTb3J0ZXJzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBzb3J0ZXJTdGF0ZSA9IHJ1bm5pbmdTb3J0ZXJzW2ldO1xuICAgICAgY29uc3Qge1xuICAgICAgICBjb2x1bW46IHtcbiAgICAgICAgICBzb3J0ZXJcbiAgICAgICAgfSxcbiAgICAgICAgc29ydE9yZGVyXG4gICAgICB9ID0gc29ydGVyU3RhdGU7XG4gICAgICBjb25zdCBjb21wYXJlRm4gPSBnZXRTb3J0RnVuY3Rpb24oc29ydGVyKTtcbiAgICAgIGlmIChjb21wYXJlRm4gJiYgc29ydE9yZGVyKSB7XG4gICAgICAgIGNvbnN0IGNvbXBhcmVSZXN1bHQgPSBjb21wYXJlRm4ocmVjb3JkMSwgcmVjb3JkMiwgc29ydE9yZGVyKTtcbiAgICAgICAgaWYgKGNvbXBhcmVSZXN1bHQgIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gc29ydE9yZGVyID09PSBBU0NFTkQgPyBjb21wYXJlUmVzdWx0IDogLWNvbXBhcmVSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH0pLm1hcChyZWNvcmQgPT4ge1xuICAgIGNvbnN0IHN1YlJlY29yZHMgPSByZWNvcmRbY2hpbGRyZW5Db2x1bW5OYW1lXTtcbiAgICBpZiAoc3ViUmVjb3Jkcykge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb3JkKSwge1xuICAgICAgICBbY2hpbGRyZW5Db2x1bW5OYW1lXTogZ2V0U29ydERhdGEoc3ViUmVjb3Jkcywgc29ydFN0YXRlcywgY2hpbGRyZW5Db2x1bW5OYW1lKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZWNvcmQ7XG4gIH0pO1xufTtcbmV4cG9ydHMuZ2V0U29ydERhdGEgPSBnZXRTb3J0RGF0YTtcbmNvbnN0IHVzZUZpbHRlclNvcnRlciA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIHByZWZpeENscyxcbiAgICBtZXJnZWRDb2x1bW5zLFxuICAgIHNvcnREaXJlY3Rpb25zLFxuICAgIHRhYmxlTG9jYWxlLFxuICAgIHNob3dTb3J0ZXJUb29sdGlwLFxuICAgIG9uU29ydGVyQ2hhbmdlXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgW3NvcnRTdGF0ZXMsIHNldFNvcnRTdGF0ZXNdID0gUmVhY3QudXNlU3RhdGUoKCkgPT4gY29sbGVjdFNvcnRTdGF0ZXMobWVyZ2VkQ29sdW1ucywgdHJ1ZSkpO1xuICBjb25zdCBnZXRDb2x1bW5LZXlzID0gKGNvbHVtbnMsIHBvcykgPT4ge1xuICAgIGNvbnN0IG5ld0tleXMgPSBbXTtcbiAgICBjb2x1bW5zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBjb2x1bW5Qb3MgPSAoMCwgX3V0aWwuZ2V0Q29sdW1uUG9zKShpbmRleCwgcG9zKTtcbiAgICAgIG5ld0tleXMucHVzaCgoMCwgX3V0aWwuZ2V0Q29sdW1uS2V5KShpdGVtLCBjb2x1bW5Qb3MpKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0uY2hpbGRyZW4pKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkS2V5cyA9IGdldENvbHVtbktleXMoaXRlbS5jaGlsZHJlbiwgY29sdW1uUG9zKTtcbiAgICAgICAgbmV3S2V5cy5wdXNoLmFwcGx5KG5ld0tleXMsICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGNoaWxkS2V5cykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBuZXdLZXlzO1xuICB9O1xuICBjb25zdCBtZXJnZWRTb3J0ZXJTdGF0ZXMgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBsZXQgdmFsaWRhdGUgPSB0cnVlO1xuICAgIGNvbnN0IGNvbGxlY3RlZFN0YXRlcyA9IGNvbGxlY3RTb3J0U3RhdGVzKG1lcmdlZENvbHVtbnMsIGZhbHNlKTtcbiAgICAvLyBSZXR1cm4gaWYgbm90IGNvbnRyb2xsZWRcbiAgICBpZiAoIWNvbGxlY3RlZFN0YXRlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG1lcmdlZENvbHVtbnNLZXlzID0gZ2V0Q29sdW1uS2V5cyhtZXJnZWRDb2x1bW5zKTtcbiAgICAgIHJldHVybiBzb3J0U3RhdGVzLmZpbHRlcigoe1xuICAgICAgICBrZXlcbiAgICAgIH0pID0+IG1lcmdlZENvbHVtbnNLZXlzLmluY2x1ZGVzKGtleSkpO1xuICAgIH1cbiAgICBjb25zdCB2YWxpZGF0ZVN0YXRlcyA9IFtdO1xuICAgIGZ1bmN0aW9uIHBhdGNoU3RhdGVzKHN0YXRlKSB7XG4gICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgdmFsaWRhdGVTdGF0ZXMucHVzaChzdGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWxpZGF0ZVN0YXRlcy5wdXNoKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7XG4gICAgICAgICAgc29ydE9yZGVyOiBudWxsXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IG11bHRpcGxlTW9kZSA9IG51bGw7XG4gICAgY29sbGVjdGVkU3RhdGVzLmZvckVhY2goc3RhdGUgPT4ge1xuICAgICAgaWYgKG11bHRpcGxlTW9kZSA9PT0gbnVsbCkge1xuICAgICAgICBwYXRjaFN0YXRlcyhzdGF0ZSk7XG4gICAgICAgIGlmIChzdGF0ZS5zb3J0T3JkZXIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUubXVsdGlwbGVQcmlvcml0eSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG11bHRpcGxlTW9kZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG11bHRpcGxlTW9kZSAmJiBzdGF0ZS5tdWx0aXBsZVByaW9yaXR5ICE9PSBmYWxzZSkge1xuICAgICAgICBwYXRjaFN0YXRlcyhzdGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWxpZGF0ZSA9IGZhbHNlO1xuICAgICAgICBwYXRjaFN0YXRlcyhzdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbGlkYXRlU3RhdGVzO1xuICB9LCBbbWVyZ2VkQ29sdW1ucywgc29ydFN0YXRlc10pO1xuICAvLyBHZXQgcmVuZGVyIGNvbHVtbnMgdGl0bGUgcmVxdWlyZWQgcHJvcHNcbiAgY29uc3QgY29sdW1uVGl0bGVTb3J0ZXJQcm9wcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIHZhciBfYSwgX2I7XG4gICAgY29uc3Qgc29ydENvbHVtbnMgPSBtZXJnZWRTb3J0ZXJTdGF0ZXMubWFwKCh7XG4gICAgICBjb2x1bW4sXG4gICAgICBzb3J0T3JkZXJcbiAgICB9KSA9PiAoe1xuICAgICAgY29sdW1uLFxuICAgICAgb3JkZXI6IHNvcnRPcmRlclxuICAgIH0pKTtcbiAgICByZXR1cm4ge1xuICAgICAgc29ydENvbHVtbnMsXG4gICAgICAvLyBMZWdhY3lcbiAgICAgIHNvcnRDb2x1bW46IChfYSA9IHNvcnRDb2x1bW5zWzBdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29sdW1uLFxuICAgICAgc29ydE9yZGVyOiAoX2IgPSBzb3J0Q29sdW1uc1swXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm9yZGVyXG4gICAgfTtcbiAgfSwgW21lcmdlZFNvcnRlclN0YXRlc10pO1xuICBjb25zdCB0cmlnZ2VyU29ydGVyID0gc29ydFN0YXRlID0+IHtcbiAgICBsZXQgbmV3U29ydGVyU3RhdGVzO1xuICAgIGlmIChzb3J0U3RhdGUubXVsdGlwbGVQcmlvcml0eSA9PT0gZmFsc2UgfHwgIW1lcmdlZFNvcnRlclN0YXRlcy5sZW5ndGggfHwgbWVyZ2VkU29ydGVyU3RhdGVzWzBdLm11bHRpcGxlUHJpb3JpdHkgPT09IGZhbHNlKSB7XG4gICAgICBuZXdTb3J0ZXJTdGF0ZXMgPSBbc29ydFN0YXRlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3U29ydGVyU3RhdGVzID0gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKG1lcmdlZFNvcnRlclN0YXRlcy5maWx0ZXIoKHtcbiAgICAgICAga2V5XG4gICAgICB9KSA9PiBrZXkgIT09IHNvcnRTdGF0ZS5rZXkpKSwgW3NvcnRTdGF0ZV0pO1xuICAgIH1cbiAgICBzZXRTb3J0U3RhdGVzKG5ld1NvcnRlclN0YXRlcyk7XG4gICAgb25Tb3J0ZXJDaGFuZ2UoZ2VuZXJhdGVTb3J0ZXJJbmZvKG5ld1NvcnRlclN0YXRlcyksIG5ld1NvcnRlclN0YXRlcyk7XG4gIH07XG4gIGNvbnN0IHRyYW5zZm9ybUNvbHVtbnMgPSBpbm5lckNvbHVtbnMgPT4gaW5qZWN0U29ydGVyKHByZWZpeENscywgaW5uZXJDb2x1bW5zLCBtZXJnZWRTb3J0ZXJTdGF0ZXMsIHRyaWdnZXJTb3J0ZXIsIHNvcnREaXJlY3Rpb25zLCB0YWJsZUxvY2FsZSwgc2hvd1NvcnRlclRvb2x0aXApO1xuICBjb25zdCBnZXRTb3J0ZXJzID0gKCkgPT4gZ2VuZXJhdGVTb3J0ZXJJbmZvKG1lcmdlZFNvcnRlclN0YXRlcyk7XG4gIHJldHVybiBbdHJhbnNmb3JtQ29sdW1ucywgbWVyZ2VkU29ydGVyU3RhdGVzLCBjb2x1bW5UaXRsZVNvcnRlclByb3BzLCBnZXRTb3J0ZXJzXTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB1c2VGaWx0ZXJTb3J0ZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF91dGlsID0gcmVxdWlyZShcIi4uL3V0aWxcIik7XG5jb25zdCBmaWxsVGl0bGUgPSAoY29sdW1ucywgY29sdW1uVGl0bGVQcm9wcykgPT4ge1xuICBjb25zdCBmaW5hbENvbHVtbnMgPSBjb2x1bW5zLm1hcChjb2x1bW4gPT4ge1xuICAgIGNvbnN0IGNsb25lQ29sdW1uID0gT2JqZWN0LmFzc2lnbih7fSwgY29sdW1uKTtcbiAgICBjbG9uZUNvbHVtbi50aXRsZSA9ICgwLCBfdXRpbC5yZW5kZXJDb2x1bW5UaXRsZSkoY29sdW1uLnRpdGxlLCBjb2x1bW5UaXRsZVByb3BzKTtcbiAgICBpZiAoJ2NoaWxkcmVuJyBpbiBjbG9uZUNvbHVtbikge1xuICAgICAgY2xvbmVDb2x1bW4uY2hpbGRyZW4gPSBmaWxsVGl0bGUoY2xvbmVDb2x1bW4uY2hpbGRyZW4sIGNvbHVtblRpdGxlUHJvcHMpO1xuICAgIH1cbiAgICByZXR1cm4gY2xvbmVDb2x1bW47XG4gIH0pO1xuICByZXR1cm4gZmluYWxDb2x1bW5zO1xufTtcbmNvbnN0IHVzZVRpdGxlQ29sdW1ucyA9IGNvbHVtblRpdGxlUHJvcHMgPT4ge1xuICBjb25zdCBmaWxsZWRDb2x1bW5zID0gUmVhY3QudXNlQ2FsbGJhY2soY29sdW1ucyA9PiBmaWxsVGl0bGUoY29sdW1ucywgY29sdW1uVGl0bGVQcm9wcyksIFtjb2x1bW5UaXRsZVByb3BzXSk7XG4gIHJldHVybiBbZmlsbGVkQ29sdW1uc107XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdXNlVGl0bGVDb2x1bW5zOyIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9UYWJsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVGFibGVcIikpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gX1RhYmxlLmRlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2Nzc2luanMgPSByZXF1aXJlKFwiQGFudC1kZXNpZ24vY3NzaW5qc1wiKTtcbmNvbnN0IGdlbkJvcmRlcmVkU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgbGluZVdpZHRoLFxuICAgIGxpbmVUeXBlLFxuICAgIHRhYmxlQm9yZGVyQ29sb3IsXG4gICAgdGFibGVIZWFkZXJCZyxcbiAgICB0YWJsZVBhZGRpbmdWZXJ0aWNhbCxcbiAgICB0YWJsZVBhZGRpbmdIb3Jpem9udGFsLFxuICAgIGNhbGNcbiAgfSA9IHRva2VuO1xuICBjb25zdCB0YWJsZUJvcmRlciA9IGAkeygwLCBfY3NzaW5qcy51bml0KShsaW5lV2lkdGgpfSAke2xpbmVUeXBlfSAke3RhYmxlQm9yZGVyQ29sb3J9YDtcbiAgY29uc3QgZ2V0U2l6ZUJvcmRlclN0eWxlID0gKHNpemUsIHBhZGRpbmdWZXJ0aWNhbCwgcGFkZGluZ0hvcml6b250YWwpID0+ICh7XG4gICAgW2AmJHtjb21wb25lbnRDbHN9LSR7c2l6ZX1gXToge1xuICAgICAgW2A+ICR7Y29tcG9uZW50Q2xzfS1jb250YWluZXJgXToge1xuICAgICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWNvbnRlbnQsID4gJHtjb21wb25lbnRDbHN9LWJvZHlgXToge1xuICAgICAgICAgIFtgXG4gICAgICAgICAgICA+IHRhYmxlID4gdGJvZHkgPiB0ciA+IHRoLFxuICAgICAgICAgICAgPiB0YWJsZSA+IHRib2R5ID4gdHIgPiB0ZFxuICAgICAgICAgIGBdOiB7XG4gICAgICAgICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWV4cGFuZGVkLXJvdy1maXhlZGBdOiB7XG4gICAgICAgICAgICAgIG1hcmdpbjogYCR7KDAsIF9jc3NpbmpzLnVuaXQpKGNhbGMocGFkZGluZ1ZlcnRpY2FsKS5tdWwoLTEpLmVxdWFsKCkpfVxuICAgICAgICAgICAgICAkeygwLCBfY3NzaW5qcy51bml0KShjYWxjKGNhbGMocGFkZGluZ0hvcml6b250YWwpLmFkZChsaW5lV2lkdGgpKS5tdWwoLTEpLmVxdWFsKCkpfWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXToge1xuICAgICAgW2Ake2NvbXBvbmVudENsc30ke2NvbXBvbmVudENsc30tYm9yZGVyZWRgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFRpdGxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIFtgPiAke2NvbXBvbmVudENsc30tdGl0bGVgXToge1xuICAgICAgICAgIGJvcmRlcjogdGFibGVCb3JkZXIsXG4gICAgICAgICAgYm9yZGVyQm90dG9tOiAwXG4gICAgICAgIH0sXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29udGVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIFtgPiAke2NvbXBvbmVudENsc30tY29udGFpbmVyYF06IHtcbiAgICAgICAgICBib3JkZXJJbmxpbmVTdGFydDogdGFibGVCb3JkZXIsXG4gICAgICAgICAgYm9yZGVyVG9wOiB0YWJsZUJvcmRlcixcbiAgICAgICAgICBbYFxuICAgICAgICAgICAgPiAke2NvbXBvbmVudENsc30tY29udGVudCxcbiAgICAgICAgICAgID4gJHtjb21wb25lbnRDbHN9LWhlYWRlcixcbiAgICAgICAgICAgID4gJHtjb21wb25lbnRDbHN9LWJvZHksXG4gICAgICAgICAgICA+ICR7Y29tcG9uZW50Q2xzfS1zdW1tYXJ5XG4gICAgICAgICAgYF06IHtcbiAgICAgICAgICAgICc+IHRhYmxlJzoge1xuICAgICAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDZWxsID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgICAgIFtgXG4gICAgICAgICAgICAgICAgPiB0aGVhZCA+IHRyID4gdGgsXG4gICAgICAgICAgICAgICAgPiB0aGVhZCA+IHRyID4gdGQsXG4gICAgICAgICAgICAgICAgPiB0Ym9keSA+IHRyID4gdGgsXG4gICAgICAgICAgICAgICAgPiB0Ym9keSA+IHRyID4gdGQsXG4gICAgICAgICAgICAgICAgPiB0Zm9vdCA+IHRyID4gdGgsXG4gICAgICAgICAgICAgICAgPiB0Zm9vdCA+IHRyID4gdGRcbiAgICAgICAgICAgICAgYF06IHtcbiAgICAgICAgICAgICAgICBib3JkZXJJbmxpbmVFbmQ6IHRhYmxlQm9yZGVyXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSGVhZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgICAgICAgJz4gdGhlYWQnOiB7XG4gICAgICAgICAgICAgICAgJz4gdHI6bm90KDpsYXN0LWNoaWxkKSA+IHRoJzoge1xuICAgICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tOiB0YWJsZUJvcmRlclxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJz4gdHIgPiB0aDo6YmVmb3JlJzoge1xuICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQgIWltcG9ydGFudCdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC8vIEZpeGVkIHJpZ2h0IHNob3VsZCBwcm92aWRlcyBhZGRpdGlvbmFsIGJvcmRlclxuICAgICAgICAgICAgICBbYFxuICAgICAgICAgICAgICAgID4gdGhlYWQgPiB0cixcbiAgICAgICAgICAgICAgICA+IHRib2R5ID4gdHIsXG4gICAgICAgICAgICAgICAgPiB0Zm9vdCA+IHRyXG4gICAgICAgICAgICAgIGBdOiB7XG4gICAgICAgICAgICAgICAgW2A+ICR7Y29tcG9uZW50Q2xzfS1jZWxsLWZpeC1yaWdodC1maXJzdDo6YWZ0ZXJgXToge1xuICAgICAgICAgICAgICAgICAgYm9yZGVySW5saW5lRW5kOiB0YWJsZUJvcmRlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gRXhwYW5kYWJsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAgICAgICBbYFxuICAgICAgICAgICAgICAgID4gdGJvZHkgPiB0ciA+IHRoLFxuICAgICAgICAgICAgICAgID4gdGJvZHkgPiB0ciA+IHRkXG4gICAgICAgICAgICAgIGBdOiB7XG4gICAgICAgICAgICAgICAgW2A+ICR7Y29tcG9uZW50Q2xzfS1leHBhbmRlZC1yb3ctZml4ZWRgXToge1xuICAgICAgICAgICAgICAgICAgbWFyZ2luOiBgJHsoMCwgX2Nzc2luanMudW5pdCkoY2FsYyh0YWJsZVBhZGRpbmdWZXJ0aWNhbCkubXVsKC0xKS5lcXVhbCgpKX0gJHsoMCwgX2Nzc2luanMudW5pdCkoY2FsYyhjYWxjKHRhYmxlUGFkZGluZ0hvcml6b250YWwpLmFkZChsaW5lV2lkdGgpKS5tdWwoLTEpLmVxdWFsKCkpfWAsXG4gICAgICAgICAgICAgICAgICAnJjo6YWZ0ZXInOiB7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgICAgIGluc2V0SW5saW5lRW5kOiBsaW5lV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVySW5saW5lRW5kOiB0YWJsZUJvcmRlcixcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogJ1wiXCInXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNjcm9sbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS1zY3JvbGwtaG9yaXpvbnRhbGBdOiB7XG4gICAgICAgICAgW2A+ICR7Y29tcG9uZW50Q2xzfS1jb250YWluZXIgPiAke2NvbXBvbmVudENsc30tYm9keWBdOiB7XG4gICAgICAgICAgICAnPiB0YWJsZSA+IHRib2R5Jzoge1xuICAgICAgICAgICAgICBbYFxuICAgICAgICAgICAgICAgID4gdHIke2NvbXBvbmVudENsc30tZXhwYW5kZWQtcm93LFxuICAgICAgICAgICAgICAgID4gdHIke2NvbXBvbmVudENsc30tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgYF06IHtcbiAgICAgICAgICAgICAgICAnPiB0aCwgPiB0ZCc6IHtcbiAgICAgICAgICAgICAgICAgIGJvcmRlcklubGluZUVuZDogMFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgZ2V0U2l6ZUJvcmRlclN0eWxlKCdtaWRkbGUnLCB0b2tlbi50YWJsZVBhZGRpbmdWZXJ0aWNhbE1pZGRsZSwgdG9rZW4udGFibGVQYWRkaW5nSG9yaXpvbnRhbE1pZGRsZSkpLCBnZXRTaXplQm9yZGVyU3R5bGUoJ3NtYWxsJywgdG9rZW4udGFibGVQYWRkaW5nVmVydGljYWxTbWFsbCwgdG9rZW4udGFibGVQYWRkaW5nSG9yaXpvbnRhbFNtYWxsKSksIHtcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBGb290ZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWZvb3RlcmBdOiB7XG4gICAgICAgICAgYm9yZGVyOiB0YWJsZUJvcmRlcixcbiAgICAgICAgICBib3JkZXJUb3A6IDBcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IE5lc3RlZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jZWxsYF06IHtcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tY29udGFpbmVyOmZpcnN0LWNoaWxkYF06IHtcbiAgICAgICAgICAvLyA6Zmlyc3QtY2hpbGQgdG8gYXZvaWQgdGhlIGNhc2Ugd2hlbiBib3JkZXJlZCBhbmQgdGl0bGUgaXMgc2V0XG4gICAgICAgICAgYm9yZGVyVG9wOiAwXG4gICAgICAgIH0sXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM1NTc3XG4gICAgICAgICcmLXNjcm9sbGJhcjpub3QoW3Jvd3NwYW5dKSc6IHtcbiAgICAgICAgICBib3hTaGFkb3c6IGAwICR7KDAsIF9jc3NpbmpzLnVuaXQpKGxpbmVXaWR0aCl9IDAgJHsoMCwgX2Nzc2luanMudW5pdCkobGluZVdpZHRoKX0gJHt0YWJsZUhlYWRlckJnfWBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWJvcmRlcmVkICR7Y29tcG9uZW50Q2xzfS1jZWxsLXNjcm9sbGJhcmBdOiB7XG4gICAgICAgIGJvcmRlcklubGluZUVuZDogdGFibGVCb3JkZXJcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gZ2VuQm9yZGVyZWRTdHlsZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfc3R5bGUgPSByZXF1aXJlKFwiLi4vLi4vc3R5bGVcIik7XG5jb25zdCBnZW5FbGxpcHNpc1N0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyYF06IHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWNlbGwtZWxsaXBzaXNgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBfc3R5bGUudGV4dEVsbGlwc2lzKSwge1xuICAgICAgICB3b3JkQnJlYWs6ICdrZWVwLWFsbCcsXG4gICAgICAgIC8vIEZpeGVkIGZpcnN0IG9yIGxhc3Qgc2hvdWxkIHNwZWNpYWwgcHJvY2Vzc1xuICAgICAgICBbYFxuICAgICAgICAgICYke2NvbXBvbmVudENsc30tY2VsbC1maXgtbGVmdC1sYXN0LFxuICAgICAgICAgICYke2NvbXBvbmVudENsc30tY2VsbC1maXgtcmlnaHQtZmlyc3RcbiAgICAgICAgYF06IHtcbiAgICAgICAgICBvdmVyZmxvdzogJ3Zpc2libGUnLFxuICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWNlbGwtY29udGVudGBdOiB7XG4gICAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgICAgdGV4dE92ZXJmbG93OiAnZWxsaXBzaXMnXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jb2x1bW4tdGl0bGVgXToge1xuICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgICB0ZXh0T3ZlcmZsb3c6ICdlbGxpcHNpcycsXG4gICAgICAgICAgd29yZEJyZWFrOiAna2VlcC1hbGwnXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9O1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGdlbkVsbGlwc2lzU3R5bGU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFBsYWNlaG9sZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09XG5jb25zdCBnZW5FbXB0eVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyYF06IHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXRib2R5ID4gdHIke2NvbXBvbmVudENsc30tcGxhY2Vob2xkZXJgXToge1xuICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGlzYWJsZWQsXG4gICAgICAgIFtgXG4gICAgICAgICAgJjpob3ZlciA+IHRoLFxuICAgICAgICAgICY6aG92ZXIgPiB0ZCxcbiAgICAgICAgYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gZ2VuRW1wdHlTdHlsZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfY3NzaW5qcyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jc3NpbmpzXCIpO1xudmFyIF9zdHlsZSA9IHJlcXVpcmUoXCIuLi8uLi9zdHlsZVwiKTtcbmNvbnN0IGdlbkV4cGFuZFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGFudENscyxcbiAgICBtb3Rpb25EdXJhdGlvblNsb3csXG4gICAgbGluZVdpZHRoLFxuICAgIHBhZGRpbmdYUyxcbiAgICBsaW5lVHlwZSxcbiAgICB0YWJsZUJvcmRlckNvbG9yLFxuICAgIHRhYmxlRXhwYW5kSWNvbkJnLFxuICAgIHRhYmxlRXhwYW5kQ29sdW1uV2lkdGgsXG4gICAgYm9yZGVyUmFkaXVzLFxuICAgIHRhYmxlUGFkZGluZ1ZlcnRpY2FsLFxuICAgIHRhYmxlUGFkZGluZ0hvcml6b250YWwsXG4gICAgdGFibGVFeHBhbmRlZFJvd0JnLFxuICAgIHBhZGRpbmdYWFMsXG4gICAgZXhwYW5kSWNvbk1hcmdpblRvcCxcbiAgICBleHBhbmRJY29uU2l6ZSxcbiAgICBleHBhbmRJY29uSGFsZklubmVyLFxuICAgIGV4cGFuZEljb25TY2FsZSxcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgdGFibGVCb3JkZXIgPSBgJHsoMCwgX2Nzc2luanMudW5pdCkobGluZVdpZHRoKX0gJHtsaW5lVHlwZX0gJHt0YWJsZUJvcmRlckNvbG9yfWA7XG4gIGNvbnN0IGV4cGFuZEljb25MaW5lT2Zmc2V0ID0gY2FsYyhwYWRkaW5nWFhTKS5zdWIobGluZVdpZHRoKS5lcXVhbCgpO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXToge1xuICAgICAgW2Ake2NvbXBvbmVudENsc30tZXhwYW5kLWljb24tY29sYF06IHtcbiAgICAgICAgd2lkdGg6IHRhYmxlRXhwYW5kQ29sdW1uV2lkdGhcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1yb3ctZXhwYW5kLWljb24tY2VsbGBdOiB7XG4gICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXJvdy1leHBhbmQtaWNvbmBdOiB7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JyxcbiAgICAgICAgICBmbG9hdDogJ25vbmUnLFxuICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdzdWInXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1yb3ctaW5kZW50YF06IHtcbiAgICAgICAgaGVpZ2h0OiAxLFxuICAgICAgICBmbG9hdDogJ2xlZnQnXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tcm93LWV4cGFuZC1pY29uYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKDAsIF9zdHlsZS5vcGVyYXRpb25Vbml0KSh0b2tlbikpLCB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICBmbG9hdDogJ2xlZnQnLFxuICAgICAgICB3aWR0aDogZXhwYW5kSWNvblNpemUsXG4gICAgICAgIGhlaWdodDogZXhwYW5kSWNvblNpemUsXG4gICAgICAgIGNvbG9yOiAnaW5oZXJpdCcsXG4gICAgICAgIGxpbmVIZWlnaHQ6ICgwLCBfY3NzaW5qcy51bml0KShleHBhbmRJY29uU2l6ZSksXG4gICAgICAgIGJhY2tncm91bmQ6IHRhYmxlRXhwYW5kSWNvbkJnLFxuICAgICAgICBib3JkZXI6IHRhYmxlQm9yZGVyLFxuICAgICAgICBib3JkZXJSYWRpdXMsXG4gICAgICAgIHRyYW5zZm9ybTogYHNjYWxlKCR7ZXhwYW5kSWNvblNjYWxlfSlgLFxuICAgICAgICAnJjpmb2N1cywgJjpob3ZlciwgJjphY3RpdmUnOiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6ICdjdXJyZW50Y29sb3InXG4gICAgICAgIH0sXG4gICAgICAgICcmOjpiZWZvcmUsICY6OmFmdGVyJzoge1xuICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIGJhY2tncm91bmQ6ICdjdXJyZW50Y29sb3InLFxuICAgICAgICAgIHRyYW5zaXRpb246IGB0cmFuc2Zvcm0gJHttb3Rpb25EdXJhdGlvblNsb3d9IGVhc2Utb3V0YCxcbiAgICAgICAgICBjb250ZW50OiAnXCJcIidcbiAgICAgICAgfSxcbiAgICAgICAgJyY6OmJlZm9yZSc6IHtcbiAgICAgICAgICB0b3A6IGV4cGFuZEljb25IYWxmSW5uZXIsXG4gICAgICAgICAgaW5zZXRJbmxpbmVFbmQ6IGV4cGFuZEljb25MaW5lT2Zmc2V0LFxuICAgICAgICAgIGluc2V0SW5saW5lU3RhcnQ6IGV4cGFuZEljb25MaW5lT2Zmc2V0LFxuICAgICAgICAgIGhlaWdodDogbGluZVdpZHRoXG4gICAgICAgIH0sXG4gICAgICAgICcmOjphZnRlcic6IHtcbiAgICAgICAgICB0b3A6IGV4cGFuZEljb25MaW5lT2Zmc2V0LFxuICAgICAgICAgIGJvdHRvbTogZXhwYW5kSWNvbkxpbmVPZmZzZXQsXG4gICAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogZXhwYW5kSWNvbkhhbGZJbm5lcixcbiAgICAgICAgICB3aWR0aDogbGluZVdpZHRoLFxuICAgICAgICAgIHRyYW5zZm9ybTogJ3JvdGF0ZSg5MGRlZyknXG4gICAgICAgIH0sXG4gICAgICAgIC8vIE1vdGlvbiBlZmZlY3RcbiAgICAgICAgJyYtY29sbGFwc2VkOjpiZWZvcmUnOiB7XG4gICAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlKC0xODBkZWcpJ1xuICAgICAgICB9LFxuICAgICAgICAnJi1jb2xsYXBzZWQ6OmFmdGVyJzoge1xuICAgICAgICAgIHRyYW5zZm9ybTogJ3JvdGF0ZSgwZGVnKSdcbiAgICAgICAgfSxcbiAgICAgICAgJyYtc3BhY2VkJzoge1xuICAgICAgICAgICcmOjpiZWZvcmUsICY6OmFmdGVyJzoge1xuICAgICAgICAgICAgZGlzcGxheTogJ25vbmUnLFxuICAgICAgICAgICAgY29udGVudDogJ25vbmUnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgIGJvcmRlcjogMCxcbiAgICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJ1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXJvdy1pbmRlbnQgKyAke2NvbXBvbmVudENsc30tcm93LWV4cGFuZC1pY29uYF06IHtcbiAgICAgICAgbWFyZ2luVG9wOiBleHBhbmRJY29uTWFyZ2luVG9wLFxuICAgICAgICBtYXJnaW5JbmxpbmVFbmQ6IHBhZGRpbmdYU1xuICAgICAgfSxcbiAgICAgIFtgdHIke2NvbXBvbmVudENsc30tZXhwYW5kZWQtcm93YF06IHtcbiAgICAgICAgJyYsICY6aG92ZXInOiB7XG4gICAgICAgICAgJz4gdGgsID4gdGQnOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiB0YWJsZUV4cGFuZGVkUm93QmdcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzI1NTczXG4gICAgICAgIFtgJHthbnRDbHN9LWRlc2NyaXB0aW9ucy12aWV3YF06IHtcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgdGFibGU6IHtcbiAgICAgICAgICAgIGZsZXg6ICdhdXRvJyxcbiAgICAgICAgICAgIHdpZHRoOiAnMTAwJSdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBXaXRoIGZpeGVkXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1leHBhbmRlZC1yb3ctZml4ZWRgXToge1xuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgbWFyZ2luOiBgJHsoMCwgX2Nzc2luanMudW5pdCkoY2FsYyh0YWJsZVBhZGRpbmdWZXJ0aWNhbCkubXVsKC0xKS5lcXVhbCgpKX0gJHsoMCwgX2Nzc2luanMudW5pdCkoY2FsYyh0YWJsZVBhZGRpbmdIb3Jpem9udGFsKS5tdWwoLTEpLmVxdWFsKCkpfWAsXG4gICAgICAgIHBhZGRpbmc6IGAkeygwLCBfY3NzaW5qcy51bml0KSh0YWJsZVBhZGRpbmdWZXJ0aWNhbCl9ICR7KDAsIF9jc3NpbmpzLnVuaXQpKHRhYmxlUGFkZGluZ0hvcml6b250YWwpfWBcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gZ2VuRXhwYW5kU3R5bGU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2Nzc2luanMgPSByZXF1aXJlKFwiQGFudC1kZXNpZ24vY3NzaW5qc1wiKTtcbnZhciBfc3R5bGUgPSByZXF1aXJlKFwiLi4vLi4vc3R5bGVcIik7XG5jb25zdCBnZW5GaWx0ZXJTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBhbnRDbHMsXG4gICAgaWNvbkNscyxcbiAgICB0YWJsZUZpbHRlckRyb3Bkb3duV2lkdGgsXG4gICAgdGFibGVGaWx0ZXJEcm9wZG93blNlYXJjaFdpZHRoLFxuICAgIHBhZGRpbmdYWFMsXG4gICAgcGFkZGluZ1hTLFxuICAgIGNvbG9yVGV4dCxcbiAgICBsaW5lV2lkdGgsXG4gICAgbGluZVR5cGUsXG4gICAgdGFibGVCb3JkZXJDb2xvcixcbiAgICBoZWFkZXJJY29uQ29sb3IsXG4gICAgZm9udFNpemVTTSxcbiAgICB0YWJsZVBhZGRpbmdIb3Jpem9udGFsLFxuICAgIGJvcmRlclJhZGl1cyxcbiAgICBtb3Rpb25EdXJhdGlvblNsb3csXG4gICAgY29sb3JJY29uLFxuICAgIGNvbG9yUHJpbWFyeSxcbiAgICB0YWJsZUhlYWRlckZpbHRlckFjdGl2ZUJnLFxuICAgIGNvbG9yVGV4dERpc2FibGVkLFxuICAgIHRhYmxlRmlsdGVyRHJvcGRvd25CZyxcbiAgICB0YWJsZUZpbHRlckRyb3Bkb3duSGVpZ2h0LFxuICAgIGNvbnRyb2xJdGVtQmdIb3ZlcixcbiAgICBjb250cm9sSXRlbUJnQWN0aXZlLFxuICAgIGJveFNoYWRvd1NlY29uZGFyeSxcbiAgICBmaWx0ZXJEcm9wZG93bk1lbnVCZyxcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgZHJvcGRvd25QcmVmaXhDbHMgPSBgJHthbnRDbHN9LWRyb3Bkb3duYDtcbiAgY29uc3QgdGFibGVGaWx0ZXJEcm9wZG93blByZWZpeENscyA9IGAke2NvbXBvbmVudENsc30tZmlsdGVyLWRyb3Bkb3duYDtcbiAgY29uc3QgdHJlZVByZWZpeENscyA9IGAke2FudENsc30tdHJlZWA7XG4gIGNvbnN0IHRhYmxlQm9yZGVyID0gYCR7KDAsIF9jc3NpbmpzLnVuaXQpKGxpbmVXaWR0aCl9ICR7bGluZVR5cGV9ICR7dGFibGVCb3JkZXJDb2xvcn1gO1xuICByZXR1cm4gW3tcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyYF06IHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWZpbHRlci1jb2x1bW5gXToge1xuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbidcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1maWx0ZXItdHJpZ2dlcmBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICBtYXJnaW5CbG9jazogY2FsYyhwYWRkaW5nWFhTKS5tdWwoLTEpLmVxdWFsKCksXG4gICAgICAgIG1hcmdpbklubGluZTogYCR7KDAsIF9jc3NpbmpzLnVuaXQpKHBhZGRpbmdYWFMpfSAkeygwLCBfY3NzaW5qcy51bml0KShjYWxjKHRhYmxlUGFkZGluZ0hvcml6b250YWwpLmRpdigyKS5tdWwoLTEpLmVxdWFsKCkpfWAsXG4gICAgICAgIHBhZGRpbmc6IGAwICR7KDAsIF9jc3NpbmpzLnVuaXQpKHBhZGRpbmdYWFMpfWAsXG4gICAgICAgIGNvbG9yOiBoZWFkZXJJY29uQ29sb3IsXG4gICAgICAgIGZvbnRTaXplOiBmb250U2l6ZVNNLFxuICAgICAgICBib3JkZXJSYWRpdXMsXG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7bW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgIGNvbG9yOiBjb2xvckljb24sXG4gICAgICAgICAgYmFja2dyb3VuZDogdGFibGVIZWFkZXJGaWx0ZXJBY3RpdmVCZ1xuICAgICAgICB9LFxuICAgICAgICAnJi5hY3RpdmUnOiB7XG4gICAgICAgICAgY29sb3I6IGNvbG9yUHJpbWFyeVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAgLy8gRHJvcGRvd25cbiAgICBbYCR7YW50Q2xzfS1kcm9wZG93bmBdOiB7XG4gICAgICBbdGFibGVGaWx0ZXJEcm9wZG93blByZWZpeENsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKDAsIF9zdHlsZS5yZXNldENvbXBvbmVudCkodG9rZW4pKSwge1xuICAgICAgICBtaW5XaWR0aDogdGFibGVGaWx0ZXJEcm9wZG93bldpZHRoLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRhYmxlRmlsdGVyRHJvcGRvd25CZyxcbiAgICAgICAgYm9yZGVyUmFkaXVzLFxuICAgICAgICBib3hTaGFkb3c6IGJveFNoYWRvd1NlY29uZGFyeSxcbiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAvLyBSZXNldCBtZW51XG4gICAgICAgIFtgJHtkcm9wZG93blByZWZpeENsc30tbWVudWBdOiB7XG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNDkxNlxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzE5NTQyXG4gICAgICAgICAgbWF4SGVpZ2h0OiB0YWJsZUZpbHRlckRyb3Bkb3duSGVpZ2h0LFxuICAgICAgICAgIG92ZXJmbG93WDogJ2hpZGRlbicsXG4gICAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICAgIGJveFNoYWRvdzogJ25vbmUnLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogJ3Vuc2V0JyxcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGZpbHRlckRyb3Bkb3duTWVudUJnLFxuICAgICAgICAgICcmOmVtcHR5OjphZnRlcic6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAgICAgICBwYWRkaW5nOiBgJHsoMCwgX2Nzc2luanMudW5pdCkocGFkZGluZ1hTKX0gMGAsXG4gICAgICAgICAgICBjb2xvcjogY29sb3JUZXh0RGlzYWJsZWQsXG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemVTTSxcbiAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICBjb250ZW50OiAnXCJOb3QgRm91bmRcIidcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtgJHt0YWJsZUZpbHRlckRyb3Bkb3duUHJlZml4Q2xzfS10cmVlYF06IHtcbiAgICAgICAgICBwYWRkaW5nQmxvY2s6IGAkeygwLCBfY3NzaW5qcy51bml0KShwYWRkaW5nWFMpfSAwYCxcbiAgICAgICAgICBwYWRkaW5nSW5saW5lOiBwYWRkaW5nWFMsXG4gICAgICAgICAgW3RyZWVQcmVmaXhDbHNdOiB7XG4gICAgICAgICAgICBwYWRkaW5nOiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbYCR7dHJlZVByZWZpeENsc30tdHJlZW5vZGUgJHt0cmVlUHJlZml4Q2xzfS1ub2RlLWNvbnRlbnQtd3JhcHBlcjpob3ZlcmBdOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbnRyb2xJdGVtQmdIb3ZlclxuICAgICAgICAgIH0sXG4gICAgICAgICAgW2Ake3RyZWVQcmVmaXhDbHN9LXRyZWVub2RlLWNoZWNrYm94LWNoZWNrZWQgJHt0cmVlUHJlZml4Q2xzfS1ub2RlLWNvbnRlbnQtd3JhcHBlcmBdOiB7XG4gICAgICAgICAgICAnJiwgJjpob3Zlcic6IHtcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBjb250cm9sSXRlbUJnQWN0aXZlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCR7dGFibGVGaWx0ZXJEcm9wZG93blByZWZpeENsc30tc2VhcmNoYF06IHtcbiAgICAgICAgICBwYWRkaW5nOiBwYWRkaW5nWFMsXG4gICAgICAgICAgYm9yZGVyQm90dG9tOiB0YWJsZUJvcmRlcixcbiAgICAgICAgICAnJi1pbnB1dCc6IHtcbiAgICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAgIG1pbldpZHRoOiB0YWJsZUZpbHRlckRyb3Bkb3duU2VhcmNoV2lkdGhcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbaWNvbkNsc106IHtcbiAgICAgICAgICAgICAgY29sb3I6IGNvbG9yVGV4dERpc2FibGVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCR7dGFibGVGaWx0ZXJEcm9wZG93blByZWZpeENsc30tY2hlY2thbGxgXToge1xuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgbWFyZ2luQm90dG9tOiBwYWRkaW5nWFhTLFxuICAgICAgICAgIG1hcmdpbklubGluZVN0YXJ0OiBwYWRkaW5nWFhTXG4gICAgICAgIH0sXG4gICAgICAgIC8vIE9wZXJhdGlvblxuICAgICAgICBbYCR7dGFibGVGaWx0ZXJEcm9wZG93blByZWZpeENsc30tYnRuc2BdOiB7XG4gICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsXG4gICAgICAgICAgcGFkZGluZzogYCR7KDAsIF9jc3NpbmpzLnVuaXQpKGNhbGMocGFkZGluZ1hTKS5zdWIobGluZVdpZHRoKS5lcXVhbCgpKX0gJHsoMCwgX2Nzc2luanMudW5pdCkocGFkZGluZ1hTKX1gLFxuICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgICBib3JkZXJUb3A6IHRhYmxlQm9yZGVyXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9LFxuICAvLyBEcm9wZG93biBNZW51ICYgU3ViTWVudVxuICB7XG4gICAgLy8gc3VibWVudSBvZiB0YWJsZSBmaWx0ZXIgZHJvcGRvd25cbiAgICBbYCR7YW50Q2xzfS1kcm9wZG93biAke3RhYmxlRmlsdGVyRHJvcGRvd25QcmVmaXhDbHN9LCAke3RhYmxlRmlsdGVyRHJvcGRvd25QcmVmaXhDbHN9LXN1Ym1lbnVgXToge1xuICAgICAgLy8gQ2hlY2tib3hcbiAgICAgIFtgJHthbnRDbHN9LWNoZWNrYm94LXdyYXBwZXIgKyBzcGFuYF06IHtcbiAgICAgICAgcGFkZGluZ0lubGluZVN0YXJ0OiBwYWRkaW5nWFMsXG4gICAgICAgIGNvbG9yOiBjb2xvclRleHRcbiAgICAgIH0sXG4gICAgICAnPiB1bCc6IHtcbiAgICAgICAgbWF4SGVpZ2h0OiAnY2FsYygxMDB2aCAtIDEzMHB4KScsXG4gICAgICAgIG92ZXJmbG93WDogJ2hpZGRlbicsXG4gICAgICAgIG92ZXJmbG93WTogJ2F1dG8nXG4gICAgICB9XG4gICAgfVxuICB9XTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZW5GaWx0ZXJTdHlsZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbmNvbnN0IGdlbkZpeGVkU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgbGluZVdpZHRoLFxuICAgIGNvbG9yU3BsaXQsXG4gICAgbW90aW9uRHVyYXRpb25TbG93LFxuICAgIHpJbmRleFRhYmxlRml4ZWQsXG4gICAgdGFibGVCZyxcbiAgICB6SW5kZXhUYWJsZVN0aWNreSxcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgY29uc3Qgc2hhZG93Q29sb3IgPSBjb2xvclNwbGl0O1xuICAvLyBGb2xsb3cgc3R5bGUgaXMgbWFnaWMgb2Ygc2hhZG93IHdoaWNoIHNob3VsZCBub3QgZm9sbG93IHRva2VuOlxuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXToge1xuICAgICAgW2BcbiAgICAgICAgJHtjb21wb25lbnRDbHN9LWNlbGwtZml4LWxlZnQsXG4gICAgICAgICR7Y29tcG9uZW50Q2xzfS1jZWxsLWZpeC1yaWdodFxuICAgICAgYF06IHtcbiAgICAgICAgcG9zaXRpb246ICdzdGlja3kgIWltcG9ydGFudCcsXG4gICAgICAgIHpJbmRleDogekluZGV4VGFibGVGaXhlZCxcbiAgICAgICAgYmFja2dyb3VuZDogdGFibGVCZ1xuICAgICAgfSxcbiAgICAgIFtgXG4gICAgICAgICR7Y29tcG9uZW50Q2xzfS1jZWxsLWZpeC1sZWZ0LWZpcnN0OjphZnRlcixcbiAgICAgICAgJHtjb21wb25lbnRDbHN9LWNlbGwtZml4LWxlZnQtbGFzdDo6YWZ0ZXJcbiAgICAgIGBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB0b3A6IDAsXG4gICAgICAgIHJpZ2h0OiB7XG4gICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgIH0sXG4gICAgICAgIGJvdHRvbTogY2FsYyhsaW5lV2lkdGgpLm11bCgtMSkuZXF1YWwoKSxcbiAgICAgICAgd2lkdGg6IDMwLFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDEwMCUpJyxcbiAgICAgICAgdHJhbnNpdGlvbjogYGJveC1zaGFkb3cgJHttb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgY29udGVudDogJ1wiXCInLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZSdcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jZWxsLWZpeC1sZWZ0LWFsbDo6YWZ0ZXJgXToge1xuICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgIH0sXG4gICAgICBbYFxuICAgICAgICAke2NvbXBvbmVudENsc30tY2VsbC1maXgtcmlnaHQtZmlyc3Q6OmFmdGVyLFxuICAgICAgICAke2NvbXBvbmVudENsc30tY2VsbC1maXgtcmlnaHQtbGFzdDo6YWZ0ZXJcbiAgICAgIGBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB0b3A6IDAsXG4gICAgICAgIGJvdHRvbTogY2FsYyhsaW5lV2lkdGgpLm11bCgtMSkuZXF1YWwoKSxcbiAgICAgICAgbGVmdDoge1xuICAgICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogMFxuICAgICAgICB9LFxuICAgICAgICB3aWR0aDogMzAsXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTEwMCUpJyxcbiAgICAgICAgdHJhbnNpdGlvbjogYGJveC1zaGFkb3cgJHttb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgY29udGVudDogJ1wiXCInLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZSdcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jb250YWluZXJgXToge1xuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgJyY6OmJlZm9yZSwgJjo6YWZ0ZXInOiB7XG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICB6SW5kZXg6IGNhbGMoekluZGV4VGFibGVTdGlja3kpLmFkZCgxKS5lcXVhbCh7XG4gICAgICAgICAgICB1bml0OiBmYWxzZVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHdpZHRoOiAzMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiBgYm94LXNoYWRvdyAke21vdGlvbkR1cmF0aW9uU2xvd31gLFxuICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJyxcbiAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZSdcbiAgICAgICAgfSxcbiAgICAgICAgJyY6OmJlZm9yZSc6IHtcbiAgICAgICAgICBpbnNldElubGluZVN0YXJ0OiAwXG4gICAgICAgIH0sXG4gICAgICAgICcmOjphZnRlcic6IHtcbiAgICAgICAgICBpbnNldElubGluZUVuZDogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tcGluZy1sZWZ0YF06IHtcbiAgICAgICAgW2AmOm5vdCgke2NvbXBvbmVudENsc30taGFzLWZpeC1sZWZ0KSAke2NvbXBvbmVudENsc30tY29udGFpbmVyOjpiZWZvcmVgXToge1xuICAgICAgICAgIGJveFNoYWRvdzogYGluc2V0IDEwcHggMCA4cHggLThweCAke3NoYWRvd0NvbG9yfWBcbiAgICAgICAgfSxcbiAgICAgICAgW2BcbiAgICAgICAgICAke2NvbXBvbmVudENsc30tY2VsbC1maXgtbGVmdC1maXJzdDo6YWZ0ZXIsXG4gICAgICAgICAgJHtjb21wb25lbnRDbHN9LWNlbGwtZml4LWxlZnQtbGFzdDo6YWZ0ZXJcbiAgICAgICAgYF06IHtcbiAgICAgICAgICBib3hTaGFkb3c6IGBpbnNldCAxMHB4IDAgOHB4IC04cHggJHtzaGFkb3dDb2xvcn1gXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWNlbGwtZml4LWxlZnQtbGFzdDo6YmVmb3JlYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCAhaW1wb3J0YW50J1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tcGluZy1yaWdodGBdOiB7XG4gICAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWhhcy1maXgtcmlnaHQpICR7Y29tcG9uZW50Q2xzfS1jb250YWluZXI6OmFmdGVyYF06IHtcbiAgICAgICAgICBib3hTaGFkb3c6IGBpbnNldCAtMTBweCAwIDhweCAtOHB4ICR7c2hhZG93Q29sb3J9YFxuICAgICAgICB9LFxuICAgICAgICBbYFxuICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1jZWxsLWZpeC1yaWdodC1maXJzdDo6YWZ0ZXIsXG4gICAgICAgICAgJHtjb21wb25lbnRDbHN9LWNlbGwtZml4LXJpZ2h0LWxhc3Q6OmFmdGVyXG4gICAgICAgIGBdOiB7XG4gICAgICAgICAgYm94U2hhZG93OiBgaW5zZXQgLTEwcHggMCA4cHggLThweCAke3NoYWRvd0NvbG9yfWBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIEdhcHBlZCBmaXhlZCBDb2x1bW5zIGRvIG5vdCBzaG93IHRoZSBzaGFkb3dcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWZpeGVkLWNvbHVtbi1nYXBwZWRgXToge1xuICAgICAgICBbYFxuICAgICAgICAke2NvbXBvbmVudENsc30tY2VsbC1maXgtbGVmdC1maXJzdDo6YWZ0ZXIsXG4gICAgICAgICR7Y29tcG9uZW50Q2xzfS1jZWxsLWZpeC1sZWZ0LWxhc3Q6OmFmdGVyLFxuICAgICAgICAke2NvbXBvbmVudENsc30tY2VsbC1maXgtcmlnaHQtZmlyc3Q6OmFmdGVyLFxuICAgICAgICAke2NvbXBvbmVudENsc30tY2VsbC1maXgtcmlnaHQtbGFzdDo6YWZ0ZXJcbiAgICAgIGBdOiB7XG4gICAgICAgICAgYm94U2hhZG93OiAnbm9uZSdcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZW5GaXhlZFN0eWxlOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucHJlcGFyZUNvbXBvbmVudFRva2VuID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9jc3NpbmpzID0gcmVxdWlyZShcIkBhbnQtZGVzaWduL2Nzc2luanNcIik7XG52YXIgX2Zhc3RDb2xvciA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9mYXN0LWNvbG9yXCIpO1xudmFyIF9zdHlsZSA9IHJlcXVpcmUoXCIuLi8uLi9zdHlsZVwiKTtcbnZhciBfaW50ZXJuYWwgPSByZXF1aXJlKFwiLi4vLi4vdGhlbWUvaW50ZXJuYWxcIik7XG52YXIgX2JvcmRlcmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ib3JkZXJlZFwiKSk7XG52YXIgX2VsbGlwc2lzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lbGxpcHNpc1wiKSk7XG52YXIgX2VtcHR5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lbXB0eVwiKSk7XG52YXIgX2V4cGFuZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZXhwYW5kXCIpKTtcbnZhciBfZmlsdGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9maWx0ZXJcIikpO1xudmFyIF9maXhlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZml4ZWRcIikpO1xudmFyIF9wYWdpbmF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYWdpbmF0aW9uXCIpKTtcbnZhciBfcmFkaXVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9yYWRpdXNcIikpO1xudmFyIF9ydGwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3J0bFwiKSk7XG52YXIgX3NlbGVjdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc2VsZWN0aW9uXCIpKTtcbnZhciBfc2l6ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc2l6ZVwiKSk7XG52YXIgX3NvcnRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc29ydGVyXCIpKTtcbnZhciBfc3RpY2t5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zdGlja3lcIikpO1xudmFyIF9zdW1tYXJ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zdW1tYXJ5XCIpKTtcbnZhciBfdmlydHVhbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdmlydHVhbFwiKSk7XG5jb25zdCBnZW5UYWJsZVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGZvbnRXZWlnaHRTdHJvbmcsXG4gICAgdGFibGVQYWRkaW5nVmVydGljYWwsXG4gICAgdGFibGVQYWRkaW5nSG9yaXpvbnRhbCxcbiAgICB0YWJsZUV4cGFuZENvbHVtbldpZHRoLFxuICAgIGxpbmVXaWR0aCxcbiAgICBsaW5lVHlwZSxcbiAgICB0YWJsZUJvcmRlckNvbG9yLFxuICAgIHRhYmxlRm9udFNpemUsXG4gICAgdGFibGVCZyxcbiAgICB0YWJsZVJhZGl1cyxcbiAgICB0YWJsZUhlYWRlclRleHRDb2xvcixcbiAgICBtb3Rpb25EdXJhdGlvbk1pZCxcbiAgICB0YWJsZUhlYWRlckJnLFxuICAgIHRhYmxlSGVhZGVyQ2VsbFNwbGl0Q29sb3IsXG4gICAgdGFibGVGb290ZXJUZXh0Q29sb3IsXG4gICAgdGFibGVGb290ZXJCZyxcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgdGFibGVCb3JkZXIgPSBgJHsoMCwgX2Nzc2luanMudW5pdCkobGluZVdpZHRoKX0gJHtsaW5lVHlwZX0gJHt0YWJsZUJvcmRlckNvbG9yfWA7XG4gIHJldHVybiB7XG4gICAgW2Ake2NvbXBvbmVudENsc30td3JhcHBlcmBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgY2xlYXI6ICdib3RoJyxcbiAgICAgIG1heFdpZHRoOiAnMTAwJSdcbiAgICB9LCAoMCwgX3N0eWxlLmNsZWFyRml4KSgpKSwge1xuICAgICAgW2NvbXBvbmVudENsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKDAsIF9zdHlsZS5yZXNldENvbXBvbmVudCkodG9rZW4pKSwge1xuICAgICAgICBmb250U2l6ZTogdGFibGVGb250U2l6ZSxcbiAgICAgICAgYmFja2dyb3VuZDogdGFibGVCZyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBgJHsoMCwgX2Nzc2luanMudW5pdCkodGFibGVSYWRpdXMpfSAkeygwLCBfY3NzaW5qcy51bml0KSh0YWJsZVJhZGl1cyl9IDAgMGAsXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQ3NDg2XG4gICAgICAgIHNjcm9sbGJhckNvbG9yOiBgJHt0b2tlbi50YWJsZVNjcm9sbFRodW1iQmd9ICR7dG9rZW4udGFibGVTY3JvbGxCZ31gXG4gICAgICB9KSxcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzE3NjExXG4gICAgICB0YWJsZToge1xuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICB0ZXh0QWxpZ246ICdzdGFydCcsXG4gICAgICAgIGJvcmRlclJhZGl1czogYCR7KDAsIF9jc3NpbmpzLnVuaXQpKHRhYmxlUmFkaXVzKX0gJHsoMCwgX2Nzc2luanMudW5pdCkodGFibGVSYWRpdXMpfSAwIDBgLFxuICAgICAgICBib3JkZXJDb2xsYXBzZTogJ3NlcGFyYXRlJyxcbiAgICAgICAgYm9yZGVyU3BhY2luZzogMFxuICAgICAgfSxcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENlbGwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYFxuICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1jZWxsLFxuICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS10aGVhZCA+IHRyID4gdGgsXG4gICAgICAgICAgJHtjb21wb25lbnRDbHN9LXRib2R5ID4gdHIgPiB0aCxcbiAgICAgICAgICAke2NvbXBvbmVudENsc30tdGJvZHkgPiB0ciA+IHRkLFxuICAgICAgICAgIHRmb290ID4gdHIgPiB0aCxcbiAgICAgICAgICB0Zm9vdCA+IHRyID4gdGRcbiAgICAgICAgYF06IHtcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgIHBhZGRpbmc6IGAkeygwLCBfY3NzaW5qcy51bml0KSh0YWJsZVBhZGRpbmdWZXJ0aWNhbCl9ICR7KDAsIF9jc3NpbmpzLnVuaXQpKHRhYmxlUGFkZGluZ0hvcml6b250YWwpfWAsXG4gICAgICAgIG92ZXJmbG93V3JhcDogJ2JyZWFrLXdvcmQnXG4gICAgICB9LFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBUaXRsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tdGl0bGVgXToge1xuICAgICAgICBwYWRkaW5nOiBgJHsoMCwgX2Nzc2luanMudW5pdCkodGFibGVQYWRkaW5nVmVydGljYWwpfSAkeygwLCBfY3NzaW5qcy51bml0KSh0YWJsZVBhZGRpbmdIb3Jpem9udGFsKX1gXG4gICAgICB9LFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIZWFkZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tdGhlYWRgXToge1xuICAgICAgICBbYFxuICAgICAgICAgID4gdHIgPiB0aCxcbiAgICAgICAgICA+IHRyID4gdGRcbiAgICAgICAgYF06IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICBjb2xvcjogdGFibGVIZWFkZXJUZXh0Q29sb3IsXG4gICAgICAgICAgZm9udFdlaWdodDogZm9udFdlaWdodFN0cm9uZyxcbiAgICAgICAgICB0ZXh0QWxpZ246ICdzdGFydCcsXG4gICAgICAgICAgYmFja2dyb3VuZDogdGFibGVIZWFkZXJCZyxcbiAgICAgICAgICBib3JkZXJCb3R0b206IHRhYmxlQm9yZGVyLFxuICAgICAgICAgIHRyYW5zaXRpb246IGBiYWNrZ3JvdW5kICR7bW90aW9uRHVyYXRpb25NaWR9IGVhc2VgLFxuICAgICAgICAgIFwiJltjb2xzcGFuXTpub3QoW2NvbHNwYW49JzEnXSlcIjoge1xuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgW2AmOm5vdCg6bGFzdC1jaGlsZCk6bm90KCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tY29sdW1uKTpub3QoJHtjb21wb25lbnRDbHN9LXJvdy1leHBhbmQtaWNvbi1jZWxsKTpub3QoW2NvbHNwYW5dKTo6YmVmb3JlYF06IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgdG9wOiAnNTAlJyxcbiAgICAgICAgICAgIGluc2V0SW5saW5lRW5kOiAwLFxuICAgICAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgICAgICBoZWlnaHQ6ICcxLjZlbScsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRhYmxlSGVhZGVyQ2VsbFNwbGl0Q29sb3IsXG4gICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC01MCUpJyxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IGBiYWNrZ3JvdW5kLWNvbG9yICR7bW90aW9uRHVyYXRpb25NaWR9YCxcbiAgICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJz4gdHI6bm90KDpsYXN0LWNoaWxkKSA+IHRoW2NvbHNwYW5dJzoge1xuICAgICAgICAgIGJvcmRlckJvdHRvbTogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBCb2R5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXRib2R5YF06IHtcbiAgICAgICAgJz4gdHInOiB7XG4gICAgICAgICAgJz4gdGgsID4gdGQnOiB7XG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBgYmFja2dyb3VuZCAke21vdGlvbkR1cmF0aW9uTWlkfSwgYm9yZGVyLWNvbG9yICR7bW90aW9uRHVyYXRpb25NaWR9YCxcbiAgICAgICAgICAgIGJvcmRlckJvdHRvbTogdGFibGVCb3JkZXIsXG4gICAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IE5lc3QgVGFibGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgICBbYFxuICAgICAgICAgICAgICA+ICR7Y29tcG9uZW50Q2xzfS13cmFwcGVyOm9ubHktY2hpbGQsXG4gICAgICAgICAgICAgID4gJHtjb21wb25lbnRDbHN9LWV4cGFuZGVkLXJvdy1maXhlZCA+ICR7Y29tcG9uZW50Q2xzfS13cmFwcGVyOm9ubHktY2hpbGRcbiAgICAgICAgICAgIGBdOiB7XG4gICAgICAgICAgICAgIFtjb21wb25lbnRDbHNdOiB7XG4gICAgICAgICAgICAgICAgbWFyZ2luQmxvY2s6ICgwLCBfY3NzaW5qcy51bml0KShjYWxjKHRhYmxlUGFkZGluZ1ZlcnRpY2FsKS5tdWwoLTEpLmVxdWFsKCkpLFxuICAgICAgICAgICAgICAgIG1hcmdpbklubGluZTogYCR7KDAsIF9jc3NpbmpzLnVuaXQpKGNhbGModGFibGVFeHBhbmRDb2x1bW5XaWR0aCkuc3ViKHRhYmxlUGFkZGluZ0hvcml6b250YWwpLmVxdWFsKCkpfVxuICAgICAgICAgICAgICAgICR7KDAsIF9jc3NpbmpzLnVuaXQpKGNhbGModGFibGVQYWRkaW5nSG9yaXpvbnRhbCkubXVsKC0xKS5lcXVhbCgpKX1gLFxuICAgICAgICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXRib2R5ID4gdHI6bGFzdC1jaGlsZCA+IHRkYF06IHtcbiAgICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbVdpZHRoOiAwLFxuICAgICAgICAgICAgICAgICAgJyY6Zmlyc3QtY2hpbGQsICY6bGFzdC1jaGlsZCc6IHtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnPiB0aCc6IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICAgICAgY29sb3I6IHRhYmxlSGVhZGVyVGV4dENvbG9yLFxuICAgICAgICAgICAgZm9udFdlaWdodDogZm9udFdlaWdodFN0cm9uZyxcbiAgICAgICAgICAgIHRleHRBbGlnbjogJ3N0YXJ0JyxcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IHRhYmxlSGVhZGVyQmcsXG4gICAgICAgICAgICBib3JkZXJCb3R0b206IHRhYmxlQm9yZGVyLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogYGJhY2tncm91bmQgJHttb3Rpb25EdXJhdGlvbk1pZH0gZWFzZWBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEZvb3RlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1mb290ZXJgXToge1xuICAgICAgICBwYWRkaW5nOiBgJHsoMCwgX2Nzc2luanMudW5pdCkodGFibGVQYWRkaW5nVmVydGljYWwpfSAkeygwLCBfY3NzaW5qcy51bml0KSh0YWJsZVBhZGRpbmdIb3Jpem9udGFsKX1gLFxuICAgICAgICBjb2xvcjogdGFibGVGb290ZXJUZXh0Q29sb3IsXG4gICAgICAgIGJhY2tncm91bmQ6IHRhYmxlRm9vdGVyQmdcbiAgICAgIH1cbiAgICB9KVxuICB9O1xufTtcbmNvbnN0IHByZXBhcmVDb21wb25lbnRUb2tlbiA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbG9yRmlsbEFsdGVyLFxuICAgIGNvbG9yQmdDb250YWluZXIsXG4gICAgY29sb3JUZXh0SGVhZGluZyxcbiAgICBjb2xvckZpbGxTZWNvbmRhcnksXG4gICAgY29sb3JGaWxsQ29udGVudCxcbiAgICBjb250cm9sSXRlbUJnQWN0aXZlLFxuICAgIGNvbnRyb2xJdGVtQmdBY3RpdmVIb3ZlcixcbiAgICBwYWRkaW5nLFxuICAgIHBhZGRpbmdTTSxcbiAgICBwYWRkaW5nWFMsXG4gICAgY29sb3JCb3JkZXJTZWNvbmRhcnksXG4gICAgYm9yZGVyUmFkaXVzTEcsXG4gICAgY29udHJvbEhlaWdodCxcbiAgICBjb2xvclRleHRQbGFjZWhvbGRlcixcbiAgICBmb250U2l6ZSxcbiAgICBmb250U2l6ZVNNLFxuICAgIGxpbmVIZWlnaHQsXG4gICAgbGluZVdpZHRoLFxuICAgIGNvbG9ySWNvbixcbiAgICBjb2xvckljb25Ib3ZlcixcbiAgICBvcGFjaXR5TG9hZGluZyxcbiAgICBjb250cm9sSW50ZXJhY3RpdmVTaXplXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgY29sb3JGaWxsU2Vjb25kYXJ5U29saWQgPSBuZXcgX2Zhc3RDb2xvci5GYXN0Q29sb3IoY29sb3JGaWxsU2Vjb25kYXJ5KS5vbkJhY2tncm91bmQoY29sb3JCZ0NvbnRhaW5lcikudG9IZXhTdHJpbmcoKTtcbiAgY29uc3QgY29sb3JGaWxsQ29udGVudFNvbGlkID0gbmV3IF9mYXN0Q29sb3IuRmFzdENvbG9yKGNvbG9yRmlsbENvbnRlbnQpLm9uQmFja2dyb3VuZChjb2xvckJnQ29udGFpbmVyKS50b0hleFN0cmluZygpO1xuICBjb25zdCBjb2xvckZpbGxBbHRlclNvbGlkID0gbmV3IF9mYXN0Q29sb3IuRmFzdENvbG9yKGNvbG9yRmlsbEFsdGVyKS5vbkJhY2tncm91bmQoY29sb3JCZ0NvbnRhaW5lcikudG9IZXhTdHJpbmcoKTtcbiAgY29uc3QgYmFzZUNvbG9yQWN0aW9uID0gbmV3IF9mYXN0Q29sb3IuRmFzdENvbG9yKGNvbG9ySWNvbik7XG4gIGNvbnN0IGJhc2VDb2xvckFjdGlvbkhvdmVyID0gbmV3IF9mYXN0Q29sb3IuRmFzdENvbG9yKGNvbG9ySWNvbkhvdmVyKTtcbiAgY29uc3QgZXhwYW5kSWNvbkhhbGZJbm5lciA9IGNvbnRyb2xJbnRlcmFjdGl2ZVNpemUgLyAyIC0gbGluZVdpZHRoO1xuICBjb25zdCBleHBhbmRJY29uU2l6ZSA9IGV4cGFuZEljb25IYWxmSW5uZXIgKiAyICsgbGluZVdpZHRoICogMztcbiAgcmV0dXJuIHtcbiAgICBoZWFkZXJCZzogY29sb3JGaWxsQWx0ZXJTb2xpZCxcbiAgICBoZWFkZXJDb2xvcjogY29sb3JUZXh0SGVhZGluZyxcbiAgICBoZWFkZXJTb3J0QWN0aXZlQmc6IGNvbG9yRmlsbFNlY29uZGFyeVNvbGlkLFxuICAgIGhlYWRlclNvcnRIb3ZlckJnOiBjb2xvckZpbGxDb250ZW50U29saWQsXG4gICAgYm9keVNvcnRCZzogY29sb3JGaWxsQWx0ZXJTb2xpZCxcbiAgICByb3dIb3ZlckJnOiBjb2xvckZpbGxBbHRlclNvbGlkLFxuICAgIHJvd1NlbGVjdGVkQmc6IGNvbnRyb2xJdGVtQmdBY3RpdmUsXG4gICAgcm93U2VsZWN0ZWRIb3ZlckJnOiBjb250cm9sSXRlbUJnQWN0aXZlSG92ZXIsXG4gICAgcm93RXhwYW5kZWRCZzogY29sb3JGaWxsQWx0ZXIsXG4gICAgY2VsbFBhZGRpbmdCbG9jazogcGFkZGluZyxcbiAgICBjZWxsUGFkZGluZ0lubGluZTogcGFkZGluZyxcbiAgICBjZWxsUGFkZGluZ0Jsb2NrTUQ6IHBhZGRpbmdTTSxcbiAgICBjZWxsUGFkZGluZ0lubGluZU1EOiBwYWRkaW5nWFMsXG4gICAgY2VsbFBhZGRpbmdCbG9ja1NNOiBwYWRkaW5nWFMsXG4gICAgY2VsbFBhZGRpbmdJbmxpbmVTTTogcGFkZGluZ1hTLFxuICAgIGJvcmRlckNvbG9yOiBjb2xvckJvcmRlclNlY29uZGFyeSxcbiAgICBoZWFkZXJCb3JkZXJSYWRpdXM6IGJvcmRlclJhZGl1c0xHLFxuICAgIGZvb3RlckJnOiBjb2xvckZpbGxBbHRlclNvbGlkLFxuICAgIGZvb3RlckNvbG9yOiBjb2xvclRleHRIZWFkaW5nLFxuICAgIGNlbGxGb250U2l6ZTogZm9udFNpemUsXG4gICAgY2VsbEZvbnRTaXplTUQ6IGZvbnRTaXplLFxuICAgIGNlbGxGb250U2l6ZVNNOiBmb250U2l6ZSxcbiAgICBoZWFkZXJTcGxpdENvbG9yOiBjb2xvckJvcmRlclNlY29uZGFyeSxcbiAgICBmaXhlZEhlYWRlclNvcnRBY3RpdmVCZzogY29sb3JGaWxsU2Vjb25kYXJ5U29saWQsXG4gICAgaGVhZGVyRmlsdGVySG92ZXJCZzogY29sb3JGaWxsQ29udGVudCxcbiAgICBmaWx0ZXJEcm9wZG93bk1lbnVCZzogY29sb3JCZ0NvbnRhaW5lcixcbiAgICBmaWx0ZXJEcm9wZG93bkJnOiBjb2xvckJnQ29udGFpbmVyLFxuICAgIGV4cGFuZEljb25CZzogY29sb3JCZ0NvbnRhaW5lcixcbiAgICBzZWxlY3Rpb25Db2x1bW5XaWR0aDogY29udHJvbEhlaWdodCxcbiAgICBzdGlja3lTY3JvbGxCYXJCZzogY29sb3JUZXh0UGxhY2Vob2xkZXIsXG4gICAgc3RpY2t5U2Nyb2xsQmFyQm9yZGVyUmFkaXVzOiAxMDAsXG4gICAgZXhwYW5kSWNvbk1hcmdpblRvcDogKGZvbnRTaXplICogbGluZUhlaWdodCAtIGxpbmVXaWR0aCAqIDMpIC8gMiAtIE1hdGguY2VpbCgoZm9udFNpemVTTSAqIDEuNCAtIGxpbmVXaWR0aCAqIDMpIC8gMiksXG4gICAgaGVhZGVySWNvbkNvbG9yOiBiYXNlQ29sb3JBY3Rpb24uY2xvbmUoKS5zZXRBKGJhc2VDb2xvckFjdGlvbi5hICogb3BhY2l0eUxvYWRpbmcpLnRvUmdiU3RyaW5nKCksXG4gICAgaGVhZGVySWNvbkhvdmVyQ29sb3I6IGJhc2VDb2xvckFjdGlvbkhvdmVyLmNsb25lKCkuc2V0QShiYXNlQ29sb3JBY3Rpb25Ib3Zlci5hICogb3BhY2l0eUxvYWRpbmcpLnRvUmdiU3RyaW5nKCksXG4gICAgZXhwYW5kSWNvbkhhbGZJbm5lcixcbiAgICBleHBhbmRJY29uU2l6ZSxcbiAgICBleHBhbmRJY29uU2NhbGU6IGNvbnRyb2xJbnRlcmFjdGl2ZVNpemUgLyBleHBhbmRJY29uU2l6ZVxuICB9O1xufTtcbmV4cG9ydHMucHJlcGFyZUNvbXBvbmVudFRva2VuID0gcHJlcGFyZUNvbXBvbmVudFRva2VuO1xuY29uc3QgekluZGV4VGFibGVGaXhlZCA9IDI7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRXhwb3J0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gKDAsIF9pbnRlcm5hbC5nZW5TdHlsZUhvb2tzKSgnVGFibGUnLCB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb2xvclRleHRIZWFkaW5nLFxuICAgIGNvbG9yU3BsaXQsXG4gICAgY29sb3JCZ0NvbnRhaW5lcixcbiAgICBjb250cm9sSW50ZXJhY3RpdmVTaXplOiBjaGVja2JveFNpemUsXG4gICAgaGVhZGVyQmcsXG4gICAgaGVhZGVyQ29sb3IsXG4gICAgaGVhZGVyU29ydEFjdGl2ZUJnLFxuICAgIGhlYWRlclNvcnRIb3ZlckJnLFxuICAgIGJvZHlTb3J0QmcsXG4gICAgcm93SG92ZXJCZyxcbiAgICByb3dTZWxlY3RlZEJnLFxuICAgIHJvd1NlbGVjdGVkSG92ZXJCZyxcbiAgICByb3dFeHBhbmRlZEJnLFxuICAgIGNlbGxQYWRkaW5nQmxvY2ssXG4gICAgY2VsbFBhZGRpbmdJbmxpbmUsXG4gICAgY2VsbFBhZGRpbmdCbG9ja01ELFxuICAgIGNlbGxQYWRkaW5nSW5saW5lTUQsXG4gICAgY2VsbFBhZGRpbmdCbG9ja1NNLFxuICAgIGNlbGxQYWRkaW5nSW5saW5lU00sXG4gICAgYm9yZGVyQ29sb3IsXG4gICAgZm9vdGVyQmcsXG4gICAgZm9vdGVyQ29sb3IsXG4gICAgaGVhZGVyQm9yZGVyUmFkaXVzLFxuICAgIGNlbGxGb250U2l6ZSxcbiAgICBjZWxsRm9udFNpemVNRCxcbiAgICBjZWxsRm9udFNpemVTTSxcbiAgICBoZWFkZXJTcGxpdENvbG9yLFxuICAgIGZpeGVkSGVhZGVyU29ydEFjdGl2ZUJnLFxuICAgIGhlYWRlckZpbHRlckhvdmVyQmcsXG4gICAgZmlsdGVyRHJvcGRvd25CZyxcbiAgICBleHBhbmRJY29uQmcsXG4gICAgc2VsZWN0aW9uQ29sdW1uV2lkdGgsXG4gICAgc3RpY2t5U2Nyb2xsQmFyQmcsXG4gICAgY2FsY1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IHRhYmxlVG9rZW4gPSAoMCwgX2ludGVybmFsLm1lcmdlVG9rZW4pKHRva2VuLCB7XG4gICAgdGFibGVGb250U2l6ZTogY2VsbEZvbnRTaXplLFxuICAgIHRhYmxlQmc6IGNvbG9yQmdDb250YWluZXIsXG4gICAgdGFibGVSYWRpdXM6IGhlYWRlckJvcmRlclJhZGl1cyxcbiAgICB0YWJsZVBhZGRpbmdWZXJ0aWNhbDogY2VsbFBhZGRpbmdCbG9jayxcbiAgICB0YWJsZVBhZGRpbmdIb3Jpem9udGFsOiBjZWxsUGFkZGluZ0lubGluZSxcbiAgICB0YWJsZVBhZGRpbmdWZXJ0aWNhbE1pZGRsZTogY2VsbFBhZGRpbmdCbG9ja01ELFxuICAgIHRhYmxlUGFkZGluZ0hvcml6b250YWxNaWRkbGU6IGNlbGxQYWRkaW5nSW5saW5lTUQsXG4gICAgdGFibGVQYWRkaW5nVmVydGljYWxTbWFsbDogY2VsbFBhZGRpbmdCbG9ja1NNLFxuICAgIHRhYmxlUGFkZGluZ0hvcml6b250YWxTbWFsbDogY2VsbFBhZGRpbmdJbmxpbmVTTSxcbiAgICB0YWJsZUJvcmRlckNvbG9yOiBib3JkZXJDb2xvcixcbiAgICB0YWJsZUhlYWRlclRleHRDb2xvcjogaGVhZGVyQ29sb3IsXG4gICAgdGFibGVIZWFkZXJCZzogaGVhZGVyQmcsXG4gICAgdGFibGVGb290ZXJUZXh0Q29sb3I6IGZvb3RlckNvbG9yLFxuICAgIHRhYmxlRm9vdGVyQmc6IGZvb3RlckJnLFxuICAgIHRhYmxlSGVhZGVyQ2VsbFNwbGl0Q29sb3I6IGhlYWRlclNwbGl0Q29sb3IsXG4gICAgdGFibGVIZWFkZXJTb3J0Qmc6IGhlYWRlclNvcnRBY3RpdmVCZyxcbiAgICB0YWJsZUhlYWRlclNvcnRIb3ZlckJnOiBoZWFkZXJTb3J0SG92ZXJCZyxcbiAgICB0YWJsZUJvZHlTb3J0Qmc6IGJvZHlTb3J0QmcsXG4gICAgdGFibGVGaXhlZEhlYWRlclNvcnRBY3RpdmVCZzogZml4ZWRIZWFkZXJTb3J0QWN0aXZlQmcsXG4gICAgdGFibGVIZWFkZXJGaWx0ZXJBY3RpdmVCZzogaGVhZGVyRmlsdGVySG92ZXJCZyxcbiAgICB0YWJsZUZpbHRlckRyb3Bkb3duQmc6IGZpbHRlckRyb3Bkb3duQmcsXG4gICAgdGFibGVSb3dIb3ZlckJnOiByb3dIb3ZlckJnLFxuICAgIHRhYmxlU2VsZWN0ZWRSb3dCZzogcm93U2VsZWN0ZWRCZyxcbiAgICB0YWJsZVNlbGVjdGVkUm93SG92ZXJCZzogcm93U2VsZWN0ZWRIb3ZlckJnLFxuICAgIHpJbmRleFRhYmxlRml4ZWQsXG4gICAgekluZGV4VGFibGVTdGlja3k6IGNhbGMoekluZGV4VGFibGVGaXhlZCkuYWRkKDEpLmVxdWFsKHtcbiAgICAgIHVuaXQ6IGZhbHNlXG4gICAgfSksXG4gICAgdGFibGVGb250U2l6ZU1pZGRsZTogY2VsbEZvbnRTaXplTUQsXG4gICAgdGFibGVGb250U2l6ZVNtYWxsOiBjZWxsRm9udFNpemVTTSxcbiAgICB0YWJsZVNlbGVjdGlvbkNvbHVtbldpZHRoOiBzZWxlY3Rpb25Db2x1bW5XaWR0aCxcbiAgICB0YWJsZUV4cGFuZEljb25CZzogZXhwYW5kSWNvbkJnLFxuICAgIHRhYmxlRXhwYW5kQ29sdW1uV2lkdGg6IGNhbGMoY2hlY2tib3hTaXplKS5hZGQoY2FsYyh0b2tlbi5wYWRkaW5nKS5tdWwoMikpLmVxdWFsKCksXG4gICAgdGFibGVFeHBhbmRlZFJvd0JnOiByb3dFeHBhbmRlZEJnLFxuICAgIC8vIERyb3Bkb3duXG4gICAgdGFibGVGaWx0ZXJEcm9wZG93bldpZHRoOiAxMjAsXG4gICAgdGFibGVGaWx0ZXJEcm9wZG93bkhlaWdodDogMjY0LFxuICAgIHRhYmxlRmlsdGVyRHJvcGRvd25TZWFyY2hXaWR0aDogMTQwLFxuICAgIC8vIFZpcnR1YWwgU2Nyb2xsIEJhclxuICAgIHRhYmxlU2Nyb2xsVGh1bWJTaXplOiA4LFxuICAgIC8vIE1hYyBzY3JvbGwgYmFyIHNpemVcbiAgICB0YWJsZVNjcm9sbFRodW1iQmc6IHN0aWNreVNjcm9sbEJhckJnLFxuICAgIHRhYmxlU2Nyb2xsVGh1bWJCZ0hvdmVyOiBjb2xvclRleHRIZWFkaW5nLFxuICAgIHRhYmxlU2Nyb2xsQmc6IGNvbG9yU3BsaXRcbiAgfSk7XG4gIHJldHVybiBbZ2VuVGFibGVTdHlsZSh0YWJsZVRva2VuKSwgKDAsIF9wYWdpbmF0aW9uLmRlZmF1bHQpKHRhYmxlVG9rZW4pLCAoMCwgX3N1bW1hcnkuZGVmYXVsdCkodGFibGVUb2tlbiksICgwLCBfc29ydGVyLmRlZmF1bHQpKHRhYmxlVG9rZW4pLCAoMCwgX2ZpbHRlci5kZWZhdWx0KSh0YWJsZVRva2VuKSwgKDAsIF9ib3JkZXJlZC5kZWZhdWx0KSh0YWJsZVRva2VuKSwgKDAsIF9yYWRpdXMuZGVmYXVsdCkodGFibGVUb2tlbiksICgwLCBfZXhwYW5kLmRlZmF1bHQpKHRhYmxlVG9rZW4pLCAoMCwgX3N1bW1hcnkuZGVmYXVsdCkodGFibGVUb2tlbiksICgwLCBfZW1wdHkuZGVmYXVsdCkodGFibGVUb2tlbiksICgwLCBfc2VsZWN0aW9uLmRlZmF1bHQpKHRhYmxlVG9rZW4pLCAoMCwgX2ZpeGVkLmRlZmF1bHQpKHRhYmxlVG9rZW4pLCAoMCwgX3N0aWNreS5kZWZhdWx0KSh0YWJsZVRva2VuKSwgKDAsIF9lbGxpcHNpcy5kZWZhdWx0KSh0YWJsZVRva2VuKSwgKDAsIF9zaXplLmRlZmF1bHQpKHRhYmxlVG9rZW4pLCAoMCwgX3J0bC5kZWZhdWx0KSh0YWJsZVRva2VuKSwgKDAsIF92aXJ0dWFsLmRlZmF1bHQpKHRhYmxlVG9rZW4pXTtcbn0sIHByZXBhcmVDb21wb25lbnRUb2tlbiwge1xuICB1bml0bGVzczoge1xuICAgIGV4cGFuZEljb25TY2FsZTogdHJ1ZVxuICB9XG59KTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfY3NzaW5qcyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jc3NpbmpzXCIpO1xuY29uc3QgZ2VuUGFnaW5hdGlvblN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGFudENscyxcbiAgICBtYXJnaW5cbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXToge1xuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gUGFnaW5hdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tcGFnaW5hdGlvbiR7YW50Q2xzfS1wYWdpbmF0aW9uYF06IHtcbiAgICAgICAgbWFyZ2luOiBgJHsoMCwgX2Nzc2luanMudW5pdCkobWFyZ2luKX0gMGBcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1wYWdpbmF0aW9uYF06IHtcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBmbGV4V3JhcDogJ3dyYXAnLFxuICAgICAgICByb3dHYXA6IHRva2VuLnBhZGRpbmdYUyxcbiAgICAgICAgJz4gKic6IHtcbiAgICAgICAgICBmbGV4OiAnbm9uZSdcbiAgICAgICAgfSxcbiAgICAgICAgJyYtbGVmdCc6IHtcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtc3RhcnQnXG4gICAgICAgIH0sXG4gICAgICAgICcmLWNlbnRlcic6IHtcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcidcbiAgICAgICAgfSxcbiAgICAgICAgJyYtcmlnaHQnOiB7XG4gICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdmbGV4LWVuZCdcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZW5QYWdpbmF0aW9uU3R5bGU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2Nzc2luanMgPSByZXF1aXJlKFwiQGFudC1kZXNpZ24vY3NzaW5qc1wiKTtcbmNvbnN0IGdlblJhZGl1c1N0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIHRhYmxlUmFkaXVzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyYF06IHtcbiAgICAgIFtjb21wb25lbnRDbHNdOiB7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM5MTE1I2lzc3VlY29tbWVudC0xMzYyMzE0NTc0XG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXRpdGxlLCAke2NvbXBvbmVudENsc30taGVhZGVyYF06IHtcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IGAkeygwLCBfY3NzaW5qcy51bml0KSh0YWJsZVJhZGl1cyl9ICR7KDAsIF9jc3NpbmpzLnVuaXQpKHRhYmxlUmFkaXVzKX0gMCAwYFxuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS10aXRsZSArICR7Y29tcG9uZW50Q2xzfS1jb250YWluZXJgXToge1xuICAgICAgICAgIGJvcmRlclN0YXJ0U3RhcnRSYWRpdXM6IDAsXG4gICAgICAgICAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IDAsXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNDE5NzVcbiAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1oZWFkZXIsIHRhYmxlYF06IHtcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3RhYmxlID4gdGhlYWQgPiB0cjpmaXJzdC1jaGlsZCc6IHtcbiAgICAgICAgICAgICd0aDpmaXJzdC1jaGlsZCwgdGg6bGFzdC1jaGlsZCwgdGQ6Zmlyc3QtY2hpbGQsIHRkOmxhc3QtY2hpbGQnOiB7XG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1czogMFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJyYtY29udGFpbmVyJzoge1xuICAgICAgICAgIGJvcmRlclN0YXJ0U3RhcnRSYWRpdXM6IHRhYmxlUmFkaXVzLFxuICAgICAgICAgIGJvcmRlclN0YXJ0RW5kUmFkaXVzOiB0YWJsZVJhZGl1cyxcbiAgICAgICAgICAndGFibGUgPiB0aGVhZCA+IHRyOmZpcnN0LWNoaWxkJzoge1xuICAgICAgICAgICAgJz4gKjpmaXJzdC1jaGlsZCc6IHtcbiAgICAgICAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogdGFibGVSYWRpdXNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnPiAqOmxhc3QtY2hpbGQnOiB7XG4gICAgICAgICAgICAgIGJvcmRlclN0YXJ0RW5kUmFkaXVzOiB0YWJsZVJhZGl1c1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJyYtZm9vdGVyJzoge1xuICAgICAgICAgIGJvcmRlclJhZGl1czogYDAgMCAkeygwLCBfY3NzaW5qcy51bml0KSh0YWJsZVJhZGl1cyl9ICR7KDAsIF9jc3NpbmpzLnVuaXQpKHRhYmxlUmFkaXVzKX1gXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gZ2VuUmFkaXVzU3R5bGU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5jb25zdCBnZW5TdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2Ake2NvbXBvbmVudENsc30td3JhcHBlci1ydGxgXToge1xuICAgICAgZGlyZWN0aW9uOiAncnRsJyxcbiAgICAgIHRhYmxlOiB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3J0bCdcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1wYWdpbmF0aW9uLWxlZnRgXToge1xuICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtZW5kJ1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXBhZ2luYXRpb24tcmlnaHRgXToge1xuICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtc3RhcnQnXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tcm93LWV4cGFuZC1pY29uYF06IHtcbiAgICAgICAgZmxvYXQ6ICdyaWdodCcsXG4gICAgICAgICcmOjphZnRlcic6IHtcbiAgICAgICAgICB0cmFuc2Zvcm06ICdyb3RhdGUoLTkwZGVnKSdcbiAgICAgICAgfSxcbiAgICAgICAgJyYtY29sbGFwc2VkOjpiZWZvcmUnOiB7XG4gICAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlKDE4MGRlZyknXG4gICAgICAgIH0sXG4gICAgICAgICcmLWNvbGxhcHNlZDo6YWZ0ZXInOiB7XG4gICAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlKDBkZWcpJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tY29udGFpbmVyYF06IHtcbiAgICAgICAgJyY6OmJlZm9yZSc6IHtcbiAgICAgICAgICBpbnNldElubGluZVN0YXJ0OiAndW5zZXQnLFxuICAgICAgICAgIGluc2V0SW5saW5lRW5kOiAwXG4gICAgICAgIH0sXG4gICAgICAgICcmOjphZnRlcic6IHtcbiAgICAgICAgICBpbnNldElubGluZVN0YXJ0OiAwLFxuICAgICAgICAgIGluc2V0SW5saW5lRW5kOiAndW5zZXQnXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXJvdy1pbmRlbnRgXToge1xuICAgICAgICAgIGZsb2F0OiAncmlnaHQnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gZ2VuU3R5bGU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2Nzc2luanMgPSByZXF1aXJlKFwiQGFudC1kZXNpZ24vY3NzaW5qc1wiKTtcbmNvbnN0IGdlblNlbGVjdGlvblN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGFudENscyxcbiAgICBpY29uQ2xzLFxuICAgIGZvbnRTaXplSWNvbixcbiAgICBwYWRkaW5nLFxuICAgIHBhZGRpbmdYUyxcbiAgICBoZWFkZXJJY29uQ29sb3IsXG4gICAgaGVhZGVySWNvbkhvdmVyQ29sb3IsXG4gICAgdGFibGVTZWxlY3Rpb25Db2x1bW5XaWR0aCxcbiAgICB0YWJsZVNlbGVjdGVkUm93QmcsXG4gICAgdGFibGVTZWxlY3RlZFJvd0hvdmVyQmcsXG4gICAgdGFibGVSb3dIb3ZlckJnLFxuICAgIHRhYmxlUGFkZGluZ0hvcml6b250YWwsXG4gICAgY2FsY1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2Ake2NvbXBvbmVudENsc30td3JhcHBlcmBdOiB7XG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBTZWxlY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tY29sYF06IHtcbiAgICAgICAgd2lkdGg6IHRhYmxlU2VsZWN0aW9uQ29sdW1uV2lkdGgsXG4gICAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tY29sLXdpdGgtZHJvcGRvd25gXToge1xuICAgICAgICAgIHdpZHRoOiBjYWxjKHRhYmxlU2VsZWN0aW9uQ29sdW1uV2lkdGgpLmFkZChmb250U2l6ZUljb24pLmFkZChjYWxjKHBhZGRpbmcpLmRpdig0KSkuZXF1YWwoKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tYm9yZGVyZWQgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1jb2xgXToge1xuICAgICAgICB3aWR0aDogY2FsYyh0YWJsZVNlbGVjdGlvbkNvbHVtbldpZHRoKS5hZGQoY2FsYyhwYWRkaW5nWFMpLm11bCgyKSkuZXF1YWwoKSxcbiAgICAgICAgW2AmJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1jb2wtd2l0aC1kcm9wZG93bmBdOiB7XG4gICAgICAgICAgd2lkdGg6IGNhbGModGFibGVTZWxlY3Rpb25Db2x1bW5XaWR0aCkuYWRkKGZvbnRTaXplSWNvbikuYWRkKGNhbGMocGFkZGluZykuZGl2KDQpKS5hZGQoY2FsYyhwYWRkaW5nWFMpLm11bCgyKSkuZXF1YWwoKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2BcbiAgICAgICAgdGFibGUgdHIgdGgke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLWNvbHVtbixcbiAgICAgICAgdGFibGUgdHIgdGQke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLWNvbHVtbixcbiAgICAgICAgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1jb2x1bW5cbiAgICAgIGBdOiB7XG4gICAgICAgIHBhZGRpbmdJbmxpbmVFbmQ6IHRva2VuLnBhZGRpbmdYUyxcbiAgICAgICAgcGFkZGluZ0lubGluZVN0YXJ0OiB0b2tlbi5wYWRkaW5nWFMsXG4gICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIFtgJHthbnRDbHN9LXJhZGlvLXdyYXBwZXJgXToge1xuICAgICAgICAgIG1hcmdpbklubGluZUVuZDogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2B0YWJsZSB0ciB0aCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tY29sdW1uJHtjb21wb25lbnRDbHN9LWNlbGwtZml4LWxlZnRgXToge1xuICAgICAgICB6SW5kZXg6IGNhbGModG9rZW4uekluZGV4VGFibGVGaXhlZCkuYWRkKDEpLmVxdWFsKHtcbiAgICAgICAgICB1bml0OiBmYWxzZVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIFtgdGFibGUgdHIgdGgke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLWNvbHVtbjo6YWZ0ZXJgXToge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCAhaW1wb3J0YW50J1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbmBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICAgICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJ1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1leHRyYWBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB0b3A6IDAsXG4gICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgIHRyYW5zaXRpb246IGBhbGwgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6ICcxMDAlJyxcbiAgICAgICAgcGFkZGluZ0lubGluZVN0YXJ0OiAoMCwgX2Nzc2luanMudW5pdCkoY2FsYyh0YWJsZVBhZGRpbmdIb3Jpem9udGFsKS5kaXYoNCkuZXF1YWwoKSksXG4gICAgICAgIFtpY29uQ2xzXToge1xuICAgICAgICAgIGNvbG9yOiBoZWFkZXJJY29uQ29sb3IsXG4gICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplSWNvbixcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnYmFzZWxpbmUnLFxuICAgICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgICAgY29sb3I6IGhlYWRlckljb25Ib3ZlckNvbG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUm93cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tdGJvZHlgXToge1xuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1yb3dgXToge1xuICAgICAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS1yb3ctc2VsZWN0ZWRgXToge1xuICAgICAgICAgICAgW2A+ICR7Y29tcG9uZW50Q2xzfS1jZWxsYF06IHtcbiAgICAgICAgICAgICAgYmFja2dyb3VuZDogdGFibGVTZWxlY3RlZFJvd0JnLFxuICAgICAgICAgICAgICAnJi1yb3ctaG92ZXInOiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdGFibGVTZWxlY3RlZFJvd0hvdmVyQmdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW2A+ICR7Y29tcG9uZW50Q2xzfS1jZWxsLXJvdy1ob3ZlcmBdOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiB0YWJsZVJvd0hvdmVyQmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gZ2VuU2VsZWN0aW9uU3R5bGU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2Nzc2luanMgPSByZXF1aXJlKFwiQGFudC1kZXNpZ24vY3NzaW5qc1wiKTtcbmNvbnN0IGdlblNpemVTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICB0YWJsZUV4cGFuZENvbHVtbldpZHRoLFxuICAgIGNhbGNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBnZXRTaXplU3R5bGUgPSAoc2l6ZSwgcGFkZGluZ1ZlcnRpY2FsLCBwYWRkaW5nSG9yaXpvbnRhbCwgZm9udFNpemUpID0+ICh7XG4gICAgW2Ake2NvbXBvbmVudENsc30ke2NvbXBvbmVudENsc30tJHtzaXplfWBdOiB7XG4gICAgICBmb250U2l6ZSxcbiAgICAgIFtgXG4gICAgICAgICR7Y29tcG9uZW50Q2xzfS10aXRsZSxcbiAgICAgICAgJHtjb21wb25lbnRDbHN9LWZvb3RlcixcbiAgICAgICAgJHtjb21wb25lbnRDbHN9LWNlbGwsXG4gICAgICAgICR7Y29tcG9uZW50Q2xzfS10aGVhZCA+IHRyID4gdGgsXG4gICAgICAgICR7Y29tcG9uZW50Q2xzfS10Ym9keSA+IHRyID4gdGgsXG4gICAgICAgICR7Y29tcG9uZW50Q2xzfS10Ym9keSA+IHRyID4gdGQsXG4gICAgICAgIHRmb290ID4gdHIgPiB0aCxcbiAgICAgICAgdGZvb3QgPiB0ciA+IHRkXG4gICAgICBgXToge1xuICAgICAgICBwYWRkaW5nOiBgJHsoMCwgX2Nzc2luanMudW5pdCkocGFkZGluZ1ZlcnRpY2FsKX0gJHsoMCwgX2Nzc2luanMudW5pdCkocGFkZGluZ0hvcml6b250YWwpfWBcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1maWx0ZXItdHJpZ2dlcmBdOiB7XG4gICAgICAgIG1hcmdpbklubGluZUVuZDogKDAsIF9jc3NpbmpzLnVuaXQpKGNhbGMocGFkZGluZ0hvcml6b250YWwpLmRpdigyKS5tdWwoLTEpLmVxdWFsKCkpXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tZXhwYW5kZWQtcm93LWZpeGVkYF06IHtcbiAgICAgICAgbWFyZ2luOiBgJHsoMCwgX2Nzc2luanMudW5pdCkoY2FsYyhwYWRkaW5nVmVydGljYWwpLm11bCgtMSkuZXF1YWwoKSl9ICR7KDAsIF9jc3NpbmpzLnVuaXQpKGNhbGMocGFkZGluZ0hvcml6b250YWwpLm11bCgtMSkuZXF1YWwoKSl9YFxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXRib2R5YF06IHtcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBOZXN0IFRhYmxlID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyOm9ubHktY2hpbGQgJHtjb21wb25lbnRDbHN9YF06IHtcbiAgICAgICAgICBtYXJnaW5CbG9jazogKDAsIF9jc3NpbmpzLnVuaXQpKGNhbGMocGFkZGluZ1ZlcnRpY2FsKS5tdWwoLTEpLmVxdWFsKCkpLFxuICAgICAgICAgIG1hcmdpbklubGluZTogYCR7KDAsIF9jc3NpbmpzLnVuaXQpKGNhbGModGFibGVFeHBhbmRDb2x1bW5XaWR0aCkuc3ViKHBhZGRpbmdIb3Jpem9udGFsKS5lcXVhbCgpKX0gJHsoMCwgX2Nzc2luanMudW5pdCkoY2FsYyhwYWRkaW5nSG9yaXpvbnRhbCkubXVsKC0xKS5lcXVhbCgpKX1gXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zNTE2N1xuICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0aW9uLWV4dHJhYF06IHtcbiAgICAgICAgcGFkZGluZ0lubGluZVN0YXJ0OiAoMCwgX2Nzc2luanMudW5pdCkoY2FsYyhwYWRkaW5nSG9yaXpvbnRhbCkuZGl2KDQpLmVxdWFsKCkpXG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2V0U2l6ZVN0eWxlKCdtaWRkbGUnLCB0b2tlbi50YWJsZVBhZGRpbmdWZXJ0aWNhbE1pZGRsZSwgdG9rZW4udGFibGVQYWRkaW5nSG9yaXpvbnRhbE1pZGRsZSwgdG9rZW4udGFibGVGb250U2l6ZU1pZGRsZSkpLCBnZXRTaXplU3R5bGUoJ3NtYWxsJywgdG9rZW4udGFibGVQYWRkaW5nVmVydGljYWxTbWFsbCwgdG9rZW4udGFibGVQYWRkaW5nSG9yaXpvbnRhbFNtYWxsLCB0b2tlbi50YWJsZUZvbnRTaXplU21hbGwpKVxuICB9O1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGdlblNpemVTdHlsZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbmNvbnN0IGdlblNvcnRlclN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIG1hcmdpblhYUyxcbiAgICBmb250U2l6ZUljb24sXG4gICAgaGVhZGVySWNvbkNvbG9yLFxuICAgIGhlYWRlckljb25Ib3ZlckNvbG9yXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyYF06IHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXRoZWFkIHRoJHtjb21wb25lbnRDbHN9LWNvbHVtbi1oYXMtc29ydGVyc2BdOiB7XG4gICAgICAgIG91dGxpbmU6ICdub25lJyxcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgIC8vIHdoeSBsZWZ0IDBzPyBBdm9pZCBjb2x1bW4gaGVhZGVyIG1vdmUgd2l0aCB0cmFuc2l0aW9uIHdoZW4gbGVmdCBpcyBjaGFuZ2VkXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzUwNTg4XG4gICAgICAgIHRyYW5zaXRpb246IGBhbGwgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9LCBsZWZ0IDBzYCxcbiAgICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgICAgYmFja2dyb3VuZDogdG9rZW4udGFibGVIZWFkZXJTb3J0SG92ZXJCZyxcbiAgICAgICAgICAnJjo6YmVmb3JlJzoge1xuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQgIWltcG9ydGFudCdcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICcmOmZvY3VzLXZpc2libGUnOiB7XG4gICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeVxuICAgICAgICB9LFxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zMDk2OVxuICAgICAgICBbYFxuICAgICAgICAgICYke2NvbXBvbmVudENsc30tY2VsbC1maXgtbGVmdDpob3ZlcixcbiAgICAgICAgICAmJHtjb21wb25lbnRDbHN9LWNlbGwtZml4LXJpZ2h0OmhvdmVyXG4gICAgICAgIGBdOiB7XG4gICAgICAgICAgYmFja2dyb3VuZDogdG9rZW4udGFibGVGaXhlZEhlYWRlclNvcnRBY3RpdmVCZ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tdGhlYWQgdGgke2NvbXBvbmVudENsc30tY29sdW1uLXNvcnRgXToge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0b2tlbi50YWJsZUhlYWRlclNvcnRCZyxcbiAgICAgICAgJyY6OmJlZm9yZSc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCAhaW1wb3J0YW50J1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2B0ZCR7Y29tcG9uZW50Q2xzfS1jb2x1bW4tc29ydGBdOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRva2VuLnRhYmxlQm9keVNvcnRCZ1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWNvbHVtbi10aXRsZWBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgIGZsZXg6IDEsXG4gICAgICAgIG1pbldpZHRoOiAwXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tY29sdW1uLXNvcnRlcnNgXToge1xuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIGZsZXg6ICdhdXRvJyxcbiAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsXG4gICAgICAgICcmOjphZnRlcic6IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICBpbnNldDogMCxcbiAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tY29sdW1uLXNvcnRlcnMtdG9vbHRpcC10YXJnZXQtc29ydGVyYF06IHtcbiAgICAgICAgJyY6OmFmdGVyJzoge1xuICAgICAgICAgIGNvbnRlbnQ6ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tY29sdW1uLXNvcnRlcmBdOiB7XG4gICAgICAgIG1hcmdpbklubGluZVN0YXJ0OiBtYXJnaW5YWFMsXG4gICAgICAgIGNvbG9yOiBoZWFkZXJJY29uQ29sb3IsXG4gICAgICAgIGZvbnRTaXplOiAwLFxuICAgICAgICB0cmFuc2l0aW9uOiBgY29sb3IgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgJyYtaW5uZXInOiB7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JyxcbiAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJ1xuICAgICAgICB9LFxuICAgICAgICAnJi11cCwgJi1kb3duJzoge1xuICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZUljb24sXG4gICAgICAgICAgJyYuYWN0aXZlJzoge1xuICAgICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tY29sdW1uLXNvcnRlci11cCArICR7Y29tcG9uZW50Q2xzfS1jb2x1bW4tc29ydGVyLWRvd25gXToge1xuICAgICAgICAgIG1hcmdpblRvcDogJy0wLjNlbSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWNvbHVtbi1zb3J0ZXJzOmhvdmVyICR7Y29tcG9uZW50Q2xzfS1jb2x1bW4tc29ydGVyYF06IHtcbiAgICAgICAgY29sb3I6IGhlYWRlckljb25Ib3ZlckNvbG9yXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGdlblNvcnRlclN0eWxlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9jc3NpbmpzID0gcmVxdWlyZShcIkBhbnQtZGVzaWduL2Nzc2luanNcIik7XG5jb25zdCBnZW5TdGlja3lTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBvcGFjaXR5TG9hZGluZyxcbiAgICB0YWJsZVNjcm9sbFRodW1iQmcsXG4gICAgdGFibGVTY3JvbGxUaHVtYkJnSG92ZXIsXG4gICAgdGFibGVTY3JvbGxUaHVtYlNpemUsXG4gICAgdGFibGVTY3JvbGxCZyxcbiAgICB6SW5kZXhUYWJsZVN0aWNreSxcbiAgICBzdGlja3lTY3JvbGxCYXJCb3JkZXJSYWRpdXMsXG4gICAgbGluZVdpZHRoLFxuICAgIGxpbmVUeXBlLFxuICAgIHRhYmxlQm9yZGVyQ29sb3JcbiAgfSA9IHRva2VuO1xuICBjb25zdCB0YWJsZUJvcmRlciA9IGAkeygwLCBfY3NzaW5qcy51bml0KShsaW5lV2lkdGgpfSAke2xpbmVUeXBlfSAke3RhYmxlQm9yZGVyQ29sb3J9YDtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyYF06IHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXN0aWNreWBdOiB7XG4gICAgICAgICcmLWhvbGRlcic6IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ3N0aWNreScsXG4gICAgICAgICAgekluZGV4OiB6SW5kZXhUYWJsZVN0aWNreSxcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyXG4gICAgICAgIH0sXG4gICAgICAgICcmLXNjcm9sbCc6IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ3N0aWNreScsXG4gICAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICAgIGhlaWdodDogYCR7KDAsIF9jc3NpbmpzLnVuaXQpKHRhYmxlU2Nyb2xsVGh1bWJTaXplKX0gIWltcG9ydGFudGAsXG4gICAgICAgICAgekluZGV4OiB6SW5kZXhUYWJsZVN0aWNreSxcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgYmFja2dyb3VuZDogdGFibGVTY3JvbGxCZyxcbiAgICAgICAgICBib3JkZXJUb3A6IHRhYmxlQm9yZGVyLFxuICAgICAgICAgIG9wYWNpdHk6IG9wYWNpdHlMb2FkaW5nLFxuICAgICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnY2VudGVyIGJvdHRvbSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIGZha2Ugc2Nyb2xsYmFyIHN0eWxlIG9mIHN0aWNreVxuICAgICAgICAgICcmLWJhcic6IHtcbiAgICAgICAgICAgIGhlaWdodDogdGFibGVTY3JvbGxUaHVtYlNpemUsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRhYmxlU2Nyb2xsVGh1bWJCZyxcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogc3RpY2t5U2Nyb2xsQmFyQm9yZGVyUmFkaXVzLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd30sIHRyYW5zZm9ybSAwc2AsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgICcmOmhvdmVyLCAmLWFjdGl2ZSc6IHtcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0YWJsZVNjcm9sbFRodW1iQmdIb3ZlclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZW5TdGlja3lTdHlsZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfY3NzaW5qcyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jc3NpbmpzXCIpO1xuY29uc3QgZ2VuU3VtbWFyeVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGxpbmVXaWR0aCxcbiAgICB0YWJsZUJvcmRlckNvbG9yLFxuICAgIGNhbGNcbiAgfSA9IHRva2VuO1xuICBjb25zdCB0YWJsZUJvcmRlciA9IGAkeygwLCBfY3NzaW5qcy51bml0KShsaW5lV2lkdGgpfSAke3Rva2VuLmxpbmVUeXBlfSAke3RhYmxlQm9yZGVyQ29sb3J9YDtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyYF06IHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXN1bW1hcnlgXToge1xuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgekluZGV4OiB0b2tlbi56SW5kZXhUYWJsZUZpeGVkLFxuICAgICAgICBiYWNrZ3JvdW5kOiB0b2tlbi50YWJsZUJnLFxuICAgICAgICAnPiB0cic6IHtcbiAgICAgICAgICAnPiB0aCwgPiB0ZCc6IHtcbiAgICAgICAgICAgIGJvcmRlckJvdHRvbTogdGFibGVCb3JkZXJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYGRpdiR7Y29tcG9uZW50Q2xzfS1zdW1tYXJ5YF06IHtcbiAgICAgICAgYm94U2hhZG93OiBgMCAkeygwLCBfY3NzaW5qcy51bml0KShjYWxjKGxpbmVXaWR0aCkubXVsKC0xKS5lcXVhbCgpKX0gMCAke3RhYmxlQm9yZGVyQ29sb3J9YFxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZW5TdW1tYXJ5U3R5bGU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2Nzc2luanMgPSByZXF1aXJlKFwiQGFudC1kZXNpZ24vY3NzaW5qc1wiKTtcbmNvbnN0IGdlblZpcnR1YWxTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBtb3Rpb25EdXJhdGlvbk1pZCxcbiAgICBsaW5lV2lkdGgsXG4gICAgbGluZVR5cGUsXG4gICAgdGFibGVCb3JkZXJDb2xvcixcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgdGFibGVCb3JkZXIgPSBgJHsoMCwgX2Nzc2luanMudW5pdCkobGluZVdpZHRoKX0gJHtsaW5lVHlwZX0gJHt0YWJsZUJvcmRlckNvbG9yfWA7XG4gIGNvbnN0IHJvd0NlbGxDbHMgPSBgJHtjb21wb25lbnRDbHN9LWV4cGFuZGVkLXJvdy1jZWxsYDtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyYF06IHtcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFJvdyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tdGJvZHktdmlydHVhbGBdOiB7XG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXRib2R5LXZpcnR1YWwtaG9sZGVyLWlubmVyYF06IHtcbiAgICAgICAgICBbYFxuICAgICAgICAgICAgJiA+ICR7Y29tcG9uZW50Q2xzfS1yb3csIFxuICAgICAgICAgICAgJiA+IGRpdjpub3QoJHtjb21wb25lbnRDbHN9LXJvdykgPiAke2NvbXBvbmVudENsc30tcm93XG4gICAgICAgICAgYF06IHtcbiAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tY2VsbGBdOiB7XG4gICAgICAgICAgYm9yZGVyQm90dG9tOiB0YWJsZUJvcmRlcixcbiAgICAgICAgICB0cmFuc2l0aW9uOiBgYmFja2dyb3VuZCAke21vdGlvbkR1cmF0aW9uTWlkfWBcbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tZXhwYW5kZWQtcm93YF06IHtcbiAgICAgICAgICBbYCR7cm93Q2VsbENsc30ke3Jvd0NlbGxDbHN9LWZpeGVkYF06IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcbiAgICAgICAgICAgIGluc2V0SW5saW5lU3RhcnQ6IDAsXG4gICAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgICAgICB3aWR0aDogYGNhbGModmFyKC0tdmlydHVhbC13aWR0aCkgLSAkeygwLCBfY3NzaW5qcy51bml0KShsaW5lV2lkdGgpfSlgLFxuICAgICAgICAgICAgYm9yZGVySW5saW5lRW5kOiAnbm9uZSdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gQm9yZGVyID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWJvcmRlcmVkYF06IHtcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tdGJvZHktdmlydHVhbGBdOiB7XG4gICAgICAgICAgJyY6YWZ0ZXInOiB7XG4gICAgICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgICAgICBpbnNldElubGluZTogMCxcbiAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgIGJvcmRlckJvdHRvbTogdGFibGVCb3JkZXIsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tY2VsbGBdOiB7XG4gICAgICAgICAgICBib3JkZXJJbmxpbmVFbmQ6IHRhYmxlQm9yZGVyLFxuICAgICAgICAgICAgW2AmJHtjb21wb25lbnRDbHN9LWNlbGwtZml4LXJpZ2h0LWZpcnN0OmJlZm9yZWBdOiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJyxcbiAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgIGluc2V0QmxvY2s6IDAsXG4gICAgICAgICAgICAgIGluc2V0SW5saW5lU3RhcnQ6IGNhbGMobGluZVdpZHRoKS5tdWwoLTEpLmVxdWFsKCksXG4gICAgICAgICAgICAgIGJvcmRlcklubGluZVN0YXJ0OiB0YWJsZUJvcmRlclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8gRW1wdHkgcGxhY2Vob2xkZXJcbiAgICAgICAgW2AmJHtjb21wb25lbnRDbHN9LXZpcnR1YWxgXToge1xuICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXBsYWNlaG9sZGVyICR7Y29tcG9uZW50Q2xzfS1jZWxsYF06IHtcbiAgICAgICAgICAgIGJvcmRlcklubGluZUVuZDogdGFibGVCb3JkZXIsXG4gICAgICAgICAgICBib3JkZXJCb3R0b206IHRhYmxlQm9yZGVyXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGdlblZpcnR1YWxTdHlsZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0Q29sdW1uS2V5ID0gdm9pZCAwO1xuZXhwb3J0cy5nZXRDb2x1bW5Qb3MgPSBnZXRDb2x1bW5Qb3M7XG5leHBvcnRzLnNhZmVDb2x1bW5UaXRsZSA9IGV4cG9ydHMucmVuZGVyQ29sdW1uVGl0bGUgPSB2b2lkIDA7XG5jb25zdCBnZXRDb2x1bW5LZXkgPSAoY29sdW1uLCBkZWZhdWx0S2V5KSA9PiB7XG4gIGlmICgna2V5JyBpbiBjb2x1bW4gJiYgY29sdW1uLmtleSAhPT0gdW5kZWZpbmVkICYmIGNvbHVtbi5rZXkgIT09IG51bGwpIHtcbiAgICByZXR1cm4gY29sdW1uLmtleTtcbiAgfVxuICBpZiAoY29sdW1uLmRhdGFJbmRleCkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbHVtbi5kYXRhSW5kZXgpID8gY29sdW1uLmRhdGFJbmRleC5qb2luKCcuJykgOiBjb2x1bW4uZGF0YUluZGV4O1xuICB9XG4gIHJldHVybiBkZWZhdWx0S2V5O1xufTtcbmV4cG9ydHMuZ2V0Q29sdW1uS2V5ID0gZ2V0Q29sdW1uS2V5O1xuZnVuY3Rpb24gZ2V0Q29sdW1uUG9zKGluZGV4LCBwb3MpIHtcbiAgcmV0dXJuIHBvcyA/IGAke3Bvc30tJHtpbmRleH1gIDogYCR7aW5kZXh9YDtcbn1cbmNvbnN0IHJlbmRlckNvbHVtblRpdGxlID0gKHRpdGxlLCBwcm9wcykgPT4ge1xuICBpZiAodHlwZW9mIHRpdGxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRpdGxlKHByb3BzKTtcbiAgfVxuICByZXR1cm4gdGl0bGU7XG59O1xuLyoqXG4gKiBTYWZlIGdldCBjb2x1bW4gdGl0bGVcbiAqXG4gKiBTaG91bGQgZmlsdGVyIFtvYmplY3QgT2JqZWN0XVxuICpcbiAqIEBwYXJhbSB0aXRsZVxuICovXG5leHBvcnRzLnJlbmRlckNvbHVtblRpdGxlID0gcmVuZGVyQ29sdW1uVGl0bGU7XG5jb25zdCBzYWZlQ29sdW1uVGl0bGUgPSAodGl0bGUsIHByb3BzKSA9PiB7XG4gIGNvbnN0IHJlcyA9IHJlbmRlckNvbHVtblRpdGxlKHRpdGxlLCBwcm9wcyk7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocmVzKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5leHBvcnRzLnNhZmVDb2x1bW5UaXRsZSA9IHNhZmVDb2x1bW5UaXRsZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbmNvbnN0IFRhYlBhbmUgPSAoKSA9PiBudWxsO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgVGFiUGFuZS5kaXNwbGF5TmFtZSA9ICdEZXByZWNhdGVkVGFiUGFuZSc7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBUYWJQYW5lOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==