/*
 * ATTENTION: An "eval-source-map" devtool has been used.
 * This devtool is neither made for production nor for readable output files.
 * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
 * or disable the default devtool with "devtool: false".
 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
 */
/******/ (() => { // webpackBootstrap
/******/ 	var __webpack_modules__ = ({

/***/ "./node_modules/@vue/compiler-core/dist/compiler-core.esm-bundler.js":
/*!***************************************************************************!*\
  !*** ./node_modules/@vue/compiler-core/dist/compiler-core.esm-bundler.js ***!
  \***************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"BASE_TRANSITION\": () => (/* binding */ BASE_TRANSITION),\n/* harmony export */   \"CAMELIZE\": () => (/* binding */ CAMELIZE),\n/* harmony export */   \"CAPITALIZE\": () => (/* binding */ CAPITALIZE),\n/* harmony export */   \"CREATE_BLOCK\": () => (/* binding */ CREATE_BLOCK),\n/* harmony export */   \"CREATE_COMMENT\": () => (/* binding */ CREATE_COMMENT),\n/* harmony export */   \"CREATE_ELEMENT_BLOCK\": () => (/* binding */ CREATE_ELEMENT_BLOCK),\n/* harmony export */   \"CREATE_ELEMENT_VNODE\": () => (/* binding */ CREATE_ELEMENT_VNODE),\n/* harmony export */   \"CREATE_SLOTS\": () => (/* binding */ CREATE_SLOTS),\n/* harmony export */   \"CREATE_STATIC\": () => (/* binding */ CREATE_STATIC),\n/* harmony export */   \"CREATE_TEXT\": () => (/* binding */ CREATE_TEXT),\n/* harmony export */   \"CREATE_VNODE\": () => (/* binding */ CREATE_VNODE),\n/* harmony export */   \"FRAGMENT\": () => (/* binding */ FRAGMENT),\n/* harmony export */   \"GUARD_REACTIVE_PROPS\": () => (/* binding */ GUARD_REACTIVE_PROPS),\n/* harmony export */   \"IS_MEMO_SAME\": () => (/* binding */ IS_MEMO_SAME),\n/* harmony export */   \"IS_REF\": () => (/* binding */ IS_REF),\n/* harmony export */   \"KEEP_ALIVE\": () => (/* binding */ KEEP_ALIVE),\n/* harmony export */   \"MERGE_PROPS\": () => (/* binding */ MERGE_PROPS),\n/* harmony export */   \"NORMALIZE_CLASS\": () => (/* binding */ NORMALIZE_CLASS),\n/* harmony export */   \"NORMALIZE_PROPS\": () => (/* binding */ NORMALIZE_PROPS),\n/* harmony export */   \"NORMALIZE_STYLE\": () => (/* binding */ NORMALIZE_STYLE),\n/* harmony export */   \"OPEN_BLOCK\": () => (/* binding */ OPEN_BLOCK),\n/* harmony export */   \"POP_SCOPE_ID\": () => (/* binding */ POP_SCOPE_ID),\n/* harmony export */   \"PUSH_SCOPE_ID\": () => (/* binding */ PUSH_SCOPE_ID),\n/* harmony export */   \"RENDER_LIST\": () => (/* binding */ RENDER_LIST),\n/* harmony export */   \"RENDER_SLOT\": () => (/* binding */ RENDER_SLOT),\n/* harmony export */   \"RESOLVE_COMPONENT\": () => (/* binding */ RESOLVE_COMPONENT),\n/* harmony export */   \"RESOLVE_DIRECTIVE\": () => (/* binding */ RESOLVE_DIRECTIVE),\n/* harmony export */   \"RESOLVE_DYNAMIC_COMPONENT\": () => (/* binding */ RESOLVE_DYNAMIC_COMPONENT),\n/* harmony export */   \"RESOLVE_FILTER\": () => (/* binding */ RESOLVE_FILTER),\n/* harmony export */   \"SET_BLOCK_TRACKING\": () => (/* binding */ SET_BLOCK_TRACKING),\n/* harmony export */   \"SUSPENSE\": () => (/* binding */ SUSPENSE),\n/* harmony export */   \"TELEPORT\": () => (/* binding */ TELEPORT),\n/* harmony export */   \"TO_DISPLAY_STRING\": () => (/* binding */ TO_DISPLAY_STRING),\n/* harmony export */   \"TO_HANDLERS\": () => (/* binding */ TO_HANDLERS),\n/* harmony export */   \"TO_HANDLER_KEY\": () => (/* binding */ TO_HANDLER_KEY),\n/* harmony export */   \"UNREF\": () => (/* binding */ UNREF),\n/* harmony export */   \"WITH_CTX\": () => (/* binding */ WITH_CTX),\n/* harmony export */   \"WITH_DIRECTIVES\": () => (/* binding */ WITH_DIRECTIVES),\n/* harmony export */   \"WITH_MEMO\": () => (/* binding */ WITH_MEMO),\n/* harmony export */   \"advancePositionWithClone\": () => (/* binding */ advancePositionWithClone),\n/* harmony export */   \"advancePositionWithMutation\": () => (/* binding */ advancePositionWithMutation),\n/* harmony export */   \"assert\": () => (/* binding */ assert),\n/* harmony export */   \"baseCompile\": () => (/* binding */ baseCompile),\n/* harmony export */   \"baseParse\": () => (/* binding */ baseParse),\n/* harmony export */   \"buildDirectiveArgs\": () => (/* binding */ buildDirectiveArgs),\n/* harmony export */   \"buildProps\": () => (/* binding */ buildProps),\n/* harmony export */   \"buildSlots\": () => (/* binding */ buildSlots),\n/* harmony export */   \"checkCompatEnabled\": () => (/* binding */ checkCompatEnabled),\n/* harmony export */   \"createArrayExpression\": () => (/* binding */ createArrayExpression),\n/* harmony export */   \"createAssignmentExpression\": () => (/* binding */ createAssignmentExpression),\n/* harmony export */   \"createBlockStatement\": () => (/* binding */ createBlockStatement),\n/* harmony export */   \"createCacheExpression\": () => (/* binding */ createCacheExpression),\n/* harmony export */   \"createCallExpression\": () => (/* binding */ createCallExpression),\n/* harmony export */   \"createCompilerError\": () => (/* binding */ createCompilerError),\n/* harmony export */   \"createCompoundExpression\": () => (/* binding */ createCompoundExpression),\n/* harmony export */   \"createConditionalExpression\": () => (/* binding */ createConditionalExpression),\n/* harmony export */   \"createForLoopParams\": () => (/* binding */ createForLoopParams),\n/* harmony export */   \"createFunctionExpression\": () => (/* binding */ createFunctionExpression),\n/* harmony export */   \"createIfStatement\": () => (/* binding */ createIfStatement),\n/* harmony export */   \"createInterpolation\": () => (/* binding */ createInterpolation),\n/* harmony export */   \"createObjectExpression\": () => (/* binding */ createObjectExpression),\n/* harmony export */   \"createObjectProperty\": () => (/* binding */ createObjectProperty),\n/* harmony export */   \"createReturnStatement\": () => (/* binding */ createReturnStatement),\n/* harmony export */   \"createRoot\": () => (/* binding */ createRoot),\n/* harmony export */   \"createSequenceExpression\": () => (/* binding */ createSequenceExpression),\n/* harmony export */   \"createSimpleExpression\": () => (/* binding */ createSimpleExpression),\n/* harmony export */   \"createStructuralDirectiveTransform\": () => (/* binding */ createStructuralDirectiveTransform),\n/* harmony export */   \"createTemplateLiteral\": () => (/* binding */ createTemplateLiteral),\n/* harmony export */   \"createTransformContext\": () => (/* binding */ createTransformContext),\n/* harmony export */   \"createVNodeCall\": () => (/* binding */ createVNodeCall),\n/* harmony export */   \"extractIdentifiers\": () => (/* binding */ extractIdentifiers),\n/* harmony export */   \"findDir\": () => (/* binding */ findDir),\n/* harmony export */   \"findProp\": () => (/* binding */ findProp),\n/* harmony export */   \"generate\": () => (/* binding */ generate),\n/* harmony export */   \"generateCodeFrame\": () => (/* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_0__.generateCodeFrame),\n/* harmony export */   \"getBaseTransformPreset\": () => (/* binding */ getBaseTransformPreset),\n/* harmony export */   \"getConstantType\": () => (/* binding */ getConstantType),\n/* harmony export */   \"getInnerRange\": () => (/* binding */ getInnerRange),\n/* harmony export */   \"getMemoedVNodeCall\": () => (/* binding */ getMemoedVNodeCall),\n/* harmony export */   \"getVNodeBlockHelper\": () => (/* binding */ getVNodeBlockHelper),\n/* harmony export */   \"getVNodeHelper\": () => (/* binding */ getVNodeHelper),\n/* harmony export */   \"hasDynamicKeyVBind\": () => (/* binding */ hasDynamicKeyVBind),\n/* harmony export */   \"hasScopeRef\": () => (/* binding */ hasScopeRef),\n/* harmony export */   \"helperNameMap\": () => (/* binding */ helperNameMap),\n/* harmony export */   \"injectProp\": () => (/* binding */ injectProp),\n/* harmony export */   \"isBuiltInType\": () => (/* binding */ isBuiltInType),\n/* harmony export */   \"isCoreComponent\": () => (/* binding */ isCoreComponent),\n/* harmony export */   \"isFunctionType\": () => (/* binding */ isFunctionType),\n/* harmony export */   \"isInDestructureAssignment\": () => (/* binding */ isInDestructureAssignment),\n/* harmony export */   \"isMemberExpression\": () => (/* binding */ isMemberExpression),\n/* harmony export */   \"isMemberExpressionBrowser\": () => (/* binding */ isMemberExpressionBrowser),\n/* harmony export */   \"isMemberExpressionNode\": () => (/* binding */ isMemberExpressionNode),\n/* harmony export */   \"isReferencedIdentifier\": () => (/* binding */ isReferencedIdentifier),\n/* harmony export */   \"isSimpleIdentifier\": () => (/* binding */ isSimpleIdentifier),\n/* harmony export */   \"isSlotOutlet\": () => (/* binding */ isSlotOutlet),\n/* harmony export */   \"isStaticArgOf\": () => (/* binding */ isStaticArgOf),\n/* harmony export */   \"isStaticExp\": () => (/* binding */ isStaticExp),\n/* harmony export */   \"isStaticProperty\": () => (/* binding */ isStaticProperty),\n/* harmony export */   \"isStaticPropertyKey\": () => (/* binding */ isStaticPropertyKey),\n/* harmony export */   \"isTemplateNode\": () => (/* binding */ isTemplateNode),\n/* harmony export */   \"isText\": () => (/* binding */ isText$1),\n/* harmony export */   \"isVSlot\": () => (/* binding */ isVSlot),\n/* harmony export */   \"locStub\": () => (/* binding */ locStub),\n/* harmony export */   \"makeBlock\": () => (/* binding */ makeBlock),\n/* harmony export */   \"noopDirectiveTransform\": () => (/* binding */ noopDirectiveTransform),\n/* harmony export */   \"processExpression\": () => (/* binding */ processExpression),\n/* harmony export */   \"processFor\": () => (/* binding */ processFor),\n/* harmony export */   \"processIf\": () => (/* binding */ processIf),\n/* harmony export */   \"processSlotOutlet\": () => (/* binding */ processSlotOutlet),\n/* harmony export */   \"registerRuntimeHelpers\": () => (/* binding */ registerRuntimeHelpers),\n/* harmony export */   \"resolveComponentType\": () => (/* binding */ resolveComponentType),\n/* harmony export */   \"stringifyExpression\": () => (/* binding */ stringifyExpression),\n/* harmony export */   \"toValidAssetId\": () => (/* binding */ toValidAssetId),\n/* harmony export */   \"trackSlotScopes\": () => (/* binding */ trackSlotScopes),\n/* harmony export */   \"trackVForSlotScopes\": () => (/* binding */ trackVForSlotScopes),\n/* harmony export */   \"transform\": () => (/* binding */ transform),\n/* harmony export */   \"transformBind\": () => (/* binding */ transformBind),\n/* harmony export */   \"transformElement\": () => (/* binding */ transformElement),\n/* harmony export */   \"transformExpression\": () => (/* binding */ transformExpression),\n/* harmony export */   \"transformModel\": () => (/* binding */ transformModel),\n/* harmony export */   \"transformOn\": () => (/* binding */ transformOn),\n/* harmony export */   \"traverseNode\": () => (/* binding */ traverseNode),\n/* harmony export */   \"walkBlockDeclarations\": () => (/* binding */ walkBlockDeclarations),\n/* harmony export */   \"walkFunctionParams\": () => (/* binding */ walkFunctionParams),\n/* harmony export */   \"walkIdentifiers\": () => (/* binding */ walkIdentifiers),\n/* harmony export */   \"warnDeprecation\": () => (/* binding */ warnDeprecation)\n/* harmony export */ });\n/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/shared */ \"./node_modules/@vue/shared/dist/shared.esm-bundler.js\");\n\n\n\nfunction defaultOnError(error) {\n    throw error;\n}\nfunction defaultOnWarn(msg) {\n    ( true) && console.warn(`[Vue warn] ${msg.message}`);\n}\nfunction createCompilerError(code, loc, messages, additionalMessage) {\n    const msg =  true\n        ? (messages || errorMessages)[code] + (additionalMessage || ``)\n        : 0;\n    const error = new SyntaxError(String(msg));\n    error.code = code;\n    error.loc = loc;\n    return error;\n}\nconst errorMessages = {\n    // parse errors\n    [0 /* ErrorCodes.ABRUPT_CLOSING_OF_EMPTY_COMMENT */]: 'Illegal comment.',\n    [1 /* ErrorCodes.CDATA_IN_HTML_CONTENT */]: 'CDATA section is allowed only in XML context.',\n    [2 /* ErrorCodes.DUPLICATE_ATTRIBUTE */]: 'Duplicate attribute.',\n    [3 /* ErrorCodes.END_TAG_WITH_ATTRIBUTES */]: 'End tag cannot have attributes.',\n    [4 /* ErrorCodes.END_TAG_WITH_TRAILING_SOLIDUS */]: \"Illegal '/' in tags.\",\n    [5 /* ErrorCodes.EOF_BEFORE_TAG_NAME */]: 'Unexpected EOF in tag.',\n    [6 /* ErrorCodes.EOF_IN_CDATA */]: 'Unexpected EOF in CDATA section.',\n    [7 /* ErrorCodes.EOF_IN_COMMENT */]: 'Unexpected EOF in comment.',\n    [8 /* ErrorCodes.EOF_IN_SCRIPT_HTML_COMMENT_LIKE_TEXT */]: 'Unexpected EOF in script.',\n    [9 /* ErrorCodes.EOF_IN_TAG */]: 'Unexpected EOF in tag.',\n    [10 /* ErrorCodes.INCORRECTLY_CLOSED_COMMENT */]: 'Incorrectly closed comment.',\n    [11 /* ErrorCodes.INCORRECTLY_OPENED_COMMENT */]: 'Incorrectly opened comment.',\n    [12 /* ErrorCodes.INVALID_FIRST_CHARACTER_OF_TAG_NAME */]: \"Illegal tag name. Use '&lt;' to print '<'.\",\n    [13 /* ErrorCodes.MISSING_ATTRIBUTE_VALUE */]: 'Attribute value was expected.',\n    [14 /* ErrorCodes.MISSING_END_TAG_NAME */]: 'End tag name was expected.',\n    [15 /* ErrorCodes.MISSING_WHITESPACE_BETWEEN_ATTRIBUTES */]: 'Whitespace was expected.',\n    [16 /* ErrorCodes.NESTED_COMMENT */]: \"Unexpected '<!--' in comment.\",\n    [17 /* ErrorCodes.UNEXPECTED_CHARACTER_IN_ATTRIBUTE_NAME */]: 'Attribute name cannot contain U+0022 (\"), U+0027 (\\'), and U+003C (<).',\n    [18 /* ErrorCodes.UNEXPECTED_CHARACTER_IN_UNQUOTED_ATTRIBUTE_VALUE */]: 'Unquoted attribute value cannot contain U+0022 (\"), U+0027 (\\'), U+003C (<), U+003D (=), and U+0060 (`).',\n    [19 /* ErrorCodes.UNEXPECTED_EQUALS_SIGN_BEFORE_ATTRIBUTE_NAME */]: \"Attribute name cannot start with '='.\",\n    [21 /* ErrorCodes.UNEXPECTED_QUESTION_MARK_INSTEAD_OF_TAG_NAME */]: \"'<?' is allowed only in XML context.\",\n    [20 /* ErrorCodes.UNEXPECTED_NULL_CHARACTER */]: `Unexpected null character.`,\n    [22 /* ErrorCodes.UNEXPECTED_SOLIDUS_IN_TAG */]: \"Illegal '/' in tags.\",\n    // Vue-specific parse errors\n    [23 /* ErrorCodes.X_INVALID_END_TAG */]: 'Invalid end tag.',\n    [24 /* ErrorCodes.X_MISSING_END_TAG */]: 'Element is missing end tag.',\n    [25 /* ErrorCodes.X_MISSING_INTERPOLATION_END */]: 'Interpolation end sign was not found.',\n    [27 /* ErrorCodes.X_MISSING_DYNAMIC_DIRECTIVE_ARGUMENT_END */]: 'End bracket for dynamic directive argument was not found. ' +\n        'Note that dynamic directive argument cannot contain spaces.',\n    [26 /* ErrorCodes.X_MISSING_DIRECTIVE_NAME */]: 'Legal directive name was expected.',\n    // transform errors\n    [28 /* ErrorCodes.X_V_IF_NO_EXPRESSION */]: `v-if/v-else-if is missing expression.`,\n    [29 /* ErrorCodes.X_V_IF_SAME_KEY */]: `v-if/else branches must use unique keys.`,\n    [30 /* ErrorCodes.X_V_ELSE_NO_ADJACENT_IF */]: `v-else/v-else-if has no adjacent v-if or v-else-if.`,\n    [31 /* ErrorCodes.X_V_FOR_NO_EXPRESSION */]: `v-for is missing expression.`,\n    [32 /* ErrorCodes.X_V_FOR_MALFORMED_EXPRESSION */]: `v-for has invalid expression.`,\n    [33 /* ErrorCodes.X_V_FOR_TEMPLATE_KEY_PLACEMENT */]: `<template v-for> key should be placed on the <template> tag.`,\n    [34 /* ErrorCodes.X_V_BIND_NO_EXPRESSION */]: `v-bind is missing expression.`,\n    [35 /* ErrorCodes.X_V_ON_NO_EXPRESSION */]: `v-on is missing expression.`,\n    [36 /* ErrorCodes.X_V_SLOT_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET */]: `Unexpected custom directive on <slot> outlet.`,\n    [37 /* ErrorCodes.X_V_SLOT_MIXED_SLOT_USAGE */]: `Mixed v-slot usage on both the component and nested <template>. ` +\n        `When there are multiple named slots, all slots should use <template> ` +\n        `syntax to avoid scope ambiguity.`,\n    [38 /* ErrorCodes.X_V_SLOT_DUPLICATE_SLOT_NAMES */]: `Duplicate slot names found. `,\n    [39 /* ErrorCodes.X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN */]: `Extraneous children found when component already has explicitly named ` +\n        `default slot. These children will be ignored.`,\n    [40 /* ErrorCodes.X_V_SLOT_MISPLACED */]: `v-slot can only be used on components or <template> tags.`,\n    [41 /* ErrorCodes.X_V_MODEL_NO_EXPRESSION */]: `v-model is missing expression.`,\n    [42 /* ErrorCodes.X_V_MODEL_MALFORMED_EXPRESSION */]: `v-model value must be a valid JavaScript member expression.`,\n    [43 /* ErrorCodes.X_V_MODEL_ON_SCOPE_VARIABLE */]: `v-model cannot be used on v-for or v-slot scope variables because they are not writable.`,\n    [44 /* ErrorCodes.X_V_MODEL_ON_PROPS */]: `v-model cannot be used on a prop, because local prop bindings are not writable.\\nUse a v-bind binding combined with a v-on listener that emits update:x event instead.`,\n    [45 /* ErrorCodes.X_INVALID_EXPRESSION */]: `Error parsing JavaScript expression: `,\n    [46 /* ErrorCodes.X_KEEP_ALIVE_INVALID_CHILDREN */]: `<KeepAlive> expects exactly one child component.`,\n    // generic errors\n    [47 /* ErrorCodes.X_PREFIX_ID_NOT_SUPPORTED */]: `\"prefixIdentifiers\" option is not supported in this build of compiler.`,\n    [48 /* ErrorCodes.X_MODULE_MODE_NOT_SUPPORTED */]: `ES module mode is not supported in this build of compiler.`,\n    [49 /* ErrorCodes.X_CACHE_HANDLER_NOT_SUPPORTED */]: `\"cacheHandlers\" option is only supported when the \"prefixIdentifiers\" option is enabled.`,\n    [50 /* ErrorCodes.X_SCOPE_ID_NOT_SUPPORTED */]: `\"scopeId\" option is only supported in module mode.`,\n    // just to fulfill types\n    [51 /* ErrorCodes.__EXTEND_POINT__ */]: ``\n};\n\nconst FRAGMENT = Symbol(( true) ? `Fragment` : 0);\nconst TELEPORT = Symbol(( true) ? `Teleport` : 0);\nconst SUSPENSE = Symbol(( true) ? `Suspense` : 0);\nconst KEEP_ALIVE = Symbol(( true) ? `KeepAlive` : 0);\nconst BASE_TRANSITION = Symbol(( true) ? `BaseTransition` : 0);\nconst OPEN_BLOCK = Symbol(( true) ? `openBlock` : 0);\nconst CREATE_BLOCK = Symbol(( true) ? `createBlock` : 0);\nconst CREATE_ELEMENT_BLOCK = Symbol(( true) ? `createElementBlock` : 0);\nconst CREATE_VNODE = Symbol(( true) ? `createVNode` : 0);\nconst CREATE_ELEMENT_VNODE = Symbol(( true) ? `createElementVNode` : 0);\nconst CREATE_COMMENT = Symbol(( true) ? `createCommentVNode` : 0);\nconst CREATE_TEXT = Symbol(( true) ? `createTextVNode` : 0);\nconst CREATE_STATIC = Symbol(( true) ? `createStaticVNode` : 0);\nconst RESOLVE_COMPONENT = Symbol(( true) ? `resolveComponent` : 0);\nconst RESOLVE_DYNAMIC_COMPONENT = Symbol(( true) ? `resolveDynamicComponent` : 0);\nconst RESOLVE_DIRECTIVE = Symbol(( true) ? `resolveDirective` : 0);\nconst RESOLVE_FILTER = Symbol(( true) ? `resolveFilter` : 0);\nconst WITH_DIRECTIVES = Symbol(( true) ? `withDirectives` : 0);\nconst RENDER_LIST = Symbol(( true) ? `renderList` : 0);\nconst RENDER_SLOT = Symbol(( true) ? `renderSlot` : 0);\nconst CREATE_SLOTS = Symbol(( true) ? `createSlots` : 0);\nconst TO_DISPLAY_STRING = Symbol(( true) ? `toDisplayString` : 0);\nconst MERGE_PROPS = Symbol(( true) ? `mergeProps` : 0);\nconst NORMALIZE_CLASS = Symbol(( true) ? `normalizeClass` : 0);\nconst NORMALIZE_STYLE = Symbol(( true) ? `normalizeStyle` : 0);\nconst NORMALIZE_PROPS = Symbol(( true) ? `normalizeProps` : 0);\nconst GUARD_REACTIVE_PROPS = Symbol(( true) ? `guardReactiveProps` : 0);\nconst TO_HANDLERS = Symbol(( true) ? `toHandlers` : 0);\nconst CAMELIZE = Symbol(( true) ? `camelize` : 0);\nconst CAPITALIZE = Symbol(( true) ? `capitalize` : 0);\nconst TO_HANDLER_KEY = Symbol(( true) ? `toHandlerKey` : 0);\nconst SET_BLOCK_TRACKING = Symbol(( true) ? `setBlockTracking` : 0);\nconst PUSH_SCOPE_ID = Symbol(( true) ? `pushScopeId` : 0);\nconst POP_SCOPE_ID = Symbol(( true) ? `popScopeId` : 0);\nconst WITH_CTX = Symbol(( true) ? `withCtx` : 0);\nconst UNREF = Symbol(( true) ? `unref` : 0);\nconst IS_REF = Symbol(( true) ? `isRef` : 0);\nconst WITH_MEMO = Symbol(( true) ? `withMemo` : 0);\nconst IS_MEMO_SAME = Symbol(( true) ? `isMemoSame` : 0);\n// Name mapping for runtime helpers that need to be imported from 'vue' in\n// generated code. Make sure these are correctly exported in the runtime!\nconst helperNameMap = {\n    [FRAGMENT]: `Fragment`,\n    [TELEPORT]: `Teleport`,\n    [SUSPENSE]: `Suspense`,\n    [KEEP_ALIVE]: `KeepAlive`,\n    [BASE_TRANSITION]: `BaseTransition`,\n    [OPEN_BLOCK]: `openBlock`,\n    [CREATE_BLOCK]: `createBlock`,\n    [CREATE_ELEMENT_BLOCK]: `createElementBlock`,\n    [CREATE_VNODE]: `createVNode`,\n    [CREATE_ELEMENT_VNODE]: `createElementVNode`,\n    [CREATE_COMMENT]: `createCommentVNode`,\n    [CREATE_TEXT]: `createTextVNode`,\n    [CREATE_STATIC]: `createStaticVNode`,\n    [RESOLVE_COMPONENT]: `resolveComponent`,\n    [RESOLVE_DYNAMIC_COMPONENT]: `resolveDynamicComponent`,\n    [RESOLVE_DIRECTIVE]: `resolveDirective`,\n    [RESOLVE_FILTER]: `resolveFilter`,\n    [WITH_DIRECTIVES]: `withDirectives`,\n    [RENDER_LIST]: `renderList`,\n    [RENDER_SLOT]: `renderSlot`,\n    [CREATE_SLOTS]: `createSlots`,\n    [TO_DISPLAY_STRING]: `toDisplayString`,\n    [MERGE_PROPS]: `mergeProps`,\n    [NORMALIZE_CLASS]: `normalizeClass`,\n    [NORMALIZE_STYLE]: `normalizeStyle`,\n    [NORMALIZE_PROPS]: `normalizeProps`,\n    [GUARD_REACTIVE_PROPS]: `guardReactiveProps`,\n    [TO_HANDLERS]: `toHandlers`,\n    [CAMELIZE]: `camelize`,\n    [CAPITALIZE]: `capitalize`,\n    [TO_HANDLER_KEY]: `toHandlerKey`,\n    [SET_BLOCK_TRACKING]: `setBlockTracking`,\n    [PUSH_SCOPE_ID]: `pushScopeId`,\n    [POP_SCOPE_ID]: `popScopeId`,\n    [WITH_CTX]: `withCtx`,\n    [UNREF]: `unref`,\n    [IS_REF]: `isRef`,\n    [WITH_MEMO]: `withMemo`,\n    [IS_MEMO_SAME]: `isMemoSame`\n};\nfunction registerRuntimeHelpers(helpers) {\n    Object.getOwnPropertySymbols(helpers).forEach(s => {\n        helperNameMap[s] = helpers[s];\n    });\n}\n\n// AST Utilities ---------------------------------------------------------------\n// Some expressions, e.g. sequence and conditional expressions, are never\n// associated with template nodes, so their source locations are just a stub.\n// Container types like CompoundExpression also don't need a real location.\nconst locStub = {\n    source: '',\n    start: { line: 1, column: 1, offset: 0 },\n    end: { line: 1, column: 1, offset: 0 }\n};\nfunction createRoot(children, loc = locStub) {\n    return {\n        type: 0 /* NodeTypes.ROOT */,\n        children,\n        helpers: new Set(),\n        components: [],\n        directives: [],\n        hoists: [],\n        imports: [],\n        cached: 0,\n        temps: 0,\n        codegenNode: undefined,\n        loc\n    };\n}\nfunction createVNodeCall(context, tag, props, children, patchFlag, dynamicProps, directives, isBlock = false, disableTracking = false, isComponent = false, loc = locStub) {\n    if (context) {\n        if (isBlock) {\n            context.helper(OPEN_BLOCK);\n            context.helper(getVNodeBlockHelper(context.inSSR, isComponent));\n        }\n        else {\n            context.helper(getVNodeHelper(context.inSSR, isComponent));\n        }\n        if (directives) {\n            context.helper(WITH_DIRECTIVES);\n        }\n    }\n    return {\n        type: 13 /* NodeTypes.VNODE_CALL */,\n        tag,\n        props,\n        children,\n        patchFlag,\n        dynamicProps,\n        directives,\n        isBlock,\n        disableTracking,\n        isComponent,\n        loc\n    };\n}\nfunction createArrayExpression(elements, loc = locStub) {\n    return {\n        type: 17 /* NodeTypes.JS_ARRAY_EXPRESSION */,\n        loc,\n        elements\n    };\n}\nfunction createObjectExpression(properties, loc = locStub) {\n    return {\n        type: 15 /* NodeTypes.JS_OBJECT_EXPRESSION */,\n        loc,\n        properties\n    };\n}\nfunction createObjectProperty(key, value) {\n    return {\n        type: 16 /* NodeTypes.JS_PROPERTY */,\n        loc: locStub,\n        key: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(key) ? createSimpleExpression(key, true) : key,\n        value\n    };\n}\nfunction createSimpleExpression(content, isStatic = false, loc = locStub, constType = 0 /* ConstantTypes.NOT_CONSTANT */) {\n    return {\n        type: 4 /* NodeTypes.SIMPLE_EXPRESSION */,\n        loc,\n        content,\n        isStatic,\n        constType: isStatic ? 3 /* ConstantTypes.CAN_STRINGIFY */ : constType\n    };\n}\nfunction createInterpolation(content, loc) {\n    return {\n        type: 5 /* NodeTypes.INTERPOLATION */,\n        loc,\n        content: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(content)\n            ? createSimpleExpression(content, false, loc)\n            : content\n    };\n}\nfunction createCompoundExpression(children, loc = locStub) {\n    return {\n        type: 8 /* NodeTypes.COMPOUND_EXPRESSION */,\n        loc,\n        children\n    };\n}\nfunction createCallExpression(callee, args = [], loc = locStub) {\n    return {\n        type: 14 /* NodeTypes.JS_CALL_EXPRESSION */,\n        loc,\n        callee,\n        arguments: args\n    };\n}\nfunction createFunctionExpression(params, returns = undefined, newline = false, isSlot = false, loc = locStub) {\n    return {\n        type: 18 /* NodeTypes.JS_FUNCTION_EXPRESSION */,\n        params,\n        returns,\n        newline,\n        isSlot,\n        loc\n    };\n}\nfunction createConditionalExpression(test, consequent, alternate, newline = true) {\n    return {\n        type: 19 /* NodeTypes.JS_CONDITIONAL_EXPRESSION */,\n        test,\n        consequent,\n        alternate,\n        newline,\n        loc: locStub\n    };\n}\nfunction createCacheExpression(index, value, isVNode = false) {\n    return {\n        type: 20 /* NodeTypes.JS_CACHE_EXPRESSION */,\n        index,\n        value,\n        isVNode,\n        loc: locStub\n    };\n}\nfunction createBlockStatement(body) {\n    return {\n        type: 21 /* NodeTypes.JS_BLOCK_STATEMENT */,\n        body,\n        loc: locStub\n    };\n}\nfunction createTemplateLiteral(elements) {\n    return {\n        type: 22 /* NodeTypes.JS_TEMPLATE_LITERAL */,\n        elements,\n        loc: locStub\n    };\n}\nfunction createIfStatement(test, consequent, alternate) {\n    return {\n        type: 23 /* NodeTypes.JS_IF_STATEMENT */,\n        test,\n        consequent,\n        alternate,\n        loc: locStub\n    };\n}\nfunction createAssignmentExpression(left, right) {\n    return {\n        type: 24 /* NodeTypes.JS_ASSIGNMENT_EXPRESSION */,\n        left,\n        right,\n        loc: locStub\n    };\n}\nfunction createSequenceExpression(expressions) {\n    return {\n        type: 25 /* NodeTypes.JS_SEQUENCE_EXPRESSION */,\n        expressions,\n        loc: locStub\n    };\n}\nfunction createReturnStatement(returns) {\n    return {\n        type: 26 /* NodeTypes.JS_RETURN_STATEMENT */,\n        returns,\n        loc: locStub\n    };\n}\n\nconst isStaticExp = (p) => p.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ && p.isStatic;\nconst isBuiltInType = (tag, expected) => tag === expected || tag === (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hyphenate)(expected);\nfunction isCoreComponent(tag) {\n    if (isBuiltInType(tag, 'Teleport')) {\n        return TELEPORT;\n    }\n    else if (isBuiltInType(tag, 'Suspense')) {\n        return SUSPENSE;\n    }\n    else if (isBuiltInType(tag, 'KeepAlive')) {\n        return KEEP_ALIVE;\n    }\n    else if (isBuiltInType(tag, 'BaseTransition')) {\n        return BASE_TRANSITION;\n    }\n}\nconst nonIdentifierRE = /^\\d|[^\\$\\w]/;\nconst isSimpleIdentifier = (name) => !nonIdentifierRE.test(name);\nconst validFirstIdentCharRE = /[A-Za-z_$\\xA0-\\uFFFF]/;\nconst validIdentCharRE = /[\\.\\?\\w$\\xA0-\\uFFFF]/;\nconst whitespaceRE = /\\s+[.[]\\s*|\\s*[.[]\\s+/g;\n/**\n * Simple lexer to check if an expression is a member expression. This is\n * lax and only checks validity at the root level (i.e. does not validate exps\n * inside square brackets), but it's ok since these are only used on template\n * expressions and false positives are invalid expressions in the first place.\n */\nconst isMemberExpressionBrowser = (path) => {\n    // remove whitespaces around . or [ first\n    path = path.trim().replace(whitespaceRE, s => s.trim());\n    let state = 0 /* MemberExpLexState.inMemberExp */;\n    let stateStack = [];\n    let currentOpenBracketCount = 0;\n    let currentOpenParensCount = 0;\n    let currentStringType = null;\n    for (let i = 0; i < path.length; i++) {\n        const char = path.charAt(i);\n        switch (state) {\n            case 0 /* MemberExpLexState.inMemberExp */:\n                if (char === '[') {\n                    stateStack.push(state);\n                    state = 1 /* MemberExpLexState.inBrackets */;\n                    currentOpenBracketCount++;\n                }\n                else if (char === '(') {\n                    stateStack.push(state);\n                    state = 2 /* MemberExpLexState.inParens */;\n                    currentOpenParensCount++;\n                }\n                else if (!(i === 0 ? validFirstIdentCharRE : validIdentCharRE).test(char)) {\n                    return false;\n                }\n                break;\n            case 1 /* MemberExpLexState.inBrackets */:\n                if (char === `'` || char === `\"` || char === '`') {\n                    stateStack.push(state);\n                    state = 3 /* MemberExpLexState.inString */;\n                    currentStringType = char;\n                }\n                else if (char === `[`) {\n                    currentOpenBracketCount++;\n                }\n                else if (char === `]`) {\n                    if (!--currentOpenBracketCount) {\n                        state = stateStack.pop();\n                    }\n                }\n                break;\n            case 2 /* MemberExpLexState.inParens */:\n                if (char === `'` || char === `\"` || char === '`') {\n                    stateStack.push(state);\n                    state = 3 /* MemberExpLexState.inString */;\n                    currentStringType = char;\n                }\n                else if (char === `(`) {\n                    currentOpenParensCount++;\n                }\n                else if (char === `)`) {\n                    // if the exp ends as a call then it should not be considered valid\n                    if (i === path.length - 1) {\n                        return false;\n                    }\n                    if (!--currentOpenParensCount) {\n                        state = stateStack.pop();\n                    }\n                }\n                break;\n            case 3 /* MemberExpLexState.inString */:\n                if (char === currentStringType) {\n                    state = stateStack.pop();\n                    currentStringType = null;\n                }\n                break;\n        }\n    }\n    return !currentOpenBracketCount && !currentOpenParensCount;\n};\nconst isMemberExpressionNode = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NOOP\n    ;\nconst isMemberExpression = isMemberExpressionBrowser\n    ;\nfunction getInnerRange(loc, offset, length) {\n    const source = loc.source.slice(offset, offset + length);\n    const newLoc = {\n        source,\n        start: advancePositionWithClone(loc.start, loc.source, offset),\n        end: loc.end\n    };\n    if (length != null) {\n        newLoc.end = advancePositionWithClone(loc.start, loc.source, offset + length);\n    }\n    return newLoc;\n}\nfunction advancePositionWithClone(pos, source, numberOfCharacters = source.length) {\n    return advancePositionWithMutation((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, pos), source, numberOfCharacters);\n}\n// advance by mutation without cloning (for performance reasons), since this\n// gets called a lot in the parser\nfunction advancePositionWithMutation(pos, source, numberOfCharacters = source.length) {\n    let linesCount = 0;\n    let lastNewLinePos = -1;\n    for (let i = 0; i < numberOfCharacters; i++) {\n        if (source.charCodeAt(i) === 10 /* newline char code */) {\n            linesCount++;\n            lastNewLinePos = i;\n        }\n    }\n    pos.offset += numberOfCharacters;\n    pos.line += linesCount;\n    pos.column =\n        lastNewLinePos === -1\n            ? pos.column + numberOfCharacters\n            : numberOfCharacters - lastNewLinePos;\n    return pos;\n}\nfunction assert(condition, msg) {\n    /* istanbul ignore if */\n    if (!condition) {\n        throw new Error(msg || `unexpected compiler condition`);\n    }\n}\nfunction findDir(node, name, allowEmpty = false) {\n    for (let i = 0; i < node.props.length; i++) {\n        const p = node.props[i];\n        if (p.type === 7 /* NodeTypes.DIRECTIVE */ &&\n            (allowEmpty || p.exp) &&\n            ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(name) ? p.name === name : name.test(p.name))) {\n            return p;\n        }\n    }\n}\nfunction findProp(node, name, dynamicOnly = false, allowEmpty = false) {\n    for (let i = 0; i < node.props.length; i++) {\n        const p = node.props[i];\n        if (p.type === 6 /* NodeTypes.ATTRIBUTE */) {\n            if (dynamicOnly)\n                continue;\n            if (p.name === name && (p.value || allowEmpty)) {\n                return p;\n            }\n        }\n        else if (p.name === 'bind' &&\n            (p.exp || allowEmpty) &&\n            isStaticArgOf(p.arg, name)) {\n            return p;\n        }\n    }\n}\nfunction isStaticArgOf(arg, name) {\n    return !!(arg && isStaticExp(arg) && arg.content === name);\n}\nfunction hasDynamicKeyVBind(node) {\n    return node.props.some(p => p.type === 7 /* NodeTypes.DIRECTIVE */ &&\n        p.name === 'bind' &&\n        (!p.arg || // v-bind=\"obj\"\n            p.arg.type !== 4 /* NodeTypes.SIMPLE_EXPRESSION */ || // v-bind:[_ctx.foo]\n            !p.arg.isStatic) // v-bind:[foo]\n    );\n}\nfunction isText$1(node) {\n    return node.type === 5 /* NodeTypes.INTERPOLATION */ || node.type === 2 /* NodeTypes.TEXT */;\n}\nfunction isVSlot(p) {\n    return p.type === 7 /* NodeTypes.DIRECTIVE */ && p.name === 'slot';\n}\nfunction isTemplateNode(node) {\n    return (node.type === 1 /* NodeTypes.ELEMENT */ && node.tagType === 3 /* ElementTypes.TEMPLATE */);\n}\nfunction isSlotOutlet(node) {\n    return node.type === 1 /* NodeTypes.ELEMENT */ && node.tagType === 2 /* ElementTypes.SLOT */;\n}\nfunction getVNodeHelper(ssr, isComponent) {\n    return ssr || isComponent ? CREATE_VNODE : CREATE_ELEMENT_VNODE;\n}\nfunction getVNodeBlockHelper(ssr, isComponent) {\n    return ssr || isComponent ? CREATE_BLOCK : CREATE_ELEMENT_BLOCK;\n}\nconst propsHelperSet = new Set([NORMALIZE_PROPS, GUARD_REACTIVE_PROPS]);\nfunction getUnnormalizedProps(props, callPath = []) {\n    if (props &&\n        !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(props) &&\n        props.type === 14 /* NodeTypes.JS_CALL_EXPRESSION */) {\n        const callee = props.callee;\n        if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(callee) && propsHelperSet.has(callee)) {\n            return getUnnormalizedProps(props.arguments[0], callPath.concat(props));\n        }\n    }\n    return [props, callPath];\n}\nfunction injectProp(node, prop, context) {\n    let propsWithInjection;\n    /**\n     * 1. mergeProps(...)\n     * 2. toHandlers(...)\n     * 3. normalizeProps(...)\n     * 4. normalizeProps(guardReactiveProps(...))\n     *\n     * we need to get the real props before normalization\n     */\n    let props = node.type === 13 /* NodeTypes.VNODE_CALL */ ? node.props : node.arguments[2];\n    let callPath = [];\n    let parentCall;\n    if (props &&\n        !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(props) &&\n        props.type === 14 /* NodeTypes.JS_CALL_EXPRESSION */) {\n        const ret = getUnnormalizedProps(props);\n        props = ret[0];\n        callPath = ret[1];\n        parentCall = callPath[callPath.length - 1];\n    }\n    if (props == null || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(props)) {\n        propsWithInjection = createObjectExpression([prop]);\n    }\n    else if (props.type === 14 /* NodeTypes.JS_CALL_EXPRESSION */) {\n        // merged props... add ours\n        // only inject key to object literal if it's the first argument so that\n        // if doesn't override user provided keys\n        const first = props.arguments[0];\n        if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(first) && first.type === 15 /* NodeTypes.JS_OBJECT_EXPRESSION */) {\n            // #6631\n            if (!hasProp(prop, first)) {\n                first.properties.unshift(prop);\n            }\n        }\n        else {\n            if (props.callee === TO_HANDLERS) {\n                // #2366\n                propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [\n                    createObjectExpression([prop]),\n                    props\n                ]);\n            }\n            else {\n                props.arguments.unshift(createObjectExpression([prop]));\n            }\n        }\n        !propsWithInjection && (propsWithInjection = props);\n    }\n    else if (props.type === 15 /* NodeTypes.JS_OBJECT_EXPRESSION */) {\n        if (!hasProp(prop, props)) {\n            props.properties.unshift(prop);\n        }\n        propsWithInjection = props;\n    }\n    else {\n        // single v-bind with expression, return a merged replacement\n        propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [\n            createObjectExpression([prop]),\n            props\n        ]);\n        // in the case of nested helper call, e.g. `normalizeProps(guardReactiveProps(props))`,\n        // it will be rewritten as `normalizeProps(mergeProps({ key: 0 }, props))`,\n        // the `guardReactiveProps` will no longer be needed\n        if (parentCall && parentCall.callee === GUARD_REACTIVE_PROPS) {\n            parentCall = callPath[callPath.length - 2];\n        }\n    }\n    if (node.type === 13 /* NodeTypes.VNODE_CALL */) {\n        if (parentCall) {\n            parentCall.arguments[0] = propsWithInjection;\n        }\n        else {\n            node.props = propsWithInjection;\n        }\n    }\n    else {\n        if (parentCall) {\n            parentCall.arguments[0] = propsWithInjection;\n        }\n        else {\n            node.arguments[2] = propsWithInjection;\n        }\n    }\n}\n// check existing key to avoid overriding user provided keys\nfunction hasProp(prop, props) {\n    let result = false;\n    if (prop.key.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */) {\n        const propKeyName = prop.key.content;\n        result = props.properties.some(p => p.key.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ &&\n            p.key.content === propKeyName);\n    }\n    return result;\n}\nfunction toValidAssetId(name, type) {\n    // see issue#4422, we need adding identifier on validAssetId if variable `name` has specific character\n    return `_${type}_${name.replace(/[^\\w]/g, (searchValue, replaceValue) => {\n        return searchValue === '-' ? '_' : name.charCodeAt(replaceValue).toString();\n    })}`;\n}\n// Check if a node contains expressions that reference current context scope ids\nfunction hasScopeRef(node, ids) {\n    if (!node || Object.keys(ids).length === 0) {\n        return false;\n    }\n    switch (node.type) {\n        case 1 /* NodeTypes.ELEMENT */:\n            for (let i = 0; i < node.props.length; i++) {\n                const p = node.props[i];\n                if (p.type === 7 /* NodeTypes.DIRECTIVE */ &&\n                    (hasScopeRef(p.arg, ids) || hasScopeRef(p.exp, ids))) {\n                    return true;\n                }\n            }\n            return node.children.some(c => hasScopeRef(c, ids));\n        case 11 /* NodeTypes.FOR */:\n            if (hasScopeRef(node.source, ids)) {\n                return true;\n            }\n            return node.children.some(c => hasScopeRef(c, ids));\n        case 9 /* NodeTypes.IF */:\n            return node.branches.some(b => hasScopeRef(b, ids));\n        case 10 /* NodeTypes.IF_BRANCH */:\n            if (hasScopeRef(node.condition, ids)) {\n                return true;\n            }\n            return node.children.some(c => hasScopeRef(c, ids));\n        case 4 /* NodeTypes.SIMPLE_EXPRESSION */:\n            return (!node.isStatic &&\n                isSimpleIdentifier(node.content) &&\n                !!ids[node.content]);\n        case 8 /* NodeTypes.COMPOUND_EXPRESSION */:\n            return node.children.some(c => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(c) && hasScopeRef(c, ids));\n        case 5 /* NodeTypes.INTERPOLATION */:\n        case 12 /* NodeTypes.TEXT_CALL */:\n            return hasScopeRef(node.content, ids);\n        case 2 /* NodeTypes.TEXT */:\n        case 3 /* NodeTypes.COMMENT */:\n            return false;\n        default:\n            if ((true)) ;\n            return false;\n    }\n}\nfunction getMemoedVNodeCall(node) {\n    if (node.type === 14 /* NodeTypes.JS_CALL_EXPRESSION */ && node.callee === WITH_MEMO) {\n        return node.arguments[1].returns;\n    }\n    else {\n        return node;\n    }\n}\nfunction makeBlock(node, { helper, removeHelper, inSSR }) {\n    if (!node.isBlock) {\n        node.isBlock = true;\n        removeHelper(getVNodeHelper(inSSR, node.isComponent));\n        helper(OPEN_BLOCK);\n        helper(getVNodeBlockHelper(inSSR, node.isComponent));\n    }\n}\n\nconst deprecationData = {\n    [\"COMPILER_IS_ON_ELEMENT\" /* CompilerDeprecationTypes.COMPILER_IS_ON_ELEMENT */]: {\n        message: `Platform-native elements with \"is\" prop will no longer be ` +\n            `treated as components in Vue 3 unless the \"is\" value is explicitly ` +\n            `prefixed with \"vue:\".`,\n        link: `https://v3-migration.vuejs.org/breaking-changes/custom-elements-interop.html`\n    },\n    [\"COMPILER_V_BIND_SYNC\" /* CompilerDeprecationTypes.COMPILER_V_BIND_SYNC */]: {\n        message: key => `.sync modifier for v-bind has been removed. Use v-model with ` +\n            `argument instead. \\`v-bind:${key}.sync\\` should be changed to ` +\n            `\\`v-model:${key}\\`.`,\n        link: `https://v3-migration.vuejs.org/breaking-changes/v-model.html`\n    },\n    [\"COMPILER_V_BIND_PROP\" /* CompilerDeprecationTypes.COMPILER_V_BIND_PROP */]: {\n        message: `.prop modifier for v-bind has been removed and no longer necessary. ` +\n            `Vue 3 will automatically set a binding as DOM property when appropriate.`\n    },\n    [\"COMPILER_V_BIND_OBJECT_ORDER\" /* CompilerDeprecationTypes.COMPILER_V_BIND_OBJECT_ORDER */]: {\n        message: `v-bind=\"obj\" usage is now order sensitive and behaves like JavaScript ` +\n            `object spread: it will now overwrite an existing non-mergeable attribute ` +\n            `that appears before v-bind in the case of conflict. ` +\n            `To retain 2.x behavior, move v-bind to make it the first attribute. ` +\n            `You can also suppress this warning if the usage is intended.`,\n        link: `https://v3-migration.vuejs.org/breaking-changes/v-bind.html`\n    },\n    [\"COMPILER_V_ON_NATIVE\" /* CompilerDeprecationTypes.COMPILER_V_ON_NATIVE */]: {\n        message: `.native modifier for v-on has been removed as is no longer necessary.`,\n        link: `https://v3-migration.vuejs.org/breaking-changes/v-on-native-modifier-removed.html`\n    },\n    [\"COMPILER_V_IF_V_FOR_PRECEDENCE\" /* CompilerDeprecationTypes.COMPILER_V_IF_V_FOR_PRECEDENCE */]: {\n        message: `v-if / v-for precedence when used on the same element has changed ` +\n            `in Vue 3: v-if now takes higher precedence and will no longer have ` +\n            `access to v-for scope variables. It is best to avoid the ambiguity ` +\n            `with <template> tags or use a computed property that filters v-for ` +\n            `data source.`,\n        link: `https://v3-migration.vuejs.org/breaking-changes/v-if-v-for.html`\n    },\n    [\"COMPILER_NATIVE_TEMPLATE\" /* CompilerDeprecationTypes.COMPILER_NATIVE_TEMPLATE */]: {\n        message: `<template> with no special directives will render as a native template ` +\n            `element instead of its inner content in Vue 3.`\n    },\n    [\"COMPILER_INLINE_TEMPLATE\" /* CompilerDeprecationTypes.COMPILER_INLINE_TEMPLATE */]: {\n        message: `\"inline-template\" has been removed in Vue 3.`,\n        link: `https://v3-migration.vuejs.org/breaking-changes/inline-template-attribute.html`\n    },\n    [\"COMPILER_FILTER\" /* CompilerDeprecationTypes.COMPILER_FILTERS */]: {\n        message: `filters have been removed in Vue 3. ` +\n            `The \"|\" symbol will be treated as native JavaScript bitwise OR operator. ` +\n            `Use method calls or computed properties instead.`,\n        link: `https://v3-migration.vuejs.org/breaking-changes/filters.html`\n    }\n};\nfunction getCompatValue(key, context) {\n    const config = context.options\n        ? context.options.compatConfig\n        : context.compatConfig;\n    const value = config && config[key];\n    if (key === 'MODE') {\n        return value || 3; // compiler defaults to v3 behavior\n    }\n    else {\n        return value;\n    }\n}\nfunction isCompatEnabled(key, context) {\n    const mode = getCompatValue('MODE', context);\n    const value = getCompatValue(key, context);\n    // in v3 mode, only enable if explicitly set to true\n    // otherwise enable for any non-false value\n    return mode === 3 ? value === true : value !== false;\n}\nfunction checkCompatEnabled(key, context, loc, ...args) {\n    const enabled = isCompatEnabled(key, context);\n    if (( true) && enabled) {\n        warnDeprecation(key, context, loc, ...args);\n    }\n    return enabled;\n}\nfunction warnDeprecation(key, context, loc, ...args) {\n    const val = getCompatValue(key, context);\n    if (val === 'suppress-warning') {\n        return;\n    }\n    const { message, link } = deprecationData[key];\n    const msg = `(deprecation ${key}) ${typeof message === 'function' ? message(...args) : message}${link ? `\\n  Details: ${link}` : ``}`;\n    const err = new SyntaxError(msg);\n    err.code = key;\n    if (loc)\n        err.loc = loc;\n    context.onWarn(err);\n}\n\n// The default decoder only provides escapes for characters reserved as part of\n// the template syntax, and is only used if the custom renderer did not provide\n// a platform-specific decoder.\nconst decodeRE = /&(gt|lt|amp|apos|quot);/g;\nconst decodeMap = {\n    gt: '>',\n    lt: '<',\n    amp: '&',\n    apos: \"'\",\n    quot: '\"'\n};\nconst defaultParserOptions = {\n    delimiters: [`{{`, `}}`],\n    getNamespace: () => 0 /* Namespaces.HTML */,\n    getTextMode: () => 0 /* TextModes.DATA */,\n    isVoidTag: _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NO,\n    isPreTag: _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NO,\n    isCustomElement: _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NO,\n    decodeEntities: (rawText) => rawText.replace(decodeRE, (_, p1) => decodeMap[p1]),\n    onError: defaultOnError,\n    onWarn: defaultOnWarn,\n    comments: (\"development\" !== 'production')\n};\nfunction baseParse(content, options = {}) {\n    const context = createParserContext(content, options);\n    const start = getCursor(context);\n    return createRoot(parseChildren(context, 0 /* TextModes.DATA */, []), getSelection(context, start));\n}\nfunction createParserContext(content, rawOptions) {\n    const options = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, defaultParserOptions);\n    let key;\n    for (key in rawOptions) {\n        // @ts-ignore\n        options[key] =\n            rawOptions[key] === undefined\n                ? defaultParserOptions[key]\n                : rawOptions[key];\n    }\n    return {\n        options,\n        column: 1,\n        line: 1,\n        offset: 0,\n        originalSource: content,\n        source: content,\n        inPre: false,\n        inVPre: false,\n        onWarn: options.onWarn\n    };\n}\nfunction parseChildren(context, mode, ancestors) {\n    const parent = last(ancestors);\n    const ns = parent ? parent.ns : 0 /* Namespaces.HTML */;\n    const nodes = [];\n    while (!isEnd(context, mode, ancestors)) {\n        const s = context.source;\n        let node = undefined;\n        if (mode === 0 /* TextModes.DATA */ || mode === 1 /* TextModes.RCDATA */) {\n            if (!context.inVPre && startsWith(s, context.options.delimiters[0])) {\n                // '{{'\n                node = parseInterpolation(context, mode);\n            }\n            else if (mode === 0 /* TextModes.DATA */ && s[0] === '<') {\n                // https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state\n                if (s.length === 1) {\n                    emitError(context, 5 /* ErrorCodes.EOF_BEFORE_TAG_NAME */, 1);\n                }\n                else if (s[1] === '!') {\n                    // https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state\n                    if (startsWith(s, '<!--')) {\n                        node = parseComment(context);\n                    }\n                    else if (startsWith(s, '<!DOCTYPE')) {\n                        // Ignore DOCTYPE by a limitation.\n                        node = parseBogusComment(context);\n                    }\n                    else if (startsWith(s, '<![CDATA[')) {\n                        if (ns !== 0 /* Namespaces.HTML */) {\n                            node = parseCDATA(context, ancestors);\n                        }\n                        else {\n                            emitError(context, 1 /* ErrorCodes.CDATA_IN_HTML_CONTENT */);\n                            node = parseBogusComment(context);\n                        }\n                    }\n                    else {\n                        emitError(context, 11 /* ErrorCodes.INCORRECTLY_OPENED_COMMENT */);\n                        node = parseBogusComment(context);\n                    }\n                }\n                else if (s[1] === '/') {\n                    // https://html.spec.whatwg.org/multipage/parsing.html#end-tag-open-state\n                    if (s.length === 2) {\n                        emitError(context, 5 /* ErrorCodes.EOF_BEFORE_TAG_NAME */, 2);\n                    }\n                    else if (s[2] === '>') {\n                        emitError(context, 14 /* ErrorCodes.MISSING_END_TAG_NAME */, 2);\n                        advanceBy(context, 3);\n                        continue;\n                    }\n                    else if (/[a-z]/i.test(s[2])) {\n                        emitError(context, 23 /* ErrorCodes.X_INVALID_END_TAG */);\n                        parseTag(context, 1 /* TagType.End */, parent);\n                        continue;\n                    }\n                    else {\n                        emitError(context, 12 /* ErrorCodes.INVALID_FIRST_CHARACTER_OF_TAG_NAME */, 2);\n                        node = parseBogusComment(context);\n                    }\n                }\n                else if (/[a-z]/i.test(s[1])) {\n                    node = parseElement(context, ancestors);\n                    // 2.x <template> with no directive compat\n                    if (isCompatEnabled(\"COMPILER_NATIVE_TEMPLATE\" /* CompilerDeprecationTypes.COMPILER_NATIVE_TEMPLATE */, context) &&\n                        node &&\n                        node.tag === 'template' &&\n                        !node.props.some(p => p.type === 7 /* NodeTypes.DIRECTIVE */ &&\n                            isSpecialTemplateDirective(p.name))) {\n                        ( true) &&\n                            warnDeprecation(\"COMPILER_NATIVE_TEMPLATE\" /* CompilerDeprecationTypes.COMPILER_NATIVE_TEMPLATE */, context, node.loc);\n                        node = node.children;\n                    }\n                }\n                else if (s[1] === '?') {\n                    emitError(context, 21 /* ErrorCodes.UNEXPECTED_QUESTION_MARK_INSTEAD_OF_TAG_NAME */, 1);\n                    node = parseBogusComment(context);\n                }\n                else {\n                    emitError(context, 12 /* ErrorCodes.INVALID_FIRST_CHARACTER_OF_TAG_NAME */, 1);\n                }\n            }\n        }\n        if (!node) {\n            node = parseText(context, mode);\n        }\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(node)) {\n            for (let i = 0; i < node.length; i++) {\n                pushNode(nodes, node[i]);\n            }\n        }\n        else {\n            pushNode(nodes, node);\n        }\n    }\n    // Whitespace handling strategy like v2\n    let removedWhitespace = false;\n    if (mode !== 2 /* TextModes.RAWTEXT */ && mode !== 1 /* TextModes.RCDATA */) {\n        const shouldCondense = context.options.whitespace !== 'preserve';\n        for (let i = 0; i < nodes.length; i++) {\n            const node = nodes[i];\n            if (node.type === 2 /* NodeTypes.TEXT */) {\n                if (!context.inPre) {\n                    if (!/[^\\t\\r\\n\\f ]/.test(node.content)) {\n                        const prev = nodes[i - 1];\n                        const next = nodes[i + 1];\n                        // Remove if:\n                        // - the whitespace is the first or last node, or:\n                        // - (condense mode) the whitespace is between twos comments, or:\n                        // - (condense mode) the whitespace is between comment and element, or:\n                        // - (condense mode) the whitespace is between two elements AND contains newline\n                        if (!prev ||\n                            !next ||\n                            (shouldCondense &&\n                                ((prev.type === 3 /* NodeTypes.COMMENT */ &&\n                                    next.type === 3 /* NodeTypes.COMMENT */) ||\n                                    (prev.type === 3 /* NodeTypes.COMMENT */ &&\n                                        next.type === 1 /* NodeTypes.ELEMENT */) ||\n                                    (prev.type === 1 /* NodeTypes.ELEMENT */ &&\n                                        next.type === 3 /* NodeTypes.COMMENT */) ||\n                                    (prev.type === 1 /* NodeTypes.ELEMENT */ &&\n                                        next.type === 1 /* NodeTypes.ELEMENT */ &&\n                                        /[\\r\\n]/.test(node.content))))) {\n                            removedWhitespace = true;\n                            nodes[i] = null;\n                        }\n                        else {\n                            // Otherwise, the whitespace is condensed into a single space\n                            node.content = ' ';\n                        }\n                    }\n                    else if (shouldCondense) {\n                        // in condense mode, consecutive whitespaces in text are condensed\n                        // down to a single space.\n                        node.content = node.content.replace(/[\\t\\r\\n\\f ]+/g, ' ');\n                    }\n                }\n                else {\n                    // #6410 normalize windows newlines in <pre>:\n                    // in SSR, browsers normalize server-rendered \\r\\n into a single \\n\n                    // in the DOM\n                    node.content = node.content.replace(/\\r\\n/g, '\\n');\n                }\n            }\n            // Remove comment nodes if desired by configuration.\n            else if (node.type === 3 /* NodeTypes.COMMENT */ && !context.options.comments) {\n                removedWhitespace = true;\n                nodes[i] = null;\n            }\n        }\n        if (context.inPre && parent && context.options.isPreTag(parent.tag)) {\n            // remove leading newline per html spec\n            // https://html.spec.whatwg.org/multipage/grouping-content.html#the-pre-element\n            const first = nodes[0];\n            if (first && first.type === 2 /* NodeTypes.TEXT */) {\n                first.content = first.content.replace(/^\\r?\\n/, '');\n            }\n        }\n    }\n    return removedWhitespace ? nodes.filter(Boolean) : nodes;\n}\nfunction pushNode(nodes, node) {\n    if (node.type === 2 /* NodeTypes.TEXT */) {\n        const prev = last(nodes);\n        // Merge if both this and the previous node are text and those are\n        // consecutive. This happens for cases like \"a < b\".\n        if (prev &&\n            prev.type === 2 /* NodeTypes.TEXT */ &&\n            prev.loc.end.offset === node.loc.start.offset) {\n            prev.content += node.content;\n            prev.loc.end = node.loc.end;\n            prev.loc.source += node.loc.source;\n            return;\n        }\n    }\n    nodes.push(node);\n}\nfunction parseCDATA(context, ancestors) {\n    advanceBy(context, 9);\n    const nodes = parseChildren(context, 3 /* TextModes.CDATA */, ancestors);\n    if (context.source.length === 0) {\n        emitError(context, 6 /* ErrorCodes.EOF_IN_CDATA */);\n    }\n    else {\n        advanceBy(context, 3);\n    }\n    return nodes;\n}\nfunction parseComment(context) {\n    const start = getCursor(context);\n    let content;\n    // Regular comment.\n    const match = /--(\\!)?>/.exec(context.source);\n    if (!match) {\n        content = context.source.slice(4);\n        advanceBy(context, context.source.length);\n        emitError(context, 7 /* ErrorCodes.EOF_IN_COMMENT */);\n    }\n    else {\n        if (match.index <= 3) {\n            emitError(context, 0 /* ErrorCodes.ABRUPT_CLOSING_OF_EMPTY_COMMENT */);\n        }\n        if (match[1]) {\n            emitError(context, 10 /* ErrorCodes.INCORRECTLY_CLOSED_COMMENT */);\n        }\n        content = context.source.slice(4, match.index);\n        // Advancing with reporting nested comments.\n        const s = context.source.slice(0, match.index);\n        let prevIndex = 1, nestedIndex = 0;\n        while ((nestedIndex = s.indexOf('<!--', prevIndex)) !== -1) {\n            advanceBy(context, nestedIndex - prevIndex + 1);\n            if (nestedIndex + 4 < s.length) {\n                emitError(context, 16 /* ErrorCodes.NESTED_COMMENT */);\n            }\n            prevIndex = nestedIndex + 1;\n        }\n        advanceBy(context, match.index + match[0].length - prevIndex + 1);\n    }\n    return {\n        type: 3 /* NodeTypes.COMMENT */,\n        content,\n        loc: getSelection(context, start)\n    };\n}\nfunction parseBogusComment(context) {\n    const start = getCursor(context);\n    const contentStart = context.source[1] === '?' ? 1 : 2;\n    let content;\n    const closeIndex = context.source.indexOf('>');\n    if (closeIndex === -1) {\n        content = context.source.slice(contentStart);\n        advanceBy(context, context.source.length);\n    }\n    else {\n        content = context.source.slice(contentStart, closeIndex);\n        advanceBy(context, closeIndex + 1);\n    }\n    return {\n        type: 3 /* NodeTypes.COMMENT */,\n        content,\n        loc: getSelection(context, start)\n    };\n}\nfunction parseElement(context, ancestors) {\n    // Start tag.\n    const wasInPre = context.inPre;\n    const wasInVPre = context.inVPre;\n    const parent = last(ancestors);\n    const element = parseTag(context, 0 /* TagType.Start */, parent);\n    const isPreBoundary = context.inPre && !wasInPre;\n    const isVPreBoundary = context.inVPre && !wasInVPre;\n    if (element.isSelfClosing || context.options.isVoidTag(element.tag)) {\n        // #4030 self-closing <pre> tag\n        if (isPreBoundary) {\n            context.inPre = false;\n        }\n        if (isVPreBoundary) {\n            context.inVPre = false;\n        }\n        return element;\n    }\n    // Children.\n    ancestors.push(element);\n    const mode = context.options.getTextMode(element, parent);\n    const children = parseChildren(context, mode, ancestors);\n    ancestors.pop();\n    // 2.x inline-template compat\n    {\n        const inlineTemplateProp = element.props.find(p => p.type === 6 /* NodeTypes.ATTRIBUTE */ && p.name === 'inline-template');\n        if (inlineTemplateProp &&\n            checkCompatEnabled(\"COMPILER_INLINE_TEMPLATE\" /* CompilerDeprecationTypes.COMPILER_INLINE_TEMPLATE */, context, inlineTemplateProp.loc)) {\n            const loc = getSelection(context, element.loc.end);\n            inlineTemplateProp.value = {\n                type: 2 /* NodeTypes.TEXT */,\n                content: loc.source,\n                loc\n            };\n        }\n    }\n    element.children = children;\n    // End tag.\n    if (startsWithEndTagOpen(context.source, element.tag)) {\n        parseTag(context, 1 /* TagType.End */, parent);\n    }\n    else {\n        emitError(context, 24 /* ErrorCodes.X_MISSING_END_TAG */, 0, element.loc.start);\n        if (context.source.length === 0 && element.tag.toLowerCase() === 'script') {\n            const first = children[0];\n            if (first && startsWith(first.loc.source, '<!--')) {\n                emitError(context, 8 /* ErrorCodes.EOF_IN_SCRIPT_HTML_COMMENT_LIKE_TEXT */);\n            }\n        }\n    }\n    element.loc = getSelection(context, element.loc.start);\n    if (isPreBoundary) {\n        context.inPre = false;\n    }\n    if (isVPreBoundary) {\n        context.inVPre = false;\n    }\n    return element;\n}\nconst isSpecialTemplateDirective = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.makeMap)(`if,else,else-if,for,slot`);\nfunction parseTag(context, type, parent) {\n    // Tag open.\n    const start = getCursor(context);\n    const match = /^<\\/?([a-z][^\\t\\r\\n\\f />]*)/i.exec(context.source);\n    const tag = match[1];\n    const ns = context.options.getNamespace(tag, parent);\n    advanceBy(context, match[0].length);\n    advanceSpaces(context);\n    // save current state in case we need to re-parse attributes with v-pre\n    const cursor = getCursor(context);\n    const currentSource = context.source;\n    // check <pre> tag\n    if (context.options.isPreTag(tag)) {\n        context.inPre = true;\n    }\n    // Attributes.\n    let props = parseAttributes(context, type);\n    // check v-pre\n    if (type === 0 /* TagType.Start */ &&\n        !context.inVPre &&\n        props.some(p => p.type === 7 /* NodeTypes.DIRECTIVE */ && p.name === 'pre')) {\n        context.inVPre = true;\n        // reset context\n        (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)(context, cursor);\n        context.source = currentSource;\n        // re-parse attrs and filter out v-pre itself\n        props = parseAttributes(context, type).filter(p => p.name !== 'v-pre');\n    }\n    // Tag close.\n    let isSelfClosing = false;\n    if (context.source.length === 0) {\n        emitError(context, 9 /* ErrorCodes.EOF_IN_TAG */);\n    }\n    else {\n        isSelfClosing = startsWith(context.source, '/>');\n        if (type === 1 /* TagType.End */ && isSelfClosing) {\n            emitError(context, 4 /* ErrorCodes.END_TAG_WITH_TRAILING_SOLIDUS */);\n        }\n        advanceBy(context, isSelfClosing ? 2 : 1);\n    }\n    if (type === 1 /* TagType.End */) {\n        return;\n    }\n    // 2.x deprecation checks\n    if (( true) &&\n        isCompatEnabled(\"COMPILER_V_IF_V_FOR_PRECEDENCE\" /* CompilerDeprecationTypes.COMPILER_V_IF_V_FOR_PRECEDENCE */, context)) {\n        let hasIf = false;\n        let hasFor = false;\n        for (let i = 0; i < props.length; i++) {\n            const p = props[i];\n            if (p.type === 7 /* NodeTypes.DIRECTIVE */) {\n                if (p.name === 'if') {\n                    hasIf = true;\n                }\n                else if (p.name === 'for') {\n                    hasFor = true;\n                }\n            }\n            if (hasIf && hasFor) {\n                warnDeprecation(\"COMPILER_V_IF_V_FOR_PRECEDENCE\" /* CompilerDeprecationTypes.COMPILER_V_IF_V_FOR_PRECEDENCE */, context, getSelection(context, start));\n                break;\n            }\n        }\n    }\n    let tagType = 0 /* ElementTypes.ELEMENT */;\n    if (!context.inVPre) {\n        if (tag === 'slot') {\n            tagType = 2 /* ElementTypes.SLOT */;\n        }\n        else if (tag === 'template') {\n            if (props.some(p => p.type === 7 /* NodeTypes.DIRECTIVE */ && isSpecialTemplateDirective(p.name))) {\n                tagType = 3 /* ElementTypes.TEMPLATE */;\n            }\n        }\n        else if (isComponent(tag, props, context)) {\n            tagType = 1 /* ElementTypes.COMPONENT */;\n        }\n    }\n    return {\n        type: 1 /* NodeTypes.ELEMENT */,\n        ns,\n        tag,\n        tagType,\n        props,\n        isSelfClosing,\n        children: [],\n        loc: getSelection(context, start),\n        codegenNode: undefined // to be created during transform phase\n    };\n}\nfunction isComponent(tag, props, context) {\n    const options = context.options;\n    if (options.isCustomElement(tag)) {\n        return false;\n    }\n    if (tag === 'component' ||\n        /^[A-Z]/.test(tag) ||\n        isCoreComponent(tag) ||\n        (options.isBuiltInComponent && options.isBuiltInComponent(tag)) ||\n        (options.isNativeTag && !options.isNativeTag(tag))) {\n        return true;\n    }\n    // at this point the tag should be a native tag, but check for potential \"is\"\n    // casting\n    for (let i = 0; i < props.length; i++) {\n        const p = props[i];\n        if (p.type === 6 /* NodeTypes.ATTRIBUTE */) {\n            if (p.name === 'is' && p.value) {\n                if (p.value.content.startsWith('vue:')) {\n                    return true;\n                }\n                else if (checkCompatEnabled(\"COMPILER_IS_ON_ELEMENT\" /* CompilerDeprecationTypes.COMPILER_IS_ON_ELEMENT */, context, p.loc)) {\n                    return true;\n                }\n            }\n        }\n        else {\n            // directive\n            // v-is (TODO Deprecate)\n            if (p.name === 'is') {\n                return true;\n            }\n            else if (\n            // :is on plain element - only treat as component in compat mode\n            p.name === 'bind' &&\n                isStaticArgOf(p.arg, 'is') &&\n                true &&\n                checkCompatEnabled(\"COMPILER_IS_ON_ELEMENT\" /* CompilerDeprecationTypes.COMPILER_IS_ON_ELEMENT */, context, p.loc)) {\n                return true;\n            }\n        }\n    }\n}\nfunction parseAttributes(context, type) {\n    const props = [];\n    const attributeNames = new Set();\n    while (context.source.length > 0 &&\n        !startsWith(context.source, '>') &&\n        !startsWith(context.source, '/>')) {\n        if (startsWith(context.source, '/')) {\n            emitError(context, 22 /* ErrorCodes.UNEXPECTED_SOLIDUS_IN_TAG */);\n            advanceBy(context, 1);\n            advanceSpaces(context);\n            continue;\n        }\n        if (type === 1 /* TagType.End */) {\n            emitError(context, 3 /* ErrorCodes.END_TAG_WITH_ATTRIBUTES */);\n        }\n        const attr = parseAttribute(context, attributeNames);\n        // Trim whitespace between class\n        // https://github.com/vuejs/core/issues/4251\n        if (attr.type === 6 /* NodeTypes.ATTRIBUTE */ &&\n            attr.value &&\n            attr.name === 'class') {\n            attr.value.content = attr.value.content.replace(/\\s+/g, ' ').trim();\n        }\n        if (type === 0 /* TagType.Start */) {\n            props.push(attr);\n        }\n        if (/^[^\\t\\r\\n\\f />]/.test(context.source)) {\n            emitError(context, 15 /* ErrorCodes.MISSING_WHITESPACE_BETWEEN_ATTRIBUTES */);\n        }\n        advanceSpaces(context);\n    }\n    return props;\n}\nfunction parseAttribute(context, nameSet) {\n    // Name.\n    const start = getCursor(context);\n    const match = /^[^\\t\\r\\n\\f />][^\\t\\r\\n\\f />=]*/.exec(context.source);\n    const name = match[0];\n    if (nameSet.has(name)) {\n        emitError(context, 2 /* ErrorCodes.DUPLICATE_ATTRIBUTE */);\n    }\n    nameSet.add(name);\n    if (name[0] === '=') {\n        emitError(context, 19 /* ErrorCodes.UNEXPECTED_EQUALS_SIGN_BEFORE_ATTRIBUTE_NAME */);\n    }\n    {\n        const pattern = /[\"'<]/g;\n        let m;\n        while ((m = pattern.exec(name))) {\n            emitError(context, 17 /* ErrorCodes.UNEXPECTED_CHARACTER_IN_ATTRIBUTE_NAME */, m.index);\n        }\n    }\n    advanceBy(context, name.length);\n    // Value\n    let value = undefined;\n    if (/^[\\t\\r\\n\\f ]*=/.test(context.source)) {\n        advanceSpaces(context);\n        advanceBy(context, 1);\n        advanceSpaces(context);\n        value = parseAttributeValue(context);\n        if (!value) {\n            emitError(context, 13 /* ErrorCodes.MISSING_ATTRIBUTE_VALUE */);\n        }\n    }\n    const loc = getSelection(context, start);\n    if (!context.inVPre && /^(v-[A-Za-z0-9-]|:|\\.|@|#)/.test(name)) {\n        const match = /(?:^v-([a-z0-9-]+))?(?:(?::|^\\.|^@|^#)(\\[[^\\]]+\\]|[^\\.]+))?(.+)?$/i.exec(name);\n        let isPropShorthand = startsWith(name, '.');\n        let dirName = match[1] ||\n            (isPropShorthand || startsWith(name, ':')\n                ? 'bind'\n                : startsWith(name, '@')\n                    ? 'on'\n                    : 'slot');\n        let arg;\n        if (match[2]) {\n            const isSlot = dirName === 'slot';\n            const startOffset = name.lastIndexOf(match[2]);\n            const loc = getSelection(context, getNewPosition(context, start, startOffset), getNewPosition(context, start, startOffset + match[2].length + ((isSlot && match[3]) || '').length));\n            let content = match[2];\n            let isStatic = true;\n            if (content.startsWith('[')) {\n                isStatic = false;\n                if (!content.endsWith(']')) {\n                    emitError(context, 27 /* ErrorCodes.X_MISSING_DYNAMIC_DIRECTIVE_ARGUMENT_END */);\n                    content = content.slice(1);\n                }\n                else {\n                    content = content.slice(1, content.length - 1);\n                }\n            }\n            else if (isSlot) {\n                // #1241 special case for v-slot: vuetify relies extensively on slot\n                // names containing dots. v-slot doesn't have any modifiers and Vue 2.x\n                // supports such usage so we are keeping it consistent with 2.x.\n                content += match[3] || '';\n            }\n            arg = {\n                type: 4 /* NodeTypes.SIMPLE_EXPRESSION */,\n                content,\n                isStatic,\n                constType: isStatic\n                    ? 3 /* ConstantTypes.CAN_STRINGIFY */\n                    : 0 /* ConstantTypes.NOT_CONSTANT */,\n                loc\n            };\n        }\n        if (value && value.isQuoted) {\n            const valueLoc = value.loc;\n            valueLoc.start.offset++;\n            valueLoc.start.column++;\n            valueLoc.end = advancePositionWithClone(valueLoc.start, value.content);\n            valueLoc.source = valueLoc.source.slice(1, -1);\n        }\n        const modifiers = match[3] ? match[3].slice(1).split('.') : [];\n        if (isPropShorthand)\n            modifiers.push('prop');\n        // 2.x compat v-bind:foo.sync -> v-model:foo\n        if (dirName === 'bind' && arg) {\n            if (modifiers.includes('sync') &&\n                checkCompatEnabled(\"COMPILER_V_BIND_SYNC\" /* CompilerDeprecationTypes.COMPILER_V_BIND_SYNC */, context, loc, arg.loc.source)) {\n                dirName = 'model';\n                modifiers.splice(modifiers.indexOf('sync'), 1);\n            }\n            if (( true) && modifiers.includes('prop')) {\n                checkCompatEnabled(\"COMPILER_V_BIND_PROP\" /* CompilerDeprecationTypes.COMPILER_V_BIND_PROP */, context, loc);\n            }\n        }\n        return {\n            type: 7 /* NodeTypes.DIRECTIVE */,\n            name: dirName,\n            exp: value && {\n                type: 4 /* NodeTypes.SIMPLE_EXPRESSION */,\n                content: value.content,\n                isStatic: false,\n                // Treat as non-constant by default. This can be potentially set to\n                // other values by `transformExpression` to make it eligible for hoisting.\n                constType: 0 /* ConstantTypes.NOT_CONSTANT */,\n                loc: value.loc\n            },\n            arg,\n            modifiers,\n            loc\n        };\n    }\n    // missing directive name or illegal directive name\n    if (!context.inVPre && startsWith(name, 'v-')) {\n        emitError(context, 26 /* ErrorCodes.X_MISSING_DIRECTIVE_NAME */);\n    }\n    return {\n        type: 6 /* NodeTypes.ATTRIBUTE */,\n        name,\n        value: value && {\n            type: 2 /* NodeTypes.TEXT */,\n            content: value.content,\n            loc: value.loc\n        },\n        loc\n    };\n}\nfunction parseAttributeValue(context) {\n    const start = getCursor(context);\n    let content;\n    const quote = context.source[0];\n    const isQuoted = quote === `\"` || quote === `'`;\n    if (isQuoted) {\n        // Quoted value.\n        advanceBy(context, 1);\n        const endIndex = context.source.indexOf(quote);\n        if (endIndex === -1) {\n            content = parseTextData(context, context.source.length, 4 /* TextModes.ATTRIBUTE_VALUE */);\n        }\n        else {\n            content = parseTextData(context, endIndex, 4 /* TextModes.ATTRIBUTE_VALUE */);\n            advanceBy(context, 1);\n        }\n    }\n    else {\n        // Unquoted\n        const match = /^[^\\t\\r\\n\\f >]+/.exec(context.source);\n        if (!match) {\n            return undefined;\n        }\n        const unexpectedChars = /[\"'<=`]/g;\n        let m;\n        while ((m = unexpectedChars.exec(match[0]))) {\n            emitError(context, 18 /* ErrorCodes.UNEXPECTED_CHARACTER_IN_UNQUOTED_ATTRIBUTE_VALUE */, m.index);\n        }\n        content = parseTextData(context, match[0].length, 4 /* TextModes.ATTRIBUTE_VALUE */);\n    }\n    return { content, isQuoted, loc: getSelection(context, start) };\n}\nfunction parseInterpolation(context, mode) {\n    const [open, close] = context.options.delimiters;\n    const closeIndex = context.source.indexOf(close, open.length);\n    if (closeIndex === -1) {\n        emitError(context, 25 /* ErrorCodes.X_MISSING_INTERPOLATION_END */);\n        return undefined;\n    }\n    const start = getCursor(context);\n    advanceBy(context, open.length);\n    const innerStart = getCursor(context);\n    const innerEnd = getCursor(context);\n    const rawContentLength = closeIndex - open.length;\n    const rawContent = context.source.slice(0, rawContentLength);\n    const preTrimContent = parseTextData(context, rawContentLength, mode);\n    const content = preTrimContent.trim();\n    const startOffset = preTrimContent.indexOf(content);\n    if (startOffset > 0) {\n        advancePositionWithMutation(innerStart, rawContent, startOffset);\n    }\n    const endOffset = rawContentLength - (preTrimContent.length - content.length - startOffset);\n    advancePositionWithMutation(innerEnd, rawContent, endOffset);\n    advanceBy(context, close.length);\n    return {\n        type: 5 /* NodeTypes.INTERPOLATION */,\n        content: {\n            type: 4 /* NodeTypes.SIMPLE_EXPRESSION */,\n            isStatic: false,\n            // Set `isConstant` to false by default and will decide in transformExpression\n            constType: 0 /* ConstantTypes.NOT_CONSTANT */,\n            content,\n            loc: getSelection(context, innerStart, innerEnd)\n        },\n        loc: getSelection(context, start)\n    };\n}\nfunction parseText(context, mode) {\n    const endTokens = mode === 3 /* TextModes.CDATA */ ? [']]>'] : ['<', context.options.delimiters[0]];\n    let endIndex = context.source.length;\n    for (let i = 0; i < endTokens.length; i++) {\n        const index = context.source.indexOf(endTokens[i], 1);\n        if (index !== -1 && endIndex > index) {\n            endIndex = index;\n        }\n    }\n    const start = getCursor(context);\n    const content = parseTextData(context, endIndex, mode);\n    return {\n        type: 2 /* NodeTypes.TEXT */,\n        content,\n        loc: getSelection(context, start)\n    };\n}\n/**\n * Get text data with a given length from the current location.\n * This translates HTML entities in the text data.\n */\nfunction parseTextData(context, length, mode) {\n    const rawText = context.source.slice(0, length);\n    advanceBy(context, length);\n    if (mode === 2 /* TextModes.RAWTEXT */ ||\n        mode === 3 /* TextModes.CDATA */ ||\n        !rawText.includes('&')) {\n        return rawText;\n    }\n    else {\n        // DATA or RCDATA containing \"&\"\". Entity decoding required.\n        return context.options.decodeEntities(rawText, mode === 4 /* TextModes.ATTRIBUTE_VALUE */);\n    }\n}\nfunction getCursor(context) {\n    const { column, line, offset } = context;\n    return { column, line, offset };\n}\nfunction getSelection(context, start, end) {\n    end = end || getCursor(context);\n    return {\n        start,\n        end,\n        source: context.originalSource.slice(start.offset, end.offset)\n    };\n}\nfunction last(xs) {\n    return xs[xs.length - 1];\n}\nfunction startsWith(source, searchString) {\n    return source.startsWith(searchString);\n}\nfunction advanceBy(context, numberOfCharacters) {\n    const { source } = context;\n    advancePositionWithMutation(context, source, numberOfCharacters);\n    context.source = source.slice(numberOfCharacters);\n}\nfunction advanceSpaces(context) {\n    const match = /^[\\t\\r\\n\\f ]+/.exec(context.source);\n    if (match) {\n        advanceBy(context, match[0].length);\n    }\n}\nfunction getNewPosition(context, start, numberOfCharacters) {\n    return advancePositionWithClone(start, context.originalSource.slice(start.offset, numberOfCharacters), numberOfCharacters);\n}\nfunction emitError(context, code, offset, loc = getCursor(context)) {\n    if (offset) {\n        loc.offset += offset;\n        loc.column += offset;\n    }\n    context.options.onError(createCompilerError(code, {\n        start: loc,\n        end: loc,\n        source: ''\n    }));\n}\nfunction isEnd(context, mode, ancestors) {\n    const s = context.source;\n    switch (mode) {\n        case 0 /* TextModes.DATA */:\n            if (startsWith(s, '</')) {\n                // TODO: probably bad performance\n                for (let i = ancestors.length - 1; i >= 0; --i) {\n                    if (startsWithEndTagOpen(s, ancestors[i].tag)) {\n                        return true;\n                    }\n                }\n            }\n            break;\n        case 1 /* TextModes.RCDATA */:\n        case 2 /* TextModes.RAWTEXT */: {\n            const parent = last(ancestors);\n            if (parent && startsWithEndTagOpen(s, parent.tag)) {\n                return true;\n            }\n            break;\n        }\n        case 3 /* TextModes.CDATA */:\n            if (startsWith(s, ']]>')) {\n                return true;\n            }\n            break;\n    }\n    return !s;\n}\nfunction startsWithEndTagOpen(source, tag) {\n    return (startsWith(source, '</') &&\n        source.slice(2, 2 + tag.length).toLowerCase() === tag.toLowerCase() &&\n        /[\\t\\r\\n\\f />]/.test(source[2 + tag.length] || '>'));\n}\n\nfunction hoistStatic(root, context) {\n    walk(root, context, \n    // Root node is unfortunately non-hoistable due to potential parent\n    // fallthrough attributes.\n    isSingleElementRoot(root, root.children[0]));\n}\nfunction isSingleElementRoot(root, child) {\n    const { children } = root;\n    return (children.length === 1 &&\n        child.type === 1 /* NodeTypes.ELEMENT */ &&\n        !isSlotOutlet(child));\n}\nfunction walk(node, context, doNotHoistNode = false) {\n    const { children } = node;\n    const originalCount = children.length;\n    let hoistedCount = 0;\n    for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n        // only plain elements & text calls are eligible for hoisting.\n        if (child.type === 1 /* NodeTypes.ELEMENT */ &&\n            child.tagType === 0 /* ElementTypes.ELEMENT */) {\n            const constantType = doNotHoistNode\n                ? 0 /* ConstantTypes.NOT_CONSTANT */\n                : getConstantType(child, context);\n            if (constantType > 0 /* ConstantTypes.NOT_CONSTANT */) {\n                if (constantType >= 2 /* ConstantTypes.CAN_HOIST */) {\n                    child.codegenNode.patchFlag =\n                        -1 /* PatchFlags.HOISTED */ + (( true) ? ` /* HOISTED */` : 0);\n                    child.codegenNode = context.hoist(child.codegenNode);\n                    hoistedCount++;\n                    continue;\n                }\n            }\n            else {\n                // node may contain dynamic children, but its props may be eligible for\n                // hoisting.\n                const codegenNode = child.codegenNode;\n                if (codegenNode.type === 13 /* NodeTypes.VNODE_CALL */) {\n                    const flag = getPatchFlag(codegenNode);\n                    if ((!flag ||\n                        flag === 512 /* PatchFlags.NEED_PATCH */ ||\n                        flag === 1 /* PatchFlags.TEXT */) &&\n                        getGeneratedPropsConstantType(child, context) >=\n                            2 /* ConstantTypes.CAN_HOIST */) {\n                        const props = getNodeProps(child);\n                        if (props) {\n                            codegenNode.props = context.hoist(props);\n                        }\n                    }\n                    if (codegenNode.dynamicProps) {\n                        codegenNode.dynamicProps = context.hoist(codegenNode.dynamicProps);\n                    }\n                }\n            }\n        }\n        // walk further\n        if (child.type === 1 /* NodeTypes.ELEMENT */) {\n            const isComponent = child.tagType === 1 /* ElementTypes.COMPONENT */;\n            if (isComponent) {\n                context.scopes.vSlot++;\n            }\n            walk(child, context);\n            if (isComponent) {\n                context.scopes.vSlot--;\n            }\n        }\n        else if (child.type === 11 /* NodeTypes.FOR */) {\n            // Do not hoist v-for single child because it has to be a block\n            walk(child, context, child.children.length === 1);\n        }\n        else if (child.type === 9 /* NodeTypes.IF */) {\n            for (let i = 0; i < child.branches.length; i++) {\n                // Do not hoist v-if single child because it has to be a block\n                walk(child.branches[i], context, child.branches[i].children.length === 1);\n            }\n        }\n    }\n    if (hoistedCount && context.transformHoist) {\n        context.transformHoist(children, context, node);\n    }\n    // all children were hoisted - the entire children array is hoistable.\n    if (hoistedCount &&\n        hoistedCount === originalCount &&\n        node.type === 1 /* NodeTypes.ELEMENT */ &&\n        node.tagType === 0 /* ElementTypes.ELEMENT */ &&\n        node.codegenNode &&\n        node.codegenNode.type === 13 /* NodeTypes.VNODE_CALL */ &&\n        (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(node.codegenNode.children)) {\n        node.codegenNode.children = context.hoist(createArrayExpression(node.codegenNode.children));\n    }\n}\nfunction getConstantType(node, context) {\n    const { constantCache } = context;\n    switch (node.type) {\n        case 1 /* NodeTypes.ELEMENT */:\n            if (node.tagType !== 0 /* ElementTypes.ELEMENT */) {\n                return 0 /* ConstantTypes.NOT_CONSTANT */;\n            }\n            const cached = constantCache.get(node);\n            if (cached !== undefined) {\n                return cached;\n            }\n            const codegenNode = node.codegenNode;\n            if (codegenNode.type !== 13 /* NodeTypes.VNODE_CALL */) {\n                return 0 /* ConstantTypes.NOT_CONSTANT */;\n            }\n            if (codegenNode.isBlock &&\n                node.tag !== 'svg' &&\n                node.tag !== 'foreignObject') {\n                return 0 /* ConstantTypes.NOT_CONSTANT */;\n            }\n            const flag = getPatchFlag(codegenNode);\n            if (!flag) {\n                let returnType = 3 /* ConstantTypes.CAN_STRINGIFY */;\n                // Element itself has no patch flag. However we still need to check:\n                // 1. Even for a node with no patch flag, it is possible for it to contain\n                // non-hoistable expressions that refers to scope variables, e.g. compiler\n                // injected keys or cached event handlers. Therefore we need to always\n                // check the codegenNode's props to be sure.\n                const generatedPropsType = getGeneratedPropsConstantType(node, context);\n                if (generatedPropsType === 0 /* ConstantTypes.NOT_CONSTANT */) {\n                    constantCache.set(node, 0 /* ConstantTypes.NOT_CONSTANT */);\n                    return 0 /* ConstantTypes.NOT_CONSTANT */;\n                }\n                if (generatedPropsType < returnType) {\n                    returnType = generatedPropsType;\n                }\n                // 2. its children.\n                for (let i = 0; i < node.children.length; i++) {\n                    const childType = getConstantType(node.children[i], context);\n                    if (childType === 0 /* ConstantTypes.NOT_CONSTANT */) {\n                        constantCache.set(node, 0 /* ConstantTypes.NOT_CONSTANT */);\n                        return 0 /* ConstantTypes.NOT_CONSTANT */;\n                    }\n                    if (childType < returnType) {\n                        returnType = childType;\n                    }\n                }\n                // 3. if the type is not already CAN_SKIP_PATCH which is the lowest non-0\n                // type, check if any of the props can cause the type to be lowered\n                // we can skip can_patch because it's guaranteed by the absence of a\n                // patchFlag.\n                if (returnType > 1 /* ConstantTypes.CAN_SKIP_PATCH */) {\n                    for (let i = 0; i < node.props.length; i++) {\n                        const p = node.props[i];\n                        if (p.type === 7 /* NodeTypes.DIRECTIVE */ && p.name === 'bind' && p.exp) {\n                            const expType = getConstantType(p.exp, context);\n                            if (expType === 0 /* ConstantTypes.NOT_CONSTANT */) {\n                                constantCache.set(node, 0 /* ConstantTypes.NOT_CONSTANT */);\n                                return 0 /* ConstantTypes.NOT_CONSTANT */;\n                            }\n                            if (expType < returnType) {\n                                returnType = expType;\n                            }\n                        }\n                    }\n                }\n                // only svg/foreignObject could be block here, however if they are\n                // static then they don't need to be blocks since there will be no\n                // nested updates.\n                if (codegenNode.isBlock) {\n                    // except set custom directives.\n                    for (let i = 0; i < node.props.length; i++) {\n                        const p = node.props[i];\n                        if (p.type === 7 /* NodeTypes.DIRECTIVE */) {\n                            constantCache.set(node, 0 /* ConstantTypes.NOT_CONSTANT */);\n                            return 0 /* ConstantTypes.NOT_CONSTANT */;\n                        }\n                    }\n                    context.removeHelper(OPEN_BLOCK);\n                    context.removeHelper(getVNodeBlockHelper(context.inSSR, codegenNode.isComponent));\n                    codegenNode.isBlock = false;\n                    context.helper(getVNodeHelper(context.inSSR, codegenNode.isComponent));\n                }\n                constantCache.set(node, returnType);\n                return returnType;\n            }\n            else {\n                constantCache.set(node, 0 /* ConstantTypes.NOT_CONSTANT */);\n                return 0 /* ConstantTypes.NOT_CONSTANT */;\n            }\n        case 2 /* NodeTypes.TEXT */:\n        case 3 /* NodeTypes.COMMENT */:\n            return 3 /* ConstantTypes.CAN_STRINGIFY */;\n        case 9 /* NodeTypes.IF */:\n        case 11 /* NodeTypes.FOR */:\n        case 10 /* NodeTypes.IF_BRANCH */:\n            return 0 /* ConstantTypes.NOT_CONSTANT */;\n        case 5 /* NodeTypes.INTERPOLATION */:\n        case 12 /* NodeTypes.TEXT_CALL */:\n            return getConstantType(node.content, context);\n        case 4 /* NodeTypes.SIMPLE_EXPRESSION */:\n            return node.constType;\n        case 8 /* NodeTypes.COMPOUND_EXPRESSION */:\n            let returnType = 3 /* ConstantTypes.CAN_STRINGIFY */;\n            for (let i = 0; i < node.children.length; i++) {\n                const child = node.children[i];\n                if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(child) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(child)) {\n                    continue;\n                }\n                const childType = getConstantType(child, context);\n                if (childType === 0 /* ConstantTypes.NOT_CONSTANT */) {\n                    return 0 /* ConstantTypes.NOT_CONSTANT */;\n                }\n                else if (childType < returnType) {\n                    returnType = childType;\n                }\n            }\n            return returnType;\n        default:\n            if ((true)) ;\n            return 0 /* ConstantTypes.NOT_CONSTANT */;\n    }\n}\nconst allowHoistedHelperSet = new Set([\n    NORMALIZE_CLASS,\n    NORMALIZE_STYLE,\n    NORMALIZE_PROPS,\n    GUARD_REACTIVE_PROPS\n]);\nfunction getConstantTypeOfHelperCall(value, context) {\n    if (value.type === 14 /* NodeTypes.JS_CALL_EXPRESSION */ &&\n        !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(value.callee) &&\n        allowHoistedHelperSet.has(value.callee)) {\n        const arg = value.arguments[0];\n        if (arg.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */) {\n            return getConstantType(arg, context);\n        }\n        else if (arg.type === 14 /* NodeTypes.JS_CALL_EXPRESSION */) {\n            // in the case of nested helper call, e.g. `normalizeProps(guardReactiveProps(exp))`\n            return getConstantTypeOfHelperCall(arg, context);\n        }\n    }\n    return 0 /* ConstantTypes.NOT_CONSTANT */;\n}\nfunction getGeneratedPropsConstantType(node, context) {\n    let returnType = 3 /* ConstantTypes.CAN_STRINGIFY */;\n    const props = getNodeProps(node);\n    if (props && props.type === 15 /* NodeTypes.JS_OBJECT_EXPRESSION */) {\n        const { properties } = props;\n        for (let i = 0; i < properties.length; i++) {\n            const { key, value } = properties[i];\n            const keyType = getConstantType(key, context);\n            if (keyType === 0 /* ConstantTypes.NOT_CONSTANT */) {\n                return keyType;\n            }\n            if (keyType < returnType) {\n                returnType = keyType;\n            }\n            let valueType;\n            if (value.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */) {\n                valueType = getConstantType(value, context);\n            }\n            else if (value.type === 14 /* NodeTypes.JS_CALL_EXPRESSION */) {\n                // some helper calls can be hoisted,\n                // such as the `normalizeProps` generated by the compiler for pre-normalize class,\n                // in this case we need to respect the ConstantType of the helper's arguments\n                valueType = getConstantTypeOfHelperCall(value, context);\n            }\n            else {\n                valueType = 0 /* ConstantTypes.NOT_CONSTANT */;\n            }\n            if (valueType === 0 /* ConstantTypes.NOT_CONSTANT */) {\n                return valueType;\n            }\n            if (valueType < returnType) {\n                returnType = valueType;\n            }\n        }\n    }\n    return returnType;\n}\nfunction getNodeProps(node) {\n    const codegenNode = node.codegenNode;\n    if (codegenNode.type === 13 /* NodeTypes.VNODE_CALL */) {\n        return codegenNode.props;\n    }\n}\nfunction getPatchFlag(node) {\n    const flag = node.patchFlag;\n    return flag ? parseInt(flag, 10) : undefined;\n}\n\nfunction createTransformContext(root, { filename = '', prefixIdentifiers = false, hoistStatic = false, cacheHandlers = false, nodeTransforms = [], directiveTransforms = {}, transformHoist = null, isBuiltInComponent = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NOOP, isCustomElement = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NOOP, expressionPlugins = [], scopeId = null, slotted = true, ssr = false, inSSR = false, ssrCssVars = ``, bindingMetadata = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.EMPTY_OBJ, inline = false, isTS = false, onError = defaultOnError, onWarn = defaultOnWarn, compatConfig }) {\n    const nameMatch = filename.replace(/\\?.*$/, '').match(/([^/\\\\]+)\\.\\w+$/);\n    const context = {\n        // options\n        selfName: nameMatch && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.capitalize)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(nameMatch[1])),\n        prefixIdentifiers,\n        hoistStatic,\n        cacheHandlers,\n        nodeTransforms,\n        directiveTransforms,\n        transformHoist,\n        isBuiltInComponent,\n        isCustomElement,\n        expressionPlugins,\n        scopeId,\n        slotted,\n        ssr,\n        inSSR,\n        ssrCssVars,\n        bindingMetadata,\n        inline,\n        isTS,\n        onError,\n        onWarn,\n        compatConfig,\n        // state\n        root,\n        helpers: new Map(),\n        components: new Set(),\n        directives: new Set(),\n        hoists: [],\n        imports: [],\n        constantCache: new Map(),\n        temps: 0,\n        cached: 0,\n        identifiers: Object.create(null),\n        scopes: {\n            vFor: 0,\n            vSlot: 0,\n            vPre: 0,\n            vOnce: 0\n        },\n        parent: null,\n        currentNode: root,\n        childIndex: 0,\n        inVOnce: false,\n        // methods\n        helper(name) {\n            const count = context.helpers.get(name) || 0;\n            context.helpers.set(name, count + 1);\n            return name;\n        },\n        removeHelper(name) {\n            const count = context.helpers.get(name);\n            if (count) {\n                const currentCount = count - 1;\n                if (!currentCount) {\n                    context.helpers.delete(name);\n                }\n                else {\n                    context.helpers.set(name, currentCount);\n                }\n            }\n        },\n        helperString(name) {\n            return `_${helperNameMap[context.helper(name)]}`;\n        },\n        replaceNode(node) {\n            /* istanbul ignore if */\n            if ((true)) {\n                if (!context.currentNode) {\n                    throw new Error(`Node being replaced is already removed.`);\n                }\n                if (!context.parent) {\n                    throw new Error(`Cannot replace root node.`);\n                }\n            }\n            context.parent.children[context.childIndex] = context.currentNode = node;\n        },\n        removeNode(node) {\n            if (( true) && !context.parent) {\n                throw new Error(`Cannot remove root node.`);\n            }\n            const list = context.parent.children;\n            const removalIndex = node\n                ? list.indexOf(node)\n                : context.currentNode\n                    ? context.childIndex\n                    : -1;\n            /* istanbul ignore if */\n            if (( true) && removalIndex < 0) {\n                throw new Error(`node being removed is not a child of current parent`);\n            }\n            if (!node || node === context.currentNode) {\n                // current node removed\n                context.currentNode = null;\n                context.onNodeRemoved();\n            }\n            else {\n                // sibling node removed\n                if (context.childIndex > removalIndex) {\n                    context.childIndex--;\n                    context.onNodeRemoved();\n                }\n            }\n            context.parent.children.splice(removalIndex, 1);\n        },\n        onNodeRemoved: () => { },\n        addIdentifiers(exp) {\n        },\n        removeIdentifiers(exp) {\n        },\n        hoist(exp) {\n            if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(exp))\n                exp = createSimpleExpression(exp);\n            context.hoists.push(exp);\n            const identifier = createSimpleExpression(`_hoisted_${context.hoists.length}`, false, exp.loc, 2 /* ConstantTypes.CAN_HOIST */);\n            identifier.hoisted = exp;\n            return identifier;\n        },\n        cache(exp, isVNode = false) {\n            return createCacheExpression(context.cached++, exp, isVNode);\n        }\n    };\n    {\n        context.filters = new Set();\n    }\n    return context;\n}\nfunction transform(root, options) {\n    const context = createTransformContext(root, options);\n    traverseNode(root, context);\n    if (options.hoistStatic) {\n        hoistStatic(root, context);\n    }\n    if (!options.ssr) {\n        createRootCodegen(root, context);\n    }\n    // finalize meta information\n    root.helpers = new Set([...context.helpers.keys()]);\n    root.components = [...context.components];\n    root.directives = [...context.directives];\n    root.imports = context.imports;\n    root.hoists = context.hoists;\n    root.temps = context.temps;\n    root.cached = context.cached;\n    {\n        root.filters = [...context.filters];\n    }\n}\nfunction createRootCodegen(root, context) {\n    const { helper } = context;\n    const { children } = root;\n    if (children.length === 1) {\n        const child = children[0];\n        // if the single child is an element, turn it into a block.\n        if (isSingleElementRoot(root, child) && child.codegenNode) {\n            // single element root is never hoisted so codegenNode will never be\n            // SimpleExpressionNode\n            const codegenNode = child.codegenNode;\n            if (codegenNode.type === 13 /* NodeTypes.VNODE_CALL */) {\n                makeBlock(codegenNode, context);\n            }\n            root.codegenNode = codegenNode;\n        }\n        else {\n            // - single <slot/>, IfNode, ForNode: already blocks.\n            // - single text node: always patched.\n            // root codegen falls through via genNode()\n            root.codegenNode = child;\n        }\n    }\n    else if (children.length > 1) {\n        // root has multiple nodes - return a fragment block.\n        let patchFlag = 64 /* PatchFlags.STABLE_FRAGMENT */;\n        let patchFlagText = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[64];\n        // check if the fragment actually contains a single valid child with\n        // the rest being comments\n        if (( true) &&\n            children.filter(c => c.type !== 3 /* NodeTypes.COMMENT */).length === 1) {\n            patchFlag |= 2048 /* PatchFlags.DEV_ROOT_FRAGMENT */;\n            patchFlagText += `, ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[2048]}`;\n        }\n        root.codegenNode = createVNodeCall(context, helper(FRAGMENT), undefined, root.children, patchFlag + (( true) ? ` /* ${patchFlagText} */` : 0), undefined, undefined, true, undefined, false /* isComponent */);\n    }\n    else ;\n}\nfunction traverseChildren(parent, context) {\n    let i = 0;\n    const nodeRemoved = () => {\n        i--;\n    };\n    for (; i < parent.children.length; i++) {\n        const child = parent.children[i];\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(child))\n            continue;\n        context.parent = parent;\n        context.childIndex = i;\n        context.onNodeRemoved = nodeRemoved;\n        traverseNode(child, context);\n    }\n}\nfunction traverseNode(node, context) {\n    context.currentNode = node;\n    // apply transform plugins\n    const { nodeTransforms } = context;\n    const exitFns = [];\n    for (let i = 0; i < nodeTransforms.length; i++) {\n        const onExit = nodeTransforms[i](node, context);\n        if (onExit) {\n            if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(onExit)) {\n                exitFns.push(...onExit);\n            }\n            else {\n                exitFns.push(onExit);\n            }\n        }\n        if (!context.currentNode) {\n            // node was removed\n            return;\n        }\n        else {\n            // node may have been replaced\n            node = context.currentNode;\n        }\n    }\n    switch (node.type) {\n        case 3 /* NodeTypes.COMMENT */:\n            if (!context.ssr) {\n                // inject import for the Comment symbol, which is needed for creating\n                // comment nodes with `createVNode`\n                context.helper(CREATE_COMMENT);\n            }\n            break;\n        case 5 /* NodeTypes.INTERPOLATION */:\n            // no need to traverse, but we need to inject toString helper\n            if (!context.ssr) {\n                context.helper(TO_DISPLAY_STRING);\n            }\n            break;\n        // for container types, further traverse downwards\n        case 9 /* NodeTypes.IF */:\n            for (let i = 0; i < node.branches.length; i++) {\n                traverseNode(node.branches[i], context);\n            }\n            break;\n        case 10 /* NodeTypes.IF_BRANCH */:\n        case 11 /* NodeTypes.FOR */:\n        case 1 /* NodeTypes.ELEMENT */:\n        case 0 /* NodeTypes.ROOT */:\n            traverseChildren(node, context);\n            break;\n    }\n    // exit transforms\n    context.currentNode = node;\n    let i = exitFns.length;\n    while (i--) {\n        exitFns[i]();\n    }\n}\nfunction createStructuralDirectiveTransform(name, fn) {\n    const matches = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(name)\n        ? (n) => n === name\n        : (n) => name.test(n);\n    return (node, context) => {\n        if (node.type === 1 /* NodeTypes.ELEMENT */) {\n            const { props } = node;\n            // structural directive transforms are not concerned with slots\n            // as they are handled separately in vSlot.ts\n            if (node.tagType === 3 /* ElementTypes.TEMPLATE */ && props.some(isVSlot)) {\n                return;\n            }\n            const exitFns = [];\n            for (let i = 0; i < props.length; i++) {\n                const prop = props[i];\n                if (prop.type === 7 /* NodeTypes.DIRECTIVE */ && matches(prop.name)) {\n                    // structural directives are removed to avoid infinite recursion\n                    // also we remove them *before* applying so that it can further\n                    // traverse itself in case it moves the node around\n                    props.splice(i, 1);\n                    i--;\n                    const onExit = fn(node, prop, context);\n                    if (onExit)\n                        exitFns.push(onExit);\n                }\n            }\n            return exitFns;\n        }\n    };\n}\n\nconst PURE_ANNOTATION = `/*#__PURE__*/`;\nconst aliasHelper = (s) => `${helperNameMap[s]}: _${helperNameMap[s]}`;\nfunction createCodegenContext(ast, { mode = 'function', prefixIdentifiers = mode === 'module', sourceMap = false, filename = `template.vue.html`, scopeId = null, optimizeImports = false, runtimeGlobalName = `Vue`, runtimeModuleName = `vue`, ssrRuntimeModuleName = 'vue/server-renderer', ssr = false, isTS = false, inSSR = false }) {\n    const context = {\n        mode,\n        prefixIdentifiers,\n        sourceMap,\n        filename,\n        scopeId,\n        optimizeImports,\n        runtimeGlobalName,\n        runtimeModuleName,\n        ssrRuntimeModuleName,\n        ssr,\n        isTS,\n        inSSR,\n        source: ast.loc.source,\n        code: ``,\n        column: 1,\n        line: 1,\n        offset: 0,\n        indentLevel: 0,\n        pure: false,\n        map: undefined,\n        helper(key) {\n            return `_${helperNameMap[key]}`;\n        },\n        push(code, node) {\n            context.code += code;\n        },\n        indent() {\n            newline(++context.indentLevel);\n        },\n        deindent(withoutNewLine = false) {\n            if (withoutNewLine) {\n                --context.indentLevel;\n            }\n            else {\n                newline(--context.indentLevel);\n            }\n        },\n        newline() {\n            newline(context.indentLevel);\n        }\n    };\n    function newline(n) {\n        context.push('\\n' + `  `.repeat(n));\n    }\n    return context;\n}\nfunction generate(ast, options = {}) {\n    const context = createCodegenContext(ast, options);\n    if (options.onContextCreated)\n        options.onContextCreated(context);\n    const { mode, push, prefixIdentifiers, indent, deindent, newline, scopeId, ssr } = context;\n    const helpers = Array.from(ast.helpers);\n    const hasHelpers = helpers.length > 0;\n    const useWithBlock = !prefixIdentifiers && mode !== 'module';\n    const isSetupInlined = !true ;\n    // preambles\n    // in setup() inline mode, the preamble is generated in a sub context\n    // and returned separately.\n    const preambleContext = isSetupInlined\n        ? createCodegenContext(ast, options)\n        : context;\n    {\n        genFunctionPreamble(ast, preambleContext);\n    }\n    // enter render function\n    const functionName = ssr ? `ssrRender` : `render`;\n    const args = ssr ? ['_ctx', '_push', '_parent', '_attrs'] : ['_ctx', '_cache'];\n    const signature = args.join(', ');\n    {\n        push(`function ${functionName}(${signature}) {`);\n    }\n    indent();\n    if (useWithBlock) {\n        push(`with (_ctx) {`);\n        indent();\n        // function mode const declarations should be inside with block\n        // also they should be renamed to avoid collision with user properties\n        if (hasHelpers) {\n            push(`const { ${helpers.map(aliasHelper).join(', ')} } = _Vue`);\n            push(`\\n`);\n            newline();\n        }\n    }\n    // generate asset resolution statements\n    if (ast.components.length) {\n        genAssets(ast.components, 'component', context);\n        if (ast.directives.length || ast.temps > 0) {\n            newline();\n        }\n    }\n    if (ast.directives.length) {\n        genAssets(ast.directives, 'directive', context);\n        if (ast.temps > 0) {\n            newline();\n        }\n    }\n    if (ast.filters && ast.filters.length) {\n        newline();\n        genAssets(ast.filters, 'filter', context);\n        newline();\n    }\n    if (ast.temps > 0) {\n        push(`let `);\n        for (let i = 0; i < ast.temps; i++) {\n            push(`${i > 0 ? `, ` : ``}_temp${i}`);\n        }\n    }\n    if (ast.components.length || ast.directives.length || ast.temps) {\n        push(`\\n`);\n        newline();\n    }\n    // generate the VNode tree expression\n    if (!ssr) {\n        push(`return `);\n    }\n    if (ast.codegenNode) {\n        genNode(ast.codegenNode, context);\n    }\n    else {\n        push(`null`);\n    }\n    if (useWithBlock) {\n        deindent();\n        push(`}`);\n    }\n    deindent();\n    push(`}`);\n    return {\n        ast,\n        code: context.code,\n        preamble: isSetupInlined ? preambleContext.code : ``,\n        // SourceMapGenerator does have toJSON() method but it's not in the types\n        map: context.map ? context.map.toJSON() : undefined\n    };\n}\nfunction genFunctionPreamble(ast, context) {\n    const { ssr, prefixIdentifiers, push, newline, runtimeModuleName, runtimeGlobalName, ssrRuntimeModuleName } = context;\n    const VueBinding = runtimeGlobalName;\n    // Generate const declaration for helpers\n    // In prefix mode, we place the const declaration at top so it's done\n    // only once; But if we not prefixing, we place the declaration inside the\n    // with block so it doesn't incur the `in` check cost for every helper access.\n    const helpers = Array.from(ast.helpers);\n    if (helpers.length > 0) {\n        {\n            // \"with\" mode.\n            // save Vue in a separate variable to avoid collision\n            push(`const _Vue = ${VueBinding}\\n`);\n            // in \"with\" mode, helpers are declared inside the with block to avoid\n            // has check cost, but hoists are lifted out of the function - we need\n            // to provide the helper here.\n            if (ast.hoists.length) {\n                const staticHelpers = [\n                    CREATE_VNODE,\n                    CREATE_ELEMENT_VNODE,\n                    CREATE_COMMENT,\n                    CREATE_TEXT,\n                    CREATE_STATIC\n                ]\n                    .filter(helper => helpers.includes(helper))\n                    .map(aliasHelper)\n                    .join(', ');\n                push(`const { ${staticHelpers} } = _Vue\\n`);\n            }\n        }\n    }\n    genHoists(ast.hoists, context);\n    newline();\n    push(`return `);\n}\nfunction genAssets(assets, type, { helper, push, newline, isTS }) {\n    const resolver = helper(type === 'filter'\n        ? RESOLVE_FILTER\n        : type === 'component'\n            ? RESOLVE_COMPONENT\n            : RESOLVE_DIRECTIVE);\n    for (let i = 0; i < assets.length; i++) {\n        let id = assets[i];\n        // potential component implicit self-reference inferred from SFC filename\n        const maybeSelfReference = id.endsWith('__self');\n        if (maybeSelfReference) {\n            id = id.slice(0, -6);\n        }\n        push(`const ${toValidAssetId(id, type)} = ${resolver}(${JSON.stringify(id)}${maybeSelfReference ? `, true` : ``})${isTS ? `!` : ``}`);\n        if (i < assets.length - 1) {\n            newline();\n        }\n    }\n}\nfunction genHoists(hoists, context) {\n    if (!hoists.length) {\n        return;\n    }\n    context.pure = true;\n    const { push, newline, helper, scopeId, mode } = context;\n    newline();\n    for (let i = 0; i < hoists.length; i++) {\n        const exp = hoists[i];\n        if (exp) {\n            push(`const _hoisted_${i + 1} = ${``}`);\n            genNode(exp, context);\n            newline();\n        }\n    }\n    context.pure = false;\n}\nfunction isText(n) {\n    return ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(n) ||\n        n.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ ||\n        n.type === 2 /* NodeTypes.TEXT */ ||\n        n.type === 5 /* NodeTypes.INTERPOLATION */ ||\n        n.type === 8 /* NodeTypes.COMPOUND_EXPRESSION */);\n}\nfunction genNodeListAsArray(nodes, context) {\n    const multilines = nodes.length > 3 ||\n        ((( true)) && nodes.some(n => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(n) || !isText(n)));\n    context.push(`[`);\n    multilines && context.indent();\n    genNodeList(nodes, context, multilines);\n    multilines && context.deindent();\n    context.push(`]`);\n}\nfunction genNodeList(nodes, context, multilines = false, comma = true) {\n    const { push, newline } = context;\n    for (let i = 0; i < nodes.length; i++) {\n        const node = nodes[i];\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(node)) {\n            push(node);\n        }\n        else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(node)) {\n            genNodeListAsArray(node, context);\n        }\n        else {\n            genNode(node, context);\n        }\n        if (i < nodes.length - 1) {\n            if (multilines) {\n                comma && push(',');\n                newline();\n            }\n            else {\n                comma && push(', ');\n            }\n        }\n    }\n}\nfunction genNode(node, context) {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(node)) {\n        context.push(node);\n        return;\n    }\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(node)) {\n        context.push(context.helper(node));\n        return;\n    }\n    switch (node.type) {\n        case 1 /* NodeTypes.ELEMENT */:\n        case 9 /* NodeTypes.IF */:\n        case 11 /* NodeTypes.FOR */:\n            ( true) &&\n                assert(node.codegenNode != null, `Codegen node is missing for element/if/for node. ` +\n                    `Apply appropriate transforms first.`);\n            genNode(node.codegenNode, context);\n            break;\n        case 2 /* NodeTypes.TEXT */:\n            genText(node, context);\n            break;\n        case 4 /* NodeTypes.SIMPLE_EXPRESSION */:\n            genExpression(node, context);\n            break;\n        case 5 /* NodeTypes.INTERPOLATION */:\n            genInterpolation(node, context);\n            break;\n        case 12 /* NodeTypes.TEXT_CALL */:\n            genNode(node.codegenNode, context);\n            break;\n        case 8 /* NodeTypes.COMPOUND_EXPRESSION */:\n            genCompoundExpression(node, context);\n            break;\n        case 3 /* NodeTypes.COMMENT */:\n            genComment(node, context);\n            break;\n        case 13 /* NodeTypes.VNODE_CALL */:\n            genVNodeCall(node, context);\n            break;\n        case 14 /* NodeTypes.JS_CALL_EXPRESSION */:\n            genCallExpression(node, context);\n            break;\n        case 15 /* NodeTypes.JS_OBJECT_EXPRESSION */:\n            genObjectExpression(node, context);\n            break;\n        case 17 /* NodeTypes.JS_ARRAY_EXPRESSION */:\n            genArrayExpression(node, context);\n            break;\n        case 18 /* NodeTypes.JS_FUNCTION_EXPRESSION */:\n            genFunctionExpression(node, context);\n            break;\n        case 19 /* NodeTypes.JS_CONDITIONAL_EXPRESSION */:\n            genConditionalExpression(node, context);\n            break;\n        case 20 /* NodeTypes.JS_CACHE_EXPRESSION */:\n            genCacheExpression(node, context);\n            break;\n        case 21 /* NodeTypes.JS_BLOCK_STATEMENT */:\n            genNodeList(node.body, context, true, false);\n            break;\n        // SSR only types\n        case 22 /* NodeTypes.JS_TEMPLATE_LITERAL */:\n            break;\n        case 23 /* NodeTypes.JS_IF_STATEMENT */:\n            break;\n        case 24 /* NodeTypes.JS_ASSIGNMENT_EXPRESSION */:\n            break;\n        case 25 /* NodeTypes.JS_SEQUENCE_EXPRESSION */:\n            break;\n        case 26 /* NodeTypes.JS_RETURN_STATEMENT */:\n            break;\n        /* istanbul ignore next */\n        case 10 /* NodeTypes.IF_BRANCH */:\n            // noop\n            break;\n        default:\n            if ((true)) {\n                assert(false, `unhandled codegen node type: ${node.type}`);\n                // make sure we exhaust all possible types\n                const exhaustiveCheck = node;\n                return exhaustiveCheck;\n            }\n    }\n}\nfunction genText(node, context) {\n    context.push(JSON.stringify(node.content), node);\n}\nfunction genExpression(node, context) {\n    const { content, isStatic } = node;\n    context.push(isStatic ? JSON.stringify(content) : content, node);\n}\nfunction genInterpolation(node, context) {\n    const { push, helper, pure } = context;\n    if (pure)\n        push(PURE_ANNOTATION);\n    push(`${helper(TO_DISPLAY_STRING)}(`);\n    genNode(node.content, context);\n    push(`)`);\n}\nfunction genCompoundExpression(node, context) {\n    for (let i = 0; i < node.children.length; i++) {\n        const child = node.children[i];\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(child)) {\n            context.push(child);\n        }\n        else {\n            genNode(child, context);\n        }\n    }\n}\nfunction genExpressionAsPropertyKey(node, context) {\n    const { push } = context;\n    if (node.type === 8 /* NodeTypes.COMPOUND_EXPRESSION */) {\n        push(`[`);\n        genCompoundExpression(node, context);\n        push(`]`);\n    }\n    else if (node.isStatic) {\n        // only quote keys if necessary\n        const text = isSimpleIdentifier(node.content)\n            ? node.content\n            : JSON.stringify(node.content);\n        push(text, node);\n    }\n    else {\n        push(`[${node.content}]`, node);\n    }\n}\nfunction genComment(node, context) {\n    const { push, helper, pure } = context;\n    if (pure) {\n        push(PURE_ANNOTATION);\n    }\n    push(`${helper(CREATE_COMMENT)}(${JSON.stringify(node.content)})`, node);\n}\nfunction genVNodeCall(node, context) {\n    const { push, helper, pure } = context;\n    const { tag, props, children, patchFlag, dynamicProps, directives, isBlock, disableTracking, isComponent } = node;\n    if (directives) {\n        push(helper(WITH_DIRECTIVES) + `(`);\n    }\n    if (isBlock) {\n        push(`(${helper(OPEN_BLOCK)}(${disableTracking ? `true` : ``}), `);\n    }\n    if (pure) {\n        push(PURE_ANNOTATION);\n    }\n    const callHelper = isBlock\n        ? getVNodeBlockHelper(context.inSSR, isComponent)\n        : getVNodeHelper(context.inSSR, isComponent);\n    push(helper(callHelper) + `(`, node);\n    genNodeList(genNullableArgs([tag, props, children, patchFlag, dynamicProps]), context);\n    push(`)`);\n    if (isBlock) {\n        push(`)`);\n    }\n    if (directives) {\n        push(`, `);\n        genNode(directives, context);\n        push(`)`);\n    }\n}\nfunction genNullableArgs(args) {\n    let i = args.length;\n    while (i--) {\n        if (args[i] != null)\n            break;\n    }\n    return args.slice(0, i + 1).map(arg => arg || `null`);\n}\n// JavaScript\nfunction genCallExpression(node, context) {\n    const { push, helper, pure } = context;\n    const callee = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(node.callee) ? node.callee : helper(node.callee);\n    if (pure) {\n        push(PURE_ANNOTATION);\n    }\n    push(callee + `(`, node);\n    genNodeList(node.arguments, context);\n    push(`)`);\n}\nfunction genObjectExpression(node, context) {\n    const { push, indent, deindent, newline } = context;\n    const { properties } = node;\n    if (!properties.length) {\n        push(`{}`, node);\n        return;\n    }\n    const multilines = properties.length > 1 ||\n        ((( true)) &&\n            properties.some(p => p.value.type !== 4 /* NodeTypes.SIMPLE_EXPRESSION */));\n    push(multilines ? `{` : `{ `);\n    multilines && indent();\n    for (let i = 0; i < properties.length; i++) {\n        const { key, value } = properties[i];\n        // key\n        genExpressionAsPropertyKey(key, context);\n        push(`: `);\n        // value\n        genNode(value, context);\n        if (i < properties.length - 1) {\n            // will only reach this if it's multilines\n            push(`,`);\n            newline();\n        }\n    }\n    multilines && deindent();\n    push(multilines ? `}` : ` }`);\n}\nfunction genArrayExpression(node, context) {\n    genNodeListAsArray(node.elements, context);\n}\nfunction genFunctionExpression(node, context) {\n    const { push, indent, deindent } = context;\n    const { params, returns, body, newline, isSlot } = node;\n    if (isSlot) {\n        // wrap slot functions with owner context\n        push(`_${helperNameMap[WITH_CTX]}(`);\n    }\n    push(`(`, node);\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(params)) {\n        genNodeList(params, context);\n    }\n    else if (params) {\n        genNode(params, context);\n    }\n    push(`) => `);\n    if (newline || body) {\n        push(`{`);\n        indent();\n    }\n    if (returns) {\n        if (newline) {\n            push(`return `);\n        }\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(returns)) {\n            genNodeListAsArray(returns, context);\n        }\n        else {\n            genNode(returns, context);\n        }\n    }\n    else if (body) {\n        genNode(body, context);\n    }\n    if (newline || body) {\n        deindent();\n        push(`}`);\n    }\n    if (isSlot) {\n        if (node.isNonScopedSlot) {\n            push(`, undefined, true`);\n        }\n        push(`)`);\n    }\n}\nfunction genConditionalExpression(node, context) {\n    const { test, consequent, alternate, newline: needNewline } = node;\n    const { push, indent, deindent, newline } = context;\n    if (test.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */) {\n        const needsParens = !isSimpleIdentifier(test.content);\n        needsParens && push(`(`);\n        genExpression(test, context);\n        needsParens && push(`)`);\n    }\n    else {\n        push(`(`);\n        genNode(test, context);\n        push(`)`);\n    }\n    needNewline && indent();\n    context.indentLevel++;\n    needNewline || push(` `);\n    push(`? `);\n    genNode(consequent, context);\n    context.indentLevel--;\n    needNewline && newline();\n    needNewline || push(` `);\n    push(`: `);\n    const isNested = alternate.type === 19 /* NodeTypes.JS_CONDITIONAL_EXPRESSION */;\n    if (!isNested) {\n        context.indentLevel++;\n    }\n    genNode(alternate, context);\n    if (!isNested) {\n        context.indentLevel--;\n    }\n    needNewline && deindent(true /* without newline */);\n}\nfunction genCacheExpression(node, context) {\n    const { push, helper, indent, deindent, newline } = context;\n    push(`_cache[${node.index}] || (`);\n    if (node.isVNode) {\n        indent();\n        push(`${helper(SET_BLOCK_TRACKING)}(-1),`);\n        newline();\n    }\n    push(`_cache[${node.index}] = `);\n    genNode(node.value, context);\n    if (node.isVNode) {\n        push(`,`);\n        newline();\n        push(`${helper(SET_BLOCK_TRACKING)}(1),`);\n        newline();\n        push(`_cache[${node.index}]`);\n        deindent();\n    }\n    push(`)`);\n}\n\nfunction walkIdentifiers(root, onIdentifier, includeAll = false, parentStack = [], knownIds = Object.create(null)) {\n    {\n        return;\n    }\n}\nfunction isReferencedIdentifier(id, parent, parentStack) {\n    {\n        return false;\n    }\n}\nfunction isInDestructureAssignment(parent, parentStack) {\n    if (parent &&\n        (parent.type === 'ObjectProperty' || parent.type === 'ArrayPattern')) {\n        let i = parentStack.length;\n        while (i--) {\n            const p = parentStack[i];\n            if (p.type === 'AssignmentExpression') {\n                return true;\n            }\n            else if (p.type !== 'ObjectProperty' && !p.type.endsWith('Pattern')) {\n                break;\n            }\n        }\n    }\n    return false;\n}\nfunction walkFunctionParams(node, onIdent) {\n    for (const p of node.params) {\n        for (const id of extractIdentifiers(p)) {\n            onIdent(id);\n        }\n    }\n}\nfunction walkBlockDeclarations(block, onIdent) {\n    for (const stmt of block.body) {\n        if (stmt.type === 'VariableDeclaration') {\n            if (stmt.declare)\n                continue;\n            for (const decl of stmt.declarations) {\n                for (const id of extractIdentifiers(decl.id)) {\n                    onIdent(id);\n                }\n            }\n        }\n        else if (stmt.type === 'FunctionDeclaration' ||\n            stmt.type === 'ClassDeclaration') {\n            if (stmt.declare || !stmt.id)\n                continue;\n            onIdent(stmt.id);\n        }\n    }\n}\nfunction extractIdentifiers(param, nodes = []) {\n    switch (param.type) {\n        case 'Identifier':\n            nodes.push(param);\n            break;\n        case 'MemberExpression':\n            let object = param;\n            while (object.type === 'MemberExpression') {\n                object = object.object;\n            }\n            nodes.push(object);\n            break;\n        case 'ObjectPattern':\n            for (const prop of param.properties) {\n                if (prop.type === 'RestElement') {\n                    extractIdentifiers(prop.argument, nodes);\n                }\n                else {\n                    extractIdentifiers(prop.value, nodes);\n                }\n            }\n            break;\n        case 'ArrayPattern':\n            param.elements.forEach(element => {\n                if (element)\n                    extractIdentifiers(element, nodes);\n            });\n            break;\n        case 'RestElement':\n            extractIdentifiers(param.argument, nodes);\n            break;\n        case 'AssignmentPattern':\n            extractIdentifiers(param.left, nodes);\n            break;\n    }\n    return nodes;\n}\nconst isFunctionType = (node) => {\n    return /Function(?:Expression|Declaration)$|Method$/.test(node.type);\n};\nconst isStaticProperty = (node) => node &&\n    (node.type === 'ObjectProperty' || node.type === 'ObjectMethod') &&\n    !node.computed;\nconst isStaticPropertyKey = (node, parent) => isStaticProperty(parent) && parent.key === node;\n\n// these keywords should not appear inside expressions, but operators like\n// 'typeof', 'instanceof', and 'in' are allowed\nconst prohibitedKeywordRE = new RegExp('\\\\b' +\n    ('arguments,await,break,case,catch,class,const,continue,debugger,default,' +\n        'delete,do,else,export,extends,finally,for,function,if,import,let,new,' +\n        'return,super,switch,throw,try,var,void,while,with,yield')\n        .split(',')\n        .join('\\\\b|\\\\b') +\n    '\\\\b');\n// strip strings in expressions\nconst stripStringRE = /'(?:[^'\\\\]|\\\\.)*'|\"(?:[^\"\\\\]|\\\\.)*\"|`(?:[^`\\\\]|\\\\.)*\\$\\{|\\}(?:[^`\\\\]|\\\\.)*`|`(?:[^`\\\\]|\\\\.)*`/g;\n/**\n * Validate a non-prefixed expression.\n * This is only called when using the in-browser runtime compiler since it\n * doesn't prefix expressions.\n */\nfunction validateBrowserExpression(node, context, asParams = false, asRawStatements = false) {\n    const exp = node.content;\n    // empty expressions are validated per-directive since some directives\n    // do allow empty expressions.\n    if (!exp.trim()) {\n        return;\n    }\n    try {\n        new Function(asRawStatements\n            ? ` ${exp} `\n            : `return ${asParams ? `(${exp}) => {}` : `(${exp})`}`);\n    }\n    catch (e) {\n        let message = e.message;\n        const keywordMatch = exp\n            .replace(stripStringRE, '')\n            .match(prohibitedKeywordRE);\n        if (keywordMatch) {\n            message = `avoid using JavaScript keyword as property name: \"${keywordMatch[0]}\"`;\n        }\n        context.onError(createCompilerError(45 /* ErrorCodes.X_INVALID_EXPRESSION */, node.loc, undefined, message));\n    }\n}\n\nconst transformExpression = (node, context) => {\n    if (node.type === 5 /* NodeTypes.INTERPOLATION */) {\n        node.content = processExpression(node.content, context);\n    }\n    else if (node.type === 1 /* NodeTypes.ELEMENT */) {\n        // handle directives on element\n        for (let i = 0; i < node.props.length; i++) {\n            const dir = node.props[i];\n            // do not process for v-on & v-for since they are special handled\n            if (dir.type === 7 /* NodeTypes.DIRECTIVE */ && dir.name !== 'for') {\n                const exp = dir.exp;\n                const arg = dir.arg;\n                // do not process exp if this is v-on:arg - we need special handling\n                // for wrapping inline statements.\n                if (exp &&\n                    exp.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ &&\n                    !(dir.name === 'on' && arg)) {\n                    dir.exp = processExpression(exp, context, \n                    // slot args must be processed as function params\n                    dir.name === 'slot');\n                }\n                if (arg && arg.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ && !arg.isStatic) {\n                    dir.arg = processExpression(arg, context);\n                }\n            }\n        }\n    }\n};\n// Important: since this function uses Node.js only dependencies, it should\n// always be used with a leading !true check so that it can be\n// tree-shaken from the browser build.\nfunction processExpression(node, context, \n// some expressions like v-slot props & v-for aliases should be parsed as\n// function params\nasParams = false, \n// v-on handler values may contain multiple statements\nasRawStatements = false, localVars = Object.create(context.identifiers)) {\n    {\n        if ((true)) {\n            // simple in-browser validation (same logic in 2.x)\n            validateBrowserExpression(node, context, asParams, asRawStatements);\n        }\n        return node;\n    }\n}\nfunction stringifyExpression(exp) {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(exp)) {\n        return exp;\n    }\n    else if (exp.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */) {\n        return exp.content;\n    }\n    else {\n        return exp.children\n            .map(stringifyExpression)\n            .join('');\n    }\n}\n\nconst transformIf = createStructuralDirectiveTransform(/^(if|else|else-if)$/, (node, dir, context) => {\n    return processIf(node, dir, context, (ifNode, branch, isRoot) => {\n        // #1587: We need to dynamically increment the key based on the current\n        // node's sibling nodes, since chained v-if/else branches are\n        // rendered at the same depth\n        const siblings = context.parent.children;\n        let i = siblings.indexOf(ifNode);\n        let key = 0;\n        while (i-- >= 0) {\n            const sibling = siblings[i];\n            if (sibling && sibling.type === 9 /* NodeTypes.IF */) {\n                key += sibling.branches.length;\n            }\n        }\n        // Exit callback. Complete the codegenNode when all children have been\n        // transformed.\n        return () => {\n            if (isRoot) {\n                ifNode.codegenNode = createCodegenNodeForBranch(branch, key, context);\n            }\n            else {\n                // attach this branch's codegen node to the v-if root.\n                const parentCondition = getParentCondition(ifNode.codegenNode);\n                parentCondition.alternate = createCodegenNodeForBranch(branch, key + ifNode.branches.length - 1, context);\n            }\n        };\n    });\n});\n// target-agnostic transform used for both Client and SSR\nfunction processIf(node, dir, context, processCodegen) {\n    if (dir.name !== 'else' &&\n        (!dir.exp || !dir.exp.content.trim())) {\n        const loc = dir.exp ? dir.exp.loc : node.loc;\n        context.onError(createCompilerError(28 /* ErrorCodes.X_V_IF_NO_EXPRESSION */, dir.loc));\n        dir.exp = createSimpleExpression(`true`, false, loc);\n    }\n    if ( true && dir.exp) {\n        validateBrowserExpression(dir.exp, context);\n    }\n    if (dir.name === 'if') {\n        const branch = createIfBranch(node, dir);\n        const ifNode = {\n            type: 9 /* NodeTypes.IF */,\n            loc: node.loc,\n            branches: [branch]\n        };\n        context.replaceNode(ifNode);\n        if (processCodegen) {\n            return processCodegen(ifNode, branch, true);\n        }\n    }\n    else {\n        // locate the adjacent v-if\n        const siblings = context.parent.children;\n        const comments = [];\n        let i = siblings.indexOf(node);\n        while (i-- >= -1) {\n            const sibling = siblings[i];\n            if (sibling && sibling.type === 3 /* NodeTypes.COMMENT */) {\n                context.removeNode(sibling);\n                ( true) && comments.unshift(sibling);\n                continue;\n            }\n            if (sibling &&\n                sibling.type === 2 /* NodeTypes.TEXT */ &&\n                !sibling.content.trim().length) {\n                context.removeNode(sibling);\n                continue;\n            }\n            if (sibling && sibling.type === 9 /* NodeTypes.IF */) {\n                // Check if v-else was followed by v-else-if\n                if (dir.name === 'else-if' &&\n                    sibling.branches[sibling.branches.length - 1].condition === undefined) {\n                    context.onError(createCompilerError(30 /* ErrorCodes.X_V_ELSE_NO_ADJACENT_IF */, node.loc));\n                }\n                // move the node to the if node's branches\n                context.removeNode();\n                const branch = createIfBranch(node, dir);\n                if (( true) &&\n                    comments.length &&\n                    // #3619 ignore comments if the v-if is direct child of <transition>\n                    !(context.parent &&\n                        context.parent.type === 1 /* NodeTypes.ELEMENT */ &&\n                        isBuiltInType(context.parent.tag, 'transition'))) {\n                    branch.children = [...comments, ...branch.children];\n                }\n                // check if user is forcing same key on different branches\n                if (true) {\n                    const key = branch.userKey;\n                    if (key) {\n                        sibling.branches.forEach(({ userKey }) => {\n                            if (isSameKey(userKey, key)) {\n                                context.onError(createCompilerError(29 /* ErrorCodes.X_V_IF_SAME_KEY */, branch.userKey.loc));\n                            }\n                        });\n                    }\n                }\n                sibling.branches.push(branch);\n                const onExit = processCodegen && processCodegen(sibling, branch, false);\n                // since the branch was removed, it will not be traversed.\n                // make sure to traverse here.\n                traverseNode(branch, context);\n                // call on exit\n                if (onExit)\n                    onExit();\n                // make sure to reset currentNode after traversal to indicate this\n                // node has been removed.\n                context.currentNode = null;\n            }\n            else {\n                context.onError(createCompilerError(30 /* ErrorCodes.X_V_ELSE_NO_ADJACENT_IF */, node.loc));\n            }\n            break;\n        }\n    }\n}\nfunction createIfBranch(node, dir) {\n    const isTemplateIf = node.tagType === 3 /* ElementTypes.TEMPLATE */;\n    return {\n        type: 10 /* NodeTypes.IF_BRANCH */,\n        loc: node.loc,\n        condition: dir.name === 'else' ? undefined : dir.exp,\n        children: isTemplateIf && !findDir(node, 'for') ? node.children : [node],\n        userKey: findProp(node, `key`),\n        isTemplateIf\n    };\n}\nfunction createCodegenNodeForBranch(branch, keyIndex, context) {\n    if (branch.condition) {\n        return createConditionalExpression(branch.condition, createChildrenCodegenNode(branch, keyIndex, context), \n        // make sure to pass in asBlock: true so that the comment node call\n        // closes the current block.\n        createCallExpression(context.helper(CREATE_COMMENT), [\n            ( true) ? '\"v-if\"' : 0,\n            'true'\n        ]));\n    }\n    else {\n        return createChildrenCodegenNode(branch, keyIndex, context);\n    }\n}\nfunction createChildrenCodegenNode(branch, keyIndex, context) {\n    const { helper } = context;\n    const keyProperty = createObjectProperty(`key`, createSimpleExpression(`${keyIndex}`, false, locStub, 2 /* ConstantTypes.CAN_HOIST */));\n    const { children } = branch;\n    const firstChild = children[0];\n    const needFragmentWrapper = children.length !== 1 || firstChild.type !== 1 /* NodeTypes.ELEMENT */;\n    if (needFragmentWrapper) {\n        if (children.length === 1 && firstChild.type === 11 /* NodeTypes.FOR */) {\n            // optimize away nested fragments when child is a ForNode\n            const vnodeCall = firstChild.codegenNode;\n            injectProp(vnodeCall, keyProperty, context);\n            return vnodeCall;\n        }\n        else {\n            let patchFlag = 64 /* PatchFlags.STABLE_FRAGMENT */;\n            let patchFlagText = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[64];\n            // check if the fragment actually contains a single valid child with\n            // the rest being comments\n            if (( true) &&\n                !branch.isTemplateIf &&\n                children.filter(c => c.type !== 3 /* NodeTypes.COMMENT */).length === 1) {\n                patchFlag |= 2048 /* PatchFlags.DEV_ROOT_FRAGMENT */;\n                patchFlagText += `, ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[2048]}`;\n            }\n            return createVNodeCall(context, helper(FRAGMENT), createObjectExpression([keyProperty]), children, patchFlag + (( true) ? ` /* ${patchFlagText} */` : 0), undefined, undefined, true, false, false /* isComponent */, branch.loc);\n        }\n    }\n    else {\n        const ret = firstChild.codegenNode;\n        const vnodeCall = getMemoedVNodeCall(ret);\n        // Change createVNode to createBlock.\n        if (vnodeCall.type === 13 /* NodeTypes.VNODE_CALL */) {\n            makeBlock(vnodeCall, context);\n        }\n        // inject branch key\n        injectProp(vnodeCall, keyProperty, context);\n        return ret;\n    }\n}\nfunction isSameKey(a, b) {\n    if (!a || a.type !== b.type) {\n        return false;\n    }\n    if (a.type === 6 /* NodeTypes.ATTRIBUTE */) {\n        if (a.value.content !== b.value.content) {\n            return false;\n        }\n    }\n    else {\n        // directive\n        const exp = a.exp;\n        const branchExp = b.exp;\n        if (exp.type !== branchExp.type) {\n            return false;\n        }\n        if (exp.type !== 4 /* NodeTypes.SIMPLE_EXPRESSION */ ||\n            exp.isStatic !== branchExp.isStatic ||\n            exp.content !== branchExp.content) {\n            return false;\n        }\n    }\n    return true;\n}\nfunction getParentCondition(node) {\n    while (true) {\n        if (node.type === 19 /* NodeTypes.JS_CONDITIONAL_EXPRESSION */) {\n            if (node.alternate.type === 19 /* NodeTypes.JS_CONDITIONAL_EXPRESSION */) {\n                node = node.alternate;\n            }\n            else {\n                return node;\n            }\n        }\n        else if (node.type === 20 /* NodeTypes.JS_CACHE_EXPRESSION */) {\n            node = node.value;\n        }\n    }\n}\n\nconst transformFor = createStructuralDirectiveTransform('for', (node, dir, context) => {\n    const { helper, removeHelper } = context;\n    return processFor(node, dir, context, forNode => {\n        // create the loop render function expression now, and add the\n        // iterator on exit after all children have been traversed\n        const renderExp = createCallExpression(helper(RENDER_LIST), [\n            forNode.source\n        ]);\n        const isTemplate = isTemplateNode(node);\n        const memo = findDir(node, 'memo');\n        const keyProp = findProp(node, `key`);\n        const keyExp = keyProp &&\n            (keyProp.type === 6 /* NodeTypes.ATTRIBUTE */\n                ? createSimpleExpression(keyProp.value.content, true)\n                : keyProp.exp);\n        const keyProperty = keyProp ? createObjectProperty(`key`, keyExp) : null;\n        const isStableFragment = forNode.source.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ &&\n            forNode.source.constType > 0 /* ConstantTypes.NOT_CONSTANT */;\n        const fragmentFlag = isStableFragment\n            ? 64 /* PatchFlags.STABLE_FRAGMENT */\n            : keyProp\n                ? 128 /* PatchFlags.KEYED_FRAGMENT */\n                : 256 /* PatchFlags.UNKEYED_FRAGMENT */;\n        forNode.codegenNode = createVNodeCall(context, helper(FRAGMENT), undefined, renderExp, fragmentFlag +\n            (( true) ? ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[fragmentFlag]} */` : 0), undefined, undefined, true /* isBlock */, !isStableFragment /* disableTracking */, false /* isComponent */, node.loc);\n        return () => {\n            // finish the codegen now that all children have been traversed\n            let childBlock;\n            const { children } = forNode;\n            // check <template v-for> key placement\n            if (( true) && isTemplate) {\n                node.children.some(c => {\n                    if (c.type === 1 /* NodeTypes.ELEMENT */) {\n                        const key = findProp(c, 'key');\n                        if (key) {\n                            context.onError(createCompilerError(33 /* ErrorCodes.X_V_FOR_TEMPLATE_KEY_PLACEMENT */, key.loc));\n                            return true;\n                        }\n                    }\n                });\n            }\n            const needFragmentWrapper = children.length !== 1 || children[0].type !== 1 /* NodeTypes.ELEMENT */;\n            const slotOutlet = isSlotOutlet(node)\n                ? node\n                : isTemplate &&\n                    node.children.length === 1 &&\n                    isSlotOutlet(node.children[0])\n                    ? node.children[0] // api-extractor somehow fails to infer this\n                    : null;\n            if (slotOutlet) {\n                // <slot v-for=\"...\"> or <template v-for=\"...\"><slot/></template>\n                childBlock = slotOutlet.codegenNode;\n                if (isTemplate && keyProperty) {\n                    // <template v-for=\"...\" :key=\"...\"><slot/></template>\n                    // we need to inject the key to the renderSlot() call.\n                    // the props for renderSlot is passed as the 3rd argument.\n                    injectProp(childBlock, keyProperty, context);\n                }\n            }\n            else if (needFragmentWrapper) {\n                // <template v-for=\"...\"> with text or multi-elements\n                // should generate a fragment block for each loop\n                childBlock = createVNodeCall(context, helper(FRAGMENT), keyProperty ? createObjectExpression([keyProperty]) : undefined, node.children, 64 /* PatchFlags.STABLE_FRAGMENT */ +\n                    (( true)\n                        ? ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[64]} */`\n                        : 0), undefined, undefined, true, undefined, false /* isComponent */);\n            }\n            else {\n                // Normal element v-for. Directly use the child's codegenNode\n                // but mark it as a block.\n                childBlock = children[0]\n                    .codegenNode;\n                if (isTemplate && keyProperty) {\n                    injectProp(childBlock, keyProperty, context);\n                }\n                if (childBlock.isBlock !== !isStableFragment) {\n                    if (childBlock.isBlock) {\n                        // switch from block to vnode\n                        removeHelper(OPEN_BLOCK);\n                        removeHelper(getVNodeBlockHelper(context.inSSR, childBlock.isComponent));\n                    }\n                    else {\n                        // switch from vnode to block\n                        removeHelper(getVNodeHelper(context.inSSR, childBlock.isComponent));\n                    }\n                }\n                childBlock.isBlock = !isStableFragment;\n                if (childBlock.isBlock) {\n                    helper(OPEN_BLOCK);\n                    helper(getVNodeBlockHelper(context.inSSR, childBlock.isComponent));\n                }\n                else {\n                    helper(getVNodeHelper(context.inSSR, childBlock.isComponent));\n                }\n            }\n            if (memo) {\n                const loop = createFunctionExpression(createForLoopParams(forNode.parseResult, [\n                    createSimpleExpression(`_cached`)\n                ]));\n                loop.body = createBlockStatement([\n                    createCompoundExpression([`const _memo = (`, memo.exp, `)`]),\n                    createCompoundExpression([\n                        `if (_cached`,\n                        ...(keyExp ? [` && _cached.key === `, keyExp] : []),\n                        ` && ${context.helperString(IS_MEMO_SAME)}(_cached, _memo)) return _cached`\n                    ]),\n                    createCompoundExpression([`const _item = `, childBlock]),\n                    createSimpleExpression(`_item.memo = _memo`),\n                    createSimpleExpression(`return _item`)\n                ]);\n                renderExp.arguments.push(loop, createSimpleExpression(`_cache`), createSimpleExpression(String(context.cached++)));\n            }\n            else {\n                renderExp.arguments.push(createFunctionExpression(createForLoopParams(forNode.parseResult), childBlock, true /* force newline */));\n            }\n        };\n    });\n});\n// target-agnostic transform used for both Client and SSR\nfunction processFor(node, dir, context, processCodegen) {\n    if (!dir.exp) {\n        context.onError(createCompilerError(31 /* ErrorCodes.X_V_FOR_NO_EXPRESSION */, dir.loc));\n        return;\n    }\n    const parseResult = parseForExpression(\n    // can only be simple expression because vFor transform is applied\n    // before expression transform.\n    dir.exp, context);\n    if (!parseResult) {\n        context.onError(createCompilerError(32 /* ErrorCodes.X_V_FOR_MALFORMED_EXPRESSION */, dir.loc));\n        return;\n    }\n    const { addIdentifiers, removeIdentifiers, scopes } = context;\n    const { source, value, key, index } = parseResult;\n    const forNode = {\n        type: 11 /* NodeTypes.FOR */,\n        loc: dir.loc,\n        source,\n        valueAlias: value,\n        keyAlias: key,\n        objectIndexAlias: index,\n        parseResult,\n        children: isTemplateNode(node) ? node.children : [node]\n    };\n    context.replaceNode(forNode);\n    // bookkeeping\n    scopes.vFor++;\n    const onExit = processCodegen && processCodegen(forNode);\n    return () => {\n        scopes.vFor--;\n        if (onExit)\n            onExit();\n    };\n}\nconst forAliasRE = /([\\s\\S]*?)\\s+(?:in|of)\\s+([\\s\\S]*)/;\n// This regex doesn't cover the case if key or index aliases have destructuring,\n// but those do not make sense in the first place, so this works in practice.\nconst forIteratorRE = /,([^,\\}\\]]*)(?:,([^,\\}\\]]*))?$/;\nconst stripParensRE = /^\\(|\\)$/g;\nfunction parseForExpression(input, context) {\n    const loc = input.loc;\n    const exp = input.content;\n    const inMatch = exp.match(forAliasRE);\n    if (!inMatch)\n        return;\n    const [, LHS, RHS] = inMatch;\n    const result = {\n        source: createAliasExpression(loc, RHS.trim(), exp.indexOf(RHS, LHS.length)),\n        value: undefined,\n        key: undefined,\n        index: undefined\n    };\n    if (true) {\n        validateBrowserExpression(result.source, context);\n    }\n    let valueContent = LHS.trim().replace(stripParensRE, '').trim();\n    const trimmedOffset = LHS.indexOf(valueContent);\n    const iteratorMatch = valueContent.match(forIteratorRE);\n    if (iteratorMatch) {\n        valueContent = valueContent.replace(forIteratorRE, '').trim();\n        const keyContent = iteratorMatch[1].trim();\n        let keyOffset;\n        if (keyContent) {\n            keyOffset = exp.indexOf(keyContent, trimmedOffset + valueContent.length);\n            result.key = createAliasExpression(loc, keyContent, keyOffset);\n            if (true) {\n                validateBrowserExpression(result.key, context, true);\n            }\n        }\n        if (iteratorMatch[2]) {\n            const indexContent = iteratorMatch[2].trim();\n            if (indexContent) {\n                result.index = createAliasExpression(loc, indexContent, exp.indexOf(indexContent, result.key\n                    ? keyOffset + keyContent.length\n                    : trimmedOffset + valueContent.length));\n                if (true) {\n                    validateBrowserExpression(result.index, context, true);\n                }\n            }\n        }\n    }\n    if (valueContent) {\n        result.value = createAliasExpression(loc, valueContent, trimmedOffset);\n        if (true) {\n            validateBrowserExpression(result.value, context, true);\n        }\n    }\n    return result;\n}\nfunction createAliasExpression(range, content, offset) {\n    return createSimpleExpression(content, false, getInnerRange(range, offset, content.length));\n}\nfunction createForLoopParams({ value, key, index }, memoArgs = []) {\n    return createParamsList([value, key, index, ...memoArgs]);\n}\nfunction createParamsList(args) {\n    let i = args.length;\n    while (i--) {\n        if (args[i])\n            break;\n    }\n    return args\n        .slice(0, i + 1)\n        .map((arg, i) => arg || createSimpleExpression(`_`.repeat(i + 1), false));\n}\n\nconst defaultFallback = createSimpleExpression(`undefined`, false);\n// A NodeTransform that:\n// 1. Tracks scope identifiers for scoped slots so that they don't get prefixed\n//    by transformExpression. This is only applied in non-browser builds with\n//    { prefixIdentifiers: true }.\n// 2. Track v-slot depths so that we know a slot is inside another slot.\n//    Note the exit callback is executed before buildSlots() on the same node,\n//    so only nested slots see positive numbers.\nconst trackSlotScopes = (node, context) => {\n    if (node.type === 1 /* NodeTypes.ELEMENT */ &&\n        (node.tagType === 1 /* ElementTypes.COMPONENT */ ||\n            node.tagType === 3 /* ElementTypes.TEMPLATE */)) {\n        // We are only checking non-empty v-slot here\n        // since we only care about slots that introduce scope variables.\n        const vSlot = findDir(node, 'slot');\n        if (vSlot) {\n            vSlot.exp;\n            context.scopes.vSlot++;\n            return () => {\n                context.scopes.vSlot--;\n            };\n        }\n    }\n};\n// A NodeTransform that tracks scope identifiers for scoped slots with v-for.\n// This transform is only applied in non-browser builds with { prefixIdentifiers: true }\nconst trackVForSlotScopes = (node, context) => {\n    let vFor;\n    if (isTemplateNode(node) &&\n        node.props.some(isVSlot) &&\n        (vFor = findDir(node, 'for'))) {\n        const result = (vFor.parseResult = parseForExpression(vFor.exp, context));\n        if (result) {\n            const { value, key, index } = result;\n            const { addIdentifiers, removeIdentifiers } = context;\n            value && addIdentifiers(value);\n            key && addIdentifiers(key);\n            index && addIdentifiers(index);\n            return () => {\n                value && removeIdentifiers(value);\n                key && removeIdentifiers(key);\n                index && removeIdentifiers(index);\n            };\n        }\n    }\n};\nconst buildClientSlotFn = (props, children, loc) => createFunctionExpression(props, children, false /* newline */, true /* isSlot */, children.length ? children[0].loc : loc);\n// Instead of being a DirectiveTransform, v-slot processing is called during\n// transformElement to build the slots object for a component.\nfunction buildSlots(node, context, buildSlotFn = buildClientSlotFn) {\n    context.helper(WITH_CTX);\n    const { children, loc } = node;\n    const slotsProperties = [];\n    const dynamicSlots = [];\n    // If the slot is inside a v-for or another v-slot, force it to be dynamic\n    // since it likely uses a scope variable.\n    let hasDynamicSlots = context.scopes.vSlot > 0 || context.scopes.vFor > 0;\n    // 1. Check for slot with slotProps on component itself.\n    //    <Comp v-slot=\"{ prop }\"/>\n    const onComponentSlot = findDir(node, 'slot', true);\n    if (onComponentSlot) {\n        const { arg, exp } = onComponentSlot;\n        if (arg && !isStaticExp(arg)) {\n            hasDynamicSlots = true;\n        }\n        slotsProperties.push(createObjectProperty(arg || createSimpleExpression('default', true), buildSlotFn(exp, children, loc)));\n    }\n    // 2. Iterate through children and check for template slots\n    //    <template v-slot:foo=\"{ prop }\">\n    let hasTemplateSlots = false;\n    let hasNamedDefaultSlot = false;\n    const implicitDefaultChildren = [];\n    const seenSlotNames = new Set();\n    let conditionalBranchIndex = 0;\n    for (let i = 0; i < children.length; i++) {\n        const slotElement = children[i];\n        let slotDir;\n        if (!isTemplateNode(slotElement) ||\n            !(slotDir = findDir(slotElement, 'slot', true))) {\n            // not a <template v-slot>, skip.\n            if (slotElement.type !== 3 /* NodeTypes.COMMENT */) {\n                implicitDefaultChildren.push(slotElement);\n            }\n            continue;\n        }\n        if (onComponentSlot) {\n            // already has on-component slot - this is incorrect usage.\n            context.onError(createCompilerError(37 /* ErrorCodes.X_V_SLOT_MIXED_SLOT_USAGE */, slotDir.loc));\n            break;\n        }\n        hasTemplateSlots = true;\n        const { children: slotChildren, loc: slotLoc } = slotElement;\n        const { arg: slotName = createSimpleExpression(`default`, true), exp: slotProps, loc: dirLoc } = slotDir;\n        // check if name is dynamic.\n        let staticSlotName;\n        if (isStaticExp(slotName)) {\n            staticSlotName = slotName ? slotName.content : `default`;\n        }\n        else {\n            hasDynamicSlots = true;\n        }\n        const slotFunction = buildSlotFn(slotProps, slotChildren, slotLoc);\n        // check if this slot is conditional (v-if/v-for)\n        let vIf;\n        let vElse;\n        let vFor;\n        if ((vIf = findDir(slotElement, 'if'))) {\n            hasDynamicSlots = true;\n            dynamicSlots.push(createConditionalExpression(vIf.exp, buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++), defaultFallback));\n        }\n        else if ((vElse = findDir(slotElement, /^else(-if)?$/, true /* allowEmpty */))) {\n            // find adjacent v-if\n            let j = i;\n            let prev;\n            while (j--) {\n                prev = children[j];\n                if (prev.type !== 3 /* NodeTypes.COMMENT */) {\n                    break;\n                }\n            }\n            if (prev && isTemplateNode(prev) && findDir(prev, 'if')) {\n                // remove node\n                children.splice(i, 1);\n                i--;\n                // attach this slot to previous conditional\n                let conditional = dynamicSlots[dynamicSlots.length - 1];\n                while (conditional.alternate.type === 19 /* NodeTypes.JS_CONDITIONAL_EXPRESSION */) {\n                    conditional = conditional.alternate;\n                }\n                conditional.alternate = vElse.exp\n                    ? createConditionalExpression(vElse.exp, buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++), defaultFallback)\n                    : buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++);\n            }\n            else {\n                context.onError(createCompilerError(30 /* ErrorCodes.X_V_ELSE_NO_ADJACENT_IF */, vElse.loc));\n            }\n        }\n        else if ((vFor = findDir(slotElement, 'for'))) {\n            hasDynamicSlots = true;\n            const parseResult = vFor.parseResult ||\n                parseForExpression(vFor.exp, context);\n            if (parseResult) {\n                // Render the dynamic slots as an array and add it to the createSlot()\n                // args. The runtime knows how to handle it appropriately.\n                dynamicSlots.push(createCallExpression(context.helper(RENDER_LIST), [\n                    parseResult.source,\n                    createFunctionExpression(createForLoopParams(parseResult), buildDynamicSlot(slotName, slotFunction), true /* force newline */)\n                ]));\n            }\n            else {\n                context.onError(createCompilerError(32 /* ErrorCodes.X_V_FOR_MALFORMED_EXPRESSION */, vFor.loc));\n            }\n        }\n        else {\n            // check duplicate static names\n            if (staticSlotName) {\n                if (seenSlotNames.has(staticSlotName)) {\n                    context.onError(createCompilerError(38 /* ErrorCodes.X_V_SLOT_DUPLICATE_SLOT_NAMES */, dirLoc));\n                    continue;\n                }\n                seenSlotNames.add(staticSlotName);\n                if (staticSlotName === 'default') {\n                    hasNamedDefaultSlot = true;\n                }\n            }\n            slotsProperties.push(createObjectProperty(slotName, slotFunction));\n        }\n    }\n    if (!onComponentSlot) {\n        const buildDefaultSlotProperty = (props, children) => {\n            const fn = buildSlotFn(props, children, loc);\n            if (context.compatConfig) {\n                fn.isNonScopedSlot = true;\n            }\n            return createObjectProperty(`default`, fn);\n        };\n        if (!hasTemplateSlots) {\n            // implicit default slot (on component)\n            slotsProperties.push(buildDefaultSlotProperty(undefined, children));\n        }\n        else if (implicitDefaultChildren.length &&\n            // #3766\n            // with whitespace: 'preserve', whitespaces between slots will end up in\n            // implicitDefaultChildren. Ignore if all implicit children are whitespaces.\n            implicitDefaultChildren.some(node => isNonWhitespaceContent(node))) {\n            // implicit default slot (mixed with named slots)\n            if (hasNamedDefaultSlot) {\n                context.onError(createCompilerError(39 /* ErrorCodes.X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN */, implicitDefaultChildren[0].loc));\n            }\n            else {\n                slotsProperties.push(buildDefaultSlotProperty(undefined, implicitDefaultChildren));\n            }\n        }\n    }\n    const slotFlag = hasDynamicSlots\n        ? 2 /* SlotFlags.DYNAMIC */\n        : hasForwardedSlots(node.children)\n            ? 3 /* SlotFlags.FORWARDED */\n            : 1 /* SlotFlags.STABLE */;\n    let slots = createObjectExpression(slotsProperties.concat(createObjectProperty(`_`, \n    // 2 = compiled but dynamic = can skip normalization, but must run diff\n    // 1 = compiled and static = can skip normalization AND diff as optimized\n    createSimpleExpression(slotFlag + (( true) ? ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.slotFlagsText[slotFlag]} */` : 0), false))), loc);\n    if (dynamicSlots.length) {\n        slots = createCallExpression(context.helper(CREATE_SLOTS), [\n            slots,\n            createArrayExpression(dynamicSlots)\n        ]);\n    }\n    return {\n        slots,\n        hasDynamicSlots\n    };\n}\nfunction buildDynamicSlot(name, fn, index) {\n    const props = [\n        createObjectProperty(`name`, name),\n        createObjectProperty(`fn`, fn)\n    ];\n    if (index != null) {\n        props.push(createObjectProperty(`key`, createSimpleExpression(String(index), true)));\n    }\n    return createObjectExpression(props);\n}\nfunction hasForwardedSlots(children) {\n    for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n        switch (child.type) {\n            case 1 /* NodeTypes.ELEMENT */:\n                if (child.tagType === 2 /* ElementTypes.SLOT */ ||\n                    hasForwardedSlots(child.children)) {\n                    return true;\n                }\n                break;\n            case 9 /* NodeTypes.IF */:\n                if (hasForwardedSlots(child.branches))\n                    return true;\n                break;\n            case 10 /* NodeTypes.IF_BRANCH */:\n            case 11 /* NodeTypes.FOR */:\n                if (hasForwardedSlots(child.children))\n                    return true;\n                break;\n        }\n    }\n    return false;\n}\nfunction isNonWhitespaceContent(node) {\n    if (node.type !== 2 /* NodeTypes.TEXT */ && node.type !== 12 /* NodeTypes.TEXT_CALL */)\n        return true;\n    return node.type === 2 /* NodeTypes.TEXT */\n        ? !!node.content.trim()\n        : isNonWhitespaceContent(node.content);\n}\n\n// some directive transforms (e.g. v-model) may return a symbol for runtime\n// import, which should be used instead of a resolveDirective call.\nconst directiveImportMap = new WeakMap();\n// generate a JavaScript AST for this element's codegen\nconst transformElement = (node, context) => {\n    // perform the work on exit, after all child expressions have been\n    // processed and merged.\n    return function postTransformElement() {\n        node = context.currentNode;\n        if (!(node.type === 1 /* NodeTypes.ELEMENT */ &&\n            (node.tagType === 0 /* ElementTypes.ELEMENT */ ||\n                node.tagType === 1 /* ElementTypes.COMPONENT */))) {\n            return;\n        }\n        const { tag, props } = node;\n        const isComponent = node.tagType === 1 /* ElementTypes.COMPONENT */;\n        // The goal of the transform is to create a codegenNode implementing the\n        // VNodeCall interface.\n        let vnodeTag = isComponent\n            ? resolveComponentType(node, context)\n            : `\"${tag}\"`;\n        const isDynamicComponent = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(vnodeTag) && vnodeTag.callee === RESOLVE_DYNAMIC_COMPONENT;\n        let vnodeProps;\n        let vnodeChildren;\n        let vnodePatchFlag;\n        let patchFlag = 0;\n        let vnodeDynamicProps;\n        let dynamicPropNames;\n        let vnodeDirectives;\n        let shouldUseBlock = \n        // dynamic component may resolve to plain elements\n        isDynamicComponent ||\n            vnodeTag === TELEPORT ||\n            vnodeTag === SUSPENSE ||\n            (!isComponent &&\n                // <svg> and <foreignObject> must be forced into blocks so that block\n                // updates inside get proper isSVG flag at runtime. (#639, #643)\n                // This is technically web-specific, but splitting the logic out of core\n                // leads to too much unnecessary complexity.\n                (tag === 'svg' || tag === 'foreignObject'));\n        // props\n        if (props.length > 0) {\n            const propsBuildResult = buildProps(node, context, undefined, isComponent, isDynamicComponent);\n            vnodeProps = propsBuildResult.props;\n            patchFlag = propsBuildResult.patchFlag;\n            dynamicPropNames = propsBuildResult.dynamicPropNames;\n            const directives = propsBuildResult.directives;\n            vnodeDirectives =\n                directives && directives.length\n                    ? createArrayExpression(directives.map(dir => buildDirectiveArgs(dir, context)))\n                    : undefined;\n            if (propsBuildResult.shouldUseBlock) {\n                shouldUseBlock = true;\n            }\n        }\n        // children\n        if (node.children.length > 0) {\n            if (vnodeTag === KEEP_ALIVE) {\n                // Although a built-in component, we compile KeepAlive with raw children\n                // instead of slot functions so that it can be used inside Transition\n                // or other Transition-wrapping HOCs.\n                // To ensure correct updates with block optimizations, we need to:\n                // 1. Force keep-alive into a block. This avoids its children being\n                //    collected by a parent block.\n                shouldUseBlock = true;\n                // 2. Force keep-alive to always be updated, since it uses raw children.\n                patchFlag |= 1024 /* PatchFlags.DYNAMIC_SLOTS */;\n                if (( true) && node.children.length > 1) {\n                    context.onError(createCompilerError(46 /* ErrorCodes.X_KEEP_ALIVE_INVALID_CHILDREN */, {\n                        start: node.children[0].loc.start,\n                        end: node.children[node.children.length - 1].loc.end,\n                        source: ''\n                    }));\n                }\n            }\n            const shouldBuildAsSlots = isComponent &&\n                // Teleport is not a real component and has dedicated runtime handling\n                vnodeTag !== TELEPORT &&\n                // explained above.\n                vnodeTag !== KEEP_ALIVE;\n            if (shouldBuildAsSlots) {\n                const { slots, hasDynamicSlots } = buildSlots(node, context);\n                vnodeChildren = slots;\n                if (hasDynamicSlots) {\n                    patchFlag |= 1024 /* PatchFlags.DYNAMIC_SLOTS */;\n                }\n            }\n            else if (node.children.length === 1 && vnodeTag !== TELEPORT) {\n                const child = node.children[0];\n                const type = child.type;\n                // check for dynamic text children\n                const hasDynamicTextChild = type === 5 /* NodeTypes.INTERPOLATION */ ||\n                    type === 8 /* NodeTypes.COMPOUND_EXPRESSION */;\n                if (hasDynamicTextChild &&\n                    getConstantType(child, context) === 0 /* ConstantTypes.NOT_CONSTANT */) {\n                    patchFlag |= 1 /* PatchFlags.TEXT */;\n                }\n                // pass directly if the only child is a text node\n                // (plain / interpolation / expression)\n                if (hasDynamicTextChild || type === 2 /* NodeTypes.TEXT */) {\n                    vnodeChildren = child;\n                }\n                else {\n                    vnodeChildren = node.children;\n                }\n            }\n            else {\n                vnodeChildren = node.children;\n            }\n        }\n        // patchFlag & dynamicPropNames\n        if (patchFlag !== 0) {\n            if ((true)) {\n                if (patchFlag < 0) {\n                    // special flags (negative and mutually exclusive)\n                    vnodePatchFlag = patchFlag + ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[patchFlag]} */`;\n                }\n                else {\n                    // bitwise flags\n                    const flagNames = Object.keys(_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames)\n                        .map(Number)\n                        .filter(n => n > 0 && patchFlag & n)\n                        .map(n => _vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[n])\n                        .join(`, `);\n                    vnodePatchFlag = patchFlag + ` /* ${flagNames} */`;\n                }\n            }\n            else {}\n            if (dynamicPropNames && dynamicPropNames.length) {\n                vnodeDynamicProps = stringifyDynamicPropNames(dynamicPropNames);\n            }\n        }\n        node.codegenNode = createVNodeCall(context, vnodeTag, vnodeProps, vnodeChildren, vnodePatchFlag, vnodeDynamicProps, vnodeDirectives, !!shouldUseBlock, false /* disableTracking */, isComponent, node.loc);\n    };\n};\nfunction resolveComponentType(node, context, ssr = false) {\n    let { tag } = node;\n    // 1. dynamic component\n    const isExplicitDynamic = isComponentTag(tag);\n    const isProp = findProp(node, 'is');\n    if (isProp) {\n        if (isExplicitDynamic ||\n            (isCompatEnabled(\"COMPILER_IS_ON_ELEMENT\" /* CompilerDeprecationTypes.COMPILER_IS_ON_ELEMENT */, context))) {\n            const exp = isProp.type === 6 /* NodeTypes.ATTRIBUTE */\n                ? isProp.value && createSimpleExpression(isProp.value.content, true)\n                : isProp.exp;\n            if (exp) {\n                return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [\n                    exp\n                ]);\n            }\n        }\n        else if (isProp.type === 6 /* NodeTypes.ATTRIBUTE */ &&\n            isProp.value.content.startsWith('vue:')) {\n            // <button is=\"vue:xxx\">\n            // if not <component>, only is value that starts with \"vue:\" will be\n            // treated as component by the parse phase and reach here, unless it's\n            // compat mode where all is values are considered components\n            tag = isProp.value.content.slice(4);\n        }\n    }\n    // 1.5 v-is (TODO: Deprecate)\n    const isDir = !isExplicitDynamic && findDir(node, 'is');\n    if (isDir && isDir.exp) {\n        return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [\n            isDir.exp\n        ]);\n    }\n    // 2. built-in components (Teleport, Transition, KeepAlive, Suspense...)\n    const builtIn = isCoreComponent(tag) || context.isBuiltInComponent(tag);\n    if (builtIn) {\n        // built-ins are simply fallthroughs / have special handling during ssr\n        // so we don't need to import their runtime equivalents\n        if (!ssr)\n            context.helper(builtIn);\n        return builtIn;\n    }\n    // 5. user component (resolve)\n    context.helper(RESOLVE_COMPONENT);\n    context.components.add(tag);\n    return toValidAssetId(tag, `component`);\n}\nfunction buildProps(node, context, props = node.props, isComponent, isDynamicComponent, ssr = false) {\n    const { tag, loc: elementLoc, children } = node;\n    let properties = [];\n    const mergeArgs = [];\n    const runtimeDirectives = [];\n    const hasChildren = children.length > 0;\n    let shouldUseBlock = false;\n    // patchFlag analysis\n    let patchFlag = 0;\n    let hasRef = false;\n    let hasClassBinding = false;\n    let hasStyleBinding = false;\n    let hasHydrationEventBinding = false;\n    let hasDynamicKeys = false;\n    let hasVnodeHook = false;\n    const dynamicPropNames = [];\n    const pushMergeArg = (arg) => {\n        if (properties.length) {\n            mergeArgs.push(createObjectExpression(dedupeProperties(properties), elementLoc));\n            properties = [];\n        }\n        if (arg)\n            mergeArgs.push(arg);\n    };\n    const analyzePatchFlag = ({ key, value }) => {\n        if (isStaticExp(key)) {\n            const name = key.content;\n            const isEventHandler = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isOn)(name);\n            if (isEventHandler &&\n                (!isComponent || isDynamicComponent) &&\n                // omit the flag for click handlers because hydration gives click\n                // dedicated fast path.\n                name.toLowerCase() !== 'onclick' &&\n                // omit v-model handlers\n                name !== 'onUpdate:modelValue' &&\n                // omit onVnodeXXX hooks\n                !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isReservedProp)(name)) {\n                hasHydrationEventBinding = true;\n            }\n            if (isEventHandler && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isReservedProp)(name)) {\n                hasVnodeHook = true;\n            }\n            if (value.type === 20 /* NodeTypes.JS_CACHE_EXPRESSION */ ||\n                ((value.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ ||\n                    value.type === 8 /* NodeTypes.COMPOUND_EXPRESSION */) &&\n                    getConstantType(value, context) > 0)) {\n                // skip if the prop is a cached handler or has constant value\n                return;\n            }\n            if (name === 'ref') {\n                hasRef = true;\n            }\n            else if (name === 'class') {\n                hasClassBinding = true;\n            }\n            else if (name === 'style') {\n                hasStyleBinding = true;\n            }\n            else if (name !== 'key' && !dynamicPropNames.includes(name)) {\n                dynamicPropNames.push(name);\n            }\n            // treat the dynamic class and style binding of the component as dynamic props\n            if (isComponent &&\n                (name === 'class' || name === 'style') &&\n                !dynamicPropNames.includes(name)) {\n                dynamicPropNames.push(name);\n            }\n        }\n        else {\n            hasDynamicKeys = true;\n        }\n    };\n    for (let i = 0; i < props.length; i++) {\n        // static attribute\n        const prop = props[i];\n        if (prop.type === 6 /* NodeTypes.ATTRIBUTE */) {\n            const { loc, name, value } = prop;\n            let isStatic = true;\n            if (name === 'ref') {\n                hasRef = true;\n                if (context.scopes.vFor > 0) {\n                    properties.push(createObjectProperty(createSimpleExpression('ref_for', true), createSimpleExpression('true')));\n                }\n            }\n            // skip is on <component>, or is=\"vue:xxx\"\n            if (name === 'is' &&\n                (isComponentTag(tag) ||\n                    (value && value.content.startsWith('vue:')) ||\n                    (isCompatEnabled(\"COMPILER_IS_ON_ELEMENT\" /* CompilerDeprecationTypes.COMPILER_IS_ON_ELEMENT */, context)))) {\n                continue;\n            }\n            properties.push(createObjectProperty(createSimpleExpression(name, true, getInnerRange(loc, 0, name.length)), createSimpleExpression(value ? value.content : '', isStatic, value ? value.loc : loc)));\n        }\n        else {\n            // directives\n            const { name, arg, exp, loc } = prop;\n            const isVBind = name === 'bind';\n            const isVOn = name === 'on';\n            // skip v-slot - it is handled by its dedicated transform.\n            if (name === 'slot') {\n                if (!isComponent) {\n                    context.onError(createCompilerError(40 /* ErrorCodes.X_V_SLOT_MISPLACED */, loc));\n                }\n                continue;\n            }\n            // skip v-once/v-memo - they are handled by dedicated transforms.\n            if (name === 'once' || name === 'memo') {\n                continue;\n            }\n            // skip v-is and :is on <component>\n            if (name === 'is' ||\n                (isVBind &&\n                    isStaticArgOf(arg, 'is') &&\n                    (isComponentTag(tag) ||\n                        (isCompatEnabled(\"COMPILER_IS_ON_ELEMENT\" /* CompilerDeprecationTypes.COMPILER_IS_ON_ELEMENT */, context))))) {\n                continue;\n            }\n            // skip v-on in SSR compilation\n            if (isVOn && ssr) {\n                continue;\n            }\n            if (\n            // #938: elements with dynamic keys should be forced into blocks\n            (isVBind && isStaticArgOf(arg, 'key')) ||\n                // inline before-update hooks need to force block so that it is invoked\n                // before children\n                (isVOn && hasChildren && isStaticArgOf(arg, 'vue:before-update'))) {\n                shouldUseBlock = true;\n            }\n            if (isVBind && isStaticArgOf(arg, 'ref') && context.scopes.vFor > 0) {\n                properties.push(createObjectProperty(createSimpleExpression('ref_for', true), createSimpleExpression('true')));\n            }\n            // special case for v-bind and v-on with no argument\n            if (!arg && (isVBind || isVOn)) {\n                hasDynamicKeys = true;\n                if (exp) {\n                    if (isVBind) {\n                        // have to merge early for compat build check\n                        pushMergeArg();\n                        {\n                            // 2.x v-bind object order compat\n                            if ((true)) {\n                                const hasOverridableKeys = mergeArgs.some(arg => {\n                                    if (arg.type === 15 /* NodeTypes.JS_OBJECT_EXPRESSION */) {\n                                        return arg.properties.some(({ key }) => {\n                                            if (key.type !== 4 /* NodeTypes.SIMPLE_EXPRESSION */ ||\n                                                !key.isStatic) {\n                                                return true;\n                                            }\n                                            return (key.content !== 'class' &&\n                                                key.content !== 'style' &&\n                                                !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isOn)(key.content));\n                                        });\n                                    }\n                                    else {\n                                        // dynamic expression\n                                        return true;\n                                    }\n                                });\n                                if (hasOverridableKeys) {\n                                    checkCompatEnabled(\"COMPILER_V_BIND_OBJECT_ORDER\" /* CompilerDeprecationTypes.COMPILER_V_BIND_OBJECT_ORDER */, context, loc);\n                                }\n                            }\n                            if (isCompatEnabled(\"COMPILER_V_BIND_OBJECT_ORDER\" /* CompilerDeprecationTypes.COMPILER_V_BIND_OBJECT_ORDER */, context)) {\n                                mergeArgs.unshift(exp);\n                                continue;\n                            }\n                        }\n                        mergeArgs.push(exp);\n                    }\n                    else {\n                        // v-on=\"obj\" -> toHandlers(obj)\n                        pushMergeArg({\n                            type: 14 /* NodeTypes.JS_CALL_EXPRESSION */,\n                            loc,\n                            callee: context.helper(TO_HANDLERS),\n                            arguments: isComponent ? [exp] : [exp, `true`]\n                        });\n                    }\n                }\n                else {\n                    context.onError(createCompilerError(isVBind\n                        ? 34 /* ErrorCodes.X_V_BIND_NO_EXPRESSION */\n                        : 35 /* ErrorCodes.X_V_ON_NO_EXPRESSION */, loc));\n                }\n                continue;\n            }\n            const directiveTransform = context.directiveTransforms[name];\n            if (directiveTransform) {\n                // has built-in directive transform.\n                const { props, needRuntime } = directiveTransform(prop, node, context);\n                !ssr && props.forEach(analyzePatchFlag);\n                if (isVOn && arg && !isStaticExp(arg)) {\n                    pushMergeArg(createObjectExpression(props, elementLoc));\n                }\n                else {\n                    properties.push(...props);\n                }\n                if (needRuntime) {\n                    runtimeDirectives.push(prop);\n                    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(needRuntime)) {\n                        directiveImportMap.set(prop, needRuntime);\n                    }\n                }\n            }\n            else if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isBuiltInDirective)(name)) {\n                // no built-in transform, this is a user custom directive.\n                runtimeDirectives.push(prop);\n                // custom dirs may use beforeUpdate so they need to force blocks\n                // to ensure before-update gets called before children update\n                if (hasChildren) {\n                    shouldUseBlock = true;\n                }\n            }\n        }\n    }\n    let propsExpression = undefined;\n    // has v-bind=\"object\" or v-on=\"object\", wrap with mergeProps\n    if (mergeArgs.length) {\n        // close up any not-yet-merged props\n        pushMergeArg();\n        if (mergeArgs.length > 1) {\n            propsExpression = createCallExpression(context.helper(MERGE_PROPS), mergeArgs, elementLoc);\n        }\n        else {\n            // single v-bind with nothing else - no need for a mergeProps call\n            propsExpression = mergeArgs[0];\n        }\n    }\n    else if (properties.length) {\n        propsExpression = createObjectExpression(dedupeProperties(properties), elementLoc);\n    }\n    // patchFlag analysis\n    if (hasDynamicKeys) {\n        patchFlag |= 16 /* PatchFlags.FULL_PROPS */;\n    }\n    else {\n        if (hasClassBinding && !isComponent) {\n            patchFlag |= 2 /* PatchFlags.CLASS */;\n        }\n        if (hasStyleBinding && !isComponent) {\n            patchFlag |= 4 /* PatchFlags.STYLE */;\n        }\n        if (dynamicPropNames.length) {\n            patchFlag |= 8 /* PatchFlags.PROPS */;\n        }\n        if (hasHydrationEventBinding) {\n            patchFlag |= 32 /* PatchFlags.HYDRATE_EVENTS */;\n        }\n    }\n    if (!shouldUseBlock &&\n        (patchFlag === 0 || patchFlag === 32 /* PatchFlags.HYDRATE_EVENTS */) &&\n        (hasRef || hasVnodeHook || runtimeDirectives.length > 0)) {\n        patchFlag |= 512 /* PatchFlags.NEED_PATCH */;\n    }\n    // pre-normalize props, SSR is skipped for now\n    if (!context.inSSR && propsExpression) {\n        switch (propsExpression.type) {\n            case 15 /* NodeTypes.JS_OBJECT_EXPRESSION */:\n                // means that there is no v-bind,\n                // but still need to deal with dynamic key binding\n                let classKeyIndex = -1;\n                let styleKeyIndex = -1;\n                let hasDynamicKey = false;\n                for (let i = 0; i < propsExpression.properties.length; i++) {\n                    const key = propsExpression.properties[i].key;\n                    if (isStaticExp(key)) {\n                        if (key.content === 'class') {\n                            classKeyIndex = i;\n                        }\n                        else if (key.content === 'style') {\n                            styleKeyIndex = i;\n                        }\n                    }\n                    else if (!key.isHandlerKey) {\n                        hasDynamicKey = true;\n                    }\n                }\n                const classProp = propsExpression.properties[classKeyIndex];\n                const styleProp = propsExpression.properties[styleKeyIndex];\n                // no dynamic key\n                if (!hasDynamicKey) {\n                    if (classProp && !isStaticExp(classProp.value)) {\n                        classProp.value = createCallExpression(context.helper(NORMALIZE_CLASS), [classProp.value]);\n                    }\n                    if (styleProp &&\n                        // the static style is compiled into an object,\n                        // so use `hasStyleBinding` to ensure that it is a dynamic style binding\n                        (hasStyleBinding ||\n                            (styleProp.value.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ &&\n                                styleProp.value.content.trim()[0] === `[`) ||\n                            // v-bind:style and style both exist,\n                            // v-bind:style with static literal object\n                            styleProp.value.type === 17 /* NodeTypes.JS_ARRAY_EXPRESSION */)) {\n                        styleProp.value = createCallExpression(context.helper(NORMALIZE_STYLE), [styleProp.value]);\n                    }\n                }\n                else {\n                    // dynamic key binding, wrap with `normalizeProps`\n                    propsExpression = createCallExpression(context.helper(NORMALIZE_PROPS), [propsExpression]);\n                }\n                break;\n            case 14 /* NodeTypes.JS_CALL_EXPRESSION */:\n                // mergeProps call, do nothing\n                break;\n            default:\n                // single v-bind\n                propsExpression = createCallExpression(context.helper(NORMALIZE_PROPS), [\n                    createCallExpression(context.helper(GUARD_REACTIVE_PROPS), [\n                        propsExpression\n                    ])\n                ]);\n                break;\n        }\n    }\n    return {\n        props: propsExpression,\n        directives: runtimeDirectives,\n        patchFlag,\n        dynamicPropNames,\n        shouldUseBlock\n    };\n}\n// Dedupe props in an object literal.\n// Literal duplicated attributes would have been warned during the parse phase,\n// however, it's possible to encounter duplicated `onXXX` handlers with different\n// modifiers. We also need to merge static and dynamic class / style attributes.\n// - onXXX handlers / style: merge into array\n// - class: merge into single expression with concatenation\nfunction dedupeProperties(properties) {\n    const knownProps = new Map();\n    const deduped = [];\n    for (let i = 0; i < properties.length; i++) {\n        const prop = properties[i];\n        // dynamic keys are always allowed\n        if (prop.key.type === 8 /* NodeTypes.COMPOUND_EXPRESSION */ || !prop.key.isStatic) {\n            deduped.push(prop);\n            continue;\n        }\n        const name = prop.key.content;\n        const existing = knownProps.get(name);\n        if (existing) {\n            if (name === 'style' || name === 'class' || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isOn)(name)) {\n                mergeAsArray(existing, prop);\n            }\n            // unexpected duplicate, should have emitted error during parse\n        }\n        else {\n            knownProps.set(name, prop);\n            deduped.push(prop);\n        }\n    }\n    return deduped;\n}\nfunction mergeAsArray(existing, incoming) {\n    if (existing.value.type === 17 /* NodeTypes.JS_ARRAY_EXPRESSION */) {\n        existing.value.elements.push(incoming.value);\n    }\n    else {\n        existing.value = createArrayExpression([existing.value, incoming.value], existing.loc);\n    }\n}\nfunction buildDirectiveArgs(dir, context) {\n    const dirArgs = [];\n    const runtime = directiveImportMap.get(dir);\n    if (runtime) {\n        // built-in directive with runtime\n        dirArgs.push(context.helperString(runtime));\n    }\n    else {\n        {\n            // inject statement for resolving directive\n            context.helper(RESOLVE_DIRECTIVE);\n            context.directives.add(dir.name);\n            dirArgs.push(toValidAssetId(dir.name, `directive`));\n        }\n    }\n    const { loc } = dir;\n    if (dir.exp)\n        dirArgs.push(dir.exp);\n    if (dir.arg) {\n        if (!dir.exp) {\n            dirArgs.push(`void 0`);\n        }\n        dirArgs.push(dir.arg);\n    }\n    if (Object.keys(dir.modifiers).length) {\n        if (!dir.arg) {\n            if (!dir.exp) {\n                dirArgs.push(`void 0`);\n            }\n            dirArgs.push(`void 0`);\n        }\n        const trueExpression = createSimpleExpression(`true`, false, loc);\n        dirArgs.push(createObjectExpression(dir.modifiers.map(modifier => createObjectProperty(modifier, trueExpression)), loc));\n    }\n    return createArrayExpression(dirArgs, dir.loc);\n}\nfunction stringifyDynamicPropNames(props) {\n    let propsNamesString = `[`;\n    for (let i = 0, l = props.length; i < l; i++) {\n        propsNamesString += JSON.stringify(props[i]);\n        if (i < l - 1)\n            propsNamesString += ', ';\n    }\n    return propsNamesString + `]`;\n}\nfunction isComponentTag(tag) {\n    return tag === 'component' || tag === 'Component';\n}\n\n( true)\n    ? Object.freeze({})\n    : 0;\n( true) ? Object.freeze([]) : 0;\nconst cacheStringFunction = (fn) => {\n    const cache = Object.create(null);\n    return ((str) => {\n        const hit = cache[str];\n        return hit || (cache[str] = fn(str));\n    });\n};\nconst camelizeRE = /-(\\w)/g;\n/**\n * @private\n */\nconst camelize = cacheStringFunction((str) => {\n    return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''));\n});\n\nconst transformSlotOutlet = (node, context) => {\n    if (isSlotOutlet(node)) {\n        const { children, loc } = node;\n        const { slotName, slotProps } = processSlotOutlet(node, context);\n        const slotArgs = [\n            context.prefixIdentifiers ? `_ctx.$slots` : `$slots`,\n            slotName,\n            '{}',\n            'undefined',\n            'true'\n        ];\n        let expectedLen = 2;\n        if (slotProps) {\n            slotArgs[2] = slotProps;\n            expectedLen = 3;\n        }\n        if (children.length) {\n            slotArgs[3] = createFunctionExpression([], children, false, false, loc);\n            expectedLen = 4;\n        }\n        if (context.scopeId && !context.slotted) {\n            expectedLen = 5;\n        }\n        slotArgs.splice(expectedLen); // remove unused arguments\n        node.codegenNode = createCallExpression(context.helper(RENDER_SLOT), slotArgs, loc);\n    }\n};\nfunction processSlotOutlet(node, context) {\n    let slotName = `\"default\"`;\n    let slotProps = undefined;\n    const nonNameProps = [];\n    for (let i = 0; i < node.props.length; i++) {\n        const p = node.props[i];\n        if (p.type === 6 /* NodeTypes.ATTRIBUTE */) {\n            if (p.value) {\n                if (p.name === 'name') {\n                    slotName = JSON.stringify(p.value.content);\n                }\n                else {\n                    p.name = camelize(p.name);\n                    nonNameProps.push(p);\n                }\n            }\n        }\n        else {\n            if (p.name === 'bind' && isStaticArgOf(p.arg, 'name')) {\n                if (p.exp)\n                    slotName = p.exp;\n            }\n            else {\n                if (p.name === 'bind' && p.arg && isStaticExp(p.arg)) {\n                    p.arg.content = camelize(p.arg.content);\n                }\n                nonNameProps.push(p);\n            }\n        }\n    }\n    if (nonNameProps.length > 0) {\n        const { props, directives } = buildProps(node, context, nonNameProps, false, false);\n        slotProps = props;\n        if (directives.length) {\n            context.onError(createCompilerError(36 /* ErrorCodes.X_V_SLOT_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET */, directives[0].loc));\n        }\n    }\n    return {\n        slotName,\n        slotProps\n    };\n}\n\nconst fnExpRE = /^\\s*([\\w$_]+|(async\\s*)?\\([^)]*?\\))\\s*(:[^=]+)?=>|^\\s*(async\\s+)?function(?:\\s+[\\w$]+)?\\s*\\(/;\nconst transformOn = (dir, node, context, augmentor) => {\n    const { loc, modifiers, arg } = dir;\n    if (!dir.exp && !modifiers.length) {\n        context.onError(createCompilerError(35 /* ErrorCodes.X_V_ON_NO_EXPRESSION */, loc));\n    }\n    let eventName;\n    if (arg.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */) {\n        if (arg.isStatic) {\n            let rawName = arg.content;\n            // TODO deprecate @vnodeXXX usage\n            if (rawName.startsWith('vue:')) {\n                rawName = `vnode-${rawName.slice(4)}`;\n            }\n            const eventString = node.tagType !== 0 /* ElementTypes.ELEMENT */ ||\n                rawName.startsWith('vnode') ||\n                !/[A-Z]/.test(rawName)\n                ? // for non-element and vnode lifecycle event listeners, auto convert\n                    // it to camelCase. See issue #2249\n                    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.toHandlerKey)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(rawName))\n                : // preserve case for plain element listeners that have uppercase\n                    // letters, as these may be custom elements' custom events\n                    `on:${rawName}`;\n            eventName = createSimpleExpression(eventString, true, arg.loc);\n        }\n        else {\n            // #2388\n            eventName = createCompoundExpression([\n                `${context.helperString(TO_HANDLER_KEY)}(`,\n                arg,\n                `)`\n            ]);\n        }\n    }\n    else {\n        // already a compound expression.\n        eventName = arg;\n        eventName.children.unshift(`${context.helperString(TO_HANDLER_KEY)}(`);\n        eventName.children.push(`)`);\n    }\n    // handler processing\n    let exp = dir.exp;\n    if (exp && !exp.content.trim()) {\n        exp = undefined;\n    }\n    let shouldCache = context.cacheHandlers && !exp && !context.inVOnce;\n    if (exp) {\n        const isMemberExp = isMemberExpression(exp.content);\n        const isInlineStatement = !(isMemberExp || fnExpRE.test(exp.content));\n        const hasMultipleStatements = exp.content.includes(`;`);\n        if (true) {\n            validateBrowserExpression(exp, context, false, hasMultipleStatements);\n        }\n        if (isInlineStatement || (shouldCache && isMemberExp)) {\n            // wrap inline statement in a function expression\n            exp = createCompoundExpression([\n                `${isInlineStatement\n                    ? `$event`\n                    : `${``}(...args)`} => ${hasMultipleStatements ? `{` : `(`}`,\n                exp,\n                hasMultipleStatements ? `}` : `)`\n            ]);\n        }\n    }\n    let ret = {\n        props: [\n            createObjectProperty(eventName, exp || createSimpleExpression(`() => {}`, false, loc))\n        ]\n    };\n    // apply extended compiler augmentor\n    if (augmentor) {\n        ret = augmentor(ret);\n    }\n    if (shouldCache) {\n        // cache handlers so that it's always the same handler being passed down.\n        // this avoids unnecessary re-renders when users use inline handlers on\n        // components.\n        ret.props[0].value = context.cache(ret.props[0].value);\n    }\n    // mark the key as handler for props normalization check\n    ret.props.forEach(p => (p.key.isHandlerKey = true));\n    return ret;\n};\n\n// v-bind without arg is handled directly in ./transformElements.ts due to it affecting\n// codegen for the entire props object. This transform here is only for v-bind\n// *with* args.\nconst transformBind = (dir, _node, context) => {\n    const { exp, modifiers, loc } = dir;\n    const arg = dir.arg;\n    if (arg.type !== 4 /* NodeTypes.SIMPLE_EXPRESSION */) {\n        arg.children.unshift(`(`);\n        arg.children.push(`) || \"\"`);\n    }\n    else if (!arg.isStatic) {\n        arg.content = `${arg.content} || \"\"`;\n    }\n    // .sync is replaced by v-model:arg\n    if (modifiers.includes('camel')) {\n        if (arg.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */) {\n            if (arg.isStatic) {\n                arg.content = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(arg.content);\n            }\n            else {\n                arg.content = `${context.helperString(CAMELIZE)}(${arg.content})`;\n            }\n        }\n        else {\n            arg.children.unshift(`${context.helperString(CAMELIZE)}(`);\n            arg.children.push(`)`);\n        }\n    }\n    if (!context.inSSR) {\n        if (modifiers.includes('prop')) {\n            injectPrefix(arg, '.');\n        }\n        if (modifiers.includes('attr')) {\n            injectPrefix(arg, '^');\n        }\n    }\n    if (!exp ||\n        (exp.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ && !exp.content.trim())) {\n        context.onError(createCompilerError(34 /* ErrorCodes.X_V_BIND_NO_EXPRESSION */, loc));\n        return {\n            props: [createObjectProperty(arg, createSimpleExpression('', true, loc))]\n        };\n    }\n    return {\n        props: [createObjectProperty(arg, exp)]\n    };\n};\nconst injectPrefix = (arg, prefix) => {\n    if (arg.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */) {\n        if (arg.isStatic) {\n            arg.content = prefix + arg.content;\n        }\n        else {\n            arg.content = `\\`${prefix}\\${${arg.content}}\\``;\n        }\n    }\n    else {\n        arg.children.unshift(`'${prefix}' + (`);\n        arg.children.push(`)`);\n    }\n};\n\n// Merge adjacent text nodes and expressions into a single expression\n// e.g. <div>abc {{ d }} {{ e }}</div> should have a single expression node as child.\nconst transformText = (node, context) => {\n    if (node.type === 0 /* NodeTypes.ROOT */ ||\n        node.type === 1 /* NodeTypes.ELEMENT */ ||\n        node.type === 11 /* NodeTypes.FOR */ ||\n        node.type === 10 /* NodeTypes.IF_BRANCH */) {\n        // perform the transform on node exit so that all expressions have already\n        // been processed.\n        return () => {\n            const children = node.children;\n            let currentContainer = undefined;\n            let hasText = false;\n            for (let i = 0; i < children.length; i++) {\n                const child = children[i];\n                if (isText$1(child)) {\n                    hasText = true;\n                    for (let j = i + 1; j < children.length; j++) {\n                        const next = children[j];\n                        if (isText$1(next)) {\n                            if (!currentContainer) {\n                                currentContainer = children[i] = createCompoundExpression([child], child.loc);\n                            }\n                            // merge adjacent text node into current\n                            currentContainer.children.push(` + `, next);\n                            children.splice(j, 1);\n                            j--;\n                        }\n                        else {\n                            currentContainer = undefined;\n                            break;\n                        }\n                    }\n                }\n            }\n            if (!hasText ||\n                // if this is a plain element with a single text child, leave it\n                // as-is since the runtime has dedicated fast path for this by directly\n                // setting textContent of the element.\n                // for component root it's always normalized anyway.\n                (children.length === 1 &&\n                    (node.type === 0 /* NodeTypes.ROOT */ ||\n                        (node.type === 1 /* NodeTypes.ELEMENT */ &&\n                            node.tagType === 0 /* ElementTypes.ELEMENT */ &&\n                            // #3756\n                            // custom directives can potentially add DOM elements arbitrarily,\n                            // we need to avoid setting textContent of the element at runtime\n                            // to avoid accidentally overwriting the DOM elements added\n                            // by the user through custom directives.\n                            !node.props.find(p => p.type === 7 /* NodeTypes.DIRECTIVE */ &&\n                                !context.directiveTransforms[p.name]) &&\n                            // in compat mode, <template> tags with no special directives\n                            // will be rendered as a fragment so its children must be\n                            // converted into vnodes.\n                            !(node.tag === 'template'))))) {\n                return;\n            }\n            // pre-convert text nodes into createTextVNode(text) calls to avoid\n            // runtime normalization.\n            for (let i = 0; i < children.length; i++) {\n                const child = children[i];\n                if (isText$1(child) || child.type === 8 /* NodeTypes.COMPOUND_EXPRESSION */) {\n                    const callArgs = [];\n                    // createTextVNode defaults to single whitespace, so if it is a\n                    // single space the code could be an empty call to save bytes.\n                    if (child.type !== 2 /* NodeTypes.TEXT */ || child.content !== ' ') {\n                        callArgs.push(child);\n                    }\n                    // mark dynamic text with flag so it gets patched inside a block\n                    if (!context.ssr &&\n                        getConstantType(child, context) === 0 /* ConstantTypes.NOT_CONSTANT */) {\n                        callArgs.push(1 /* PatchFlags.TEXT */ +\n                            (( true) ? ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[1]} */` : 0));\n                    }\n                    children[i] = {\n                        type: 12 /* NodeTypes.TEXT_CALL */,\n                        content: child,\n                        loc: child.loc,\n                        codegenNode: createCallExpression(context.helper(CREATE_TEXT), callArgs)\n                    };\n                }\n            }\n        };\n    }\n};\n\nconst seen$1 = new WeakSet();\nconst transformOnce = (node, context) => {\n    if (node.type === 1 /* NodeTypes.ELEMENT */ && findDir(node, 'once', true)) {\n        if (seen$1.has(node) || context.inVOnce) {\n            return;\n        }\n        seen$1.add(node);\n        context.inVOnce = true;\n        context.helper(SET_BLOCK_TRACKING);\n        return () => {\n            context.inVOnce = false;\n            const cur = context.currentNode;\n            if (cur.codegenNode) {\n                cur.codegenNode = context.cache(cur.codegenNode, true /* isVNode */);\n            }\n        };\n    }\n};\n\nconst transformModel = (dir, node, context) => {\n    const { exp, arg } = dir;\n    if (!exp) {\n        context.onError(createCompilerError(41 /* ErrorCodes.X_V_MODEL_NO_EXPRESSION */, dir.loc));\n        return createTransformProps();\n    }\n    const rawExp = exp.loc.source;\n    const expString = exp.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ ? exp.content : rawExp;\n    // im SFC <script setup> inline mode, the exp may have been transformed into\n    // _unref(exp)\n    const bindingType = context.bindingMetadata[rawExp];\n    // check props\n    if (bindingType === \"props\" /* BindingTypes.PROPS */ ||\n        bindingType === \"props-aliased\" /* BindingTypes.PROPS_ALIASED */) {\n        context.onError(createCompilerError(44 /* ErrorCodes.X_V_MODEL_ON_PROPS */, exp.loc));\n        return createTransformProps();\n    }\n    const maybeRef = !true  ;\n    if (!expString.trim() ||\n        (!isMemberExpression(expString) && !maybeRef)) {\n        context.onError(createCompilerError(42 /* ErrorCodes.X_V_MODEL_MALFORMED_EXPRESSION */, exp.loc));\n        return createTransformProps();\n    }\n    const propName = arg ? arg : createSimpleExpression('modelValue', true);\n    const eventName = arg\n        ? isStaticExp(arg)\n            ? `onUpdate:${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(arg.content)}`\n            : createCompoundExpression(['\"onUpdate:\" + ', arg])\n        : `onUpdate:modelValue`;\n    let assignmentExp;\n    const eventArg = context.isTS ? `($event: any)` : `$event`;\n    {\n        assignmentExp = createCompoundExpression([\n            `${eventArg} => ((`,\n            exp,\n            `) = $event)`\n        ]);\n    }\n    const props = [\n        // modelValue: foo\n        createObjectProperty(propName, dir.exp),\n        // \"onUpdate:modelValue\": $event => (foo = $event)\n        createObjectProperty(eventName, assignmentExp)\n    ];\n    // modelModifiers: { foo: true, \"bar-baz\": true }\n    if (dir.modifiers.length && node.tagType === 1 /* ElementTypes.COMPONENT */) {\n        const modifiers = dir.modifiers\n            .map(m => (isSimpleIdentifier(m) ? m : JSON.stringify(m)) + `: true`)\n            .join(`, `);\n        const modifiersKey = arg\n            ? isStaticExp(arg)\n                ? `${arg.content}Modifiers`\n                : createCompoundExpression([arg, ' + \"Modifiers\"'])\n            : `modelModifiers`;\n        props.push(createObjectProperty(modifiersKey, createSimpleExpression(`{ ${modifiers} }`, false, dir.loc, 2 /* ConstantTypes.CAN_HOIST */)));\n    }\n    return createTransformProps(props);\n};\nfunction createTransformProps(props = []) {\n    return { props };\n}\n\nconst validDivisionCharRE = /[\\w).+\\-_$\\]]/;\nconst transformFilter = (node, context) => {\n    if (!isCompatEnabled(\"COMPILER_FILTER\" /* CompilerDeprecationTypes.COMPILER_FILTERS */, context)) {\n        return;\n    }\n    if (node.type === 5 /* NodeTypes.INTERPOLATION */) {\n        // filter rewrite is applied before expression transform so only\n        // simple expressions are possible at this stage\n        rewriteFilter(node.content, context);\n    }\n    if (node.type === 1 /* NodeTypes.ELEMENT */) {\n        node.props.forEach((prop) => {\n            if (prop.type === 7 /* NodeTypes.DIRECTIVE */ &&\n                prop.name !== 'for' &&\n                prop.exp) {\n                rewriteFilter(prop.exp, context);\n            }\n        });\n    }\n};\nfunction rewriteFilter(node, context) {\n    if (node.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */) {\n        parseFilter(node, context);\n    }\n    else {\n        for (let i = 0; i < node.children.length; i++) {\n            const child = node.children[i];\n            if (typeof child !== 'object')\n                continue;\n            if (child.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */) {\n                parseFilter(child, context);\n            }\n            else if (child.type === 8 /* NodeTypes.COMPOUND_EXPRESSION */) {\n                rewriteFilter(node, context);\n            }\n            else if (child.type === 5 /* NodeTypes.INTERPOLATION */) {\n                rewriteFilter(child.content, context);\n            }\n        }\n    }\n}\nfunction parseFilter(node, context) {\n    const exp = node.content;\n    let inSingle = false;\n    let inDouble = false;\n    let inTemplateString = false;\n    let inRegex = false;\n    let curly = 0;\n    let square = 0;\n    let paren = 0;\n    let lastFilterIndex = 0;\n    let c, prev, i, expression, filters = [];\n    for (i = 0; i < exp.length; i++) {\n        prev = c;\n        c = exp.charCodeAt(i);\n        if (inSingle) {\n            if (c === 0x27 && prev !== 0x5c)\n                inSingle = false;\n        }\n        else if (inDouble) {\n            if (c === 0x22 && prev !== 0x5c)\n                inDouble = false;\n        }\n        else if (inTemplateString) {\n            if (c === 0x60 && prev !== 0x5c)\n                inTemplateString = false;\n        }\n        else if (inRegex) {\n            if (c === 0x2f && prev !== 0x5c)\n                inRegex = false;\n        }\n        else if (c === 0x7c && // pipe\n            exp.charCodeAt(i + 1) !== 0x7c &&\n            exp.charCodeAt(i - 1) !== 0x7c &&\n            !curly &&\n            !square &&\n            !paren) {\n            if (expression === undefined) {\n                // first filter, end of expression\n                lastFilterIndex = i + 1;\n                expression = exp.slice(0, i).trim();\n            }\n            else {\n                pushFilter();\n            }\n        }\n        else {\n            switch (c) {\n                case 0x22:\n                    inDouble = true;\n                    break; // \"\n                case 0x27:\n                    inSingle = true;\n                    break; // '\n                case 0x60:\n                    inTemplateString = true;\n                    break; // `\n                case 0x28:\n                    paren++;\n                    break; // (\n                case 0x29:\n                    paren--;\n                    break; // )\n                case 0x5b:\n                    square++;\n                    break; // [\n                case 0x5d:\n                    square--;\n                    break; // ]\n                case 0x7b:\n                    curly++;\n                    break; // {\n                case 0x7d:\n                    curly--;\n                    break; // }\n            }\n            if (c === 0x2f) {\n                // /\n                let j = i - 1;\n                let p;\n                // find first non-whitespace prev char\n                for (; j >= 0; j--) {\n                    p = exp.charAt(j);\n                    if (p !== ' ')\n                        break;\n                }\n                if (!p || !validDivisionCharRE.test(p)) {\n                    inRegex = true;\n                }\n            }\n        }\n    }\n    if (expression === undefined) {\n        expression = exp.slice(0, i).trim();\n    }\n    else if (lastFilterIndex !== 0) {\n        pushFilter();\n    }\n    function pushFilter() {\n        filters.push(exp.slice(lastFilterIndex, i).trim());\n        lastFilterIndex = i + 1;\n    }\n    if (filters.length) {\n        ( true) &&\n            warnDeprecation(\"COMPILER_FILTER\" /* CompilerDeprecationTypes.COMPILER_FILTERS */, context, node.loc);\n        for (i = 0; i < filters.length; i++) {\n            expression = wrapFilter(expression, filters[i], context);\n        }\n        node.content = expression;\n    }\n}\nfunction wrapFilter(exp, filter, context) {\n    context.helper(RESOLVE_FILTER);\n    const i = filter.indexOf('(');\n    if (i < 0) {\n        context.filters.add(filter);\n        return `${toValidAssetId(filter, 'filter')}(${exp})`;\n    }\n    else {\n        const name = filter.slice(0, i);\n        const args = filter.slice(i + 1);\n        context.filters.add(name);\n        return `${toValidAssetId(name, 'filter')}(${exp}${args !== ')' ? ',' + args : args}`;\n    }\n}\n\nconst seen = new WeakSet();\nconst transformMemo = (node, context) => {\n    if (node.type === 1 /* NodeTypes.ELEMENT */) {\n        const dir = findDir(node, 'memo');\n        if (!dir || seen.has(node)) {\n            return;\n        }\n        seen.add(node);\n        return () => {\n            const codegenNode = node.codegenNode ||\n                context.currentNode.codegenNode;\n            if (codegenNode && codegenNode.type === 13 /* NodeTypes.VNODE_CALL */) {\n                // non-component sub tree should be turned into a block\n                if (node.tagType !== 1 /* ElementTypes.COMPONENT */) {\n                    makeBlock(codegenNode, context);\n                }\n                node.codegenNode = createCallExpression(context.helper(WITH_MEMO), [\n                    dir.exp,\n                    createFunctionExpression(undefined, codegenNode),\n                    `_cache`,\n                    String(context.cached++)\n                ]);\n            }\n        };\n    }\n};\n\nfunction getBaseTransformPreset(prefixIdentifiers) {\n    return [\n        [\n            transformOnce,\n            transformIf,\n            transformMemo,\n            transformFor,\n            ...([transformFilter] ),\n            ...(( true)\n                    ? [transformExpression]\n                    : 0),\n            transformSlotOutlet,\n            transformElement,\n            trackSlotScopes,\n            transformText\n        ],\n        {\n            on: transformOn,\n            bind: transformBind,\n            model: transformModel\n        }\n    ];\n}\n// we name it `baseCompile` so that higher order compilers like\n// @vue/compiler-dom can export `compile` while re-exporting everything else.\nfunction baseCompile(template, options = {}) {\n    const onError = options.onError || defaultOnError;\n    const isModuleMode = options.mode === 'module';\n    /* istanbul ignore if */\n    {\n        if (options.prefixIdentifiers === true) {\n            onError(createCompilerError(47 /* ErrorCodes.X_PREFIX_ID_NOT_SUPPORTED */));\n        }\n        else if (isModuleMode) {\n            onError(createCompilerError(48 /* ErrorCodes.X_MODULE_MODE_NOT_SUPPORTED */));\n        }\n    }\n    const prefixIdentifiers = !true ;\n    if (options.cacheHandlers) {\n        onError(createCompilerError(49 /* ErrorCodes.X_CACHE_HANDLER_NOT_SUPPORTED */));\n    }\n    if (options.scopeId && !isModuleMode) {\n        onError(createCompilerError(50 /* ErrorCodes.X_SCOPE_ID_NOT_SUPPORTED */));\n    }\n    const ast = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(template) ? baseParse(template, options) : template;\n    const [nodeTransforms, directiveTransforms] = getBaseTransformPreset();\n    transform(ast, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, options, {\n        prefixIdentifiers,\n        nodeTransforms: [\n            ...nodeTransforms,\n            ...(options.nodeTransforms || []) // user transforms\n        ],\n        directiveTransforms: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, directiveTransforms, options.directiveTransforms || {} // user transforms\n        )\n    }));\n    return generate(ast, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, options, {\n        prefixIdentifiers\n    }));\n}\n\nconst noopDirectiveTransform = () => ({ props: [] });\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHZ1ZS9jb21waWxlci1jb3JlL2Rpc3QvY29tcGlsZXItY29yZS5lc20tYnVuZGxlci5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQWdQO0FBQ2hNOztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssS0FBcUMsZ0NBQWdDLFlBQVk7QUFDdEY7QUFDQTtBQUNBLGdCQUFnQixLQUFnRDtBQUNoRTtBQUNBLFVBQVUsQ0FBSTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkZBQTJGO0FBQzNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsS0FBcUMsaUJBQWlCLENBQUU7QUFDakYseUJBQXlCLEtBQXFDLGlCQUFpQixDQUFFO0FBQ2pGLHlCQUF5QixLQUFxQyxpQkFBaUIsQ0FBRTtBQUNqRiwyQkFBMkIsS0FBcUMsa0JBQWtCLENBQUU7QUFDcEYsZ0NBQWdDLEtBQXFDLHVCQUF1QixDQUFFO0FBQzlGLDJCQUEyQixLQUFxQyxrQkFBa0IsQ0FBRTtBQUNwRiw2QkFBNkIsS0FBcUMs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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUVBQXFFLHNEQUFTO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsS0FBcUM7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLG9EQUFPO0FBQ25CLDRCQUE0QixpQkFBaUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsb0RBQU87QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsbURBQU07QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxLQUFxQztBQUM5QztBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isa0JBQWtCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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YnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHZ1ZS9jb21waWxlci1jb3JlL2Rpc3QvY29tcGlsZXItY29yZS5lc20tYnVuZGxlci5qcz8xZDI2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzU3RyaW5nLCBoeXBoZW5hdGUsIE5PT1AsIGV4dGVuZCwgaXNPYmplY3QsIE5PLCBpc0FycmF5LCBtYWtlTWFwLCBpc1N5bWJvbCwgY2FwaXRhbGl6ZSwgY2FtZWxpemUgYXMgY2FtZWxpemUkMSwgRU1QVFlfT0JKLCBQYXRjaEZsYWdOYW1lcywgc2xvdEZsYWdzVGV4dCwgaXNPbiwgaXNCdWlsdEluRGlyZWN0aXZlLCBpc1Jlc2VydmVkUHJvcCwgdG9IYW5kbGVyS2V5IH0gZnJvbSAnQHZ1ZS9zaGFyZWQnO1xuZXhwb3J0IHsgZ2VuZXJhdGVDb2RlRnJhbWUgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5cbmZ1bmN0aW9uIGRlZmF1bHRPbkVycm9yKGVycm9yKSB7XG4gICAgdGhyb3cgZXJyb3I7XG59XG5mdW5jdGlvbiBkZWZhdWx0T25XYXJuKG1zZykge1xuICAgIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiBjb25zb2xlLndhcm4oYFtWdWUgd2Fybl0gJHttc2cubWVzc2FnZX1gKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBpbGVyRXJyb3IoY29kZSwgbG9jLCBtZXNzYWdlcywgYWRkaXRpb25hbE1lc3NhZ2UpIHtcbiAgICBjb25zdCBtc2cgPSAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgIXRydWVcbiAgICAgICAgPyAobWVzc2FnZXMgfHwgZXJyb3JNZXNzYWdlcylbY29kZV0gKyAoYWRkaXRpb25hbE1lc3NhZ2UgfHwgYGApXG4gICAgICAgIDogY29kZTtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBTeW50YXhFcnJvcihTdHJpbmcobXNnKSk7XG4gICAgZXJyb3IuY29kZSA9IGNvZGU7XG4gICAgZXJyb3IubG9jID0gbG9jO1xuICAgIHJldHVybiBlcnJvcjtcbn1cbmNvbnN0IGVycm9yTWVzc2FnZXMgPSB7XG4gICAgLy8gcGFyc2UgZXJyb3JzXG4gICAgWzAgLyogRXJyb3JDb2Rlcy5BQlJVUFRfQ0xPU0lOR19PRl9FTVBUWV9DT01NRU5UICovXTogJ0lsbGVnYWwgY29tbWVudC4nLFxuICAgIFsxIC8qIEVycm9yQ29kZXMuQ0RBVEFfSU5fSFRNTF9DT05URU5UICovXTogJ0NEQVRBIHNlY3Rpb24gaXMgYWxsb3dlZCBvbmx5IGluIFhNTCBjb250ZXh0LicsXG4gICAgWzIgLyogRXJyb3JDb2Rlcy5EVVBMSUNBVEVfQVRUUklCVVRFICovXTogJ0R1cGxpY2F0ZSBhdHRyaWJ1dGUuJyxcbiAgICBbMyAvKiBFcnJvckNvZGVzLkVORF9UQUdfV0lUSF9BVFRSSUJVVEVTICovXTogJ0VuZCB0YWcgY2Fubm90IGhhdmUgYXR0cmlidXRlcy4nLFxuICAgIFs0IC8qIEVycm9yQ29kZXMuRU5EX1RBR19XSVRIX1RSQUlMSU5HX1NPTElEVVMgKi9dOiBcIklsbGVnYWwgJy8nIGluIHRhZ3MuXCIsXG4gICAgWzUgLyogRXJyb3JDb2Rlcy5FT0ZfQkVGT1JFX1RBR19OQU1FICovXTogJ1VuZXhwZWN0ZWQgRU9GIGluIHRhZy4nLFxuICAgIFs2IC8qIEVycm9yQ29kZXMuRU9GX0lOX0NEQVRBICovXTogJ1VuZXhwZWN0ZWQgRU9GIGluIENEQVRBIHNlY3Rpb24uJyxcbiAgICBbNyAvKiBFcnJvckNvZGVzLkVPRl9JTl9DT01NRU5UICovXTogJ1VuZXhwZWN0ZWQgRU9GIGluIGNvbW1lbnQuJyxcbiAgICBbOCAvKiBFcnJvckNvZGVzLkVPRl9JTl9TQ1JJUFRfSFRNTF9DT01NRU5UX0xJS0VfVEVYVCAqL106ICdVbmV4cGVjdGVkIEVPRiBpbiBzY3JpcHQuJyxcbiAgICBbOSAvKiBFcnJvckNvZGVzLkVPRl9JTl9UQUcgKi9dOiAnVW5leHBlY3RlZCBFT0YgaW4gdGFnLicsXG4gICAgWzEwIC8qIEVycm9yQ29kZXMuSU5DT1JSRUNUTFlfQ0xPU0VEX0NPTU1FTlQgKi9dOiAnSW5jb3JyZWN0bHkgY2xvc2VkIGNvbW1lbnQuJyxcbiAgICBbMTEgLyogRXJyb3JDb2Rlcy5JTkNPUlJFQ1RMWV9PUEVORURfQ09NTUVOVCAqL106ICdJbmNvcnJlY3RseSBvcGVuZWQgY29tbWVudC4nLFxuICAgIFsxMiAvKiBFcnJvckNvZGVzLklOVkFMSURfRklSU1RfQ0hBUkFDVEVSX09GX1RBR19OQU1FICovXTogXCJJbGxlZ2FsIHRhZyBuYW1lLiBVc2UgJyZsdDsnIHRvIHByaW50ICc8Jy5cIixcbiAgICBbMTMgLyogRXJyb3JDb2Rlcy5NSVNTSU5HX0FUVFJJQlVURV9WQUxVRSAqL106ICdBdHRyaWJ1dGUgdmFsdWUgd2FzIGV4cGVjdGVkLicsXG4gICAgWzE0IC8qIEVycm9yQ29kZXMuTUlTU0lOR19FTkRfVEFHX05BTUUgKi9dOiAnRW5kIHRhZyBuYW1lIHdhcyBleHBlY3RlZC4nLFxuICAgIFsxNSAvKiBFcnJvckNvZGVzLk1JU1NJTkdfV0hJVEVTUEFDRV9CRVRXRUVOX0FUVFJJQlVURVMgKi9dOiAnV2hpdGVzcGFjZSB3YXMgZXhwZWN0ZWQuJyxcbiAgICBbMTYgLyogRXJyb3JDb2Rlcy5ORVNURURfQ09NTUVOVCAqL106IFwiVW5leHBlY3RlZCAnPCEtLScgaW4gY29tbWVudC5cIixcbiAgICBbMTcgLyogRXJyb3JDb2Rlcy5VTkVYUEVDVEVEX0NIQVJBQ1RFUl9JTl9BVFRSSUJVVEVfTkFNRSAqL106ICdBdHRyaWJ1dGUgbmFtZSBjYW5ub3QgY29udGFpbiBVKzAwMjIgKFwiKSwgVSswMDI3IChcXCcpLCBhbmQgVSswMDNDICg8KS4nLFxuICAgIFsxOCAvKiBFcnJvckNvZGVzLlVORVhQRUNURURfQ0hBUkFDVEVSX0lOX1VOUVVPVEVEX0FUVFJJQlVURV9WQUxVRSAqL106ICdVbnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUgY2Fubm90IGNvbnRhaW4gVSswMDIyIChcIiksIFUrMDAyNyAoXFwnKSwgVSswMDNDICg8KSwgVSswMDNEICg9KSwgYW5kIFUrMDA2MCAoYCkuJyxcbiAgICBbMTkgLyogRXJyb3JDb2Rlcy5VTkVYUEVDVEVEX0VRVUFMU19TSUdOX0JFRk9SRV9BVFRSSUJVVEVfTkFNRSAqL106IFwiQXR0cmlidXRlIG5hbWUgY2Fubm90IHN0YXJ0IHdpdGggJz0nLlwiLFxuICAgIFsyMSAvKiBFcnJvckNvZGVzLlVORVhQRUNURURfUVVFU1RJT05fTUFSS19JTlNURUFEX09GX1RBR19OQU1FICovXTogXCInPD8nIGlzIGFsbG93ZWQgb25seSBpbiBYTUwgY29udGV4dC5cIixcbiAgICBbMjAgLyogRXJyb3JDb2Rlcy5VTkVYUEVDVEVEX05VTExfQ0hBUkFDVEVSICovXTogYFVuZXhwZWN0ZWQgbnVsbCBjaGFyYWN0ZXIuYCxcbiAgICBbMjIgLyogRXJyb3JDb2Rlcy5VTkVYUEVDVEVEX1NPTElEVVNfSU5fVEFHICovXTogXCJJbGxlZ2FsICcvJyBpbiB0YWdzLlwiLFxuICAgIC8vIFZ1ZS1zcGVjaWZpYyBwYXJzZSBlcnJvcnNcbiAgICBbMjMgLyogRXJyb3JDb2Rlcy5YX0lOVkFMSURfRU5EX1RBRyAqL106ICdJbnZhbGlkIGVuZCB0YWcuJyxcbiAgICBbMjQgLyogRXJyb3JDb2Rlcy5YX01JU1NJTkdfRU5EX1RBRyAqL106ICdFbGVtZW50IGlzIG1pc3NpbmcgZW5kIHRhZy4nLFxuICAgIFsyNSAvKiBFcnJvckNvZGVzLlhfTUlTU0lOR19JTlRFUlBPTEFUSU9OX0VORCAqL106ICdJbnRlcnBvbGF0aW9uIGVuZCBzaWduIHdhcyBub3QgZm91bmQuJyxcbiAgICBbMjcgLyogRXJyb3JDb2Rlcy5YX01JU1NJTkdfRFlOQU1JQ19ESVJFQ1RJVkVfQVJHVU1FTlRfRU5EICovXTogJ0VuZCBicmFja2V0IGZvciBkeW5hbWljIGRpcmVjdGl2ZSBhcmd1bWVudCB3YXMgbm90IGZvdW5kLiAnICtcbiAgICAgICAgJ05vdGUgdGhhdCBkeW5hbWljIGRpcmVjdGl2ZSBhcmd1bWVudCBjYW5ub3QgY29udGFpbiBzcGFjZXMuJyxcbiAgICBbMjYgLyogRXJyb3JDb2Rlcy5YX01JU1NJTkdfRElSRUNUSVZFX05BTUUgKi9dOiAnTGVnYWwgZGlyZWN0aXZlIG5hbWUgd2FzIGV4cGVjdGVkLicsXG4gICAgLy8gdHJhbnNmb3JtIGVycm9yc1xuICAgIFsyOCAvKiBFcnJvckNvZGVzLlhfVl9JRl9OT19FWFBSRVNTSU9OICovXTogYHYtaWYvdi1lbHNlLWlmIGlzIG1pc3NpbmcgZXhwcmVzc2lvbi5gLFxuICAgIFsyOSAvKiBFcnJvckNvZGVzLlhfVl9JRl9TQU1FX0tFWSAqL106IGB2LWlmL2Vsc2UgYnJhbmNoZXMgbXVzdCB1c2UgdW5pcXVlIGtleXMuYCxcbiAgICBbMzAgLyogRXJyb3JDb2Rlcy5YX1ZfRUxTRV9OT19BREpBQ0VOVF9JRiAqL106IGB2LWVsc2Uvdi1lbHNlLWlmIGhhcyBubyBhZGphY2VudCB2LWlmIG9yIHYtZWxzZS1pZi5gLFxuICAgIFszMSAvKiBFcnJvckNvZGVzLlhfVl9GT1JfTk9fRVhQUkVTU0lPTiAqL106IGB2LWZvciBpcyBtaXNzaW5nIGV4cHJlc3Npb24uYCxcbiAgICBbMzIgLyogRXJyb3JDb2Rlcy5YX1ZfRk9SX01BTEZPUk1FRF9FWFBSRVNTSU9OICovXTogYHYtZm9yIGhhcyBpbnZhbGlkIGV4cHJlc3Npb24uYCxcbiAgICBbMzMgLyogRXJyb3JDb2Rlcy5YX1ZfRk9SX1RFTVBMQVRFX0tFWV9QTEFDRU1FTlQgKi9dOiBgPHRlbXBsYXRlIHYtZm9yPiBrZXkgc2hvdWxkIGJlIHBsYWNlZCBvbiB0aGUgPHRlbXBsYXRlPiB0YWcuYCxcbiAgICBbMzQgLyogRXJyb3JDb2Rlcy5YX1ZfQklORF9OT19FWFBSRVNTSU9OICovXTogYHYtYmluZCBpcyBtaXNzaW5nIGV4cHJlc3Npb24uYCxcbiAgICBbMzUgLyogRXJyb3JDb2Rlcy5YX1ZfT05fTk9fRVhQUkVTU0lPTiAqL106IGB2LW9uIGlzIG1pc3NpbmcgZXhwcmVzc2lvbi5gLFxuICAgIFszNiAvKiBFcnJvckNvZGVzLlhfVl9TTE9UX1VORVhQRUNURURfRElSRUNUSVZFX09OX1NMT1RfT1VUTEVUICovXTogYFVuZXhwZWN0ZWQgY3VzdG9tIGRpcmVjdGl2ZSBvbiA8c2xvdD4gb3V0bGV0LmAsXG4gICAgWzM3IC8qIEVycm9yQ29kZXMuWF9WX1NMT1RfTUlYRURfU0xPVF9VU0FHRSAqL106IGBNaXhlZCB2LXNsb3QgdXNhZ2Ugb24gYm90aCB0aGUgY29tcG9uZW50IGFuZCBuZXN0ZWQgPHRlbXBsYXRlPi4gYCArXG4gICAgICAgIGBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBuYW1lZCBzbG90cywgYWxsIHNsb3RzIHNob3VsZCB1c2UgPHRlbXBsYXRlPiBgICtcbiAgICAgICAgYHN5bnRheCB0byBhdm9pZCBzY29wZSBhbWJpZ3VpdHkuYCxcbiAgICBbMzggLyogRXJyb3JDb2Rlcy5YX1ZfU0xPVF9EVVBMSUNBVEVfU0xPVF9OQU1FUyAqL106IGBEdXBsaWNhdGUgc2xvdCBuYW1lcyBmb3VuZC4gYCxcbiAgICBbMzkgLyogRXJyb3JDb2Rlcy5YX1ZfU0xPVF9FWFRSQU5FT1VTX0RFRkFVTFRfU0xPVF9DSElMRFJFTiAqL106IGBFeHRyYW5lb3VzIGNoaWxkcmVuIGZvdW5kIHdoZW4gY29tcG9uZW50IGFscmVhZHkgaGFzIGV4cGxpY2l0bHkgbmFtZWQgYCArXG4gICAgICAgIGBkZWZhdWx0IHNsb3QuIFRoZXNlIGNoaWxkcmVuIHdpbGwgYmUgaWdub3JlZC5gLFxuICAgIFs0MCAvKiBFcnJvckNvZGVzLlhfVl9TTE9UX01JU1BMQUNFRCAqL106IGB2LXNsb3QgY2FuIG9ubHkgYmUgdXNlZCBvbiBjb21wb25lbnRzIG9yIDx0ZW1wbGF0ZT4gdGFncy5gLFxuICAgIFs0MSAvKiBFcnJvckNvZGVzLlhfVl9NT0RFTF9OT19FWFBSRVNTSU9OICovXTogYHYtbW9kZWwgaXMgbWlzc2luZyBleHByZXNzaW9uLmAsXG4gICAgWzQyIC8qIEVycm9yQ29kZXMuWF9WX01PREVMX01BTEZPUk1FRF9FWFBSRVNTSU9OICovXTogYHYtbW9kZWwgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIEphdmFTY3JpcHQgbWVtYmVyIGV4cHJlc3Npb24uYCxcbiAgICBbNDMgLyogRXJyb3JDb2Rlcy5YX1ZfTU9ERUxfT05fU0NPUEVfVkFSSUFCTEUgKi9dOiBgdi1tb2RlbCBjYW5ub3QgYmUgdXNlZCBvbiB2LWZvciBvciB2LXNsb3Qgc2NvcGUgdmFyaWFibGVzIGJlY2F1c2UgdGhleSBhcmUgbm90IHdyaXRhYmxlLmAsXG4gICAgWzQ0IC8qIEVycm9yQ29kZXMuWF9WX01PREVMX09OX1BST1BTICovXTogYHYtbW9kZWwgY2Fubm90IGJlIHVzZWQgb24gYSBwcm9wLCBiZWNhdXNlIGxvY2FsIHByb3AgYmluZGluZ3MgYXJlIG5vdCB3cml0YWJsZS5cXG5Vc2UgYSB2LWJpbmQgYmluZGluZyBjb21iaW5lZCB3aXRoIGEgdi1vbiBsaXN0ZW5lciB0aGF0IGVtaXRzIHVwZGF0ZTp4IGV2ZW50IGluc3RlYWQuYCxcbiAgICBbNDUgLyogRXJyb3JDb2Rlcy5YX0lOVkFMSURfRVhQUkVTU0lPTiAqL106IGBFcnJvciBwYXJzaW5nIEphdmFTY3JpcHQgZXhwcmVzc2lvbjogYCxcbiAgICBbNDYgLyogRXJyb3JDb2Rlcy5YX0tFRVBfQUxJVkVfSU5WQUxJRF9DSElMRFJFTiAqL106IGA8S2VlcEFsaXZlPiBleHBlY3RzIGV4YWN0bHkgb25lIGNoaWxkIGNvbXBvbmVudC5gLFxuICAgIC8vIGdlbmVyaWMgZXJyb3JzXG4gICAgWzQ3IC8qIEVycm9yQ29kZXMuWF9QUkVGSVhfSURfTk9UX1NVUFBPUlRFRCAqL106IGBcInByZWZpeElkZW50aWZpZXJzXCIgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBidWlsZCBvZiBjb21waWxlci5gLFxuICAgIFs0OCAvKiBFcnJvckNvZGVzLlhfTU9EVUxFX01PREVfTk9UX1NVUFBPUlRFRCAqL106IGBFUyBtb2R1bGUgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnVpbGQgb2YgY29tcGlsZXIuYCxcbiAgICBbNDkgLyogRXJyb3JDb2Rlcy5YX0NBQ0hFX0hBTkRMRVJfTk9UX1NVUFBPUlRFRCAqL106IGBcImNhY2hlSGFuZGxlcnNcIiBvcHRpb24gaXMgb25seSBzdXBwb3J0ZWQgd2hlbiB0aGUgXCJwcmVmaXhJZGVudGlmaWVyc1wiIG9wdGlvbiBpcyBlbmFibGVkLmAsXG4gICAgWzUwIC8qIEVycm9yQ29kZXMuWF9TQ09QRV9JRF9OT1RfU1VQUE9SVEVEICovXTogYFwic2NvcGVJZFwiIG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBpbiBtb2R1bGUgbW9kZS5gLFxuICAgIC8vIGp1c3QgdG8gZnVsZmlsbCB0eXBlc1xuICAgIFs1MSAvKiBFcnJvckNvZGVzLl9fRVhURU5EX1BPSU5UX18gKi9dOiBgYFxufTtcblxuY29uc3QgRlJBR01FTlQgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYEZyYWdtZW50YCA6IGBgKTtcbmNvbnN0IFRFTEVQT1JUID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGBUZWxlcG9ydGAgOiBgYCk7XG5jb25zdCBTVVNQRU5TRSA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBgU3VzcGVuc2VgIDogYGApO1xuY29uc3QgS0VFUF9BTElWRSA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBgS2VlcEFsaXZlYCA6IGBgKTtcbmNvbnN0IEJBU0VfVFJBTlNJVElPTiA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBgQmFzZVRyYW5zaXRpb25gIDogYGApO1xuY29uc3QgT1BFTl9CTE9DSyA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBgb3BlbkJsb2NrYCA6IGBgKTtcbmNvbnN0IENSRUFURV9CTE9DSyA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBgY3JlYXRlQmxvY2tgIDogYGApO1xuY29uc3QgQ1JFQVRFX0VMRU1FTlRfQkxPQ0sgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYGNyZWF0ZUVsZW1lbnRCbG9ja2AgOiBgYCk7XG5jb25zdCBDUkVBVEVfVk5PREUgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYGNyZWF0ZVZOb2RlYCA6IGBgKTtcbmNvbnN0IENSRUFURV9FTEVNRU5UX1ZOT0RFID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGBjcmVhdGVFbGVtZW50Vk5vZGVgIDogYGApO1xuY29uc3QgQ1JFQVRFX0NPTU1FTlQgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYGNyZWF0ZUNvbW1lbnRWTm9kZWAgOiBgYCk7XG5jb25zdCBDUkVBVEVfVEVYVCA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBgY3JlYXRlVGV4dFZOb2RlYCA6IGBgKTtcbmNvbnN0IENSRUFURV9TVEFUSUMgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYGNyZWF0ZVN0YXRpY1ZOb2RlYCA6IGBgKTtcbmNvbnN0IFJFU09MVkVfQ09NUE9ORU5UID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGByZXNvbHZlQ29tcG9uZW50YCA6IGBgKTtcbmNvbnN0IFJFU09MVkVfRFlOQU1JQ19DT01QT05FTlQgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYHJlc29sdmVEeW5hbWljQ29tcG9uZW50YCA6IGBgKTtcbmNvbnN0IFJFU09MVkVfRElSRUNUSVZFID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGByZXNvbHZlRGlyZWN0aXZlYCA6IGBgKTtcbmNvbnN0IFJFU09MVkVfRklMVEVSID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGByZXNvbHZlRmlsdGVyYCA6IGBgKTtcbmNvbnN0IFdJVEhfRElSRUNUSVZFUyA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBgd2l0aERpcmVjdGl2ZXNgIDogYGApO1xuY29uc3QgUkVOREVSX0xJU1QgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYHJlbmRlckxpc3RgIDogYGApO1xuY29uc3QgUkVOREVSX1NMT1QgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYHJlbmRlclNsb3RgIDogYGApO1xuY29uc3QgQ1JFQVRFX1NMT1RTID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGBjcmVhdGVTbG90c2AgOiBgYCk7XG5jb25zdCBUT19ESVNQTEFZX1NUUklORyA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBgdG9EaXNwbGF5U3RyaW5nYCA6IGBgKTtcbmNvbnN0IE1FUkdFX1BST1BTID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGBtZXJnZVByb3BzYCA6IGBgKTtcbmNvbnN0IE5PUk1BTElaRV9DTEFTUyA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBgbm9ybWFsaXplQ2xhc3NgIDogYGApO1xuY29uc3QgTk9STUFMSVpFX1NUWUxFID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGBub3JtYWxpemVTdHlsZWAgOiBgYCk7XG5jb25zdCBOT1JNQUxJWkVfUFJPUFMgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYG5vcm1hbGl6ZVByb3BzYCA6IGBgKTtcbmNvbnN0IEdVQVJEX1JFQUNUSVZFX1BST1BTID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGBndWFyZFJlYWN0aXZlUHJvcHNgIDogYGApO1xuY29uc3QgVE9fSEFORExFUlMgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYHRvSGFuZGxlcnNgIDogYGApO1xuY29uc3QgQ0FNRUxJWkUgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYGNhbWVsaXplYCA6IGBgKTtcbmNvbnN0IENBUElUQUxJWkUgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYGNhcGl0YWxpemVgIDogYGApO1xuY29uc3QgVE9fSEFORExFUl9LRVkgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYHRvSGFuZGxlcktleWAgOiBgYCk7XG5jb25zdCBTRVRfQkxPQ0tfVFJBQ0tJTkcgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYHNldEJsb2NrVHJhY2tpbmdgIDogYGApO1xuY29uc3QgUFVTSF9TQ09QRV9JRCA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBgcHVzaFNjb3BlSWRgIDogYGApO1xuY29uc3QgUE9QX1NDT1BFX0lEID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGBwb3BTY29wZUlkYCA6IGBgKTtcbmNvbnN0IFdJVEhfQ1RYID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGB3aXRoQ3R4YCA6IGBgKTtcbmNvbnN0IFVOUkVGID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGB1bnJlZmAgOiBgYCk7XG5jb25zdCBJU19SRUYgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYGlzUmVmYCA6IGBgKTtcbmNvbnN0IFdJVEhfTUVNTyA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBgd2l0aE1lbW9gIDogYGApO1xuY29uc3QgSVNfTUVNT19TQU1FID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGBpc01lbW9TYW1lYCA6IGBgKTtcbi8vIE5hbWUgbWFwcGluZyBmb3IgcnVudGltZSBoZWxwZXJzIHRoYXQgbmVlZCB0byBiZSBpbXBvcnRlZCBmcm9tICd2dWUnIGluXG4vLyBnZW5lcmF0ZWQgY29kZS4gTWFrZSBzdXJlIHRoZXNlIGFyZSBjb3JyZWN0bHkgZXhwb3J0ZWQgaW4gdGhlIHJ1bnRpbWUhXG5jb25zdCBoZWxwZXJOYW1lTWFwID0ge1xuICAgIFtGUkFHTUVOVF06IGBGcmFnbWVudGAsXG4gICAgW1RFTEVQT1JUXTogYFRlbGVwb3J0YCxcbiAgICBbU1VTUEVOU0VdOiBgU3VzcGVuc2VgLFxuICAgIFtLRUVQX0FMSVZFXTogYEtlZXBBbGl2ZWAsXG4gICAgW0JBU0VfVFJBTlNJVElPTl06IGBCYXNlVHJhbnNpdGlvbmAsXG4gICAgW09QRU5fQkxPQ0tdOiBgb3BlbkJsb2NrYCxcbiAgICBbQ1JFQVRFX0JMT0NLXTogYGNyZWF0ZUJsb2NrYCxcbiAgICBbQ1JFQVRFX0VMRU1FTlRfQkxPQ0tdOiBgY3JlYXRlRWxlbWVudEJsb2NrYCxcbiAgICBbQ1JFQVRFX1ZOT0RFXTogYGNyZWF0ZVZOb2RlYCxcbiAgICBbQ1JFQVRFX0VMRU1FTlRfVk5PREVdOiBgY3JlYXRlRWxlbWVudFZOb2RlYCxcbiAgICBbQ1JFQVRFX0NPTU1FTlRdOiBgY3JlYXRlQ29tbWVudFZOb2RlYCxcbiAgICBbQ1JFQVRFX1RFWFRdOiBgY3JlYXRlVGV4dFZOb2RlYCxcbiAgICBbQ1JFQVRFX1NUQVRJQ106IGBjcmVhdGVTdGF0aWNWTm9kZWAsXG4gICAgW1JFU09MVkVfQ09NUE9ORU5UXTogYHJlc29sdmVDb21wb25lbnRgLFxuICAgIFtSRVNPTFZFX0RZTkFNSUNfQ09NUE9ORU5UXTogYHJlc29sdmVEeW5hbWljQ29tcG9uZW50YCxcbiAgICBbUkVTT0xWRV9ESVJFQ1RJVkVdOiBgcmVzb2x2ZURpcmVjdGl2ZWAsXG4gICAgW1JFU09MVkVfRklMVEVSXTogYHJlc29sdmVGaWx0ZXJgLFxuICAgIFtXSVRIX0RJUkVDVElWRVNdOiBgd2l0aERpcmVjdGl2ZXNgLFxuICAgIFtSRU5ERVJfTElTVF06IGByZW5kZXJMaXN0YCxcbiAgICBbUkVOREVSX1NMT1RdOiBgcmVuZGVyU2xvdGAsXG4gICAgW0NSRUFURV9TTE9UU106IGBjcmVhdGVTbG90c2AsXG4gICAgW1RPX0RJU1BMQVlfU1RSSU5HXTogYHRvRGlzcGxheVN0cmluZ2AsXG4gICAgW01FUkdFX1BST1BTXTogYG1lcmdlUHJvcHNgLFxuICAgIFtOT1JNQUxJWkVfQ0xBU1NdOiBgbm9ybWFsaXplQ2xhc3NgLFxuICAgIFtOT1JNQUxJWkVfU1RZTEVdOiBgbm9ybWFsaXplU3R5bGVgLFxuICAgIFtOT1JNQUxJWkVfUFJPUFNdOiBgbm9ybWFsaXplUHJvcHNgLFxuICAgIFtHVUFSRF9SRUFDVElWRV9QUk9QU106IGBndWFyZFJlYWN0aXZlUHJvcHNgLFxuICAgIFtUT19IQU5ETEVSU106IGB0b0hhbmRsZXJzYCxcbiAgICBbQ0FNRUxJWkVdOiBgY2FtZWxpemVgLFxuICAgIFtDQVBJVEFMSVpFXTogYGNhcGl0YWxpemVgLFxuICAgIFtUT19IQU5ETEVSX0tFWV06IGB0b0hhbmRsZXJLZXlgLFxuICAgIFtTRVRfQkxPQ0tfVFJBQ0tJTkddOiBgc2V0QmxvY2tUcmFja2luZ2AsXG4gICAgW1BVU0hfU0NPUEVfSURdOiBgcHVzaFNjb3BlSWRgLFxuICAgIFtQT1BfU0NPUEVfSURdOiBgcG9wU2NvcGVJZGAsXG4gICAgW1dJVEhfQ1RYXTogYHdpdGhDdHhgLFxuICAgIFtVTlJFRl06IGB1bnJlZmAsXG4gICAgW0lTX1JFRl06IGBpc1JlZmAsXG4gICAgW1dJVEhfTUVNT106IGB3aXRoTWVtb2AsXG4gICAgW0lTX01FTU9fU0FNRV06IGBpc01lbW9TYW1lYFxufTtcbmZ1bmN0aW9uIHJlZ2lzdGVyUnVudGltZUhlbHBlcnMoaGVscGVycykge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaGVscGVycykuZm9yRWFjaChzID0+IHtcbiAgICAgICAgaGVscGVyTmFtZU1hcFtzXSA9IGhlbHBlcnNbc107XG4gICAgfSk7XG59XG5cbi8vIEFTVCBVdGlsaXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTb21lIGV4cHJlc3Npb25zLCBlLmcuIHNlcXVlbmNlIGFuZCBjb25kaXRpb25hbCBleHByZXNzaW9ucywgYXJlIG5ldmVyXG4vLyBhc3NvY2lhdGVkIHdpdGggdGVtcGxhdGUgbm9kZXMsIHNvIHRoZWlyIHNvdXJjZSBsb2NhdGlvbnMgYXJlIGp1c3QgYSBzdHViLlxuLy8gQ29udGFpbmVyIHR5cGVzIGxpa2UgQ29tcG91bmRFeHByZXNzaW9uIGFsc28gZG9uJ3QgbmVlZCBhIHJlYWwgbG9jYXRpb24uXG5jb25zdCBsb2NTdHViID0ge1xuICAgIHNvdXJjZTogJycsXG4gICAgc3RhcnQ6IHsgbGluZTogMSwgY29sdW1uOiAxLCBvZmZzZXQ6IDAgfSxcbiAgICBlbmQ6IHsgbGluZTogMSwgY29sdW1uOiAxLCBvZmZzZXQ6IDAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZVJvb3QoY2hpbGRyZW4sIGxvYyA9IGxvY1N0dWIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAwIC8qIE5vZGVUeXBlcy5ST09UICovLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgaGVscGVyczogbmV3IFNldCgpLFxuICAgICAgICBjb21wb25lbnRzOiBbXSxcbiAgICAgICAgZGlyZWN0aXZlczogW10sXG4gICAgICAgIGhvaXN0czogW10sXG4gICAgICAgIGltcG9ydHM6IFtdLFxuICAgICAgICBjYWNoZWQ6IDAsXG4gICAgICAgIHRlbXBzOiAwLFxuICAgICAgICBjb2RlZ2VuTm9kZTogdW5kZWZpbmVkLFxuICAgICAgICBsb2NcbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlVk5vZGVDYWxsKGNvbnRleHQsIHRhZywgcHJvcHMsIGNoaWxkcmVuLCBwYXRjaEZsYWcsIGR5bmFtaWNQcm9wcywgZGlyZWN0aXZlcywgaXNCbG9jayA9IGZhbHNlLCBkaXNhYmxlVHJhY2tpbmcgPSBmYWxzZSwgaXNDb21wb25lbnQgPSBmYWxzZSwgbG9jID0gbG9jU3R1Yikge1xuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICAgIGlmIChpc0Jsb2NrKSB7XG4gICAgICAgICAgICBjb250ZXh0LmhlbHBlcihPUEVOX0JMT0NLKTtcbiAgICAgICAgICAgIGNvbnRleHQuaGVscGVyKGdldFZOb2RlQmxvY2tIZWxwZXIoY29udGV4dC5pblNTUiwgaXNDb21wb25lbnQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHQuaGVscGVyKGdldFZOb2RlSGVscGVyKGNvbnRleHQuaW5TU1IsIGlzQ29tcG9uZW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpcmVjdGl2ZXMpIHtcbiAgICAgICAgICAgIGNvbnRleHQuaGVscGVyKFdJVEhfRElSRUNUSVZFUyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogMTMgLyogTm9kZVR5cGVzLlZOT0RFX0NBTEwgKi8sXG4gICAgICAgIHRhZyxcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBwYXRjaEZsYWcsXG4gICAgICAgIGR5bmFtaWNQcm9wcyxcbiAgICAgICAgZGlyZWN0aXZlcyxcbiAgICAgICAgaXNCbG9jayxcbiAgICAgICAgZGlzYWJsZVRyYWNraW5nLFxuICAgICAgICBpc0NvbXBvbmVudCxcbiAgICAgICAgbG9jXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUFycmF5RXhwcmVzc2lvbihlbGVtZW50cywgbG9jID0gbG9jU3R1Yikge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IDE3IC8qIE5vZGVUeXBlcy5KU19BUlJBWV9FWFBSRVNTSU9OICovLFxuICAgICAgICBsb2MsXG4gICAgICAgIGVsZW1lbnRzXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZU9iamVjdEV4cHJlc3Npb24ocHJvcGVydGllcywgbG9jID0gbG9jU3R1Yikge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IDE1IC8qIE5vZGVUeXBlcy5KU19PQkpFQ1RfRVhQUkVTU0lPTiAqLyxcbiAgICAgICAgbG9jLFxuICAgICAgICBwcm9wZXJ0aWVzXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZU9iamVjdFByb3BlcnR5KGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAxNiAvKiBOb2RlVHlwZXMuSlNfUFJPUEVSVFkgKi8sXG4gICAgICAgIGxvYzogbG9jU3R1YixcbiAgICAgICAga2V5OiBpc1N0cmluZyhrZXkpID8gY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihrZXksIHRydWUpIDoga2V5LFxuICAgICAgICB2YWx1ZVxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGNvbnRlbnQsIGlzU3RhdGljID0gZmFsc2UsIGxvYyA9IGxvY1N0dWIsIGNvbnN0VHlwZSA9IDAgLyogQ29uc3RhbnRUeXBlcy5OT1RfQ09OU1RBTlQgKi8pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiA0IC8qIE5vZGVUeXBlcy5TSU1QTEVfRVhQUkVTU0lPTiAqLyxcbiAgICAgICAgbG9jLFxuICAgICAgICBjb250ZW50LFxuICAgICAgICBpc1N0YXRpYyxcbiAgICAgICAgY29uc3RUeXBlOiBpc1N0YXRpYyA/IDMgLyogQ29uc3RhbnRUeXBlcy5DQU5fU1RSSU5HSUZZICovIDogY29uc3RUeXBlXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUludGVycG9sYXRpb24oY29udGVudCwgbG9jKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogNSAvKiBOb2RlVHlwZXMuSU5URVJQT0xBVElPTiAqLyxcbiAgICAgICAgbG9jLFxuICAgICAgICBjb250ZW50OiBpc1N0cmluZyhjb250ZW50KVxuICAgICAgICAgICAgPyBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGNvbnRlbnQsIGZhbHNlLCBsb2MpXG4gICAgICAgICAgICA6IGNvbnRlbnRcbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRFeHByZXNzaW9uKGNoaWxkcmVuLCBsb2MgPSBsb2NTdHViKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogOCAvKiBOb2RlVHlwZXMuQ09NUE9VTkRfRVhQUkVTU0lPTiAqLyxcbiAgICAgICAgbG9jLFxuICAgICAgICBjaGlsZHJlblxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDYWxsRXhwcmVzc2lvbihjYWxsZWUsIGFyZ3MgPSBbXSwgbG9jID0gbG9jU3R1Yikge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IDE0IC8qIE5vZGVUeXBlcy5KU19DQUxMX0VYUFJFU1NJT04gKi8sXG4gICAgICAgIGxvYyxcbiAgICAgICAgY2FsbGVlLFxuICAgICAgICBhcmd1bWVudHM6IGFyZ3NcbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb25FeHByZXNzaW9uKHBhcmFtcywgcmV0dXJucyA9IHVuZGVmaW5lZCwgbmV3bGluZSA9IGZhbHNlLCBpc1Nsb3QgPSBmYWxzZSwgbG9jID0gbG9jU3R1Yikge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IDE4IC8qIE5vZGVUeXBlcy5KU19GVU5DVElPTl9FWFBSRVNTSU9OICovLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIHJldHVybnMsXG4gICAgICAgIG5ld2xpbmUsXG4gICAgICAgIGlzU2xvdCxcbiAgICAgICAgbG9jXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNvbmRpdGlvbmFsRXhwcmVzc2lvbih0ZXN0LCBjb25zZXF1ZW50LCBhbHRlcm5hdGUsIG5ld2xpbmUgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogMTkgLyogTm9kZVR5cGVzLkpTX0NPTkRJVElPTkFMX0VYUFJFU1NJT04gKi8sXG4gICAgICAgIHRlc3QsXG4gICAgICAgIGNvbnNlcXVlbnQsXG4gICAgICAgIGFsdGVybmF0ZSxcbiAgICAgICAgbmV3bGluZSxcbiAgICAgICAgbG9jOiBsb2NTdHViXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlRXhwcmVzc2lvbihpbmRleCwgdmFsdWUsIGlzVk5vZGUgPSBmYWxzZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IDIwIC8qIE5vZGVUeXBlcy5KU19DQUNIRV9FWFBSRVNTSU9OICovLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGlzVk5vZGUsXG4gICAgICAgIGxvYzogbG9jU3R1YlxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVCbG9ja1N0YXRlbWVudChib2R5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogMjEgLyogTm9kZVR5cGVzLkpTX0JMT0NLX1NUQVRFTUVOVCAqLyxcbiAgICAgICAgYm9keSxcbiAgICAgICAgbG9jOiBsb2NTdHViXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRlbXBsYXRlTGl0ZXJhbChlbGVtZW50cykge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IDIyIC8qIE5vZGVUeXBlcy5KU19URU1QTEFURV9MSVRFUkFMICovLFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgbG9jOiBsb2NTdHViXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUlmU3RhdGVtZW50KHRlc3QsIGNvbnNlcXVlbnQsIGFsdGVybmF0ZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IDIzIC8qIE5vZGVUeXBlcy5KU19JRl9TVEFURU1FTlQgKi8sXG4gICAgICAgIHRlc3QsXG4gICAgICAgIGNvbnNlcXVlbnQsXG4gICAgICAgIGFsdGVybmF0ZSxcbiAgICAgICAgbG9jOiBsb2NTdHViXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUFzc2lnbm1lbnRFeHByZXNzaW9uKGxlZnQsIHJpZ2h0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogMjQgLyogTm9kZVR5cGVzLkpTX0FTU0lHTk1FTlRfRVhQUkVTU0lPTiAqLyxcbiAgICAgICAgbGVmdCxcbiAgICAgICAgcmlnaHQsXG4gICAgICAgIGxvYzogbG9jU3R1YlxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVTZXF1ZW5jZUV4cHJlc3Npb24oZXhwcmVzc2lvbnMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAyNSAvKiBOb2RlVHlwZXMuSlNfU0VRVUVOQ0VfRVhQUkVTU0lPTiAqLyxcbiAgICAgICAgZXhwcmVzc2lvbnMsXG4gICAgICAgIGxvYzogbG9jU3R1YlxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVSZXR1cm5TdGF0ZW1lbnQocmV0dXJucykge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IDI2IC8qIE5vZGVUeXBlcy5KU19SRVRVUk5fU1RBVEVNRU5UICovLFxuICAgICAgICByZXR1cm5zLFxuICAgICAgICBsb2M6IGxvY1N0dWJcbiAgICB9O1xufVxuXG5jb25zdCBpc1N0YXRpY0V4cCA9IChwKSA9PiBwLnR5cGUgPT09IDQgLyogTm9kZVR5cGVzLlNJTVBMRV9FWFBSRVNTSU9OICovICYmIHAuaXNTdGF0aWM7XG5jb25zdCBpc0J1aWx0SW5UeXBlID0gKHRhZywgZXhwZWN0ZWQpID0+IHRhZyA9PT0gZXhwZWN0ZWQgfHwgdGFnID09PSBoeXBoZW5hdGUoZXhwZWN0ZWQpO1xuZnVuY3Rpb24gaXNDb3JlQ29tcG9uZW50KHRhZykge1xuICAgIGlmIChpc0J1aWx0SW5UeXBlKHRhZywgJ1RlbGVwb3J0JykpIHtcbiAgICAgICAgcmV0dXJuIFRFTEVQT1JUO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0J1aWx0SW5UeXBlKHRhZywgJ1N1c3BlbnNlJykpIHtcbiAgICAgICAgcmV0dXJuIFNVU1BFTlNFO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0J1aWx0SW5UeXBlKHRhZywgJ0tlZXBBbGl2ZScpKSB7XG4gICAgICAgIHJldHVybiBLRUVQX0FMSVZFO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0J1aWx0SW5UeXBlKHRhZywgJ0Jhc2VUcmFuc2l0aW9uJykpIHtcbiAgICAgICAgcmV0dXJuIEJBU0VfVFJBTlNJVElPTjtcbiAgICB9XG59XG5jb25zdCBub25JZGVudGlmaWVyUkUgPSAvXlxcZHxbXlxcJFxcd10vO1xuY29uc3QgaXNTaW1wbGVJZGVudGlmaWVyID0gKG5hbWUpID0+ICFub25JZGVudGlmaWVyUkUudGVzdChuYW1lKTtcbmNvbnN0IHZhbGlkRmlyc3RJZGVudENoYXJSRSA9IC9bQS1aYS16XyRcXHhBMC1cXHVGRkZGXS87XG5jb25zdCB2YWxpZElkZW50Q2hhclJFID0gL1tcXC5cXD9cXHckXFx4QTAtXFx1RkZGRl0vO1xuY29uc3Qgd2hpdGVzcGFjZVJFID0gL1xccytbLltdXFxzKnxcXHMqWy5bXVxccysvZztcbi8qKlxuICogU2ltcGxlIGxleGVyIHRvIGNoZWNrIGlmIGFuIGV4cHJlc3Npb24gaXMgYSBtZW1iZXIgZXhwcmVzc2lvbi4gVGhpcyBpc1xuICogbGF4IGFuZCBvbmx5IGNoZWNrcyB2YWxpZGl0eSBhdCB0aGUgcm9vdCBsZXZlbCAoaS5lLiBkb2VzIG5vdCB2YWxpZGF0ZSBleHBzXG4gKiBpbnNpZGUgc3F1YXJlIGJyYWNrZXRzKSwgYnV0IGl0J3Mgb2sgc2luY2UgdGhlc2UgYXJlIG9ubHkgdXNlZCBvbiB0ZW1wbGF0ZVxuICogZXhwcmVzc2lvbnMgYW5kIGZhbHNlIHBvc2l0aXZlcyBhcmUgaW52YWxpZCBleHByZXNzaW9ucyBpbiB0aGUgZmlyc3QgcGxhY2UuXG4gKi9cbmNvbnN0IGlzTWVtYmVyRXhwcmVzc2lvbkJyb3dzZXIgPSAocGF0aCkgPT4ge1xuICAgIC8vIHJlbW92ZSB3aGl0ZXNwYWNlcyBhcm91bmQgLiBvciBbIGZpcnN0XG4gICAgcGF0aCA9IHBhdGgudHJpbSgpLnJlcGxhY2Uod2hpdGVzcGFjZVJFLCBzID0+IHMudHJpbSgpKTtcbiAgICBsZXQgc3RhdGUgPSAwIC8qIE1lbWJlckV4cExleFN0YXRlLmluTWVtYmVyRXhwICovO1xuICAgIGxldCBzdGF0ZVN0YWNrID0gW107XG4gICAgbGV0IGN1cnJlbnRPcGVuQnJhY2tldENvdW50ID0gMDtcbiAgICBsZXQgY3VycmVudE9wZW5QYXJlbnNDb3VudCA9IDA7XG4gICAgbGV0IGN1cnJlbnRTdHJpbmdUeXBlID0gbnVsbDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hhciA9IHBhdGguY2hhckF0KGkpO1xuICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlIDAgLyogTWVtYmVyRXhwTGV4U3RhdGUuaW5NZW1iZXJFeHAgKi86XG4gICAgICAgICAgICAgICAgaWYgKGNoYXIgPT09ICdbJykge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0YWNrLnB1c2goc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDEgLyogTWVtYmVyRXhwTGV4U3RhdGUuaW5CcmFja2V0cyAqLztcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE9wZW5CcmFja2V0Q291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hhciA9PT0gJygnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlU3RhY2sucHVzaChzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMiAvKiBNZW1iZXJFeHBMZXhTdGF0ZS5pblBhcmVucyAqLztcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE9wZW5QYXJlbnNDb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghKGkgPT09IDAgPyB2YWxpZEZpcnN0SWRlbnRDaGFyUkUgOiB2YWxpZElkZW50Q2hhclJFKS50ZXN0KGNoYXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDEgLyogTWVtYmVyRXhwTGV4U3RhdGUuaW5CcmFja2V0cyAqLzpcbiAgICAgICAgICAgICAgICBpZiAoY2hhciA9PT0gYCdgIHx8IGNoYXIgPT09IGBcImAgfHwgY2hhciA9PT0gJ2AnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlU3RhY2sucHVzaChzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMyAvKiBNZW1iZXJFeHBMZXhTdGF0ZS5pblN0cmluZyAqLztcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0cmluZ1R5cGUgPSBjaGFyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGFyID09PSBgW2ApIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE9wZW5CcmFja2V0Q291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hhciA9PT0gYF1gKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghLS1jdXJyZW50T3BlbkJyYWNrZXRDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZVN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyIC8qIE1lbWJlckV4cExleFN0YXRlLmluUGFyZW5zICovOlxuICAgICAgICAgICAgICAgIGlmIChjaGFyID09PSBgJ2AgfHwgY2hhciA9PT0gYFwiYCB8fCBjaGFyID09PSAnYCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGVTdGFjay5wdXNoKHN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAzIC8qIE1lbWJlckV4cExleFN0YXRlLmluU3RyaW5nICovO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RyaW5nVHlwZSA9IGNoYXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoYXIgPT09IGAoYCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3BlblBhcmVuc0NvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoYXIgPT09IGApYCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZXhwIGVuZHMgYXMgYSBjYWxsIHRoZW4gaXQgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIHZhbGlkXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBwYXRoLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIS0tY3VycmVudE9wZW5QYXJlbnNDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZVN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzIC8qIE1lbWJlckV4cExleFN0YXRlLmluU3RyaW5nICovOlxuICAgICAgICAgICAgICAgIGlmIChjaGFyID09PSBjdXJyZW50U3RyaW5nVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlU3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdHJpbmdUeXBlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICFjdXJyZW50T3BlbkJyYWNrZXRDb3VudCAmJiAhY3VycmVudE9wZW5QYXJlbnNDb3VudDtcbn07XG5jb25zdCBpc01lbWJlckV4cHJlc3Npb25Ob2RlID0gTk9PUFxuICAgIDtcbmNvbnN0IGlzTWVtYmVyRXhwcmVzc2lvbiA9IGlzTWVtYmVyRXhwcmVzc2lvbkJyb3dzZXJcbiAgICA7XG5mdW5jdGlvbiBnZXRJbm5lclJhbmdlKGxvYywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBsb2Muc291cmNlLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTtcbiAgICBjb25zdCBuZXdMb2MgPSB7XG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgc3RhcnQ6IGFkdmFuY2VQb3NpdGlvbldpdGhDbG9uZShsb2Muc3RhcnQsIGxvYy5zb3VyY2UsIG9mZnNldCksXG4gICAgICAgIGVuZDogbG9jLmVuZFxuICAgIH07XG4gICAgaWYgKGxlbmd0aCAhPSBudWxsKSB7XG4gICAgICAgIG5ld0xvYy5lbmQgPSBhZHZhbmNlUG9zaXRpb25XaXRoQ2xvbmUobG9jLnN0YXJ0LCBsb2Muc291cmNlLCBvZmZzZXQgKyBsZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3TG9jO1xufVxuZnVuY3Rpb24gYWR2YW5jZVBvc2l0aW9uV2l0aENsb25lKHBvcywgc291cmNlLCBudW1iZXJPZkNoYXJhY3RlcnMgPSBzb3VyY2UubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFkdmFuY2VQb3NpdGlvbldpdGhNdXRhdGlvbihleHRlbmQoe30sIHBvcyksIHNvdXJjZSwgbnVtYmVyT2ZDaGFyYWN0ZXJzKTtcbn1cbi8vIGFkdmFuY2UgYnkgbXV0YXRpb24gd2l0aG91dCBjbG9uaW5nIChmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyksIHNpbmNlIHRoaXNcbi8vIGdldHMgY2FsbGVkIGEgbG90IGluIHRoZSBwYXJzZXJcbmZ1bmN0aW9uIGFkdmFuY2VQb3NpdGlvbldpdGhNdXRhdGlvbihwb3MsIHNvdXJjZSwgbnVtYmVyT2ZDaGFyYWN0ZXJzID0gc291cmNlLmxlbmd0aCkge1xuICAgIGxldCBsaW5lc0NvdW50ID0gMDtcbiAgICBsZXQgbGFzdE5ld0xpbmVQb3MgPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mQ2hhcmFjdGVyczsgaSsrKSB7XG4gICAgICAgIGlmIChzb3VyY2UuY2hhckNvZGVBdChpKSA9PT0gMTAgLyogbmV3bGluZSBjaGFyIGNvZGUgKi8pIHtcbiAgICAgICAgICAgIGxpbmVzQ291bnQrKztcbiAgICAgICAgICAgIGxhc3ROZXdMaW5lUG9zID0gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwb3Mub2Zmc2V0ICs9IG51bWJlck9mQ2hhcmFjdGVycztcbiAgICBwb3MubGluZSArPSBsaW5lc0NvdW50O1xuICAgIHBvcy5jb2x1bW4gPVxuICAgICAgICBsYXN0TmV3TGluZVBvcyA9PT0gLTFcbiAgICAgICAgICAgID8gcG9zLmNvbHVtbiArIG51bWJlck9mQ2hhcmFjdGVyc1xuICAgICAgICAgICAgOiBudW1iZXJPZkNoYXJhY3RlcnMgLSBsYXN0TmV3TGluZVBvcztcbiAgICByZXR1cm4gcG9zO1xufVxuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgbXNnKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCBgdW5leHBlY3RlZCBjb21waWxlciBjb25kaXRpb25gKTtcbiAgICB9XG59XG5mdW5jdGlvbiBmaW5kRGlyKG5vZGUsIG5hbWUsIGFsbG93RW1wdHkgPSBmYWxzZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5wcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwID0gbm9kZS5wcm9wc1tpXTtcbiAgICAgICAgaWYgKHAudHlwZSA9PT0gNyAvKiBOb2RlVHlwZXMuRElSRUNUSVZFICovICYmXG4gICAgICAgICAgICAoYWxsb3dFbXB0eSB8fCBwLmV4cCkgJiZcbiAgICAgICAgICAgIChpc1N0cmluZyhuYW1lKSA/IHAubmFtZSA9PT0gbmFtZSA6IG5hbWUudGVzdChwLm5hbWUpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBmaW5kUHJvcChub2RlLCBuYW1lLCBkeW5hbWljT25seSA9IGZhbHNlLCBhbGxvd0VtcHR5ID0gZmFsc2UpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUucHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcCA9IG5vZGUucHJvcHNbaV07XG4gICAgICAgIGlmIChwLnR5cGUgPT09IDYgLyogTm9kZVR5cGVzLkFUVFJJQlVURSAqLykge1xuICAgICAgICAgICAgaWYgKGR5bmFtaWNPbmx5KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHAubmFtZSA9PT0gbmFtZSAmJiAocC52YWx1ZSB8fCBhbGxvd0VtcHR5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHAubmFtZSA9PT0gJ2JpbmQnICYmXG4gICAgICAgICAgICAocC5leHAgfHwgYWxsb3dFbXB0eSkgJiZcbiAgICAgICAgICAgIGlzU3RhdGljQXJnT2YocC5hcmcsIG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gcDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGlzU3RhdGljQXJnT2YoYXJnLCBuYW1lKSB7XG4gICAgcmV0dXJuICEhKGFyZyAmJiBpc1N0YXRpY0V4cChhcmcpICYmIGFyZy5jb250ZW50ID09PSBuYW1lKTtcbn1cbmZ1bmN0aW9uIGhhc0R5bmFtaWNLZXlWQmluZChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUucHJvcHMuc29tZShwID0+IHAudHlwZSA9PT0gNyAvKiBOb2RlVHlwZXMuRElSRUNUSVZFICovICYmXG4gICAgICAgIHAubmFtZSA9PT0gJ2JpbmQnICYmXG4gICAgICAgICghcC5hcmcgfHwgLy8gdi1iaW5kPVwib2JqXCJcbiAgICAgICAgICAgIHAuYXJnLnR5cGUgIT09IDQgLyogTm9kZVR5cGVzLlNJTVBMRV9FWFBSRVNTSU9OICovIHx8IC8vIHYtYmluZDpbX2N0eC5mb29dXG4gICAgICAgICAgICAhcC5hcmcuaXNTdGF0aWMpIC8vIHYtYmluZDpbZm9vXVxuICAgICk7XG59XG5mdW5jdGlvbiBpc1RleHQkMShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gNSAvKiBOb2RlVHlwZXMuSU5URVJQT0xBVElPTiAqLyB8fCBub2RlLnR5cGUgPT09IDIgLyogTm9kZVR5cGVzLlRFWFQgKi87XG59XG5mdW5jdGlvbiBpc1ZTbG90KHApIHtcbiAgICByZXR1cm4gcC50eXBlID09PSA3IC8qIE5vZGVUeXBlcy5ESVJFQ1RJVkUgKi8gJiYgcC5uYW1lID09PSAnc2xvdCc7XG59XG5mdW5jdGlvbiBpc1RlbXBsYXRlTm9kZShub2RlKSB7XG4gICAgcmV0dXJuIChub2RlLnR5cGUgPT09IDEgLyogTm9kZVR5cGVzLkVMRU1FTlQgKi8gJiYgbm9kZS50YWdUeXBlID09PSAzIC8qIEVsZW1lbnRUeXBlcy5URU1QTEFURSAqLyk7XG59XG5mdW5jdGlvbiBpc1Nsb3RPdXRsZXQobm9kZSkge1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09IDEgLyogTm9kZVR5cGVzLkVMRU1FTlQgKi8gJiYgbm9kZS50YWdUeXBlID09PSAyIC8qIEVsZW1lbnRUeXBlcy5TTE9UICovO1xufVxuZnVuY3Rpb24gZ2V0Vk5vZGVIZWxwZXIoc3NyLCBpc0NvbXBvbmVudCkge1xuICAgIHJldHVybiBzc3IgfHwgaXNDb21wb25lbnQgPyBDUkVBVEVfVk5PREUgOiBDUkVBVEVfRUxFTUVOVF9WTk9ERTtcbn1cbmZ1bmN0aW9uIGdldFZOb2RlQmxvY2tIZWxwZXIoc3NyLCBpc0NvbXBvbmVudCkge1xuICAgIHJldHVybiBzc3IgfHwgaXNDb21wb25lbnQgPyBDUkVBVEVfQkxPQ0sgOiBDUkVBVEVfRUxFTUVOVF9CTE9DSztcbn1cbmNvbnN0IHByb3BzSGVscGVyU2V0ID0gbmV3IFNldChbTk9STUFMSVpFX1BST1BTLCBHVUFSRF9SRUFDVElWRV9QUk9QU10pO1xuZnVuY3Rpb24gZ2V0VW5ub3JtYWxpemVkUHJvcHMocHJvcHMsIGNhbGxQYXRoID0gW10pIHtcbiAgICBpZiAocHJvcHMgJiZcbiAgICAgICAgIWlzU3RyaW5nKHByb3BzKSAmJlxuICAgICAgICBwcm9wcy50eXBlID09PSAxNCAvKiBOb2RlVHlwZXMuSlNfQ0FMTF9FWFBSRVNTSU9OICovKSB7XG4gICAgICAgIGNvbnN0IGNhbGxlZSA9IHByb3BzLmNhbGxlZTtcbiAgICAgICAgaWYgKCFpc1N0cmluZyhjYWxsZWUpICYmIHByb3BzSGVscGVyU2V0LmhhcyhjYWxsZWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0VW5ub3JtYWxpemVkUHJvcHMocHJvcHMuYXJndW1lbnRzWzBdLCBjYWxsUGF0aC5jb25jYXQocHJvcHMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3Byb3BzLCBjYWxsUGF0aF07XG59XG5mdW5jdGlvbiBpbmplY3RQcm9wKG5vZGUsIHByb3AsIGNvbnRleHQpIHtcbiAgICBsZXQgcHJvcHNXaXRoSW5qZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIDEuIG1lcmdlUHJvcHMoLi4uKVxuICAgICAqIDIuIHRvSGFuZGxlcnMoLi4uKVxuICAgICAqIDMuIG5vcm1hbGl6ZVByb3BzKC4uLilcbiAgICAgKiA0LiBub3JtYWxpemVQcm9wcyhndWFyZFJlYWN0aXZlUHJvcHMoLi4uKSlcbiAgICAgKlxuICAgICAqIHdlIG5lZWQgdG8gZ2V0IHRoZSByZWFsIHByb3BzIGJlZm9yZSBub3JtYWxpemF0aW9uXG4gICAgICovXG4gICAgbGV0IHByb3BzID0gbm9kZS50eXBlID09PSAxMyAvKiBOb2RlVHlwZXMuVk5PREVfQ0FMTCAqLyA/IG5vZGUucHJvcHMgOiBub2RlLmFyZ3VtZW50c1syXTtcbiAgICBsZXQgY2FsbFBhdGggPSBbXTtcbiAgICBsZXQgcGFyZW50Q2FsbDtcbiAgICBpZiAocHJvcHMgJiZcbiAgICAgICAgIWlzU3RyaW5nKHByb3BzKSAmJlxuICAgICAgICBwcm9wcy50eXBlID09PSAxNCAvKiBOb2RlVHlwZXMuSlNfQ0FMTF9FWFBSRVNTSU9OICovKSB7XG4gICAgICAgIGNvbnN0IHJldCA9IGdldFVubm9ybWFsaXplZFByb3BzKHByb3BzKTtcbiAgICAgICAgcHJvcHMgPSByZXRbMF07XG4gICAgICAgIGNhbGxQYXRoID0gcmV0WzFdO1xuICAgICAgICBwYXJlbnRDYWxsID0gY2FsbFBhdGhbY2FsbFBhdGgubGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIGlmIChwcm9wcyA9PSBudWxsIHx8IGlzU3RyaW5nKHByb3BzKSkge1xuICAgICAgICBwcm9wc1dpdGhJbmplY3Rpb24gPSBjcmVhdGVPYmplY3RFeHByZXNzaW9uKFtwcm9wXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHByb3BzLnR5cGUgPT09IDE0IC8qIE5vZGVUeXBlcy5KU19DQUxMX0VYUFJFU1NJT04gKi8pIHtcbiAgICAgICAgLy8gbWVyZ2VkIHByb3BzLi4uIGFkZCBvdXJzXG4gICAgICAgIC8vIG9ubHkgaW5qZWN0IGtleSB0byBvYmplY3QgbGl0ZXJhbCBpZiBpdCdzIHRoZSBmaXJzdCBhcmd1bWVudCBzbyB0aGF0XG4gICAgICAgIC8vIGlmIGRvZXNuJ3Qgb3ZlcnJpZGUgdXNlciBwcm92aWRlZCBrZXlzXG4gICAgICAgIGNvbnN0IGZpcnN0ID0gcHJvcHMuYXJndW1lbnRzWzBdO1xuICAgICAgICBpZiAoIWlzU3RyaW5nKGZpcnN0KSAmJiBmaXJzdC50eXBlID09PSAxNSAvKiBOb2RlVHlwZXMuSlNfT0JKRUNUX0VYUFJFU1NJT04gKi8pIHtcbiAgICAgICAgICAgIC8vICM2NjMxXG4gICAgICAgICAgICBpZiAoIWhhc1Byb3AocHJvcCwgZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgZmlyc3QucHJvcGVydGllcy51bnNoaWZ0KHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHByb3BzLmNhbGxlZSA9PT0gVE9fSEFORExFUlMpIHtcbiAgICAgICAgICAgICAgICAvLyAjMjM2NlxuICAgICAgICAgICAgICAgIHByb3BzV2l0aEluamVjdGlvbiA9IGNyZWF0ZUNhbGxFeHByZXNzaW9uKGNvbnRleHQuaGVscGVyKE1FUkdFX1BST1BTKSwgW1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVPYmplY3RFeHByZXNzaW9uKFtwcm9wXSksXG4gICAgICAgICAgICAgICAgICAgIHByb3BzXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcm9wcy5hcmd1bWVudHMudW5zaGlmdChjcmVhdGVPYmplY3RFeHByZXNzaW9uKFtwcm9wXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICFwcm9wc1dpdGhJbmplY3Rpb24gJiYgKHByb3BzV2l0aEluamVjdGlvbiA9IHByb3BzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocHJvcHMudHlwZSA9PT0gMTUgLyogTm9kZVR5cGVzLkpTX09CSkVDVF9FWFBSRVNTSU9OICovKSB7XG4gICAgICAgIGlmICghaGFzUHJvcChwcm9wLCBwcm9wcykpIHtcbiAgICAgICAgICAgIHByb3BzLnByb3BlcnRpZXMudW5zaGlmdChwcm9wKTtcbiAgICAgICAgfVxuICAgICAgICBwcm9wc1dpdGhJbmplY3Rpb24gPSBwcm9wcztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIHNpbmdsZSB2LWJpbmQgd2l0aCBleHByZXNzaW9uLCByZXR1cm4gYSBtZXJnZWQgcmVwbGFjZW1lbnRcbiAgICAgICAgcHJvcHNXaXRoSW5qZWN0aW9uID0gY3JlYXRlQ2FsbEV4cHJlc3Npb24oY29udGV4dC5oZWxwZXIoTUVSR0VfUFJPUFMpLCBbXG4gICAgICAgICAgICBjcmVhdGVPYmplY3RFeHByZXNzaW9uKFtwcm9wXSksXG4gICAgICAgICAgICBwcm9wc1xuICAgICAgICBdKTtcbiAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgbmVzdGVkIGhlbHBlciBjYWxsLCBlLmcuIGBub3JtYWxpemVQcm9wcyhndWFyZFJlYWN0aXZlUHJvcHMocHJvcHMpKWAsXG4gICAgICAgIC8vIGl0IHdpbGwgYmUgcmV3cml0dGVuIGFzIGBub3JtYWxpemVQcm9wcyhtZXJnZVByb3BzKHsga2V5OiAwIH0sIHByb3BzKSlgLFxuICAgICAgICAvLyB0aGUgYGd1YXJkUmVhY3RpdmVQcm9wc2Agd2lsbCBubyBsb25nZXIgYmUgbmVlZGVkXG4gICAgICAgIGlmIChwYXJlbnRDYWxsICYmIHBhcmVudENhbGwuY2FsbGVlID09PSBHVUFSRF9SRUFDVElWRV9QUk9QUykge1xuICAgICAgICAgICAgcGFyZW50Q2FsbCA9IGNhbGxQYXRoW2NhbGxQYXRoLmxlbmd0aCAtIDJdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChub2RlLnR5cGUgPT09IDEzIC8qIE5vZGVUeXBlcy5WTk9ERV9DQUxMICovKSB7XG4gICAgICAgIGlmIChwYXJlbnRDYWxsKSB7XG4gICAgICAgICAgICBwYXJlbnRDYWxsLmFyZ3VtZW50c1swXSA9IHByb3BzV2l0aEluamVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5vZGUucHJvcHMgPSBwcm9wc1dpdGhJbmplY3Rpb247XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChwYXJlbnRDYWxsKSB7XG4gICAgICAgICAgICBwYXJlbnRDYWxsLmFyZ3VtZW50c1swXSA9IHByb3BzV2l0aEluamVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5vZGUuYXJndW1lbnRzWzJdID0gcHJvcHNXaXRoSW5qZWN0aW9uO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gY2hlY2sgZXhpc3Rpbmcga2V5IHRvIGF2b2lkIG92ZXJyaWRpbmcgdXNlciBwcm92aWRlZCBrZXlzXG5mdW5jdGlvbiBoYXNQcm9wKHByb3AsIHByb3BzKSB7XG4gICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgIGlmIChwcm9wLmtleS50eXBlID09PSA0IC8qIE5vZGVUeXBlcy5TSU1QTEVfRVhQUkVTU0lPTiAqLykge1xuICAgICAgICBjb25zdCBwcm9wS2V5TmFtZSA9IHByb3Aua2V5LmNvbnRlbnQ7XG4gICAgICAgIHJlc3VsdCA9IHByb3BzLnByb3BlcnRpZXMuc29tZShwID0+IHAua2V5LnR5cGUgPT09IDQgLyogTm9kZVR5cGVzLlNJTVBMRV9FWFBSRVNTSU9OICovICYmXG4gICAgICAgICAgICBwLmtleS5jb250ZW50ID09PSBwcm9wS2V5TmFtZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiB0b1ZhbGlkQXNzZXRJZChuYW1lLCB0eXBlKSB7XG4gICAgLy8gc2VlIGlzc3VlIzQ0MjIsIHdlIG5lZWQgYWRkaW5nIGlkZW50aWZpZXIgb24gdmFsaWRBc3NldElkIGlmIHZhcmlhYmxlIGBuYW1lYCBoYXMgc3BlY2lmaWMgY2hhcmFjdGVyXG4gICAgcmV0dXJuIGBfJHt0eXBlfV8ke25hbWUucmVwbGFjZSgvW15cXHddL2csIChzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSA9PiB7XG4gICAgICAgIHJldHVybiBzZWFyY2hWYWx1ZSA9PT0gJy0nID8gJ18nIDogbmFtZS5jaGFyQ29kZUF0KHJlcGxhY2VWYWx1ZSkudG9TdHJpbmcoKTtcbiAgICB9KX1gO1xufVxuLy8gQ2hlY2sgaWYgYSBub2RlIGNvbnRhaW5zIGV4cHJlc3Npb25zIHRoYXQgcmVmZXJlbmNlIGN1cnJlbnQgY29udGV4dCBzY29wZSBpZHNcbmZ1bmN0aW9uIGhhc1Njb3BlUmVmKG5vZGUsIGlkcykge1xuICAgIGlmICghbm9kZSB8fCBPYmplY3Qua2V5cyhpZHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgIGNhc2UgMSAvKiBOb2RlVHlwZXMuRUxFTUVOVCAqLzpcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5wcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBub2RlLnByb3BzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwLnR5cGUgPT09IDcgLyogTm9kZVR5cGVzLkRJUkVDVElWRSAqLyAmJlxuICAgICAgICAgICAgICAgICAgICAoaGFzU2NvcGVSZWYocC5hcmcsIGlkcykgfHwgaGFzU2NvcGVSZWYocC5leHAsIGlkcykpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuLnNvbWUoYyA9PiBoYXNTY29wZVJlZihjLCBpZHMpKTtcbiAgICAgICAgY2FzZSAxMSAvKiBOb2RlVHlwZXMuRk9SICovOlxuICAgICAgICAgICAgaWYgKGhhc1Njb3BlUmVmKG5vZGUuc291cmNlLCBpZHMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5zb21lKGMgPT4gaGFzU2NvcGVSZWYoYywgaWRzKSk7XG4gICAgICAgIGNhc2UgOSAvKiBOb2RlVHlwZXMuSUYgKi86XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5icmFuY2hlcy5zb21lKGIgPT4gaGFzU2NvcGVSZWYoYiwgaWRzKSk7XG4gICAgICAgIGNhc2UgMTAgLyogTm9kZVR5cGVzLklGX0JSQU5DSCAqLzpcbiAgICAgICAgICAgIGlmIChoYXNTY29wZVJlZihub2RlLmNvbmRpdGlvbiwgaWRzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4uc29tZShjID0+IGhhc1Njb3BlUmVmKGMsIGlkcykpO1xuICAgICAgICBjYXNlIDQgLyogTm9kZVR5cGVzLlNJTVBMRV9FWFBSRVNTSU9OICovOlxuICAgICAgICAgICAgcmV0dXJuICghbm9kZS5pc1N0YXRpYyAmJlxuICAgICAgICAgICAgICAgIGlzU2ltcGxlSWRlbnRpZmllcihub2RlLmNvbnRlbnQpICYmXG4gICAgICAgICAgICAgICAgISFpZHNbbm9kZS5jb250ZW50XSk7XG4gICAgICAgIGNhc2UgOCAvKiBOb2RlVHlwZXMuQ09NUE9VTkRfRVhQUkVTU0lPTiAqLzpcbiAgICAgICAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuLnNvbWUoYyA9PiBpc09iamVjdChjKSAmJiBoYXNTY29wZVJlZihjLCBpZHMpKTtcbiAgICAgICAgY2FzZSA1IC8qIE5vZGVUeXBlcy5JTlRFUlBPTEFUSU9OICovOlxuICAgICAgICBjYXNlIDEyIC8qIE5vZGVUeXBlcy5URVhUX0NBTEwgKi86XG4gICAgICAgICAgICByZXR1cm4gaGFzU2NvcGVSZWYobm9kZS5jb250ZW50LCBpZHMpO1xuICAgICAgICBjYXNlIDIgLyogTm9kZVR5cGVzLlRFWFQgKi86XG4gICAgICAgIGNhc2UgMyAvKiBOb2RlVHlwZXMuQ09NTUVOVCAqLzpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIDtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRNZW1vZWRWTm9kZUNhbGwobm9kZSkge1xuICAgIGlmIChub2RlLnR5cGUgPT09IDE0IC8qIE5vZGVUeXBlcy5KU19DQUxMX0VYUFJFU1NJT04gKi8gJiYgbm9kZS5jYWxsZWUgPT09IFdJVEhfTUVNTykge1xuICAgICAgICByZXR1cm4gbm9kZS5hcmd1bWVudHNbMV0ucmV0dXJucztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1ha2VCbG9jayhub2RlLCB7IGhlbHBlciwgcmVtb3ZlSGVscGVyLCBpblNTUiB9KSB7XG4gICAgaWYgKCFub2RlLmlzQmxvY2spIHtcbiAgICAgICAgbm9kZS5pc0Jsb2NrID0gdHJ1ZTtcbiAgICAgICAgcmVtb3ZlSGVscGVyKGdldFZOb2RlSGVscGVyKGluU1NSLCBub2RlLmlzQ29tcG9uZW50KSk7XG4gICAgICAgIGhlbHBlcihPUEVOX0JMT0NLKTtcbiAgICAgICAgaGVscGVyKGdldFZOb2RlQmxvY2tIZWxwZXIoaW5TU1IsIG5vZGUuaXNDb21wb25lbnQpKTtcbiAgICB9XG59XG5cbmNvbnN0IGRlcHJlY2F0aW9uRGF0YSA9IHtcbiAgICBbXCJDT01QSUxFUl9JU19PTl9FTEVNRU5UXCIgLyogQ29tcGlsZXJEZXByZWNhdGlvblR5cGVzLkNPTVBJTEVSX0lTX09OX0VMRU1FTlQgKi9dOiB7XG4gICAgICAgIG1lc3NhZ2U6IGBQbGF0Zm9ybS1uYXRpdmUgZWxlbWVudHMgd2l0aCBcImlzXCIgcHJvcCB3aWxsIG5vIGxvbmdlciBiZSBgICtcbiAgICAgICAgICAgIGB0cmVhdGVkIGFzIGNvbXBvbmVudHMgaW4gVnVlIDMgdW5sZXNzIHRoZSBcImlzXCIgdmFsdWUgaXMgZXhwbGljaXRseSBgICtcbiAgICAgICAgICAgIGBwcmVmaXhlZCB3aXRoIFwidnVlOlwiLmAsXG4gICAgICAgIGxpbms6IGBodHRwczovL3YzLW1pZ3JhdGlvbi52dWVqcy5vcmcvYnJlYWtpbmctY2hhbmdlcy9jdXN0b20tZWxlbWVudHMtaW50ZXJvcC5odG1sYFxuICAgIH0sXG4gICAgW1wiQ09NUElMRVJfVl9CSU5EX1NZTkNcIiAvKiBDb21waWxlckRlcHJlY2F0aW9uVHlwZXMuQ09NUElMRVJfVl9CSU5EX1NZTkMgKi9dOiB7XG4gICAgICAgIG1lc3NhZ2U6IGtleSA9PiBgLnN5bmMgbW9kaWZpZXIgZm9yIHYtYmluZCBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugdi1tb2RlbCB3aXRoIGAgK1xuICAgICAgICAgICAgYGFyZ3VtZW50IGluc3RlYWQuIFxcYHYtYmluZDoke2tleX0uc3luY1xcYCBzaG91bGQgYmUgY2hhbmdlZCB0byBgICtcbiAgICAgICAgICAgIGBcXGB2LW1vZGVsOiR7a2V5fVxcYC5gLFxuICAgICAgICBsaW5rOiBgaHR0cHM6Ly92My1taWdyYXRpb24udnVlanMub3JnL2JyZWFraW5nLWNoYW5nZXMvdi1tb2RlbC5odG1sYFxuICAgIH0sXG4gICAgW1wiQ09NUElMRVJfVl9CSU5EX1BST1BcIiAvKiBDb21waWxlckRlcHJlY2F0aW9uVHlwZXMuQ09NUElMRVJfVl9CSU5EX1BST1AgKi9dOiB7XG4gICAgICAgIG1lc3NhZ2U6IGAucHJvcCBtb2RpZmllciBmb3Igdi1iaW5kIGhhcyBiZWVuIHJlbW92ZWQgYW5kIG5vIGxvbmdlciBuZWNlc3NhcnkuIGAgK1xuICAgICAgICAgICAgYFZ1ZSAzIHdpbGwgYXV0b21hdGljYWxseSBzZXQgYSBiaW5kaW5nIGFzIERPTSBwcm9wZXJ0eSB3aGVuIGFwcHJvcHJpYXRlLmBcbiAgICB9LFxuICAgIFtcIkNPTVBJTEVSX1ZfQklORF9PQkpFQ1RfT1JERVJcIiAvKiBDb21waWxlckRlcHJlY2F0aW9uVHlwZXMuQ09NUElMRVJfVl9CSU5EX09CSkVDVF9PUkRFUiAqL106IHtcbiAgICAgICAgbWVzc2FnZTogYHYtYmluZD1cIm9ialwiIHVzYWdlIGlzIG5vdyBvcmRlciBzZW5zaXRpdmUgYW5kIGJlaGF2ZXMgbGlrZSBKYXZhU2NyaXB0IGAgK1xuICAgICAgICAgICAgYG9iamVjdCBzcHJlYWQ6IGl0IHdpbGwgbm93IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBub24tbWVyZ2VhYmxlIGF0dHJpYnV0ZSBgICtcbiAgICAgICAgICAgIGB0aGF0IGFwcGVhcnMgYmVmb3JlIHYtYmluZCBpbiB0aGUgY2FzZSBvZiBjb25mbGljdC4gYCArXG4gICAgICAgICAgICBgVG8gcmV0YWluIDIueCBiZWhhdmlvciwgbW92ZSB2LWJpbmQgdG8gbWFrZSBpdCB0aGUgZmlyc3QgYXR0cmlidXRlLiBgICtcbiAgICAgICAgICAgIGBZb3UgY2FuIGFsc28gc3VwcHJlc3MgdGhpcyB3YXJuaW5nIGlmIHRoZSB1c2FnZSBpcyBpbnRlbmRlZC5gLFxuICAgICAgICBsaW5rOiBgaHR0cHM6Ly92My1taWdyYXRpb24udnVlanMub3JnL2JyZWFraW5nLWNoYW5nZXMvdi1iaW5kLmh0bWxgXG4gICAgfSxcbiAgICBbXCJDT01QSUxFUl9WX09OX05BVElWRVwiIC8qIENvbXBpbGVyRGVwcmVjYXRpb25UeXBlcy5DT01QSUxFUl9WX09OX05BVElWRSAqL106IHtcbiAgICAgICAgbWVzc2FnZTogYC5uYXRpdmUgbW9kaWZpZXIgZm9yIHYtb24gaGFzIGJlZW4gcmVtb3ZlZCBhcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LmAsXG4gICAgICAgIGxpbms6IGBodHRwczovL3YzLW1pZ3JhdGlvbi52dWVqcy5vcmcvYnJlYWtpbmctY2hhbmdlcy92LW9uLW5hdGl2ZS1tb2RpZmllci1yZW1vdmVkLmh0bWxgXG4gICAgfSxcbiAgICBbXCJDT01QSUxFUl9WX0lGX1ZfRk9SX1BSRUNFREVOQ0VcIiAvKiBDb21waWxlckRlcHJlY2F0aW9uVHlwZXMuQ09NUElMRVJfVl9JRl9WX0ZPUl9QUkVDRURFTkNFICovXToge1xuICAgICAgICBtZXNzYWdlOiBgdi1pZiAvIHYtZm9yIHByZWNlZGVuY2Ugd2hlbiB1c2VkIG9uIHRoZSBzYW1lIGVsZW1lbnQgaGFzIGNoYW5nZWQgYCArXG4gICAgICAgICAgICBgaW4gVnVlIDM6IHYtaWYgbm93IHRha2VzIGhpZ2hlciBwcmVjZWRlbmNlIGFuZCB3aWxsIG5vIGxvbmdlciBoYXZlIGAgK1xuICAgICAgICAgICAgYGFjY2VzcyB0byB2LWZvciBzY29wZSB2YXJpYWJsZXMuIEl0IGlzIGJlc3QgdG8gYXZvaWQgdGhlIGFtYmlndWl0eSBgICtcbiAgICAgICAgICAgIGB3aXRoIDx0ZW1wbGF0ZT4gdGFncyBvciB1c2UgYSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IGZpbHRlcnMgdi1mb3IgYCArXG4gICAgICAgICAgICBgZGF0YSBzb3VyY2UuYCxcbiAgICAgICAgbGluazogYGh0dHBzOi8vdjMtbWlncmF0aW9uLnZ1ZWpzLm9yZy9icmVha2luZy1jaGFuZ2VzL3YtaWYtdi1mb3IuaHRtbGBcbiAgICB9LFxuICAgIFtcIkNPTVBJTEVSX05BVElWRV9URU1QTEFURVwiIC8qIENvbXBpbGVyRGVwcmVjYXRpb25UeXBlcy5DT01QSUxFUl9OQVRJVkVfVEVNUExBVEUgKi9dOiB7XG4gICAgICAgIG1lc3NhZ2U6IGA8dGVtcGxhdGU+IHdpdGggbm8gc3BlY2lhbCBkaXJlY3RpdmVzIHdpbGwgcmVuZGVyIGFzIGEgbmF0aXZlIHRlbXBsYXRlIGAgK1xuICAgICAgICAgICAgYGVsZW1lbnQgaW5zdGVhZCBvZiBpdHMgaW5uZXIgY29udGVudCBpbiBWdWUgMy5gXG4gICAgfSxcbiAgICBbXCJDT01QSUxFUl9JTkxJTkVfVEVNUExBVEVcIiAvKiBDb21waWxlckRlcHJlY2F0aW9uVHlwZXMuQ09NUElMRVJfSU5MSU5FX1RFTVBMQVRFICovXToge1xuICAgICAgICBtZXNzYWdlOiBgXCJpbmxpbmUtdGVtcGxhdGVcIiBoYXMgYmVlbiByZW1vdmVkIGluIFZ1ZSAzLmAsXG4gICAgICAgIGxpbms6IGBodHRwczovL3YzLW1pZ3JhdGlvbi52dWVqcy5vcmcvYnJlYWtpbmctY2hhbmdlcy9pbmxpbmUtdGVtcGxhdGUtYXR0cmlidXRlLmh0bWxgXG4gICAgfSxcbiAgICBbXCJDT01QSUxFUl9GSUxURVJcIiAvKiBDb21waWxlckRlcHJlY2F0aW9uVHlwZXMuQ09NUElMRVJfRklMVEVSUyAqL106IHtcbiAgICAgICAgbWVzc2FnZTogYGZpbHRlcnMgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gVnVlIDMuIGAgK1xuICAgICAgICAgICAgYFRoZSBcInxcIiBzeW1ib2wgd2lsbCBiZSB0cmVhdGVkIGFzIG5hdGl2ZSBKYXZhU2NyaXB0IGJpdHdpc2UgT1Igb3BlcmF0b3IuIGAgK1xuICAgICAgICAgICAgYFVzZSBtZXRob2QgY2FsbHMgb3IgY29tcHV0ZWQgcHJvcGVydGllcyBpbnN0ZWFkLmAsXG4gICAgICAgIGxpbms6IGBodHRwczovL3YzLW1pZ3JhdGlvbi52dWVqcy5vcmcvYnJlYWtpbmctY2hhbmdlcy9maWx0ZXJzLmh0bWxgXG4gICAgfVxufTtcbmZ1bmN0aW9uIGdldENvbXBhdFZhbHVlKGtleSwgY29udGV4dCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IGNvbnRleHQub3B0aW9uc1xuICAgICAgICA/IGNvbnRleHQub3B0aW9ucy5jb21wYXRDb25maWdcbiAgICAgICAgOiBjb250ZXh0LmNvbXBhdENvbmZpZztcbiAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZyAmJiBjb25maWdba2V5XTtcbiAgICBpZiAoa2V5ID09PSAnTU9ERScpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIHx8IDM7IC8vIGNvbXBpbGVyIGRlZmF1bHRzIHRvIHYzIGJlaGF2aW9yXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNDb21wYXRFbmFibGVkKGtleSwgY29udGV4dCkge1xuICAgIGNvbnN0IG1vZGUgPSBnZXRDb21wYXRWYWx1ZSgnTU9ERScsIGNvbnRleHQpO1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0Q29tcGF0VmFsdWUoa2V5LCBjb250ZXh0KTtcbiAgICAvLyBpbiB2MyBtb2RlLCBvbmx5IGVuYWJsZSBpZiBleHBsaWNpdGx5IHNldCB0byB0cnVlXG4gICAgLy8gb3RoZXJ3aXNlIGVuYWJsZSBmb3IgYW55IG5vbi1mYWxzZSB2YWx1ZVxuICAgIHJldHVybiBtb2RlID09PSAzID8gdmFsdWUgPT09IHRydWUgOiB2YWx1ZSAhPT0gZmFsc2U7XG59XG5mdW5jdGlvbiBjaGVja0NvbXBhdEVuYWJsZWQoa2V5LCBjb250ZXh0LCBsb2MsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCBlbmFibGVkID0gaXNDb21wYXRFbmFibGVkKGtleSwgY29udGV4dCk7XG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiBlbmFibGVkKSB7XG4gICAgICAgIHdhcm5EZXByZWNhdGlvbihrZXksIGNvbnRleHQsIGxvYywgLi4uYXJncyk7XG4gICAgfVxuICAgIHJldHVybiBlbmFibGVkO1xufVxuZnVuY3Rpb24gd2FybkRlcHJlY2F0aW9uKGtleSwgY29udGV4dCwgbG9jLCAuLi5hcmdzKSB7XG4gICAgY29uc3QgdmFsID0gZ2V0Q29tcGF0VmFsdWUoa2V5LCBjb250ZXh0KTtcbiAgICBpZiAodmFsID09PSAnc3VwcHJlc3Mtd2FybmluZycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IG1lc3NhZ2UsIGxpbmsgfSA9IGRlcHJlY2F0aW9uRGF0YVtrZXldO1xuICAgIGNvbnN0IG1zZyA9IGAoZGVwcmVjYXRpb24gJHtrZXl9KSAke3R5cGVvZiBtZXNzYWdlID09PSAnZnVuY3Rpb24nID8gbWVzc2FnZSguLi5hcmdzKSA6IG1lc3NhZ2V9JHtsaW5rID8gYFxcbiAgRGV0YWlsczogJHtsaW5rfWAgOiBgYH1gO1xuICAgIGNvbnN0IGVyciA9IG5ldyBTeW50YXhFcnJvcihtc2cpO1xuICAgIGVyci5jb2RlID0ga2V5O1xuICAgIGlmIChsb2MpXG4gICAgICAgIGVyci5sb2MgPSBsb2M7XG4gICAgY29udGV4dC5vbldhcm4oZXJyKTtcbn1cblxuLy8gVGhlIGRlZmF1bHQgZGVjb2RlciBvbmx5IHByb3ZpZGVzIGVzY2FwZXMgZm9yIGNoYXJhY3RlcnMgcmVzZXJ2ZWQgYXMgcGFydCBvZlxuLy8gdGhlIHRlbXBsYXRlIHN5bnRheCwgYW5kIGlzIG9ubHkgdXNlZCBpZiB0aGUgY3VzdG9tIHJlbmRlcmVyIGRpZCBub3QgcHJvdmlkZVxuLy8gYSBwbGF0Zm9ybS1zcGVjaWZpYyBkZWNvZGVyLlxuY29uc3QgZGVjb2RlUkUgPSAvJihndHxsdHxhbXB8YXBvc3xxdW90KTsvZztcbmNvbnN0IGRlY29kZU1hcCA9IHtcbiAgICBndDogJz4nLFxuICAgIGx0OiAnPCcsXG4gICAgYW1wOiAnJicsXG4gICAgYXBvczogXCInXCIsXG4gICAgcXVvdDogJ1wiJ1xufTtcbmNvbnN0IGRlZmF1bHRQYXJzZXJPcHRpb25zID0ge1xuICAgIGRlbGltaXRlcnM6IFtge3tgLCBgfX1gXSxcbiAgICBnZXROYW1lc3BhY2U6ICgpID0+IDAgLyogTmFtZXNwYWNlcy5IVE1MICovLFxuICAgIGdldFRleHRNb2RlOiAoKSA9PiAwIC8qIFRleHRNb2Rlcy5EQVRBICovLFxuICAgIGlzVm9pZFRhZzogTk8sXG4gICAgaXNQcmVUYWc6IE5PLFxuICAgIGlzQ3VzdG9tRWxlbWVudDogTk8sXG4gICAgZGVjb2RlRW50aXRpZXM6IChyYXdUZXh0KSA9PiByYXdUZXh0LnJlcGxhY2UoZGVjb2RlUkUsIChfLCBwMSkgPT4gZGVjb2RlTWFwW3AxXSksXG4gICAgb25FcnJvcjogZGVmYXVsdE9uRXJyb3IsXG4gICAgb25XYXJuOiBkZWZhdWx0T25XYXJuLFxuICAgIGNvbW1lbnRzOiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJylcbn07XG5mdW5jdGlvbiBiYXNlUGFyc2UoY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgY29udGV4dCA9IGNyZWF0ZVBhcnNlckNvbnRleHQoY29udGVudCwgb3B0aW9ucyk7XG4gICAgY29uc3Qgc3RhcnQgPSBnZXRDdXJzb3IoY29udGV4dCk7XG4gICAgcmV0dXJuIGNyZWF0ZVJvb3QocGFyc2VDaGlsZHJlbihjb250ZXh0LCAwIC8qIFRleHRNb2Rlcy5EQVRBICovLCBbXSksIGdldFNlbGVjdGlvbihjb250ZXh0LCBzdGFydCkpO1xufVxuZnVuY3Rpb24gY3JlYXRlUGFyc2VyQ29udGV4dChjb250ZW50LCByYXdPcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdFBhcnNlck9wdGlvbnMpO1xuICAgIGxldCBrZXk7XG4gICAgZm9yIChrZXkgaW4gcmF3T3B0aW9ucykge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG9wdGlvbnNba2V5XSA9XG4gICAgICAgICAgICByYXdPcHRpb25zW2tleV0gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gZGVmYXVsdFBhcnNlck9wdGlvbnNba2V5XVxuICAgICAgICAgICAgICAgIDogcmF3T3B0aW9uc1trZXldO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBvcHRpb25zLFxuICAgICAgICBjb2x1bW46IDEsXG4gICAgICAgIGxpbmU6IDEsXG4gICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgb3JpZ2luYWxTb3VyY2U6IGNvbnRlbnQsXG4gICAgICAgIHNvdXJjZTogY29udGVudCxcbiAgICAgICAgaW5QcmU6IGZhbHNlLFxuICAgICAgICBpblZQcmU6IGZhbHNlLFxuICAgICAgICBvbldhcm46IG9wdGlvbnMub25XYXJuXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlQ2hpbGRyZW4oY29udGV4dCwgbW9kZSwgYW5jZXN0b3JzKSB7XG4gICAgY29uc3QgcGFyZW50ID0gbGFzdChhbmNlc3RvcnMpO1xuICAgIGNvbnN0IG5zID0gcGFyZW50ID8gcGFyZW50Lm5zIDogMCAvKiBOYW1lc3BhY2VzLkhUTUwgKi87XG4gICAgY29uc3Qgbm9kZXMgPSBbXTtcbiAgICB3aGlsZSAoIWlzRW5kKGNvbnRleHQsIG1vZGUsIGFuY2VzdG9ycykpIHtcbiAgICAgICAgY29uc3QgcyA9IGNvbnRleHQuc291cmNlO1xuICAgICAgICBsZXQgbm9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKG1vZGUgPT09IDAgLyogVGV4dE1vZGVzLkRBVEEgKi8gfHwgbW9kZSA9PT0gMSAvKiBUZXh0TW9kZXMuUkNEQVRBICovKSB7XG4gICAgICAgICAgICBpZiAoIWNvbnRleHQuaW5WUHJlICYmIHN0YXJ0c1dpdGgocywgY29udGV4dC5vcHRpb25zLmRlbGltaXRlcnNbMF0pKSB7XG4gICAgICAgICAgICAgICAgLy8gJ3t7J1xuICAgICAgICAgICAgICAgIG5vZGUgPSBwYXJzZUludGVycG9sYXRpb24oY29udGV4dCwgbW9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtb2RlID09PSAwIC8qIFRleHRNb2Rlcy5EQVRBICovICYmIHNbMF0gPT09ICc8Jykge1xuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3BhcnNpbmcuaHRtbCN0YWctb3Blbi1zdGF0ZVxuICAgICAgICAgICAgICAgIGlmIChzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoY29udGV4dCwgNSAvKiBFcnJvckNvZGVzLkVPRl9CRUZPUkVfVEFHX05BTUUgKi8sIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzWzFdID09PSAnIScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvcGFyc2luZy5odG1sI21hcmt1cC1kZWNsYXJhdGlvbi1vcGVuLXN0YXRlXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydHNXaXRoKHMsICc8IS0tJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwYXJzZUNvbW1lbnQoY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnRzV2l0aChzLCAnPCFET0NUWVBFJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBET0NUWVBFIGJ5IGEgbGltaXRhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwYXJzZUJvZ3VzQ29tbWVudChjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFydHNXaXRoKHMsICc8IVtDREFUQVsnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5zICE9PSAwIC8qIE5hbWVzcGFjZXMuSFRNTCAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwYXJzZUNEQVRBKGNvbnRleHQsIGFuY2VzdG9ycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoY29udGV4dCwgMSAvKiBFcnJvckNvZGVzLkNEQVRBX0lOX0hUTUxfQ09OVEVOVCAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHBhcnNlQm9ndXNDb21tZW50KGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGNvbnRleHQsIDExIC8qIEVycm9yQ29kZXMuSU5DT1JSRUNUTFlfT1BFTkVEX0NPTU1FTlQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHBhcnNlQm9ndXNDb21tZW50KGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNbMV0gPT09ICcvJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9wYXJzaW5nLmh0bWwjZW5kLXRhZy1vcGVuLXN0YXRlXG4gICAgICAgICAgICAgICAgICAgIGlmIChzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGNvbnRleHQsIDUgLyogRXJyb3JDb2Rlcy5FT0ZfQkVGT1JFX1RBR19OQU1FICovLCAyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzWzJdID09PSAnPicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcihjb250ZXh0LCAxNCAvKiBFcnJvckNvZGVzLk1JU1NJTkdfRU5EX1RBR19OQU1FICovLCAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2VCeShjb250ZXh0LCAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKC9bYS16XS9pLnRlc3Qoc1syXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcihjb250ZXh0LCAyMyAvKiBFcnJvckNvZGVzLlhfSU5WQUxJRF9FTkRfVEFHICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlVGFnKGNvbnRleHQsIDEgLyogVGFnVHlwZS5FbmQgKi8sIHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcihjb250ZXh0LCAxMiAvKiBFcnJvckNvZGVzLklOVkFMSURfRklSU1RfQ0hBUkFDVEVSX09GX1RBR19OQU1FICovLCAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwYXJzZUJvZ3VzQ29tbWVudChjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgvW2Etel0vaS50ZXN0KHNbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwYXJzZUVsZW1lbnQoY29udGV4dCwgYW5jZXN0b3JzKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gMi54IDx0ZW1wbGF0ZT4gd2l0aCBubyBkaXJlY3RpdmUgY29tcGF0XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbXBhdEVuYWJsZWQoXCJDT01QSUxFUl9OQVRJVkVfVEVNUExBVEVcIiAvKiBDb21waWxlckRlcHJlY2F0aW9uVHlwZXMuQ09NUElMRVJfTkFUSVZFX1RFTVBMQVRFICovLCBjb250ZXh0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50YWcgPT09ICd0ZW1wbGF0ZScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFub2RlLnByb3BzLnNvbWUocCA9PiBwLnR5cGUgPT09IDcgLyogTm9kZVR5cGVzLkRJUkVDVElWRSAqLyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3BlY2lhbFRlbXBsYXRlRGlyZWN0aXZlKHAubmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuRGVwcmVjYXRpb24oXCJDT01QSUxFUl9OQVRJVkVfVEVNUExBVEVcIiAvKiBDb21waWxlckRlcHJlY2F0aW9uVHlwZXMuQ09NUElMRVJfTkFUSVZFX1RFTVBMQVRFICovLCBjb250ZXh0LCBub2RlLmxvYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzWzFdID09PSAnPycpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGNvbnRleHQsIDIxIC8qIEVycm9yQ29kZXMuVU5FWFBFQ1RFRF9RVUVTVElPTl9NQVJLX0lOU1RFQURfT0ZfVEFHX05BTUUgKi8sIDEpO1xuICAgICAgICAgICAgICAgICAgICBub2RlID0gcGFyc2VCb2d1c0NvbW1lbnQoY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoY29udGV4dCwgMTIgLyogRXJyb3JDb2Rlcy5JTlZBTElEX0ZJUlNUX0NIQVJBQ1RFUl9PRl9UQUdfTkFNRSAqLywgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgbm9kZSA9IHBhcnNlVGV4dChjb250ZXh0LCBtb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNBcnJheShub2RlKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcHVzaE5vZGUobm9kZXMsIG5vZGVbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHVzaE5vZGUobm9kZXMsIG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFdoaXRlc3BhY2UgaGFuZGxpbmcgc3RyYXRlZ3kgbGlrZSB2MlxuICAgIGxldCByZW1vdmVkV2hpdGVzcGFjZSA9IGZhbHNlO1xuICAgIGlmIChtb2RlICE9PSAyIC8qIFRleHRNb2Rlcy5SQVdURVhUICovICYmIG1vZGUgIT09IDEgLyogVGV4dE1vZGVzLlJDREFUQSAqLykge1xuICAgICAgICBjb25zdCBzaG91bGRDb25kZW5zZSA9IGNvbnRleHQub3B0aW9ucy53aGl0ZXNwYWNlICE9PSAncHJlc2VydmUnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAyIC8qIE5vZGVUeXBlcy5URVhUICovKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0LmluUHJlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghL1teXFx0XFxyXFxuXFxmIF0vLnRlc3Qobm9kZS5jb250ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldiA9IG5vZGVzW2kgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBub2Rlc1tpICsgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgaWY6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAtIHRoZSB3aGl0ZXNwYWNlIGlzIHRoZSBmaXJzdCBvciBsYXN0IG5vZGUsIG9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSAoY29uZGVuc2UgbW9kZSkgdGhlIHdoaXRlc3BhY2UgaXMgYmV0d2VlbiB0d29zIGNvbW1lbnRzLCBvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gKGNvbmRlbnNlIG1vZGUpIHRoZSB3aGl0ZXNwYWNlIGlzIGJldHdlZW4gY29tbWVudCBhbmQgZWxlbWVudCwgb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAtIChjb25kZW5zZSBtb2RlKSB0aGUgd2hpdGVzcGFjZSBpcyBiZXR3ZWVuIHR3byBlbGVtZW50cyBBTkQgY29udGFpbnMgbmV3bGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmV2IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIW5leHQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2hvdWxkQ29uZGVuc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcmV2LnR5cGUgPT09IDMgLyogTm9kZVR5cGVzLkNPTU1FTlQgKi8gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQudHlwZSA9PT0gMyAvKiBOb2RlVHlwZXMuQ09NTUVOVCAqLykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmV2LnR5cGUgPT09IDMgLyogTm9kZVR5cGVzLkNPTU1FTlQgKi8gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LnR5cGUgPT09IDEgLyogTm9kZVR5cGVzLkVMRU1FTlQgKi8pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldi50eXBlID09PSAxIC8qIE5vZGVUeXBlcy5FTEVNRU5UICovICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC50eXBlID09PSAzIC8qIE5vZGVUeXBlcy5DT01NRU5UICovKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZXYudHlwZSA9PT0gMSAvKiBOb2RlVHlwZXMuRUxFTUVOVCAqLyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQudHlwZSA9PT0gMSAvKiBOb2RlVHlwZXMuRUxFTUVOVCAqLyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9bXFxyXFxuXS8udGVzdChub2RlLmNvbnRlbnQpKSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFdoaXRlc3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzW2ldID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIHdoaXRlc3BhY2UgaXMgY29uZGVuc2VkIGludG8gYSBzaW5nbGUgc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvbnRlbnQgPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2hvdWxkQ29uZGVuc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGNvbmRlbnNlIG1vZGUsIGNvbnNlY3V0aXZlIHdoaXRlc3BhY2VzIGluIHRleHQgYXJlIGNvbmRlbnNlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG93biB0byBhIHNpbmdsZSBzcGFjZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY29udGVudCA9IG5vZGUuY29udGVudC5yZXBsYWNlKC9bXFx0XFxyXFxuXFxmIF0rL2csICcgJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICM2NDEwIG5vcm1hbGl6ZSB3aW5kb3dzIG5ld2xpbmVzIGluIDxwcmU+OlxuICAgICAgICAgICAgICAgICAgICAvLyBpbiBTU1IsIGJyb3dzZXJzIG5vcm1hbGl6ZSBzZXJ2ZXItcmVuZGVyZWQgXFxyXFxuIGludG8gYSBzaW5nbGUgXFxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBET01cbiAgICAgICAgICAgICAgICAgICAgbm9kZS5jb250ZW50ID0gbm9kZS5jb250ZW50LnJlcGxhY2UoL1xcclxcbi9nLCAnXFxuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVtb3ZlIGNvbW1lbnQgbm9kZXMgaWYgZGVzaXJlZCBieSBjb25maWd1cmF0aW9uLlxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSAzIC8qIE5vZGVUeXBlcy5DT01NRU5UICovICYmICFjb250ZXh0Lm9wdGlvbnMuY29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVkV2hpdGVzcGFjZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgbm9kZXNbaV0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb250ZXh0LmluUHJlICYmIHBhcmVudCAmJiBjb250ZXh0Lm9wdGlvbnMuaXNQcmVUYWcocGFyZW50LnRhZykpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBsZWFkaW5nIG5ld2xpbmUgcGVyIGh0bWwgc3BlY1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZ3JvdXBpbmctY29udGVudC5odG1sI3RoZS1wcmUtZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBub2Rlc1swXTtcbiAgICAgICAgICAgIGlmIChmaXJzdCAmJiBmaXJzdC50eXBlID09PSAyIC8qIE5vZGVUeXBlcy5URVhUICovKSB7XG4gICAgICAgICAgICAgICAgZmlyc3QuY29udGVudCA9IGZpcnN0LmNvbnRlbnQucmVwbGFjZSgvXlxccj9cXG4vLCAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlbW92ZWRXaGl0ZXNwYWNlID8gbm9kZXMuZmlsdGVyKEJvb2xlYW4pIDogbm9kZXM7XG59XG5mdW5jdGlvbiBwdXNoTm9kZShub2Rlcywgbm9kZSkge1xuICAgIGlmIChub2RlLnR5cGUgPT09IDIgLyogTm9kZVR5cGVzLlRFWFQgKi8pIHtcbiAgICAgICAgY29uc3QgcHJldiA9IGxhc3Qobm9kZXMpO1xuICAgICAgICAvLyBNZXJnZSBpZiBib3RoIHRoaXMgYW5kIHRoZSBwcmV2aW91cyBub2RlIGFyZSB0ZXh0IGFuZCB0aG9zZSBhcmVcbiAgICAgICAgLy8gY29uc2VjdXRpdmUuIFRoaXMgaGFwcGVucyBmb3IgY2FzZXMgbGlrZSBcImEgPCBiXCIuXG4gICAgICAgIGlmIChwcmV2ICYmXG4gICAgICAgICAgICBwcmV2LnR5cGUgPT09IDIgLyogTm9kZVR5cGVzLlRFWFQgKi8gJiZcbiAgICAgICAgICAgIHByZXYubG9jLmVuZC5vZmZzZXQgPT09IG5vZGUubG9jLnN0YXJ0Lm9mZnNldCkge1xuICAgICAgICAgICAgcHJldi5jb250ZW50ICs9IG5vZGUuY29udGVudDtcbiAgICAgICAgICAgIHByZXYubG9jLmVuZCA9IG5vZGUubG9jLmVuZDtcbiAgICAgICAgICAgIHByZXYubG9jLnNvdXJjZSArPSBub2RlLmxvYy5zb3VyY2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgbm9kZXMucHVzaChub2RlKTtcbn1cbmZ1bmN0aW9uIHBhcnNlQ0RBVEEoY29udGV4dCwgYW5jZXN0b3JzKSB7XG4gICAgYWR2YW5jZUJ5KGNvbnRleHQsIDkpO1xuICAgIGNvbnN0IG5vZGVzID0gcGFyc2VDaGlsZHJlbihjb250ZXh0LCAzIC8qIFRleHRNb2Rlcy5DREFUQSAqLywgYW5jZXN0b3JzKTtcbiAgICBpZiAoY29udGV4dC5zb3VyY2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGVtaXRFcnJvcihjb250ZXh0LCA2IC8qIEVycm9yQ29kZXMuRU9GX0lOX0NEQVRBICovKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGFkdmFuY2VCeShjb250ZXh0LCAzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzO1xufVxuZnVuY3Rpb24gcGFyc2VDb21tZW50KGNvbnRleHQpIHtcbiAgICBjb25zdCBzdGFydCA9IGdldEN1cnNvcihjb250ZXh0KTtcbiAgICBsZXQgY29udGVudDtcbiAgICAvLyBSZWd1bGFyIGNvbW1lbnQuXG4gICAgY29uc3QgbWF0Y2ggPSAvLS0oXFwhKT8+Ly5leGVjKGNvbnRleHQuc291cmNlKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZXh0LnNvdXJjZS5zbGljZSg0KTtcbiAgICAgICAgYWR2YW5jZUJ5KGNvbnRleHQsIGNvbnRleHQuc291cmNlLmxlbmd0aCk7XG4gICAgICAgIGVtaXRFcnJvcihjb250ZXh0LCA3IC8qIEVycm9yQ29kZXMuRU9GX0lOX0NPTU1FTlQgKi8pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKG1hdGNoLmluZGV4IDw9IDMpIHtcbiAgICAgICAgICAgIGVtaXRFcnJvcihjb250ZXh0LCAwIC8qIEVycm9yQ29kZXMuQUJSVVBUX0NMT1NJTkdfT0ZfRU1QVFlfQ09NTUVOVCAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGNoWzFdKSB7XG4gICAgICAgICAgICBlbWl0RXJyb3IoY29udGV4dCwgMTAgLyogRXJyb3JDb2Rlcy5JTkNPUlJFQ1RMWV9DTE9TRURfQ09NTUVOVCAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IGNvbnRleHQuc291cmNlLnNsaWNlKDQsIG1hdGNoLmluZGV4KTtcbiAgICAgICAgLy8gQWR2YW5jaW5nIHdpdGggcmVwb3J0aW5nIG5lc3RlZCBjb21tZW50cy5cbiAgICAgICAgY29uc3QgcyA9IGNvbnRleHQuc291cmNlLnNsaWNlKDAsIG1hdGNoLmluZGV4KTtcbiAgICAgICAgbGV0IHByZXZJbmRleCA9IDEsIG5lc3RlZEluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKChuZXN0ZWRJbmRleCA9IHMuaW5kZXhPZignPCEtLScsIHByZXZJbmRleCkpICE9PSAtMSkge1xuICAgICAgICAgICAgYWR2YW5jZUJ5KGNvbnRleHQsIG5lc3RlZEluZGV4IC0gcHJldkluZGV4ICsgMSk7XG4gICAgICAgICAgICBpZiAobmVzdGVkSW5kZXggKyA0IDwgcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBlbWl0RXJyb3IoY29udGV4dCwgMTYgLyogRXJyb3JDb2Rlcy5ORVNURURfQ09NTUVOVCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2SW5kZXggPSBuZXN0ZWRJbmRleCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgYWR2YW5jZUJ5KGNvbnRleHQsIG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoIC0gcHJldkluZGV4ICsgMSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IDMgLyogTm9kZVR5cGVzLkNPTU1FTlQgKi8sXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGxvYzogZ2V0U2VsZWN0aW9uKGNvbnRleHQsIHN0YXJ0KVxuICAgIH07XG59XG5mdW5jdGlvbiBwYXJzZUJvZ3VzQ29tbWVudChjb250ZXh0KSB7XG4gICAgY29uc3Qgc3RhcnQgPSBnZXRDdXJzb3IoY29udGV4dCk7XG4gICAgY29uc3QgY29udGVudFN0YXJ0ID0gY29udGV4dC5zb3VyY2VbMV0gPT09ICc/JyA/IDEgOiAyO1xuICAgIGxldCBjb250ZW50O1xuICAgIGNvbnN0IGNsb3NlSW5kZXggPSBjb250ZXh0LnNvdXJjZS5pbmRleE9mKCc+Jyk7XG4gICAgaWYgKGNsb3NlSW5kZXggPT09IC0xKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZXh0LnNvdXJjZS5zbGljZShjb250ZW50U3RhcnQpO1xuICAgICAgICBhZHZhbmNlQnkoY29udGV4dCwgY29udGV4dC5zb3VyY2UubGVuZ3RoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZXh0LnNvdXJjZS5zbGljZShjb250ZW50U3RhcnQsIGNsb3NlSW5kZXgpO1xuICAgICAgICBhZHZhbmNlQnkoY29udGV4dCwgY2xvc2VJbmRleCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAzIC8qIE5vZGVUeXBlcy5DT01NRU5UICovLFxuICAgICAgICBjb250ZW50LFxuICAgICAgICBsb2M6IGdldFNlbGVjdGlvbihjb250ZXh0LCBzdGFydClcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VFbGVtZW50KGNvbnRleHQsIGFuY2VzdG9ycykge1xuICAgIC8vIFN0YXJ0IHRhZy5cbiAgICBjb25zdCB3YXNJblByZSA9IGNvbnRleHQuaW5QcmU7XG4gICAgY29uc3Qgd2FzSW5WUHJlID0gY29udGV4dC5pblZQcmU7XG4gICAgY29uc3QgcGFyZW50ID0gbGFzdChhbmNlc3RvcnMpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBwYXJzZVRhZyhjb250ZXh0LCAwIC8qIFRhZ1R5cGUuU3RhcnQgKi8sIHBhcmVudCk7XG4gICAgY29uc3QgaXNQcmVCb3VuZGFyeSA9IGNvbnRleHQuaW5QcmUgJiYgIXdhc0luUHJlO1xuICAgIGNvbnN0IGlzVlByZUJvdW5kYXJ5ID0gY29udGV4dC5pblZQcmUgJiYgIXdhc0luVlByZTtcbiAgICBpZiAoZWxlbWVudC5pc1NlbGZDbG9zaW5nIHx8IGNvbnRleHQub3B0aW9ucy5pc1ZvaWRUYWcoZWxlbWVudC50YWcpKSB7XG4gICAgICAgIC8vICM0MDMwIHNlbGYtY2xvc2luZyA8cHJlPiB0YWdcbiAgICAgICAgaWYgKGlzUHJlQm91bmRhcnkpIHtcbiAgICAgICAgICAgIGNvbnRleHQuaW5QcmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNWUHJlQm91bmRhcnkpIHtcbiAgICAgICAgICAgIGNvbnRleHQuaW5WUHJlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuICAgIC8vIENoaWxkcmVuLlxuICAgIGFuY2VzdG9ycy5wdXNoKGVsZW1lbnQpO1xuICAgIGNvbnN0IG1vZGUgPSBjb250ZXh0Lm9wdGlvbnMuZ2V0VGV4dE1vZGUoZWxlbWVudCwgcGFyZW50KTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHBhcnNlQ2hpbGRyZW4oY29udGV4dCwgbW9kZSwgYW5jZXN0b3JzKTtcbiAgICBhbmNlc3RvcnMucG9wKCk7XG4gICAgLy8gMi54IGlubGluZS10ZW1wbGF0ZSBjb21wYXRcbiAgICB7XG4gICAgICAgIGNvbnN0IGlubGluZVRlbXBsYXRlUHJvcCA9IGVsZW1lbnQucHJvcHMuZmluZChwID0+IHAudHlwZSA9PT0gNiAvKiBOb2RlVHlwZXMuQVRUUklCVVRFICovICYmIHAubmFtZSA9PT0gJ2lubGluZS10ZW1wbGF0ZScpO1xuICAgICAgICBpZiAoaW5saW5lVGVtcGxhdGVQcm9wICYmXG4gICAgICAgICAgICBjaGVja0NvbXBhdEVuYWJsZWQoXCJDT01QSUxFUl9JTkxJTkVfVEVNUExBVEVcIiAvKiBDb21waWxlckRlcHJlY2F0aW9uVHlwZXMuQ09NUElMRVJfSU5MSU5FX1RFTVBMQVRFICovLCBjb250ZXh0LCBpbmxpbmVUZW1wbGF0ZVByb3AubG9jKSkge1xuICAgICAgICAgICAgY29uc3QgbG9jID0gZ2V0U2VsZWN0aW9uKGNvbnRleHQsIGVsZW1lbnQubG9jLmVuZCk7XG4gICAgICAgICAgICBpbmxpbmVUZW1wbGF0ZVByb3AudmFsdWUgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogMiAvKiBOb2RlVHlwZXMuVEVYVCAqLyxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBsb2Muc291cmNlLFxuICAgICAgICAgICAgICAgIGxvY1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbGVtZW50LmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgLy8gRW5kIHRhZy5cbiAgICBpZiAoc3RhcnRzV2l0aEVuZFRhZ09wZW4oY29udGV4dC5zb3VyY2UsIGVsZW1lbnQudGFnKSkge1xuICAgICAgICBwYXJzZVRhZyhjb250ZXh0LCAxIC8qIFRhZ1R5cGUuRW5kICovLCBwYXJlbnQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZW1pdEVycm9yKGNvbnRleHQsIDI0IC8qIEVycm9yQ29kZXMuWF9NSVNTSU5HX0VORF9UQUcgKi8sIDAsIGVsZW1lbnQubG9jLnN0YXJ0KTtcbiAgICAgICAgaWYgKGNvbnRleHQuc291cmNlLmxlbmd0aCA9PT0gMCAmJiBlbGVtZW50LnRhZy50b0xvd2VyQ2FzZSgpID09PSAnc2NyaXB0Jykge1xuICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBjaGlsZHJlblswXTtcbiAgICAgICAgICAgIGlmIChmaXJzdCAmJiBzdGFydHNXaXRoKGZpcnN0LmxvYy5zb3VyY2UsICc8IS0tJykpIHtcbiAgICAgICAgICAgICAgICBlbWl0RXJyb3IoY29udGV4dCwgOCAvKiBFcnJvckNvZGVzLkVPRl9JTl9TQ1JJUFRfSFRNTF9DT01NRU5UX0xJS0VfVEVYVCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxlbWVudC5sb2MgPSBnZXRTZWxlY3Rpb24oY29udGV4dCwgZWxlbWVudC5sb2Muc3RhcnQpO1xuICAgIGlmIChpc1ByZUJvdW5kYXJ5KSB7XG4gICAgICAgIGNvbnRleHQuaW5QcmUgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGlzVlByZUJvdW5kYXJ5KSB7XG4gICAgICAgIGNvbnRleHQuaW5WUHJlID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50O1xufVxuY29uc3QgaXNTcGVjaWFsVGVtcGxhdGVEaXJlY3RpdmUgPSAvKiNfX1BVUkVfXyovIG1ha2VNYXAoYGlmLGVsc2UsZWxzZS1pZixmb3Isc2xvdGApO1xuZnVuY3Rpb24gcGFyc2VUYWcoY29udGV4dCwgdHlwZSwgcGFyZW50KSB7XG4gICAgLy8gVGFnIG9wZW4uXG4gICAgY29uc3Qgc3RhcnQgPSBnZXRDdXJzb3IoY29udGV4dCk7XG4gICAgY29uc3QgbWF0Y2ggPSAvXjxcXC8/KFthLXpdW15cXHRcXHJcXG5cXGYgLz5dKikvaS5leGVjKGNvbnRleHQuc291cmNlKTtcbiAgICBjb25zdCB0YWcgPSBtYXRjaFsxXTtcbiAgICBjb25zdCBucyA9IGNvbnRleHQub3B0aW9ucy5nZXROYW1lc3BhY2UodGFnLCBwYXJlbnQpO1xuICAgIGFkdmFuY2VCeShjb250ZXh0LCBtYXRjaFswXS5sZW5ndGgpO1xuICAgIGFkdmFuY2VTcGFjZXMoY29udGV4dCk7XG4gICAgLy8gc2F2ZSBjdXJyZW50IHN0YXRlIGluIGNhc2Ugd2UgbmVlZCB0byByZS1wYXJzZSBhdHRyaWJ1dGVzIHdpdGggdi1wcmVcbiAgICBjb25zdCBjdXJzb3IgPSBnZXRDdXJzb3IoY29udGV4dCk7XG4gICAgY29uc3QgY3VycmVudFNvdXJjZSA9IGNvbnRleHQuc291cmNlO1xuICAgIC8vIGNoZWNrIDxwcmU+IHRhZ1xuICAgIGlmIChjb250ZXh0Lm9wdGlvbnMuaXNQcmVUYWcodGFnKSkge1xuICAgICAgICBjb250ZXh0LmluUHJlID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQXR0cmlidXRlcy5cbiAgICBsZXQgcHJvcHMgPSBwYXJzZUF0dHJpYnV0ZXMoY29udGV4dCwgdHlwZSk7XG4gICAgLy8gY2hlY2sgdi1wcmVcbiAgICBpZiAodHlwZSA9PT0gMCAvKiBUYWdUeXBlLlN0YXJ0ICovICYmXG4gICAgICAgICFjb250ZXh0LmluVlByZSAmJlxuICAgICAgICBwcm9wcy5zb21lKHAgPT4gcC50eXBlID09PSA3IC8qIE5vZGVUeXBlcy5ESVJFQ1RJVkUgKi8gJiYgcC5uYW1lID09PSAncHJlJykpIHtcbiAgICAgICAgY29udGV4dC5pblZQcmUgPSB0cnVlO1xuICAgICAgICAvLyByZXNldCBjb250ZXh0XG4gICAgICAgIGV4dGVuZChjb250ZXh0LCBjdXJzb3IpO1xuICAgICAgICBjb250ZXh0LnNvdXJjZSA9IGN1cnJlbnRTb3VyY2U7XG4gICAgICAgIC8vIHJlLXBhcnNlIGF0dHJzIGFuZCBmaWx0ZXIgb3V0IHYtcHJlIGl0c2VsZlxuICAgICAgICBwcm9wcyA9IHBhcnNlQXR0cmlidXRlcyhjb250ZXh0LCB0eXBlKS5maWx0ZXIocCA9PiBwLm5hbWUgIT09ICd2LXByZScpO1xuICAgIH1cbiAgICAvLyBUYWcgY2xvc2UuXG4gICAgbGV0IGlzU2VsZkNsb3NpbmcgPSBmYWxzZTtcbiAgICBpZiAoY29udGV4dC5zb3VyY2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGVtaXRFcnJvcihjb250ZXh0LCA5IC8qIEVycm9yQ29kZXMuRU9GX0lOX1RBRyAqLyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpc1NlbGZDbG9zaW5nID0gc3RhcnRzV2l0aChjb250ZXh0LnNvdXJjZSwgJy8+Jyk7XG4gICAgICAgIGlmICh0eXBlID09PSAxIC8qIFRhZ1R5cGUuRW5kICovICYmIGlzU2VsZkNsb3NpbmcpIHtcbiAgICAgICAgICAgIGVtaXRFcnJvcihjb250ZXh0LCA0IC8qIEVycm9yQ29kZXMuRU5EX1RBR19XSVRIX1RSQUlMSU5HX1NPTElEVVMgKi8pO1xuICAgICAgICB9XG4gICAgICAgIGFkdmFuY2VCeShjb250ZXh0LCBpc1NlbGZDbG9zaW5nID8gMiA6IDEpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gMSAvKiBUYWdUeXBlLkVuZCAqLykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIDIueCBkZXByZWNhdGlvbiBjaGVja3NcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmXG4gICAgICAgIGlzQ29tcGF0RW5hYmxlZChcIkNPTVBJTEVSX1ZfSUZfVl9GT1JfUFJFQ0VERU5DRVwiIC8qIENvbXBpbGVyRGVwcmVjYXRpb25UeXBlcy5DT01QSUxFUl9WX0lGX1ZfRk9SX1BSRUNFREVOQ0UgKi8sIGNvbnRleHQpKSB7XG4gICAgICAgIGxldCBoYXNJZiA9IGZhbHNlO1xuICAgICAgICBsZXQgaGFzRm9yID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBwcm9wc1tpXTtcbiAgICAgICAgICAgIGlmIChwLnR5cGUgPT09IDcgLyogTm9kZVR5cGVzLkRJUkVDVElWRSAqLykge1xuICAgICAgICAgICAgICAgIGlmIChwLm5hbWUgPT09ICdpZicpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzSWYgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwLm5hbWUgPT09ICdmb3InKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0ZvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc0lmICYmIGhhc0Zvcikge1xuICAgICAgICAgICAgICAgIHdhcm5EZXByZWNhdGlvbihcIkNPTVBJTEVSX1ZfSUZfVl9GT1JfUFJFQ0VERU5DRVwiIC8qIENvbXBpbGVyRGVwcmVjYXRpb25UeXBlcy5DT01QSUxFUl9WX0lGX1ZfRk9SX1BSRUNFREVOQ0UgKi8sIGNvbnRleHQsIGdldFNlbGVjdGlvbihjb250ZXh0LCBzdGFydCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGxldCB0YWdUeXBlID0gMCAvKiBFbGVtZW50VHlwZXMuRUxFTUVOVCAqLztcbiAgICBpZiAoIWNvbnRleHQuaW5WUHJlKSB7XG4gICAgICAgIGlmICh0YWcgPT09ICdzbG90Jykge1xuICAgICAgICAgICAgdGFnVHlwZSA9IDIgLyogRWxlbWVudFR5cGVzLlNMT1QgKi87XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGFnID09PSAndGVtcGxhdGUnKSB7XG4gICAgICAgICAgICBpZiAocHJvcHMuc29tZShwID0+IHAudHlwZSA9PT0gNyAvKiBOb2RlVHlwZXMuRElSRUNUSVZFICovICYmIGlzU3BlY2lhbFRlbXBsYXRlRGlyZWN0aXZlKHAubmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgdGFnVHlwZSA9IDMgLyogRWxlbWVudFR5cGVzLlRFTVBMQVRFICovO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQ29tcG9uZW50KHRhZywgcHJvcHMsIGNvbnRleHQpKSB7XG4gICAgICAgICAgICB0YWdUeXBlID0gMSAvKiBFbGVtZW50VHlwZXMuQ09NUE9ORU5UICovO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IDEgLyogTm9kZVR5cGVzLkVMRU1FTlQgKi8sXG4gICAgICAgIG5zLFxuICAgICAgICB0YWcsXG4gICAgICAgIHRhZ1R5cGUsXG4gICAgICAgIHByb3BzLFxuICAgICAgICBpc1NlbGZDbG9zaW5nLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgIGxvYzogZ2V0U2VsZWN0aW9uKGNvbnRleHQsIHN0YXJ0KSxcbiAgICAgICAgY29kZWdlbk5vZGU6IHVuZGVmaW5lZCAvLyB0byBiZSBjcmVhdGVkIGR1cmluZyB0cmFuc2Zvcm0gcGhhc2VcbiAgICB9O1xufVxuZnVuY3Rpb24gaXNDb21wb25lbnQodGFnLCBwcm9wcywgY29udGV4dCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgaWYgKG9wdGlvbnMuaXNDdXN0b21FbGVtZW50KHRhZykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGFnID09PSAnY29tcG9uZW50JyB8fFxuICAgICAgICAvXltBLVpdLy50ZXN0KHRhZykgfHxcbiAgICAgICAgaXNDb3JlQ29tcG9uZW50KHRhZykgfHxcbiAgICAgICAgKG9wdGlvbnMuaXNCdWlsdEluQ29tcG9uZW50ICYmIG9wdGlvbnMuaXNCdWlsdEluQ29tcG9uZW50KHRhZykpIHx8XG4gICAgICAgIChvcHRpb25zLmlzTmF0aXZlVGFnICYmICFvcHRpb25zLmlzTmF0aXZlVGFnKHRhZykpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBhdCB0aGlzIHBvaW50IHRoZSB0YWcgc2hvdWxkIGJlIGEgbmF0aXZlIHRhZywgYnV0IGNoZWNrIGZvciBwb3RlbnRpYWwgXCJpc1wiXG4gICAgLy8gY2FzdGluZ1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcCA9IHByb3BzW2ldO1xuICAgICAgICBpZiAocC50eXBlID09PSA2IC8qIE5vZGVUeXBlcy5BVFRSSUJVVEUgKi8pIHtcbiAgICAgICAgICAgIGlmIChwLm5hbWUgPT09ICdpcycgJiYgcC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChwLnZhbHVlLmNvbnRlbnQuc3RhcnRzV2l0aCgndnVlOicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0NvbXBhdEVuYWJsZWQoXCJDT01QSUxFUl9JU19PTl9FTEVNRU5UXCIgLyogQ29tcGlsZXJEZXByZWNhdGlvblR5cGVzLkNPTVBJTEVSX0lTX09OX0VMRU1FTlQgKi8sIGNvbnRleHQsIHAubG9jKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBkaXJlY3RpdmVcbiAgICAgICAgICAgIC8vIHYtaXMgKFRPRE8gRGVwcmVjYXRlKVxuICAgICAgICAgICAgaWYgKHAubmFtZSA9PT0gJ2lzJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAvLyA6aXMgb24gcGxhaW4gZWxlbWVudCAtIG9ubHkgdHJlYXQgYXMgY29tcG9uZW50IGluIGNvbXBhdCBtb2RlXG4gICAgICAgICAgICBwLm5hbWUgPT09ICdiaW5kJyAmJlxuICAgICAgICAgICAgICAgIGlzU3RhdGljQXJnT2YocC5hcmcsICdpcycpICYmXG4gICAgICAgICAgICAgICAgdHJ1ZSAmJlxuICAgICAgICAgICAgICAgIGNoZWNrQ29tcGF0RW5hYmxlZChcIkNPTVBJTEVSX0lTX09OX0VMRU1FTlRcIiAvKiBDb21waWxlckRlcHJlY2F0aW9uVHlwZXMuQ09NUElMRVJfSVNfT05fRUxFTUVOVCAqLywgY29udGV4dCwgcC5sb2MpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZUF0dHJpYnV0ZXMoY29udGV4dCwgdHlwZSkge1xuICAgIGNvbnN0IHByb3BzID0gW107XG4gICAgY29uc3QgYXR0cmlidXRlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgd2hpbGUgKGNvbnRleHQuc291cmNlLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgIXN0YXJ0c1dpdGgoY29udGV4dC5zb3VyY2UsICc+JykgJiZcbiAgICAgICAgIXN0YXJ0c1dpdGgoY29udGV4dC5zb3VyY2UsICcvPicpKSB7XG4gICAgICAgIGlmIChzdGFydHNXaXRoKGNvbnRleHQuc291cmNlLCAnLycpKSB7XG4gICAgICAgICAgICBlbWl0RXJyb3IoY29udGV4dCwgMjIgLyogRXJyb3JDb2Rlcy5VTkVYUEVDVEVEX1NPTElEVVNfSU5fVEFHICovKTtcbiAgICAgICAgICAgIGFkdmFuY2VCeShjb250ZXh0LCAxKTtcbiAgICAgICAgICAgIGFkdmFuY2VTcGFjZXMoY29udGV4dCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gMSAvKiBUYWdUeXBlLkVuZCAqLykge1xuICAgICAgICAgICAgZW1pdEVycm9yKGNvbnRleHQsIDMgLyogRXJyb3JDb2Rlcy5FTkRfVEFHX1dJVEhfQVRUUklCVVRFUyAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXR0ciA9IHBhcnNlQXR0cmlidXRlKGNvbnRleHQsIGF0dHJpYnV0ZU5hbWVzKTtcbiAgICAgICAgLy8gVHJpbSB3aGl0ZXNwYWNlIGJldHdlZW4gY2xhc3NcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL2NvcmUvaXNzdWVzLzQyNTFcbiAgICAgICAgaWYgKGF0dHIudHlwZSA9PT0gNiAvKiBOb2RlVHlwZXMuQVRUUklCVVRFICovICYmXG4gICAgICAgICAgICBhdHRyLnZhbHVlICYmXG4gICAgICAgICAgICBhdHRyLm5hbWUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgIGF0dHIudmFsdWUuY29udGVudCA9IGF0dHIudmFsdWUuY29udGVudC5yZXBsYWNlKC9cXHMrL2csICcgJykudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSAwIC8qIFRhZ1R5cGUuU3RhcnQgKi8pIHtcbiAgICAgICAgICAgIHByb3BzLnB1c2goYXR0cik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKC9eW15cXHRcXHJcXG5cXGYgLz5dLy50ZXN0KGNvbnRleHQuc291cmNlKSkge1xuICAgICAgICAgICAgZW1pdEVycm9yKGNvbnRleHQsIDE1IC8qIEVycm9yQ29kZXMuTUlTU0lOR19XSElURVNQQUNFX0JFVFdFRU5fQVRUUklCVVRFUyAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgYWR2YW5jZVNwYWNlcyhjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3BzO1xufVxuZnVuY3Rpb24gcGFyc2VBdHRyaWJ1dGUoY29udGV4dCwgbmFtZVNldCkge1xuICAgIC8vIE5hbWUuXG4gICAgY29uc3Qgc3RhcnQgPSBnZXRDdXJzb3IoY29udGV4dCk7XG4gICAgY29uc3QgbWF0Y2ggPSAvXlteXFx0XFxyXFxuXFxmIC8+XVteXFx0XFxyXFxuXFxmIC8+PV0qLy5leGVjKGNvbnRleHQuc291cmNlKTtcbiAgICBjb25zdCBuYW1lID0gbWF0Y2hbMF07XG4gICAgaWYgKG5hbWVTZXQuaGFzKG5hbWUpKSB7XG4gICAgICAgIGVtaXRFcnJvcihjb250ZXh0LCAyIC8qIEVycm9yQ29kZXMuRFVQTElDQVRFX0FUVFJJQlVURSAqLyk7XG4gICAgfVxuICAgIG5hbWVTZXQuYWRkKG5hbWUpO1xuICAgIGlmIChuYW1lWzBdID09PSAnPScpIHtcbiAgICAgICAgZW1pdEVycm9yKGNvbnRleHQsIDE5IC8qIEVycm9yQ29kZXMuVU5FWFBFQ1RFRF9FUVVBTFNfU0lHTl9CRUZPUkVfQVRUUklCVVRFX05BTUUgKi8pO1xuICAgIH1cbiAgICB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSAvW1wiJzxdL2c7XG4gICAgICAgIGxldCBtO1xuICAgICAgICB3aGlsZSAoKG0gPSBwYXR0ZXJuLmV4ZWMobmFtZSkpKSB7XG4gICAgICAgICAgICBlbWl0RXJyb3IoY29udGV4dCwgMTcgLyogRXJyb3JDb2Rlcy5VTkVYUEVDVEVEX0NIQVJBQ1RFUl9JTl9BVFRSSUJVVEVfTkFNRSAqLywgbS5pbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWR2YW5jZUJ5KGNvbnRleHQsIG5hbWUubGVuZ3RoKTtcbiAgICAvLyBWYWx1ZVxuICAgIGxldCB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICBpZiAoL15bXFx0XFxyXFxuXFxmIF0qPS8udGVzdChjb250ZXh0LnNvdXJjZSkpIHtcbiAgICAgICAgYWR2YW5jZVNwYWNlcyhjb250ZXh0KTtcbiAgICAgICAgYWR2YW5jZUJ5KGNvbnRleHQsIDEpO1xuICAgICAgICBhZHZhbmNlU3BhY2VzKGNvbnRleHQpO1xuICAgICAgICB2YWx1ZSA9IHBhcnNlQXR0cmlidXRlVmFsdWUoY29udGV4dCk7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIGVtaXRFcnJvcihjb250ZXh0LCAxMyAvKiBFcnJvckNvZGVzLk1JU1NJTkdfQVRUUklCVVRFX1ZBTFVFICovKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsb2MgPSBnZXRTZWxlY3Rpb24oY29udGV4dCwgc3RhcnQpO1xuICAgIGlmICghY29udGV4dC5pblZQcmUgJiYgL14odi1bQS1aYS16MC05LV18OnxcXC58QHwjKS8udGVzdChuYW1lKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC8oPzpedi0oW2EtejAtOS1dKykpPyg/Oig/Ojp8XlxcLnxeQHxeIykoXFxbW15cXF1dK1xcXXxbXlxcLl0rKSk/KC4rKT8kL2kuZXhlYyhuYW1lKTtcbiAgICAgICAgbGV0IGlzUHJvcFNob3J0aGFuZCA9IHN0YXJ0c1dpdGgobmFtZSwgJy4nKTtcbiAgICAgICAgbGV0IGRpck5hbWUgPSBtYXRjaFsxXSB8fFxuICAgICAgICAgICAgKGlzUHJvcFNob3J0aGFuZCB8fCBzdGFydHNXaXRoKG5hbWUsICc6JylcbiAgICAgICAgICAgICAgICA/ICdiaW5kJ1xuICAgICAgICAgICAgICAgIDogc3RhcnRzV2l0aChuYW1lLCAnQCcpXG4gICAgICAgICAgICAgICAgICAgID8gJ29uJ1xuICAgICAgICAgICAgICAgICAgICA6ICdzbG90Jyk7XG4gICAgICAgIGxldCBhcmc7XG4gICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgY29uc3QgaXNTbG90ID0gZGlyTmFtZSA9PT0gJ3Nsb3QnO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRPZmZzZXQgPSBuYW1lLmxhc3RJbmRleE9mKG1hdGNoWzJdKTtcbiAgICAgICAgICAgIGNvbnN0IGxvYyA9IGdldFNlbGVjdGlvbihjb250ZXh0LCBnZXROZXdQb3NpdGlvbihjb250ZXh0LCBzdGFydCwgc3RhcnRPZmZzZXQpLCBnZXROZXdQb3NpdGlvbihjb250ZXh0LCBzdGFydCwgc3RhcnRPZmZzZXQgKyBtYXRjaFsyXS5sZW5ndGggKyAoKGlzU2xvdCAmJiBtYXRjaFszXSkgfHwgJycpLmxlbmd0aCkpO1xuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBtYXRjaFsyXTtcbiAgICAgICAgICAgIGxldCBpc1N0YXRpYyA9IHRydWU7XG4gICAgICAgICAgICBpZiAoY29udGVudC5zdGFydHNXaXRoKCdbJykpIHtcbiAgICAgICAgICAgICAgICBpc1N0YXRpYyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICghY29udGVudC5lbmRzV2l0aCgnXScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcihjb250ZXh0LCAyNyAvKiBFcnJvckNvZGVzLlhfTUlTU0lOR19EWU5BTUlDX0RJUkVDVElWRV9BUkdVTUVOVF9FTkQgKi8pO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEsIGNvbnRlbnQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNTbG90KSB7XG4gICAgICAgICAgICAgICAgLy8gIzEyNDEgc3BlY2lhbCBjYXNlIGZvciB2LXNsb3Q6IHZ1ZXRpZnkgcmVsaWVzIGV4dGVuc2l2ZWx5IG9uIHNsb3RcbiAgICAgICAgICAgICAgICAvLyBuYW1lcyBjb250YWluaW5nIGRvdHMuIHYtc2xvdCBkb2Vzbid0IGhhdmUgYW55IG1vZGlmaWVycyBhbmQgVnVlIDIueFxuICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRzIHN1Y2ggdXNhZ2Ugc28gd2UgYXJlIGtlZXBpbmcgaXQgY29uc2lzdGVudCB3aXRoIDIueC5cbiAgICAgICAgICAgICAgICBjb250ZW50ICs9IG1hdGNoWzNdIHx8ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXJnID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IDQgLyogTm9kZVR5cGVzLlNJTVBMRV9FWFBSRVNTSU9OICovLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgaXNTdGF0aWMsXG4gICAgICAgICAgICAgICAgY29uc3RUeXBlOiBpc1N0YXRpY1xuICAgICAgICAgICAgICAgICAgICA/IDMgLyogQ29uc3RhbnRUeXBlcy5DQU5fU1RSSU5HSUZZICovXG4gICAgICAgICAgICAgICAgICAgIDogMCAvKiBDb25zdGFudFR5cGVzLk5PVF9DT05TVEFOVCAqLyxcbiAgICAgICAgICAgICAgICBsb2NcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmlzUXVvdGVkKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZUxvYyA9IHZhbHVlLmxvYztcbiAgICAgICAgICAgIHZhbHVlTG9jLnN0YXJ0Lm9mZnNldCsrO1xuICAgICAgICAgICAgdmFsdWVMb2Muc3RhcnQuY29sdW1uKys7XG4gICAgICAgICAgICB2YWx1ZUxvYy5lbmQgPSBhZHZhbmNlUG9zaXRpb25XaXRoQ2xvbmUodmFsdWVMb2Muc3RhcnQsIHZhbHVlLmNvbnRlbnQpO1xuICAgICAgICAgICAgdmFsdWVMb2Muc291cmNlID0gdmFsdWVMb2Muc291cmNlLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtb2RpZmllcnMgPSBtYXRjaFszXSA/IG1hdGNoWzNdLnNsaWNlKDEpLnNwbGl0KCcuJykgOiBbXTtcbiAgICAgICAgaWYgKGlzUHJvcFNob3J0aGFuZClcbiAgICAgICAgICAgIG1vZGlmaWVycy5wdXNoKCdwcm9wJyk7XG4gICAgICAgIC8vIDIueCBjb21wYXQgdi1iaW5kOmZvby5zeW5jIC0+IHYtbW9kZWw6Zm9vXG4gICAgICAgIGlmIChkaXJOYW1lID09PSAnYmluZCcgJiYgYXJnKSB7XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzLmluY2x1ZGVzKCdzeW5jJykgJiZcbiAgICAgICAgICAgICAgICBjaGVja0NvbXBhdEVuYWJsZWQoXCJDT01QSUxFUl9WX0JJTkRfU1lOQ1wiIC8qIENvbXBpbGVyRGVwcmVjYXRpb25UeXBlcy5DT01QSUxFUl9WX0JJTkRfU1lOQyAqLywgY29udGV4dCwgbG9jLCBhcmcubG9jLnNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICBkaXJOYW1lID0gJ21vZGVsJztcbiAgICAgICAgICAgICAgICBtb2RpZmllcnMuc3BsaWNlKG1vZGlmaWVycy5pbmRleE9mKCdzeW5jJyksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiBtb2RpZmllcnMuaW5jbHVkZXMoJ3Byb3AnKSkge1xuICAgICAgICAgICAgICAgIGNoZWNrQ29tcGF0RW5hYmxlZChcIkNPTVBJTEVSX1ZfQklORF9QUk9QXCIgLyogQ29tcGlsZXJEZXByZWNhdGlvblR5cGVzLkNPTVBJTEVSX1ZfQklORF9QUk9QICovLCBjb250ZXh0LCBsb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiA3IC8qIE5vZGVUeXBlcy5ESVJFQ1RJVkUgKi8sXG4gICAgICAgICAgICBuYW1lOiBkaXJOYW1lLFxuICAgICAgICAgICAgZXhwOiB2YWx1ZSAmJiB7XG4gICAgICAgICAgICAgICAgdHlwZTogNCAvKiBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT04gKi8sXG4gICAgICAgICAgICAgICAgY29udGVudDogdmFsdWUuY29udGVudCxcbiAgICAgICAgICAgICAgICBpc1N0YXRpYzogZmFsc2UsXG4gICAgICAgICAgICAgICAgLy8gVHJlYXQgYXMgbm9uLWNvbnN0YW50IGJ5IGRlZmF1bHQuIFRoaXMgY2FuIGJlIHBvdGVudGlhbGx5IHNldCB0b1xuICAgICAgICAgICAgICAgIC8vIG90aGVyIHZhbHVlcyBieSBgdHJhbnNmb3JtRXhwcmVzc2lvbmAgdG8gbWFrZSBpdCBlbGlnaWJsZSBmb3IgaG9pc3RpbmcuXG4gICAgICAgICAgICAgICAgY29uc3RUeXBlOiAwIC8qIENvbnN0YW50VHlwZXMuTk9UX0NPTlNUQU5UICovLFxuICAgICAgICAgICAgICAgIGxvYzogdmFsdWUubG9jXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXJnLFxuICAgICAgICAgICAgbW9kaWZpZXJzLFxuICAgICAgICAgICAgbG9jXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIG1pc3NpbmcgZGlyZWN0aXZlIG5hbWUgb3IgaWxsZWdhbCBkaXJlY3RpdmUgbmFtZVxuICAgIGlmICghY29udGV4dC5pblZQcmUgJiYgc3RhcnRzV2l0aChuYW1lLCAndi0nKSkge1xuICAgICAgICBlbWl0RXJyb3IoY29udGV4dCwgMjYgLyogRXJyb3JDb2Rlcy5YX01JU1NJTkdfRElSRUNUSVZFX05BTUUgKi8pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiA2IC8qIE5vZGVUeXBlcy5BVFRSSUJVVEUgKi8sXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHZhbHVlOiB2YWx1ZSAmJiB7XG4gICAgICAgICAgICB0eXBlOiAyIC8qIE5vZGVUeXBlcy5URVhUICovLFxuICAgICAgICAgICAgY29udGVudDogdmFsdWUuY29udGVudCxcbiAgICAgICAgICAgIGxvYzogdmFsdWUubG9jXG4gICAgICAgIH0sXG4gICAgICAgIGxvY1xuICAgIH07XG59XG5mdW5jdGlvbiBwYXJzZUF0dHJpYnV0ZVZhbHVlKGNvbnRleHQpIHtcbiAgICBjb25zdCBzdGFydCA9IGdldEN1cnNvcihjb250ZXh0KTtcbiAgICBsZXQgY29udGVudDtcbiAgICBjb25zdCBxdW90ZSA9IGNvbnRleHQuc291cmNlWzBdO1xuICAgIGNvbnN0IGlzUXVvdGVkID0gcXVvdGUgPT09IGBcImAgfHwgcXVvdGUgPT09IGAnYDtcbiAgICBpZiAoaXNRdW90ZWQpIHtcbiAgICAgICAgLy8gUXVvdGVkIHZhbHVlLlxuICAgICAgICBhZHZhbmNlQnkoY29udGV4dCwgMSk7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gY29udGV4dC5zb3VyY2UuaW5kZXhPZihxdW90ZSk7XG4gICAgICAgIGlmIChlbmRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBwYXJzZVRleHREYXRhKGNvbnRleHQsIGNvbnRleHQuc291cmNlLmxlbmd0aCwgNCAvKiBUZXh0TW9kZXMuQVRUUklCVVRFX1ZBTFVFICovKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBwYXJzZVRleHREYXRhKGNvbnRleHQsIGVuZEluZGV4LCA0IC8qIFRleHRNb2Rlcy5BVFRSSUJVVEVfVkFMVUUgKi8pO1xuICAgICAgICAgICAgYWR2YW5jZUJ5KGNvbnRleHQsIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBVbnF1b3RlZFxuICAgICAgICBjb25zdCBtYXRjaCA9IC9eW15cXHRcXHJcXG5cXGYgPl0rLy5leGVjKGNvbnRleHQuc291cmNlKTtcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bmV4cGVjdGVkQ2hhcnMgPSAvW1wiJzw9YF0vZztcbiAgICAgICAgbGV0IG07XG4gICAgICAgIHdoaWxlICgobSA9IHVuZXhwZWN0ZWRDaGFycy5leGVjKG1hdGNoWzBdKSkpIHtcbiAgICAgICAgICAgIGVtaXRFcnJvcihjb250ZXh0LCAxOCAvKiBFcnJvckNvZGVzLlVORVhQRUNURURfQ0hBUkFDVEVSX0lOX1VOUVVPVEVEX0FUVFJJQlVURV9WQUxVRSAqLywgbS5pbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IHBhcnNlVGV4dERhdGEoY29udGV4dCwgbWF0Y2hbMF0ubGVuZ3RoLCA0IC8qIFRleHRNb2Rlcy5BVFRSSUJVVEVfVkFMVUUgKi8pO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50LCBpc1F1b3RlZCwgbG9jOiBnZXRTZWxlY3Rpb24oY29udGV4dCwgc3RhcnQpIH07XG59XG5mdW5jdGlvbiBwYXJzZUludGVycG9sYXRpb24oY29udGV4dCwgbW9kZSkge1xuICAgIGNvbnN0IFtvcGVuLCBjbG9zZV0gPSBjb250ZXh0Lm9wdGlvbnMuZGVsaW1pdGVycztcbiAgICBjb25zdCBjbG9zZUluZGV4ID0gY29udGV4dC5zb3VyY2UuaW5kZXhPZihjbG9zZSwgb3Blbi5sZW5ndGgpO1xuICAgIGlmIChjbG9zZUluZGV4ID09PSAtMSkge1xuICAgICAgICBlbWl0RXJyb3IoY29udGV4dCwgMjUgLyogRXJyb3JDb2Rlcy5YX01JU1NJTkdfSU5URVJQT0xBVElPTl9FTkQgKi8pO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBzdGFydCA9IGdldEN1cnNvcihjb250ZXh0KTtcbiAgICBhZHZhbmNlQnkoY29udGV4dCwgb3Blbi5sZW5ndGgpO1xuICAgIGNvbnN0IGlubmVyU3RhcnQgPSBnZXRDdXJzb3IoY29udGV4dCk7XG4gICAgY29uc3QgaW5uZXJFbmQgPSBnZXRDdXJzb3IoY29udGV4dCk7XG4gICAgY29uc3QgcmF3Q29udGVudExlbmd0aCA9IGNsb3NlSW5kZXggLSBvcGVuLmxlbmd0aDtcbiAgICBjb25zdCByYXdDb250ZW50ID0gY29udGV4dC5zb3VyY2Uuc2xpY2UoMCwgcmF3Q29udGVudExlbmd0aCk7XG4gICAgY29uc3QgcHJlVHJpbUNvbnRlbnQgPSBwYXJzZVRleHREYXRhKGNvbnRleHQsIHJhd0NvbnRlbnRMZW5ndGgsIG1vZGUpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBwcmVUcmltQ29udGVudC50cmltKCk7XG4gICAgY29uc3Qgc3RhcnRPZmZzZXQgPSBwcmVUcmltQ29udGVudC5pbmRleE9mKGNvbnRlbnQpO1xuICAgIGlmIChzdGFydE9mZnNldCA+IDApIHtcbiAgICAgICAgYWR2YW5jZVBvc2l0aW9uV2l0aE11dGF0aW9uKGlubmVyU3RhcnQsIHJhd0NvbnRlbnQsIHN0YXJ0T2Zmc2V0KTtcbiAgICB9XG4gICAgY29uc3QgZW5kT2Zmc2V0ID0gcmF3Q29udGVudExlbmd0aCAtIChwcmVUcmltQ29udGVudC5sZW5ndGggLSBjb250ZW50Lmxlbmd0aCAtIHN0YXJ0T2Zmc2V0KTtcbiAgICBhZHZhbmNlUG9zaXRpb25XaXRoTXV0YXRpb24oaW5uZXJFbmQsIHJhd0NvbnRlbnQsIGVuZE9mZnNldCk7XG4gICAgYWR2YW5jZUJ5KGNvbnRleHQsIGNsb3NlLmxlbmd0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogNSAvKiBOb2RlVHlwZXMuSU5URVJQT0xBVElPTiAqLyxcbiAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgdHlwZTogNCAvKiBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT04gKi8sXG4gICAgICAgICAgICBpc1N0YXRpYzogZmFsc2UsXG4gICAgICAgICAgICAvLyBTZXQgYGlzQ29uc3RhbnRgIHRvIGZhbHNlIGJ5IGRlZmF1bHQgYW5kIHdpbGwgZGVjaWRlIGluIHRyYW5zZm9ybUV4cHJlc3Npb25cbiAgICAgICAgICAgIGNvbnN0VHlwZTogMCAvKiBDb25zdGFudFR5cGVzLk5PVF9DT05TVEFOVCAqLyxcbiAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICBsb2M6IGdldFNlbGVjdGlvbihjb250ZXh0LCBpbm5lclN0YXJ0LCBpbm5lckVuZClcbiAgICAgICAgfSxcbiAgICAgICAgbG9jOiBnZXRTZWxlY3Rpb24oY29udGV4dCwgc3RhcnQpXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlVGV4dChjb250ZXh0LCBtb2RlKSB7XG4gICAgY29uc3QgZW5kVG9rZW5zID0gbW9kZSA9PT0gMyAvKiBUZXh0TW9kZXMuQ0RBVEEgKi8gPyBbJ11dPiddIDogWyc8JywgY29udGV4dC5vcHRpb25zLmRlbGltaXRlcnNbMF1dO1xuICAgIGxldCBlbmRJbmRleCA9IGNvbnRleHQuc291cmNlLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuZFRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBpbmRleCA9IGNvbnRleHQuc291cmNlLmluZGV4T2YoZW5kVG9rZW5zW2ldLCAxKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSAmJiBlbmRJbmRleCA+IGluZGV4KSB7XG4gICAgICAgICAgICBlbmRJbmRleCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0ID0gZ2V0Q3Vyc29yKGNvbnRleHQpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBwYXJzZVRleHREYXRhKGNvbnRleHQsIGVuZEluZGV4LCBtb2RlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAyIC8qIE5vZGVUeXBlcy5URVhUICovLFxuICAgICAgICBjb250ZW50LFxuICAgICAgICBsb2M6IGdldFNlbGVjdGlvbihjb250ZXh0LCBzdGFydClcbiAgICB9O1xufVxuLyoqXG4gKiBHZXQgdGV4dCBkYXRhIHdpdGggYSBnaXZlbiBsZW5ndGggZnJvbSB0aGUgY3VycmVudCBsb2NhdGlvbi5cbiAqIFRoaXMgdHJhbnNsYXRlcyBIVE1MIGVudGl0aWVzIGluIHRoZSB0ZXh0IGRhdGEuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlVGV4dERhdGEoY29udGV4dCwgbGVuZ3RoLCBtb2RlKSB7XG4gICAgY29uc3QgcmF3VGV4dCA9IGNvbnRleHQuc291cmNlLnNsaWNlKDAsIGxlbmd0aCk7XG4gICAgYWR2YW5jZUJ5KGNvbnRleHQsIGxlbmd0aCk7XG4gICAgaWYgKG1vZGUgPT09IDIgLyogVGV4dE1vZGVzLlJBV1RFWFQgKi8gfHxcbiAgICAgICAgbW9kZSA9PT0gMyAvKiBUZXh0TW9kZXMuQ0RBVEEgKi8gfHxcbiAgICAgICAgIXJhd1RleHQuaW5jbHVkZXMoJyYnKSkge1xuICAgICAgICByZXR1cm4gcmF3VGV4dDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIERBVEEgb3IgUkNEQVRBIGNvbnRhaW5pbmcgXCImXCJcIi4gRW50aXR5IGRlY29kaW5nIHJlcXVpcmVkLlxuICAgICAgICByZXR1cm4gY29udGV4dC5vcHRpb25zLmRlY29kZUVudGl0aWVzKHJhd1RleHQsIG1vZGUgPT09IDQgLyogVGV4dE1vZGVzLkFUVFJJQlVURV9WQUxVRSAqLyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0Q3Vyc29yKGNvbnRleHQpIHtcbiAgICBjb25zdCB7IGNvbHVtbiwgbGluZSwgb2Zmc2V0IH0gPSBjb250ZXh0O1xuICAgIHJldHVybiB7IGNvbHVtbiwgbGluZSwgb2Zmc2V0IH07XG59XG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24oY29udGV4dCwgc3RhcnQsIGVuZCkge1xuICAgIGVuZCA9IGVuZCB8fCBnZXRDdXJzb3IoY29udGV4dCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGVuZCxcbiAgICAgICAgc291cmNlOiBjb250ZXh0Lm9yaWdpbmFsU291cmNlLnNsaWNlKHN0YXJ0Lm9mZnNldCwgZW5kLm9mZnNldClcbiAgICB9O1xufVxuZnVuY3Rpb24gbGFzdCh4cykge1xuICAgIHJldHVybiB4c1t4cy5sZW5ndGggLSAxXTtcbn1cbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc291cmNlLCBzZWFyY2hTdHJpbmcpIHtcbiAgICByZXR1cm4gc291cmNlLnN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nKTtcbn1cbmZ1bmN0aW9uIGFkdmFuY2VCeShjb250ZXh0LCBudW1iZXJPZkNoYXJhY3RlcnMpIHtcbiAgICBjb25zdCB7IHNvdXJjZSB9ID0gY29udGV4dDtcbiAgICBhZHZhbmNlUG9zaXRpb25XaXRoTXV0YXRpb24oY29udGV4dCwgc291cmNlLCBudW1iZXJPZkNoYXJhY3RlcnMpO1xuICAgIGNvbnRleHQuc291cmNlID0gc291cmNlLnNsaWNlKG51bWJlck9mQ2hhcmFjdGVycyk7XG59XG5mdW5jdGlvbiBhZHZhbmNlU3BhY2VzKGNvbnRleHQpIHtcbiAgICBjb25zdCBtYXRjaCA9IC9eW1xcdFxcclxcblxcZiBdKy8uZXhlYyhjb250ZXh0LnNvdXJjZSk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGFkdmFuY2VCeShjb250ZXh0LCBtYXRjaFswXS5sZW5ndGgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldE5ld1Bvc2l0aW9uKGNvbnRleHQsIHN0YXJ0LCBudW1iZXJPZkNoYXJhY3RlcnMpIHtcbiAgICByZXR1cm4gYWR2YW5jZVBvc2l0aW9uV2l0aENsb25lKHN0YXJ0LCBjb250ZXh0Lm9yaWdpbmFsU291cmNlLnNsaWNlKHN0YXJ0Lm9mZnNldCwgbnVtYmVyT2ZDaGFyYWN0ZXJzKSwgbnVtYmVyT2ZDaGFyYWN0ZXJzKTtcbn1cbmZ1bmN0aW9uIGVtaXRFcnJvcihjb250ZXh0LCBjb2RlLCBvZmZzZXQsIGxvYyA9IGdldEN1cnNvcihjb250ZXh0KSkge1xuICAgIGlmIChvZmZzZXQpIHtcbiAgICAgICAgbG9jLm9mZnNldCArPSBvZmZzZXQ7XG4gICAgICAgIGxvYy5jb2x1bW4gKz0gb2Zmc2V0O1xuICAgIH1cbiAgICBjb250ZXh0Lm9wdGlvbnMub25FcnJvcihjcmVhdGVDb21waWxlckVycm9yKGNvZGUsIHtcbiAgICAgICAgc3RhcnQ6IGxvYyxcbiAgICAgICAgZW5kOiBsb2MsXG4gICAgICAgIHNvdXJjZTogJydcbiAgICB9KSk7XG59XG5mdW5jdGlvbiBpc0VuZChjb250ZXh0LCBtb2RlLCBhbmNlc3RvcnMpIHtcbiAgICBjb25zdCBzID0gY29udGV4dC5zb3VyY2U7XG4gICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgIGNhc2UgMCAvKiBUZXh0TW9kZXMuREFUQSAqLzpcbiAgICAgICAgICAgIGlmIChzdGFydHNXaXRoKHMsICc8LycpKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcHJvYmFibHkgYmFkIHBlcmZvcm1hbmNlXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGFuY2VzdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRzV2l0aEVuZFRhZ09wZW4ocywgYW5jZXN0b3JzW2ldLnRhZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMSAvKiBUZXh0TW9kZXMuUkNEQVRBICovOlxuICAgICAgICBjYXNlIDIgLyogVGV4dE1vZGVzLlJBV1RFWFQgKi86IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGxhc3QoYW5jZXN0b3JzKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgc3RhcnRzV2l0aEVuZFRhZ09wZW4ocywgcGFyZW50LnRhZykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMyAvKiBUZXh0TW9kZXMuQ0RBVEEgKi86XG4gICAgICAgICAgICBpZiAoc3RhcnRzV2l0aChzLCAnXV0+JykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gIXM7XG59XG5mdW5jdGlvbiBzdGFydHNXaXRoRW5kVGFnT3Blbihzb3VyY2UsIHRhZykge1xuICAgIHJldHVybiAoc3RhcnRzV2l0aChzb3VyY2UsICc8LycpICYmXG4gICAgICAgIHNvdXJjZS5zbGljZSgyLCAyICsgdGFnLmxlbmd0aCkudG9Mb3dlckNhc2UoKSA9PT0gdGFnLnRvTG93ZXJDYXNlKCkgJiZcbiAgICAgICAgL1tcXHRcXHJcXG5cXGYgLz5dLy50ZXN0KHNvdXJjZVsyICsgdGFnLmxlbmd0aF0gfHwgJz4nKSk7XG59XG5cbmZ1bmN0aW9uIGhvaXN0U3RhdGljKHJvb3QsIGNvbnRleHQpIHtcbiAgICB3YWxrKHJvb3QsIGNvbnRleHQsIFxuICAgIC8vIFJvb3Qgbm9kZSBpcyB1bmZvcnR1bmF0ZWx5IG5vbi1ob2lzdGFibGUgZHVlIHRvIHBvdGVudGlhbCBwYXJlbnRcbiAgICAvLyBmYWxsdGhyb3VnaCBhdHRyaWJ1dGVzLlxuICAgIGlzU2luZ2xlRWxlbWVudFJvb3Qocm9vdCwgcm9vdC5jaGlsZHJlblswXSkpO1xufVxuZnVuY3Rpb24gaXNTaW5nbGVFbGVtZW50Um9vdChyb290LCBjaGlsZCkge1xuICAgIGNvbnN0IHsgY2hpbGRyZW4gfSA9IHJvb3Q7XG4gICAgcmV0dXJuIChjaGlsZHJlbi5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgY2hpbGQudHlwZSA9PT0gMSAvKiBOb2RlVHlwZXMuRUxFTUVOVCAqLyAmJlxuICAgICAgICAhaXNTbG90T3V0bGV0KGNoaWxkKSk7XG59XG5mdW5jdGlvbiB3YWxrKG5vZGUsIGNvbnRleHQsIGRvTm90SG9pc3ROb2RlID0gZmFsc2UpIHtcbiAgICBjb25zdCB7IGNoaWxkcmVuIH0gPSBub2RlO1xuICAgIGNvbnN0IG9yaWdpbmFsQ291bnQgPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgbGV0IGhvaXN0ZWRDb3VudCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAvLyBvbmx5IHBsYWluIGVsZW1lbnRzICYgdGV4dCBjYWxscyBhcmUgZWxpZ2libGUgZm9yIGhvaXN0aW5nLlxuICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gMSAvKiBOb2RlVHlwZXMuRUxFTUVOVCAqLyAmJlxuICAgICAgICAgICAgY2hpbGQudGFnVHlwZSA9PT0gMCAvKiBFbGVtZW50VHlwZXMuRUxFTUVOVCAqLykge1xuICAgICAgICAgICAgY29uc3QgY29uc3RhbnRUeXBlID0gZG9Ob3RIb2lzdE5vZGVcbiAgICAgICAgICAgICAgICA/IDAgLyogQ29uc3RhbnRUeXBlcy5OT1RfQ09OU1RBTlQgKi9cbiAgICAgICAgICAgICAgICA6IGdldENvbnN0YW50VHlwZShjaGlsZCwgY29udGV4dCk7XG4gICAgICAgICAgICBpZiAoY29uc3RhbnRUeXBlID4gMCAvKiBDb25zdGFudFR5cGVzLk5PVF9DT05TVEFOVCAqLykge1xuICAgICAgICAgICAgICAgIGlmIChjb25zdGFudFR5cGUgPj0gMiAvKiBDb25zdGFudFR5cGVzLkNBTl9IT0lTVCAqLykge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5jb2RlZ2VuTm9kZS5wYXRjaEZsYWcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgLTEgLyogUGF0Y2hGbGFncy5IT0lTVEVEICovICsgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGAgLyogSE9JU1RFRCAqL2AgOiBgYCk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmNvZGVnZW5Ob2RlID0gY29udGV4dC5ob2lzdChjaGlsZC5jb2RlZ2VuTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGhvaXN0ZWRDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBub2RlIG1heSBjb250YWluIGR5bmFtaWMgY2hpbGRyZW4sIGJ1dCBpdHMgcHJvcHMgbWF5IGJlIGVsaWdpYmxlIGZvclxuICAgICAgICAgICAgICAgIC8vIGhvaXN0aW5nLlxuICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVnZW5Ob2RlID0gY2hpbGQuY29kZWdlbk5vZGU7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGVnZW5Ob2RlLnR5cGUgPT09IDEzIC8qIE5vZGVUeXBlcy5WTk9ERV9DQUxMICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsYWcgPSBnZXRQYXRjaEZsYWcoY29kZWdlbk5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKCFmbGFnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnID09PSA1MTIgLyogUGF0Y2hGbGFncy5ORUVEX1BBVENIICovIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnID09PSAxIC8qIFBhdGNoRmxhZ3MuVEVYVCAqLykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldEdlbmVyYXRlZFByb3BzQ29uc3RhbnRUeXBlKGNoaWxkLCBjb250ZXh0KSA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgLyogQ29uc3RhbnRUeXBlcy5DQU5fSE9JU1QgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gZ2V0Tm9kZVByb3BzKGNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVnZW5Ob2RlLnByb3BzID0gY29udGV4dC5ob2lzdChwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVnZW5Ob2RlLmR5bmFtaWNQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZWdlbk5vZGUuZHluYW1pY1Byb3BzID0gY29udGV4dC5ob2lzdChjb2RlZ2VuTm9kZS5keW5hbWljUHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHdhbGsgZnVydGhlclxuICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gMSAvKiBOb2RlVHlwZXMuRUxFTUVOVCAqLykge1xuICAgICAgICAgICAgY29uc3QgaXNDb21wb25lbnQgPSBjaGlsZC50YWdUeXBlID09PSAxIC8qIEVsZW1lbnRUeXBlcy5DT01QT05FTlQgKi87XG4gICAgICAgICAgICBpZiAoaXNDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnNjb3Blcy52U2xvdCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2FsayhjaGlsZCwgY29udGV4dCk7XG4gICAgICAgICAgICBpZiAoaXNDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnNjb3Blcy52U2xvdC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNoaWxkLnR5cGUgPT09IDExIC8qIE5vZGVUeXBlcy5GT1IgKi8pIHtcbiAgICAgICAgICAgIC8vIERvIG5vdCBob2lzdCB2LWZvciBzaW5nbGUgY2hpbGQgYmVjYXVzZSBpdCBoYXMgdG8gYmUgYSBibG9ja1xuICAgICAgICAgICAgd2FsayhjaGlsZCwgY29udGV4dCwgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID09PSAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaGlsZC50eXBlID09PSA5IC8qIE5vZGVUeXBlcy5JRiAqLykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZC5icmFuY2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBob2lzdCB2LWlmIHNpbmdsZSBjaGlsZCBiZWNhdXNlIGl0IGhhcyB0byBiZSBhIGJsb2NrXG4gICAgICAgICAgICAgICAgd2FsayhjaGlsZC5icmFuY2hlc1tpXSwgY29udGV4dCwgY2hpbGQuYnJhbmNoZXNbaV0uY2hpbGRyZW4ubGVuZ3RoID09PSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaG9pc3RlZENvdW50ICYmIGNvbnRleHQudHJhbnNmb3JtSG9pc3QpIHtcbiAgICAgICAgY29udGV4dC50cmFuc2Zvcm1Ib2lzdChjaGlsZHJlbiwgY29udGV4dCwgbm9kZSk7XG4gICAgfVxuICAgIC8vIGFsbCBjaGlsZHJlbiB3ZXJlIGhvaXN0ZWQgLSB0aGUgZW50aXJlIGNoaWxkcmVuIGFycmF5IGlzIGhvaXN0YWJsZS5cbiAgICBpZiAoaG9pc3RlZENvdW50ICYmXG4gICAgICAgIGhvaXN0ZWRDb3VudCA9PT0gb3JpZ2luYWxDb3VudCAmJlxuICAgICAgICBub2RlLnR5cGUgPT09IDEgLyogTm9kZVR5cGVzLkVMRU1FTlQgKi8gJiZcbiAgICAgICAgbm9kZS50YWdUeXBlID09PSAwIC8qIEVsZW1lbnRUeXBlcy5FTEVNRU5UICovICYmXG4gICAgICAgIG5vZGUuY29kZWdlbk5vZGUgJiZcbiAgICAgICAgbm9kZS5jb2RlZ2VuTm9kZS50eXBlID09PSAxMyAvKiBOb2RlVHlwZXMuVk5PREVfQ0FMTCAqLyAmJlxuICAgICAgICBpc0FycmF5KG5vZGUuY29kZWdlbk5vZGUuY2hpbGRyZW4pKSB7XG4gICAgICAgIG5vZGUuY29kZWdlbk5vZGUuY2hpbGRyZW4gPSBjb250ZXh0LmhvaXN0KGNyZWF0ZUFycmF5RXhwcmVzc2lvbihub2RlLmNvZGVnZW5Ob2RlLmNoaWxkcmVuKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0Q29uc3RhbnRUeXBlKG5vZGUsIGNvbnRleHQpIHtcbiAgICBjb25zdCB7IGNvbnN0YW50Q2FjaGUgfSA9IGNvbnRleHQ7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAxIC8qIE5vZGVUeXBlcy5FTEVNRU5UICovOlxuICAgICAgICAgICAgaWYgKG5vZGUudGFnVHlwZSAhPT0gMCAvKiBFbGVtZW50VHlwZXMuRUxFTUVOVCAqLykge1xuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIENvbnN0YW50VHlwZXMuTk9UX0NPTlNUQU5UICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2FjaGVkID0gY29uc3RhbnRDYWNoZS5nZXQobm9kZSk7XG4gICAgICAgICAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY29kZWdlbk5vZGUgPSBub2RlLmNvZGVnZW5Ob2RlO1xuICAgICAgICAgICAgaWYgKGNvZGVnZW5Ob2RlLnR5cGUgIT09IDEzIC8qIE5vZGVUeXBlcy5WTk9ERV9DQUxMICovKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogQ29uc3RhbnRUeXBlcy5OT1RfQ09OU1RBTlQgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29kZWdlbk5vZGUuaXNCbG9jayAmJlxuICAgICAgICAgICAgICAgIG5vZGUudGFnICE9PSAnc3ZnJyAmJlxuICAgICAgICAgICAgICAgIG5vZGUudGFnICE9PSAnZm9yZWlnbk9iamVjdCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBDb25zdGFudFR5cGVzLk5PVF9DT05TVEFOVCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZsYWcgPSBnZXRQYXRjaEZsYWcoY29kZWdlbk5vZGUpO1xuICAgICAgICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldHVyblR5cGUgPSAzIC8qIENvbnN0YW50VHlwZXMuQ0FOX1NUUklOR0lGWSAqLztcbiAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGl0c2VsZiBoYXMgbm8gcGF0Y2ggZmxhZy4gSG93ZXZlciB3ZSBzdGlsbCBuZWVkIHRvIGNoZWNrOlxuICAgICAgICAgICAgICAgIC8vIDEuIEV2ZW4gZm9yIGEgbm9kZSB3aXRoIG5vIHBhdGNoIGZsYWcsIGl0IGlzIHBvc3NpYmxlIGZvciBpdCB0byBjb250YWluXG4gICAgICAgICAgICAgICAgLy8gbm9uLWhvaXN0YWJsZSBleHByZXNzaW9ucyB0aGF0IHJlZmVycyB0byBzY29wZSB2YXJpYWJsZXMsIGUuZy4gY29tcGlsZXJcbiAgICAgICAgICAgICAgICAvLyBpbmplY3RlZCBrZXlzIG9yIGNhY2hlZCBldmVudCBoYW5kbGVycy4gVGhlcmVmb3JlIHdlIG5lZWQgdG8gYWx3YXlzXG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGNvZGVnZW5Ob2RlJ3MgcHJvcHMgdG8gYmUgc3VyZS5cbiAgICAgICAgICAgICAgICBjb25zdCBnZW5lcmF0ZWRQcm9wc1R5cGUgPSBnZXRHZW5lcmF0ZWRQcm9wc0NvbnN0YW50VHlwZShub2RlLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoZ2VuZXJhdGVkUHJvcHNUeXBlID09PSAwIC8qIENvbnN0YW50VHlwZXMuTk9UX0NPTlNUQU5UICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0YW50Q2FjaGUuc2V0KG5vZGUsIDAgLyogQ29uc3RhbnRUeXBlcy5OT1RfQ09OU1RBTlQgKi8pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBDb25zdGFudFR5cGVzLk5PVF9DT05TVEFOVCAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGdlbmVyYXRlZFByb3BzVHlwZSA8IHJldHVyblR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IGdlbmVyYXRlZFByb3BzVHlwZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gMi4gaXRzIGNoaWxkcmVuLlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFR5cGUgPSBnZXRDb25zdGFudFR5cGUobm9kZS5jaGlsZHJlbltpXSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZFR5cGUgPT09IDAgLyogQ29uc3RhbnRUeXBlcy5OT1RfQ09OU1RBTlQgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50Q2FjaGUuc2V0KG5vZGUsIDAgLyogQ29uc3RhbnRUeXBlcy5OT1RfQ09OU1RBTlQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogQ29uc3RhbnRUeXBlcy5OT1RfQ09OU1RBTlQgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkVHlwZSA8IHJldHVyblR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBjaGlsZFR5cGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gMy4gaWYgdGhlIHR5cGUgaXMgbm90IGFscmVhZHkgQ0FOX1NLSVBfUEFUQ0ggd2hpY2ggaXMgdGhlIGxvd2VzdCBub24tMFxuICAgICAgICAgICAgICAgIC8vIHR5cGUsIGNoZWNrIGlmIGFueSBvZiB0aGUgcHJvcHMgY2FuIGNhdXNlIHRoZSB0eXBlIHRvIGJlIGxvd2VyZWRcbiAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gc2tpcCBjYW5fcGF0Y2ggYmVjYXVzZSBpdCdzIGd1YXJhbnRlZWQgYnkgdGhlIGFic2VuY2Ugb2YgYVxuICAgICAgICAgICAgICAgIC8vIHBhdGNoRmxhZy5cbiAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZSA+IDEgLyogQ29uc3RhbnRUeXBlcy5DQU5fU0tJUF9QQVRDSCAqLykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUucHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBub2RlLnByb3BzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAudHlwZSA9PT0gNyAvKiBOb2RlVHlwZXMuRElSRUNUSVZFICovICYmIHAubmFtZSA9PT0gJ2JpbmQnICYmIHAuZXhwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwVHlwZSA9IGdldENvbnN0YW50VHlwZShwLmV4cCwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cFR5cGUgPT09IDAgLyogQ29uc3RhbnRUeXBlcy5OT1RfQ09OU1RBTlQgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRDYWNoZS5zZXQobm9kZSwgMCAvKiBDb25zdGFudFR5cGVzLk5PVF9DT05TVEFOVCAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIENvbnN0YW50VHlwZXMuTk9UX0NPTlNUQU5UICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwVHlwZSA8IHJldHVyblR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IGV4cFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG9ubHkgc3ZnL2ZvcmVpZ25PYmplY3QgY291bGQgYmUgYmxvY2sgaGVyZSwgaG93ZXZlciBpZiB0aGV5IGFyZVxuICAgICAgICAgICAgICAgIC8vIHN0YXRpYyB0aGVuIHRoZXkgZG9uJ3QgbmVlZCB0byBiZSBibG9ja3Mgc2luY2UgdGhlcmUgd2lsbCBiZSBub1xuICAgICAgICAgICAgICAgIC8vIG5lc3RlZCB1cGRhdGVzLlxuICAgICAgICAgICAgICAgIGlmIChjb2RlZ2VuTm9kZS5pc0Jsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdCBzZXQgY3VzdG9tIGRpcmVjdGl2ZXMuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5wcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IG5vZGUucHJvcHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocC50eXBlID09PSA3IC8qIE5vZGVUeXBlcy5ESVJFQ1RJVkUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudENhY2hlLnNldChub2RlLCAwIC8qIENvbnN0YW50VHlwZXMuTk9UX0NPTlNUQU5UICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBDb25zdGFudFR5cGVzLk5PVF9DT05TVEFOVCAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUhlbHBlcihPUEVOX0JMT0NLKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZW1vdmVIZWxwZXIoZ2V0Vk5vZGVCbG9ja0hlbHBlcihjb250ZXh0LmluU1NSLCBjb2RlZ2VuTm9kZS5pc0NvbXBvbmVudCkpO1xuICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuTm9kZS5pc0Jsb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuaGVscGVyKGdldFZOb2RlSGVscGVyKGNvbnRleHQuaW5TU1IsIGNvZGVnZW5Ob2RlLmlzQ29tcG9uZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0YW50Q2FjaGUuc2V0KG5vZGUsIHJldHVyblR5cGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5UeXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3RhbnRDYWNoZS5zZXQobm9kZSwgMCAvKiBDb25zdGFudFR5cGVzLk5PVF9DT05TVEFOVCAqLyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogQ29uc3RhbnRUeXBlcy5OT1RfQ09OU1RBTlQgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgMiAvKiBOb2RlVHlwZXMuVEVYVCAqLzpcbiAgICAgICAgY2FzZSAzIC8qIE5vZGVUeXBlcy5DT01NRU5UICovOlxuICAgICAgICAgICAgcmV0dXJuIDMgLyogQ29uc3RhbnRUeXBlcy5DQU5fU1RSSU5HSUZZICovO1xuICAgICAgICBjYXNlIDkgLyogTm9kZVR5cGVzLklGICovOlxuICAgICAgICBjYXNlIDExIC8qIE5vZGVUeXBlcy5GT1IgKi86XG4gICAgICAgIGNhc2UgMTAgLyogTm9kZVR5cGVzLklGX0JSQU5DSCAqLzpcbiAgICAgICAgICAgIHJldHVybiAwIC8qIENvbnN0YW50VHlwZXMuTk9UX0NPTlNUQU5UICovO1xuICAgICAgICBjYXNlIDUgLyogTm9kZVR5cGVzLklOVEVSUE9MQVRJT04gKi86XG4gICAgICAgIGNhc2UgMTIgLyogTm9kZVR5cGVzLlRFWFRfQ0FMTCAqLzpcbiAgICAgICAgICAgIHJldHVybiBnZXRDb25zdGFudFR5cGUobm9kZS5jb250ZW50LCBjb250ZXh0KTtcbiAgICAgICAgY2FzZSA0IC8qIE5vZGVUeXBlcy5TSU1QTEVfRVhQUkVTU0lPTiAqLzpcbiAgICAgICAgICAgIHJldHVybiBub2RlLmNvbnN0VHlwZTtcbiAgICAgICAgY2FzZSA4IC8qIE5vZGVUeXBlcy5DT01QT1VORF9FWFBSRVNTSU9OICovOlxuICAgICAgICAgICAgbGV0IHJldHVyblR5cGUgPSAzIC8qIENvbnN0YW50VHlwZXMuQ0FOX1NUUklOR0lGWSAqLztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNTdHJpbmcoY2hpbGQpIHx8IGlzU3ltYm9sKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRUeXBlID0gZ2V0Q29uc3RhbnRUeXBlKGNoaWxkLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRUeXBlID09PSAwIC8qIENvbnN0YW50VHlwZXMuTk9UX0NPTlNUQU5UICovKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIENvbnN0YW50VHlwZXMuTk9UX0NPTlNUQU5UICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGlsZFR5cGUgPCByZXR1cm5UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBjaGlsZFR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblR5cGU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSA7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBDb25zdGFudFR5cGVzLk5PVF9DT05TVEFOVCAqLztcbiAgICB9XG59XG5jb25zdCBhbGxvd0hvaXN0ZWRIZWxwZXJTZXQgPSBuZXcgU2V0KFtcbiAgICBOT1JNQUxJWkVfQ0xBU1MsXG4gICAgTk9STUFMSVpFX1NUWUxFLFxuICAgIE5PUk1BTElaRV9QUk9QUyxcbiAgICBHVUFSRF9SRUFDVElWRV9QUk9QU1xuXSk7XG5mdW5jdGlvbiBnZXRDb25zdGFudFR5cGVPZkhlbHBlckNhbGwodmFsdWUsIGNvbnRleHQpIHtcbiAgICBpZiAodmFsdWUudHlwZSA9PT0gMTQgLyogTm9kZVR5cGVzLkpTX0NBTExfRVhQUkVTU0lPTiAqLyAmJlxuICAgICAgICAhaXNTdHJpbmcodmFsdWUuY2FsbGVlKSAmJlxuICAgICAgICBhbGxvd0hvaXN0ZWRIZWxwZXJTZXQuaGFzKHZhbHVlLmNhbGxlZSkpIHtcbiAgICAgICAgY29uc3QgYXJnID0gdmFsdWUuYXJndW1lbnRzWzBdO1xuICAgICAgICBpZiAoYXJnLnR5cGUgPT09IDQgLyogTm9kZVR5cGVzLlNJTVBMRV9FWFBSRVNTSU9OICovKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29uc3RhbnRUeXBlKGFyZywgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJnLnR5cGUgPT09IDE0IC8qIE5vZGVUeXBlcy5KU19DQUxMX0VYUFJFU1NJT04gKi8pIHtcbiAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIG5lc3RlZCBoZWxwZXIgY2FsbCwgZS5nLiBgbm9ybWFsaXplUHJvcHMoZ3VhcmRSZWFjdGl2ZVByb3BzKGV4cCkpYFxuICAgICAgICAgICAgcmV0dXJuIGdldENvbnN0YW50VHlwZU9mSGVscGVyQ2FsbChhcmcsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwIC8qIENvbnN0YW50VHlwZXMuTk9UX0NPTlNUQU5UICovO1xufVxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkUHJvcHNDb25zdGFudFR5cGUobm9kZSwgY29udGV4dCkge1xuICAgIGxldCByZXR1cm5UeXBlID0gMyAvKiBDb25zdGFudFR5cGVzLkNBTl9TVFJJTkdJRlkgKi87XG4gICAgY29uc3QgcHJvcHMgPSBnZXROb2RlUHJvcHMobm9kZSk7XG4gICAgaWYgKHByb3BzICYmIHByb3BzLnR5cGUgPT09IDE1IC8qIE5vZGVUeXBlcy5KU19PQkpFQ1RfRVhQUkVTU0lPTiAqLykge1xuICAgICAgICBjb25zdCB7IHByb3BlcnRpZXMgfSA9IHByb3BzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2V5LCB2YWx1ZSB9ID0gcHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGtleVR5cGUgPSBnZXRDb25zdGFudFR5cGUoa2V5LCBjb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChrZXlUeXBlID09PSAwIC8qIENvbnN0YW50VHlwZXMuTk9UX0NPTlNUQU5UICovKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleVR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoa2V5VHlwZSA8IHJldHVyblR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0ga2V5VHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB2YWx1ZVR5cGU7XG4gICAgICAgICAgICBpZiAodmFsdWUudHlwZSA9PT0gNCAvKiBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT04gKi8pIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVR5cGUgPSBnZXRDb25zdGFudFR5cGUodmFsdWUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gMTQgLyogTm9kZVR5cGVzLkpTX0NBTExfRVhQUkVTU0lPTiAqLykge1xuICAgICAgICAgICAgICAgIC8vIHNvbWUgaGVscGVyIGNhbGxzIGNhbiBiZSBob2lzdGVkLFxuICAgICAgICAgICAgICAgIC8vIHN1Y2ggYXMgdGhlIGBub3JtYWxpemVQcm9wc2AgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBmb3IgcHJlLW5vcm1hbGl6ZSBjbGFzcyxcbiAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byByZXNwZWN0IHRoZSBDb25zdGFudFR5cGUgb2YgdGhlIGhlbHBlcidzIGFyZ3VtZW50c1xuICAgICAgICAgICAgICAgIHZhbHVlVHlwZSA9IGdldENvbnN0YW50VHlwZU9mSGVscGVyQ2FsbCh2YWx1ZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVR5cGUgPSAwIC8qIENvbnN0YW50VHlwZXMuTk9UX0NPTlNUQU5UICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlVHlwZSA9PT0gMCAvKiBDb25zdGFudFR5cGVzLk5PVF9DT05TVEFOVCAqLykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWVUeXBlIDwgcmV0dXJuVHlwZSkge1xuICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSB2YWx1ZVR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVyblR5cGU7XG59XG5mdW5jdGlvbiBnZXROb2RlUHJvcHMobm9kZSkge1xuICAgIGNvbnN0IGNvZGVnZW5Ob2RlID0gbm9kZS5jb2RlZ2VuTm9kZTtcbiAgICBpZiAoY29kZWdlbk5vZGUudHlwZSA9PT0gMTMgLyogTm9kZVR5cGVzLlZOT0RFX0NBTEwgKi8pIHtcbiAgICAgICAgcmV0dXJuIGNvZGVnZW5Ob2RlLnByb3BzO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFBhdGNoRmxhZyhub2RlKSB7XG4gICAgY29uc3QgZmxhZyA9IG5vZGUucGF0Y2hGbGFnO1xuICAgIHJldHVybiBmbGFnID8gcGFyc2VJbnQoZmxhZywgMTApIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUcmFuc2Zvcm1Db250ZXh0KHJvb3QsIHsgZmlsZW5hbWUgPSAnJywgcHJlZml4SWRlbnRpZmllcnMgPSBmYWxzZSwgaG9pc3RTdGF0aWMgPSBmYWxzZSwgY2FjaGVIYW5kbGVycyA9IGZhbHNlLCBub2RlVHJhbnNmb3JtcyA9IFtdLCBkaXJlY3RpdmVUcmFuc2Zvcm1zID0ge30sIHRyYW5zZm9ybUhvaXN0ID0gbnVsbCwgaXNCdWlsdEluQ29tcG9uZW50ID0gTk9PUCwgaXNDdXN0b21FbGVtZW50ID0gTk9PUCwgZXhwcmVzc2lvblBsdWdpbnMgPSBbXSwgc2NvcGVJZCA9IG51bGwsIHNsb3R0ZWQgPSB0cnVlLCBzc3IgPSBmYWxzZSwgaW5TU1IgPSBmYWxzZSwgc3NyQ3NzVmFycyA9IGBgLCBiaW5kaW5nTWV0YWRhdGEgPSBFTVBUWV9PQkosIGlubGluZSA9IGZhbHNlLCBpc1RTID0gZmFsc2UsIG9uRXJyb3IgPSBkZWZhdWx0T25FcnJvciwgb25XYXJuID0gZGVmYXVsdE9uV2FybiwgY29tcGF0Q29uZmlnIH0pIHtcbiAgICBjb25zdCBuYW1lTWF0Y2ggPSBmaWxlbmFtZS5yZXBsYWNlKC9cXD8uKiQvLCAnJykubWF0Y2goLyhbXi9cXFxcXSspXFwuXFx3KyQvKTtcbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICAvLyBvcHRpb25zXG4gICAgICAgIHNlbGZOYW1lOiBuYW1lTWF0Y2ggJiYgY2FwaXRhbGl6ZShjYW1lbGl6ZSQxKG5hbWVNYXRjaFsxXSkpLFxuICAgICAgICBwcmVmaXhJZGVudGlmaWVycyxcbiAgICAgICAgaG9pc3RTdGF0aWMsXG4gICAgICAgIGNhY2hlSGFuZGxlcnMsXG4gICAgICAgIG5vZGVUcmFuc2Zvcm1zLFxuICAgICAgICBkaXJlY3RpdmVUcmFuc2Zvcm1zLFxuICAgICAgICB0cmFuc2Zvcm1Ib2lzdCxcbiAgICAgICAgaXNCdWlsdEluQ29tcG9uZW50LFxuICAgICAgICBpc0N1c3RvbUVsZW1lbnQsXG4gICAgICAgIGV4cHJlc3Npb25QbHVnaW5zLFxuICAgICAgICBzY29wZUlkLFxuICAgICAgICBzbG90dGVkLFxuICAgICAgICBzc3IsXG4gICAgICAgIGluU1NSLFxuICAgICAgICBzc3JDc3NWYXJzLFxuICAgICAgICBiaW5kaW5nTWV0YWRhdGEsXG4gICAgICAgIGlubGluZSxcbiAgICAgICAgaXNUUyxcbiAgICAgICAgb25FcnJvcixcbiAgICAgICAgb25XYXJuLFxuICAgICAgICBjb21wYXRDb25maWcsXG4gICAgICAgIC8vIHN0YXRlXG4gICAgICAgIHJvb3QsXG4gICAgICAgIGhlbHBlcnM6IG5ldyBNYXAoKSxcbiAgICAgICAgY29tcG9uZW50czogbmV3IFNldCgpLFxuICAgICAgICBkaXJlY3RpdmVzOiBuZXcgU2V0KCksXG4gICAgICAgIGhvaXN0czogW10sXG4gICAgICAgIGltcG9ydHM6IFtdLFxuICAgICAgICBjb25zdGFudENhY2hlOiBuZXcgTWFwKCksXG4gICAgICAgIHRlbXBzOiAwLFxuICAgICAgICBjYWNoZWQ6IDAsXG4gICAgICAgIGlkZW50aWZpZXJzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICBzY29wZXM6IHtcbiAgICAgICAgICAgIHZGb3I6IDAsXG4gICAgICAgICAgICB2U2xvdDogMCxcbiAgICAgICAgICAgIHZQcmU6IDAsXG4gICAgICAgICAgICB2T25jZTogMFxuICAgICAgICB9LFxuICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgIGN1cnJlbnROb2RlOiByb290LFxuICAgICAgICBjaGlsZEluZGV4OiAwLFxuICAgICAgICBpblZPbmNlOiBmYWxzZSxcbiAgICAgICAgLy8gbWV0aG9kc1xuICAgICAgICBoZWxwZXIobmFtZSkge1xuICAgICAgICAgICAgY29uc3QgY291bnQgPSBjb250ZXh0LmhlbHBlcnMuZ2V0KG5hbWUpIHx8IDA7XG4gICAgICAgICAgICBjb250ZXh0LmhlbHBlcnMuc2V0KG5hbWUsIGNvdW50ICsgMSk7XG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVtb3ZlSGVscGVyKG5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gY29udGV4dC5oZWxwZXJzLmdldChuYW1lKTtcbiAgICAgICAgICAgIGlmIChjb3VudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb3VudCA9IGNvdW50IC0gMTtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmhlbHBlcnMuZGVsZXRlKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5oZWxwZXJzLnNldChuYW1lLCBjdXJyZW50Q291bnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaGVscGVyU3RyaW5nKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBgXyR7aGVscGVyTmFtZU1hcFtjb250ZXh0LmhlbHBlcihuYW1lKV19YDtcbiAgICAgICAgfSxcbiAgICAgICAgcmVwbGFjZU5vZGUobm9kZSkge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0LmN1cnJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBiZWluZyByZXBsYWNlZCBpcyBhbHJlYWR5IHJlbW92ZWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY29udGV4dC5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVwbGFjZSByb290IG5vZGUuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGV4dC5wYXJlbnQuY2hpbGRyZW5bY29udGV4dC5jaGlsZEluZGV4XSA9IGNvbnRleHQuY3VycmVudE5vZGUgPSBub2RlO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmVOb2RlKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIWNvbnRleHQucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVtb3ZlIHJvb3Qgbm9kZS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxpc3QgPSBjb250ZXh0LnBhcmVudC5jaGlsZHJlbjtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92YWxJbmRleCA9IG5vZGVcbiAgICAgICAgICAgICAgICA/IGxpc3QuaW5kZXhPZihub2RlKVxuICAgICAgICAgICAgICAgIDogY29udGV4dC5jdXJyZW50Tm9kZVxuICAgICAgICAgICAgICAgICAgICA/IGNvbnRleHQuY2hpbGRJbmRleFxuICAgICAgICAgICAgICAgICAgICA6IC0xO1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIHJlbW92YWxJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vZGUgYmVpbmcgcmVtb3ZlZCBpcyBub3QgYSBjaGlsZCBvZiBjdXJyZW50IHBhcmVudGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUgPT09IGNvbnRleHQuY3VycmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50IG5vZGUgcmVtb3ZlZFxuICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnRleHQub25Ob2RlUmVtb3ZlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gc2libGluZyBub2RlIHJlbW92ZWRcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5jaGlsZEluZGV4ID4gcmVtb3ZhbEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY2hpbGRJbmRleC0tO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm9uTm9kZVJlbW92ZWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZXh0LnBhcmVudC5jaGlsZHJlbi5zcGxpY2UocmVtb3ZhbEluZGV4LCAxKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob2RlUmVtb3ZlZDogKCkgPT4geyB9LFxuICAgICAgICBhZGRJZGVudGlmaWVycyhleHApIHtcbiAgICAgICAgfSxcbiAgICAgICAgcmVtb3ZlSWRlbnRpZmllcnMoZXhwKSB7XG4gICAgICAgIH0sXG4gICAgICAgIGhvaXN0KGV4cCkge1xuICAgICAgICAgICAgaWYgKGlzU3RyaW5nKGV4cCkpXG4gICAgICAgICAgICAgICAgZXhwID0gY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihleHApO1xuICAgICAgICAgICAgY29udGV4dC5ob2lzdHMucHVzaChleHApO1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYF9ob2lzdGVkXyR7Y29udGV4dC5ob2lzdHMubGVuZ3RofWAsIGZhbHNlLCBleHAubG9jLCAyIC8qIENvbnN0YW50VHlwZXMuQ0FOX0hPSVNUICovKTtcbiAgICAgICAgICAgIGlkZW50aWZpZXIuaG9pc3RlZCA9IGV4cDtcbiAgICAgICAgICAgIHJldHVybiBpZGVudGlmaWVyO1xuICAgICAgICB9LFxuICAgICAgICBjYWNoZShleHAsIGlzVk5vZGUgPSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNhY2hlRXhwcmVzc2lvbihjb250ZXh0LmNhY2hlZCsrLCBleHAsIGlzVk5vZGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB7XG4gICAgICAgIGNvbnRleHQuZmlsdGVycyA9IG5ldyBTZXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG5mdW5jdGlvbiB0cmFuc2Zvcm0ocm9vdCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGNvbnRleHQgPSBjcmVhdGVUcmFuc2Zvcm1Db250ZXh0KHJvb3QsIG9wdGlvbnMpO1xuICAgIHRyYXZlcnNlTm9kZShyb290LCBjb250ZXh0KTtcbiAgICBpZiAob3B0aW9ucy5ob2lzdFN0YXRpYykge1xuICAgICAgICBob2lzdFN0YXRpYyhyb290LCBjb250ZXh0KTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLnNzcikge1xuICAgICAgICBjcmVhdGVSb290Q29kZWdlbihyb290LCBjb250ZXh0KTtcbiAgICB9XG4gICAgLy8gZmluYWxpemUgbWV0YSBpbmZvcm1hdGlvblxuICAgIHJvb3QuaGVscGVycyA9IG5ldyBTZXQoWy4uLmNvbnRleHQuaGVscGVycy5rZXlzKCldKTtcbiAgICByb290LmNvbXBvbmVudHMgPSBbLi4uY29udGV4dC5jb21wb25lbnRzXTtcbiAgICByb290LmRpcmVjdGl2ZXMgPSBbLi4uY29udGV4dC5kaXJlY3RpdmVzXTtcbiAgICByb290LmltcG9ydHMgPSBjb250ZXh0LmltcG9ydHM7XG4gICAgcm9vdC5ob2lzdHMgPSBjb250ZXh0LmhvaXN0cztcbiAgICByb290LnRlbXBzID0gY29udGV4dC50ZW1wcztcbiAgICByb290LmNhY2hlZCA9IGNvbnRleHQuY2FjaGVkO1xuICAgIHtcbiAgICAgICAgcm9vdC5maWx0ZXJzID0gWy4uLmNvbnRleHQuZmlsdGVyc107XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlUm9vdENvZGVnZW4ocm9vdCwgY29udGV4dCkge1xuICAgIGNvbnN0IHsgaGVscGVyIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IHsgY2hpbGRyZW4gfSA9IHJvb3Q7XG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuWzBdO1xuICAgICAgICAvLyBpZiB0aGUgc2luZ2xlIGNoaWxkIGlzIGFuIGVsZW1lbnQsIHR1cm4gaXQgaW50byBhIGJsb2NrLlxuICAgICAgICBpZiAoaXNTaW5nbGVFbGVtZW50Um9vdChyb290LCBjaGlsZCkgJiYgY2hpbGQuY29kZWdlbk5vZGUpIHtcbiAgICAgICAgICAgIC8vIHNpbmdsZSBlbGVtZW50IHJvb3QgaXMgbmV2ZXIgaG9pc3RlZCBzbyBjb2RlZ2VuTm9kZSB3aWxsIG5ldmVyIGJlXG4gICAgICAgICAgICAvLyBTaW1wbGVFeHByZXNzaW9uTm9kZVxuICAgICAgICAgICAgY29uc3QgY29kZWdlbk5vZGUgPSBjaGlsZC5jb2RlZ2VuTm9kZTtcbiAgICAgICAgICAgIGlmIChjb2RlZ2VuTm9kZS50eXBlID09PSAxMyAvKiBOb2RlVHlwZXMuVk5PREVfQ0FMTCAqLykge1xuICAgICAgICAgICAgICAgIG1ha2VCbG9jayhjb2RlZ2VuTm9kZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb290LmNvZGVnZW5Ob2RlID0gY29kZWdlbk5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyAtIHNpbmdsZSA8c2xvdC8+LCBJZk5vZGUsIEZvck5vZGU6IGFscmVhZHkgYmxvY2tzLlxuICAgICAgICAgICAgLy8gLSBzaW5nbGUgdGV4dCBub2RlOiBhbHdheXMgcGF0Y2hlZC5cbiAgICAgICAgICAgIC8vIHJvb3QgY29kZWdlbiBmYWxscyB0aHJvdWdoIHZpYSBnZW5Ob2RlKClcbiAgICAgICAgICAgIHJvb3QuY29kZWdlbk5vZGUgPSBjaGlsZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIHJvb3QgaGFzIG11bHRpcGxlIG5vZGVzIC0gcmV0dXJuIGEgZnJhZ21lbnQgYmxvY2suXG4gICAgICAgIGxldCBwYXRjaEZsYWcgPSA2NCAvKiBQYXRjaEZsYWdzLlNUQUJMRV9GUkFHTUVOVCAqLztcbiAgICAgICAgbGV0IHBhdGNoRmxhZ1RleHQgPSBQYXRjaEZsYWdOYW1lc1s2NCAvKiBQYXRjaEZsYWdzLlNUQUJMRV9GUkFHTUVOVCAqL107XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBmcmFnbWVudCBhY3R1YWxseSBjb250YWlucyBhIHNpbmdsZSB2YWxpZCBjaGlsZCB3aXRoXG4gICAgICAgIC8vIHRoZSByZXN0IGJlaW5nIGNvbW1lbnRzXG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiZcbiAgICAgICAgICAgIGNoaWxkcmVuLmZpbHRlcihjID0+IGMudHlwZSAhPT0gMyAvKiBOb2RlVHlwZXMuQ09NTUVOVCAqLykubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBwYXRjaEZsYWcgfD0gMjA0OCAvKiBQYXRjaEZsYWdzLkRFVl9ST09UX0ZSQUdNRU5UICovO1xuICAgICAgICAgICAgcGF0Y2hGbGFnVGV4dCArPSBgLCAke1BhdGNoRmxhZ05hbWVzWzIwNDggLyogUGF0Y2hGbGFncy5ERVZfUk9PVF9GUkFHTUVOVCAqL119YDtcbiAgICAgICAgfVxuICAgICAgICByb290LmNvZGVnZW5Ob2RlID0gY3JlYXRlVk5vZGVDYWxsKGNvbnRleHQsIGhlbHBlcihGUkFHTUVOVCksIHVuZGVmaW5lZCwgcm9vdC5jaGlsZHJlbiwgcGF0Y2hGbGFnICsgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGAgLyogJHtwYXRjaEZsYWdUZXh0fSAqL2AgOiBgYCksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlLCB1bmRlZmluZWQsIGZhbHNlIC8qIGlzQ29tcG9uZW50ICovKTtcbiAgICB9XG4gICAgZWxzZSA7XG59XG5mdW5jdGlvbiB0cmF2ZXJzZUNoaWxkcmVuKHBhcmVudCwgY29udGV4dCkge1xuICAgIGxldCBpID0gMDtcbiAgICBjb25zdCBub2RlUmVtb3ZlZCA9ICgpID0+IHtcbiAgICAgICAgaS0tO1xuICAgIH07XG4gICAgZm9yICg7IGkgPCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBwYXJlbnQuY2hpbGRyZW5baV07XG4gICAgICAgIGlmIChpc1N0cmluZyhjaGlsZCkpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29udGV4dC5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIGNvbnRleHQuY2hpbGRJbmRleCA9IGk7XG4gICAgICAgIGNvbnRleHQub25Ob2RlUmVtb3ZlZCA9IG5vZGVSZW1vdmVkO1xuICAgICAgICB0cmF2ZXJzZU5vZGUoY2hpbGQsIGNvbnRleHQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRyYXZlcnNlTm9kZShub2RlLCBjb250ZXh0KSB7XG4gICAgY29udGV4dC5jdXJyZW50Tm9kZSA9IG5vZGU7XG4gICAgLy8gYXBwbHkgdHJhbnNmb3JtIHBsdWdpbnNcbiAgICBjb25zdCB7IG5vZGVUcmFuc2Zvcm1zIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGV4aXRGbnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVUcmFuc2Zvcm1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG9uRXhpdCA9IG5vZGVUcmFuc2Zvcm1zW2ldKG5vZGUsIGNvbnRleHQpO1xuICAgICAgICBpZiAob25FeGl0KSB7XG4gICAgICAgICAgICBpZiAoaXNBcnJheShvbkV4aXQpKSB7XG4gICAgICAgICAgICAgICAgZXhpdEZucy5wdXNoKC4uLm9uRXhpdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBleGl0Rm5zLnB1c2gob25FeGl0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbnRleHQuY3VycmVudE5vZGUpIHtcbiAgICAgICAgICAgIC8vIG5vZGUgd2FzIHJlbW92ZWRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vZGUgbWF5IGhhdmUgYmVlbiByZXBsYWNlZFxuICAgICAgICAgICAgbm9kZSA9IGNvbnRleHQuY3VycmVudE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAzIC8qIE5vZGVUeXBlcy5DT01NRU5UICovOlxuICAgICAgICAgICAgaWYgKCFjb250ZXh0LnNzcikge1xuICAgICAgICAgICAgICAgIC8vIGluamVjdCBpbXBvcnQgZm9yIHRoZSBDb21tZW50IHN5bWJvbCwgd2hpY2ggaXMgbmVlZGVkIGZvciBjcmVhdGluZ1xuICAgICAgICAgICAgICAgIC8vIGNvbW1lbnQgbm9kZXMgd2l0aCBgY3JlYXRlVk5vZGVgXG4gICAgICAgICAgICAgICAgY29udGV4dC5oZWxwZXIoQ1JFQVRFX0NPTU1FTlQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNSAvKiBOb2RlVHlwZXMuSU5URVJQT0xBVElPTiAqLzpcbiAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gdHJhdmVyc2UsIGJ1dCB3ZSBuZWVkIHRvIGluamVjdCB0b1N0cmluZyBoZWxwZXJcbiAgICAgICAgICAgIGlmICghY29udGV4dC5zc3IpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmhlbHBlcihUT19ESVNQTEFZX1NUUklORyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gZm9yIGNvbnRhaW5lciB0eXBlcywgZnVydGhlciB0cmF2ZXJzZSBkb3dud2FyZHNcbiAgICAgICAgY2FzZSA5IC8qIE5vZGVUeXBlcy5JRiAqLzpcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5icmFuY2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRyYXZlcnNlTm9kZShub2RlLmJyYW5jaGVzW2ldLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwIC8qIE5vZGVUeXBlcy5JRl9CUkFOQ0ggKi86XG4gICAgICAgIGNhc2UgMTEgLyogTm9kZVR5cGVzLkZPUiAqLzpcbiAgICAgICAgY2FzZSAxIC8qIE5vZGVUeXBlcy5FTEVNRU5UICovOlxuICAgICAgICBjYXNlIDAgLyogTm9kZVR5cGVzLlJPT1QgKi86XG4gICAgICAgICAgICB0cmF2ZXJzZUNoaWxkcmVuKG5vZGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIGV4aXQgdHJhbnNmb3Jtc1xuICAgIGNvbnRleHQuY3VycmVudE5vZGUgPSBub2RlO1xuICAgIGxldCBpID0gZXhpdEZucy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICBleGl0Rm5zW2ldKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlU3RydWN0dXJhbERpcmVjdGl2ZVRyYW5zZm9ybShuYW1lLCBmbikge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBpc1N0cmluZyhuYW1lKVxuICAgICAgICA/IChuKSA9PiBuID09PSBuYW1lXG4gICAgICAgIDogKG4pID0+IG5hbWUudGVzdChuKTtcbiAgICByZXR1cm4gKG5vZGUsIGNvbnRleHQpID0+IHtcbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gMSAvKiBOb2RlVHlwZXMuRUxFTUVOVCAqLykge1xuICAgICAgICAgICAgY29uc3QgeyBwcm9wcyB9ID0gbm9kZTtcbiAgICAgICAgICAgIC8vIHN0cnVjdHVyYWwgZGlyZWN0aXZlIHRyYW5zZm9ybXMgYXJlIG5vdCBjb25jZXJuZWQgd2l0aCBzbG90c1xuICAgICAgICAgICAgLy8gYXMgdGhleSBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5IGluIHZTbG90LnRzXG4gICAgICAgICAgICBpZiAobm9kZS50YWdUeXBlID09PSAzIC8qIEVsZW1lbnRUeXBlcy5URU1QTEFURSAqLyAmJiBwcm9wcy5zb21lKGlzVlNsb3QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXhpdEZucyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3AgPSBwcm9wc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcC50eXBlID09PSA3IC8qIE5vZGVUeXBlcy5ESVJFQ1RJVkUgKi8gJiYgbWF0Y2hlcyhwcm9wLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdHVyYWwgZGlyZWN0aXZlcyBhcmUgcmVtb3ZlZCB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb25cbiAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyB3ZSByZW1vdmUgdGhlbSAqYmVmb3JlKiBhcHBseWluZyBzbyB0aGF0IGl0IGNhbiBmdXJ0aGVyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRyYXZlcnNlIGl0c2VsZiBpbiBjYXNlIGl0IG1vdmVzIHRoZSBub2RlIGFyb3VuZFxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25FeGl0ID0gZm4obm9kZSwgcHJvcCwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvbkV4aXQpXG4gICAgICAgICAgICAgICAgICAgICAgICBleGl0Rm5zLnB1c2gob25FeGl0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXhpdEZucztcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmNvbnN0IFBVUkVfQU5OT1RBVElPTiA9IGAvKiNfX1BVUkVfXyovYDtcbmNvbnN0IGFsaWFzSGVscGVyID0gKHMpID0+IGAke2hlbHBlck5hbWVNYXBbc119OiBfJHtoZWxwZXJOYW1lTWFwW3NdfWA7XG5mdW5jdGlvbiBjcmVhdGVDb2RlZ2VuQ29udGV4dChhc3QsIHsgbW9kZSA9ICdmdW5jdGlvbicsIHByZWZpeElkZW50aWZpZXJzID0gbW9kZSA9PT0gJ21vZHVsZScsIHNvdXJjZU1hcCA9IGZhbHNlLCBmaWxlbmFtZSA9IGB0ZW1wbGF0ZS52dWUuaHRtbGAsIHNjb3BlSWQgPSBudWxsLCBvcHRpbWl6ZUltcG9ydHMgPSBmYWxzZSwgcnVudGltZUdsb2JhbE5hbWUgPSBgVnVlYCwgcnVudGltZU1vZHVsZU5hbWUgPSBgdnVlYCwgc3NyUnVudGltZU1vZHVsZU5hbWUgPSAndnVlL3NlcnZlci1yZW5kZXJlcicsIHNzciA9IGZhbHNlLCBpc1RTID0gZmFsc2UsIGluU1NSID0gZmFsc2UgfSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgIG1vZGUsXG4gICAgICAgIHByZWZpeElkZW50aWZpZXJzLFxuICAgICAgICBzb3VyY2VNYXAsXG4gICAgICAgIGZpbGVuYW1lLFxuICAgICAgICBzY29wZUlkLFxuICAgICAgICBvcHRpbWl6ZUltcG9ydHMsXG4gICAgICAgIHJ1bnRpbWVHbG9iYWxOYW1lLFxuICAgICAgICBydW50aW1lTW9kdWxlTmFtZSxcbiAgICAgICAgc3NyUnVudGltZU1vZHVsZU5hbWUsXG4gICAgICAgIHNzcixcbiAgICAgICAgaXNUUyxcbiAgICAgICAgaW5TU1IsXG4gICAgICAgIHNvdXJjZTogYXN0LmxvYy5zb3VyY2UsXG4gICAgICAgIGNvZGU6IGBgLFxuICAgICAgICBjb2x1bW46IDEsXG4gICAgICAgIGxpbmU6IDEsXG4gICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgaW5kZW50TGV2ZWw6IDAsXG4gICAgICAgIHB1cmU6IGZhbHNlLFxuICAgICAgICBtYXA6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVscGVyKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGBfJHtoZWxwZXJOYW1lTWFwW2tleV19YDtcbiAgICAgICAgfSxcbiAgICAgICAgcHVzaChjb2RlLCBub2RlKSB7XG4gICAgICAgICAgICBjb250ZXh0LmNvZGUgKz0gY29kZTtcbiAgICAgICAgfSxcbiAgICAgICAgaW5kZW50KCkge1xuICAgICAgICAgICAgbmV3bGluZSgrK2NvbnRleHQuaW5kZW50TGV2ZWwpO1xuICAgICAgICB9LFxuICAgICAgICBkZWluZGVudCh3aXRob3V0TmV3TGluZSA9IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAod2l0aG91dE5ld0xpbmUpIHtcbiAgICAgICAgICAgICAgICAtLWNvbnRleHQuaW5kZW50TGV2ZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdsaW5lKC0tY29udGV4dC5pbmRlbnRMZXZlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG5ld2xpbmUoKSB7XG4gICAgICAgICAgICBuZXdsaW5lKGNvbnRleHQuaW5kZW50TGV2ZWwpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBmdW5jdGlvbiBuZXdsaW5lKG4pIHtcbiAgICAgICAgY29udGV4dC5wdXNoKCdcXG4nICsgYCAgYC5yZXBlYXQobikpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbn1cbmZ1bmN0aW9uIGdlbmVyYXRlKGFzdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgY29udGV4dCA9IGNyZWF0ZUNvZGVnZW5Db250ZXh0KGFzdCwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMub25Db250ZXh0Q3JlYXRlZClcbiAgICAgICAgb3B0aW9ucy5vbkNvbnRleHRDcmVhdGVkKGNvbnRleHQpO1xuICAgIGNvbnN0IHsgbW9kZSwgcHVzaCwgcHJlZml4SWRlbnRpZmllcnMsIGluZGVudCwgZGVpbmRlbnQsIG5ld2xpbmUsIHNjb3BlSWQsIHNzciB9ID0gY29udGV4dDtcbiAgICBjb25zdCBoZWxwZXJzID0gQXJyYXkuZnJvbShhc3QuaGVscGVycyk7XG4gICAgY29uc3QgaGFzSGVscGVycyA9IGhlbHBlcnMubGVuZ3RoID4gMDtcbiAgICBjb25zdCB1c2VXaXRoQmxvY2sgPSAhcHJlZml4SWRlbnRpZmllcnMgJiYgbW9kZSAhPT0gJ21vZHVsZSc7XG4gICAgY29uc3QgaXNTZXR1cElubGluZWQgPSAhdHJ1ZSA7XG4gICAgLy8gcHJlYW1ibGVzXG4gICAgLy8gaW4gc2V0dXAoKSBpbmxpbmUgbW9kZSwgdGhlIHByZWFtYmxlIGlzIGdlbmVyYXRlZCBpbiBhIHN1YiBjb250ZXh0XG4gICAgLy8gYW5kIHJldHVybmVkIHNlcGFyYXRlbHkuXG4gICAgY29uc3QgcHJlYW1ibGVDb250ZXh0ID0gaXNTZXR1cElubGluZWRcbiAgICAgICAgPyBjcmVhdGVDb2RlZ2VuQ29udGV4dChhc3QsIG9wdGlvbnMpXG4gICAgICAgIDogY29udGV4dDtcbiAgICB7XG4gICAgICAgIGdlbkZ1bmN0aW9uUHJlYW1ibGUoYXN0LCBwcmVhbWJsZUNvbnRleHQpO1xuICAgIH1cbiAgICAvLyBlbnRlciByZW5kZXIgZnVuY3Rpb25cbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBzc3IgPyBgc3NyUmVuZGVyYCA6IGByZW5kZXJgO1xuICAgIGNvbnN0IGFyZ3MgPSBzc3IgPyBbJ19jdHgnLCAnX3B1c2gnLCAnX3BhcmVudCcsICdfYXR0cnMnXSA6IFsnX2N0eCcsICdfY2FjaGUnXTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBhcmdzLmpvaW4oJywgJyk7XG4gICAge1xuICAgICAgICBwdXNoKGBmdW5jdGlvbiAke2Z1bmN0aW9uTmFtZX0oJHtzaWduYXR1cmV9KSB7YCk7XG4gICAgfVxuICAgIGluZGVudCgpO1xuICAgIGlmICh1c2VXaXRoQmxvY2spIHtcbiAgICAgICAgcHVzaChgd2l0aCAoX2N0eCkge2ApO1xuICAgICAgICBpbmRlbnQoKTtcbiAgICAgICAgLy8gZnVuY3Rpb24gbW9kZSBjb25zdCBkZWNsYXJhdGlvbnMgc2hvdWxkIGJlIGluc2lkZSB3aXRoIGJsb2NrXG4gICAgICAgIC8vIGFsc28gdGhleSBzaG91bGQgYmUgcmVuYW1lZCB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCB1c2VyIHByb3BlcnRpZXNcbiAgICAgICAgaWYgKGhhc0hlbHBlcnMpIHtcbiAgICAgICAgICAgIHB1c2goYGNvbnN0IHsgJHtoZWxwZXJzLm1hcChhbGlhc0hlbHBlcikuam9pbignLCAnKX0gfSA9IF9WdWVgKTtcbiAgICAgICAgICAgIHB1c2goYFxcbmApO1xuICAgICAgICAgICAgbmV3bGluZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGdlbmVyYXRlIGFzc2V0IHJlc29sdXRpb24gc3RhdGVtZW50c1xuICAgIGlmIChhc3QuY29tcG9uZW50cy5sZW5ndGgpIHtcbiAgICAgICAgZ2VuQXNzZXRzKGFzdC5jb21wb25lbnRzLCAnY29tcG9uZW50JywgY29udGV4dCk7XG4gICAgICAgIGlmIChhc3QuZGlyZWN0aXZlcy5sZW5ndGggfHwgYXN0LnRlbXBzID4gMCkge1xuICAgICAgICAgICAgbmV3bGluZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhc3QuZGlyZWN0aXZlcy5sZW5ndGgpIHtcbiAgICAgICAgZ2VuQXNzZXRzKGFzdC5kaXJlY3RpdmVzLCAnZGlyZWN0aXZlJywgY29udGV4dCk7XG4gICAgICAgIGlmIChhc3QudGVtcHMgPiAwKSB7XG4gICAgICAgICAgICBuZXdsaW5lKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFzdC5maWx0ZXJzICYmIGFzdC5maWx0ZXJzLmxlbmd0aCkge1xuICAgICAgICBuZXdsaW5lKCk7XG4gICAgICAgIGdlbkFzc2V0cyhhc3QuZmlsdGVycywgJ2ZpbHRlcicsIGNvbnRleHQpO1xuICAgICAgICBuZXdsaW5lKCk7XG4gICAgfVxuICAgIGlmIChhc3QudGVtcHMgPiAwKSB7XG4gICAgICAgIHB1c2goYGxldCBgKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhc3QudGVtcHM7IGkrKykge1xuICAgICAgICAgICAgcHVzaChgJHtpID4gMCA/IGAsIGAgOiBgYH1fdGVtcCR7aX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYXN0LmNvbXBvbmVudHMubGVuZ3RoIHx8IGFzdC5kaXJlY3RpdmVzLmxlbmd0aCB8fCBhc3QudGVtcHMpIHtcbiAgICAgICAgcHVzaChgXFxuYCk7XG4gICAgICAgIG5ld2xpbmUoKTtcbiAgICB9XG4gICAgLy8gZ2VuZXJhdGUgdGhlIFZOb2RlIHRyZWUgZXhwcmVzc2lvblxuICAgIGlmICghc3NyKSB7XG4gICAgICAgIHB1c2goYHJldHVybiBgKTtcbiAgICB9XG4gICAgaWYgKGFzdC5jb2RlZ2VuTm9kZSkge1xuICAgICAgICBnZW5Ob2RlKGFzdC5jb2RlZ2VuTm9kZSwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwdXNoKGBudWxsYCk7XG4gICAgfVxuICAgIGlmICh1c2VXaXRoQmxvY2spIHtcbiAgICAgICAgZGVpbmRlbnQoKTtcbiAgICAgICAgcHVzaChgfWApO1xuICAgIH1cbiAgICBkZWluZGVudCgpO1xuICAgIHB1c2goYH1gKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhc3QsXG4gICAgICAgIGNvZGU6IGNvbnRleHQuY29kZSxcbiAgICAgICAgcHJlYW1ibGU6IGlzU2V0dXBJbmxpbmVkID8gcHJlYW1ibGVDb250ZXh0LmNvZGUgOiBgYCxcbiAgICAgICAgLy8gU291cmNlTWFwR2VuZXJhdG9yIGRvZXMgaGF2ZSB0b0pTT04oKSBtZXRob2QgYnV0IGl0J3Mgbm90IGluIHRoZSB0eXBlc1xuICAgICAgICBtYXA6IGNvbnRleHQubWFwID8gY29udGV4dC5tYXAudG9KU09OKCkgOiB1bmRlZmluZWRcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2VuRnVuY3Rpb25QcmVhbWJsZShhc3QsIGNvbnRleHQpIHtcbiAgICBjb25zdCB7IHNzciwgcHJlZml4SWRlbnRpZmllcnMsIHB1c2gsIG5ld2xpbmUsIHJ1bnRpbWVNb2R1bGVOYW1lLCBydW50aW1lR2xvYmFsTmFtZSwgc3NyUnVudGltZU1vZHVsZU5hbWUgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgVnVlQmluZGluZyA9IHJ1bnRpbWVHbG9iYWxOYW1lO1xuICAgIC8vIEdlbmVyYXRlIGNvbnN0IGRlY2xhcmF0aW9uIGZvciBoZWxwZXJzXG4gICAgLy8gSW4gcHJlZml4IG1vZGUsIHdlIHBsYWNlIHRoZSBjb25zdCBkZWNsYXJhdGlvbiBhdCB0b3Agc28gaXQncyBkb25lXG4gICAgLy8gb25seSBvbmNlOyBCdXQgaWYgd2Ugbm90IHByZWZpeGluZywgd2UgcGxhY2UgdGhlIGRlY2xhcmF0aW9uIGluc2lkZSB0aGVcbiAgICAvLyB3aXRoIGJsb2NrIHNvIGl0IGRvZXNuJ3QgaW5jdXIgdGhlIGBpbmAgY2hlY2sgY29zdCBmb3IgZXZlcnkgaGVscGVyIGFjY2Vzcy5cbiAgICBjb25zdCBoZWxwZXJzID0gQXJyYXkuZnJvbShhc3QuaGVscGVycyk7XG4gICAgaWYgKGhlbHBlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB7XG4gICAgICAgICAgICAvLyBcIndpdGhcIiBtb2RlLlxuICAgICAgICAgICAgLy8gc2F2ZSBWdWUgaW4gYSBzZXBhcmF0ZSB2YXJpYWJsZSB0byBhdm9pZCBjb2xsaXNpb25cbiAgICAgICAgICAgIHB1c2goYGNvbnN0IF9WdWUgPSAke1Z1ZUJpbmRpbmd9XFxuYCk7XG4gICAgICAgICAgICAvLyBpbiBcIndpdGhcIiBtb2RlLCBoZWxwZXJzIGFyZSBkZWNsYXJlZCBpbnNpZGUgdGhlIHdpdGggYmxvY2sgdG8gYXZvaWRcbiAgICAgICAgICAgIC8vIGhhcyBjaGVjayBjb3N0LCBidXQgaG9pc3RzIGFyZSBsaWZ0ZWQgb3V0IG9mIHRoZSBmdW5jdGlvbiAtIHdlIG5lZWRcbiAgICAgICAgICAgIC8vIHRvIHByb3ZpZGUgdGhlIGhlbHBlciBoZXJlLlxuICAgICAgICAgICAgaWYgKGFzdC5ob2lzdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljSGVscGVycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgQ1JFQVRFX1ZOT0RFLFxuICAgICAgICAgICAgICAgICAgICBDUkVBVEVfRUxFTUVOVF9WTk9ERSxcbiAgICAgICAgICAgICAgICAgICAgQ1JFQVRFX0NPTU1FTlQsXG4gICAgICAgICAgICAgICAgICAgIENSRUFURV9URVhULFxuICAgICAgICAgICAgICAgICAgICBDUkVBVEVfU1RBVElDXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGhlbHBlciA9PiBoZWxwZXJzLmluY2x1ZGVzKGhlbHBlcikpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoYWxpYXNIZWxwZXIpXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICAgICAgICAgIHB1c2goYGNvbnN0IHsgJHtzdGF0aWNIZWxwZXJzfSB9ID0gX1Z1ZVxcbmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGdlbkhvaXN0cyhhc3QuaG9pc3RzLCBjb250ZXh0KTtcbiAgICBuZXdsaW5lKCk7XG4gICAgcHVzaChgcmV0dXJuIGApO1xufVxuZnVuY3Rpb24gZ2VuQXNzZXRzKGFzc2V0cywgdHlwZSwgeyBoZWxwZXIsIHB1c2gsIG5ld2xpbmUsIGlzVFMgfSkge1xuICAgIGNvbnN0IHJlc29sdmVyID0gaGVscGVyKHR5cGUgPT09ICdmaWx0ZXInXG4gICAgICAgID8gUkVTT0xWRV9GSUxURVJcbiAgICAgICAgOiB0eXBlID09PSAnY29tcG9uZW50J1xuICAgICAgICAgICAgPyBSRVNPTFZFX0NPTVBPTkVOVFxuICAgICAgICAgICAgOiBSRVNPTFZFX0RJUkVDVElWRSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGlkID0gYXNzZXRzW2ldO1xuICAgICAgICAvLyBwb3RlbnRpYWwgY29tcG9uZW50IGltcGxpY2l0IHNlbGYtcmVmZXJlbmNlIGluZmVycmVkIGZyb20gU0ZDIGZpbGVuYW1lXG4gICAgICAgIGNvbnN0IG1heWJlU2VsZlJlZmVyZW5jZSA9IGlkLmVuZHNXaXRoKCdfX3NlbGYnKTtcbiAgICAgICAgaWYgKG1heWJlU2VsZlJlZmVyZW5jZSkge1xuICAgICAgICAgICAgaWQgPSBpZC5zbGljZSgwLCAtNik7XG4gICAgICAgIH1cbiAgICAgICAgcHVzaChgY29uc3QgJHt0b1ZhbGlkQXNzZXRJZChpZCwgdHlwZSl9ID0gJHtyZXNvbHZlcn0oJHtKU09OLnN0cmluZ2lmeShpZCl9JHttYXliZVNlbGZSZWZlcmVuY2UgPyBgLCB0cnVlYCA6IGBgfSkke2lzVFMgPyBgIWAgOiBgYH1gKTtcbiAgICAgICAgaWYgKGkgPCBhc3NldHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgbmV3bGluZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2VuSG9pc3RzKGhvaXN0cywgY29udGV4dCkge1xuICAgIGlmICghaG9pc3RzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnRleHQucHVyZSA9IHRydWU7XG4gICAgY29uc3QgeyBwdXNoLCBuZXdsaW5lLCBoZWxwZXIsIHNjb3BlSWQsIG1vZGUgfSA9IGNvbnRleHQ7XG4gICAgbmV3bGluZSgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaG9pc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGV4cCA9IGhvaXN0c1tpXTtcbiAgICAgICAgaWYgKGV4cCkge1xuICAgICAgICAgICAgcHVzaChgY29uc3QgX2hvaXN0ZWRfJHtpICsgMX0gPSAke2BgfWApO1xuICAgICAgICAgICAgZ2VuTm9kZShleHAsIGNvbnRleHQpO1xuICAgICAgICAgICAgbmV3bGluZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnRleHQucHVyZSA9IGZhbHNlO1xufVxuZnVuY3Rpb24gaXNUZXh0KG4pIHtcbiAgICByZXR1cm4gKGlzU3RyaW5nKG4pIHx8XG4gICAgICAgIG4udHlwZSA9PT0gNCAvKiBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT04gKi8gfHxcbiAgICAgICAgbi50eXBlID09PSAyIC8qIE5vZGVUeXBlcy5URVhUICovIHx8XG4gICAgICAgIG4udHlwZSA9PT0gNSAvKiBOb2RlVHlwZXMuSU5URVJQT0xBVElPTiAqLyB8fFxuICAgICAgICBuLnR5cGUgPT09IDggLyogTm9kZVR5cGVzLkNPTVBPVU5EX0VYUFJFU1NJT04gKi8pO1xufVxuZnVuY3Rpb24gZ2VuTm9kZUxpc3RBc0FycmF5KG5vZGVzLCBjb250ZXh0KSB7XG4gICAgY29uc3QgbXVsdGlsaW5lcyA9IG5vZGVzLmxlbmd0aCA+IDMgfHxcbiAgICAgICAgKCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpICYmIG5vZGVzLnNvbWUobiA9PiBpc0FycmF5KG4pIHx8ICFpc1RleHQobikpKTtcbiAgICBjb250ZXh0LnB1c2goYFtgKTtcbiAgICBtdWx0aWxpbmVzICYmIGNvbnRleHQuaW5kZW50KCk7XG4gICAgZ2VuTm9kZUxpc3Qobm9kZXMsIGNvbnRleHQsIG11bHRpbGluZXMpO1xuICAgIG11bHRpbGluZXMgJiYgY29udGV4dC5kZWluZGVudCgpO1xuICAgIGNvbnRleHQucHVzaChgXWApO1xufVxuZnVuY3Rpb24gZ2VuTm9kZUxpc3Qobm9kZXMsIGNvbnRleHQsIG11bHRpbGluZXMgPSBmYWxzZSwgY29tbWEgPSB0cnVlKSB7XG4gICAgY29uc3QgeyBwdXNoLCBuZXdsaW5lIH0gPSBjb250ZXh0O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAoaXNTdHJpbmcobm9kZSkpIHtcbiAgICAgICAgICAgIHB1c2gobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNBcnJheShub2RlKSkge1xuICAgICAgICAgICAgZ2VuTm9kZUxpc3RBc0FycmF5KG5vZGUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2VuTm9kZShub2RlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA8IG5vZGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIGlmIChtdWx0aWxpbmVzKSB7XG4gICAgICAgICAgICAgICAgY29tbWEgJiYgcHVzaCgnLCcpO1xuICAgICAgICAgICAgICAgIG5ld2xpbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbW1hICYmIHB1c2goJywgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZW5Ob2RlKG5vZGUsIGNvbnRleHQpIHtcbiAgICBpZiAoaXNTdHJpbmcobm9kZSkpIHtcbiAgICAgICAgY29udGV4dC5wdXNoKG5vZGUpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChub2RlKSkge1xuICAgICAgICBjb250ZXh0LnB1c2goY29udGV4dC5oZWxwZXIobm9kZSkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgIGNhc2UgMSAvKiBOb2RlVHlwZXMuRUxFTUVOVCAqLzpcbiAgICAgICAgY2FzZSA5IC8qIE5vZGVUeXBlcy5JRiAqLzpcbiAgICAgICAgY2FzZSAxMSAvKiBOb2RlVHlwZXMuRk9SICovOlxuICAgICAgICAgICAgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmXG4gICAgICAgICAgICAgICAgYXNzZXJ0KG5vZGUuY29kZWdlbk5vZGUgIT0gbnVsbCwgYENvZGVnZW4gbm9kZSBpcyBtaXNzaW5nIGZvciBlbGVtZW50L2lmL2ZvciBub2RlLiBgICtcbiAgICAgICAgICAgICAgICAgICAgYEFwcGx5IGFwcHJvcHJpYXRlIHRyYW5zZm9ybXMgZmlyc3QuYCk7XG4gICAgICAgICAgICBnZW5Ob2RlKG5vZGUuY29kZWdlbk5vZGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMiAvKiBOb2RlVHlwZXMuVEVYVCAqLzpcbiAgICAgICAgICAgIGdlblRleHQobm9kZSwgY29udGV4dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0IC8qIE5vZGVUeXBlcy5TSU1QTEVfRVhQUkVTU0lPTiAqLzpcbiAgICAgICAgICAgIGdlbkV4cHJlc3Npb24obm9kZSwgY29udGV4dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1IC8qIE5vZGVUeXBlcy5JTlRFUlBPTEFUSU9OICovOlxuICAgICAgICAgICAgZ2VuSW50ZXJwb2xhdGlvbihub2RlLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEyIC8qIE5vZGVUeXBlcy5URVhUX0NBTEwgKi86XG4gICAgICAgICAgICBnZW5Ob2RlKG5vZGUuY29kZWdlbk5vZGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgOCAvKiBOb2RlVHlwZXMuQ09NUE9VTkRfRVhQUkVTU0lPTiAqLzpcbiAgICAgICAgICAgIGdlbkNvbXBvdW5kRXhwcmVzc2lvbihub2RlLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDMgLyogTm9kZVR5cGVzLkNPTU1FTlQgKi86XG4gICAgICAgICAgICBnZW5Db21tZW50KG5vZGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTMgLyogTm9kZVR5cGVzLlZOT0RFX0NBTEwgKi86XG4gICAgICAgICAgICBnZW5WTm9kZUNhbGwobm9kZSwgY29udGV4dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxNCAvKiBOb2RlVHlwZXMuSlNfQ0FMTF9FWFBSRVNTSU9OICovOlxuICAgICAgICAgICAgZ2VuQ2FsbEV4cHJlc3Npb24obm9kZSwgY29udGV4dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxNSAvKiBOb2RlVHlwZXMuSlNfT0JKRUNUX0VYUFJFU1NJT04gKi86XG4gICAgICAgICAgICBnZW5PYmplY3RFeHByZXNzaW9uKG5vZGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTcgLyogTm9kZVR5cGVzLkpTX0FSUkFZX0VYUFJFU1NJT04gKi86XG4gICAgICAgICAgICBnZW5BcnJheUV4cHJlc3Npb24obm9kZSwgY29udGV4dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOCAvKiBOb2RlVHlwZXMuSlNfRlVOQ1RJT05fRVhQUkVTU0lPTiAqLzpcbiAgICAgICAgICAgIGdlbkZ1bmN0aW9uRXhwcmVzc2lvbihub2RlLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE5IC8qIE5vZGVUeXBlcy5KU19DT05ESVRJT05BTF9FWFBSRVNTSU9OICovOlxuICAgICAgICAgICAgZ2VuQ29uZGl0aW9uYWxFeHByZXNzaW9uKG5vZGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjAgLyogTm9kZVR5cGVzLkpTX0NBQ0hFX0VYUFJFU1NJT04gKi86XG4gICAgICAgICAgICBnZW5DYWNoZUV4cHJlc3Npb24obm9kZSwgY29udGV4dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMSAvKiBOb2RlVHlwZXMuSlNfQkxPQ0tfU1RBVEVNRU5UICovOlxuICAgICAgICAgICAgZ2VuTm9kZUxpc3Qobm9kZS5ib2R5LCBjb250ZXh0LCB0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gU1NSIG9ubHkgdHlwZXNcbiAgICAgICAgY2FzZSAyMiAvKiBOb2RlVHlwZXMuSlNfVEVNUExBVEVfTElURVJBTCAqLzpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIzIC8qIE5vZGVUeXBlcy5KU19JRl9TVEFURU1FTlQgKi86XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNCAvKiBOb2RlVHlwZXMuSlNfQVNTSUdOTUVOVF9FWFBSRVNTSU9OICovOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjUgLyogTm9kZVR5cGVzLkpTX1NFUVVFTkNFX0VYUFJFU1NJT04gKi86XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNiAvKiBOb2RlVHlwZXMuSlNfUkVUVVJOX1NUQVRFTUVOVCAqLzpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBjYXNlIDEwIC8qIE5vZGVUeXBlcy5JRl9CUkFOQ0ggKi86XG4gICAgICAgICAgICAvLyBub29wXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UsIGB1bmhhbmRsZWQgY29kZWdlbiBub2RlIHR5cGU6ICR7bm9kZS50eXBlfWApO1xuICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBleGhhdXN0IGFsbCBwb3NzaWJsZSB0eXBlc1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4aGF1c3RpdmVDaGVjayA9IG5vZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4aGF1c3RpdmVDaGVjaztcbiAgICAgICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZW5UZXh0KG5vZGUsIGNvbnRleHQpIHtcbiAgICBjb250ZXh0LnB1c2goSlNPTi5zdHJpbmdpZnkobm9kZS5jb250ZW50KSwgbm9kZSk7XG59XG5mdW5jdGlvbiBnZW5FeHByZXNzaW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgICBjb25zdCB7IGNvbnRlbnQsIGlzU3RhdGljIH0gPSBub2RlO1xuICAgIGNvbnRleHQucHVzaChpc1N0YXRpYyA/IEpTT04uc3RyaW5naWZ5KGNvbnRlbnQpIDogY29udGVudCwgbm9kZSk7XG59XG5mdW5jdGlvbiBnZW5JbnRlcnBvbGF0aW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgICBjb25zdCB7IHB1c2gsIGhlbHBlciwgcHVyZSB9ID0gY29udGV4dDtcbiAgICBpZiAocHVyZSlcbiAgICAgICAgcHVzaChQVVJFX0FOTk9UQVRJT04pO1xuICAgIHB1c2goYCR7aGVscGVyKFRPX0RJU1BMQVlfU1RSSU5HKX0oYCk7XG4gICAgZ2VuTm9kZShub2RlLmNvbnRlbnQsIGNvbnRleHQpO1xuICAgIHB1c2goYClgKTtcbn1cbmZ1bmN0aW9uIGdlbkNvbXBvdW5kRXhwcmVzc2lvbihub2RlLCBjb250ZXh0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgICAgaWYgKGlzU3RyaW5nKGNoaWxkKSkge1xuICAgICAgICAgICAgY29udGV4dC5wdXNoKGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGdlbk5vZGUoY2hpbGQsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2VuRXhwcmVzc2lvbkFzUHJvcGVydHlLZXkobm9kZSwgY29udGV4dCkge1xuICAgIGNvbnN0IHsgcHVzaCB9ID0gY29udGV4dDtcbiAgICBpZiAobm9kZS50eXBlID09PSA4IC8qIE5vZGVUeXBlcy5DT01QT1VORF9FWFBSRVNTSU9OICovKSB7XG4gICAgICAgIHB1c2goYFtgKTtcbiAgICAgICAgZ2VuQ29tcG91bmRFeHByZXNzaW9uKG5vZGUsIGNvbnRleHQpO1xuICAgICAgICBwdXNoKGBdYCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5vZGUuaXNTdGF0aWMpIHtcbiAgICAgICAgLy8gb25seSBxdW90ZSBrZXlzIGlmIG5lY2Vzc2FyeVxuICAgICAgICBjb25zdCB0ZXh0ID0gaXNTaW1wbGVJZGVudGlmaWVyKG5vZGUuY29udGVudClcbiAgICAgICAgICAgID8gbm9kZS5jb250ZW50XG4gICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KG5vZGUuY29udGVudCk7XG4gICAgICAgIHB1c2godGV4dCwgbm9kZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwdXNoKGBbJHtub2RlLmNvbnRlbnR9XWAsIG5vZGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdlbkNvbW1lbnQobm9kZSwgY29udGV4dCkge1xuICAgIGNvbnN0IHsgcHVzaCwgaGVscGVyLCBwdXJlIH0gPSBjb250ZXh0O1xuICAgIGlmIChwdXJlKSB7XG4gICAgICAgIHB1c2goUFVSRV9BTk5PVEFUSU9OKTtcbiAgICB9XG4gICAgcHVzaChgJHtoZWxwZXIoQ1JFQVRFX0NPTU1FTlQpfSgke0pTT04uc3RyaW5naWZ5KG5vZGUuY29udGVudCl9KWAsIG5vZGUpO1xufVxuZnVuY3Rpb24gZ2VuVk5vZGVDYWxsKG5vZGUsIGNvbnRleHQpIHtcbiAgICBjb25zdCB7IHB1c2gsIGhlbHBlciwgcHVyZSB9ID0gY29udGV4dDtcbiAgICBjb25zdCB7IHRhZywgcHJvcHMsIGNoaWxkcmVuLCBwYXRjaEZsYWcsIGR5bmFtaWNQcm9wcywgZGlyZWN0aXZlcywgaXNCbG9jaywgZGlzYWJsZVRyYWNraW5nLCBpc0NvbXBvbmVudCB9ID0gbm9kZTtcbiAgICBpZiAoZGlyZWN0aXZlcykge1xuICAgICAgICBwdXNoKGhlbHBlcihXSVRIX0RJUkVDVElWRVMpICsgYChgKTtcbiAgICB9XG4gICAgaWYgKGlzQmxvY2spIHtcbiAgICAgICAgcHVzaChgKCR7aGVscGVyKE9QRU5fQkxPQ0spfSgke2Rpc2FibGVUcmFja2luZyA/IGB0cnVlYCA6IGBgfSksIGApO1xuICAgIH1cbiAgICBpZiAocHVyZSkge1xuICAgICAgICBwdXNoKFBVUkVfQU5OT1RBVElPTik7XG4gICAgfVxuICAgIGNvbnN0IGNhbGxIZWxwZXIgPSBpc0Jsb2NrXG4gICAgICAgID8gZ2V0Vk5vZGVCbG9ja0hlbHBlcihjb250ZXh0LmluU1NSLCBpc0NvbXBvbmVudClcbiAgICAgICAgOiBnZXRWTm9kZUhlbHBlcihjb250ZXh0LmluU1NSLCBpc0NvbXBvbmVudCk7XG4gICAgcHVzaChoZWxwZXIoY2FsbEhlbHBlcikgKyBgKGAsIG5vZGUpO1xuICAgIGdlbk5vZGVMaXN0KGdlbk51bGxhYmxlQXJncyhbdGFnLCBwcm9wcywgY2hpbGRyZW4sIHBhdGNoRmxhZywgZHluYW1pY1Byb3BzXSksIGNvbnRleHQpO1xuICAgIHB1c2goYClgKTtcbiAgICBpZiAoaXNCbG9jaykge1xuICAgICAgICBwdXNoKGApYCk7XG4gICAgfVxuICAgIGlmIChkaXJlY3RpdmVzKSB7XG4gICAgICAgIHB1c2goYCwgYCk7XG4gICAgICAgIGdlbk5vZGUoZGlyZWN0aXZlcywgY29udGV4dCk7XG4gICAgICAgIHB1c2goYClgKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZW5OdWxsYWJsZUFyZ3MoYXJncykge1xuICAgIGxldCBpID0gYXJncy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICBpZiAoYXJnc1tpXSAhPSBudWxsKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBhcmdzLnNsaWNlKDAsIGkgKyAxKS5tYXAoYXJnID0+IGFyZyB8fCBgbnVsbGApO1xufVxuLy8gSmF2YVNjcmlwdFxuZnVuY3Rpb24gZ2VuQ2FsbEV4cHJlc3Npb24obm9kZSwgY29udGV4dCkge1xuICAgIGNvbnN0IHsgcHVzaCwgaGVscGVyLCBwdXJlIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGNhbGxlZSA9IGlzU3RyaW5nKG5vZGUuY2FsbGVlKSA/IG5vZGUuY2FsbGVlIDogaGVscGVyKG5vZGUuY2FsbGVlKTtcbiAgICBpZiAocHVyZSkge1xuICAgICAgICBwdXNoKFBVUkVfQU5OT1RBVElPTik7XG4gICAgfVxuICAgIHB1c2goY2FsbGVlICsgYChgLCBub2RlKTtcbiAgICBnZW5Ob2RlTGlzdChub2RlLmFyZ3VtZW50cywgY29udGV4dCk7XG4gICAgcHVzaChgKWApO1xufVxuZnVuY3Rpb24gZ2VuT2JqZWN0RXhwcmVzc2lvbihub2RlLCBjb250ZXh0KSB7XG4gICAgY29uc3QgeyBwdXNoLCBpbmRlbnQsIGRlaW5kZW50LCBuZXdsaW5lIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IHsgcHJvcGVydGllcyB9ID0gbm9kZTtcbiAgICBpZiAoIXByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgIHB1c2goYHt9YCwgbm9kZSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbXVsdGlsaW5lcyA9IHByb3BlcnRpZXMubGVuZ3RoID4gMSB8fFxuICAgICAgICAoKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkgJiZcbiAgICAgICAgICAgIHByb3BlcnRpZXMuc29tZShwID0+IHAudmFsdWUudHlwZSAhPT0gNCAvKiBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT04gKi8pKTtcbiAgICBwdXNoKG11bHRpbGluZXMgPyBge2AgOiBgeyBgKTtcbiAgICBtdWx0aWxpbmVzICYmIGluZGVudCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB7IGtleSwgdmFsdWUgfSA9IHByb3BlcnRpZXNbaV07XG4gICAgICAgIC8vIGtleVxuICAgICAgICBnZW5FeHByZXNzaW9uQXNQcm9wZXJ0eUtleShrZXksIGNvbnRleHQpO1xuICAgICAgICBwdXNoKGA6IGApO1xuICAgICAgICAvLyB2YWx1ZVxuICAgICAgICBnZW5Ob2RlKHZhbHVlLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGkgPCBwcm9wZXJ0aWVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIC8vIHdpbGwgb25seSByZWFjaCB0aGlzIGlmIGl0J3MgbXVsdGlsaW5lc1xuICAgICAgICAgICAgcHVzaChgLGApO1xuICAgICAgICAgICAgbmV3bGluZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG11bHRpbGluZXMgJiYgZGVpbmRlbnQoKTtcbiAgICBwdXNoKG11bHRpbGluZXMgPyBgfWAgOiBgIH1gKTtcbn1cbmZ1bmN0aW9uIGdlbkFycmF5RXhwcmVzc2lvbihub2RlLCBjb250ZXh0KSB7XG4gICAgZ2VuTm9kZUxpc3RBc0FycmF5KG5vZGUuZWxlbWVudHMsIGNvbnRleHQpO1xufVxuZnVuY3Rpb24gZ2VuRnVuY3Rpb25FeHByZXNzaW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgICBjb25zdCB7IHB1c2gsIGluZGVudCwgZGVpbmRlbnQgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgeyBwYXJhbXMsIHJldHVybnMsIGJvZHksIG5ld2xpbmUsIGlzU2xvdCB9ID0gbm9kZTtcbiAgICBpZiAoaXNTbG90KSB7XG4gICAgICAgIC8vIHdyYXAgc2xvdCBmdW5jdGlvbnMgd2l0aCBvd25lciBjb250ZXh0XG4gICAgICAgIHB1c2goYF8ke2hlbHBlck5hbWVNYXBbV0lUSF9DVFhdfShgKTtcbiAgICB9XG4gICAgcHVzaChgKGAsIG5vZGUpO1xuICAgIGlmIChpc0FycmF5KHBhcmFtcykpIHtcbiAgICAgICAgZ2VuTm9kZUxpc3QocGFyYW1zLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAocGFyYW1zKSB7XG4gICAgICAgIGdlbk5vZGUocGFyYW1zLCBjb250ZXh0KTtcbiAgICB9XG4gICAgcHVzaChgKSA9PiBgKTtcbiAgICBpZiAobmV3bGluZSB8fCBib2R5KSB7XG4gICAgICAgIHB1c2goYHtgKTtcbiAgICAgICAgaW5kZW50KCk7XG4gICAgfVxuICAgIGlmIChyZXR1cm5zKSB7XG4gICAgICAgIGlmIChuZXdsaW5lKSB7XG4gICAgICAgICAgICBwdXNoKGByZXR1cm4gYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQXJyYXkocmV0dXJucykpIHtcbiAgICAgICAgICAgIGdlbk5vZGVMaXN0QXNBcnJheShyZXR1cm5zLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGdlbk5vZGUocmV0dXJucywgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYm9keSkge1xuICAgICAgICBnZW5Ob2RlKGJvZHksIGNvbnRleHQpO1xuICAgIH1cbiAgICBpZiAobmV3bGluZSB8fCBib2R5KSB7XG4gICAgICAgIGRlaW5kZW50KCk7XG4gICAgICAgIHB1c2goYH1gKTtcbiAgICB9XG4gICAgaWYgKGlzU2xvdCkge1xuICAgICAgICBpZiAobm9kZS5pc05vblNjb3BlZFNsb3QpIHtcbiAgICAgICAgICAgIHB1c2goYCwgdW5kZWZpbmVkLCB0cnVlYCk7XG4gICAgICAgIH1cbiAgICAgICAgcHVzaChgKWApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdlbkNvbmRpdGlvbmFsRXhwcmVzc2lvbihub2RlLCBjb250ZXh0KSB7XG4gICAgY29uc3QgeyB0ZXN0LCBjb25zZXF1ZW50LCBhbHRlcm5hdGUsIG5ld2xpbmU6IG5lZWROZXdsaW5lIH0gPSBub2RlO1xuICAgIGNvbnN0IHsgcHVzaCwgaW5kZW50LCBkZWluZGVudCwgbmV3bGluZSB9ID0gY29udGV4dDtcbiAgICBpZiAodGVzdC50eXBlID09PSA0IC8qIE5vZGVUeXBlcy5TSU1QTEVfRVhQUkVTU0lPTiAqLykge1xuICAgICAgICBjb25zdCBuZWVkc1BhcmVucyA9ICFpc1NpbXBsZUlkZW50aWZpZXIodGVzdC5jb250ZW50KTtcbiAgICAgICAgbmVlZHNQYXJlbnMgJiYgcHVzaChgKGApO1xuICAgICAgICBnZW5FeHByZXNzaW9uKHRlc3QsIGNvbnRleHQpO1xuICAgICAgICBuZWVkc1BhcmVucyAmJiBwdXNoKGApYCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwdXNoKGAoYCk7XG4gICAgICAgIGdlbk5vZGUodGVzdCwgY29udGV4dCk7XG4gICAgICAgIHB1c2goYClgKTtcbiAgICB9XG4gICAgbmVlZE5ld2xpbmUgJiYgaW5kZW50KCk7XG4gICAgY29udGV4dC5pbmRlbnRMZXZlbCsrO1xuICAgIG5lZWROZXdsaW5lIHx8IHB1c2goYCBgKTtcbiAgICBwdXNoKGA/IGApO1xuICAgIGdlbk5vZGUoY29uc2VxdWVudCwgY29udGV4dCk7XG4gICAgY29udGV4dC5pbmRlbnRMZXZlbC0tO1xuICAgIG5lZWROZXdsaW5lICYmIG5ld2xpbmUoKTtcbiAgICBuZWVkTmV3bGluZSB8fCBwdXNoKGAgYCk7XG4gICAgcHVzaChgOiBgKTtcbiAgICBjb25zdCBpc05lc3RlZCA9IGFsdGVybmF0ZS50eXBlID09PSAxOSAvKiBOb2RlVHlwZXMuSlNfQ09ORElUSU9OQUxfRVhQUkVTU0lPTiAqLztcbiAgICBpZiAoIWlzTmVzdGVkKSB7XG4gICAgICAgIGNvbnRleHQuaW5kZW50TGV2ZWwrKztcbiAgICB9XG4gICAgZ2VuTm9kZShhbHRlcm5hdGUsIGNvbnRleHQpO1xuICAgIGlmICghaXNOZXN0ZWQpIHtcbiAgICAgICAgY29udGV4dC5pbmRlbnRMZXZlbC0tO1xuICAgIH1cbiAgICBuZWVkTmV3bGluZSAmJiBkZWluZGVudCh0cnVlIC8qIHdpdGhvdXQgbmV3bGluZSAqLyk7XG59XG5mdW5jdGlvbiBnZW5DYWNoZUV4cHJlc3Npb24obm9kZSwgY29udGV4dCkge1xuICAgIGNvbnN0IHsgcHVzaCwgaGVscGVyLCBpbmRlbnQsIGRlaW5kZW50LCBuZXdsaW5lIH0gPSBjb250ZXh0O1xuICAgIHB1c2goYF9jYWNoZVske25vZGUuaW5kZXh9XSB8fCAoYCk7XG4gICAgaWYgKG5vZGUuaXNWTm9kZSkge1xuICAgICAgICBpbmRlbnQoKTtcbiAgICAgICAgcHVzaChgJHtoZWxwZXIoU0VUX0JMT0NLX1RSQUNLSU5HKX0oLTEpLGApO1xuICAgICAgICBuZXdsaW5lKCk7XG4gICAgfVxuICAgIHB1c2goYF9jYWNoZVske25vZGUuaW5kZXh9XSA9IGApO1xuICAgIGdlbk5vZGUobm9kZS52YWx1ZSwgY29udGV4dCk7XG4gICAgaWYgKG5vZGUuaXNWTm9kZSkge1xuICAgICAgICBwdXNoKGAsYCk7XG4gICAgICAgIG5ld2xpbmUoKTtcbiAgICAgICAgcHVzaChgJHtoZWxwZXIoU0VUX0JMT0NLX1RSQUNLSU5HKX0oMSksYCk7XG4gICAgICAgIG5ld2xpbmUoKTtcbiAgICAgICAgcHVzaChgX2NhY2hlWyR7bm9kZS5pbmRleH1dYCk7XG4gICAgICAgIGRlaW5kZW50KCk7XG4gICAgfVxuICAgIHB1c2goYClgKTtcbn1cblxuZnVuY3Rpb24gd2Fsa0lkZW50aWZpZXJzKHJvb3QsIG9uSWRlbnRpZmllciwgaW5jbHVkZUFsbCA9IGZhbHNlLCBwYXJlbnRTdGFjayA9IFtdLCBrbm93bklkcyA9IE9iamVjdC5jcmVhdGUobnVsbCkpIHtcbiAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG59XG5mdW5jdGlvbiBpc1JlZmVyZW5jZWRJZGVudGlmaWVyKGlkLCBwYXJlbnQsIHBhcmVudFN0YWNrKSB7XG4gICAge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNJbkRlc3RydWN0dXJlQXNzaWdubWVudChwYXJlbnQsIHBhcmVudFN0YWNrKSB7XG4gICAgaWYgKHBhcmVudCAmJlxuICAgICAgICAocGFyZW50LnR5cGUgPT09ICdPYmplY3RQcm9wZXJ0eScgfHwgcGFyZW50LnR5cGUgPT09ICdBcnJheVBhdHRlcm4nKSkge1xuICAgICAgICBsZXQgaSA9IHBhcmVudFN0YWNrLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgY29uc3QgcCA9IHBhcmVudFN0YWNrW2ldO1xuICAgICAgICAgICAgaWYgKHAudHlwZSA9PT0gJ0Fzc2lnbm1lbnRFeHByZXNzaW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocC50eXBlICE9PSAnT2JqZWN0UHJvcGVydHknICYmICFwLnR5cGUuZW5kc1dpdGgoJ1BhdHRlcm4nKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHdhbGtGdW5jdGlvblBhcmFtcyhub2RlLCBvbklkZW50KSB7XG4gICAgZm9yIChjb25zdCBwIG9mIG5vZGUucGFyYW1zKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgZXh0cmFjdElkZW50aWZpZXJzKHApKSB7XG4gICAgICAgICAgICBvbklkZW50KGlkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHdhbGtCbG9ja0RlY2xhcmF0aW9ucyhibG9jaywgb25JZGVudCkge1xuICAgIGZvciAoY29uc3Qgc3RtdCBvZiBibG9jay5ib2R5KSB7XG4gICAgICAgIGlmIChzdG10LnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0aW9uJykge1xuICAgICAgICAgICAgaWYgKHN0bXQuZGVjbGFyZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZGVjbCBvZiBzdG10LmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZXh0cmFjdElkZW50aWZpZXJzKGRlY2wuaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uSWRlbnQoaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdG10LnR5cGUgPT09ICdGdW5jdGlvbkRlY2xhcmF0aW9uJyB8fFxuICAgICAgICAgICAgc3RtdC50eXBlID09PSAnQ2xhc3NEZWNsYXJhdGlvbicpIHtcbiAgICAgICAgICAgIGlmIChzdG10LmRlY2xhcmUgfHwgIXN0bXQuaWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBvbklkZW50KHN0bXQuaWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZXh0cmFjdElkZW50aWZpZXJzKHBhcmFtLCBub2RlcyA9IFtdKSB7XG4gICAgc3dpdGNoIChwYXJhbS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0lkZW50aWZpZXInOlxuICAgICAgICAgICAgbm9kZXMucHVzaChwYXJhbSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnTWVtYmVyRXhwcmVzc2lvbic6XG4gICAgICAgICAgICBsZXQgb2JqZWN0ID0gcGFyYW07XG4gICAgICAgICAgICB3aGlsZSAob2JqZWN0LnR5cGUgPT09ICdNZW1iZXJFeHByZXNzaW9uJykge1xuICAgICAgICAgICAgICAgIG9iamVjdCA9IG9iamVjdC5vYmplY3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2Rlcy5wdXNoKG9iamVjdCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnT2JqZWN0UGF0dGVybic6XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgcGFyYW0ucHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wLnR5cGUgPT09ICdSZXN0RWxlbWVudCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdElkZW50aWZpZXJzKHByb3AuYXJndW1lbnQsIG5vZGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhY3RJZGVudGlmaWVycyhwcm9wLnZhbHVlLCBub2Rlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0FycmF5UGF0dGVybic6XG4gICAgICAgICAgICBwYXJhbS5lbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICBleHRyYWN0SWRlbnRpZmllcnMoZWxlbWVudCwgbm9kZXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnUmVzdEVsZW1lbnQnOlxuICAgICAgICAgICAgZXh0cmFjdElkZW50aWZpZXJzKHBhcmFtLmFyZ3VtZW50LCBub2Rlcyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnQXNzaWdubWVudFBhdHRlcm4nOlxuICAgICAgICAgICAgZXh0cmFjdElkZW50aWZpZXJzKHBhcmFtLmxlZnQsIG5vZGVzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZXM7XG59XG5jb25zdCBpc0Z1bmN0aW9uVHlwZSA9IChub2RlKSA9PiB7XG4gICAgcmV0dXJuIC9GdW5jdGlvbig/OkV4cHJlc3Npb258RGVjbGFyYXRpb24pJHxNZXRob2QkLy50ZXN0KG5vZGUudHlwZSk7XG59O1xuY29uc3QgaXNTdGF0aWNQcm9wZXJ0eSA9IChub2RlKSA9PiBub2RlICYmXG4gICAgKG5vZGUudHlwZSA9PT0gJ09iamVjdFByb3BlcnR5JyB8fCBub2RlLnR5cGUgPT09ICdPYmplY3RNZXRob2QnKSAmJlxuICAgICFub2RlLmNvbXB1dGVkO1xuY29uc3QgaXNTdGF0aWNQcm9wZXJ0eUtleSA9IChub2RlLCBwYXJlbnQpID0+IGlzU3RhdGljUHJvcGVydHkocGFyZW50KSAmJiBwYXJlbnQua2V5ID09PSBub2RlO1xuXG4vLyB0aGVzZSBrZXl3b3JkcyBzaG91bGQgbm90IGFwcGVhciBpbnNpZGUgZXhwcmVzc2lvbnMsIGJ1dCBvcGVyYXRvcnMgbGlrZVxuLy8gJ3R5cGVvZicsICdpbnN0YW5jZW9mJywgYW5kICdpbicgYXJlIGFsbG93ZWRcbmNvbnN0IHByb2hpYml0ZWRLZXl3b3JkUkUgPSBuZXcgUmVnRXhwKCdcXFxcYicgK1xuICAgICgnYXJndW1lbnRzLGF3YWl0LGJyZWFrLGNhc2UsY2F0Y2gsY2xhc3MsY29uc3QsY29udGludWUsZGVidWdnZXIsZGVmYXVsdCwnICtcbiAgICAgICAgJ2RlbGV0ZSxkbyxlbHNlLGV4cG9ydCxleHRlbmRzLGZpbmFsbHksZm9yLGZ1bmN0aW9uLGlmLGltcG9ydCxsZXQsbmV3LCcgK1xuICAgICAgICAncmV0dXJuLHN1cGVyLHN3aXRjaCx0aHJvdyx0cnksdmFyLHZvaWQsd2hpbGUsd2l0aCx5aWVsZCcpXG4gICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgIC5qb2luKCdcXFxcYnxcXFxcYicpICtcbiAgICAnXFxcXGInKTtcbi8vIHN0cmlwIHN0cmluZ3MgaW4gZXhwcmVzc2lvbnNcbmNvbnN0IHN0cmlwU3RyaW5nUkUgPSAvJyg/OlteJ1xcXFxdfFxcXFwuKSonfFwiKD86W15cIlxcXFxdfFxcXFwuKSpcInxgKD86W15gXFxcXF18XFxcXC4pKlxcJFxce3xcXH0oPzpbXmBcXFxcXXxcXFxcLikqYHxgKD86W15gXFxcXF18XFxcXC4pKmAvZztcbi8qKlxuICogVmFsaWRhdGUgYSBub24tcHJlZml4ZWQgZXhwcmVzc2lvbi5cbiAqIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiB1c2luZyB0aGUgaW4tYnJvd3NlciBydW50aW1lIGNvbXBpbGVyIHNpbmNlIGl0XG4gKiBkb2Vzbid0IHByZWZpeCBleHByZXNzaW9ucy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVCcm93c2VyRXhwcmVzc2lvbihub2RlLCBjb250ZXh0LCBhc1BhcmFtcyA9IGZhbHNlLCBhc1Jhd1N0YXRlbWVudHMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGV4cCA9IG5vZGUuY29udGVudDtcbiAgICAvLyBlbXB0eSBleHByZXNzaW9ucyBhcmUgdmFsaWRhdGVkIHBlci1kaXJlY3RpdmUgc2luY2Ugc29tZSBkaXJlY3RpdmVzXG4gICAgLy8gZG8gYWxsb3cgZW1wdHkgZXhwcmVzc2lvbnMuXG4gICAgaWYgKCFleHAudHJpbSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbmV3IEZ1bmN0aW9uKGFzUmF3U3RhdGVtZW50c1xuICAgICAgICAgICAgPyBgICR7ZXhwfSBgXG4gICAgICAgICAgICA6IGByZXR1cm4gJHthc1BhcmFtcyA/IGAoJHtleHB9KSA9PiB7fWAgOiBgKCR7ZXhwfSlgfWApO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IGUubWVzc2FnZTtcbiAgICAgICAgY29uc3Qga2V5d29yZE1hdGNoID0gZXhwXG4gICAgICAgICAgICAucmVwbGFjZShzdHJpcFN0cmluZ1JFLCAnJylcbiAgICAgICAgICAgIC5tYXRjaChwcm9oaWJpdGVkS2V5d29yZFJFKTtcbiAgICAgICAgaWYgKGtleXdvcmRNYXRjaCkge1xuICAgICAgICAgICAgbWVzc2FnZSA9IGBhdm9pZCB1c2luZyBKYXZhU2NyaXB0IGtleXdvcmQgYXMgcHJvcGVydHkgbmFtZTogXCIke2tleXdvcmRNYXRjaFswXX1cImA7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoNDUgLyogRXJyb3JDb2Rlcy5YX0lOVkFMSURfRVhQUkVTU0lPTiAqLywgbm9kZS5sb2MsIHVuZGVmaW5lZCwgbWVzc2FnZSkpO1xuICAgIH1cbn1cblxuY29uc3QgdHJhbnNmb3JtRXhwcmVzc2lvbiA9IChub2RlLCBjb250ZXh0KSA9PiB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gNSAvKiBOb2RlVHlwZXMuSU5URVJQT0xBVElPTiAqLykge1xuICAgICAgICBub2RlLmNvbnRlbnQgPSBwcm9jZXNzRXhwcmVzc2lvbihub2RlLmNvbnRlbnQsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChub2RlLnR5cGUgPT09IDEgLyogTm9kZVR5cGVzLkVMRU1FTlQgKi8pIHtcbiAgICAgICAgLy8gaGFuZGxlIGRpcmVjdGl2ZXMgb24gZWxlbWVudFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUucHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRpciA9IG5vZGUucHJvcHNbaV07XG4gICAgICAgICAgICAvLyBkbyBub3QgcHJvY2VzcyBmb3Igdi1vbiAmIHYtZm9yIHNpbmNlIHRoZXkgYXJlIHNwZWNpYWwgaGFuZGxlZFxuICAgICAgICAgICAgaWYgKGRpci50eXBlID09PSA3IC8qIE5vZGVUeXBlcy5ESVJFQ1RJVkUgKi8gJiYgZGlyLm5hbWUgIT09ICdmb3InKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwID0gZGlyLmV4cDtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmcgPSBkaXIuYXJnO1xuICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBwcm9jZXNzIGV4cCBpZiB0aGlzIGlzIHYtb246YXJnIC0gd2UgbmVlZCBzcGVjaWFsIGhhbmRsaW5nXG4gICAgICAgICAgICAgICAgLy8gZm9yIHdyYXBwaW5nIGlubGluZSBzdGF0ZW1lbnRzLlxuICAgICAgICAgICAgICAgIGlmIChleHAgJiZcbiAgICAgICAgICAgICAgICAgICAgZXhwLnR5cGUgPT09IDQgLyogTm9kZVR5cGVzLlNJTVBMRV9FWFBSRVNTSU9OICovICYmXG4gICAgICAgICAgICAgICAgICAgICEoZGlyLm5hbWUgPT09ICdvbicgJiYgYXJnKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXIuZXhwID0gcHJvY2Vzc0V4cHJlc3Npb24oZXhwLCBjb250ZXh0LCBcbiAgICAgICAgICAgICAgICAgICAgLy8gc2xvdCBhcmdzIG11c3QgYmUgcHJvY2Vzc2VkIGFzIGZ1bmN0aW9uIHBhcmFtc1xuICAgICAgICAgICAgICAgICAgICBkaXIubmFtZSA9PT0gJ3Nsb3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFyZyAmJiBhcmcudHlwZSA9PT0gNCAvKiBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT04gKi8gJiYgIWFyZy5pc1N0YXRpYykge1xuICAgICAgICAgICAgICAgICAgICBkaXIuYXJnID0gcHJvY2Vzc0V4cHJlc3Npb24oYXJnLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuLy8gSW1wb3J0YW50OiBzaW5jZSB0aGlzIGZ1bmN0aW9uIHVzZXMgTm9kZS5qcyBvbmx5IGRlcGVuZGVuY2llcywgaXQgc2hvdWxkXG4vLyBhbHdheXMgYmUgdXNlZCB3aXRoIGEgbGVhZGluZyAhdHJ1ZSBjaGVjayBzbyB0aGF0IGl0IGNhbiBiZVxuLy8gdHJlZS1zaGFrZW4gZnJvbSB0aGUgYnJvd3NlciBidWlsZC5cbmZ1bmN0aW9uIHByb2Nlc3NFeHByZXNzaW9uKG5vZGUsIGNvbnRleHQsIFxuLy8gc29tZSBleHByZXNzaW9ucyBsaWtlIHYtc2xvdCBwcm9wcyAmIHYtZm9yIGFsaWFzZXMgc2hvdWxkIGJlIHBhcnNlZCBhc1xuLy8gZnVuY3Rpb24gcGFyYW1zXG5hc1BhcmFtcyA9IGZhbHNlLCBcbi8vIHYtb24gaGFuZGxlciB2YWx1ZXMgbWF5IGNvbnRhaW4gbXVsdGlwbGUgc3RhdGVtZW50c1xuYXNSYXdTdGF0ZW1lbnRzID0gZmFsc2UsIGxvY2FsVmFycyA9IE9iamVjdC5jcmVhdGUoY29udGV4dC5pZGVudGlmaWVycykpIHtcbiAgICB7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgIC8vIHNpbXBsZSBpbi1icm93c2VyIHZhbGlkYXRpb24gKHNhbWUgbG9naWMgaW4gMi54KVxuICAgICAgICAgICAgdmFsaWRhdGVCcm93c2VyRXhwcmVzc2lvbihub2RlLCBjb250ZXh0LCBhc1BhcmFtcywgYXNSYXdTdGF0ZW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlFeHByZXNzaW9uKGV4cCkge1xuICAgIGlmIChpc1N0cmluZyhleHApKSB7XG4gICAgICAgIHJldHVybiBleHA7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV4cC50eXBlID09PSA0IC8qIE5vZGVUeXBlcy5TSU1QTEVfRVhQUkVTU0lPTiAqLykge1xuICAgICAgICByZXR1cm4gZXhwLmNvbnRlbnQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZXhwLmNoaWxkcmVuXG4gICAgICAgICAgICAubWFwKHN0cmluZ2lmeUV4cHJlc3Npb24pXG4gICAgICAgICAgICAuam9pbignJyk7XG4gICAgfVxufVxuXG5jb25zdCB0cmFuc2Zvcm1JZiA9IGNyZWF0ZVN0cnVjdHVyYWxEaXJlY3RpdmVUcmFuc2Zvcm0oL14oaWZ8ZWxzZXxlbHNlLWlmKSQvLCAobm9kZSwgZGlyLCBjb250ZXh0KSA9PiB7XG4gICAgcmV0dXJuIHByb2Nlc3NJZihub2RlLCBkaXIsIGNvbnRleHQsIChpZk5vZGUsIGJyYW5jaCwgaXNSb290KSA9PiB7XG4gICAgICAgIC8vICMxNTg3OiBXZSBuZWVkIHRvIGR5bmFtaWNhbGx5IGluY3JlbWVudCB0aGUga2V5IGJhc2VkIG9uIHRoZSBjdXJyZW50XG4gICAgICAgIC8vIG5vZGUncyBzaWJsaW5nIG5vZGVzLCBzaW5jZSBjaGFpbmVkIHYtaWYvZWxzZSBicmFuY2hlcyBhcmVcbiAgICAgICAgLy8gcmVuZGVyZWQgYXQgdGhlIHNhbWUgZGVwdGhcbiAgICAgICAgY29uc3Qgc2libGluZ3MgPSBjb250ZXh0LnBhcmVudC5jaGlsZHJlbjtcbiAgICAgICAgbGV0IGkgPSBzaWJsaW5ncy5pbmRleE9mKGlmTm9kZSk7XG4gICAgICAgIGxldCBrZXkgPSAwO1xuICAgICAgICB3aGlsZSAoaS0tID49IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNpYmxpbmcgPSBzaWJsaW5nc1tpXTtcbiAgICAgICAgICAgIGlmIChzaWJsaW5nICYmIHNpYmxpbmcudHlwZSA9PT0gOSAvKiBOb2RlVHlwZXMuSUYgKi8pIHtcbiAgICAgICAgICAgICAgICBrZXkgKz0gc2libGluZy5icmFuY2hlcy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhpdCBjYWxsYmFjay4gQ29tcGxldGUgdGhlIGNvZGVnZW5Ob2RlIHdoZW4gYWxsIGNoaWxkcmVuIGhhdmUgYmVlblxuICAgICAgICAvLyB0cmFuc2Zvcm1lZC5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgICAgICAgICAgICBpZk5vZGUuY29kZWdlbk5vZGUgPSBjcmVhdGVDb2RlZ2VuTm9kZUZvckJyYW5jaChicmFuY2gsIGtleSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBhdHRhY2ggdGhpcyBicmFuY2gncyBjb2RlZ2VuIG5vZGUgdG8gdGhlIHYtaWYgcm9vdC5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRDb25kaXRpb24gPSBnZXRQYXJlbnRDb25kaXRpb24oaWZOb2RlLmNvZGVnZW5Ob2RlKTtcbiAgICAgICAgICAgICAgICBwYXJlbnRDb25kaXRpb24uYWx0ZXJuYXRlID0gY3JlYXRlQ29kZWdlbk5vZGVGb3JCcmFuY2goYnJhbmNoLCBrZXkgKyBpZk5vZGUuYnJhbmNoZXMubGVuZ3RoIC0gMSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG59KTtcbi8vIHRhcmdldC1hZ25vc3RpYyB0cmFuc2Zvcm0gdXNlZCBmb3IgYm90aCBDbGllbnQgYW5kIFNTUlxuZnVuY3Rpb24gcHJvY2Vzc0lmKG5vZGUsIGRpciwgY29udGV4dCwgcHJvY2Vzc0NvZGVnZW4pIHtcbiAgICBpZiAoZGlyLm5hbWUgIT09ICdlbHNlJyAmJlxuICAgICAgICAoIWRpci5leHAgfHwgIWRpci5leHAuY29udGVudC50cmltKCkpKSB7XG4gICAgICAgIGNvbnN0IGxvYyA9IGRpci5leHAgPyBkaXIuZXhwLmxvYyA6IG5vZGUubG9jO1xuICAgICAgICBjb250ZXh0Lm9uRXJyb3IoY3JlYXRlQ29tcGlsZXJFcnJvcigyOCAvKiBFcnJvckNvZGVzLlhfVl9JRl9OT19FWFBSRVNTSU9OICovLCBkaXIubG9jKSk7XG4gICAgICAgIGRpci5leHAgPSBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGB0cnVlYCwgZmFsc2UsIGxvYyk7XG4gICAgfVxuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgdHJ1ZSAmJiBkaXIuZXhwKSB7XG4gICAgICAgIHZhbGlkYXRlQnJvd3NlckV4cHJlc3Npb24oZGlyLmV4cCwgY29udGV4dCk7XG4gICAgfVxuICAgIGlmIChkaXIubmFtZSA9PT0gJ2lmJykge1xuICAgICAgICBjb25zdCBicmFuY2ggPSBjcmVhdGVJZkJyYW5jaChub2RlLCBkaXIpO1xuICAgICAgICBjb25zdCBpZk5vZGUgPSB7XG4gICAgICAgICAgICB0eXBlOiA5IC8qIE5vZGVUeXBlcy5JRiAqLyxcbiAgICAgICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgICAgICBicmFuY2hlczogW2JyYW5jaF1cbiAgICAgICAgfTtcbiAgICAgICAgY29udGV4dC5yZXBsYWNlTm9kZShpZk5vZGUpO1xuICAgICAgICBpZiAocHJvY2Vzc0NvZGVnZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzQ29kZWdlbihpZk5vZGUsIGJyYW5jaCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIGxvY2F0ZSB0aGUgYWRqYWNlbnQgdi1pZlxuICAgICAgICBjb25zdCBzaWJsaW5ncyA9IGNvbnRleHQucGFyZW50LmNoaWxkcmVuO1xuICAgICAgICBjb25zdCBjb21tZW50cyA9IFtdO1xuICAgICAgICBsZXQgaSA9IHNpYmxpbmdzLmluZGV4T2Yobm9kZSk7XG4gICAgICAgIHdoaWxlIChpLS0gPj0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpYmxpbmcgPSBzaWJsaW5nc1tpXTtcbiAgICAgICAgICAgIGlmIChzaWJsaW5nICYmIHNpYmxpbmcudHlwZSA9PT0gMyAvKiBOb2RlVHlwZXMuQ09NTUVOVCAqLykge1xuICAgICAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlTm9kZShzaWJsaW5nKTtcbiAgICAgICAgICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgY29tbWVudHMudW5zaGlmdChzaWJsaW5nKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaWJsaW5nICYmXG4gICAgICAgICAgICAgICAgc2libGluZy50eXBlID09PSAyIC8qIE5vZGVUeXBlcy5URVhUICovICYmXG4gICAgICAgICAgICAgICAgIXNpYmxpbmcuY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5yZW1vdmVOb2RlKHNpYmxpbmcpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNpYmxpbmcgJiYgc2libGluZy50eXBlID09PSA5IC8qIE5vZGVUeXBlcy5JRiAqLykge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHYtZWxzZSB3YXMgZm9sbG93ZWQgYnkgdi1lbHNlLWlmXG4gICAgICAgICAgICAgICAgaWYgKGRpci5uYW1lID09PSAnZWxzZS1pZicgJiZcbiAgICAgICAgICAgICAgICAgICAgc2libGluZy5icmFuY2hlc1tzaWJsaW5nLmJyYW5jaGVzLmxlbmd0aCAtIDFdLmNvbmRpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQub25FcnJvcihjcmVhdGVDb21waWxlckVycm9yKDMwIC8qIEVycm9yQ29kZXMuWF9WX0VMU0VfTk9fQURKQUNFTlRfSUYgKi8sIG5vZGUubG9jKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG1vdmUgdGhlIG5vZGUgdG8gdGhlIGlmIG5vZGUncyBicmFuY2hlc1xuICAgICAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlTm9kZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJyYW5jaCA9IGNyZWF0ZUlmQnJhbmNoKG5vZGUsIGRpcik7XG4gICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJlxuICAgICAgICAgICAgICAgICAgICBjb21tZW50cy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgLy8gIzM2MTkgaWdub3JlIGNvbW1lbnRzIGlmIHRoZSB2LWlmIGlzIGRpcmVjdCBjaGlsZCBvZiA8dHJhbnNpdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgIShjb250ZXh0LnBhcmVudCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wYXJlbnQudHlwZSA9PT0gMSAvKiBOb2RlVHlwZXMuRUxFTUVOVCAqLyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNCdWlsdEluVHlwZShjb250ZXh0LnBhcmVudC50YWcsICd0cmFuc2l0aW9uJykpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyYW5jaC5jaGlsZHJlbiA9IFsuLi5jb21tZW50cywgLi4uYnJhbmNoLmNoaWxkcmVuXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdXNlciBpcyBmb3JjaW5nIHNhbWUga2V5IG9uIGRpZmZlcmVudCBicmFuY2hlc1xuICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgIXRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gYnJhbmNoLnVzZXJLZXk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmcuYnJhbmNoZXMuZm9yRWFjaCgoeyB1c2VyS2V5IH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTYW1lS2V5KHVzZXJLZXksIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoMjkgLyogRXJyb3JDb2Rlcy5YX1ZfSUZfU0FNRV9LRVkgKi8sIGJyYW5jaC51c2VyS2V5LmxvYykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNpYmxpbmcuYnJhbmNoZXMucHVzaChicmFuY2gpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9uRXhpdCA9IHByb2Nlc3NDb2RlZ2VuICYmIHByb2Nlc3NDb2RlZ2VuKHNpYmxpbmcsIGJyYW5jaCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBicmFuY2ggd2FzIHJlbW92ZWQsIGl0IHdpbGwgbm90IGJlIHRyYXZlcnNlZC5cbiAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gdHJhdmVyc2UgaGVyZS5cbiAgICAgICAgICAgICAgICB0cmF2ZXJzZU5vZGUoYnJhbmNoLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAvLyBjYWxsIG9uIGV4aXRcbiAgICAgICAgICAgICAgICBpZiAob25FeGl0KVxuICAgICAgICAgICAgICAgICAgICBvbkV4aXQoKTtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gcmVzZXQgY3VycmVudE5vZGUgYWZ0ZXIgdHJhdmVyc2FsIHRvIGluZGljYXRlIHRoaXNcbiAgICAgICAgICAgICAgICAvLyBub2RlIGhhcyBiZWVuIHJlbW92ZWQuXG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50Tm9kZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0Lm9uRXJyb3IoY3JlYXRlQ29tcGlsZXJFcnJvcigzMCAvKiBFcnJvckNvZGVzLlhfVl9FTFNFX05PX0FESkFDRU5UX0lGICovLCBub2RlLmxvYykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVJZkJyYW5jaChub2RlLCBkaXIpIHtcbiAgICBjb25zdCBpc1RlbXBsYXRlSWYgPSBub2RlLnRhZ1R5cGUgPT09IDMgLyogRWxlbWVudFR5cGVzLlRFTVBMQVRFICovO1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IDEwIC8qIE5vZGVUeXBlcy5JRl9CUkFOQ0ggKi8sXG4gICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgIGNvbmRpdGlvbjogZGlyLm5hbWUgPT09ICdlbHNlJyA/IHVuZGVmaW5lZCA6IGRpci5leHAsXG4gICAgICAgIGNoaWxkcmVuOiBpc1RlbXBsYXRlSWYgJiYgIWZpbmREaXIobm9kZSwgJ2ZvcicpID8gbm9kZS5jaGlsZHJlbiA6IFtub2RlXSxcbiAgICAgICAgdXNlcktleTogZmluZFByb3Aobm9kZSwgYGtleWApLFxuICAgICAgICBpc1RlbXBsYXRlSWZcbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ29kZWdlbk5vZGVGb3JCcmFuY2goYnJhbmNoLCBrZXlJbmRleCwgY29udGV4dCkge1xuICAgIGlmIChicmFuY2guY29uZGl0aW9uKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oYnJhbmNoLmNvbmRpdGlvbiwgY3JlYXRlQ2hpbGRyZW5Db2RlZ2VuTm9kZShicmFuY2gsIGtleUluZGV4LCBjb250ZXh0KSwgXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0byBwYXNzIGluIGFzQmxvY2s6IHRydWUgc28gdGhhdCB0aGUgY29tbWVudCBub2RlIGNhbGxcbiAgICAgICAgLy8gY2xvc2VzIHRoZSBjdXJyZW50IGJsb2NrLlxuICAgICAgICBjcmVhdGVDYWxsRXhwcmVzc2lvbihjb250ZXh0LmhlbHBlcihDUkVBVEVfQ09NTUVOVCksIFtcbiAgICAgICAgICAgIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/ICdcInYtaWZcIicgOiAnXCJcIicsXG4gICAgICAgICAgICAndHJ1ZSdcbiAgICAgICAgXSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUNoaWxkcmVuQ29kZWdlbk5vZGUoYnJhbmNoLCBrZXlJbmRleCwgY29udGV4dCk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlQ2hpbGRyZW5Db2RlZ2VuTm9kZShicmFuY2gsIGtleUluZGV4LCBjb250ZXh0KSB7XG4gICAgY29uc3QgeyBoZWxwZXIgfSA9IGNvbnRleHQ7XG4gICAgY29uc3Qga2V5UHJvcGVydHkgPSBjcmVhdGVPYmplY3RQcm9wZXJ0eShga2V5YCwgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihgJHtrZXlJbmRleH1gLCBmYWxzZSwgbG9jU3R1YiwgMiAvKiBDb25zdGFudFR5cGVzLkNBTl9IT0lTVCAqLykpO1xuICAgIGNvbnN0IHsgY2hpbGRyZW4gfSA9IGJyYW5jaDtcbiAgICBjb25zdCBmaXJzdENoaWxkID0gY2hpbGRyZW5bMF07XG4gICAgY29uc3QgbmVlZEZyYWdtZW50V3JhcHBlciA9IGNoaWxkcmVuLmxlbmd0aCAhPT0gMSB8fCBmaXJzdENoaWxkLnR5cGUgIT09IDEgLyogTm9kZVR5cGVzLkVMRU1FTlQgKi87XG4gICAgaWYgKG5lZWRGcmFnbWVudFdyYXBwZXIpIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiBmaXJzdENoaWxkLnR5cGUgPT09IDExIC8qIE5vZGVUeXBlcy5GT1IgKi8pIHtcbiAgICAgICAgICAgIC8vIG9wdGltaXplIGF3YXkgbmVzdGVkIGZyYWdtZW50cyB3aGVuIGNoaWxkIGlzIGEgRm9yTm9kZVxuICAgICAgICAgICAgY29uc3Qgdm5vZGVDYWxsID0gZmlyc3RDaGlsZC5jb2RlZ2VuTm9kZTtcbiAgICAgICAgICAgIGluamVjdFByb3Aodm5vZGVDYWxsLCBrZXlQcm9wZXJ0eSwgY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdm5vZGVDYWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBhdGNoRmxhZyA9IDY0IC8qIFBhdGNoRmxhZ3MuU1RBQkxFX0ZSQUdNRU5UICovO1xuICAgICAgICAgICAgbGV0IHBhdGNoRmxhZ1RleHQgPSBQYXRjaEZsYWdOYW1lc1s2NCAvKiBQYXRjaEZsYWdzLlNUQUJMRV9GUkFHTUVOVCAqL107XG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgZnJhZ21lbnQgYWN0dWFsbHkgY29udGFpbnMgYSBzaW5nbGUgdmFsaWQgY2hpbGQgd2l0aFxuICAgICAgICAgICAgLy8gdGhlIHJlc3QgYmVpbmcgY29tbWVudHNcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiZcbiAgICAgICAgICAgICAgICAhYnJhbmNoLmlzVGVtcGxhdGVJZiAmJlxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLmZpbHRlcihjID0+IGMudHlwZSAhPT0gMyAvKiBOb2RlVHlwZXMuQ09NTUVOVCAqLykubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2hGbGFnIHw9IDIwNDggLyogUGF0Y2hGbGFncy5ERVZfUk9PVF9GUkFHTUVOVCAqLztcbiAgICAgICAgICAgICAgICBwYXRjaEZsYWdUZXh0ICs9IGAsICR7UGF0Y2hGbGFnTmFtZXNbMjA0OCAvKiBQYXRjaEZsYWdzLkRFVl9ST09UX0ZSQUdNRU5UICovXX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlQ2FsbChjb250ZXh0LCBoZWxwZXIoRlJBR01FTlQpLCBjcmVhdGVPYmplY3RFeHByZXNzaW9uKFtrZXlQcm9wZXJ0eV0pLCBjaGlsZHJlbiwgcGF0Y2hGbGFnICsgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGAgLyogJHtwYXRjaEZsYWdUZXh0fSAqL2AgOiBgYCksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlLCBmYWxzZSwgZmFsc2UgLyogaXNDb21wb25lbnQgKi8sIGJyYW5jaC5sb2MpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCByZXQgPSBmaXJzdENoaWxkLmNvZGVnZW5Ob2RlO1xuICAgICAgICBjb25zdCB2bm9kZUNhbGwgPSBnZXRNZW1vZWRWTm9kZUNhbGwocmV0KTtcbiAgICAgICAgLy8gQ2hhbmdlIGNyZWF0ZVZOb2RlIHRvIGNyZWF0ZUJsb2NrLlxuICAgICAgICBpZiAodm5vZGVDYWxsLnR5cGUgPT09IDEzIC8qIE5vZGVUeXBlcy5WTk9ERV9DQUxMICovKSB7XG4gICAgICAgICAgICBtYWtlQmxvY2sodm5vZGVDYWxsLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbmplY3QgYnJhbmNoIGtleVxuICAgICAgICBpbmplY3RQcm9wKHZub2RlQ2FsbCwga2V5UHJvcGVydHksIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzU2FtZUtleShhLCBiKSB7XG4gICAgaWYgKCFhIHx8IGEudHlwZSAhPT0gYi50eXBlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGEudHlwZSA9PT0gNiAvKiBOb2RlVHlwZXMuQVRUUklCVVRFICovKSB7XG4gICAgICAgIGlmIChhLnZhbHVlLmNvbnRlbnQgIT09IGIudmFsdWUuY29udGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBkaXJlY3RpdmVcbiAgICAgICAgY29uc3QgZXhwID0gYS5leHA7XG4gICAgICAgIGNvbnN0IGJyYW5jaEV4cCA9IGIuZXhwO1xuICAgICAgICBpZiAoZXhwLnR5cGUgIT09IGJyYW5jaEV4cC50eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cC50eXBlICE9PSA0IC8qIE5vZGVUeXBlcy5TSU1QTEVfRVhQUkVTU0lPTiAqLyB8fFxuICAgICAgICAgICAgZXhwLmlzU3RhdGljICE9PSBicmFuY2hFeHAuaXNTdGF0aWMgfHxcbiAgICAgICAgICAgIGV4cC5jb250ZW50ICE9PSBicmFuY2hFeHAuY29udGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZ2V0UGFyZW50Q29uZGl0aW9uKG5vZGUpIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAobm9kZS50eXBlID09PSAxOSAvKiBOb2RlVHlwZXMuSlNfQ09ORElUSU9OQUxfRVhQUkVTU0lPTiAqLykge1xuICAgICAgICAgICAgaWYgKG5vZGUuYWx0ZXJuYXRlLnR5cGUgPT09IDE5IC8qIE5vZGVUeXBlcy5KU19DT05ESVRJT05BTF9FWFBSRVNTSU9OICovKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuYWx0ZXJuYXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSAyMCAvKiBOb2RlVHlwZXMuSlNfQ0FDSEVfRVhQUkVTU0lPTiAqLykge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUudmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IHRyYW5zZm9ybUZvciA9IGNyZWF0ZVN0cnVjdHVyYWxEaXJlY3RpdmVUcmFuc2Zvcm0oJ2ZvcicsIChub2RlLCBkaXIsIGNvbnRleHQpID0+IHtcbiAgICBjb25zdCB7IGhlbHBlciwgcmVtb3ZlSGVscGVyIH0gPSBjb250ZXh0O1xuICAgIHJldHVybiBwcm9jZXNzRm9yKG5vZGUsIGRpciwgY29udGV4dCwgZm9yTm9kZSA9PiB7XG4gICAgICAgIC8vIGNyZWF0ZSB0aGUgbG9vcCByZW5kZXIgZnVuY3Rpb24gZXhwcmVzc2lvbiBub3csIGFuZCBhZGQgdGhlXG4gICAgICAgIC8vIGl0ZXJhdG9yIG9uIGV4aXQgYWZ0ZXIgYWxsIGNoaWxkcmVuIGhhdmUgYmVlbiB0cmF2ZXJzZWRcbiAgICAgICAgY29uc3QgcmVuZGVyRXhwID0gY3JlYXRlQ2FsbEV4cHJlc3Npb24oaGVscGVyKFJFTkRFUl9MSVNUKSwgW1xuICAgICAgICAgICAgZm9yTm9kZS5zb3VyY2VcbiAgICAgICAgXSk7XG4gICAgICAgIGNvbnN0IGlzVGVtcGxhdGUgPSBpc1RlbXBsYXRlTm9kZShub2RlKTtcbiAgICAgICAgY29uc3QgbWVtbyA9IGZpbmREaXIobm9kZSwgJ21lbW8nKTtcbiAgICAgICAgY29uc3Qga2V5UHJvcCA9IGZpbmRQcm9wKG5vZGUsIGBrZXlgKTtcbiAgICAgICAgY29uc3Qga2V5RXhwID0ga2V5UHJvcCAmJlxuICAgICAgICAgICAgKGtleVByb3AudHlwZSA9PT0gNiAvKiBOb2RlVHlwZXMuQVRUUklCVVRFICovXG4gICAgICAgICAgICAgICAgPyBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGtleVByb3AudmFsdWUuY29udGVudCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICA6IGtleVByb3AuZXhwKTtcbiAgICAgICAgY29uc3Qga2V5UHJvcGVydHkgPSBrZXlQcm9wID8gY3JlYXRlT2JqZWN0UHJvcGVydHkoYGtleWAsIGtleUV4cCkgOiBudWxsO1xuICAgICAgICBjb25zdCBpc1N0YWJsZUZyYWdtZW50ID0gZm9yTm9kZS5zb3VyY2UudHlwZSA9PT0gNCAvKiBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT04gKi8gJiZcbiAgICAgICAgICAgIGZvck5vZGUuc291cmNlLmNvbnN0VHlwZSA+IDAgLyogQ29uc3RhbnRUeXBlcy5OT1RfQ09OU1RBTlQgKi87XG4gICAgICAgIGNvbnN0IGZyYWdtZW50RmxhZyA9IGlzU3RhYmxlRnJhZ21lbnRcbiAgICAgICAgICAgID8gNjQgLyogUGF0Y2hGbGFncy5TVEFCTEVfRlJBR01FTlQgKi9cbiAgICAgICAgICAgIDoga2V5UHJvcFxuICAgICAgICAgICAgICAgID8gMTI4IC8qIFBhdGNoRmxhZ3MuS0VZRURfRlJBR01FTlQgKi9cbiAgICAgICAgICAgICAgICA6IDI1NiAvKiBQYXRjaEZsYWdzLlVOS0VZRURfRlJBR01FTlQgKi87XG4gICAgICAgIGZvck5vZGUuY29kZWdlbk5vZGUgPSBjcmVhdGVWTm9kZUNhbGwoY29udGV4dCwgaGVscGVyKEZSQUdNRU5UKSwgdW5kZWZpbmVkLCByZW5kZXJFeHAsIGZyYWdtZW50RmxhZyArXG4gICAgICAgICAgICAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYCAvKiAke1BhdGNoRmxhZ05hbWVzW2ZyYWdtZW50RmxhZ119ICovYCA6IGBgKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUgLyogaXNCbG9jayAqLywgIWlzU3RhYmxlRnJhZ21lbnQgLyogZGlzYWJsZVRyYWNraW5nICovLCBmYWxzZSAvKiBpc0NvbXBvbmVudCAqLywgbm9kZS5sb2MpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gZmluaXNoIHRoZSBjb2RlZ2VuIG5vdyB0aGF0IGFsbCBjaGlsZHJlbiBoYXZlIGJlZW4gdHJhdmVyc2VkXG4gICAgICAgICAgICBsZXQgY2hpbGRCbG9jaztcbiAgICAgICAgICAgIGNvbnN0IHsgY2hpbGRyZW4gfSA9IGZvck5vZGU7XG4gICAgICAgICAgICAvLyBjaGVjayA8dGVtcGxhdGUgdi1mb3I+IGtleSBwbGFjZW1lbnRcbiAgICAgICAgICAgIGlmICgoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHx8ICF0cnVlKSAmJiBpc1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5zb21lKGMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYy50eXBlID09PSAxIC8qIE5vZGVUeXBlcy5FTEVNRU5UICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBmaW5kUHJvcChjLCAna2V5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoMzMgLyogRXJyb3JDb2Rlcy5YX1ZfRk9SX1RFTVBMQVRFX0tFWV9QTEFDRU1FTlQgKi8sIGtleS5sb2MpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmVlZEZyYWdtZW50V3JhcHBlciA9IGNoaWxkcmVuLmxlbmd0aCAhPT0gMSB8fCBjaGlsZHJlblswXS50eXBlICE9PSAxIC8qIE5vZGVUeXBlcy5FTEVNRU5UICovO1xuICAgICAgICAgICAgY29uc3Qgc2xvdE91dGxldCA9IGlzU2xvdE91dGxldChub2RlKVxuICAgICAgICAgICAgICAgID8gbm9kZVxuICAgICAgICAgICAgICAgIDogaXNUZW1wbGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICBpc1Nsb3RPdXRsZXQobm9kZS5jaGlsZHJlblswXSlcbiAgICAgICAgICAgICAgICAgICAgPyBub2RlLmNoaWxkcmVuWzBdIC8vIGFwaS1leHRyYWN0b3Igc29tZWhvdyBmYWlscyB0byBpbmZlciB0aGlzXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIGlmIChzbG90T3V0bGV0KSB7XG4gICAgICAgICAgICAgICAgLy8gPHNsb3Qgdi1mb3I9XCIuLi5cIj4gb3IgPHRlbXBsYXRlIHYtZm9yPVwiLi4uXCI+PHNsb3QvPjwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgY2hpbGRCbG9jayA9IHNsb3RPdXRsZXQuY29kZWdlbk5vZGU7XG4gICAgICAgICAgICAgICAgaWYgKGlzVGVtcGxhdGUgJiYga2V5UHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gPHRlbXBsYXRlIHYtZm9yPVwiLi4uXCIgOmtleT1cIi4uLlwiPjxzbG90Lz48L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGluamVjdCB0aGUga2V5IHRvIHRoZSByZW5kZXJTbG90KCkgY2FsbC5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BzIGZvciByZW5kZXJTbG90IGlzIHBhc3NlZCBhcyB0aGUgM3JkIGFyZ3VtZW50LlxuICAgICAgICAgICAgICAgICAgICBpbmplY3RQcm9wKGNoaWxkQmxvY2ssIGtleVByb3BlcnR5LCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChuZWVkRnJhZ21lbnRXcmFwcGVyKSB7XG4gICAgICAgICAgICAgICAgLy8gPHRlbXBsYXRlIHYtZm9yPVwiLi4uXCI+IHdpdGggdGV4dCBvciBtdWx0aS1lbGVtZW50c1xuICAgICAgICAgICAgICAgIC8vIHNob3VsZCBnZW5lcmF0ZSBhIGZyYWdtZW50IGJsb2NrIGZvciBlYWNoIGxvb3BcbiAgICAgICAgICAgICAgICBjaGlsZEJsb2NrID0gY3JlYXRlVk5vZGVDYWxsKGNvbnRleHQsIGhlbHBlcihGUkFHTUVOVCksIGtleVByb3BlcnR5ID8gY3JlYXRlT2JqZWN0RXhwcmVzc2lvbihba2V5UHJvcGVydHldKSA6IHVuZGVmaW5lZCwgbm9kZS5jaGlsZHJlbiwgNjQgLyogUGF0Y2hGbGFncy5TVEFCTEVfRlJBR01FTlQgKi8gK1xuICAgICAgICAgICAgICAgICAgICAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGAgLyogJHtQYXRjaEZsYWdOYW1lc1s2NCAvKiBQYXRjaEZsYWdzLlNUQUJMRV9GUkFHTUVOVCAqL119ICovYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgYCksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlLCB1bmRlZmluZWQsIGZhbHNlIC8qIGlzQ29tcG9uZW50ICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5vcm1hbCBlbGVtZW50IHYtZm9yLiBEaXJlY3RseSB1c2UgdGhlIGNoaWxkJ3MgY29kZWdlbk5vZGVcbiAgICAgICAgICAgICAgICAvLyBidXQgbWFyayBpdCBhcyBhIGJsb2NrLlxuICAgICAgICAgICAgICAgIGNoaWxkQmxvY2sgPSBjaGlsZHJlblswXVxuICAgICAgICAgICAgICAgICAgICAuY29kZWdlbk5vZGU7XG4gICAgICAgICAgICAgICAgaWYgKGlzVGVtcGxhdGUgJiYga2V5UHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0UHJvcChjaGlsZEJsb2NrLCBrZXlQcm9wZXJ0eSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaGlsZEJsb2NrLmlzQmxvY2sgIT09ICFpc1N0YWJsZUZyYWdtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEJsb2NrLmlzQmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCBmcm9tIGJsb2NrIHRvIHZub2RlXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVIZWxwZXIoT1BFTl9CTE9DSyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVIZWxwZXIoZ2V0Vk5vZGVCbG9ja0hlbHBlcihjb250ZXh0LmluU1NSLCBjaGlsZEJsb2NrLmlzQ29tcG9uZW50KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzd2l0Y2ggZnJvbSB2bm9kZSB0byBibG9ja1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSGVscGVyKGdldFZOb2RlSGVscGVyKGNvbnRleHQuaW5TU1IsIGNoaWxkQmxvY2suaXNDb21wb25lbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGlsZEJsb2NrLmlzQmxvY2sgPSAhaXNTdGFibGVGcmFnbWVudDtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRCbG9jay5pc0Jsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlbHBlcihPUEVOX0JMT0NLKTtcbiAgICAgICAgICAgICAgICAgICAgaGVscGVyKGdldFZOb2RlQmxvY2tIZWxwZXIoY29udGV4dC5pblNTUiwgY2hpbGRCbG9jay5pc0NvbXBvbmVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaGVscGVyKGdldFZOb2RlSGVscGVyKGNvbnRleHQuaW5TU1IsIGNoaWxkQmxvY2suaXNDb21wb25lbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVtbykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvb3AgPSBjcmVhdGVGdW5jdGlvbkV4cHJlc3Npb24oY3JlYXRlRm9yTG9vcFBhcmFtcyhmb3JOb2RlLnBhcnNlUmVzdWx0LCBbXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYF9jYWNoZWRgKVxuICAgICAgICAgICAgICAgIF0pKTtcbiAgICAgICAgICAgICAgICBsb29wLmJvZHkgPSBjcmVhdGVCbG9ja1N0YXRlbWVudChbXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihbYGNvbnN0IF9tZW1vID0gKGAsIG1lbW8uZXhwLCBgKWBdKSxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ29tcG91bmRFeHByZXNzaW9uKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBpZiAoX2NhY2hlZGAsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4oa2V5RXhwID8gW2AgJiYgX2NhY2hlZC5rZXkgPT09IGAsIGtleUV4cF0gOiBbXSksXG4gICAgICAgICAgICAgICAgICAgICAgICBgICYmICR7Y29udGV4dC5oZWxwZXJTdHJpbmcoSVNfTUVNT19TQU1FKX0oX2NhY2hlZCwgX21lbW8pKSByZXR1cm4gX2NhY2hlZGBcbiAgICAgICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihbYGNvbnN0IF9pdGVtID0gYCwgY2hpbGRCbG9ja10pLFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGBfaXRlbS5tZW1vID0gX21lbW9gKSxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihgcmV0dXJuIF9pdGVtYClcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICByZW5kZXJFeHAuYXJndW1lbnRzLnB1c2gobG9vcCwgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihgX2NhY2hlYCksIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oU3RyaW5nKGNvbnRleHQuY2FjaGVkKyspKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZW5kZXJFeHAuYXJndW1lbnRzLnB1c2goY3JlYXRlRnVuY3Rpb25FeHByZXNzaW9uKGNyZWF0ZUZvckxvb3BQYXJhbXMoZm9yTm9kZS5wYXJzZVJlc3VsdCksIGNoaWxkQmxvY2ssIHRydWUgLyogZm9yY2UgbmV3bGluZSAqLykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xufSk7XG4vLyB0YXJnZXQtYWdub3N0aWMgdHJhbnNmb3JtIHVzZWQgZm9yIGJvdGggQ2xpZW50IGFuZCBTU1JcbmZ1bmN0aW9uIHByb2Nlc3NGb3Iobm9kZSwgZGlyLCBjb250ZXh0LCBwcm9jZXNzQ29kZWdlbikge1xuICAgIGlmICghZGlyLmV4cCkge1xuICAgICAgICBjb250ZXh0Lm9uRXJyb3IoY3JlYXRlQ29tcGlsZXJFcnJvcigzMSAvKiBFcnJvckNvZGVzLlhfVl9GT1JfTk9fRVhQUkVTU0lPTiAqLywgZGlyLmxvYykpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gcGFyc2VGb3JFeHByZXNzaW9uKFxuICAgIC8vIGNhbiBvbmx5IGJlIHNpbXBsZSBleHByZXNzaW9uIGJlY2F1c2UgdkZvciB0cmFuc2Zvcm0gaXMgYXBwbGllZFxuICAgIC8vIGJlZm9yZSBleHByZXNzaW9uIHRyYW5zZm9ybS5cbiAgICBkaXIuZXhwLCBjb250ZXh0KTtcbiAgICBpZiAoIXBhcnNlUmVzdWx0KSB7XG4gICAgICAgIGNvbnRleHQub25FcnJvcihjcmVhdGVDb21waWxlckVycm9yKDMyIC8qIEVycm9yQ29kZXMuWF9WX0ZPUl9NQUxGT1JNRURfRVhQUkVTU0lPTiAqLywgZGlyLmxvYykpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgYWRkSWRlbnRpZmllcnMsIHJlbW92ZUlkZW50aWZpZXJzLCBzY29wZXMgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgeyBzb3VyY2UsIHZhbHVlLCBrZXksIGluZGV4IH0gPSBwYXJzZVJlc3VsdDtcbiAgICBjb25zdCBmb3JOb2RlID0ge1xuICAgICAgICB0eXBlOiAxMSAvKiBOb2RlVHlwZXMuRk9SICovLFxuICAgICAgICBsb2M6IGRpci5sb2MsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgdmFsdWVBbGlhczogdmFsdWUsXG4gICAgICAgIGtleUFsaWFzOiBrZXksXG4gICAgICAgIG9iamVjdEluZGV4QWxpYXM6IGluZGV4LFxuICAgICAgICBwYXJzZVJlc3VsdCxcbiAgICAgICAgY2hpbGRyZW46IGlzVGVtcGxhdGVOb2RlKG5vZGUpID8gbm9kZS5jaGlsZHJlbiA6IFtub2RlXVxuICAgIH07XG4gICAgY29udGV4dC5yZXBsYWNlTm9kZShmb3JOb2RlKTtcbiAgICAvLyBib29ra2VlcGluZ1xuICAgIHNjb3Blcy52Rm9yKys7XG4gICAgY29uc3Qgb25FeGl0ID0gcHJvY2Vzc0NvZGVnZW4gJiYgcHJvY2Vzc0NvZGVnZW4oZm9yTm9kZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgc2NvcGVzLnZGb3ItLTtcbiAgICAgICAgaWYgKG9uRXhpdClcbiAgICAgICAgICAgIG9uRXhpdCgpO1xuICAgIH07XG59XG5jb25zdCBmb3JBbGlhc1JFID0gLyhbXFxzXFxTXSo/KVxccysoPzppbnxvZilcXHMrKFtcXHNcXFNdKikvO1xuLy8gVGhpcyByZWdleCBkb2Vzbid0IGNvdmVyIHRoZSBjYXNlIGlmIGtleSBvciBpbmRleCBhbGlhc2VzIGhhdmUgZGVzdHJ1Y3R1cmluZyxcbi8vIGJ1dCB0aG9zZSBkbyBub3QgbWFrZSBzZW5zZSBpbiB0aGUgZmlyc3QgcGxhY2UsIHNvIHRoaXMgd29ya3MgaW4gcHJhY3RpY2UuXG5jb25zdCBmb3JJdGVyYXRvclJFID0gLywoW14sXFx9XFxdXSopKD86LChbXixcXH1cXF1dKikpPyQvO1xuY29uc3Qgc3RyaXBQYXJlbnNSRSA9IC9eXFwofFxcKSQvZztcbmZ1bmN0aW9uIHBhcnNlRm9yRXhwcmVzc2lvbihpbnB1dCwgY29udGV4dCkge1xuICAgIGNvbnN0IGxvYyA9IGlucHV0LmxvYztcbiAgICBjb25zdCBleHAgPSBpbnB1dC5jb250ZW50O1xuICAgIGNvbnN0IGluTWF0Y2ggPSBleHAubWF0Y2goZm9yQWxpYXNSRSk7XG4gICAgaWYgKCFpbk1hdGNoKVxuICAgICAgICByZXR1cm47XG4gICAgY29uc3QgWywgTEhTLCBSSFNdID0gaW5NYXRjaDtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIHNvdXJjZTogY3JlYXRlQWxpYXNFeHByZXNzaW9uKGxvYywgUkhTLnRyaW0oKSwgZXhwLmluZGV4T2YoUkhTLCBMSFMubGVuZ3RoKSksXG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGtleTogdW5kZWZpbmVkLFxuICAgICAgICBpbmRleDogdW5kZWZpbmVkXG4gICAgfTtcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIHRydWUpIHtcbiAgICAgICAgdmFsaWRhdGVCcm93c2VyRXhwcmVzc2lvbihyZXN1bHQuc291cmNlLCBjb250ZXh0KTtcbiAgICB9XG4gICAgbGV0IHZhbHVlQ29udGVudCA9IExIUy50cmltKCkucmVwbGFjZShzdHJpcFBhcmVuc1JFLCAnJykudHJpbSgpO1xuICAgIGNvbnN0IHRyaW1tZWRPZmZzZXQgPSBMSFMuaW5kZXhPZih2YWx1ZUNvbnRlbnQpO1xuICAgIGNvbnN0IGl0ZXJhdG9yTWF0Y2ggPSB2YWx1ZUNvbnRlbnQubWF0Y2goZm9ySXRlcmF0b3JSRSk7XG4gICAgaWYgKGl0ZXJhdG9yTWF0Y2gpIHtcbiAgICAgICAgdmFsdWVDb250ZW50ID0gdmFsdWVDb250ZW50LnJlcGxhY2UoZm9ySXRlcmF0b3JSRSwgJycpLnRyaW0oKTtcbiAgICAgICAgY29uc3Qga2V5Q29udGVudCA9IGl0ZXJhdG9yTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgICBsZXQga2V5T2Zmc2V0O1xuICAgICAgICBpZiAoa2V5Q29udGVudCkge1xuICAgICAgICAgICAga2V5T2Zmc2V0ID0gZXhwLmluZGV4T2Yoa2V5Q29udGVudCwgdHJpbW1lZE9mZnNldCArIHZhbHVlQ29udGVudC5sZW5ndGgpO1xuICAgICAgICAgICAgcmVzdWx0LmtleSA9IGNyZWF0ZUFsaWFzRXhwcmVzc2lvbihsb2MsIGtleUNvbnRlbnQsIGtleU9mZnNldCk7XG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIHRydWUpIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUJyb3dzZXJFeHByZXNzaW9uKHJlc3VsdC5rZXksIGNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVyYXRvck1hdGNoWzJdKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleENvbnRlbnQgPSBpdGVyYXRvck1hdGNoWzJdLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChpbmRleENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuaW5kZXggPSBjcmVhdGVBbGlhc0V4cHJlc3Npb24obG9jLCBpbmRleENvbnRlbnQsIGV4cC5pbmRleE9mKGluZGV4Q29udGVudCwgcmVzdWx0LmtleVxuICAgICAgICAgICAgICAgICAgICA/IGtleU9mZnNldCArIGtleUNvbnRlbnQubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIDogdHJpbW1lZE9mZnNldCArIHZhbHVlQ29udGVudC5sZW5ndGgpKTtcbiAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVCcm93c2VyRXhwcmVzc2lvbihyZXN1bHQuaW5kZXgsIGNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFsdWVDb250ZW50KSB7XG4gICAgICAgIHJlc3VsdC52YWx1ZSA9IGNyZWF0ZUFsaWFzRXhwcmVzc2lvbihsb2MsIHZhbHVlQ29udGVudCwgdHJpbW1lZE9mZnNldCk7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgdHJ1ZSkge1xuICAgICAgICAgICAgdmFsaWRhdGVCcm93c2VyRXhwcmVzc2lvbihyZXN1bHQudmFsdWUsIGNvbnRleHQsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjcmVhdGVBbGlhc0V4cHJlc3Npb24ocmFuZ2UsIGNvbnRlbnQsIG9mZnNldCkge1xuICAgIHJldHVybiBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGNvbnRlbnQsIGZhbHNlLCBnZXRJbm5lclJhbmdlKHJhbmdlLCBvZmZzZXQsIGNvbnRlbnQubGVuZ3RoKSk7XG59XG5mdW5jdGlvbiBjcmVhdGVGb3JMb29wUGFyYW1zKHsgdmFsdWUsIGtleSwgaW5kZXggfSwgbWVtb0FyZ3MgPSBbXSkge1xuICAgIHJldHVybiBjcmVhdGVQYXJhbXNMaXN0KFt2YWx1ZSwga2V5LCBpbmRleCwgLi4ubWVtb0FyZ3NdKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhcmFtc0xpc3QoYXJncykge1xuICAgIGxldCBpID0gYXJncy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICBpZiAoYXJnc1tpXSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gYXJnc1xuICAgICAgICAuc2xpY2UoMCwgaSArIDEpXG4gICAgICAgIC5tYXAoKGFyZywgaSkgPT4gYXJnIHx8IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYF9gLnJlcGVhdChpICsgMSksIGZhbHNlKSk7XG59XG5cbmNvbnN0IGRlZmF1bHRGYWxsYmFjayA9IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYHVuZGVmaW5lZGAsIGZhbHNlKTtcbi8vIEEgTm9kZVRyYW5zZm9ybSB0aGF0OlxuLy8gMS4gVHJhY2tzIHNjb3BlIGlkZW50aWZpZXJzIGZvciBzY29wZWQgc2xvdHMgc28gdGhhdCB0aGV5IGRvbid0IGdldCBwcmVmaXhlZFxuLy8gICAgYnkgdHJhbnNmb3JtRXhwcmVzc2lvbi4gVGhpcyBpcyBvbmx5IGFwcGxpZWQgaW4gbm9uLWJyb3dzZXIgYnVpbGRzIHdpdGhcbi8vICAgIHsgcHJlZml4SWRlbnRpZmllcnM6IHRydWUgfS5cbi8vIDIuIFRyYWNrIHYtc2xvdCBkZXB0aHMgc28gdGhhdCB3ZSBrbm93IGEgc2xvdCBpcyBpbnNpZGUgYW5vdGhlciBzbG90LlxuLy8gICAgTm90ZSB0aGUgZXhpdCBjYWxsYmFjayBpcyBleGVjdXRlZCBiZWZvcmUgYnVpbGRTbG90cygpIG9uIHRoZSBzYW1lIG5vZGUsXG4vLyAgICBzbyBvbmx5IG5lc3RlZCBzbG90cyBzZWUgcG9zaXRpdmUgbnVtYmVycy5cbmNvbnN0IHRyYWNrU2xvdFNjb3BlcyA9IChub2RlLCBjb250ZXh0KSA9PiB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gMSAvKiBOb2RlVHlwZXMuRUxFTUVOVCAqLyAmJlxuICAgICAgICAobm9kZS50YWdUeXBlID09PSAxIC8qIEVsZW1lbnRUeXBlcy5DT01QT05FTlQgKi8gfHxcbiAgICAgICAgICAgIG5vZGUudGFnVHlwZSA9PT0gMyAvKiBFbGVtZW50VHlwZXMuVEVNUExBVEUgKi8pKSB7XG4gICAgICAgIC8vIFdlIGFyZSBvbmx5IGNoZWNraW5nIG5vbi1lbXB0eSB2LXNsb3QgaGVyZVxuICAgICAgICAvLyBzaW5jZSB3ZSBvbmx5IGNhcmUgYWJvdXQgc2xvdHMgdGhhdCBpbnRyb2R1Y2Ugc2NvcGUgdmFyaWFibGVzLlxuICAgICAgICBjb25zdCB2U2xvdCA9IGZpbmREaXIobm9kZSwgJ3Nsb3QnKTtcbiAgICAgICAgaWYgKHZTbG90KSB7XG4gICAgICAgICAgICB2U2xvdC5leHA7XG4gICAgICAgICAgICBjb250ZXh0LnNjb3Blcy52U2xvdCsrO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnNjb3Blcy52U2xvdC0tO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4vLyBBIE5vZGVUcmFuc2Zvcm0gdGhhdCB0cmFja3Mgc2NvcGUgaWRlbnRpZmllcnMgZm9yIHNjb3BlZCBzbG90cyB3aXRoIHYtZm9yLlxuLy8gVGhpcyB0cmFuc2Zvcm0gaXMgb25seSBhcHBsaWVkIGluIG5vbi1icm93c2VyIGJ1aWxkcyB3aXRoIHsgcHJlZml4SWRlbnRpZmllcnM6IHRydWUgfVxuY29uc3QgdHJhY2tWRm9yU2xvdFNjb3BlcyA9IChub2RlLCBjb250ZXh0KSA9PiB7XG4gICAgbGV0IHZGb3I7XG4gICAgaWYgKGlzVGVtcGxhdGVOb2RlKG5vZGUpICYmXG4gICAgICAgIG5vZGUucHJvcHMuc29tZShpc1ZTbG90KSAmJlxuICAgICAgICAodkZvciA9IGZpbmREaXIobm9kZSwgJ2ZvcicpKSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSAodkZvci5wYXJzZVJlc3VsdCA9IHBhcnNlRm9yRXhwcmVzc2lvbih2Rm9yLmV4cCwgY29udGV4dCkpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBrZXksIGluZGV4IH0gPSByZXN1bHQ7XG4gICAgICAgICAgICBjb25zdCB7IGFkZElkZW50aWZpZXJzLCByZW1vdmVJZGVudGlmaWVycyB9ID0gY29udGV4dDtcbiAgICAgICAgICAgIHZhbHVlICYmIGFkZElkZW50aWZpZXJzKHZhbHVlKTtcbiAgICAgICAgICAgIGtleSAmJiBhZGRJZGVudGlmaWVycyhrZXkpO1xuICAgICAgICAgICAgaW5kZXggJiYgYWRkSWRlbnRpZmllcnMoaW5kZXgpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICB2YWx1ZSAmJiByZW1vdmVJZGVudGlmaWVycyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAga2V5ICYmIHJlbW92ZUlkZW50aWZpZXJzKGtleSk7XG4gICAgICAgICAgICAgICAgaW5kZXggJiYgcmVtb3ZlSWRlbnRpZmllcnMoaW5kZXgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5jb25zdCBidWlsZENsaWVudFNsb3RGbiA9IChwcm9wcywgY2hpbGRyZW4sIGxvYykgPT4gY3JlYXRlRnVuY3Rpb25FeHByZXNzaW9uKHByb3BzLCBjaGlsZHJlbiwgZmFsc2UgLyogbmV3bGluZSAqLywgdHJ1ZSAvKiBpc1Nsb3QgKi8sIGNoaWxkcmVuLmxlbmd0aCA/IGNoaWxkcmVuWzBdLmxvYyA6IGxvYyk7XG4vLyBJbnN0ZWFkIG9mIGJlaW5nIGEgRGlyZWN0aXZlVHJhbnNmb3JtLCB2LXNsb3QgcHJvY2Vzc2luZyBpcyBjYWxsZWQgZHVyaW5nXG4vLyB0cmFuc2Zvcm1FbGVtZW50IHRvIGJ1aWxkIHRoZSBzbG90cyBvYmplY3QgZm9yIGEgY29tcG9uZW50LlxuZnVuY3Rpb24gYnVpbGRTbG90cyhub2RlLCBjb250ZXh0LCBidWlsZFNsb3RGbiA9IGJ1aWxkQ2xpZW50U2xvdEZuKSB7XG4gICAgY29udGV4dC5oZWxwZXIoV0lUSF9DVFgpO1xuICAgIGNvbnN0IHsgY2hpbGRyZW4sIGxvYyB9ID0gbm9kZTtcbiAgICBjb25zdCBzbG90c1Byb3BlcnRpZXMgPSBbXTtcbiAgICBjb25zdCBkeW5hbWljU2xvdHMgPSBbXTtcbiAgICAvLyBJZiB0aGUgc2xvdCBpcyBpbnNpZGUgYSB2LWZvciBvciBhbm90aGVyIHYtc2xvdCwgZm9yY2UgaXQgdG8gYmUgZHluYW1pY1xuICAgIC8vIHNpbmNlIGl0IGxpa2VseSB1c2VzIGEgc2NvcGUgdmFyaWFibGUuXG4gICAgbGV0IGhhc0R5bmFtaWNTbG90cyA9IGNvbnRleHQuc2NvcGVzLnZTbG90ID4gMCB8fCBjb250ZXh0LnNjb3Blcy52Rm9yID4gMDtcbiAgICAvLyAxLiBDaGVjayBmb3Igc2xvdCB3aXRoIHNsb3RQcm9wcyBvbiBjb21wb25lbnQgaXRzZWxmLlxuICAgIC8vICAgIDxDb21wIHYtc2xvdD1cInsgcHJvcCB9XCIvPlxuICAgIGNvbnN0IG9uQ29tcG9uZW50U2xvdCA9IGZpbmREaXIobm9kZSwgJ3Nsb3QnLCB0cnVlKTtcbiAgICBpZiAob25Db21wb25lbnRTbG90KSB7XG4gICAgICAgIGNvbnN0IHsgYXJnLCBleHAgfSA9IG9uQ29tcG9uZW50U2xvdDtcbiAgICAgICAgaWYgKGFyZyAmJiAhaXNTdGF0aWNFeHAoYXJnKSkge1xuICAgICAgICAgICAgaGFzRHluYW1pY1Nsb3RzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBzbG90c1Byb3BlcnRpZXMucHVzaChjcmVhdGVPYmplY3RQcm9wZXJ0eShhcmcgfHwgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbignZGVmYXVsdCcsIHRydWUpLCBidWlsZFNsb3RGbihleHAsIGNoaWxkcmVuLCBsb2MpKSk7XG4gICAgfVxuICAgIC8vIDIuIEl0ZXJhdGUgdGhyb3VnaCBjaGlsZHJlbiBhbmQgY2hlY2sgZm9yIHRlbXBsYXRlIHNsb3RzXG4gICAgLy8gICAgPHRlbXBsYXRlIHYtc2xvdDpmb289XCJ7IHByb3AgfVwiPlxuICAgIGxldCBoYXNUZW1wbGF0ZVNsb3RzID0gZmFsc2U7XG4gICAgbGV0IGhhc05hbWVkRGVmYXVsdFNsb3QgPSBmYWxzZTtcbiAgICBjb25zdCBpbXBsaWNpdERlZmF1bHRDaGlsZHJlbiA9IFtdO1xuICAgIGNvbnN0IHNlZW5TbG90TmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgbGV0IGNvbmRpdGlvbmFsQnJhbmNoSW5kZXggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc2xvdEVsZW1lbnQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgbGV0IHNsb3REaXI7XG4gICAgICAgIGlmICghaXNUZW1wbGF0ZU5vZGUoc2xvdEVsZW1lbnQpIHx8XG4gICAgICAgICAgICAhKHNsb3REaXIgPSBmaW5kRGlyKHNsb3RFbGVtZW50LCAnc2xvdCcsIHRydWUpKSkge1xuICAgICAgICAgICAgLy8gbm90IGEgPHRlbXBsYXRlIHYtc2xvdD4sIHNraXAuXG4gICAgICAgICAgICBpZiAoc2xvdEVsZW1lbnQudHlwZSAhPT0gMyAvKiBOb2RlVHlwZXMuQ09NTUVOVCAqLykge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0RGVmYXVsdENoaWxkcmVuLnB1c2goc2xvdEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uQ29tcG9uZW50U2xvdCkge1xuICAgICAgICAgICAgLy8gYWxyZWFkeSBoYXMgb24tY29tcG9uZW50IHNsb3QgLSB0aGlzIGlzIGluY29ycmVjdCB1c2FnZS5cbiAgICAgICAgICAgIGNvbnRleHQub25FcnJvcihjcmVhdGVDb21waWxlckVycm9yKDM3IC8qIEVycm9yQ29kZXMuWF9WX1NMT1RfTUlYRURfU0xPVF9VU0FHRSAqLywgc2xvdERpci5sb2MpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGhhc1RlbXBsYXRlU2xvdHMgPSB0cnVlO1xuICAgICAgICBjb25zdCB7IGNoaWxkcmVuOiBzbG90Q2hpbGRyZW4sIGxvYzogc2xvdExvYyB9ID0gc2xvdEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHsgYXJnOiBzbG90TmFtZSA9IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYGRlZmF1bHRgLCB0cnVlKSwgZXhwOiBzbG90UHJvcHMsIGxvYzogZGlyTG9jIH0gPSBzbG90RGlyO1xuICAgICAgICAvLyBjaGVjayBpZiBuYW1lIGlzIGR5bmFtaWMuXG4gICAgICAgIGxldCBzdGF0aWNTbG90TmFtZTtcbiAgICAgICAgaWYgKGlzU3RhdGljRXhwKHNsb3ROYW1lKSkge1xuICAgICAgICAgICAgc3RhdGljU2xvdE5hbWUgPSBzbG90TmFtZSA/IHNsb3ROYW1lLmNvbnRlbnQgOiBgZGVmYXVsdGA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYXNEeW5hbWljU2xvdHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNsb3RGdW5jdGlvbiA9IGJ1aWxkU2xvdEZuKHNsb3RQcm9wcywgc2xvdENoaWxkcmVuLCBzbG90TG9jKTtcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBzbG90IGlzIGNvbmRpdGlvbmFsICh2LWlmL3YtZm9yKVxuICAgICAgICBsZXQgdklmO1xuICAgICAgICBsZXQgdkVsc2U7XG4gICAgICAgIGxldCB2Rm9yO1xuICAgICAgICBpZiAoKHZJZiA9IGZpbmREaXIoc2xvdEVsZW1lbnQsICdpZicpKSkge1xuICAgICAgICAgICAgaGFzRHluYW1pY1Nsb3RzID0gdHJ1ZTtcbiAgICAgICAgICAgIGR5bmFtaWNTbG90cy5wdXNoKGNyZWF0ZUNvbmRpdGlvbmFsRXhwcmVzc2lvbih2SWYuZXhwLCBidWlsZER5bmFtaWNTbG90KHNsb3ROYW1lLCBzbG90RnVuY3Rpb24sIGNvbmRpdGlvbmFsQnJhbmNoSW5kZXgrKyksIGRlZmF1bHRGYWxsYmFjaykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCh2RWxzZSA9IGZpbmREaXIoc2xvdEVsZW1lbnQsIC9eZWxzZSgtaWYpPyQvLCB0cnVlIC8qIGFsbG93RW1wdHkgKi8pKSkge1xuICAgICAgICAgICAgLy8gZmluZCBhZGphY2VudCB2LWlmXG4gICAgICAgICAgICBsZXQgaiA9IGk7XG4gICAgICAgICAgICBsZXQgcHJldjtcbiAgICAgICAgICAgIHdoaWxlIChqLS0pIHtcbiAgICAgICAgICAgICAgICBwcmV2ID0gY2hpbGRyZW5bal07XG4gICAgICAgICAgICAgICAgaWYgKHByZXYudHlwZSAhPT0gMyAvKiBOb2RlVHlwZXMuQ09NTUVOVCAqLykge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJldiAmJiBpc1RlbXBsYXRlTm9kZShwcmV2KSAmJiBmaW5kRGlyKHByZXYsICdpZicpKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG5vZGVcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgIC8vIGF0dGFjaCB0aGlzIHNsb3QgdG8gcHJldmlvdXMgY29uZGl0aW9uYWxcbiAgICAgICAgICAgICAgICBsZXQgY29uZGl0aW9uYWwgPSBkeW5hbWljU2xvdHNbZHluYW1pY1Nsb3RzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjb25kaXRpb25hbC5hbHRlcm5hdGUudHlwZSA9PT0gMTkgLyogTm9kZVR5cGVzLkpTX0NPTkRJVElPTkFMX0VYUFJFU1NJT04gKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWwgPSBjb25kaXRpb25hbC5hbHRlcm5hdGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsLmFsdGVybmF0ZSA9IHZFbHNlLmV4cFxuICAgICAgICAgICAgICAgICAgICA/IGNyZWF0ZUNvbmRpdGlvbmFsRXhwcmVzc2lvbih2RWxzZS5leHAsIGJ1aWxkRHluYW1pY1Nsb3Qoc2xvdE5hbWUsIHNsb3RGdW5jdGlvbiwgY29uZGl0aW9uYWxCcmFuY2hJbmRleCsrKSwgZGVmYXVsdEZhbGxiYWNrKVxuICAgICAgICAgICAgICAgICAgICA6IGJ1aWxkRHluYW1pY1Nsb3Qoc2xvdE5hbWUsIHNsb3RGdW5jdGlvbiwgY29uZGl0aW9uYWxCcmFuY2hJbmRleCsrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRleHQub25FcnJvcihjcmVhdGVDb21waWxlckVycm9yKDMwIC8qIEVycm9yQ29kZXMuWF9WX0VMU0VfTk9fQURKQUNFTlRfSUYgKi8sIHZFbHNlLmxvYykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCh2Rm9yID0gZmluZERpcihzbG90RWxlbWVudCwgJ2ZvcicpKSkge1xuICAgICAgICAgICAgaGFzRHluYW1pY1Nsb3RzID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gdkZvci5wYXJzZVJlc3VsdCB8fFxuICAgICAgICAgICAgICAgIHBhcnNlRm9yRXhwcmVzc2lvbih2Rm9yLmV4cCwgY29udGV4dCk7XG4gICAgICAgICAgICBpZiAocGFyc2VSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAvLyBSZW5kZXIgdGhlIGR5bmFtaWMgc2xvdHMgYXMgYW4gYXJyYXkgYW5kIGFkZCBpdCB0byB0aGUgY3JlYXRlU2xvdCgpXG4gICAgICAgICAgICAgICAgLy8gYXJncy4gVGhlIHJ1bnRpbWUga25vd3MgaG93IHRvIGhhbmRsZSBpdCBhcHByb3ByaWF0ZWx5LlxuICAgICAgICAgICAgICAgIGR5bmFtaWNTbG90cy5wdXNoKGNyZWF0ZUNhbGxFeHByZXNzaW9uKGNvbnRleHQuaGVscGVyKFJFTkRFUl9MSVNUKSwgW1xuICAgICAgICAgICAgICAgICAgICBwYXJzZVJlc3VsdC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZ1bmN0aW9uRXhwcmVzc2lvbihjcmVhdGVGb3JMb29wUGFyYW1zKHBhcnNlUmVzdWx0KSwgYnVpbGREeW5hbWljU2xvdChzbG90TmFtZSwgc2xvdEZ1bmN0aW9uKSwgdHJ1ZSAvKiBmb3JjZSBuZXdsaW5lICovKVxuICAgICAgICAgICAgICAgIF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRleHQub25FcnJvcihjcmVhdGVDb21waWxlckVycm9yKDMyIC8qIEVycm9yQ29kZXMuWF9WX0ZPUl9NQUxGT1JNRURfRVhQUkVTU0lPTiAqLywgdkZvci5sb2MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGR1cGxpY2F0ZSBzdGF0aWMgbmFtZXNcbiAgICAgICAgICAgIGlmIChzdGF0aWNTbG90TmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWVuU2xvdE5hbWVzLmhhcyhzdGF0aWNTbG90TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoMzggLyogRXJyb3JDb2Rlcy5YX1ZfU0xPVF9EVVBMSUNBVEVfU0xPVF9OQU1FUyAqLywgZGlyTG9jKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZWVuU2xvdE5hbWVzLmFkZChzdGF0aWNTbG90TmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRpY1Nsb3ROYW1lID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzTmFtZWREZWZhdWx0U2xvdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2xvdHNQcm9wZXJ0aWVzLnB1c2goY3JlYXRlT2JqZWN0UHJvcGVydHkoc2xvdE5hbWUsIHNsb3RGdW5jdGlvbikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghb25Db21wb25lbnRTbG90KSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkRGVmYXVsdFNsb3RQcm9wZXJ0eSA9IChwcm9wcywgY2hpbGRyZW4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZuID0gYnVpbGRTbG90Rm4ocHJvcHMsIGNoaWxkcmVuLCBsb2MpO1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuY29tcGF0Q29uZmlnKSB7XG4gICAgICAgICAgICAgICAgZm4uaXNOb25TY29wZWRTbG90ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVPYmplY3RQcm9wZXJ0eShgZGVmYXVsdGAsIGZuKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFoYXNUZW1wbGF0ZVNsb3RzKSB7XG4gICAgICAgICAgICAvLyBpbXBsaWNpdCBkZWZhdWx0IHNsb3QgKG9uIGNvbXBvbmVudClcbiAgICAgICAgICAgIHNsb3RzUHJvcGVydGllcy5wdXNoKGJ1aWxkRGVmYXVsdFNsb3RQcm9wZXJ0eSh1bmRlZmluZWQsIGNoaWxkcmVuKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW1wbGljaXREZWZhdWx0Q2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAgICAgICAvLyAjMzc2NlxuICAgICAgICAgICAgLy8gd2l0aCB3aGl0ZXNwYWNlOiAncHJlc2VydmUnLCB3aGl0ZXNwYWNlcyBiZXR3ZWVuIHNsb3RzIHdpbGwgZW5kIHVwIGluXG4gICAgICAgICAgICAvLyBpbXBsaWNpdERlZmF1bHRDaGlsZHJlbi4gSWdub3JlIGlmIGFsbCBpbXBsaWNpdCBjaGlsZHJlbiBhcmUgd2hpdGVzcGFjZXMuXG4gICAgICAgICAgICBpbXBsaWNpdERlZmF1bHRDaGlsZHJlbi5zb21lKG5vZGUgPT4gaXNOb25XaGl0ZXNwYWNlQ29udGVudChub2RlKSkpIHtcbiAgICAgICAgICAgIC8vIGltcGxpY2l0IGRlZmF1bHQgc2xvdCAobWl4ZWQgd2l0aCBuYW1lZCBzbG90cylcbiAgICAgICAgICAgIGlmIChoYXNOYW1lZERlZmF1bHRTbG90KSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoMzkgLyogRXJyb3JDb2Rlcy5YX1ZfU0xPVF9FWFRSQU5FT1VTX0RFRkFVTFRfU0xPVF9DSElMRFJFTiAqLywgaW1wbGljaXREZWZhdWx0Q2hpbGRyZW5bMF0ubG9jKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzbG90c1Byb3BlcnRpZXMucHVzaChidWlsZERlZmF1bHRTbG90UHJvcGVydHkodW5kZWZpbmVkLCBpbXBsaWNpdERlZmF1bHRDaGlsZHJlbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNsb3RGbGFnID0gaGFzRHluYW1pY1Nsb3RzXG4gICAgICAgID8gMiAvKiBTbG90RmxhZ3MuRFlOQU1JQyAqL1xuICAgICAgICA6IGhhc0ZvcndhcmRlZFNsb3RzKG5vZGUuY2hpbGRyZW4pXG4gICAgICAgICAgICA/IDMgLyogU2xvdEZsYWdzLkZPUldBUkRFRCAqL1xuICAgICAgICAgICAgOiAxIC8qIFNsb3RGbGFncy5TVEFCTEUgKi87XG4gICAgbGV0IHNsb3RzID0gY3JlYXRlT2JqZWN0RXhwcmVzc2lvbihzbG90c1Byb3BlcnRpZXMuY29uY2F0KGNyZWF0ZU9iamVjdFByb3BlcnR5KGBfYCwgXG4gICAgLy8gMiA9IGNvbXBpbGVkIGJ1dCBkeW5hbWljID0gY2FuIHNraXAgbm9ybWFsaXphdGlvbiwgYnV0IG11c3QgcnVuIGRpZmZcbiAgICAvLyAxID0gY29tcGlsZWQgYW5kIHN0YXRpYyA9IGNhbiBza2lwIG5vcm1hbGl6YXRpb24gQU5EIGRpZmYgYXMgb3B0aW1pemVkXG4gICAgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihzbG90RmxhZyArICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBgIC8qICR7c2xvdEZsYWdzVGV4dFtzbG90RmxhZ119ICovYCA6IGBgKSwgZmFsc2UpKSksIGxvYyk7XG4gICAgaWYgKGR5bmFtaWNTbG90cy5sZW5ndGgpIHtcbiAgICAgICAgc2xvdHMgPSBjcmVhdGVDYWxsRXhwcmVzc2lvbihjb250ZXh0LmhlbHBlcihDUkVBVEVfU0xPVFMpLCBbXG4gICAgICAgICAgICBzbG90cyxcbiAgICAgICAgICAgIGNyZWF0ZUFycmF5RXhwcmVzc2lvbihkeW5hbWljU2xvdHMpXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzbG90cyxcbiAgICAgICAgaGFzRHluYW1pY1Nsb3RzXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRHluYW1pY1Nsb3QobmFtZSwgZm4sIGluZGV4KSB7XG4gICAgY29uc3QgcHJvcHMgPSBbXG4gICAgICAgIGNyZWF0ZU9iamVjdFByb3BlcnR5KGBuYW1lYCwgbmFtZSksXG4gICAgICAgIGNyZWF0ZU9iamVjdFByb3BlcnR5KGBmbmAsIGZuKVxuICAgIF07XG4gICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgcHJvcHMucHVzaChjcmVhdGVPYmplY3RQcm9wZXJ0eShga2V5YCwgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihTdHJpbmcoaW5kZXgpLCB0cnVlKSkpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlT2JqZWN0RXhwcmVzc2lvbihwcm9wcyk7XG59XG5mdW5jdGlvbiBoYXNGb3J3YXJkZWRTbG90cyhjaGlsZHJlbikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgc3dpdGNoIChjaGlsZC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDEgLyogTm9kZVR5cGVzLkVMRU1FTlQgKi86XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLnRhZ1R5cGUgPT09IDIgLyogRWxlbWVudFR5cGVzLlNMT1QgKi8gfHxcbiAgICAgICAgICAgICAgICAgICAgaGFzRm9yd2FyZGVkU2xvdHMoY2hpbGQuY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgOSAvKiBOb2RlVHlwZXMuSUYgKi86XG4gICAgICAgICAgICAgICAgaWYgKGhhc0ZvcndhcmRlZFNsb3RzKGNoaWxkLmJyYW5jaGVzKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDEwIC8qIE5vZGVUeXBlcy5JRl9CUkFOQ0ggKi86XG4gICAgICAgICAgICBjYXNlIDExIC8qIE5vZGVUeXBlcy5GT1IgKi86XG4gICAgICAgICAgICAgICAgaWYgKGhhc0ZvcndhcmRlZFNsb3RzKGNoaWxkLmNoaWxkcmVuKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNOb25XaGl0ZXNwYWNlQ29udGVudChub2RlKSB7XG4gICAgaWYgKG5vZGUudHlwZSAhPT0gMiAvKiBOb2RlVHlwZXMuVEVYVCAqLyAmJiBub2RlLnR5cGUgIT09IDEyIC8qIE5vZGVUeXBlcy5URVhUX0NBTEwgKi8pXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09IDIgLyogTm9kZVR5cGVzLlRFWFQgKi9cbiAgICAgICAgPyAhIW5vZGUuY29udGVudC50cmltKClcbiAgICAgICAgOiBpc05vbldoaXRlc3BhY2VDb250ZW50KG5vZGUuY29udGVudCk7XG59XG5cbi8vIHNvbWUgZGlyZWN0aXZlIHRyYW5zZm9ybXMgKGUuZy4gdi1tb2RlbCkgbWF5IHJldHVybiBhIHN5bWJvbCBmb3IgcnVudGltZVxuLy8gaW1wb3J0LCB3aGljaCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGEgcmVzb2x2ZURpcmVjdGl2ZSBjYWxsLlxuY29uc3QgZGlyZWN0aXZlSW1wb3J0TWFwID0gbmV3IFdlYWtNYXAoKTtcbi8vIGdlbmVyYXRlIGEgSmF2YVNjcmlwdCBBU1QgZm9yIHRoaXMgZWxlbWVudCdzIGNvZGVnZW5cbmNvbnN0IHRyYW5zZm9ybUVsZW1lbnQgPSAobm9kZSwgY29udGV4dCkgPT4ge1xuICAgIC8vIHBlcmZvcm0gdGhlIHdvcmsgb24gZXhpdCwgYWZ0ZXIgYWxsIGNoaWxkIGV4cHJlc3Npb25zIGhhdmUgYmVlblxuICAgIC8vIHByb2Nlc3NlZCBhbmQgbWVyZ2VkLlxuICAgIHJldHVybiBmdW5jdGlvbiBwb3N0VHJhbnNmb3JtRWxlbWVudCgpIHtcbiAgICAgICAgbm9kZSA9IGNvbnRleHQuY3VycmVudE5vZGU7XG4gICAgICAgIGlmICghKG5vZGUudHlwZSA9PT0gMSAvKiBOb2RlVHlwZXMuRUxFTUVOVCAqLyAmJlxuICAgICAgICAgICAgKG5vZGUudGFnVHlwZSA9PT0gMCAvKiBFbGVtZW50VHlwZXMuRUxFTUVOVCAqLyB8fFxuICAgICAgICAgICAgICAgIG5vZGUudGFnVHlwZSA9PT0gMSAvKiBFbGVtZW50VHlwZXMuQ09NUE9ORU5UICovKSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHRhZywgcHJvcHMgfSA9IG5vZGU7XG4gICAgICAgIGNvbnN0IGlzQ29tcG9uZW50ID0gbm9kZS50YWdUeXBlID09PSAxIC8qIEVsZW1lbnRUeXBlcy5DT01QT05FTlQgKi87XG4gICAgICAgIC8vIFRoZSBnb2FsIG9mIHRoZSB0cmFuc2Zvcm0gaXMgdG8gY3JlYXRlIGEgY29kZWdlbk5vZGUgaW1wbGVtZW50aW5nIHRoZVxuICAgICAgICAvLyBWTm9kZUNhbGwgaW50ZXJmYWNlLlxuICAgICAgICBsZXQgdm5vZGVUYWcgPSBpc0NvbXBvbmVudFxuICAgICAgICAgICAgPyByZXNvbHZlQ29tcG9uZW50VHlwZShub2RlLCBjb250ZXh0KVxuICAgICAgICAgICAgOiBgXCIke3RhZ31cImA7XG4gICAgICAgIGNvbnN0IGlzRHluYW1pY0NvbXBvbmVudCA9IGlzT2JqZWN0KHZub2RlVGFnKSAmJiB2bm9kZVRhZy5jYWxsZWUgPT09IFJFU09MVkVfRFlOQU1JQ19DT01QT05FTlQ7XG4gICAgICAgIGxldCB2bm9kZVByb3BzO1xuICAgICAgICBsZXQgdm5vZGVDaGlsZHJlbjtcbiAgICAgICAgbGV0IHZub2RlUGF0Y2hGbGFnO1xuICAgICAgICBsZXQgcGF0Y2hGbGFnID0gMDtcbiAgICAgICAgbGV0IHZub2RlRHluYW1pY1Byb3BzO1xuICAgICAgICBsZXQgZHluYW1pY1Byb3BOYW1lcztcbiAgICAgICAgbGV0IHZub2RlRGlyZWN0aXZlcztcbiAgICAgICAgbGV0IHNob3VsZFVzZUJsb2NrID0gXG4gICAgICAgIC8vIGR5bmFtaWMgY29tcG9uZW50IG1heSByZXNvbHZlIHRvIHBsYWluIGVsZW1lbnRzXG4gICAgICAgIGlzRHluYW1pY0NvbXBvbmVudCB8fFxuICAgICAgICAgICAgdm5vZGVUYWcgPT09IFRFTEVQT1JUIHx8XG4gICAgICAgICAgICB2bm9kZVRhZyA9PT0gU1VTUEVOU0UgfHxcbiAgICAgICAgICAgICghaXNDb21wb25lbnQgJiZcbiAgICAgICAgICAgICAgICAvLyA8c3ZnPiBhbmQgPGZvcmVpZ25PYmplY3Q+IG11c3QgYmUgZm9yY2VkIGludG8gYmxvY2tzIHNvIHRoYXQgYmxvY2tcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGluc2lkZSBnZXQgcHJvcGVyIGlzU1ZHIGZsYWcgYXQgcnVudGltZS4gKCM2MzksICM2NDMpXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0ZWNobmljYWxseSB3ZWItc3BlY2lmaWMsIGJ1dCBzcGxpdHRpbmcgdGhlIGxvZ2ljIG91dCBvZiBjb3JlXG4gICAgICAgICAgICAgICAgLy8gbGVhZHMgdG8gdG9vIG11Y2ggdW5uZWNlc3NhcnkgY29tcGxleGl0eS5cbiAgICAgICAgICAgICAgICAodGFnID09PSAnc3ZnJyB8fCB0YWcgPT09ICdmb3JlaWduT2JqZWN0JykpO1xuICAgICAgICAvLyBwcm9wc1xuICAgICAgICBpZiAocHJvcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcHJvcHNCdWlsZFJlc3VsdCA9IGJ1aWxkUHJvcHMobm9kZSwgY29udGV4dCwgdW5kZWZpbmVkLCBpc0NvbXBvbmVudCwgaXNEeW5hbWljQ29tcG9uZW50KTtcbiAgICAgICAgICAgIHZub2RlUHJvcHMgPSBwcm9wc0J1aWxkUmVzdWx0LnByb3BzO1xuICAgICAgICAgICAgcGF0Y2hGbGFnID0gcHJvcHNCdWlsZFJlc3VsdC5wYXRjaEZsYWc7XG4gICAgICAgICAgICBkeW5hbWljUHJvcE5hbWVzID0gcHJvcHNCdWlsZFJlc3VsdC5keW5hbWljUHJvcE5hbWVzO1xuICAgICAgICAgICAgY29uc3QgZGlyZWN0aXZlcyA9IHByb3BzQnVpbGRSZXN1bHQuZGlyZWN0aXZlcztcbiAgICAgICAgICAgIHZub2RlRGlyZWN0aXZlcyA9XG4gICAgICAgICAgICAgICAgZGlyZWN0aXZlcyAmJiBkaXJlY3RpdmVzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IGNyZWF0ZUFycmF5RXhwcmVzc2lvbihkaXJlY3RpdmVzLm1hcChkaXIgPT4gYnVpbGREaXJlY3RpdmVBcmdzKGRpciwgY29udGV4dCkpKVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChwcm9wc0J1aWxkUmVzdWx0LnNob3VsZFVzZUJsb2NrKSB7XG4gICAgICAgICAgICAgICAgc2hvdWxkVXNlQmxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNoaWxkcmVuXG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmICh2bm9kZVRhZyA9PT0gS0VFUF9BTElWRSkge1xuICAgICAgICAgICAgICAgIC8vIEFsdGhvdWdoIGEgYnVpbHQtaW4gY29tcG9uZW50LCB3ZSBjb21waWxlIEtlZXBBbGl2ZSB3aXRoIHJhdyBjaGlsZHJlblxuICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2Ygc2xvdCBmdW5jdGlvbnMgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBpbnNpZGUgVHJhbnNpdGlvblxuICAgICAgICAgICAgICAgIC8vIG9yIG90aGVyIFRyYW5zaXRpb24td3JhcHBpbmcgSE9Dcy5cbiAgICAgICAgICAgICAgICAvLyBUbyBlbnN1cmUgY29ycmVjdCB1cGRhdGVzIHdpdGggYmxvY2sgb3B0aW1pemF0aW9ucywgd2UgbmVlZCB0bzpcbiAgICAgICAgICAgICAgICAvLyAxLiBGb3JjZSBrZWVwLWFsaXZlIGludG8gYSBibG9jay4gVGhpcyBhdm9pZHMgaXRzIGNoaWxkcmVuIGJlaW5nXG4gICAgICAgICAgICAgICAgLy8gICAgY29sbGVjdGVkIGJ5IGEgcGFyZW50IGJsb2NrLlxuICAgICAgICAgICAgICAgIHNob3VsZFVzZUJsb2NrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyAyLiBGb3JjZSBrZWVwLWFsaXZlIHRvIGFsd2F5cyBiZSB1cGRhdGVkLCBzaW5jZSBpdCB1c2VzIHJhdyBjaGlsZHJlbi5cbiAgICAgICAgICAgICAgICBwYXRjaEZsYWcgfD0gMTAyNCAvKiBQYXRjaEZsYWdzLkRZTkFNSUNfU0xPVFMgKi87XG4gICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoNDYgLyogRXJyb3JDb2Rlcy5YX0tFRVBfQUxJVkVfSU5WQUxJRF9DSElMRFJFTiAqLywge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG5vZGUuY2hpbGRyZW5bMF0ubG9jLnN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBub2RlLmNoaWxkcmVuW25vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMV0ubG9jLmVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJydcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEJ1aWxkQXNTbG90cyA9IGlzQ29tcG9uZW50ICYmXG4gICAgICAgICAgICAgICAgLy8gVGVsZXBvcnQgaXMgbm90IGEgcmVhbCBjb21wb25lbnQgYW5kIGhhcyBkZWRpY2F0ZWQgcnVudGltZSBoYW5kbGluZ1xuICAgICAgICAgICAgICAgIHZub2RlVGFnICE9PSBURUxFUE9SVCAmJlxuICAgICAgICAgICAgICAgIC8vIGV4cGxhaW5lZCBhYm92ZS5cbiAgICAgICAgICAgICAgICB2bm9kZVRhZyAhPT0gS0VFUF9BTElWRTtcbiAgICAgICAgICAgIGlmIChzaG91bGRCdWlsZEFzU2xvdHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHNsb3RzLCBoYXNEeW5hbWljU2xvdHMgfSA9IGJ1aWxkU2xvdHMobm9kZSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgdm5vZGVDaGlsZHJlbiA9IHNsb3RzO1xuICAgICAgICAgICAgICAgIGlmIChoYXNEeW5hbWljU2xvdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2hGbGFnIHw9IDEwMjQgLyogUGF0Y2hGbGFncy5EWU5BTUlDX1NMT1RTICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIHZub2RlVGFnICE9PSBURUxFUE9SVCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlblswXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gY2hpbGQudHlwZTtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgZHluYW1pYyB0ZXh0IGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRHluYW1pY1RleHRDaGlsZCA9IHR5cGUgPT09IDUgLyogTm9kZVR5cGVzLklOVEVSUE9MQVRJT04gKi8gfHxcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PT0gOCAvKiBOb2RlVHlwZXMuQ09NUE9VTkRfRVhQUkVTU0lPTiAqLztcbiAgICAgICAgICAgICAgICBpZiAoaGFzRHluYW1pY1RleHRDaGlsZCAmJlxuICAgICAgICAgICAgICAgICAgICBnZXRDb25zdGFudFR5cGUoY2hpbGQsIGNvbnRleHQpID09PSAwIC8qIENvbnN0YW50VHlwZXMuTk9UX0NPTlNUQU5UICovKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGNoRmxhZyB8PSAxIC8qIFBhdGNoRmxhZ3MuVEVYVCAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcGFzcyBkaXJlY3RseSBpZiB0aGUgb25seSBjaGlsZCBpcyBhIHRleHQgbm9kZVxuICAgICAgICAgICAgICAgIC8vIChwbGFpbiAvIGludGVycG9sYXRpb24gLyBleHByZXNzaW9uKVxuICAgICAgICAgICAgICAgIGlmIChoYXNEeW5hbWljVGV4dENoaWxkIHx8IHR5cGUgPT09IDIgLyogTm9kZVR5cGVzLlRFWFQgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgdm5vZGVDaGlsZHJlbiA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdm5vZGVDaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdm5vZGVDaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gcGF0Y2hGbGFnICYgZHluYW1pY1Byb3BOYW1lc1xuICAgICAgICBpZiAocGF0Y2hGbGFnICE9PSAwKSB7XG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGNoRmxhZyA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBmbGFncyAobmVnYXRpdmUgYW5kIG11dHVhbGx5IGV4Y2x1c2l2ZSlcbiAgICAgICAgICAgICAgICAgICAgdm5vZGVQYXRjaEZsYWcgPSBwYXRjaEZsYWcgKyBgIC8qICR7UGF0Y2hGbGFnTmFtZXNbcGF0Y2hGbGFnXX0gKi9gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYml0d2lzZSBmbGFnc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbGFnTmFtZXMgPSBPYmplY3Qua2V5cyhQYXRjaEZsYWdOYW1lcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoTnVtYmVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihuID0+IG4gPiAwICYmIHBhdGNoRmxhZyAmIG4pXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKG4gPT4gUGF0Y2hGbGFnTmFtZXNbbl0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihgLCBgKTtcbiAgICAgICAgICAgICAgICAgICAgdm5vZGVQYXRjaEZsYWcgPSBwYXRjaEZsYWcgKyBgIC8qICR7ZmxhZ05hbWVzfSAqL2A7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdm5vZGVQYXRjaEZsYWcgPSBTdHJpbmcocGF0Y2hGbGFnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkeW5hbWljUHJvcE5hbWVzICYmIGR5bmFtaWNQcm9wTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdm5vZGVEeW5hbWljUHJvcHMgPSBzdHJpbmdpZnlEeW5hbWljUHJvcE5hbWVzKGR5bmFtaWNQcm9wTmFtZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5vZGUuY29kZWdlbk5vZGUgPSBjcmVhdGVWTm9kZUNhbGwoY29udGV4dCwgdm5vZGVUYWcsIHZub2RlUHJvcHMsIHZub2RlQ2hpbGRyZW4sIHZub2RlUGF0Y2hGbGFnLCB2bm9kZUR5bmFtaWNQcm9wcywgdm5vZGVEaXJlY3RpdmVzLCAhIXNob3VsZFVzZUJsb2NrLCBmYWxzZSAvKiBkaXNhYmxlVHJhY2tpbmcgKi8sIGlzQ29tcG9uZW50LCBub2RlLmxvYyk7XG4gICAgfTtcbn07XG5mdW5jdGlvbiByZXNvbHZlQ29tcG9uZW50VHlwZShub2RlLCBjb250ZXh0LCBzc3IgPSBmYWxzZSkge1xuICAgIGxldCB7IHRhZyB9ID0gbm9kZTtcbiAgICAvLyAxLiBkeW5hbWljIGNvbXBvbmVudFxuICAgIGNvbnN0IGlzRXhwbGljaXREeW5hbWljID0gaXNDb21wb25lbnRUYWcodGFnKTtcbiAgICBjb25zdCBpc1Byb3AgPSBmaW5kUHJvcChub2RlLCAnaXMnKTtcbiAgICBpZiAoaXNQcm9wKSB7XG4gICAgICAgIGlmIChpc0V4cGxpY2l0RHluYW1pYyB8fFxuICAgICAgICAgICAgKGlzQ29tcGF0RW5hYmxlZChcIkNPTVBJTEVSX0lTX09OX0VMRU1FTlRcIiAvKiBDb21waWxlckRlcHJlY2F0aW9uVHlwZXMuQ09NUElMRVJfSVNfT05fRUxFTUVOVCAqLywgY29udGV4dCkpKSB7XG4gICAgICAgICAgICBjb25zdCBleHAgPSBpc1Byb3AudHlwZSA9PT0gNiAvKiBOb2RlVHlwZXMuQVRUUklCVVRFICovXG4gICAgICAgICAgICAgICAgPyBpc1Byb3AudmFsdWUgJiYgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihpc1Byb3AudmFsdWUuY29udGVudCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICA6IGlzUHJvcC5leHA7XG4gICAgICAgICAgICBpZiAoZXhwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNhbGxFeHByZXNzaW9uKGNvbnRleHQuaGVscGVyKFJFU09MVkVfRFlOQU1JQ19DT01QT05FTlQpLCBbXG4gICAgICAgICAgICAgICAgICAgIGV4cFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUHJvcC50eXBlID09PSA2IC8qIE5vZGVUeXBlcy5BVFRSSUJVVEUgKi8gJiZcbiAgICAgICAgICAgIGlzUHJvcC52YWx1ZS5jb250ZW50LnN0YXJ0c1dpdGgoJ3Z1ZTonKSkge1xuICAgICAgICAgICAgLy8gPGJ1dHRvbiBpcz1cInZ1ZTp4eHhcIj5cbiAgICAgICAgICAgIC8vIGlmIG5vdCA8Y29tcG9uZW50Piwgb25seSBpcyB2YWx1ZSB0aGF0IHN0YXJ0cyB3aXRoIFwidnVlOlwiIHdpbGwgYmVcbiAgICAgICAgICAgIC8vIHRyZWF0ZWQgYXMgY29tcG9uZW50IGJ5IHRoZSBwYXJzZSBwaGFzZSBhbmQgcmVhY2ggaGVyZSwgdW5sZXNzIGl0J3NcbiAgICAgICAgICAgIC8vIGNvbXBhdCBtb2RlIHdoZXJlIGFsbCBpcyB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgY29tcG9uZW50c1xuICAgICAgICAgICAgdGFnID0gaXNQcm9wLnZhbHVlLmNvbnRlbnQuc2xpY2UoNCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gMS41IHYtaXMgKFRPRE86IERlcHJlY2F0ZSlcbiAgICBjb25zdCBpc0RpciA9ICFpc0V4cGxpY2l0RHluYW1pYyAmJiBmaW5kRGlyKG5vZGUsICdpcycpO1xuICAgIGlmIChpc0RpciAmJiBpc0Rpci5leHApIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUNhbGxFeHByZXNzaW9uKGNvbnRleHQuaGVscGVyKFJFU09MVkVfRFlOQU1JQ19DT01QT05FTlQpLCBbXG4gICAgICAgICAgICBpc0Rpci5leHBcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8vIDIuIGJ1aWx0LWluIGNvbXBvbmVudHMgKFRlbGVwb3J0LCBUcmFuc2l0aW9uLCBLZWVwQWxpdmUsIFN1c3BlbnNlLi4uKVxuICAgIGNvbnN0IGJ1aWx0SW4gPSBpc0NvcmVDb21wb25lbnQodGFnKSB8fCBjb250ZXh0LmlzQnVpbHRJbkNvbXBvbmVudCh0YWcpO1xuICAgIGlmIChidWlsdEluKSB7XG4gICAgICAgIC8vIGJ1aWx0LWlucyBhcmUgc2ltcGx5IGZhbGx0aHJvdWdocyAvIGhhdmUgc3BlY2lhbCBoYW5kbGluZyBkdXJpbmcgc3NyXG4gICAgICAgIC8vIHNvIHdlIGRvbid0IG5lZWQgdG8gaW1wb3J0IHRoZWlyIHJ1bnRpbWUgZXF1aXZhbGVudHNcbiAgICAgICAgaWYgKCFzc3IpXG4gICAgICAgICAgICBjb250ZXh0LmhlbHBlcihidWlsdEluKTtcbiAgICAgICAgcmV0dXJuIGJ1aWx0SW47XG4gICAgfVxuICAgIC8vIDUuIHVzZXIgY29tcG9uZW50IChyZXNvbHZlKVxuICAgIGNvbnRleHQuaGVscGVyKFJFU09MVkVfQ09NUE9ORU5UKTtcbiAgICBjb250ZXh0LmNvbXBvbmVudHMuYWRkKHRhZyk7XG4gICAgcmV0dXJuIHRvVmFsaWRBc3NldElkKHRhZywgYGNvbXBvbmVudGApO1xufVxuZnVuY3Rpb24gYnVpbGRQcm9wcyhub2RlLCBjb250ZXh0LCBwcm9wcyA9IG5vZGUucHJvcHMsIGlzQ29tcG9uZW50LCBpc0R5bmFtaWNDb21wb25lbnQsIHNzciA9IGZhbHNlKSB7XG4gICAgY29uc3QgeyB0YWcsIGxvYzogZWxlbWVudExvYywgY2hpbGRyZW4gfSA9IG5vZGU7XG4gICAgbGV0IHByb3BlcnRpZXMgPSBbXTtcbiAgICBjb25zdCBtZXJnZUFyZ3MgPSBbXTtcbiAgICBjb25zdCBydW50aW1lRGlyZWN0aXZlcyA9IFtdO1xuICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gY2hpbGRyZW4ubGVuZ3RoID4gMDtcbiAgICBsZXQgc2hvdWxkVXNlQmxvY2sgPSBmYWxzZTtcbiAgICAvLyBwYXRjaEZsYWcgYW5hbHlzaXNcbiAgICBsZXQgcGF0Y2hGbGFnID0gMDtcbiAgICBsZXQgaGFzUmVmID0gZmFsc2U7XG4gICAgbGV0IGhhc0NsYXNzQmluZGluZyA9IGZhbHNlO1xuICAgIGxldCBoYXNTdHlsZUJpbmRpbmcgPSBmYWxzZTtcbiAgICBsZXQgaGFzSHlkcmF0aW9uRXZlbnRCaW5kaW5nID0gZmFsc2U7XG4gICAgbGV0IGhhc0R5bmFtaWNLZXlzID0gZmFsc2U7XG4gICAgbGV0IGhhc1Zub2RlSG9vayA9IGZhbHNlO1xuICAgIGNvbnN0IGR5bmFtaWNQcm9wTmFtZXMgPSBbXTtcbiAgICBjb25zdCBwdXNoTWVyZ2VBcmcgPSAoYXJnKSA9PiB7XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgbWVyZ2VBcmdzLnB1c2goY3JlYXRlT2JqZWN0RXhwcmVzc2lvbihkZWR1cGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpLCBlbGVtZW50TG9jKSk7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZylcbiAgICAgICAgICAgIG1lcmdlQXJncy5wdXNoKGFyZyk7XG4gICAgfTtcbiAgICBjb25zdCBhbmFseXplUGF0Y2hGbGFnID0gKHsga2V5LCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgIGlmIChpc1N0YXRpY0V4cChrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0ga2V5LmNvbnRlbnQ7XG4gICAgICAgICAgICBjb25zdCBpc0V2ZW50SGFuZGxlciA9IGlzT24obmFtZSk7XG4gICAgICAgICAgICBpZiAoaXNFdmVudEhhbmRsZXIgJiZcbiAgICAgICAgICAgICAgICAoIWlzQ29tcG9uZW50IHx8IGlzRHluYW1pY0NvbXBvbmVudCkgJiZcbiAgICAgICAgICAgICAgICAvLyBvbWl0IHRoZSBmbGFnIGZvciBjbGljayBoYW5kbGVycyBiZWNhdXNlIGh5ZHJhdGlvbiBnaXZlcyBjbGlja1xuICAgICAgICAgICAgICAgIC8vIGRlZGljYXRlZCBmYXN0IHBhdGguXG4gICAgICAgICAgICAgICAgbmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnb25jbGljaycgJiZcbiAgICAgICAgICAgICAgICAvLyBvbWl0IHYtbW9kZWwgaGFuZGxlcnNcbiAgICAgICAgICAgICAgICBuYW1lICE9PSAnb25VcGRhdGU6bW9kZWxWYWx1ZScgJiZcbiAgICAgICAgICAgICAgICAvLyBvbWl0IG9uVm5vZGVYWFggaG9va3NcbiAgICAgICAgICAgICAgICAhaXNSZXNlcnZlZFByb3AobmFtZSkpIHtcbiAgICAgICAgICAgICAgICBoYXNIeWRyYXRpb25FdmVudEJpbmRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRXZlbnRIYW5kbGVyICYmIGlzUmVzZXJ2ZWRQcm9wKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgaGFzVm5vZGVIb29rID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlID09PSAyMCAvKiBOb2RlVHlwZXMuSlNfQ0FDSEVfRVhQUkVTU0lPTiAqLyB8fFxuICAgICAgICAgICAgICAgICgodmFsdWUudHlwZSA9PT0gNCAvKiBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT04gKi8gfHxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUudHlwZSA9PT0gOCAvKiBOb2RlVHlwZXMuQ09NUE9VTkRfRVhQUkVTU0lPTiAqLykgJiZcbiAgICAgICAgICAgICAgICAgICAgZ2V0Q29uc3RhbnRUeXBlKHZhbHVlLCBjb250ZXh0KSA+IDApKSB7XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBpZiB0aGUgcHJvcCBpcyBhIGNhY2hlZCBoYW5kbGVyIG9yIGhhcyBjb25zdGFudCB2YWx1ZVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuYW1lID09PSAncmVmJykge1xuICAgICAgICAgICAgICAgIGhhc1JlZiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChuYW1lID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICAgICAgaGFzQ2xhc3NCaW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUgPT09ICdzdHlsZScpIHtcbiAgICAgICAgICAgICAgICBoYXNTdHlsZUJpbmRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmFtZSAhPT0gJ2tleScgJiYgIWR5bmFtaWNQcm9wTmFtZXMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICAgICAgICBkeW5hbWljUHJvcE5hbWVzLnB1c2gobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0cmVhdCB0aGUgZHluYW1pYyBjbGFzcyBhbmQgc3R5bGUgYmluZGluZyBvZiB0aGUgY29tcG9uZW50IGFzIGR5bmFtaWMgcHJvcHNcbiAgICAgICAgICAgIGlmIChpc0NvbXBvbmVudCAmJlxuICAgICAgICAgICAgICAgIChuYW1lID09PSAnY2xhc3MnIHx8IG5hbWUgPT09ICdzdHlsZScpICYmXG4gICAgICAgICAgICAgICAgIWR5bmFtaWNQcm9wTmFtZXMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICAgICAgICBkeW5hbWljUHJvcE5hbWVzLnB1c2gobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYXNEeW5hbWljS2V5cyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gc3RhdGljIGF0dHJpYnV0ZVxuICAgICAgICBjb25zdCBwcm9wID0gcHJvcHNbaV07XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IDYgLyogTm9kZVR5cGVzLkFUVFJJQlVURSAqLykge1xuICAgICAgICAgICAgY29uc3QgeyBsb2MsIG5hbWUsIHZhbHVlIH0gPSBwcm9wO1xuICAgICAgICAgICAgbGV0IGlzU3RhdGljID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChuYW1lID09PSAncmVmJykge1xuICAgICAgICAgICAgICAgIGhhc1JlZiA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuc2NvcGVzLnZGb3IgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaChjcmVhdGVPYmplY3RQcm9wZXJ0eShjcmVhdGVTaW1wbGVFeHByZXNzaW9uKCdyZWZfZm9yJywgdHJ1ZSksIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oJ3RydWUnKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHNraXAgaXMgb24gPGNvbXBvbmVudD4sIG9yIGlzPVwidnVlOnh4eFwiXG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2lzJyAmJlxuICAgICAgICAgICAgICAgIChpc0NvbXBvbmVudFRhZyh0YWcpIHx8XG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZSAmJiB2YWx1ZS5jb250ZW50LnN0YXJ0c1dpdGgoJ3Z1ZTonKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGlzQ29tcGF0RW5hYmxlZChcIkNPTVBJTEVSX0lTX09OX0VMRU1FTlRcIiAvKiBDb21waWxlckRlcHJlY2F0aW9uVHlwZXMuQ09NUElMRVJfSVNfT05fRUxFTUVOVCAqLywgY29udGV4dCkpKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKGNyZWF0ZU9iamVjdFByb3BlcnR5KGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24obmFtZSwgdHJ1ZSwgZ2V0SW5uZXJSYW5nZShsb2MsIDAsIG5hbWUubGVuZ3RoKSksIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24odmFsdWUgPyB2YWx1ZS5jb250ZW50IDogJycsIGlzU3RhdGljLCB2YWx1ZSA/IHZhbHVlLmxvYyA6IGxvYykpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRpcmVjdGl2ZXNcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgYXJnLCBleHAsIGxvYyB9ID0gcHJvcDtcbiAgICAgICAgICAgIGNvbnN0IGlzVkJpbmQgPSBuYW1lID09PSAnYmluZCc7XG4gICAgICAgICAgICBjb25zdCBpc1ZPbiA9IG5hbWUgPT09ICdvbic7XG4gICAgICAgICAgICAvLyBza2lwIHYtc2xvdCAtIGl0IGlzIGhhbmRsZWQgYnkgaXRzIGRlZGljYXRlZCB0cmFuc2Zvcm0uXG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gJ3Nsb3QnKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm9uRXJyb3IoY3JlYXRlQ29tcGlsZXJFcnJvcig0MCAvKiBFcnJvckNvZGVzLlhfVl9TTE9UX01JU1BMQUNFRCAqLywgbG9jKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gc2tpcCB2LW9uY2Uvdi1tZW1vIC0gdGhleSBhcmUgaGFuZGxlZCBieSBkZWRpY2F0ZWQgdHJhbnNmb3Jtcy5cbiAgICAgICAgICAgIGlmIChuYW1lID09PSAnb25jZScgfHwgbmFtZSA9PT0gJ21lbW8nKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBza2lwIHYtaXMgYW5kIDppcyBvbiA8Y29tcG9uZW50PlxuICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdpcycgfHxcbiAgICAgICAgICAgICAgICAoaXNWQmluZCAmJlxuICAgICAgICAgICAgICAgICAgICBpc1N0YXRpY0FyZ09mKGFyZywgJ2lzJykgJiZcbiAgICAgICAgICAgICAgICAgICAgKGlzQ29tcG9uZW50VGFnKHRhZykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChpc0NvbXBhdEVuYWJsZWQoXCJDT01QSUxFUl9JU19PTl9FTEVNRU5UXCIgLyogQ29tcGlsZXJEZXByZWNhdGlvblR5cGVzLkNPTVBJTEVSX0lTX09OX0VMRU1FTlQgKi8sIGNvbnRleHQpKSkpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBza2lwIHYtb24gaW4gU1NSIGNvbXBpbGF0aW9uXG4gICAgICAgICAgICBpZiAoaXNWT24gJiYgc3NyKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAvLyAjOTM4OiBlbGVtZW50cyB3aXRoIGR5bmFtaWMga2V5cyBzaG91bGQgYmUgZm9yY2VkIGludG8gYmxvY2tzXG4gICAgICAgICAgICAoaXNWQmluZCAmJiBpc1N0YXRpY0FyZ09mKGFyZywgJ2tleScpKSB8fFxuICAgICAgICAgICAgICAgIC8vIGlubGluZSBiZWZvcmUtdXBkYXRlIGhvb2tzIG5lZWQgdG8gZm9yY2UgYmxvY2sgc28gdGhhdCBpdCBpcyBpbnZva2VkXG4gICAgICAgICAgICAgICAgLy8gYmVmb3JlIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgKGlzVk9uICYmIGhhc0NoaWxkcmVuICYmIGlzU3RhdGljQXJnT2YoYXJnLCAndnVlOmJlZm9yZS11cGRhdGUnKSkpIHtcbiAgICAgICAgICAgICAgICBzaG91bGRVc2VCbG9jayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNWQmluZCAmJiBpc1N0YXRpY0FyZ09mKGFyZywgJ3JlZicpICYmIGNvbnRleHQuc2NvcGVzLnZGb3IgPiAwKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKGNyZWF0ZU9iamVjdFByb3BlcnR5KGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oJ3JlZl9mb3InLCB0cnVlKSwgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbigndHJ1ZScpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHYtYmluZCBhbmQgdi1vbiB3aXRoIG5vIGFyZ3VtZW50XG4gICAgICAgICAgICBpZiAoIWFyZyAmJiAoaXNWQmluZCB8fCBpc1ZPbikpIHtcbiAgICAgICAgICAgICAgICBoYXNEeW5hbWljS2V5cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGV4cCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWQmluZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0byBtZXJnZSBlYXJseSBmb3IgY29tcGF0IGJ1aWxkIGNoZWNrXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoTWVyZ2VBcmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLnggdi1iaW5kIG9iamVjdCBvcmRlciBjb21wYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc092ZXJyaWRhYmxlS2V5cyA9IG1lcmdlQXJncy5zb21lKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLnR5cGUgPT09IDE1IC8qIE5vZGVUeXBlcy5KU19PQkpFQ1RfRVhQUkVTU0lPTiAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmcucHJvcGVydGllcy5zb21lKCh7IGtleSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkudHlwZSAhPT0gNCAvKiBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT04gKi8gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFrZXkuaXNTdGF0aWMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoa2V5LmNvbnRlbnQgIT09ICdjbGFzcycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleS5jb250ZW50ICE9PSAnc3R5bGUnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNPbihrZXkuY29udGVudCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHluYW1pYyBleHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3ZlcnJpZGFibGVLZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0NvbXBhdEVuYWJsZWQoXCJDT01QSUxFUl9WX0JJTkRfT0JKRUNUX09SREVSXCIgLyogQ29tcGlsZXJEZXByZWNhdGlvblR5cGVzLkNPTVBJTEVSX1ZfQklORF9PQkpFQ1RfT1JERVIgKi8sIGNvbnRleHQsIGxvYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGF0RW5hYmxlZChcIkNPTVBJTEVSX1ZfQklORF9PQkpFQ1RfT1JERVJcIiAvKiBDb21waWxlckRlcHJlY2F0aW9uVHlwZXMuQ09NUElMRVJfVl9CSU5EX09CSkVDVF9PUkRFUiAqLywgY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VBcmdzLnVuc2hpZnQoZXhwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VBcmdzLnB1c2goZXhwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHYtb249XCJvYmpcIiAtPiB0b0hhbmRsZXJzKG9iailcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hNZXJnZUFyZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogMTQgLyogTm9kZVR5cGVzLkpTX0NBTExfRVhQUkVTU0lPTiAqLyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVlOiBjb250ZXh0LmhlbHBlcihUT19IQU5ETEVSUyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzOiBpc0NvbXBvbmVudCA/IFtleHBdIDogW2V4cCwgYHRydWVgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQub25FcnJvcihjcmVhdGVDb21waWxlckVycm9yKGlzVkJpbmRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gMzQgLyogRXJyb3JDb2Rlcy5YX1ZfQklORF9OT19FWFBSRVNTSU9OICovXG4gICAgICAgICAgICAgICAgICAgICAgICA6IDM1IC8qIEVycm9yQ29kZXMuWF9WX09OX05PX0VYUFJFU1NJT04gKi8sIGxvYykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGl2ZVRyYW5zZm9ybSA9IGNvbnRleHQuZGlyZWN0aXZlVHJhbnNmb3Jtc1tuYW1lXTtcbiAgICAgICAgICAgIGlmIChkaXJlY3RpdmVUcmFuc2Zvcm0pIHtcbiAgICAgICAgICAgICAgICAvLyBoYXMgYnVpbHQtaW4gZGlyZWN0aXZlIHRyYW5zZm9ybS5cbiAgICAgICAgICAgICAgICBjb25zdCB7IHByb3BzLCBuZWVkUnVudGltZSB9ID0gZGlyZWN0aXZlVHJhbnNmb3JtKHByb3AsIG5vZGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICFzc3IgJiYgcHJvcHMuZm9yRWFjaChhbmFseXplUGF0Y2hGbGFnKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNWT24gJiYgYXJnICYmICFpc1N0YXRpY0V4cChhcmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hNZXJnZUFyZyhjcmVhdGVPYmplY3RFeHByZXNzaW9uKHByb3BzLCBlbGVtZW50TG9jKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2goLi4ucHJvcHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmVlZFJ1bnRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVudGltZURpcmVjdGl2ZXMucHVzaChwcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3ltYm9sKG5lZWRSdW50aW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlSW1wb3J0TWFwLnNldChwcm9wLCBuZWVkUnVudGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghaXNCdWlsdEluRGlyZWN0aXZlKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gYnVpbHQtaW4gdHJhbnNmb3JtLCB0aGlzIGlzIGEgdXNlciBjdXN0b20gZGlyZWN0aXZlLlxuICAgICAgICAgICAgICAgIHJ1bnRpbWVEaXJlY3RpdmVzLnB1c2gocHJvcCk7XG4gICAgICAgICAgICAgICAgLy8gY3VzdG9tIGRpcnMgbWF5IHVzZSBiZWZvcmVVcGRhdGUgc28gdGhleSBuZWVkIHRvIGZvcmNlIGJsb2Nrc1xuICAgICAgICAgICAgICAgIC8vIHRvIGVuc3VyZSBiZWZvcmUtdXBkYXRlIGdldHMgY2FsbGVkIGJlZm9yZSBjaGlsZHJlbiB1cGRhdGVcbiAgICAgICAgICAgICAgICBpZiAoaGFzQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkVXNlQmxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgcHJvcHNFeHByZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgIC8vIGhhcyB2LWJpbmQ9XCJvYmplY3RcIiBvciB2LW9uPVwib2JqZWN0XCIsIHdyYXAgd2l0aCBtZXJnZVByb3BzXG4gICAgaWYgKG1lcmdlQXJncy5sZW5ndGgpIHtcbiAgICAgICAgLy8gY2xvc2UgdXAgYW55IG5vdC15ZXQtbWVyZ2VkIHByb3BzXG4gICAgICAgIHB1c2hNZXJnZUFyZygpO1xuICAgICAgICBpZiAobWVyZ2VBcmdzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHByb3BzRXhwcmVzc2lvbiA9IGNyZWF0ZUNhbGxFeHByZXNzaW9uKGNvbnRleHQuaGVscGVyKE1FUkdFX1BST1BTKSwgbWVyZ2VBcmdzLCBlbGVtZW50TG9jKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNpbmdsZSB2LWJpbmQgd2l0aCBub3RoaW5nIGVsc2UgLSBubyBuZWVkIGZvciBhIG1lcmdlUHJvcHMgY2FsbFxuICAgICAgICAgICAgcHJvcHNFeHByZXNzaW9uID0gbWVyZ2VBcmdzWzBdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgIHByb3BzRXhwcmVzc2lvbiA9IGNyZWF0ZU9iamVjdEV4cHJlc3Npb24oZGVkdXBlUHJvcGVydGllcyhwcm9wZXJ0aWVzKSwgZWxlbWVudExvYyk7XG4gICAgfVxuICAgIC8vIHBhdGNoRmxhZyBhbmFseXNpc1xuICAgIGlmIChoYXNEeW5hbWljS2V5cykge1xuICAgICAgICBwYXRjaEZsYWcgfD0gMTYgLyogUGF0Y2hGbGFncy5GVUxMX1BST1BTICovO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGhhc0NsYXNzQmluZGluZyAmJiAhaXNDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHBhdGNoRmxhZyB8PSAyIC8qIFBhdGNoRmxhZ3MuQ0xBU1MgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1N0eWxlQmluZGluZyAmJiAhaXNDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHBhdGNoRmxhZyB8PSA0IC8qIFBhdGNoRmxhZ3MuU1RZTEUgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR5bmFtaWNQcm9wTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwYXRjaEZsYWcgfD0gOCAvKiBQYXRjaEZsYWdzLlBST1BTICovO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNIeWRyYXRpb25FdmVudEJpbmRpbmcpIHtcbiAgICAgICAgICAgIHBhdGNoRmxhZyB8PSAzMiAvKiBQYXRjaEZsYWdzLkhZRFJBVEVfRVZFTlRTICovO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghc2hvdWxkVXNlQmxvY2sgJiZcbiAgICAgICAgKHBhdGNoRmxhZyA9PT0gMCB8fCBwYXRjaEZsYWcgPT09IDMyIC8qIFBhdGNoRmxhZ3MuSFlEUkFURV9FVkVOVFMgKi8pICYmXG4gICAgICAgIChoYXNSZWYgfHwgaGFzVm5vZGVIb29rIHx8IHJ1bnRpbWVEaXJlY3RpdmVzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgIHBhdGNoRmxhZyB8PSA1MTIgLyogUGF0Y2hGbGFncy5ORUVEX1BBVENIICovO1xuICAgIH1cbiAgICAvLyBwcmUtbm9ybWFsaXplIHByb3BzLCBTU1IgaXMgc2tpcHBlZCBmb3Igbm93XG4gICAgaWYgKCFjb250ZXh0LmluU1NSICYmIHByb3BzRXhwcmVzc2lvbikge1xuICAgICAgICBzd2l0Y2ggKHByb3BzRXhwcmVzc2lvbi50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDE1IC8qIE5vZGVUeXBlcy5KU19PQkpFQ1RfRVhQUkVTU0lPTiAqLzpcbiAgICAgICAgICAgICAgICAvLyBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIHYtYmluZCxcbiAgICAgICAgICAgICAgICAvLyBidXQgc3RpbGwgbmVlZCB0byBkZWFsIHdpdGggZHluYW1pYyBrZXkgYmluZGluZ1xuICAgICAgICAgICAgICAgIGxldCBjbGFzc0tleUluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlS2V5SW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICBsZXQgaGFzRHluYW1pY0tleSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHNFeHByZXNzaW9uLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gcHJvcHNFeHByZXNzaW9uLnByb3BlcnRpZXNbaV0ua2V5O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGF0aWNFeHAoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5jb250ZW50ID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NLZXlJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXkuY29udGVudCA9PT0gJ3N0eWxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlS2V5SW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFrZXkuaXNIYW5kbGVyS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNEeW5hbWljS2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjbGFzc1Byb3AgPSBwcm9wc0V4cHJlc3Npb24ucHJvcGVydGllc1tjbGFzc0tleUluZGV4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZVByb3AgPSBwcm9wc0V4cHJlc3Npb24ucHJvcGVydGllc1tzdHlsZUtleUluZGV4XTtcbiAgICAgICAgICAgICAgICAvLyBubyBkeW5hbWljIGtleVxuICAgICAgICAgICAgICAgIGlmICghaGFzRHluYW1pY0tleSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NQcm9wICYmICFpc1N0YXRpY0V4cChjbGFzc1Byb3AudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1Byb3AudmFsdWUgPSBjcmVhdGVDYWxsRXhwcmVzc2lvbihjb250ZXh0LmhlbHBlcihOT1JNQUxJWkVfQ0xBU1MpLCBbY2xhc3NQcm9wLnZhbHVlXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUHJvcCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXRpYyBzdHlsZSBpcyBjb21waWxlZCBpbnRvIGFuIG9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHVzZSBgaGFzU3R5bGVCaW5kaW5nYCB0byBlbnN1cmUgdGhhdCBpdCBpcyBhIGR5bmFtaWMgc3R5bGUgYmluZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgKGhhc1N0eWxlQmluZGluZyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHlsZVByb3AudmFsdWUudHlwZSA9PT0gNCAvKiBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT04gKi8gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVQcm9wLnZhbHVlLmNvbnRlbnQudHJpbSgpWzBdID09PSBgW2ApIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdi1iaW5kOnN0eWxlIGFuZCBzdHlsZSBib3RoIGV4aXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHYtYmluZDpzdHlsZSB3aXRoIHN0YXRpYyBsaXRlcmFsIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlUHJvcC52YWx1ZS50eXBlID09PSAxNyAvKiBOb2RlVHlwZXMuSlNfQVJSQVlfRVhQUkVTU0lPTiAqLykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlUHJvcC52YWx1ZSA9IGNyZWF0ZUNhbGxFeHByZXNzaW9uKGNvbnRleHQuaGVscGVyKE5PUk1BTElaRV9TVFlMRSksIFtzdHlsZVByb3AudmFsdWVdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZHluYW1pYyBrZXkgYmluZGluZywgd3JhcCB3aXRoIGBub3JtYWxpemVQcm9wc2BcbiAgICAgICAgICAgICAgICAgICAgcHJvcHNFeHByZXNzaW9uID0gY3JlYXRlQ2FsbEV4cHJlc3Npb24oY29udGV4dC5oZWxwZXIoTk9STUFMSVpFX1BST1BTKSwgW3Byb3BzRXhwcmVzc2lvbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTQgLyogTm9kZVR5cGVzLkpTX0NBTExfRVhQUkVTU0lPTiAqLzpcbiAgICAgICAgICAgICAgICAvLyBtZXJnZVByb3BzIGNhbGwsIGRvIG5vdGhpbmdcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8gc2luZ2xlIHYtYmluZFxuICAgICAgICAgICAgICAgIHByb3BzRXhwcmVzc2lvbiA9IGNyZWF0ZUNhbGxFeHByZXNzaW9uKGNvbnRleHQuaGVscGVyKE5PUk1BTElaRV9QUk9QUyksIFtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ2FsbEV4cHJlc3Npb24oY29udGV4dC5oZWxwZXIoR1VBUkRfUkVBQ1RJVkVfUFJPUFMpLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wc0V4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9wczogcHJvcHNFeHByZXNzaW9uLFxuICAgICAgICBkaXJlY3RpdmVzOiBydW50aW1lRGlyZWN0aXZlcyxcbiAgICAgICAgcGF0Y2hGbGFnLFxuICAgICAgICBkeW5hbWljUHJvcE5hbWVzLFxuICAgICAgICBzaG91bGRVc2VCbG9ja1xuICAgIH07XG59XG4vLyBEZWR1cGUgcHJvcHMgaW4gYW4gb2JqZWN0IGxpdGVyYWwuXG4vLyBMaXRlcmFsIGR1cGxpY2F0ZWQgYXR0cmlidXRlcyB3b3VsZCBoYXZlIGJlZW4gd2FybmVkIGR1cmluZyB0aGUgcGFyc2UgcGhhc2UsXG4vLyBob3dldmVyLCBpdCdzIHBvc3NpYmxlIHRvIGVuY291bnRlciBkdXBsaWNhdGVkIGBvblhYWGAgaGFuZGxlcnMgd2l0aCBkaWZmZXJlbnRcbi8vIG1vZGlmaWVycy4gV2UgYWxzbyBuZWVkIHRvIG1lcmdlIHN0YXRpYyBhbmQgZHluYW1pYyBjbGFzcyAvIHN0eWxlIGF0dHJpYnV0ZXMuXG4vLyAtIG9uWFhYIGhhbmRsZXJzIC8gc3R5bGU6IG1lcmdlIGludG8gYXJyYXlcbi8vIC0gY2xhc3M6IG1lcmdlIGludG8gc2luZ2xlIGV4cHJlc3Npb24gd2l0aCBjb25jYXRlbmF0aW9uXG5mdW5jdGlvbiBkZWR1cGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBrbm93blByb3BzID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGRlZHVwZWQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcHJvcCA9IHByb3BlcnRpZXNbaV07XG4gICAgICAgIC8vIGR5bmFtaWMga2V5cyBhcmUgYWx3YXlzIGFsbG93ZWRcbiAgICAgICAgaWYgKHByb3Aua2V5LnR5cGUgPT09IDggLyogTm9kZVR5cGVzLkNPTVBPVU5EX0VYUFJFU1NJT04gKi8gfHwgIXByb3Aua2V5LmlzU3RhdGljKSB7XG4gICAgICAgICAgICBkZWR1cGVkLnB1c2gocHJvcCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYW1lID0gcHJvcC5rZXkuY29udGVudDtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBrbm93blByb3BzLmdldChuYW1lKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gJ3N0eWxlJyB8fCBuYW1lID09PSAnY2xhc3MnIHx8IGlzT24obmFtZSkpIHtcbiAgICAgICAgICAgICAgICBtZXJnZUFzQXJyYXkoZXhpc3RpbmcsIHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdW5leHBlY3RlZCBkdXBsaWNhdGUsIHNob3VsZCBoYXZlIGVtaXR0ZWQgZXJyb3IgZHVyaW5nIHBhcnNlXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBrbm93blByb3BzLnNldChuYW1lLCBwcm9wKTtcbiAgICAgICAgICAgIGRlZHVwZWQucHVzaChwcm9wKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVkdXBlZDtcbn1cbmZ1bmN0aW9uIG1lcmdlQXNBcnJheShleGlzdGluZywgaW5jb21pbmcpIHtcbiAgICBpZiAoZXhpc3RpbmcudmFsdWUudHlwZSA9PT0gMTcgLyogTm9kZVR5cGVzLkpTX0FSUkFZX0VYUFJFU1NJT04gKi8pIHtcbiAgICAgICAgZXhpc3RpbmcudmFsdWUuZWxlbWVudHMucHVzaChpbmNvbWluZy52YWx1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBleGlzdGluZy52YWx1ZSA9IGNyZWF0ZUFycmF5RXhwcmVzc2lvbihbZXhpc3RpbmcudmFsdWUsIGluY29taW5nLnZhbHVlXSwgZXhpc3RpbmcubG9jKTtcbiAgICB9XG59XG5mdW5jdGlvbiBidWlsZERpcmVjdGl2ZUFyZ3MoZGlyLCBjb250ZXh0KSB7XG4gICAgY29uc3QgZGlyQXJncyA9IFtdO1xuICAgIGNvbnN0IHJ1bnRpbWUgPSBkaXJlY3RpdmVJbXBvcnRNYXAuZ2V0KGRpcik7XG4gICAgaWYgKHJ1bnRpbWUpIHtcbiAgICAgICAgLy8gYnVpbHQtaW4gZGlyZWN0aXZlIHdpdGggcnVudGltZVxuICAgICAgICBkaXJBcmdzLnB1c2goY29udGV4dC5oZWxwZXJTdHJpbmcocnVudGltZSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gaW5qZWN0IHN0YXRlbWVudCBmb3IgcmVzb2x2aW5nIGRpcmVjdGl2ZVxuICAgICAgICAgICAgY29udGV4dC5oZWxwZXIoUkVTT0xWRV9ESVJFQ1RJVkUpO1xuICAgICAgICAgICAgY29udGV4dC5kaXJlY3RpdmVzLmFkZChkaXIubmFtZSk7XG4gICAgICAgICAgICBkaXJBcmdzLnB1c2godG9WYWxpZEFzc2V0SWQoZGlyLm5hbWUsIGBkaXJlY3RpdmVgKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgeyBsb2MgfSA9IGRpcjtcbiAgICBpZiAoZGlyLmV4cClcbiAgICAgICAgZGlyQXJncy5wdXNoKGRpci5leHApO1xuICAgIGlmIChkaXIuYXJnKSB7XG4gICAgICAgIGlmICghZGlyLmV4cCkge1xuICAgICAgICAgICAgZGlyQXJncy5wdXNoKGB2b2lkIDBgKTtcbiAgICAgICAgfVxuICAgICAgICBkaXJBcmdzLnB1c2goZGlyLmFyZyk7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhkaXIubW9kaWZpZXJzKS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCFkaXIuYXJnKSB7XG4gICAgICAgICAgICBpZiAoIWRpci5leHApIHtcbiAgICAgICAgICAgICAgICBkaXJBcmdzLnB1c2goYHZvaWQgMGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlyQXJncy5wdXNoKGB2b2lkIDBgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cnVlRXhwcmVzc2lvbiA9IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYHRydWVgLCBmYWxzZSwgbG9jKTtcbiAgICAgICAgZGlyQXJncy5wdXNoKGNyZWF0ZU9iamVjdEV4cHJlc3Npb24oZGlyLm1vZGlmaWVycy5tYXAobW9kaWZpZXIgPT4gY3JlYXRlT2JqZWN0UHJvcGVydHkobW9kaWZpZXIsIHRydWVFeHByZXNzaW9uKSksIGxvYykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQXJyYXlFeHByZXNzaW9uKGRpckFyZ3MsIGRpci5sb2MpO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5RHluYW1pY1Byb3BOYW1lcyhwcm9wcykge1xuICAgIGxldCBwcm9wc05hbWVzU3RyaW5nID0gYFtgO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gcHJvcHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHByb3BzTmFtZXNTdHJpbmcgKz0gSlNPTi5zdHJpbmdpZnkocHJvcHNbaV0pO1xuICAgICAgICBpZiAoaSA8IGwgLSAxKVxuICAgICAgICAgICAgcHJvcHNOYW1lc1N0cmluZyArPSAnLCAnO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcHNOYW1lc1N0cmluZyArIGBdYDtcbn1cbmZ1bmN0aW9uIGlzQ29tcG9uZW50VGFnKHRhZykge1xuICAgIHJldHVybiB0YWcgPT09ICdjb21wb25lbnQnIHx8IHRhZyA9PT0gJ0NvbXBvbmVudCc7XG59XG5cbihwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKVxuICAgID8gT2JqZWN0LmZyZWV6ZSh7fSlcbiAgICA6IHt9O1xuKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gT2JqZWN0LmZyZWV6ZShbXSkgOiBbXTtcbmNvbnN0IGNhY2hlU3RyaW5nRnVuY3Rpb24gPSAoZm4pID0+IHtcbiAgICBjb25zdCBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgcmV0dXJuICgoc3RyKSA9PiB7XG4gICAgICAgIGNvbnN0IGhpdCA9IGNhY2hlW3N0cl07XG4gICAgICAgIHJldHVybiBoaXQgfHwgKGNhY2hlW3N0cl0gPSBmbihzdHIpKTtcbiAgICB9KTtcbn07XG5jb25zdCBjYW1lbGl6ZVJFID0gLy0oXFx3KS9nO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBjYW1lbGl6ZSA9IGNhY2hlU3RyaW5nRnVuY3Rpb24oKHN0cikgPT4ge1xuICAgIHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCAoXywgYykgPT4gKGMgPyBjLnRvVXBwZXJDYXNlKCkgOiAnJykpO1xufSk7XG5cbmNvbnN0IHRyYW5zZm9ybVNsb3RPdXRsZXQgPSAobm9kZSwgY29udGV4dCkgPT4ge1xuICAgIGlmIChpc1Nsb3RPdXRsZXQobm9kZSkpIHtcbiAgICAgICAgY29uc3QgeyBjaGlsZHJlbiwgbG9jIH0gPSBub2RlO1xuICAgICAgICBjb25zdCB7IHNsb3ROYW1lLCBzbG90UHJvcHMgfSA9IHByb2Nlc3NTbG90T3V0bGV0KG5vZGUsIGNvbnRleHQpO1xuICAgICAgICBjb25zdCBzbG90QXJncyA9IFtcbiAgICAgICAgICAgIGNvbnRleHQucHJlZml4SWRlbnRpZmllcnMgPyBgX2N0eC4kc2xvdHNgIDogYCRzbG90c2AsXG4gICAgICAgICAgICBzbG90TmFtZSxcbiAgICAgICAgICAgICd7fScsXG4gICAgICAgICAgICAndW5kZWZpbmVkJyxcbiAgICAgICAgICAgICd0cnVlJ1xuICAgICAgICBdO1xuICAgICAgICBsZXQgZXhwZWN0ZWRMZW4gPSAyO1xuICAgICAgICBpZiAoc2xvdFByb3BzKSB7XG4gICAgICAgICAgICBzbG90QXJnc1syXSA9IHNsb3RQcm9wcztcbiAgICAgICAgICAgIGV4cGVjdGVkTGVuID0gMztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICBzbG90QXJnc1szXSA9IGNyZWF0ZUZ1bmN0aW9uRXhwcmVzc2lvbihbXSwgY2hpbGRyZW4sIGZhbHNlLCBmYWxzZSwgbG9jKTtcbiAgICAgICAgICAgIGV4cGVjdGVkTGVuID0gNDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udGV4dC5zY29wZUlkICYmICFjb250ZXh0LnNsb3R0ZWQpIHtcbiAgICAgICAgICAgIGV4cGVjdGVkTGVuID0gNTtcbiAgICAgICAgfVxuICAgICAgICBzbG90QXJncy5zcGxpY2UoZXhwZWN0ZWRMZW4pOyAvLyByZW1vdmUgdW51c2VkIGFyZ3VtZW50c1xuICAgICAgICBub2RlLmNvZGVnZW5Ob2RlID0gY3JlYXRlQ2FsbEV4cHJlc3Npb24oY29udGV4dC5oZWxwZXIoUkVOREVSX1NMT1QpLCBzbG90QXJncywgbG9jKTtcbiAgICB9XG59O1xuZnVuY3Rpb24gcHJvY2Vzc1Nsb3RPdXRsZXQobm9kZSwgY29udGV4dCkge1xuICAgIGxldCBzbG90TmFtZSA9IGBcImRlZmF1bHRcImA7XG4gICAgbGV0IHNsb3RQcm9wcyA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBub25OYW1lUHJvcHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUucHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcCA9IG5vZGUucHJvcHNbaV07XG4gICAgICAgIGlmIChwLnR5cGUgPT09IDYgLyogTm9kZVR5cGVzLkFUVFJJQlVURSAqLykge1xuICAgICAgICAgICAgaWYgKHAudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAocC5uYW1lID09PSAnbmFtZScpIHtcbiAgICAgICAgICAgICAgICAgICAgc2xvdE5hbWUgPSBKU09OLnN0cmluZ2lmeShwLnZhbHVlLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcC5uYW1lID0gY2FtZWxpemUocC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbm9uTmFtZVByb3BzLnB1c2gocCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHAubmFtZSA9PT0gJ2JpbmQnICYmIGlzU3RhdGljQXJnT2YocC5hcmcsICduYW1lJykpIHtcbiAgICAgICAgICAgICAgICBpZiAocC5leHApXG4gICAgICAgICAgICAgICAgICAgIHNsb3ROYW1lID0gcC5leHA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocC5uYW1lID09PSAnYmluZCcgJiYgcC5hcmcgJiYgaXNTdGF0aWNFeHAocC5hcmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHAuYXJnLmNvbnRlbnQgPSBjYW1lbGl6ZShwLmFyZy5jb250ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9uTmFtZVByb3BzLnB1c2gocCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5vbk5hbWVQcm9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHsgcHJvcHMsIGRpcmVjdGl2ZXMgfSA9IGJ1aWxkUHJvcHMobm9kZSwgY29udGV4dCwgbm9uTmFtZVByb3BzLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICBzbG90UHJvcHMgPSBwcm9wcztcbiAgICAgICAgaWYgKGRpcmVjdGl2ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb250ZXh0Lm9uRXJyb3IoY3JlYXRlQ29tcGlsZXJFcnJvcigzNiAvKiBFcnJvckNvZGVzLlhfVl9TTE9UX1VORVhQRUNURURfRElSRUNUSVZFX09OX1NMT1RfT1VUTEVUICovLCBkaXJlY3RpdmVzWzBdLmxvYykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHNsb3ROYW1lLFxuICAgICAgICBzbG90UHJvcHNcbiAgICB9O1xufVxuXG5jb25zdCBmbkV4cFJFID0gL15cXHMqKFtcXHckX10rfChhc3luY1xccyopP1xcKFteKV0qP1xcKSlcXHMqKDpbXj1dKyk/PT58XlxccyooYXN5bmNcXHMrKT9mdW5jdGlvbig/OlxccytbXFx3JF0rKT9cXHMqXFwoLztcbmNvbnN0IHRyYW5zZm9ybU9uID0gKGRpciwgbm9kZSwgY29udGV4dCwgYXVnbWVudG9yKSA9PiB7XG4gICAgY29uc3QgeyBsb2MsIG1vZGlmaWVycywgYXJnIH0gPSBkaXI7XG4gICAgaWYgKCFkaXIuZXhwICYmICFtb2RpZmllcnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnRleHQub25FcnJvcihjcmVhdGVDb21waWxlckVycm9yKDM1IC8qIEVycm9yQ29kZXMuWF9WX09OX05PX0VYUFJFU1NJT04gKi8sIGxvYykpO1xuICAgIH1cbiAgICBsZXQgZXZlbnROYW1lO1xuICAgIGlmIChhcmcudHlwZSA9PT0gNCAvKiBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT04gKi8pIHtcbiAgICAgICAgaWYgKGFyZy5pc1N0YXRpYykge1xuICAgICAgICAgICAgbGV0IHJhd05hbWUgPSBhcmcuY29udGVudDtcbiAgICAgICAgICAgIC8vIFRPRE8gZGVwcmVjYXRlIEB2bm9kZVhYWCB1c2FnZVxuICAgICAgICAgICAgaWYgKHJhd05hbWUuc3RhcnRzV2l0aCgndnVlOicpKSB7XG4gICAgICAgICAgICAgICAgcmF3TmFtZSA9IGB2bm9kZS0ke3Jhd05hbWUuc2xpY2UoNCl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50U3RyaW5nID0gbm9kZS50YWdUeXBlICE9PSAwIC8qIEVsZW1lbnRUeXBlcy5FTEVNRU5UICovIHx8XG4gICAgICAgICAgICAgICAgcmF3TmFtZS5zdGFydHNXaXRoKCd2bm9kZScpIHx8XG4gICAgICAgICAgICAgICAgIS9bQS1aXS8udGVzdChyYXdOYW1lKVxuICAgICAgICAgICAgICAgID8gLy8gZm9yIG5vbi1lbGVtZW50IGFuZCB2bm9kZSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXJzLCBhdXRvIGNvbnZlcnRcbiAgICAgICAgICAgICAgICAgICAgLy8gaXQgdG8gY2FtZWxDYXNlLiBTZWUgaXNzdWUgIzIyNDlcbiAgICAgICAgICAgICAgICAgICAgdG9IYW5kbGVyS2V5KGNhbWVsaXplJDEocmF3TmFtZSkpXG4gICAgICAgICAgICAgICAgOiAvLyBwcmVzZXJ2ZSBjYXNlIGZvciBwbGFpbiBlbGVtZW50IGxpc3RlbmVycyB0aGF0IGhhdmUgdXBwZXJjYXNlXG4gICAgICAgICAgICAgICAgICAgIC8vIGxldHRlcnMsIGFzIHRoZXNlIG1heSBiZSBjdXN0b20gZWxlbWVudHMnIGN1c3RvbSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgYG9uOiR7cmF3TmFtZX1gO1xuICAgICAgICAgICAgZXZlbnROYW1lID0gY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihldmVudFN0cmluZywgdHJ1ZSwgYXJnLmxvYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyAjMjM4OFxuICAgICAgICAgICAgZXZlbnROYW1lID0gY3JlYXRlQ29tcG91bmRFeHByZXNzaW9uKFtcbiAgICAgICAgICAgICAgICBgJHtjb250ZXh0LmhlbHBlclN0cmluZyhUT19IQU5ETEVSX0tFWSl9KGAsXG4gICAgICAgICAgICAgICAgYXJnLFxuICAgICAgICAgICAgICAgIGApYFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIGFscmVhZHkgYSBjb21wb3VuZCBleHByZXNzaW9uLlxuICAgICAgICBldmVudE5hbWUgPSBhcmc7XG4gICAgICAgIGV2ZW50TmFtZS5jaGlsZHJlbi51bnNoaWZ0KGAke2NvbnRleHQuaGVscGVyU3RyaW5nKFRPX0hBTkRMRVJfS0VZKX0oYCk7XG4gICAgICAgIGV2ZW50TmFtZS5jaGlsZHJlbi5wdXNoKGApYCk7XG4gICAgfVxuICAgIC8vIGhhbmRsZXIgcHJvY2Vzc2luZ1xuICAgIGxldCBleHAgPSBkaXIuZXhwO1xuICAgIGlmIChleHAgJiYgIWV4cC5jb250ZW50LnRyaW0oKSkge1xuICAgICAgICBleHAgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGxldCBzaG91bGRDYWNoZSA9IGNvbnRleHQuY2FjaGVIYW5kbGVycyAmJiAhZXhwICYmICFjb250ZXh0LmluVk9uY2U7XG4gICAgaWYgKGV4cCkge1xuICAgICAgICBjb25zdCBpc01lbWJlckV4cCA9IGlzTWVtYmVyRXhwcmVzc2lvbihleHAuY29udGVudCk7XG4gICAgICAgIGNvbnN0IGlzSW5saW5lU3RhdGVtZW50ID0gIShpc01lbWJlckV4cCB8fCBmbkV4cFJFLnRlc3QoZXhwLmNvbnRlbnQpKTtcbiAgICAgICAgY29uc3QgaGFzTXVsdGlwbGVTdGF0ZW1lbnRzID0gZXhwLmNvbnRlbnQuaW5jbHVkZXMoYDtgKTtcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiB0cnVlKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUJyb3dzZXJFeHByZXNzaW9uKGV4cCwgY29udGV4dCwgZmFsc2UsIGhhc011bHRpcGxlU3RhdGVtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzSW5saW5lU3RhdGVtZW50IHx8IChzaG91bGRDYWNoZSAmJiBpc01lbWJlckV4cCkpIHtcbiAgICAgICAgICAgIC8vIHdyYXAgaW5saW5lIHN0YXRlbWVudCBpbiBhIGZ1bmN0aW9uIGV4cHJlc3Npb25cbiAgICAgICAgICAgIGV4cCA9IGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihbXG4gICAgICAgICAgICAgICAgYCR7aXNJbmxpbmVTdGF0ZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgPyBgJGV2ZW50YFxuICAgICAgICAgICAgICAgICAgICA6IGAke2BgfSguLi5hcmdzKWB9ID0+ICR7aGFzTXVsdGlwbGVTdGF0ZW1lbnRzID8gYHtgIDogYChgfWAsXG4gICAgICAgICAgICAgICAgZXhwLFxuICAgICAgICAgICAgICAgIGhhc011bHRpcGxlU3RhdGVtZW50cyA/IGB9YCA6IGApYFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJldCA9IHtcbiAgICAgICAgcHJvcHM6IFtcbiAgICAgICAgICAgIGNyZWF0ZU9iamVjdFByb3BlcnR5KGV2ZW50TmFtZSwgZXhwIHx8IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYCgpID0+IHt9YCwgZmFsc2UsIGxvYykpXG4gICAgICAgIF1cbiAgICB9O1xuICAgIC8vIGFwcGx5IGV4dGVuZGVkIGNvbXBpbGVyIGF1Z21lbnRvclxuICAgIGlmIChhdWdtZW50b3IpIHtcbiAgICAgICAgcmV0ID0gYXVnbWVudG9yKHJldCk7XG4gICAgfVxuICAgIGlmIChzaG91bGRDYWNoZSkge1xuICAgICAgICAvLyBjYWNoZSBoYW5kbGVycyBzbyB0aGF0IGl0J3MgYWx3YXlzIHRoZSBzYW1lIGhhbmRsZXIgYmVpbmcgcGFzc2VkIGRvd24uXG4gICAgICAgIC8vIHRoaXMgYXZvaWRzIHVubmVjZXNzYXJ5IHJlLXJlbmRlcnMgd2hlbiB1c2VycyB1c2UgaW5saW5lIGhhbmRsZXJzIG9uXG4gICAgICAgIC8vIGNvbXBvbmVudHMuXG4gICAgICAgIHJldC5wcm9wc1swXS52YWx1ZSA9IGNvbnRleHQuY2FjaGUocmV0LnByb3BzWzBdLnZhbHVlKTtcbiAgICB9XG4gICAgLy8gbWFyayB0aGUga2V5IGFzIGhhbmRsZXIgZm9yIHByb3BzIG5vcm1hbGl6YXRpb24gY2hlY2tcbiAgICByZXQucHJvcHMuZm9yRWFjaChwID0+IChwLmtleS5pc0hhbmRsZXJLZXkgPSB0cnVlKSk7XG4gICAgcmV0dXJuIHJldDtcbn07XG5cbi8vIHYtYmluZCB3aXRob3V0IGFyZyBpcyBoYW5kbGVkIGRpcmVjdGx5IGluIC4vdHJhbnNmb3JtRWxlbWVudHMudHMgZHVlIHRvIGl0IGFmZmVjdGluZ1xuLy8gY29kZWdlbiBmb3IgdGhlIGVudGlyZSBwcm9wcyBvYmplY3QuIFRoaXMgdHJhbnNmb3JtIGhlcmUgaXMgb25seSBmb3Igdi1iaW5kXG4vLyAqd2l0aCogYXJncy5cbmNvbnN0IHRyYW5zZm9ybUJpbmQgPSAoZGlyLCBfbm9kZSwgY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgZXhwLCBtb2RpZmllcnMsIGxvYyB9ID0gZGlyO1xuICAgIGNvbnN0IGFyZyA9IGRpci5hcmc7XG4gICAgaWYgKGFyZy50eXBlICE9PSA0IC8qIE5vZGVUeXBlcy5TSU1QTEVfRVhQUkVTU0lPTiAqLykge1xuICAgICAgICBhcmcuY2hpbGRyZW4udW5zaGlmdChgKGApO1xuICAgICAgICBhcmcuY2hpbGRyZW4ucHVzaChgKSB8fCBcIlwiYCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFhcmcuaXNTdGF0aWMpIHtcbiAgICAgICAgYXJnLmNvbnRlbnQgPSBgJHthcmcuY29udGVudH0gfHwgXCJcImA7XG4gICAgfVxuICAgIC8vIC5zeW5jIGlzIHJlcGxhY2VkIGJ5IHYtbW9kZWw6YXJnXG4gICAgaWYgKG1vZGlmaWVycy5pbmNsdWRlcygnY2FtZWwnKSkge1xuICAgICAgICBpZiAoYXJnLnR5cGUgPT09IDQgLyogTm9kZVR5cGVzLlNJTVBMRV9FWFBSRVNTSU9OICovKSB7XG4gICAgICAgICAgICBpZiAoYXJnLmlzU3RhdGljKSB7XG4gICAgICAgICAgICAgICAgYXJnLmNvbnRlbnQgPSBjYW1lbGl6ZSQxKGFyZy5jb250ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFyZy5jb250ZW50ID0gYCR7Y29udGV4dC5oZWxwZXJTdHJpbmcoQ0FNRUxJWkUpfSgke2FyZy5jb250ZW50fSlgO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXJnLmNoaWxkcmVuLnVuc2hpZnQoYCR7Y29udGV4dC5oZWxwZXJTdHJpbmcoQ0FNRUxJWkUpfShgKTtcbiAgICAgICAgICAgIGFyZy5jaGlsZHJlbi5wdXNoKGApYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFjb250ZXh0LmluU1NSKSB7XG4gICAgICAgIGlmIChtb2RpZmllcnMuaW5jbHVkZXMoJ3Byb3AnKSkge1xuICAgICAgICAgICAgaW5qZWN0UHJlZml4KGFyZywgJy4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kaWZpZXJzLmluY2x1ZGVzKCdhdHRyJykpIHtcbiAgICAgICAgICAgIGluamVjdFByZWZpeChhcmcsICdeJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFleHAgfHxcbiAgICAgICAgKGV4cC50eXBlID09PSA0IC8qIE5vZGVUeXBlcy5TSU1QTEVfRVhQUkVTU0lPTiAqLyAmJiAhZXhwLmNvbnRlbnQudHJpbSgpKSkge1xuICAgICAgICBjb250ZXh0Lm9uRXJyb3IoY3JlYXRlQ29tcGlsZXJFcnJvcigzNCAvKiBFcnJvckNvZGVzLlhfVl9CSU5EX05PX0VYUFJFU1NJT04gKi8sIGxvYykpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJvcHM6IFtjcmVhdGVPYmplY3RQcm9wZXJ0eShhcmcsIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oJycsIHRydWUsIGxvYykpXVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9wczogW2NyZWF0ZU9iamVjdFByb3BlcnR5KGFyZywgZXhwKV1cbiAgICB9O1xufTtcbmNvbnN0IGluamVjdFByZWZpeCA9IChhcmcsIHByZWZpeCkgPT4ge1xuICAgIGlmIChhcmcudHlwZSA9PT0gNCAvKiBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT04gKi8pIHtcbiAgICAgICAgaWYgKGFyZy5pc1N0YXRpYykge1xuICAgICAgICAgICAgYXJnLmNvbnRlbnQgPSBwcmVmaXggKyBhcmcuY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFyZy5jb250ZW50ID0gYFxcYCR7cHJlZml4fVxcJHske2FyZy5jb250ZW50fX1cXGBgO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhcmcuY2hpbGRyZW4udW5zaGlmdChgJyR7cHJlZml4fScgKyAoYCk7XG4gICAgICAgIGFyZy5jaGlsZHJlbi5wdXNoKGApYCk7XG4gICAgfVxufTtcblxuLy8gTWVyZ2UgYWRqYWNlbnQgdGV4dCBub2RlcyBhbmQgZXhwcmVzc2lvbnMgaW50byBhIHNpbmdsZSBleHByZXNzaW9uXG4vLyBlLmcuIDxkaXY+YWJjIHt7IGQgfX0ge3sgZSB9fTwvZGl2PiBzaG91bGQgaGF2ZSBhIHNpbmdsZSBleHByZXNzaW9uIG5vZGUgYXMgY2hpbGQuXG5jb25zdCB0cmFuc2Zvcm1UZXh0ID0gKG5vZGUsIGNvbnRleHQpID0+IHtcbiAgICBpZiAobm9kZS50eXBlID09PSAwIC8qIE5vZGVUeXBlcy5ST09UICovIHx8XG4gICAgICAgIG5vZGUudHlwZSA9PT0gMSAvKiBOb2RlVHlwZXMuRUxFTUVOVCAqLyB8fFxuICAgICAgICBub2RlLnR5cGUgPT09IDExIC8qIE5vZGVUeXBlcy5GT1IgKi8gfHxcbiAgICAgICAgbm9kZS50eXBlID09PSAxMCAvKiBOb2RlVHlwZXMuSUZfQlJBTkNIICovKSB7XG4gICAgICAgIC8vIHBlcmZvcm0gdGhlIHRyYW5zZm9ybSBvbiBub2RlIGV4aXQgc28gdGhhdCBhbGwgZXhwcmVzc2lvbnMgaGF2ZSBhbHJlYWR5XG4gICAgICAgIC8vIGJlZW4gcHJvY2Vzc2VkLlxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRDb250YWluZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgaGFzVGV4dCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgaWYgKGlzVGV4dCQxKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNUZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBjaGlsZHJlbltqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1RleHQkMShuZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudENvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29udGFpbmVyID0gY2hpbGRyZW5baV0gPSBjcmVhdGVDb21wb3VuZEV4cHJlc3Npb24oW2NoaWxkXSwgY2hpbGQubG9jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2RlIGludG8gY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250YWluZXIuY2hpbGRyZW4ucHVzaChgICsgYCwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGosIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250YWluZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWhhc1RleHQgfHxcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgcGxhaW4gZWxlbWVudCB3aXRoIGEgc2luZ2xlIHRleHQgY2hpbGQsIGxlYXZlIGl0XG4gICAgICAgICAgICAgICAgLy8gYXMtaXMgc2luY2UgdGhlIHJ1bnRpbWUgaGFzIGRlZGljYXRlZCBmYXN0IHBhdGggZm9yIHRoaXMgYnkgZGlyZWN0bHlcbiAgICAgICAgICAgICAgICAvLyBzZXR0aW5nIHRleHRDb250ZW50IG9mIHRoZSBlbGVtZW50LlxuICAgICAgICAgICAgICAgIC8vIGZvciBjb21wb25lbnQgcm9vdCBpdCdzIGFsd2F5cyBub3JtYWxpemVkIGFueXdheS5cbiAgICAgICAgICAgICAgICAoY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgIChub2RlLnR5cGUgPT09IDAgLyogTm9kZVR5cGVzLlJPT1QgKi8gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChub2RlLnR5cGUgPT09IDEgLyogTm9kZVR5cGVzLkVMRU1FTlQgKi8gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnRhZ1R5cGUgPT09IDAgLyogRWxlbWVudFR5cGVzLkVMRU1FTlQgKi8gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAjMzc1NlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBkaXJlY3RpdmVzIGNhbiBwb3RlbnRpYWxseSBhZGQgRE9NIGVsZW1lbnRzIGFyYml0cmFyaWx5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gYXZvaWQgc2V0dGluZyB0ZXh0Q29udGVudCBvZiB0aGUgZWxlbWVudCBhdCBydW50aW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYXZvaWQgYWNjaWRlbnRhbGx5IG92ZXJ3cml0aW5nIHRoZSBET00gZWxlbWVudHMgYWRkZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieSB0aGUgdXNlciB0aHJvdWdoIGN1c3RvbSBkaXJlY3RpdmVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFub2RlLnByb3BzLmZpbmQocCA9PiBwLnR5cGUgPT09IDcgLyogTm9kZVR5cGVzLkRJUkVDVElWRSAqLyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY29udGV4dC5kaXJlY3RpdmVUcmFuc2Zvcm1zW3AubmFtZV0pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gY29tcGF0IG1vZGUsIDx0ZW1wbGF0ZT4gdGFncyB3aXRoIG5vIHNwZWNpYWwgZGlyZWN0aXZlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgcmVuZGVyZWQgYXMgYSBmcmFnbWVudCBzbyBpdHMgY2hpbGRyZW4gbXVzdCBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnRlZCBpbnRvIHZub2Rlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKG5vZGUudGFnID09PSAndGVtcGxhdGUnKSkpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHByZS1jb252ZXJ0IHRleHQgbm9kZXMgaW50byBjcmVhdGVUZXh0Vk5vZGUodGV4dCkgY2FsbHMgdG8gYXZvaWRcbiAgICAgICAgICAgIC8vIHJ1bnRpbWUgbm9ybWFsaXphdGlvbi5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGlmIChpc1RleHQkMShjaGlsZCkgfHwgY2hpbGQudHlwZSA9PT0gOCAvKiBOb2RlVHlwZXMuQ09NUE9VTkRfRVhQUkVTU0lPTiAqLykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsQXJncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVUZXh0Vk5vZGUgZGVmYXVsdHMgdG8gc2luZ2xlIHdoaXRlc3BhY2UsIHNvIGlmIGl0IGlzIGFcbiAgICAgICAgICAgICAgICAgICAgLy8gc2luZ2xlIHNwYWNlIHRoZSBjb2RlIGNvdWxkIGJlIGFuIGVtcHR5IGNhbGwgdG8gc2F2ZSBieXRlcy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLnR5cGUgIT09IDIgLyogTm9kZVR5cGVzLlRFWFQgKi8gfHwgY2hpbGQuY29udGVudCAhPT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsQXJncy5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGR5bmFtaWMgdGV4dCB3aXRoIGZsYWcgc28gaXQgZ2V0cyBwYXRjaGVkIGluc2lkZSBhIGJsb2NrXG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGV4dC5zc3IgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnN0YW50VHlwZShjaGlsZCwgY29udGV4dCkgPT09IDAgLyogQ29uc3RhbnRUeXBlcy5OT1RfQ09OU1RBTlQgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxBcmdzLnB1c2goMSAvKiBQYXRjaEZsYWdzLlRFWFQgKi8gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBgIC8qICR7UGF0Y2hGbGFnTmFtZXNbMSAvKiBQYXRjaEZsYWdzLlRFWFQgKi9dfSAqL2AgOiBgYCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogMTIgLyogTm9kZVR5cGVzLlRFWFRfQ0FMTCAqLyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNoaWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiBjaGlsZC5sb2MsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuTm9kZTogY3JlYXRlQ2FsbEV4cHJlc3Npb24oY29udGV4dC5oZWxwZXIoQ1JFQVRFX1RFWFQpLCBjYWxsQXJncylcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufTtcblxuY29uc3Qgc2VlbiQxID0gbmV3IFdlYWtTZXQoKTtcbmNvbnN0IHRyYW5zZm9ybU9uY2UgPSAobm9kZSwgY29udGV4dCkgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09IDEgLyogTm9kZVR5cGVzLkVMRU1FTlQgKi8gJiYgZmluZERpcihub2RlLCAnb25jZScsIHRydWUpKSB7XG4gICAgICAgIGlmIChzZWVuJDEuaGFzKG5vZGUpIHx8IGNvbnRleHQuaW5WT25jZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlZW4kMS5hZGQobm9kZSk7XG4gICAgICAgIGNvbnRleHQuaW5WT25jZSA9IHRydWU7XG4gICAgICAgIGNvbnRleHQuaGVscGVyKFNFVF9CTE9DS19UUkFDS0lORyk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb250ZXh0LmluVk9uY2UgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGN1ciA9IGNvbnRleHQuY3VycmVudE5vZGU7XG4gICAgICAgICAgICBpZiAoY3VyLmNvZGVnZW5Ob2RlKSB7XG4gICAgICAgICAgICAgICAgY3VyLmNvZGVnZW5Ob2RlID0gY29udGV4dC5jYWNoZShjdXIuY29kZWdlbk5vZGUsIHRydWUgLyogaXNWTm9kZSAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufTtcblxuY29uc3QgdHJhbnNmb3JtTW9kZWwgPSAoZGlyLCBub2RlLCBjb250ZXh0KSA9PiB7XG4gICAgY29uc3QgeyBleHAsIGFyZyB9ID0gZGlyO1xuICAgIGlmICghZXhwKSB7XG4gICAgICAgIGNvbnRleHQub25FcnJvcihjcmVhdGVDb21waWxlckVycm9yKDQxIC8qIEVycm9yQ29kZXMuWF9WX01PREVMX05PX0VYUFJFU1NJT04gKi8sIGRpci5sb2MpKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVRyYW5zZm9ybVByb3BzKCk7XG4gICAgfVxuICAgIGNvbnN0IHJhd0V4cCA9IGV4cC5sb2Muc291cmNlO1xuICAgIGNvbnN0IGV4cFN0cmluZyA9IGV4cC50eXBlID09PSA0IC8qIE5vZGVUeXBlcy5TSU1QTEVfRVhQUkVTU0lPTiAqLyA/IGV4cC5jb250ZW50IDogcmF3RXhwO1xuICAgIC8vIGltIFNGQyA8c2NyaXB0IHNldHVwPiBpbmxpbmUgbW9kZSwgdGhlIGV4cCBtYXkgaGF2ZSBiZWVuIHRyYW5zZm9ybWVkIGludG9cbiAgICAvLyBfdW5yZWYoZXhwKVxuICAgIGNvbnN0IGJpbmRpbmdUeXBlID0gY29udGV4dC5iaW5kaW5nTWV0YWRhdGFbcmF3RXhwXTtcbiAgICAvLyBjaGVjayBwcm9wc1xuICAgIGlmIChiaW5kaW5nVHlwZSA9PT0gXCJwcm9wc1wiIC8qIEJpbmRpbmdUeXBlcy5QUk9QUyAqLyB8fFxuICAgICAgICBiaW5kaW5nVHlwZSA9PT0gXCJwcm9wcy1hbGlhc2VkXCIgLyogQmluZGluZ1R5cGVzLlBST1BTX0FMSUFTRUQgKi8pIHtcbiAgICAgICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoNDQgLyogRXJyb3JDb2Rlcy5YX1ZfTU9ERUxfT05fUFJPUFMgKi8sIGV4cC5sb2MpKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVRyYW5zZm9ybVByb3BzKCk7XG4gICAgfVxuICAgIGNvbnN0IG1heWJlUmVmID0gIXRydWUgIDtcbiAgICBpZiAoIWV4cFN0cmluZy50cmltKCkgfHxcbiAgICAgICAgKCFpc01lbWJlckV4cHJlc3Npb24oZXhwU3RyaW5nKSAmJiAhbWF5YmVSZWYpKSB7XG4gICAgICAgIGNvbnRleHQub25FcnJvcihjcmVhdGVDb21waWxlckVycm9yKDQyIC8qIEVycm9yQ29kZXMuWF9WX01PREVMX01BTEZPUk1FRF9FWFBSRVNTSU9OICovLCBleHAubG9jKSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVUcmFuc2Zvcm1Qcm9wcygpO1xuICAgIH1cbiAgICBjb25zdCBwcm9wTmFtZSA9IGFyZyA/IGFyZyA6IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oJ21vZGVsVmFsdWUnLCB0cnVlKTtcbiAgICBjb25zdCBldmVudE5hbWUgPSBhcmdcbiAgICAgICAgPyBpc1N0YXRpY0V4cChhcmcpXG4gICAgICAgICAgICA/IGBvblVwZGF0ZToke2NhbWVsaXplJDEoYXJnLmNvbnRlbnQpfWBcbiAgICAgICAgICAgIDogY3JlYXRlQ29tcG91bmRFeHByZXNzaW9uKFsnXCJvblVwZGF0ZTpcIiArICcsIGFyZ10pXG4gICAgICAgIDogYG9uVXBkYXRlOm1vZGVsVmFsdWVgO1xuICAgIGxldCBhc3NpZ25tZW50RXhwO1xuICAgIGNvbnN0IGV2ZW50QXJnID0gY29udGV4dC5pc1RTID8gYCgkZXZlbnQ6IGFueSlgIDogYCRldmVudGA7XG4gICAge1xuICAgICAgICBhc3NpZ25tZW50RXhwID0gY3JlYXRlQ29tcG91bmRFeHByZXNzaW9uKFtcbiAgICAgICAgICAgIGAke2V2ZW50QXJnfSA9PiAoKGAsXG4gICAgICAgICAgICBleHAsXG4gICAgICAgICAgICBgKSA9ICRldmVudClgXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjb25zdCBwcm9wcyA9IFtcbiAgICAgICAgLy8gbW9kZWxWYWx1ZTogZm9vXG4gICAgICAgIGNyZWF0ZU9iamVjdFByb3BlcnR5KHByb3BOYW1lLCBkaXIuZXhwKSxcbiAgICAgICAgLy8gXCJvblVwZGF0ZTptb2RlbFZhbHVlXCI6ICRldmVudCA9PiAoZm9vID0gJGV2ZW50KVxuICAgICAgICBjcmVhdGVPYmplY3RQcm9wZXJ0eShldmVudE5hbWUsIGFzc2lnbm1lbnRFeHApXG4gICAgXTtcbiAgICAvLyBtb2RlbE1vZGlmaWVyczogeyBmb286IHRydWUsIFwiYmFyLWJhelwiOiB0cnVlIH1cbiAgICBpZiAoZGlyLm1vZGlmaWVycy5sZW5ndGggJiYgbm9kZS50YWdUeXBlID09PSAxIC8qIEVsZW1lbnRUeXBlcy5DT01QT05FTlQgKi8pIHtcbiAgICAgICAgY29uc3QgbW9kaWZpZXJzID0gZGlyLm1vZGlmaWVyc1xuICAgICAgICAgICAgLm1hcChtID0+IChpc1NpbXBsZUlkZW50aWZpZXIobSkgPyBtIDogSlNPTi5zdHJpbmdpZnkobSkpICsgYDogdHJ1ZWApXG4gICAgICAgICAgICAuam9pbihgLCBgKTtcbiAgICAgICAgY29uc3QgbW9kaWZpZXJzS2V5ID0gYXJnXG4gICAgICAgICAgICA/IGlzU3RhdGljRXhwKGFyZylcbiAgICAgICAgICAgICAgICA/IGAke2FyZy5jb250ZW50fU1vZGlmaWVyc2BcbiAgICAgICAgICAgICAgICA6IGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihbYXJnLCAnICsgXCJNb2RpZmllcnNcIiddKVxuICAgICAgICAgICAgOiBgbW9kZWxNb2RpZmllcnNgO1xuICAgICAgICBwcm9wcy5wdXNoKGNyZWF0ZU9iamVjdFByb3BlcnR5KG1vZGlmaWVyc0tleSwgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihgeyAke21vZGlmaWVyc30gfWAsIGZhbHNlLCBkaXIubG9jLCAyIC8qIENvbnN0YW50VHlwZXMuQ0FOX0hPSVNUICovKSkpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlVHJhbnNmb3JtUHJvcHMocHJvcHMpO1xufTtcbmZ1bmN0aW9uIGNyZWF0ZVRyYW5zZm9ybVByb3BzKHByb3BzID0gW10pIHtcbiAgICByZXR1cm4geyBwcm9wcyB9O1xufVxuXG5jb25zdCB2YWxpZERpdmlzaW9uQ2hhclJFID0gL1tcXHcpLitcXC1fJFxcXV0vO1xuY29uc3QgdHJhbnNmb3JtRmlsdGVyID0gKG5vZGUsIGNvbnRleHQpID0+IHtcbiAgICBpZiAoIWlzQ29tcGF0RW5hYmxlZChcIkNPTVBJTEVSX0ZJTFRFUlwiIC8qIENvbXBpbGVyRGVwcmVjYXRpb25UeXBlcy5DT01QSUxFUl9GSUxURVJTICovLCBjb250ZXh0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChub2RlLnR5cGUgPT09IDUgLyogTm9kZVR5cGVzLklOVEVSUE9MQVRJT04gKi8pIHtcbiAgICAgICAgLy8gZmlsdGVyIHJld3JpdGUgaXMgYXBwbGllZCBiZWZvcmUgZXhwcmVzc2lvbiB0cmFuc2Zvcm0gc28gb25seVxuICAgICAgICAvLyBzaW1wbGUgZXhwcmVzc2lvbnMgYXJlIHBvc3NpYmxlIGF0IHRoaXMgc3RhZ2VcbiAgICAgICAgcmV3cml0ZUZpbHRlcihub2RlLmNvbnRlbnQsIGNvbnRleHQpO1xuICAgIH1cbiAgICBpZiAobm9kZS50eXBlID09PSAxIC8qIE5vZGVUeXBlcy5FTEVNRU5UICovKSB7XG4gICAgICAgIG5vZGUucHJvcHMuZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gNyAvKiBOb2RlVHlwZXMuRElSRUNUSVZFICovICYmXG4gICAgICAgICAgICAgICAgcHJvcC5uYW1lICE9PSAnZm9yJyAmJlxuICAgICAgICAgICAgICAgIHByb3AuZXhwKSB7XG4gICAgICAgICAgICAgICAgcmV3cml0ZUZpbHRlcihwcm9wLmV4cCwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5mdW5jdGlvbiByZXdyaXRlRmlsdGVyKG5vZGUsIGNvbnRleHQpIHtcbiAgICBpZiAobm9kZS50eXBlID09PSA0IC8qIE5vZGVUeXBlcy5TSU1QTEVfRVhQUkVTU0lPTiAqLykge1xuICAgICAgICBwYXJzZUZpbHRlcihub2RlLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gNCAvKiBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT04gKi8pIHtcbiAgICAgICAgICAgICAgICBwYXJzZUZpbHRlcihjaGlsZCwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGlsZC50eXBlID09PSA4IC8qIE5vZGVUeXBlcy5DT01QT1VORF9FWFBSRVNTSU9OICovKSB7XG4gICAgICAgICAgICAgICAgcmV3cml0ZUZpbHRlcihub2RlLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkLnR5cGUgPT09IDUgLyogTm9kZVR5cGVzLklOVEVSUE9MQVRJT04gKi8pIHtcbiAgICAgICAgICAgICAgICByZXdyaXRlRmlsdGVyKGNoaWxkLmNvbnRlbnQsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VGaWx0ZXIobm9kZSwgY29udGV4dCkge1xuICAgIGNvbnN0IGV4cCA9IG5vZGUuY29udGVudDtcbiAgICBsZXQgaW5TaW5nbGUgPSBmYWxzZTtcbiAgICBsZXQgaW5Eb3VibGUgPSBmYWxzZTtcbiAgICBsZXQgaW5UZW1wbGF0ZVN0cmluZyA9IGZhbHNlO1xuICAgIGxldCBpblJlZ2V4ID0gZmFsc2U7XG4gICAgbGV0IGN1cmx5ID0gMDtcbiAgICBsZXQgc3F1YXJlID0gMDtcbiAgICBsZXQgcGFyZW4gPSAwO1xuICAgIGxldCBsYXN0RmlsdGVySW5kZXggPSAwO1xuICAgIGxldCBjLCBwcmV2LCBpLCBleHByZXNzaW9uLCBmaWx0ZXJzID0gW107XG4gICAgZm9yIChpID0gMDsgaSA8IGV4cC5sZW5ndGg7IGkrKykge1xuICAgICAgICBwcmV2ID0gYztcbiAgICAgICAgYyA9IGV4cC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoaW5TaW5nbGUpIHtcbiAgICAgICAgICAgIGlmIChjID09PSAweDI3ICYmIHByZXYgIT09IDB4NWMpXG4gICAgICAgICAgICAgICAgaW5TaW5nbGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbkRvdWJsZSkge1xuICAgICAgICAgICAgaWYgKGMgPT09IDB4MjIgJiYgcHJldiAhPT0gMHg1YylcbiAgICAgICAgICAgICAgICBpbkRvdWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluVGVtcGxhdGVTdHJpbmcpIHtcbiAgICAgICAgICAgIGlmIChjID09PSAweDYwICYmIHByZXYgIT09IDB4NWMpXG4gICAgICAgICAgICAgICAgaW5UZW1wbGF0ZVN0cmluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluUmVnZXgpIHtcbiAgICAgICAgICAgIGlmIChjID09PSAweDJmICYmIHByZXYgIT09IDB4NWMpXG4gICAgICAgICAgICAgICAgaW5SZWdleCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGMgPT09IDB4N2MgJiYgLy8gcGlwZVxuICAgICAgICAgICAgZXhwLmNoYXJDb2RlQXQoaSArIDEpICE9PSAweDdjICYmXG4gICAgICAgICAgICBleHAuY2hhckNvZGVBdChpIC0gMSkgIT09IDB4N2MgJiZcbiAgICAgICAgICAgICFjdXJseSAmJlxuICAgICAgICAgICAgIXNxdWFyZSAmJlxuICAgICAgICAgICAgIXBhcmVuKSB7XG4gICAgICAgICAgICBpZiAoZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gZmlyc3QgZmlsdGVyLCBlbmQgb2YgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIGxhc3RGaWx0ZXJJbmRleCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBleHAuc2xpY2UoMCwgaSkudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHVzaEZpbHRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAweDIyOlxuICAgICAgICAgICAgICAgICAgICBpbkRvdWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBcIlxuICAgICAgICAgICAgICAgIGNhc2UgMHgyNzpcbiAgICAgICAgICAgICAgICAgICAgaW5TaW5nbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gJ1xuICAgICAgICAgICAgICAgIGNhc2UgMHg2MDpcbiAgICAgICAgICAgICAgICAgICAgaW5UZW1wbGF0ZVN0cmluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBgXG4gICAgICAgICAgICAgICAgY2FzZSAweDI4OlxuICAgICAgICAgICAgICAgICAgICBwYXJlbisrO1xuICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gKFxuICAgICAgICAgICAgICAgIGNhc2UgMHgyOTpcbiAgICAgICAgICAgICAgICAgICAgcGFyZW4tLTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIClcbiAgICAgICAgICAgICAgICBjYXNlIDB4NWI6XG4gICAgICAgICAgICAgICAgICAgIHNxdWFyZSsrO1xuICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gW1xuICAgICAgICAgICAgICAgIGNhc2UgMHg1ZDpcbiAgICAgICAgICAgICAgICAgICAgc3F1YXJlLS07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBdXG4gICAgICAgICAgICAgICAgY2FzZSAweDdiOlxuICAgICAgICAgICAgICAgICAgICBjdXJseSsrO1xuICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8ge1xuICAgICAgICAgICAgICAgIGNhc2UgMHg3ZDpcbiAgICAgICAgICAgICAgICAgICAgY3VybHktLTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjID09PSAweDJmKSB7XG4gICAgICAgICAgICAgICAgLy8gL1xuICAgICAgICAgICAgICAgIGxldCBqID0gaSAtIDE7XG4gICAgICAgICAgICAgICAgbGV0IHA7XG4gICAgICAgICAgICAgICAgLy8gZmluZCBmaXJzdCBub24td2hpdGVzcGFjZSBwcmV2IGNoYXJcbiAgICAgICAgICAgICAgICBmb3IgKDsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgcCA9IGV4cC5jaGFyQXQoaik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwICE9PSAnICcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFwIHx8ICF2YWxpZERpdmlzaW9uQ2hhclJFLnRlc3QocCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5SZWdleCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChleHByZXNzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhwcmVzc2lvbiA9IGV4cC5zbGljZSgwLCBpKS50cmltKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGxhc3RGaWx0ZXJJbmRleCAhPT0gMCkge1xuICAgICAgICBwdXNoRmlsdGVyKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHB1c2hGaWx0ZXIoKSB7XG4gICAgICAgIGZpbHRlcnMucHVzaChleHAuc2xpY2UobGFzdEZpbHRlckluZGV4LCBpKS50cmltKCkpO1xuICAgICAgICBsYXN0RmlsdGVySW5kZXggPSBpICsgMTtcbiAgICB9XG4gICAgaWYgKGZpbHRlcnMubGVuZ3RoKSB7XG4gICAgICAgIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJlxuICAgICAgICAgICAgd2FybkRlcHJlY2F0aW9uKFwiQ09NUElMRVJfRklMVEVSXCIgLyogQ29tcGlsZXJEZXByZWNhdGlvblR5cGVzLkNPTVBJTEVSX0ZJTFRFUlMgKi8sIGNvbnRleHQsIG5vZGUubG9jKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb24gPSB3cmFwRmlsdGVyKGV4cHJlc3Npb24sIGZpbHRlcnNbaV0sIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuY29udGVudCA9IGV4cHJlc3Npb247XG4gICAgfVxufVxuZnVuY3Rpb24gd3JhcEZpbHRlcihleHAsIGZpbHRlciwgY29udGV4dCkge1xuICAgIGNvbnRleHQuaGVscGVyKFJFU09MVkVfRklMVEVSKTtcbiAgICBjb25zdCBpID0gZmlsdGVyLmluZGV4T2YoJygnKTtcbiAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgY29udGV4dC5maWx0ZXJzLmFkZChmaWx0ZXIpO1xuICAgICAgICByZXR1cm4gYCR7dG9WYWxpZEFzc2V0SWQoZmlsdGVyLCAnZmlsdGVyJyl9KCR7ZXhwfSlgO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGZpbHRlci5zbGljZSgwLCBpKTtcbiAgICAgICAgY29uc3QgYXJncyA9IGZpbHRlci5zbGljZShpICsgMSk7XG4gICAgICAgIGNvbnRleHQuZmlsdGVycy5hZGQobmFtZSk7XG4gICAgICAgIHJldHVybiBgJHt0b1ZhbGlkQXNzZXRJZChuYW1lLCAnZmlsdGVyJyl9KCR7ZXhwfSR7YXJncyAhPT0gJyknID8gJywnICsgYXJncyA6IGFyZ3N9YDtcbiAgICB9XG59XG5cbmNvbnN0IHNlZW4gPSBuZXcgV2Vha1NldCgpO1xuY29uc3QgdHJhbnNmb3JtTWVtbyA9IChub2RlLCBjb250ZXh0KSA9PiB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gMSAvKiBOb2RlVHlwZXMuRUxFTUVOVCAqLykge1xuICAgICAgICBjb25zdCBkaXIgPSBmaW5kRGlyKG5vZGUsICdtZW1vJyk7XG4gICAgICAgIGlmICghZGlyIHx8IHNlZW4uaGFzKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2Vlbi5hZGQobm9kZSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2RlZ2VuTm9kZSA9IG5vZGUuY29kZWdlbk5vZGUgfHxcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnROb2RlLmNvZGVnZW5Ob2RlO1xuICAgICAgICAgICAgaWYgKGNvZGVnZW5Ob2RlICYmIGNvZGVnZW5Ob2RlLnR5cGUgPT09IDEzIC8qIE5vZGVUeXBlcy5WTk9ERV9DQUxMICovKSB7XG4gICAgICAgICAgICAgICAgLy8gbm9uLWNvbXBvbmVudCBzdWIgdHJlZSBzaG91bGQgYmUgdHVybmVkIGludG8gYSBibG9ja1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnRhZ1R5cGUgIT09IDEgLyogRWxlbWVudFR5cGVzLkNPTVBPTkVOVCAqLykge1xuICAgICAgICAgICAgICAgICAgICBtYWtlQmxvY2soY29kZWdlbk5vZGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlLmNvZGVnZW5Ob2RlID0gY3JlYXRlQ2FsbEV4cHJlc3Npb24oY29udGV4dC5oZWxwZXIoV0lUSF9NRU1PKSwgW1xuICAgICAgICAgICAgICAgICAgICBkaXIuZXhwLFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVGdW5jdGlvbkV4cHJlc3Npb24odW5kZWZpbmVkLCBjb2RlZ2VuTm9kZSksXG4gICAgICAgICAgICAgICAgICAgIGBfY2FjaGVgLFxuICAgICAgICAgICAgICAgICAgICBTdHJpbmcoY29udGV4dC5jYWNoZWQrKylcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBnZXRCYXNlVHJhbnNmb3JtUHJlc2V0KHByZWZpeElkZW50aWZpZXJzKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgW1xuICAgICAgICAgICAgdHJhbnNmb3JtT25jZSxcbiAgICAgICAgICAgIHRyYW5zZm9ybUlmLFxuICAgICAgICAgICAgdHJhbnNmb3JtTWVtbyxcbiAgICAgICAgICAgIHRyYW5zZm9ybUZvcixcbiAgICAgICAgICAgIC4uLihbdHJhbnNmb3JtRmlsdGVyXSApLFxuICAgICAgICAgICAgLi4uKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKVxuICAgICAgICAgICAgICAgICAgICA/IFt0cmFuc2Zvcm1FeHByZXNzaW9uXVxuICAgICAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAgIHRyYW5zZm9ybVNsb3RPdXRsZXQsXG4gICAgICAgICAgICB0cmFuc2Zvcm1FbGVtZW50LFxuICAgICAgICAgICAgdHJhY2tTbG90U2NvcGVzLFxuICAgICAgICAgICAgdHJhbnNmb3JtVGV4dFxuICAgICAgICBdLFxuICAgICAgICB7XG4gICAgICAgICAgICBvbjogdHJhbnNmb3JtT24sXG4gICAgICAgICAgICBiaW5kOiB0cmFuc2Zvcm1CaW5kLFxuICAgICAgICAgICAgbW9kZWw6IHRyYW5zZm9ybU1vZGVsXG4gICAgICAgIH1cbiAgICBdO1xufVxuLy8gd2UgbmFtZSBpdCBgYmFzZUNvbXBpbGVgIHNvIHRoYXQgaGlnaGVyIG9yZGVyIGNvbXBpbGVycyBsaWtlXG4vLyBAdnVlL2NvbXBpbGVyLWRvbSBjYW4gZXhwb3J0IGBjb21waWxlYCB3aGlsZSByZS1leHBvcnRpbmcgZXZlcnl0aGluZyBlbHNlLlxuZnVuY3Rpb24gYmFzZUNvbXBpbGUodGVtcGxhdGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IG9uRXJyb3IgPSBvcHRpb25zLm9uRXJyb3IgfHwgZGVmYXVsdE9uRXJyb3I7XG4gICAgY29uc3QgaXNNb2R1bGVNb2RlID0gb3B0aW9ucy5tb2RlID09PSAnbW9kdWxlJztcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICB7XG4gICAgICAgIGlmIChvcHRpb25zLnByZWZpeElkZW50aWZpZXJzID09PSB0cnVlKSB7XG4gICAgICAgICAgICBvbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoNDcgLyogRXJyb3JDb2Rlcy5YX1BSRUZJWF9JRF9OT1RfU1VQUE9SVEVEICovKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNNb2R1bGVNb2RlKSB7XG4gICAgICAgICAgICBvbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoNDggLyogRXJyb3JDb2Rlcy5YX01PRFVMRV9NT0RFX05PVF9TVVBQT1JURUQgKi8pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcmVmaXhJZGVudGlmaWVycyA9ICF0cnVlIDtcbiAgICBpZiAob3B0aW9ucy5jYWNoZUhhbmRsZXJzKSB7XG4gICAgICAgIG9uRXJyb3IoY3JlYXRlQ29tcGlsZXJFcnJvcig0OSAvKiBFcnJvckNvZGVzLlhfQ0FDSEVfSEFORExFUl9OT1RfU1VQUE9SVEVEICovKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnNjb3BlSWQgJiYgIWlzTW9kdWxlTW9kZSkge1xuICAgICAgICBvbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoNTAgLyogRXJyb3JDb2Rlcy5YX1NDT1BFX0lEX05PVF9TVVBQT1JURUQgKi8pKTtcbiAgICB9XG4gICAgY29uc3QgYXN0ID0gaXNTdHJpbmcodGVtcGxhdGUpID8gYmFzZVBhcnNlKHRlbXBsYXRlLCBvcHRpb25zKSA6IHRlbXBsYXRlO1xuICAgIGNvbnN0IFtub2RlVHJhbnNmb3JtcywgZGlyZWN0aXZlVHJhbnNmb3Jtc10gPSBnZXRCYXNlVHJhbnNmb3JtUHJlc2V0KCk7XG4gICAgdHJhbnNmb3JtKGFzdCwgZXh0ZW5kKHt9LCBvcHRpb25zLCB7XG4gICAgICAgIHByZWZpeElkZW50aWZpZXJzLFxuICAgICAgICBub2RlVHJhbnNmb3JtczogW1xuICAgICAgICAgICAgLi4ubm9kZVRyYW5zZm9ybXMsXG4gICAgICAgICAgICAuLi4ob3B0aW9ucy5ub2RlVHJhbnNmb3JtcyB8fCBbXSkgLy8gdXNlciB0cmFuc2Zvcm1zXG4gICAgICAgIF0sXG4gICAgICAgIGRpcmVjdGl2ZVRyYW5zZm9ybXM6IGV4dGVuZCh7fSwgZGlyZWN0aXZlVHJhbnNmb3Jtcywgb3B0aW9ucy5kaXJlY3RpdmVUcmFuc2Zvcm1zIHx8IHt9IC8vIHVzZXIgdHJhbnNmb3Jtc1xuICAgICAgICApXG4gICAgfSkpO1xuICAgIHJldHVybiBnZW5lcmF0ZShhc3QsIGV4dGVuZCh7fSwgb3B0aW9ucywge1xuICAgICAgICBwcmVmaXhJZGVudGlmaWVyc1xuICAgIH0pKTtcbn1cblxuY29uc3Qgbm9vcERpcmVjdGl2ZVRyYW5zZm9ybSA9ICgpID0+ICh7IHByb3BzOiBbXSB9KTtcblxuZXhwb3J0IHsgQkFTRV9UUkFOU0lUSU9OLCBDQU1FTElaRSwgQ0FQSVRBTElaRSwgQ1JFQVRFX0JMT0NLLCBDUkVBVEVfQ09NTUVOVCwgQ1JFQVRFX0VMRU1FTlRfQkxPQ0ssIENSRUFURV9FTEVNRU5UX1ZOT0RFLCBDUkVBVEVfU0xPVFMsIENSRUFURV9TVEFUSUMsIENSRUFURV9URVhULCBDUkVBVEVfVk5PREUsIEZSQUdNRU5ULCBHVUFSRF9SRUFDVElWRV9QUk9QUywgSVNfTUVNT19TQU1FLCBJU19SRUYsIEtFRVBfQUxJVkUsIE1FUkdFX1BST1BTLCBOT1JNQUxJWkVfQ0xBU1MsIE5PUk1BTElaRV9QUk9QUywgTk9STUFMSVpFX1NUWUxFLCBPUEVOX0JMT0NLLCBQT1BfU0NPUEVfSUQsIFBVU0hfU0NPUEVfSUQsIFJFTkRFUl9MSVNULCBSRU5ERVJfU0xPVCwgUkVTT0xWRV9DT01QT05FTlQsIFJFU09MVkVfRElSRUNUSVZFLCBSRVNPTFZFX0RZTkFNSUNfQ09NUE9ORU5ULCBSRVNPTFZFX0ZJTFRFUiwgU0VUX0JMT0NLX1RSQUNLSU5HLCBTVVNQRU5TRSwgVEVMRVBPUlQsIFRPX0RJU1BMQVlfU1RSSU5HLCBUT19IQU5ETEVSUywgVE9fSEFORExFUl9LRVksIFVOUkVGLCBXSVRIX0NUWCwgV0lUSF9ESVJFQ1RJVkVTLCBXSVRIX01FTU8sIGFkdmFuY2VQb3NpdGlvbldpdGhDbG9uZSwgYWR2YW5jZVBvc2l0aW9uV2l0aE11dGF0aW9uLCBhc3NlcnQsIGJhc2VDb21waWxlLCBiYXNlUGFyc2UsIGJ1aWxkRGlyZWN0aXZlQXJncywgYnVpbGRQcm9wcywgYnVpbGRTbG90cywgY2hlY2tDb21wYXRFbmFibGVkLCBjcmVhdGVBcnJheUV4cHJlc3Npb24sIGNyZWF0ZUFzc2lnbm1lbnRFeHByZXNzaW9uLCBjcmVhdGVCbG9ja1N0YXRlbWVudCwgY3JlYXRlQ2FjaGVFeHByZXNzaW9uLCBjcmVhdGVDYWxsRXhwcmVzc2lvbiwgY3JlYXRlQ29tcGlsZXJFcnJvciwgY3JlYXRlQ29tcG91bmRFeHByZXNzaW9uLCBjcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24sIGNyZWF0ZUZvckxvb3BQYXJhbXMsIGNyZWF0ZUZ1bmN0aW9uRXhwcmVzc2lvbiwgY3JlYXRlSWZTdGF0ZW1lbnQsIGNyZWF0ZUludGVycG9sYXRpb24sIGNyZWF0ZU9iamVjdEV4cHJlc3Npb24sIGNyZWF0ZU9iamVjdFByb3BlcnR5LCBjcmVhdGVSZXR1cm5TdGF0ZW1lbnQsIGNyZWF0ZVJvb3QsIGNyZWF0ZVNlcXVlbmNlRXhwcmVzc2lvbiwgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbiwgY3JlYXRlU3RydWN0dXJhbERpcmVjdGl2ZVRyYW5zZm9ybSwgY3JlYXRlVGVtcGxhdGVMaXRlcmFsLCBjcmVhdGVUcmFuc2Zvcm1Db250ZXh0LCBjcmVhdGVWTm9kZUNhbGwsIGV4dHJhY3RJZGVudGlmaWVycywgZmluZERpciwgZmluZFByb3AsIGdlbmVyYXRlLCBnZXRCYXNlVHJhbnNmb3JtUHJlc2V0LCBnZXRDb25zdGFudFR5cGUsIGdldElubmVyUmFuZ2UsIGdldE1lbW9lZFZOb2RlQ2FsbCwgZ2V0Vk5vZGVCbG9ja0hlbHBlciwgZ2V0Vk5vZGVIZWxwZXIsIGhhc0R5bmFtaWNLZXlWQmluZCwgaGFzU2NvcGVSZWYsIGhlbHBlck5hbWVNYXAsIGluamVjdFByb3AsIGlzQnVpbHRJblR5cGUsIGlzQ29yZUNvbXBvbmVudCwgaXNGdW5jdGlvblR5cGUsIGlzSW5EZXN0cnVjdHVyZUFzc2lnbm1lbnQsIGlzTWVtYmVyRXhwcmVzc2lvbiwgaXNNZW1iZXJFeHByZXNzaW9uQnJvd3NlciwgaXNNZW1iZXJFeHByZXNzaW9uTm9kZSwgaXNSZWZlcmVuY2VkSWRlbnRpZmllciwgaXNTaW1wbGVJZGVudGlmaWVyLCBpc1Nsb3RPdXRsZXQsIGlzU3RhdGljQXJnT2YsIGlzU3RhdGljRXhwLCBpc1N0YXRpY1Byb3BlcnR5LCBpc1N0YXRpY1Byb3BlcnR5S2V5LCBpc1RlbXBsYXRlTm9kZSwgaXNUZXh0JDEgYXMgaXNUZXh0LCBpc1ZTbG90LCBsb2NTdHViLCBtYWtlQmxvY2ssIG5vb3BEaXJlY3RpdmVUcmFuc2Zvcm0sIHByb2Nlc3NFeHByZXNzaW9uLCBwcm9jZXNzRm9yLCBwcm9jZXNzSWYsIHByb2Nlc3NTbG90T3V0bGV0LCByZWdpc3RlclJ1bnRpbWVIZWxwZXJzLCByZXNvbHZlQ29tcG9uZW50VHlwZSwgc3RyaW5naWZ5RXhwcmVzc2lvbiwgdG9WYWxpZEFzc2V0SWQsIHRyYWNrU2xvdFNjb3BlcywgdHJhY2tWRm9yU2xvdFNjb3BlcywgdHJhbnNmb3JtLCB0cmFuc2Zvcm1CaW5kLCB0cmFuc2Zvcm1FbGVtZW50LCB0cmFuc2Zvcm1FeHByZXNzaW9uLCB0cmFuc2Zvcm1Nb2RlbCwgdHJhbnNmb3JtT24sIHRyYXZlcnNlTm9kZSwgd2Fsa0Jsb2NrRGVjbGFyYXRpb25zLCB3YWxrRnVuY3Rpb25QYXJhbXMsIHdhbGtJZGVudGlmaWVycywgd2FybkRlcHJlY2F0aW9uIH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@vue/compiler-core/dist/compiler-core.esm-bundler.js\n");

/***/ }),

/***/ "./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js":
/*!*************************************************************************!*\
  !*** ./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js ***!
  \*************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"BASE_TRANSITION\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.BASE_TRANSITION),\n/* harmony export */   \"CAMELIZE\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CAMELIZE),\n/* harmony export */   \"CAPITALIZE\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CAPITALIZE),\n/* harmony export */   \"CREATE_BLOCK\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_BLOCK),\n/* harmony export */   \"CREATE_COMMENT\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_COMMENT),\n/* harmony export */   \"CREATE_ELEMENT_BLOCK\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_ELEMENT_BLOCK),\n/* harmony export */   \"CREATE_ELEMENT_VNODE\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_ELEMENT_VNODE),\n/* harmony export */   \"CREATE_SLOTS\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_SLOTS),\n/* harmony export */   \"CREATE_STATIC\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_STATIC),\n/* harmony export */   \"CREATE_TEXT\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_TEXT),\n/* harmony export */   \"CREATE_VNODE\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_VNODE),\n/* harmony export */   \"DOMDirectiveTransforms\": () => (/* binding */ DOMDirectiveTransforms),\n/* harmony export */   \"DOMNodeTransforms\": () => (/* binding */ DOMNodeTransforms),\n/* harmony export */   \"FRAGMENT\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.FRAGMENT),\n/* harmony export */   \"GUARD_REACTIVE_PROPS\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.GUARD_REACTIVE_PROPS),\n/* harmony export */   \"IS_MEMO_SAME\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.IS_MEMO_SAME),\n/* harmony export */   \"IS_REF\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.IS_REF),\n/* harmony export */   \"KEEP_ALIVE\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.KEEP_ALIVE),\n/* harmony export */   \"MERGE_PROPS\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.MERGE_PROPS),\n/* harmony export */   \"NORMALIZE_CLASS\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.NORMALIZE_CLASS),\n/* harmony export */   \"NORMALIZE_PROPS\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.NORMALIZE_PROPS),\n/* harmony export */   \"NORMALIZE_STYLE\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.NORMALIZE_STYLE),\n/* harmony export */   \"OPEN_BLOCK\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.OPEN_BLOCK),\n/* harmony export */   \"POP_SCOPE_ID\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.POP_SCOPE_ID),\n/* harmony export */   \"PUSH_SCOPE_ID\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.PUSH_SCOPE_ID),\n/* harmony export */   \"RENDER_LIST\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RENDER_LIST),\n/* harmony export */   \"RENDER_SLOT\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RENDER_SLOT),\n/* harmony export */   \"RESOLVE_COMPONENT\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RESOLVE_COMPONENT),\n/* harmony export */   \"RESOLVE_DIRECTIVE\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RESOLVE_DIRECTIVE),\n/* harmony export */   \"RESOLVE_DYNAMIC_COMPONENT\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RESOLVE_DYNAMIC_COMPONENT),\n/* harmony export */   \"RESOLVE_FILTER\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RESOLVE_FILTER),\n/* harmony export */   \"SET_BLOCK_TRACKING\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.SET_BLOCK_TRACKING),\n/* harmony export */   \"SUSPENSE\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.SUSPENSE),\n/* harmony export */   \"TELEPORT\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TELEPORT),\n/* harmony export */   \"TO_DISPLAY_STRING\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TO_DISPLAY_STRING),\n/* harmony export */   \"TO_HANDLERS\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TO_HANDLERS),\n/* harmony export */   \"TO_HANDLER_KEY\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TO_HANDLER_KEY),\n/* harmony export */   \"TRANSITION\": () => (/* binding */ TRANSITION),\n/* harmony export */   \"TRANSITION_GROUP\": () => (/* binding */ TRANSITION_GROUP),\n/* harmony export */   \"UNREF\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.UNREF),\n/* harmony export */   \"V_MODEL_CHECKBOX\": () => (/* binding */ V_MODEL_CHECKBOX),\n/* harmony export */   \"V_MODEL_DYNAMIC\": () => (/* binding */ V_MODEL_DYNAMIC),\n/* harmony export */   \"V_MODEL_RADIO\": () => (/* binding */ V_MODEL_RADIO),\n/* harmony export */   \"V_MODEL_SELECT\": () => (/* binding */ V_MODEL_SELECT),\n/* harmony export */   \"V_MODEL_TEXT\": () => (/* binding */ V_MODEL_TEXT),\n/* harmony export */   \"V_ON_WITH_KEYS\": () => (/* binding */ V_ON_WITH_KEYS),\n/* harmony export */   \"V_ON_WITH_MODIFIERS\": () => (/* binding */ V_ON_WITH_MODIFIERS),\n/* harmony export */   \"V_SHOW\": () => (/* binding */ V_SHOW),\n/* harmony export */   \"WITH_CTX\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.WITH_CTX),\n/* harmony export */   \"WITH_DIRECTIVES\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.WITH_DIRECTIVES),\n/* harmony export */   \"WITH_MEMO\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.WITH_MEMO),\n/* harmony export */   \"advancePositionWithClone\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.advancePositionWithClone),\n/* harmony export */   \"advancePositionWithMutation\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.advancePositionWithMutation),\n/* harmony export */   \"assert\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.assert),\n/* harmony export */   \"baseCompile\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.baseCompile),\n/* harmony export */   \"baseParse\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.baseParse),\n/* harmony export */   \"buildDirectiveArgs\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.buildDirectiveArgs),\n/* harmony export */   \"buildProps\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.buildProps),\n/* harmony export */   \"buildSlots\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.buildSlots),\n/* harmony export */   \"checkCompatEnabled\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.checkCompatEnabled),\n/* harmony export */   \"compile\": () => (/* binding */ compile),\n/* harmony export */   \"createArrayExpression\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createArrayExpression),\n/* harmony export */   \"createAssignmentExpression\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createAssignmentExpression),\n/* harmony export */   \"createBlockStatement\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createBlockStatement),\n/* harmony export */   \"createCacheExpression\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCacheExpression),\n/* harmony export */   \"createCallExpression\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCallExpression),\n/* harmony export */   \"createCompilerError\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompilerError),\n/* harmony export */   \"createCompoundExpression\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompoundExpression),\n/* harmony export */   \"createConditionalExpression\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createConditionalExpression),\n/* harmony export */   \"createDOMCompilerError\": () => (/* binding */ createDOMCompilerError),\n/* harmony export */   \"createForLoopParams\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createForLoopParams),\n/* harmony export */   \"createFunctionExpression\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createFunctionExpression),\n/* harmony export */   \"createIfStatement\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createIfStatement),\n/* harmony export */   \"createInterpolation\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createInterpolation),\n/* harmony export */   \"createObjectExpression\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectExpression),\n/* harmony export */   \"createObjectProperty\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectProperty),\n/* harmony export */   \"createReturnStatement\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createReturnStatement),\n/* harmony export */   \"createRoot\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createRoot),\n/* harmony export */   \"createSequenceExpression\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSequenceExpression),\n/* harmony export */   \"createSimpleExpression\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression),\n/* harmony export */   \"createStructuralDirectiveTransform\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createStructuralDirectiveTransform),\n/* harmony export */   \"createTemplateLiteral\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createTemplateLiteral),\n/* harmony export */   \"createTransformContext\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createTransformContext),\n/* harmony export */   \"createVNodeCall\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createVNodeCall),\n/* harmony export */   \"extractIdentifiers\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.extractIdentifiers),\n/* harmony export */   \"findDir\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.findDir),\n/* harmony export */   \"findProp\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.findProp),\n/* harmony export */   \"generate\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.generate),\n/* harmony export */   \"generateCodeFrame\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.generateCodeFrame),\n/* harmony export */   \"getBaseTransformPreset\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getBaseTransformPreset),\n/* harmony export */   \"getConstantType\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getConstantType),\n/* harmony export */   \"getInnerRange\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getInnerRange),\n/* harmony export */   \"getMemoedVNodeCall\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getMemoedVNodeCall),\n/* harmony export */   \"getVNodeBlockHelper\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getVNodeBlockHelper),\n/* harmony export */   \"getVNodeHelper\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getVNodeHelper),\n/* harmony export */   \"hasDynamicKeyVBind\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.hasDynamicKeyVBind),\n/* harmony export */   \"hasScopeRef\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.hasScopeRef),\n/* harmony export */   \"helperNameMap\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.helperNameMap),\n/* harmony export */   \"injectProp\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.injectProp),\n/* harmony export */   \"isBuiltInType\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isBuiltInType),\n/* harmony export */   \"isCoreComponent\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isCoreComponent),\n/* harmony export */   \"isFunctionType\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isFunctionType),\n/* harmony export */   \"isInDestructureAssignment\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isInDestructureAssignment),\n/* harmony export */   \"isMemberExpression\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isMemberExpression),\n/* harmony export */   \"isMemberExpressionBrowser\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isMemberExpressionBrowser),\n/* harmony export */   \"isMemberExpressionNode\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isMemberExpressionNode),\n/* harmony export */   \"isReferencedIdentifier\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isReferencedIdentifier),\n/* harmony export */   \"isSimpleIdentifier\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isSimpleIdentifier),\n/* harmony export */   \"isSlotOutlet\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isSlotOutlet),\n/* harmony export */   \"isStaticArgOf\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticArgOf),\n/* harmony export */   \"isStaticExp\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp),\n/* harmony export */   \"isStaticProperty\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticProperty),\n/* harmony export */   \"isStaticPropertyKey\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticPropertyKey),\n/* harmony export */   \"isTemplateNode\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isTemplateNode),\n/* harmony export */   \"isText\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isText),\n/* harmony export */   \"isVSlot\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isVSlot),\n/* harmony export */   \"locStub\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.locStub),\n/* harmony export */   \"makeBlock\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.makeBlock),\n/* harmony export */   \"noopDirectiveTransform\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.noopDirectiveTransform),\n/* harmony export */   \"parse\": () => (/* binding */ parse),\n/* harmony export */   \"parserOptions\": () => (/* binding */ parserOptions),\n/* harmony export */   \"processExpression\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.processExpression),\n/* harmony export */   \"processFor\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.processFor),\n/* harmony export */   \"processIf\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.processIf),\n/* harmony export */   \"processSlotOutlet\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.processSlotOutlet),\n/* harmony export */   \"registerRuntimeHelpers\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.registerRuntimeHelpers),\n/* harmony export */   \"resolveComponentType\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.resolveComponentType),\n/* harmony export */   \"stringifyExpression\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.stringifyExpression),\n/* harmony export */   \"toValidAssetId\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.toValidAssetId),\n/* harmony export */   \"trackSlotScopes\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.trackSlotScopes),\n/* harmony export */   \"trackVForSlotScopes\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.trackVForSlotScopes),\n/* harmony export */   \"transform\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transform),\n/* harmony export */   \"transformBind\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformBind),\n/* harmony export */   \"transformElement\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformElement),\n/* harmony export */   \"transformExpression\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformExpression),\n/* harmony export */   \"transformModel\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformModel),\n/* harmony export */   \"transformOn\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformOn),\n/* harmony export */   \"transformStyle\": () => (/* binding */ transformStyle),\n/* harmony export */   \"traverseNode\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.traverseNode),\n/* harmony export */   \"walkBlockDeclarations\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.walkBlockDeclarations),\n/* harmony export */   \"walkFunctionParams\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.walkFunctionParams),\n/* harmony export */   \"walkIdentifiers\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.walkIdentifiers),\n/* harmony export */   \"warnDeprecation\": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.warnDeprecation)\n/* harmony export */ });\n/* harmony import */ var _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/compiler-core */ \"./node_modules/@vue/compiler-core/dist/compiler-core.esm-bundler.js\");\n/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/shared */ \"./node_modules/@vue/shared/dist/shared.esm-bundler.js\");\n\n\n\n\nconst V_MODEL_RADIO = Symbol(( true) ? `vModelRadio` : 0);\nconst V_MODEL_CHECKBOX = Symbol(( true) ? `vModelCheckbox` : 0);\nconst V_MODEL_TEXT = Symbol(( true) ? `vModelText` : 0);\nconst V_MODEL_SELECT = Symbol(( true) ? `vModelSelect` : 0);\nconst V_MODEL_DYNAMIC = Symbol(( true) ? `vModelDynamic` : 0);\nconst V_ON_WITH_MODIFIERS = Symbol(( true) ? `vOnModifiersGuard` : 0);\nconst V_ON_WITH_KEYS = Symbol(( true) ? `vOnKeysGuard` : 0);\nconst V_SHOW = Symbol(( true) ? `vShow` : 0);\nconst TRANSITION = Symbol(( true) ? `Transition` : 0);\nconst TRANSITION_GROUP = Symbol(( true) ? `TransitionGroup` : 0);\n(0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.registerRuntimeHelpers)({\n    [V_MODEL_RADIO]: `vModelRadio`,\n    [V_MODEL_CHECKBOX]: `vModelCheckbox`,\n    [V_MODEL_TEXT]: `vModelText`,\n    [V_MODEL_SELECT]: `vModelSelect`,\n    [V_MODEL_DYNAMIC]: `vModelDynamic`,\n    [V_ON_WITH_MODIFIERS]: `withModifiers`,\n    [V_ON_WITH_KEYS]: `withKeys`,\n    [V_SHOW]: `vShow`,\n    [TRANSITION]: `Transition`,\n    [TRANSITION_GROUP]: `TransitionGroup`\n});\n\n/* eslint-disable no-restricted-globals */\nlet decoder;\nfunction decodeHtmlBrowser(raw, asAttr = false) {\n    if (!decoder) {\n        decoder = document.createElement('div');\n    }\n    if (asAttr) {\n        decoder.innerHTML = `<div foo=\"${raw.replace(/\"/g, '&quot;')}\">`;\n        return decoder.children[0].getAttribute('foo');\n    }\n    else {\n        decoder.innerHTML = raw;\n        return decoder.textContent;\n    }\n}\n\nconst isRawTextContainer = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)('style,iframe,script,noscript', true);\nconst parserOptions = {\n    isVoidTag: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.isVoidTag,\n    isNativeTag: tag => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isHTMLTag)(tag) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSVGTag)(tag),\n    isPreTag: tag => tag === 'pre',\n    decodeEntities: decodeHtmlBrowser ,\n    isBuiltInComponent: (tag) => {\n        if ((0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isBuiltInType)(tag, `Transition`)) {\n            return TRANSITION;\n        }\n        else if ((0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isBuiltInType)(tag, `TransitionGroup`)) {\n            return TRANSITION_GROUP;\n        }\n    },\n    // https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher\n    getNamespace(tag, parent) {\n        let ns = parent ? parent.ns : 0 /* DOMNamespaces.HTML */;\n        if (parent && ns === 2 /* DOMNamespaces.MATH_ML */) {\n            if (parent.tag === 'annotation-xml') {\n                if (tag === 'svg') {\n                    return 1 /* DOMNamespaces.SVG */;\n                }\n                if (parent.props.some(a => a.type === 6 /* NodeTypes.ATTRIBUTE */ &&\n                    a.name === 'encoding' &&\n                    a.value != null &&\n                    (a.value.content === 'text/html' ||\n                        a.value.content === 'application/xhtml+xml'))) {\n                    ns = 0 /* DOMNamespaces.HTML */;\n                }\n            }\n            else if (/^m(?:[ions]|text)$/.test(parent.tag) &&\n                tag !== 'mglyph' &&\n                tag !== 'malignmark') {\n                ns = 0 /* DOMNamespaces.HTML */;\n            }\n        }\n        else if (parent && ns === 1 /* DOMNamespaces.SVG */) {\n            if (parent.tag === 'foreignObject' ||\n                parent.tag === 'desc' ||\n                parent.tag === 'title') {\n                ns = 0 /* DOMNamespaces.HTML */;\n            }\n        }\n        if (ns === 0 /* DOMNamespaces.HTML */) {\n            if (tag === 'svg') {\n                return 1 /* DOMNamespaces.SVG */;\n            }\n            if (tag === 'math') {\n                return 2 /* DOMNamespaces.MATH_ML */;\n            }\n        }\n        return ns;\n    },\n    // https://html.spec.whatwg.org/multipage/parsing.html#parsing-html-fragments\n    getTextMode({ tag, ns }) {\n        if (ns === 0 /* DOMNamespaces.HTML */) {\n            if (tag === 'textarea' || tag === 'title') {\n                return 1 /* TextModes.RCDATA */;\n            }\n            if (isRawTextContainer(tag)) {\n                return 2 /* TextModes.RAWTEXT */;\n            }\n        }\n        return 0 /* TextModes.DATA */;\n    }\n};\n\n// Parse inline CSS strings for static style attributes into an object.\n// This is a NodeTransform since it works on the static `style` attribute and\n// converts it into a dynamic equivalent:\n// style=\"color: red\" -> :style='{ \"color\": \"red\" }'\n// It is then processed by `transformElement` and included in the generated\n// props.\nconst transformStyle = node => {\n    if (node.type === 1 /* NodeTypes.ELEMENT */) {\n        node.props.forEach((p, i) => {\n            if (p.type === 6 /* NodeTypes.ATTRIBUTE */ && p.name === 'style' && p.value) {\n                // replace p with an expression node\n                node.props[i] = {\n                    type: 7 /* NodeTypes.DIRECTIVE */,\n                    name: `bind`,\n                    arg: (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(`style`, true, p.loc),\n                    exp: parseInlineCSS(p.value.content, p.loc),\n                    modifiers: [],\n                    loc: p.loc\n                };\n            }\n        });\n    }\n};\nconst parseInlineCSS = (cssText, loc) => {\n    const normalized = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.parseStringStyle)(cssText);\n    return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(JSON.stringify(normalized), false, loc, 3 /* ConstantTypes.CAN_STRINGIFY */);\n};\n\nfunction createDOMCompilerError(code, loc) {\n    return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompilerError)(code, loc,  true ? DOMErrorMessages : 0);\n}\nconst DOMErrorMessages = {\n    [51 /* DOMErrorCodes.X_V_HTML_NO_EXPRESSION */]: `v-html is missing expression.`,\n    [52 /* DOMErrorCodes.X_V_HTML_WITH_CHILDREN */]: `v-html will override element children.`,\n    [53 /* DOMErrorCodes.X_V_TEXT_NO_EXPRESSION */]: `v-text is missing expression.`,\n    [54 /* DOMErrorCodes.X_V_TEXT_WITH_CHILDREN */]: `v-text will override element children.`,\n    [55 /* DOMErrorCodes.X_V_MODEL_ON_INVALID_ELEMENT */]: `v-model can only be used on <input>, <textarea> and <select> elements.`,\n    [56 /* DOMErrorCodes.X_V_MODEL_ARG_ON_ELEMENT */]: `v-model argument is not supported on plain elements.`,\n    [57 /* DOMErrorCodes.X_V_MODEL_ON_FILE_INPUT_ELEMENT */]: `v-model cannot be used on file inputs since they are read-only. Use a v-on:change listener instead.`,\n    [58 /* DOMErrorCodes.X_V_MODEL_UNNECESSARY_VALUE */]: `Unnecessary value binding used alongside v-model. It will interfere with v-model's behavior.`,\n    [59 /* DOMErrorCodes.X_V_SHOW_NO_EXPRESSION */]: `v-show is missing expression.`,\n    [60 /* DOMErrorCodes.X_TRANSITION_INVALID_CHILDREN */]: `<Transition> expects exactly one child element or component.`,\n    [61 /* DOMErrorCodes.X_IGNORED_SIDE_EFFECT_TAG */]: `Tags with side effect (<script> and <style>) are ignored in client component templates.`\n};\n\nconst transformVHtml = (dir, node, context) => {\n    const { exp, loc } = dir;\n    if (!exp) {\n        context.onError(createDOMCompilerError(51 /* DOMErrorCodes.X_V_HTML_NO_EXPRESSION */, loc));\n    }\n    if (node.children.length) {\n        context.onError(createDOMCompilerError(52 /* DOMErrorCodes.X_V_HTML_WITH_CHILDREN */, loc));\n        node.children.length = 0;\n    }\n    return {\n        props: [\n            (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectProperty)((0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(`innerHTML`, true, loc), exp || (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)('', true))\n        ]\n    };\n};\n\nconst transformVText = (dir, node, context) => {\n    const { exp, loc } = dir;\n    if (!exp) {\n        context.onError(createDOMCompilerError(53 /* DOMErrorCodes.X_V_TEXT_NO_EXPRESSION */, loc));\n    }\n    if (node.children.length) {\n        context.onError(createDOMCompilerError(54 /* DOMErrorCodes.X_V_TEXT_WITH_CHILDREN */, loc));\n        node.children.length = 0;\n    }\n    return {\n        props: [\n            (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectProperty)((0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(`textContent`, true), exp\n                ? (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getConstantType)(exp, context) > 0\n                    ? exp\n                    : (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCallExpression)(context.helperString(_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TO_DISPLAY_STRING), [exp], loc)\n                : (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)('', true))\n        ]\n    };\n};\n\nconst transformModel = (dir, node, context) => {\n    const baseResult = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformModel)(dir, node, context);\n    // base transform has errors OR component v-model (only need props)\n    if (!baseResult.props.length || node.tagType === 1 /* ElementTypes.COMPONENT */) {\n        return baseResult;\n    }\n    if (dir.arg) {\n        context.onError(createDOMCompilerError(56 /* DOMErrorCodes.X_V_MODEL_ARG_ON_ELEMENT */, dir.arg.loc));\n    }\n    function checkDuplicatedValue() {\n        const value = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.findProp)(node, 'value');\n        if (value) {\n            context.onError(createDOMCompilerError(58 /* DOMErrorCodes.X_V_MODEL_UNNECESSARY_VALUE */, value.loc));\n        }\n    }\n    const { tag } = node;\n    const isCustomElement = context.isCustomElement(tag);\n    if (tag === 'input' ||\n        tag === 'textarea' ||\n        tag === 'select' ||\n        isCustomElement) {\n        let directiveToUse = V_MODEL_TEXT;\n        let isInvalidType = false;\n        if (tag === 'input' || isCustomElement) {\n            const type = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.findProp)(node, `type`);\n            if (type) {\n                if (type.type === 7 /* NodeTypes.DIRECTIVE */) {\n                    // :type=\"foo\"\n                    directiveToUse = V_MODEL_DYNAMIC;\n                }\n                else if (type.value) {\n                    switch (type.value.content) {\n                        case 'radio':\n                            directiveToUse = V_MODEL_RADIO;\n                            break;\n                        case 'checkbox':\n                            directiveToUse = V_MODEL_CHECKBOX;\n                            break;\n                        case 'file':\n                            isInvalidType = true;\n                            context.onError(createDOMCompilerError(57 /* DOMErrorCodes.X_V_MODEL_ON_FILE_INPUT_ELEMENT */, dir.loc));\n                            break;\n                        default:\n                            // text type\n                            ( true) && checkDuplicatedValue();\n                            break;\n                    }\n                }\n            }\n            else if ((0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.hasDynamicKeyVBind)(node)) {\n                // element has bindings with dynamic keys, which can possibly contain\n                // \"type\".\n                directiveToUse = V_MODEL_DYNAMIC;\n            }\n            else {\n                // text type\n                ( true) && checkDuplicatedValue();\n            }\n        }\n        else if (tag === 'select') {\n            directiveToUse = V_MODEL_SELECT;\n        }\n        else {\n            // textarea\n            ( true) && checkDuplicatedValue();\n        }\n        // inject runtime directive\n        // by returning the helper symbol via needRuntime\n        // the import will replaced a resolveDirective call.\n        if (!isInvalidType) {\n            baseResult.needRuntime = context.helper(directiveToUse);\n        }\n    }\n    else {\n        context.onError(createDOMCompilerError(55 /* DOMErrorCodes.X_V_MODEL_ON_INVALID_ELEMENT */, dir.loc));\n    }\n    // native vmodel doesn't need the `modelValue` props since they are also\n    // passed to the runtime as `binding.value`. removing it reduces code size.\n    baseResult.props = baseResult.props.filter(p => !(p.key.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ &&\n        p.key.content === 'modelValue'));\n    return baseResult;\n};\n\nconst isEventOptionModifier = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)(`passive,once,capture`);\nconst isNonKeyModifier = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)(\n// event propagation management\n`stop,prevent,self,` +\n    // system modifiers + exact\n    `ctrl,shift,alt,meta,exact,` +\n    // mouse\n    `middle`);\n// left & right could be mouse or key modifiers based on event type\nconst maybeKeyModifier = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)('left,right');\nconst isKeyboardEvent = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)(`onkeyup,onkeydown,onkeypress`, true);\nconst resolveModifiers = (key, modifiers, context, loc) => {\n    const keyModifiers = [];\n    const nonKeyModifiers = [];\n    const eventOptionModifiers = [];\n    for (let i = 0; i < modifiers.length; i++) {\n        const modifier = modifiers[i];\n        if (modifier === 'native' &&\n            (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.checkCompatEnabled)(\"COMPILER_V_ON_NATIVE\" /* CompilerDeprecationTypes.COMPILER_V_ON_NATIVE */, context, loc)) {\n            eventOptionModifiers.push(modifier);\n        }\n        else if (isEventOptionModifier(modifier)) {\n            // eventOptionModifiers: modifiers for addEventListener() options,\n            // e.g. .passive & .capture\n            eventOptionModifiers.push(modifier);\n        }\n        else {\n            // runtimeModifiers: modifiers that needs runtime guards\n            if (maybeKeyModifier(modifier)) {\n                if ((0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp)(key)) {\n                    if (isKeyboardEvent(key.content)) {\n                        keyModifiers.push(modifier);\n                    }\n                    else {\n                        nonKeyModifiers.push(modifier);\n                    }\n                }\n                else {\n                    keyModifiers.push(modifier);\n                    nonKeyModifiers.push(modifier);\n                }\n            }\n            else {\n                if (isNonKeyModifier(modifier)) {\n                    nonKeyModifiers.push(modifier);\n                }\n                else {\n                    keyModifiers.push(modifier);\n                }\n            }\n        }\n    }\n    return {\n        keyModifiers,\n        nonKeyModifiers,\n        eventOptionModifiers\n    };\n};\nconst transformClick = (key, event) => {\n    const isStaticClick = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp)(key) && key.content.toLowerCase() === 'onclick';\n    return isStaticClick\n        ? (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(event, true)\n        : key.type !== 4 /* NodeTypes.SIMPLE_EXPRESSION */\n            ? (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompoundExpression)([\n                `(`,\n                key,\n                `) === \"onClick\" ? \"${event}\" : (`,\n                key,\n                `)`\n            ])\n            : key;\n};\nconst transformOn = (dir, node, context) => {\n    return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformOn)(dir, node, context, baseResult => {\n        const { modifiers } = dir;\n        if (!modifiers.length)\n            return baseResult;\n        let { key, value: handlerExp } = baseResult.props[0];\n        const { keyModifiers, nonKeyModifiers, eventOptionModifiers } = resolveModifiers(key, modifiers, context, dir.loc);\n        // normalize click.right and click.middle since they don't actually fire\n        if (nonKeyModifiers.includes('right')) {\n            key = transformClick(key, `onContextmenu`);\n        }\n        if (nonKeyModifiers.includes('middle')) {\n            key = transformClick(key, `onMouseup`);\n        }\n        if (nonKeyModifiers.length) {\n            handlerExp = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCallExpression)(context.helper(V_ON_WITH_MODIFIERS), [\n                handlerExp,\n                JSON.stringify(nonKeyModifiers)\n            ]);\n        }\n        if (keyModifiers.length &&\n            // if event name is dynamic, always wrap with keys guard\n            (!(0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp)(key) || isKeyboardEvent(key.content))) {\n            handlerExp = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCallExpression)(context.helper(V_ON_WITH_KEYS), [\n                handlerExp,\n                JSON.stringify(keyModifiers)\n            ]);\n        }\n        if (eventOptionModifiers.length) {\n            const modifierPostfix = eventOptionModifiers.map(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize).join('');\n            key = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp)(key)\n                ? (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(`${key.content}${modifierPostfix}`, true)\n                : (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompoundExpression)([`(`, key, `) + \"${modifierPostfix}\"`]);\n        }\n        return {\n            props: [(0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectProperty)(key, handlerExp)]\n        };\n    });\n};\n\nconst transformShow = (dir, node, context) => {\n    const { exp, loc } = dir;\n    if (!exp) {\n        context.onError(createDOMCompilerError(59 /* DOMErrorCodes.X_V_SHOW_NO_EXPRESSION */, loc));\n    }\n    return {\n        props: [],\n        needRuntime: context.helper(V_SHOW)\n    };\n};\n\nconst transformTransition = (node, context) => {\n    if (node.type === 1 /* NodeTypes.ELEMENT */ &&\n        node.tagType === 1 /* ElementTypes.COMPONENT */) {\n        const component = context.isBuiltInComponent(node.tag);\n        if (component === TRANSITION) {\n            return () => {\n                if (!node.children.length) {\n                    return;\n                }\n                // warn multiple transition children\n                if (hasMultipleChildren(node)) {\n                    context.onError(createDOMCompilerError(60 /* DOMErrorCodes.X_TRANSITION_INVALID_CHILDREN */, {\n                        start: node.children[0].loc.start,\n                        end: node.children[node.children.length - 1].loc.end,\n                        source: ''\n                    }));\n                }\n                // check if it's s single child w/ v-show\n                // if yes, inject \"persisted: true\" to the transition props\n                const child = node.children[0];\n                if (child.type === 1 /* NodeTypes.ELEMENT */) {\n                    for (const p of child.props) {\n                        if (p.type === 7 /* NodeTypes.DIRECTIVE */ && p.name === 'show') {\n                            node.props.push({\n                                type: 6 /* NodeTypes.ATTRIBUTE */,\n                                name: 'persisted',\n                                value: undefined,\n                                loc: node.loc\n                            });\n                        }\n                    }\n                }\n            };\n        }\n    }\n};\nfunction hasMultipleChildren(node) {\n    // #1352 filter out potential comment nodes.\n    const children = (node.children = node.children.filter(c => c.type !== 3 /* NodeTypes.COMMENT */ &&\n        !(c.type === 2 /* NodeTypes.TEXT */ && !c.content.trim())));\n    const child = children[0];\n    return (children.length !== 1 ||\n        child.type === 11 /* NodeTypes.FOR */ ||\n        (child.type === 9 /* NodeTypes.IF */ && child.branches.some(hasMultipleChildren)));\n}\n\nconst ignoreSideEffectTags = (node, context) => {\n    if (node.type === 1 /* NodeTypes.ELEMENT */ &&\n        node.tagType === 0 /* ElementTypes.ELEMENT */ &&\n        (node.tag === 'script' || node.tag === 'style')) {\n        context.onError(createDOMCompilerError(61 /* DOMErrorCodes.X_IGNORED_SIDE_EFFECT_TAG */, node.loc));\n        context.removeNode();\n    }\n};\n\nconst DOMNodeTransforms = [\n    transformStyle,\n    ...(( true) ? [transformTransition] : 0)\n];\nconst DOMDirectiveTransforms = {\n    cloak: _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.noopDirectiveTransform,\n    html: transformVHtml,\n    text: transformVText,\n    model: transformModel,\n    on: transformOn,\n    show: transformShow\n};\nfunction compile(template, options = {}) {\n    return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.baseCompile)(template, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, parserOptions, options, {\n        nodeTransforms: [\n            // ignore <script> and <tag>\n            // this is not put inside DOMNodeTransforms because that list is used\n            // by compiler-ssr to generate vnode fallback branches\n            ignoreSideEffectTags,\n            ...DOMNodeTransforms,\n            ...(options.nodeTransforms || [])\n        ],\n        directiveTransforms: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, DOMDirectiveTransforms, options.directiveTransforms || {}),\n        transformHoist: null \n    }));\n}\nfunction parse(template, options = {}) {\n    return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.baseParse)(template, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, parserOptions, options));\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHZ1ZS9jb21waWxlci1kb20vZGlzdC9jb21waWxlci1kb20uZXNtLWJ1bmRsZXIuanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFtWjtBQUNoWDtBQUN5RTs7QUFFNUcsOEJBQThCLEtBQXFDLG9CQUFvQixDQUFFO0FBQ3pGLGlDQUFpQyxLQUFxQyx1QkFBdUIsQ0FBRTtBQUMvRiw2QkFBNkIsS0FBcUMsbUJBQW1CLENBQUU7QUFDdkYsK0JBQStCLEtBQXFDLHFCQUFxQixDQUFFO0FBQzNGLGdDQUFnQyxLQUFxQyxzQkFBc0IsQ0FBRTtBQUM3RixvQ0FBb0MsS0FBcUMsMEJBQTBCLENBQUU7QUFDckcsK0JBQStCLEtBQXFDLHFCQUFxQixDQUFFO0FBQzNGLHVCQUF1QixLQUFxQyxjQUFjLENBQUU7QUFDNUUsMkJBQTJCLEtBQXFDLG1CQUFtQixDQUFFO0FBQ3JGLGlDQUFpQyxLQUFxQyx3QkFBd0IsQ0FBRTtBQUNoRywwRUFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLHlCQUF5QixHQUFHO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlDQUF5QyxvREFBTztBQUNoRDtBQUNBLGFBQWE7QUFDYix3QkFBd0Isc0RBQVMsU0FBUyxxREFBUTtBQUNsRDtBQUNBO0FBQ0E7QUFDQSxZQUFZLGlFQUFhO0FBQ3pCO0FBQ0E7QUFDQSxpQkFBaUIsaUVBQWE7QUFDOUI7QUFDQTtBQUNBLEtBQUs7QUFDTDtB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LFNBQVMsS0FBcUMsNEJBQTRCLENBQUU7QUFDNUU7QUFDQTtBQUNBLFdBQVcsc0VBQXNCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QyxXQUFXLCtEQUFXLFdBQVcsbURBQU0sR0FBRztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLG1EQUFNLEdBQUcsMkRBQTJEO0FBQ2pHO0FBQ0EsS0FBSztBQUNMO0FBQ0EscUNBQXFDO0FBQ3JDLFdBQVcsNkRBQVMsV0FBVyxtREFBTSxHQUFHO0FBQ3hDOztBQUV1UiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdnVlL2NvbXBpbGVyLWRvbS9kaXN0L2NvbXBpbGVyLWRvbS5lc20tYnVuZGxlci5qcz81YmY2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlZ2lzdGVyUnVudGltZUhlbHBlcnMsIGlzQnVpbHRJblR5cGUsIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24sIGNyZWF0ZUNvbXBpbGVyRXJyb3IsIGNyZWF0ZU9iamVjdFByb3BlcnR5LCBnZXRDb25zdGFudFR5cGUsIGNyZWF0ZUNhbGxFeHByZXNzaW9uLCBUT19ESVNQTEFZX1NUUklORywgdHJhbnNmb3JtTW9kZWwgYXMgdHJhbnNmb3JtTW9kZWwkMSwgZmluZFByb3AsIGhhc0R5bmFtaWNLZXlWQmluZCwgdHJhbnNmb3JtT24gYXMgdHJhbnNmb3JtT24kMSwgaXNTdGF0aWNFeHAsIGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbiwgY2hlY2tDb21wYXRFbmFibGVkLCBub29wRGlyZWN0aXZlVHJhbnNmb3JtLCBiYXNlQ29tcGlsZSwgYmFzZVBhcnNlIH0gZnJvbSAnQHZ1ZS9jb21waWxlci1jb3JlJztcbmV4cG9ydCAqIGZyb20gJ0B2dWUvY29tcGlsZXItY29yZSc7XG5pbXBvcnQgeyBpc1ZvaWRUYWcsIGlzSFRNTFRhZywgaXNTVkdUYWcsIG1ha2VNYXAsIHBhcnNlU3RyaW5nU3R5bGUsIGNhcGl0YWxpemUsIGV4dGVuZCB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuY29uc3QgVl9NT0RFTF9SQURJTyA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBgdk1vZGVsUmFkaW9gIDogYGApO1xuY29uc3QgVl9NT0RFTF9DSEVDS0JPWCA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBgdk1vZGVsQ2hlY2tib3hgIDogYGApO1xuY29uc3QgVl9NT0RFTF9URVhUID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGB2TW9kZWxUZXh0YCA6IGBgKTtcbmNvbnN0IFZfTU9ERUxfU0VMRUNUID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGB2TW9kZWxTZWxlY3RgIDogYGApO1xuY29uc3QgVl9NT0RFTF9EWU5BTUlDID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGB2TW9kZWxEeW5hbWljYCA6IGBgKTtcbmNvbnN0IFZfT05fV0lUSF9NT0RJRklFUlMgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYHZPbk1vZGlmaWVyc0d1YXJkYCA6IGBgKTtcbmNvbnN0IFZfT05fV0lUSF9LRVlTID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGB2T25LZXlzR3VhcmRgIDogYGApO1xuY29uc3QgVl9TSE9XID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGB2U2hvd2AgOiBgYCk7XG5jb25zdCBUUkFOU0lUSU9OID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGBUcmFuc2l0aW9uYCA6IGBgKTtcbmNvbnN0IFRSQU5TSVRJT05fR1JPVVAgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gYFRyYW5zaXRpb25Hcm91cGAgOiBgYCk7XG5yZWdpc3RlclJ1bnRpbWVIZWxwZXJzKHtcbiAgICBbVl9NT0RFTF9SQURJT106IGB2TW9kZWxSYWRpb2AsXG4gICAgW1ZfTU9ERUxfQ0hFQ0tCT1hdOiBgdk1vZGVsQ2hlY2tib3hgLFxuICAgIFtWX01PREVMX1RFWFRdOiBgdk1vZGVsVGV4dGAsXG4gICAgW1ZfTU9ERUxfU0VMRUNUXTogYHZNb2RlbFNlbGVjdGAsXG4gICAgW1ZfTU9ERUxfRFlOQU1JQ106IGB2TW9kZWxEeW5hbWljYCxcbiAgICBbVl9PTl9XSVRIX01PRElGSUVSU106IGB3aXRoTW9kaWZpZXJzYCxcbiAgICBbVl9PTl9XSVRIX0tFWVNdOiBgd2l0aEtleXNgLFxuICAgIFtWX1NIT1ddOiBgdlNob3dgLFxuICAgIFtUUkFOU0lUSU9OXTogYFRyYW5zaXRpb25gLFxuICAgIFtUUkFOU0lUSU9OX0dST1VQXTogYFRyYW5zaXRpb25Hcm91cGBcbn0pO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgKi9cbmxldCBkZWNvZGVyO1xuZnVuY3Rpb24gZGVjb2RlSHRtbEJyb3dzZXIocmF3LCBhc0F0dHIgPSBmYWxzZSkge1xuICAgIGlmICghZGVjb2Rlcikge1xuICAgICAgICBkZWNvZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgfVxuICAgIGlmIChhc0F0dHIpIHtcbiAgICAgICAgZGVjb2Rlci5pbm5lckhUTUwgPSBgPGRpdiBmb289XCIke3Jhdy5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyl9XCI+YDtcbiAgICAgICAgcmV0dXJuIGRlY29kZXIuY2hpbGRyZW5bMF0uZ2V0QXR0cmlidXRlKCdmb28nKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGRlY29kZXIuaW5uZXJIVE1MID0gcmF3O1xuICAgICAgICByZXR1cm4gZGVjb2Rlci50ZXh0Q29udGVudDtcbiAgICB9XG59XG5cbmNvbnN0IGlzUmF3VGV4dENvbnRhaW5lciA9IC8qI19fUFVSRV9fKi8gbWFrZU1hcCgnc3R5bGUsaWZyYW1lLHNjcmlwdCxub3NjcmlwdCcsIHRydWUpO1xuY29uc3QgcGFyc2VyT3B0aW9ucyA9IHtcbiAgICBpc1ZvaWRUYWcsXG4gICAgaXNOYXRpdmVUYWc6IHRhZyA9PiBpc0hUTUxUYWcodGFnKSB8fCBpc1NWR1RhZyh0YWcpLFxuICAgIGlzUHJlVGFnOiB0YWcgPT4gdGFnID09PSAncHJlJyxcbiAgICBkZWNvZGVFbnRpdGllczogZGVjb2RlSHRtbEJyb3dzZXIgLFxuICAgIGlzQnVpbHRJbkNvbXBvbmVudDogKHRhZykgPT4ge1xuICAgICAgICBpZiAoaXNCdWlsdEluVHlwZSh0YWcsIGBUcmFuc2l0aW9uYCkpIHtcbiAgICAgICAgICAgIHJldHVybiBUUkFOU0lUSU9OO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQnVpbHRJblR5cGUodGFnLCBgVHJhbnNpdGlvbkdyb3VwYCkpIHtcbiAgICAgICAgICAgIHJldHVybiBUUkFOU0lUSU9OX0dST1VQO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9wYXJzaW5nLmh0bWwjdHJlZS1jb25zdHJ1Y3Rpb24tZGlzcGF0Y2hlclxuICAgIGdldE5hbWVzcGFjZSh0YWcsIHBhcmVudCkge1xuICAgICAgICBsZXQgbnMgPSBwYXJlbnQgPyBwYXJlbnQubnMgOiAwIC8qIERPTU5hbWVzcGFjZXMuSFRNTCAqLztcbiAgICAgICAgaWYgKHBhcmVudCAmJiBucyA9PT0gMiAvKiBET01OYW1lc3BhY2VzLk1BVEhfTUwgKi8pIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnQudGFnID09PSAnYW5ub3RhdGlvbi14bWwnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZyA9PT0gJ3N2ZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogRE9NTmFtZXNwYWNlcy5TVkcgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQucHJvcHMuc29tZShhID0+IGEudHlwZSA9PT0gNiAvKiBOb2RlVHlwZXMuQVRUUklCVVRFICovICYmXG4gICAgICAgICAgICAgICAgICAgIGEubmFtZSA9PT0gJ2VuY29kaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICBhLnZhbHVlICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgKGEudmFsdWUuY29udGVudCA9PT0gJ3RleHQvaHRtbCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGEudmFsdWUuY29udGVudCA9PT0gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcpKSkge1xuICAgICAgICAgICAgICAgICAgICBucyA9IDAgLyogRE9NTmFtZXNwYWNlcy5IVE1MICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKC9ebSg/Oltpb25zXXx0ZXh0KSQvLnRlc3QocGFyZW50LnRhZykgJiZcbiAgICAgICAgICAgICAgICB0YWcgIT09ICdtZ2x5cGgnICYmXG4gICAgICAgICAgICAgICAgdGFnICE9PSAnbWFsaWdubWFyaycpIHtcbiAgICAgICAgICAgICAgICBucyA9IDAgLyogRE9NTmFtZXNwYWNlcy5IVE1MICovO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhcmVudCAmJiBucyA9PT0gMSAvKiBET01OYW1lc3BhY2VzLlNWRyAqLykge1xuICAgICAgICAgICAgaWYgKHBhcmVudC50YWcgPT09ICdmb3JlaWduT2JqZWN0JyB8fFxuICAgICAgICAgICAgICAgIHBhcmVudC50YWcgPT09ICdkZXNjJyB8fFxuICAgICAgICAgICAgICAgIHBhcmVudC50YWcgPT09ICd0aXRsZScpIHtcbiAgICAgICAgICAgICAgICBucyA9IDAgLyogRE9NTmFtZXNwYWNlcy5IVE1MICovO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChucyA9PT0gMCAvKiBET01OYW1lc3BhY2VzLkhUTUwgKi8pIHtcbiAgICAgICAgICAgIGlmICh0YWcgPT09ICdzdmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogRE9NTmFtZXNwYWNlcy5TVkcgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGFnID09PSAnbWF0aCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMiAvKiBET01OYW1lc3BhY2VzLk1BVEhfTUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5zO1xuICAgIH0sXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvcGFyc2luZy5odG1sI3BhcnNpbmctaHRtbC1mcmFnbWVudHNcbiAgICBnZXRUZXh0TW9kZSh7IHRhZywgbnMgfSkge1xuICAgICAgICBpZiAobnMgPT09IDAgLyogRE9NTmFtZXNwYWNlcy5IVE1MICovKSB7XG4gICAgICAgICAgICBpZiAodGFnID09PSAndGV4dGFyZWEnIHx8IHRhZyA9PT0gJ3RpdGxlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFRleHRNb2Rlcy5SQ0RBVEEgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNSYXdUZXh0Q29udGFpbmVyKHRhZykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMiAvKiBUZXh0TW9kZXMuUkFXVEVYVCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMCAvKiBUZXh0TW9kZXMuREFUQSAqLztcbiAgICB9XG59O1xuXG4vLyBQYXJzZSBpbmxpbmUgQ1NTIHN0cmluZ3MgZm9yIHN0YXRpYyBzdHlsZSBhdHRyaWJ1dGVzIGludG8gYW4gb2JqZWN0LlxuLy8gVGhpcyBpcyBhIE5vZGVUcmFuc2Zvcm0gc2luY2UgaXQgd29ya3Mgb24gdGhlIHN0YXRpYyBgc3R5bGVgIGF0dHJpYnV0ZSBhbmRcbi8vIGNvbnZlcnRzIGl0IGludG8gYSBkeW5hbWljIGVxdWl2YWxlbnQ6XG4vLyBzdHlsZT1cImNvbG9yOiByZWRcIiAtPiA6c3R5bGU9J3sgXCJjb2xvclwiOiBcInJlZFwiIH0nXG4vLyBJdCBpcyB0aGVuIHByb2Nlc3NlZCBieSBgdHJhbnNmb3JtRWxlbWVudGAgYW5kIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWRcbi8vIHByb3BzLlxuY29uc3QgdHJhbnNmb3JtU3R5bGUgPSBub2RlID0+IHtcbiAgICBpZiAobm9kZS50eXBlID09PSAxIC8qIE5vZGVUeXBlcy5FTEVNRU5UICovKSB7XG4gICAgICAgIG5vZGUucHJvcHMuZm9yRWFjaCgocCwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHAudHlwZSA9PT0gNiAvKiBOb2RlVHlwZXMuQVRUUklCVVRFICovICYmIHAubmFtZSA9PT0gJ3N0eWxlJyAmJiBwLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBwIHdpdGggYW4gZXhwcmVzc2lvbiBub2RlXG4gICAgICAgICAgICAgICAgbm9kZS5wcm9wc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogNyAvKiBOb2RlVHlwZXMuRElSRUNUSVZFICovLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBgYmluZGAsXG4gICAgICAgICAgICAgICAgICAgIGFyZzogY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihgc3R5bGVgLCB0cnVlLCBwLmxvYyksXG4gICAgICAgICAgICAgICAgICAgIGV4cDogcGFyc2VJbmxpbmVDU1MocC52YWx1ZS5jb250ZW50LCBwLmxvYyksXG4gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW10sXG4gICAgICAgICAgICAgICAgICAgIGxvYzogcC5sb2NcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuY29uc3QgcGFyc2VJbmxpbmVDU1MgPSAoY3NzVGV4dCwgbG9jKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHBhcnNlU3RyaW5nU3R5bGUoY3NzVGV4dCk7XG4gICAgcmV0dXJuIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZCksIGZhbHNlLCBsb2MsIDMgLyogQ29uc3RhbnRUeXBlcy5DQU5fU1RSSU5HSUZZICovKTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZURPTUNvbXBpbGVyRXJyb3IoY29kZSwgbG9jKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNvbXBpbGVyRXJyb3IoY29kZSwgbG9jLCAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgIXRydWUgPyBET01FcnJvck1lc3NhZ2VzIDogdW5kZWZpbmVkKTtcbn1cbmNvbnN0IERPTUVycm9yTWVzc2FnZXMgPSB7XG4gICAgWzUxIC8qIERPTUVycm9yQ29kZXMuWF9WX0hUTUxfTk9fRVhQUkVTU0lPTiAqL106IGB2LWh0bWwgaXMgbWlzc2luZyBleHByZXNzaW9uLmAsXG4gICAgWzUyIC8qIERPTUVycm9yQ29kZXMuWF9WX0hUTUxfV0lUSF9DSElMRFJFTiAqL106IGB2LWh0bWwgd2lsbCBvdmVycmlkZSBlbGVtZW50IGNoaWxkcmVuLmAsXG4gICAgWzUzIC8qIERPTUVycm9yQ29kZXMuWF9WX1RFWFRfTk9fRVhQUkVTU0lPTiAqL106IGB2LXRleHQgaXMgbWlzc2luZyBleHByZXNzaW9uLmAsXG4gICAgWzU0IC8qIERPTUVycm9yQ29kZXMuWF9WX1RFWFRfV0lUSF9DSElMRFJFTiAqL106IGB2LXRleHQgd2lsbCBvdmVycmlkZSBlbGVtZW50IGNoaWxkcmVuLmAsXG4gICAgWzU1IC8qIERPTUVycm9yQ29kZXMuWF9WX01PREVMX09OX0lOVkFMSURfRUxFTUVOVCAqL106IGB2LW1vZGVsIGNhbiBvbmx5IGJlIHVzZWQgb24gPGlucHV0PiwgPHRleHRhcmVhPiBhbmQgPHNlbGVjdD4gZWxlbWVudHMuYCxcbiAgICBbNTYgLyogRE9NRXJyb3JDb2Rlcy5YX1ZfTU9ERUxfQVJHX09OX0VMRU1FTlQgKi9dOiBgdi1tb2RlbCBhcmd1bWVudCBpcyBub3Qgc3VwcG9ydGVkIG9uIHBsYWluIGVsZW1lbnRzLmAsXG4gICAgWzU3IC8qIERPTUVycm9yQ29kZXMuWF9WX01PREVMX09OX0ZJTEVfSU5QVVRfRUxFTUVOVCAqL106IGB2LW1vZGVsIGNhbm5vdCBiZSB1c2VkIG9uIGZpbGUgaW5wdXRzIHNpbmNlIHRoZXkgYXJlIHJlYWQtb25seS4gVXNlIGEgdi1vbjpjaGFuZ2UgbGlzdGVuZXIgaW5zdGVhZC5gLFxuICAgIFs1OCAvKiBET01FcnJvckNvZGVzLlhfVl9NT0RFTF9VTk5FQ0VTU0FSWV9WQUxVRSAqL106IGBVbm5lY2Vzc2FyeSB2YWx1ZSBiaW5kaW5nIHVzZWQgYWxvbmdzaWRlIHYtbW9kZWwuIEl0IHdpbGwgaW50ZXJmZXJlIHdpdGggdi1tb2RlbCdzIGJlaGF2aW9yLmAsXG4gICAgWzU5IC8qIERPTUVycm9yQ29kZXMuWF9WX1NIT1dfTk9fRVhQUkVTU0lPTiAqL106IGB2LXNob3cgaXMgbWlzc2luZyBleHByZXNzaW9uLmAsXG4gICAgWzYwIC8qIERPTUVycm9yQ29kZXMuWF9UUkFOU0lUSU9OX0lOVkFMSURfQ0hJTERSRU4gKi9dOiBgPFRyYW5zaXRpb24+IGV4cGVjdHMgZXhhY3RseSBvbmUgY2hpbGQgZWxlbWVudCBvciBjb21wb25lbnQuYCxcbiAgICBbNjEgLyogRE9NRXJyb3JDb2Rlcy5YX0lHTk9SRURfU0lERV9FRkZFQ1RfVEFHICovXTogYFRhZ3Mgd2l0aCBzaWRlIGVmZmVjdCAoPHNjcmlwdD4gYW5kIDxzdHlsZT4pIGFyZSBpZ25vcmVkIGluIGNsaWVudCBjb21wb25lbnQgdGVtcGxhdGVzLmBcbn07XG5cbmNvbnN0IHRyYW5zZm9ybVZIdG1sID0gKGRpciwgbm9kZSwgY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgZXhwLCBsb2MgfSA9IGRpcjtcbiAgICBpZiAoIWV4cCkge1xuICAgICAgICBjb250ZXh0Lm9uRXJyb3IoY3JlYXRlRE9NQ29tcGlsZXJFcnJvcig1MSAvKiBET01FcnJvckNvZGVzLlhfVl9IVE1MX05PX0VYUFJFU1NJT04gKi8sIGxvYykpO1xuICAgIH1cbiAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZURPTUNvbXBpbGVyRXJyb3IoNTIgLyogRE9NRXJyb3JDb2Rlcy5YX1ZfSFRNTF9XSVRIX0NISUxEUkVOICovLCBsb2MpKTtcbiAgICAgICAgbm9kZS5jaGlsZHJlbi5sZW5ndGggPSAwO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9wczogW1xuICAgICAgICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihgaW5uZXJIVE1MYCwgdHJ1ZSwgbG9jKSwgZXhwIHx8IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oJycsIHRydWUpKVxuICAgICAgICBdXG4gICAgfTtcbn07XG5cbmNvbnN0IHRyYW5zZm9ybVZUZXh0ID0gKGRpciwgbm9kZSwgY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgZXhwLCBsb2MgfSA9IGRpcjtcbiAgICBpZiAoIWV4cCkge1xuICAgICAgICBjb250ZXh0Lm9uRXJyb3IoY3JlYXRlRE9NQ29tcGlsZXJFcnJvcig1MyAvKiBET01FcnJvckNvZGVzLlhfVl9URVhUX05PX0VYUFJFU1NJT04gKi8sIGxvYykpO1xuICAgIH1cbiAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZURPTUNvbXBpbGVyRXJyb3IoNTQgLyogRE9NRXJyb3JDb2Rlcy5YX1ZfVEVYVF9XSVRIX0NISUxEUkVOICovLCBsb2MpKTtcbiAgICAgICAgbm9kZS5jaGlsZHJlbi5sZW5ndGggPSAwO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9wczogW1xuICAgICAgICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihgdGV4dENvbnRlbnRgLCB0cnVlKSwgZXhwXG4gICAgICAgICAgICAgICAgPyBnZXRDb25zdGFudFR5cGUoZXhwLCBjb250ZXh0KSA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyBleHBcbiAgICAgICAgICAgICAgICAgICAgOiBjcmVhdGVDYWxsRXhwcmVzc2lvbihjb250ZXh0LmhlbHBlclN0cmluZyhUT19ESVNQTEFZX1NUUklORyksIFtleHBdLCBsb2MpXG4gICAgICAgICAgICAgICAgOiBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKCcnLCB0cnVlKSlcbiAgICAgICAgXVxuICAgIH07XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1Nb2RlbCA9IChkaXIsIG5vZGUsIGNvbnRleHQpID0+IHtcbiAgICBjb25zdCBiYXNlUmVzdWx0ID0gdHJhbnNmb3JtTW9kZWwkMShkaXIsIG5vZGUsIGNvbnRleHQpO1xuICAgIC8vIGJhc2UgdHJhbnNmb3JtIGhhcyBlcnJvcnMgT1IgY29tcG9uZW50IHYtbW9kZWwgKG9ubHkgbmVlZCBwcm9wcylcbiAgICBpZiAoIWJhc2VSZXN1bHQucHJvcHMubGVuZ3RoIHx8IG5vZGUudGFnVHlwZSA9PT0gMSAvKiBFbGVtZW50VHlwZXMuQ09NUE9ORU5UICovKSB7XG4gICAgICAgIHJldHVybiBiYXNlUmVzdWx0O1xuICAgIH1cbiAgICBpZiAoZGlyLmFyZykge1xuICAgICAgICBjb250ZXh0Lm9uRXJyb3IoY3JlYXRlRE9NQ29tcGlsZXJFcnJvcig1NiAvKiBET01FcnJvckNvZGVzLlhfVl9NT0RFTF9BUkdfT05fRUxFTUVOVCAqLywgZGlyLmFyZy5sb2MpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tEdXBsaWNhdGVkVmFsdWUoKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZmluZFByb3Aobm9kZSwgJ3ZhbHVlJyk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZURPTUNvbXBpbGVyRXJyb3IoNTggLyogRE9NRXJyb3JDb2Rlcy5YX1ZfTU9ERUxfVU5ORUNFU1NBUllfVkFMVUUgKi8sIHZhbHVlLmxvYykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHsgdGFnIH0gPSBub2RlO1xuICAgIGNvbnN0IGlzQ3VzdG9tRWxlbWVudCA9IGNvbnRleHQuaXNDdXN0b21FbGVtZW50KHRhZyk7XG4gICAgaWYgKHRhZyA9PT0gJ2lucHV0JyB8fFxuICAgICAgICB0YWcgPT09ICd0ZXh0YXJlYScgfHxcbiAgICAgICAgdGFnID09PSAnc2VsZWN0JyB8fFxuICAgICAgICBpc0N1c3RvbUVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRpcmVjdGl2ZVRvVXNlID0gVl9NT0RFTF9URVhUO1xuICAgICAgICBsZXQgaXNJbnZhbGlkVHlwZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGFnID09PSAnaW5wdXQnIHx8IGlzQ3VzdG9tRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IGZpbmRQcm9wKG5vZGUsIGB0eXBlYCk7XG4gICAgICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlLnR5cGUgPT09IDcgLyogTm9kZVR5cGVzLkRJUkVDVElWRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAvLyA6dHlwZT1cImZvb1wiXG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZVRvVXNlID0gVl9NT0RFTF9EWU5BTUlDO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZS52YWx1ZS5jb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyYWRpbyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlVG9Vc2UgPSBWX01PREVMX1JBRElPO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZVRvVXNlID0gVl9NT0RFTF9DSEVDS0JPWDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW52YWxpZFR5cGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQub25FcnJvcihjcmVhdGVET01Db21waWxlckVycm9yKDU3IC8qIERPTUVycm9yQ29kZXMuWF9WX01PREVMX09OX0ZJTEVfSU5QVVRfRUxFTUVOVCAqLywgZGlyLmxvYykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0IHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgY2hlY2tEdXBsaWNhdGVkVmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGhhc0R5bmFtaWNLZXlWQmluZChub2RlKSkge1xuICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgaGFzIGJpbmRpbmdzIHdpdGggZHluYW1pYyBrZXlzLCB3aGljaCBjYW4gcG9zc2libHkgY29udGFpblxuICAgICAgICAgICAgICAgIC8vIFwidHlwZVwiLlxuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZVRvVXNlID0gVl9NT0RFTF9EWU5BTUlDO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdGV4dCB0eXBlXG4gICAgICAgICAgICAgICAgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIGNoZWNrRHVwbGljYXRlZFZhbHVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGFnID09PSAnc2VsZWN0Jykge1xuICAgICAgICAgICAgZGlyZWN0aXZlVG9Vc2UgPSBWX01PREVMX1NFTEVDVDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRleHRhcmVhXG4gICAgICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgY2hlY2tEdXBsaWNhdGVkVmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbmplY3QgcnVudGltZSBkaXJlY3RpdmVcbiAgICAgICAgLy8gYnkgcmV0dXJuaW5nIHRoZSBoZWxwZXIgc3ltYm9sIHZpYSBuZWVkUnVudGltZVxuICAgICAgICAvLyB0aGUgaW1wb3J0IHdpbGwgcmVwbGFjZWQgYSByZXNvbHZlRGlyZWN0aXZlIGNhbGwuXG4gICAgICAgIGlmICghaXNJbnZhbGlkVHlwZSkge1xuICAgICAgICAgICAgYmFzZVJlc3VsdC5uZWVkUnVudGltZSA9IGNvbnRleHQuaGVscGVyKGRpcmVjdGl2ZVRvVXNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZURPTUNvbXBpbGVyRXJyb3IoNTUgLyogRE9NRXJyb3JDb2Rlcy5YX1ZfTU9ERUxfT05fSU5WQUxJRF9FTEVNRU5UICovLCBkaXIubG9jKSk7XG4gICAgfVxuICAgIC8vIG5hdGl2ZSB2bW9kZWwgZG9lc24ndCBuZWVkIHRoZSBgbW9kZWxWYWx1ZWAgcHJvcHMgc2luY2UgdGhleSBhcmUgYWxzb1xuICAgIC8vIHBhc3NlZCB0byB0aGUgcnVudGltZSBhcyBgYmluZGluZy52YWx1ZWAuIHJlbW92aW5nIGl0IHJlZHVjZXMgY29kZSBzaXplLlxuICAgIGJhc2VSZXN1bHQucHJvcHMgPSBiYXNlUmVzdWx0LnByb3BzLmZpbHRlcihwID0+ICEocC5rZXkudHlwZSA9PT0gNCAvKiBOb2RlVHlwZXMuU0lNUExFX0VYUFJFU1NJT04gKi8gJiZcbiAgICAgICAgcC5rZXkuY29udGVudCA9PT0gJ21vZGVsVmFsdWUnKSk7XG4gICAgcmV0dXJuIGJhc2VSZXN1bHQ7XG59O1xuXG5jb25zdCBpc0V2ZW50T3B0aW9uTW9kaWZpZXIgPSAvKiNfX1BVUkVfXyovIG1ha2VNYXAoYHBhc3NpdmUsb25jZSxjYXB0dXJlYCk7XG5jb25zdCBpc05vbktleU1vZGlmaWVyID0gLyojX19QVVJFX18qLyBtYWtlTWFwKFxuLy8gZXZlbnQgcHJvcGFnYXRpb24gbWFuYWdlbWVudFxuYHN0b3AscHJldmVudCxzZWxmLGAgK1xuICAgIC8vIHN5c3RlbSBtb2RpZmllcnMgKyBleGFjdFxuICAgIGBjdHJsLHNoaWZ0LGFsdCxtZXRhLGV4YWN0LGAgK1xuICAgIC8vIG1vdXNlXG4gICAgYG1pZGRsZWApO1xuLy8gbGVmdCAmIHJpZ2h0IGNvdWxkIGJlIG1vdXNlIG9yIGtleSBtb2RpZmllcnMgYmFzZWQgb24gZXZlbnQgdHlwZVxuY29uc3QgbWF5YmVLZXlNb2RpZmllciA9IC8qI19fUFVSRV9fKi8gbWFrZU1hcCgnbGVmdCxyaWdodCcpO1xuY29uc3QgaXNLZXlib2FyZEV2ZW50ID0gLyojX19QVVJFX18qLyBtYWtlTWFwKGBvbmtleXVwLG9ua2V5ZG93bixvbmtleXByZXNzYCwgdHJ1ZSk7XG5jb25zdCByZXNvbHZlTW9kaWZpZXJzID0gKGtleSwgbW9kaWZpZXJzLCBjb250ZXh0LCBsb2MpID0+IHtcbiAgICBjb25zdCBrZXlNb2RpZmllcnMgPSBbXTtcbiAgICBjb25zdCBub25LZXlNb2RpZmllcnMgPSBbXTtcbiAgICBjb25zdCBldmVudE9wdGlvbk1vZGlmaWVycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kaWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG1vZGlmaWVyID0gbW9kaWZpZXJzW2ldO1xuICAgICAgICBpZiAobW9kaWZpZXIgPT09ICduYXRpdmUnICYmXG4gICAgICAgICAgICBjaGVja0NvbXBhdEVuYWJsZWQoXCJDT01QSUxFUl9WX09OX05BVElWRVwiIC8qIENvbXBpbGVyRGVwcmVjYXRpb25UeXBlcy5DT01QSUxFUl9WX09OX05BVElWRSAqLywgY29udGV4dCwgbG9jKSkge1xuICAgICAgICAgICAgZXZlbnRPcHRpb25Nb2RpZmllcnMucHVzaChtb2RpZmllcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNFdmVudE9wdGlvbk1vZGlmaWVyKG1vZGlmaWVyKSkge1xuICAgICAgICAgICAgLy8gZXZlbnRPcHRpb25Nb2RpZmllcnM6IG1vZGlmaWVycyBmb3IgYWRkRXZlbnRMaXN0ZW5lcigpIG9wdGlvbnMsXG4gICAgICAgICAgICAvLyBlLmcuIC5wYXNzaXZlICYgLmNhcHR1cmVcbiAgICAgICAgICAgIGV2ZW50T3B0aW9uTW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcnVudGltZU1vZGlmaWVyczogbW9kaWZpZXJzIHRoYXQgbmVlZHMgcnVudGltZSBndWFyZHNcbiAgICAgICAgICAgIGlmIChtYXliZUtleU1vZGlmaWVyKG1vZGlmaWVyKSkge1xuICAgICAgICAgICAgICAgIGlmIChpc1N0YXRpY0V4cChrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0tleWJvYXJkRXZlbnQoa2V5LmNvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlNb2RpZmllcnMucHVzaChtb2RpZmllcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub25LZXlNb2RpZmllcnMucHVzaChtb2RpZmllcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGtleU1vZGlmaWVycy5wdXNoKG1vZGlmaWVyKTtcbiAgICAgICAgICAgICAgICAgICAgbm9uS2V5TW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpc05vbktleU1vZGlmaWVyKG1vZGlmaWVyKSkge1xuICAgICAgICAgICAgICAgICAgICBub25LZXlNb2RpZmllcnMucHVzaChtb2RpZmllcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBrZXlNb2RpZmllcnMucHVzaChtb2RpZmllcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGtleU1vZGlmaWVycyxcbiAgICAgICAgbm9uS2V5TW9kaWZpZXJzLFxuICAgICAgICBldmVudE9wdGlvbk1vZGlmaWVyc1xuICAgIH07XG59O1xuY29uc3QgdHJhbnNmb3JtQ2xpY2sgPSAoa2V5LCBldmVudCkgPT4ge1xuICAgIGNvbnN0IGlzU3RhdGljQ2xpY2sgPSBpc1N0YXRpY0V4cChrZXkpICYmIGtleS5jb250ZW50LnRvTG93ZXJDYXNlKCkgPT09ICdvbmNsaWNrJztcbiAgICByZXR1cm4gaXNTdGF0aWNDbGlja1xuICAgICAgICA/IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oZXZlbnQsIHRydWUpXG4gICAgICAgIDoga2V5LnR5cGUgIT09IDQgLyogTm9kZVR5cGVzLlNJTVBMRV9FWFBSRVNTSU9OICovXG4gICAgICAgICAgICA/IGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihbXG4gICAgICAgICAgICAgICAgYChgLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICBgKSA9PT0gXCJvbkNsaWNrXCIgPyBcIiR7ZXZlbnR9XCIgOiAoYCxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgYClgXG4gICAgICAgICAgICBdKVxuICAgICAgICAgICAgOiBrZXk7XG59O1xuY29uc3QgdHJhbnNmb3JtT24gPSAoZGlyLCBub2RlLCBjb250ZXh0KSA9PiB7XG4gICAgcmV0dXJuIHRyYW5zZm9ybU9uJDEoZGlyLCBub2RlLCBjb250ZXh0LCBiYXNlUmVzdWx0ID0+IHtcbiAgICAgICAgY29uc3QgeyBtb2RpZmllcnMgfSA9IGRpcjtcbiAgICAgICAgaWYgKCFtb2RpZmllcnMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGJhc2VSZXN1bHQ7XG4gICAgICAgIGxldCB7IGtleSwgdmFsdWU6IGhhbmRsZXJFeHAgfSA9IGJhc2VSZXN1bHQucHJvcHNbMF07XG4gICAgICAgIGNvbnN0IHsga2V5TW9kaWZpZXJzLCBub25LZXlNb2RpZmllcnMsIGV2ZW50T3B0aW9uTW9kaWZpZXJzIH0gPSByZXNvbHZlTW9kaWZpZXJzKGtleSwgbW9kaWZpZXJzLCBjb250ZXh0LCBkaXIubG9jKTtcbiAgICAgICAgLy8gbm9ybWFsaXplIGNsaWNrLnJpZ2h0IGFuZCBjbGljay5taWRkbGUgc2luY2UgdGhleSBkb24ndCBhY3R1YWxseSBmaXJlXG4gICAgICAgIGlmIChub25LZXlNb2RpZmllcnMuaW5jbHVkZXMoJ3JpZ2h0JykpIHtcbiAgICAgICAgICAgIGtleSA9IHRyYW5zZm9ybUNsaWNrKGtleSwgYG9uQ29udGV4dG1lbnVgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9uS2V5TW9kaWZpZXJzLmluY2x1ZGVzKCdtaWRkbGUnKSkge1xuICAgICAgICAgICAga2V5ID0gdHJhbnNmb3JtQ2xpY2soa2V5LCBgb25Nb3VzZXVwYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vbktleU1vZGlmaWVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGhhbmRsZXJFeHAgPSBjcmVhdGVDYWxsRXhwcmVzc2lvbihjb250ZXh0LmhlbHBlcihWX09OX1dJVEhfTU9ESUZJRVJTKSwgW1xuICAgICAgICAgICAgICAgIGhhbmRsZXJFeHAsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobm9uS2V5TW9kaWZpZXJzKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleU1vZGlmaWVycy5sZW5ndGggJiZcbiAgICAgICAgICAgIC8vIGlmIGV2ZW50IG5hbWUgaXMgZHluYW1pYywgYWx3YXlzIHdyYXAgd2l0aCBrZXlzIGd1YXJkXG4gICAgICAgICAgICAoIWlzU3RhdGljRXhwKGtleSkgfHwgaXNLZXlib2FyZEV2ZW50KGtleS5jb250ZW50KSkpIHtcbiAgICAgICAgICAgIGhhbmRsZXJFeHAgPSBjcmVhdGVDYWxsRXhwcmVzc2lvbihjb250ZXh0LmhlbHBlcihWX09OX1dJVEhfS0VZUyksIFtcbiAgICAgICAgICAgICAgICBoYW5kbGVyRXhwLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGtleU1vZGlmaWVycylcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudE9wdGlvbk1vZGlmaWVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVyUG9zdGZpeCA9IGV2ZW50T3B0aW9uTW9kaWZpZXJzLm1hcChjYXBpdGFsaXplKS5qb2luKCcnKTtcbiAgICAgICAgICAgIGtleSA9IGlzU3RhdGljRXhwKGtleSlcbiAgICAgICAgICAgICAgICA/IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYCR7a2V5LmNvbnRlbnR9JHttb2RpZmllclBvc3RmaXh9YCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICA6IGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihbYChgLCBrZXksIGApICsgXCIke21vZGlmaWVyUG9zdGZpeH1cImBdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJvcHM6IFtjcmVhdGVPYmplY3RQcm9wZXJ0eShrZXksIGhhbmRsZXJFeHApXVxuICAgICAgICB9O1xuICAgIH0pO1xufTtcblxuY29uc3QgdHJhbnNmb3JtU2hvdyA9IChkaXIsIG5vZGUsIGNvbnRleHQpID0+IHtcbiAgICBjb25zdCB7IGV4cCwgbG9jIH0gPSBkaXI7XG4gICAgaWYgKCFleHApIHtcbiAgICAgICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZURPTUNvbXBpbGVyRXJyb3IoNTkgLyogRE9NRXJyb3JDb2Rlcy5YX1ZfU0hPV19OT19FWFBSRVNTSU9OICovLCBsb2MpKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICBuZWVkUnVudGltZTogY29udGV4dC5oZWxwZXIoVl9TSE9XKVxuICAgIH07XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1UcmFuc2l0aW9uID0gKG5vZGUsIGNvbnRleHQpID0+IHtcbiAgICBpZiAobm9kZS50eXBlID09PSAxIC8qIE5vZGVUeXBlcy5FTEVNRU5UICovICYmXG4gICAgICAgIG5vZGUudGFnVHlwZSA9PT0gMSAvKiBFbGVtZW50VHlwZXMuQ09NUE9ORU5UICovKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbnRleHQuaXNCdWlsdEluQ29tcG9uZW50KG5vZGUudGFnKTtcbiAgICAgICAgaWYgKGNvbXBvbmVudCA9PT0gVFJBTlNJVElPTikge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIW5vZGUuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gd2FybiBtdWx0aXBsZSB0cmFuc2l0aW9uIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgaWYgKGhhc011bHRpcGxlQ2hpbGRyZW4obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZURPTUNvbXBpbGVyRXJyb3IoNjAgLyogRE9NRXJyb3JDb2Rlcy5YX1RSQU5TSVRJT05fSU5WQUxJRF9DSElMRFJFTiAqLywge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG5vZGUuY2hpbGRyZW5bMF0ubG9jLnN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBub2RlLmNoaWxkcmVuW25vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMV0ubG9jLmVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJydcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBpdCdzIHMgc2luZ2xlIGNoaWxkIHcvIHYtc2hvd1xuICAgICAgICAgICAgICAgIC8vIGlmIHllcywgaW5qZWN0IFwicGVyc2lzdGVkOiB0cnVlXCIgdG8gdGhlIHRyYW5zaXRpb24gcHJvcHNcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5bMF07XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09IDEgLyogTm9kZVR5cGVzLkVMRU1FTlQgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIGNoaWxkLnByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocC50eXBlID09PSA3IC8qIE5vZGVUeXBlcy5ESVJFQ1RJVkUgKi8gJiYgcC5uYW1lID09PSAnc2hvdycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnByb3BzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiA2IC8qIE5vZGVUeXBlcy5BVFRSSUJVVEUgKi8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwZXJzaXN0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IG5vZGUubG9jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxufTtcbmZ1bmN0aW9uIGhhc011bHRpcGxlQ2hpbGRyZW4obm9kZSkge1xuICAgIC8vICMxMzUyIGZpbHRlciBvdXQgcG90ZW50aWFsIGNvbW1lbnQgbm9kZXMuXG4gICAgY29uc3QgY2hpbGRyZW4gPSAobm9kZS5jaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4uZmlsdGVyKGMgPT4gYy50eXBlICE9PSAzIC8qIE5vZGVUeXBlcy5DT01NRU5UICovICYmXG4gICAgICAgICEoYy50eXBlID09PSAyIC8qIE5vZGVUeXBlcy5URVhUICovICYmICFjLmNvbnRlbnQudHJpbSgpKSkpO1xuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bMF07XG4gICAgcmV0dXJuIChjaGlsZHJlbi5sZW5ndGggIT09IDEgfHxcbiAgICAgICAgY2hpbGQudHlwZSA9PT0gMTEgLyogTm9kZVR5cGVzLkZPUiAqLyB8fFxuICAgICAgICAoY2hpbGQudHlwZSA9PT0gOSAvKiBOb2RlVHlwZXMuSUYgKi8gJiYgY2hpbGQuYnJhbmNoZXMuc29tZShoYXNNdWx0aXBsZUNoaWxkcmVuKSkpO1xufVxuXG5jb25zdCBpZ25vcmVTaWRlRWZmZWN0VGFncyA9IChub2RlLCBjb250ZXh0KSA9PiB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gMSAvKiBOb2RlVHlwZXMuRUxFTUVOVCAqLyAmJlxuICAgICAgICBub2RlLnRhZ1R5cGUgPT09IDAgLyogRWxlbWVudFR5cGVzLkVMRU1FTlQgKi8gJiZcbiAgICAgICAgKG5vZGUudGFnID09PSAnc2NyaXB0JyB8fCBub2RlLnRhZyA9PT0gJ3N0eWxlJykpIHtcbiAgICAgICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZURPTUNvbXBpbGVyRXJyb3IoNjEgLyogRE9NRXJyb3JDb2Rlcy5YX0lHTk9SRURfU0lERV9FRkZFQ1RfVEFHICovLCBub2RlLmxvYykpO1xuICAgICAgICBjb250ZXh0LnJlbW92ZU5vZGUoKTtcbiAgICB9XG59O1xuXG5jb25zdCBET01Ob2RlVHJhbnNmb3JtcyA9IFtcbiAgICB0cmFuc2Zvcm1TdHlsZSxcbiAgICAuLi4oKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gW3RyYW5zZm9ybVRyYW5zaXRpb25dIDogW10pXG5dO1xuY29uc3QgRE9NRGlyZWN0aXZlVHJhbnNmb3JtcyA9IHtcbiAgICBjbG9hazogbm9vcERpcmVjdGl2ZVRyYW5zZm9ybSxcbiAgICBodG1sOiB0cmFuc2Zvcm1WSHRtbCxcbiAgICB0ZXh0OiB0cmFuc2Zvcm1WVGV4dCxcbiAgICBtb2RlbDogdHJhbnNmb3JtTW9kZWwsXG4gICAgb246IHRyYW5zZm9ybU9uLFxuICAgIHNob3c6IHRyYW5zZm9ybVNob3dcbn07XG5mdW5jdGlvbiBjb21waWxlKHRlbXBsYXRlLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gYmFzZUNvbXBpbGUodGVtcGxhdGUsIGV4dGVuZCh7fSwgcGFyc2VyT3B0aW9ucywgb3B0aW9ucywge1xuICAgICAgICBub2RlVHJhbnNmb3JtczogW1xuICAgICAgICAgICAgLy8gaWdub3JlIDxzY3JpcHQ+IGFuZCA8dGFnPlxuICAgICAgICAgICAgLy8gdGhpcyBpcyBub3QgcHV0IGluc2lkZSBET01Ob2RlVHJhbnNmb3JtcyBiZWNhdXNlIHRoYXQgbGlzdCBpcyB1c2VkXG4gICAgICAgICAgICAvLyBieSBjb21waWxlci1zc3IgdG8gZ2VuZXJhdGUgdm5vZGUgZmFsbGJhY2sgYnJhbmNoZXNcbiAgICAgICAgICAgIGlnbm9yZVNpZGVFZmZlY3RUYWdzLFxuICAgICAgICAgICAgLi4uRE9NTm9kZVRyYW5zZm9ybXMsXG4gICAgICAgICAgICAuLi4ob3B0aW9ucy5ub2RlVHJhbnNmb3JtcyB8fCBbXSlcbiAgICAgICAgXSxcbiAgICAgICAgZGlyZWN0aXZlVHJhbnNmb3JtczogZXh0ZW5kKHt9LCBET01EaXJlY3RpdmVUcmFuc2Zvcm1zLCBvcHRpb25zLmRpcmVjdGl2ZVRyYW5zZm9ybXMgfHwge30pLFxuICAgICAgICB0cmFuc2Zvcm1Ib2lzdDogbnVsbCBcbiAgICB9KSk7XG59XG5mdW5jdGlvbiBwYXJzZSh0ZW1wbGF0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGJhc2VQYXJzZSh0ZW1wbGF0ZSwgZXh0ZW5kKHt9LCBwYXJzZXJPcHRpb25zLCBvcHRpb25zKSk7XG59XG5cbmV4cG9ydCB7IERPTURpcmVjdGl2ZVRyYW5zZm9ybXMsIERPTU5vZGVUcmFuc2Zvcm1zLCBUUkFOU0lUSU9OLCBUUkFOU0lUSU9OX0dST1VQLCBWX01PREVMX0NIRUNLQk9YLCBWX01PREVMX0RZTkFNSUMsIFZfTU9ERUxfUkFESU8sIFZfTU9ERUxfU0VMRUNULCBWX01PREVMX1RFWFQsIFZfT05fV0lUSF9LRVlTLCBWX09OX1dJVEhfTU9ESUZJRVJTLCBWX1NIT1csIGNvbXBpbGUsIGNyZWF0ZURPTUNvbXBpbGVyRXJyb3IsIHBhcnNlLCBwYXJzZXJPcHRpb25zLCB0cmFuc2Zvcm1TdHlsZSB9O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js\n");

/***/ }),

/***/ "./node_modules/@vue/devtools-api/lib/esm/const.js":
/*!*********************************************************!*\
  !*** ./node_modules/@vue/devtools-api/lib/esm/const.js ***!
  \*********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"HOOK_PLUGIN_SETTINGS_SET\": () => (/* binding */ HOOK_PLUGIN_SETTINGS_SET),\n/* harmony export */   \"HOOK_SETUP\": () => (/* binding */ HOOK_SETUP)\n/* harmony export */ });\nconst HOOK_SETUP = 'devtools-plugin:setup';\nconst HOOK_PLUGIN_SETTINGS_SET = 'plugin:settings:set';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHZ1ZS9kZXZ0b29scy1hcGkvbGliL2VzbS9jb25zdC5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFPO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHZ1ZS9kZXZ0b29scy1hcGkvbGliL2VzbS9jb25zdC5qcz82MTFlIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBIT09LX1NFVFVQID0gJ2RldnRvb2xzLXBsdWdpbjpzZXR1cCc7XG5leHBvcnQgY29uc3QgSE9PS19QTFVHSU5fU0VUVElOR1NfU0VUID0gJ3BsdWdpbjpzZXR0aW5nczpzZXQnO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@vue/devtools-api/lib/esm/const.js\n");

/***/ }),

/***/ "./node_modules/@vue/devtools-api/lib/esm/env.js":
/*!*******************************************************!*\
  !*** ./node_modules/@vue/devtools-api/lib/esm/env.js ***!
  \*******************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"getDevtoolsGlobalHook\": () => (/* binding */ getDevtoolsGlobalHook),\n/* harmony export */   \"getTarget\": () => (/* binding */ getTarget),\n/* harmony export */   \"isProxyAvailable\": () => (/* binding */ isProxyAvailable)\n/* harmony export */ });\nfunction getDevtoolsGlobalHook() {\n    return getTarget().__VUE_DEVTOOLS_GLOBAL_HOOK__;\n}\nfunction getTarget() {\n    // @ts-ignore\n    return (typeof navigator !== 'undefined' && typeof window !== 'undefined')\n        ? window\n        : typeof __webpack_require__.g !== 'undefined'\n            ? __webpack_require__.g\n            : {};\n}\nconst isProxyAvailable = typeof Proxy === 'function';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHZ1ZS9kZXZ0b29scy1hcGkvbGliL2VzbS9lbnYuanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQU87QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIscUJBQU07QUFDdkIsY0FBYyxxQkFBTTtBQUNwQjtBQUNBO0FBQ08iLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHZ1ZS9kZXZ0b29scy1hcGkvbGliL2VzbS9lbnYuanM/OTliYSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZ2V0RGV2dG9vbHNHbG9iYWxIb29rKCkge1xuICAgIHJldHVybiBnZXRUYXJnZXQoKS5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcmdldCgpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgPyB3aW5kb3dcbiAgICAgICAgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgPyBnbG9iYWxcbiAgICAgICAgICAgIDoge307XG59XG5leHBvcnQgY29uc3QgaXNQcm94eUF2YWlsYWJsZSA9IHR5cGVvZiBQcm94eSA9PT0gJ2Z1bmN0aW9uJztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@vue/devtools-api/lib/esm/env.js\n");

/***/ }),

/***/ "./node_modules/@vue/devtools-api/lib/esm/index.js":
/*!*********************************************************!*\
  !*** ./node_modules/@vue/devtools-api/lib/esm/index.js ***!
  \*********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"isPerformanceSupported\": () => (/* reexport safe */ _time_js__WEBPACK_IMPORTED_MODULE_0__.isPerformanceSupported),\n/* harmony export */   \"now\": () => (/* reexport safe */ _time_js__WEBPACK_IMPORTED_MODULE_0__.now),\n/* harmony export */   \"setupDevtoolsPlugin\": () => (/* binding */ setupDevtoolsPlugin)\n/* harmony export */ });\n/* harmony import */ var _env_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./env.js */ \"./node_modules/@vue/devtools-api/lib/esm/env.js\");\n/* harmony import */ var _const_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./const.js */ \"./node_modules/@vue/devtools-api/lib/esm/const.js\");\n/* harmony import */ var _proxy_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./proxy.js */ \"./node_modules/@vue/devtools-api/lib/esm/proxy.js\");\n/* harmony import */ var _time_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./time.js */ \"./node_modules/@vue/devtools-api/lib/esm/time.js\");\n\n\n\n\n\n\nfunction setupDevtoolsPlugin(pluginDescriptor, setupFn) {\n    const descriptor = pluginDescriptor;\n    const target = (0,_env_js__WEBPACK_IMPORTED_MODULE_1__.getTarget)();\n    const hook = (0,_env_js__WEBPACK_IMPORTED_MODULE_1__.getDevtoolsGlobalHook)();\n    const enableProxy = _env_js__WEBPACK_IMPORTED_MODULE_1__.isProxyAvailable && descriptor.enableEarlyProxy;\n    if (hook && (target.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__ || !enableProxy)) {\n        hook.emit(_const_js__WEBPACK_IMPORTED_MODULE_2__.HOOK_SETUP, pluginDescriptor, setupFn);\n    }\n    else {\n        const proxy = enableProxy ? new _proxy_js__WEBPACK_IMPORTED_MODULE_3__.ApiProxy(descriptor, hook) : null;\n        const list = target.__VUE_DEVTOOLS_PLUGINS__ = target.__VUE_DEVTOOLS_PLUGINS__ || [];\n        list.push({\n            pluginDescriptor: descriptor,\n            setupFn,\n            proxy,\n        });\n        if (proxy)\n            setupFn(proxy.proxiedTarget);\n    }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHZ1ZS9kZXZ0b29scy1hcGkvbGliL2VzbS9pbmRleC5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQThFO0FBQ3RDO0FBQ0Y7QUFDUDtBQUNIO0FBQ0Y7QUFDbkI7QUFDUDtBQUNBLG1CQUFtQixrREFBUztBQUM1QixpQkFBaUIsOERBQXFCO0FBQ3RDLHdCQUF3QixxREFBZ0I7QUFDeEM7QUFDQSxrQkFBa0IsaURBQVU7QUFDNUI7QUFDQTtBQUNBLHdDQUF3QywrQ0FBUTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B2dWUvZGV2dG9vbHMtYXBpL2xpYi9lc20vaW5kZXguanM/ZmZjZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRUYXJnZXQsIGdldERldnRvb2xzR2xvYmFsSG9vaywgaXNQcm94eUF2YWlsYWJsZSB9IGZyb20gJy4vZW52LmpzJztcbmltcG9ydCB7IEhPT0tfU0VUVVAgfSBmcm9tICcuL2NvbnN0LmpzJztcbmltcG9ydCB7IEFwaVByb3h5IH0gZnJvbSAnLi9wcm94eS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2FwaS9pbmRleC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3BsdWdpbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3RpbWUuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwRGV2dG9vbHNQbHVnaW4ocGx1Z2luRGVzY3JpcHRvciwgc2V0dXBGbikge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBwbHVnaW5EZXNjcmlwdG9yO1xuICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldCgpO1xuICAgIGNvbnN0IGhvb2sgPSBnZXREZXZ0b29sc0dsb2JhbEhvb2soKTtcbiAgICBjb25zdCBlbmFibGVQcm94eSA9IGlzUHJveHlBdmFpbGFibGUgJiYgZGVzY3JpcHRvci5lbmFibGVFYXJseVByb3h5O1xuICAgIGlmIChob29rICYmICh0YXJnZXQuX19WVUVfREVWVE9PTFNfUExVR0lOX0FQSV9BVkFJTEFCTEVfXyB8fCAhZW5hYmxlUHJveHkpKSB7XG4gICAgICAgIGhvb2suZW1pdChIT09LX1NFVFVQLCBwbHVnaW5EZXNjcmlwdG9yLCBzZXR1cEZuKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHByb3h5ID0gZW5hYmxlUHJveHkgPyBuZXcgQXBpUHJveHkoZGVzY3JpcHRvciwgaG9vaykgOiBudWxsO1xuICAgICAgICBjb25zdCBsaXN0ID0gdGFyZ2V0Ll9fVlVFX0RFVlRPT0xTX1BMVUdJTlNfXyA9IHRhcmdldC5fX1ZVRV9ERVZUT09MU19QTFVHSU5TX18gfHwgW107XG4gICAgICAgIGxpc3QucHVzaCh7XG4gICAgICAgICAgICBwbHVnaW5EZXNjcmlwdG9yOiBkZXNjcmlwdG9yLFxuICAgICAgICAgICAgc2V0dXBGbixcbiAgICAgICAgICAgIHByb3h5LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHByb3h5KVxuICAgICAgICAgICAgc2V0dXBGbihwcm94eS5wcm94aWVkVGFyZ2V0KTtcbiAgICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@vue/devtools-api/lib/esm/index.js\n");

/***/ }),

/***/ "./node_modules/@vue/devtools-api/lib/esm/proxy.js":
/*!*********************************************************!*\
  !*** ./node_modules/@vue/devtools-api/lib/esm/proxy.js ***!
  \*********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"ApiProxy\": () => (/* binding */ ApiProxy)\n/* harmony export */ });\n/* harmony import */ var _const_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./const.js */ \"./node_modules/@vue/devtools-api/lib/esm/const.js\");\n/* harmony import */ var _time_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./time.js */ \"./node_modules/@vue/devtools-api/lib/esm/time.js\");\n\n\nclass ApiProxy {\n    constructor(plugin, hook) {\n        this.target = null;\n        this.targetQueue = [];\n        this.onQueue = [];\n        this.plugin = plugin;\n        this.hook = hook;\n        const defaultSettings = {};\n        if (plugin.settings) {\n            for (const id in plugin.settings) {\n                const item = plugin.settings[id];\n                defaultSettings[id] = item.defaultValue;\n            }\n        }\n        const localSettingsSaveId = `__vue-devtools-plugin-settings__${plugin.id}`;\n        let currentSettings = Object.assign({}, defaultSettings);\n        try {\n            const raw = localStorage.getItem(localSettingsSaveId);\n            const data = JSON.parse(raw);\n            Object.assign(currentSettings, data);\n        }\n        catch (e) {\n            // noop\n        }\n        this.fallbacks = {\n            getSettings() {\n                return currentSettings;\n            },\n            setSettings(value) {\n                try {\n                    localStorage.setItem(localSettingsSaveId, JSON.stringify(value));\n                }\n                catch (e) {\n                    // noop\n                }\n                currentSettings = value;\n            },\n            now() {\n                return (0,_time_js__WEBPACK_IMPORTED_MODULE_0__.now)();\n            },\n        };\n        if (hook) {\n            hook.on(_const_js__WEBPACK_IMPORTED_MODULE_1__.HOOK_PLUGIN_SETTINGS_SET, (pluginId, value) => {\n                if (pluginId === this.plugin.id) {\n                    this.fallbacks.setSettings(value);\n                }\n            });\n        }\n        this.proxiedOn = new Proxy({}, {\n            get: (_target, prop) => {\n                if (this.target) {\n                    return this.target.on[prop];\n                }\n                else {\n                    return (...args) => {\n                        this.onQueue.push({\n                            method: prop,\n                            args,\n                        });\n                    };\n                }\n            },\n        });\n        this.proxiedTarget = new Proxy({}, {\n            get: (_target, prop) => {\n                if (this.target) {\n                    return this.target[prop];\n                }\n                else if (prop === 'on') {\n                    return this.proxiedOn;\n                }\n                else if (Object.keys(this.fallbacks).includes(prop)) {\n                    return (...args) => {\n                        this.targetQueue.push({\n                            method: prop,\n                            args,\n                            resolve: () => { },\n                        });\n                        return this.fallbacks[prop](...args);\n                    };\n                }\n                else {\n                    return (...args) => {\n                        return new Promise(resolve => {\n                            this.targetQueue.push({\n                                method: prop,\n                                args,\n                                resolve,\n                            });\n                        });\n                    };\n                }\n            },\n        });\n    }\n    async setRealTarget(target) {\n        this.target = target;\n        for (const item of this.onQueue) {\n            this.target.on[item.method](...item.args);\n        }\n        for (const item of this.targetQueue) {\n            item.resolve(await this.target[item.method](...item.args));\n        }\n    }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHZ1ZS9kZXZ0b29scy1hcGkvbGliL2VzbS9wcm94eS5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBc0Q7QUFDdEI7QUFDekI7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RSxVQUFVO0FBQ2pGLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSx1QkFBdUIsNkNBQUc7QUFDMUIsYUFBYTtBQUNiO0FBQ0E7QUFDQSxvQkFBb0IsK0RBQXdCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1QseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5Qyx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHZ1ZS9kZXZ0b29scy1hcGkvbGliL2VzbS9wcm94eS5qcz9jNTMxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEhPT0tfUExVR0lOX1NFVFRJTkdTX1NFVCB9IGZyb20gJy4vY29uc3QuanMnO1xuaW1wb3J0IHsgbm93IH0gZnJvbSAnLi90aW1lLmpzJztcbmV4cG9ydCBjbGFzcyBBcGlQcm94eSB7XG4gICAgY29uc3RydWN0b3IocGx1Z2luLCBob29rKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy50YXJnZXRRdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLm9uUXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgICAgIHRoaXMuaG9vayA9IGhvb2s7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRTZXR0aW5ncyA9IHt9O1xuICAgICAgICBpZiAocGx1Z2luLnNldHRpbmdzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHBsdWdpbi5zZXR0aW5ncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBwbHVnaW4uc2V0dGluZ3NbaWRdO1xuICAgICAgICAgICAgICAgIGRlZmF1bHRTZXR0aW5nc1tpZF0gPSBpdGVtLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsb2NhbFNldHRpbmdzU2F2ZUlkID0gYF9fdnVlLWRldnRvb2xzLXBsdWdpbi1zZXR0aW5nc19fJHtwbHVnaW4uaWR9YDtcbiAgICAgICAgbGV0IGN1cnJlbnRTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRTZXR0aW5ncyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsb2NhbFNldHRpbmdzU2F2ZUlkKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGN1cnJlbnRTZXR0aW5ncywgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIG5vb3BcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZhbGxiYWNrcyA9IHtcbiAgICAgICAgICAgIGdldFNldHRpbmdzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50U2V0dGluZ3M7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0U2V0dGluZ3ModmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsb2NhbFNldHRpbmdzU2F2ZUlkLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBub29wXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnJlbnRTZXR0aW5ncyA9IHZhbHVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5vdygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm93KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpZiAoaG9vaykge1xuICAgICAgICAgICAgaG9vay5vbihIT09LX1BMVUdJTl9TRVRUSU5HU19TRVQsIChwbHVnaW5JZCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luSWQgPT09IHRoaXMucGx1Z2luLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmFsbGJhY2tzLnNldFNldHRpbmdzKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb3hpZWRPbiA9IG5ldyBQcm94eSh7fSwge1xuICAgICAgICAgICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50YXJnZXQub25bcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25RdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHByb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByb3hpZWRUYXJnZXQgPSBuZXcgUHJveHkoe30sIHtcbiAgICAgICAgICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0W3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9wID09PSAnb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3hpZWRPbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoT2JqZWN0LmtleXModGhpcy5mYWxsYmFja3MpLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YXJnZXRRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHByb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiAoKSA9PiB7IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZhbGxiYWNrc1twcm9wXSguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0UXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogcHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBzZXRSZWFsVGFyZ2V0KHRhcmdldCkge1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMub25RdWV1ZSkge1xuICAgICAgICAgICAgdGhpcy50YXJnZXQub25baXRlbS5tZXRob2RdKC4uLml0ZW0uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMudGFyZ2V0UXVldWUpIHtcbiAgICAgICAgICAgIGl0ZW0ucmVzb2x2ZShhd2FpdCB0aGlzLnRhcmdldFtpdGVtLm1ldGhvZF0oLi4uaXRlbS5hcmdzKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@vue/devtools-api/lib/esm/proxy.js\n");

/***/ }),

/***/ "./node_modules/@vue/devtools-api/lib/esm/time.js":
/*!********************************************************!*\
  !*** ./node_modules/@vue/devtools-api/lib/esm/time.js ***!
  \********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"isPerformanceSupported\": () => (/* binding */ isPerformanceSupported),\n/* harmony export */   \"now\": () => (/* binding */ now)\n/* harmony export */ });\nlet supported;\nlet perf;\nfunction isPerformanceSupported() {\n    var _a;\n    if (supported !== undefined) {\n        return supported;\n    }\n    if (typeof window !== 'undefined' && window.performance) {\n        supported = true;\n        perf = window.performance;\n    }\n    else if (typeof __webpack_require__.g !== 'undefined' && ((_a = __webpack_require__.g.perf_hooks) === null || _a === void 0 ? void 0 : _a.performance)) {\n        supported = true;\n        perf = __webpack_require__.g.perf_hooks.performance;\n    }\n    else {\n        supported = false;\n    }\n    return supported;\n}\nfunction now() {\n    return isPerformanceSupported() ? perf.now() : Date.now();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHZ1ZS9kZXZ0b29scy1hcGkvbGliL2VzbS90aW1lLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixxQkFBTSwyQkFBMkIscUJBQU07QUFDM0Q7QUFDQSxlQUFlLHFCQUFNO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AdnVlL2RldnRvb2xzLWFwaS9saWIvZXNtL3RpbWUuanM/YTMzNiJdLCJzb3VyY2VzQ29udGVudCI6WyJsZXQgc3VwcG9ydGVkO1xubGV0IHBlcmY7XG5leHBvcnQgZnVuY3Rpb24gaXNQZXJmb3JtYW5jZVN1cHBvcnRlZCgpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHN1cHBvcnRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBzdXBwb3J0ZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucGVyZm9ybWFuY2UpIHtcbiAgICAgICAgc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgcGVyZiA9IHdpbmRvdy5wZXJmb3JtYW5jZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgKChfYSA9IGdsb2JhbC5wZXJmX2hvb2tzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGVyZm9ybWFuY2UpKSB7XG4gICAgICAgIHN1cHBvcnRlZCA9IHRydWU7XG4gICAgICAgIHBlcmYgPSBnbG9iYWwucGVyZl9ob29rcy5wZXJmb3JtYW5jZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN1cHBvcnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc3VwcG9ydGVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgICByZXR1cm4gaXNQZXJmb3JtYW5jZVN1cHBvcnRlZCgpID8gcGVyZi5ub3coKSA6IERhdGUubm93KCk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@vue/devtools-api/lib/esm/time.js\n");

/***/ }),

/***/ "./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js":
/*!*********************************************************************!*\
  !*** ./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js ***!
  \*********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"EffectScope\": () => (/* binding */ EffectScope),\n/* harmony export */   \"ITERATE_KEY\": () => (/* binding */ ITERATE_KEY),\n/* harmony export */   \"ReactiveEffect\": () => (/* binding */ ReactiveEffect),\n/* harmony export */   \"computed\": () => (/* binding */ computed),\n/* harmony export */   \"customRef\": () => (/* binding */ customRef),\n/* harmony export */   \"deferredComputed\": () => (/* binding */ deferredComputed),\n/* harmony export */   \"effect\": () => (/* binding */ effect),\n/* harmony export */   \"effectScope\": () => (/* binding */ effectScope),\n/* harmony export */   \"enableTracking\": () => (/* binding */ enableTracking),\n/* harmony export */   \"getCurrentScope\": () => (/* binding */ getCurrentScope),\n/* harmony export */   \"isProxy\": () => (/* binding */ isProxy),\n/* harmony export */   \"isReactive\": () => (/* binding */ isReactive),\n/* harmony export */   \"isReadonly\": () => (/* binding */ isReadonly),\n/* harmony export */   \"isRef\": () => (/* binding */ isRef),\n/* harmony export */   \"isShallow\": () => (/* binding */ isShallow),\n/* harmony export */   \"markRaw\": () => (/* binding */ markRaw),\n/* harmony export */   \"onScopeDispose\": () => (/* binding */ onScopeDispose),\n/* harmony export */   \"pauseTracking\": () => (/* binding */ pauseTracking),\n/* harmony export */   \"proxyRefs\": () => (/* binding */ proxyRefs),\n/* harmony export */   \"reactive\": () => (/* binding */ reactive),\n/* harmony export */   \"readonly\": () => (/* binding */ readonly),\n/* harmony export */   \"ref\": () => (/* binding */ ref),\n/* harmony export */   \"resetTracking\": () => (/* binding */ resetTracking),\n/* harmony export */   \"shallowReactive\": () => (/* binding */ shallowReactive),\n/* harmony export */   \"shallowReadonly\": () => (/* binding */ shallowReadonly),\n/* harmony export */   \"shallowRef\": () => (/* binding */ shallowRef),\n/* harmony export */   \"stop\": () => (/* binding */ stop),\n/* harmony export */   \"toRaw\": () => (/* binding */ toRaw),\n/* harmony export */   \"toRef\": () => (/* binding */ toRef),\n/* harmony export */   \"toRefs\": () => (/* binding */ toRefs),\n/* harmony export */   \"track\": () => (/* binding */ track),\n/* harmony export */   \"trigger\": () => (/* binding */ trigger),\n/* harmony export */   \"triggerRef\": () => (/* binding */ triggerRef),\n/* harmony export */   \"unref\": () => (/* binding */ unref)\n/* harmony export */ });\n/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/shared */ \"./node_modules/@vue/shared/dist/shared.esm-bundler.js\");\n\n\nfunction warn(msg, ...args) {\n    console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n    constructor(detached = false) {\n        this.detached = detached;\n        /**\n         * @internal\n         */\n        this._active = true;\n        /**\n         * @internal\n         */\n        this.effects = [];\n        /**\n         * @internal\n         */\n        this.cleanups = [];\n        this.parent = activeEffectScope;\n        if (!detached && activeEffectScope) {\n            this.index =\n                (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(this) - 1;\n        }\n    }\n    get active() {\n        return this._active;\n    }\n    run(fn) {\n        if (this._active) {\n            const currentEffectScope = activeEffectScope;\n            try {\n                activeEffectScope = this;\n                return fn();\n            }\n            finally {\n                activeEffectScope = currentEffectScope;\n            }\n        }\n        else if ((true)) {\n            warn(`cannot run an inactive effect scope.`);\n        }\n    }\n    /**\n     * This should only be called on non-detached scopes\n     * @internal\n     */\n    on() {\n        activeEffectScope = this;\n    }\n    /**\n     * This should only be called on non-detached scopes\n     * @internal\n     */\n    off() {\n        activeEffectScope = this.parent;\n    }\n    stop(fromParent) {\n        if (this._active) {\n            let i, l;\n            for (i = 0, l = this.effects.length; i < l; i++) {\n                this.effects[i].stop();\n            }\n            for (i = 0, l = this.cleanups.length; i < l; i++) {\n                this.cleanups[i]();\n            }\n            if (this.scopes) {\n                for (i = 0, l = this.scopes.length; i < l; i++) {\n                    this.scopes[i].stop(true);\n                }\n            }\n            // nested scope, dereference from parent to avoid memory leaks\n            if (!this.detached && this.parent && !fromParent) {\n                // optimized O(1) removal\n                const last = this.parent.scopes.pop();\n                if (last && last !== this) {\n                    this.parent.scopes[this.index] = last;\n                    last.index = this.index;\n                }\n            }\n            this.parent = undefined;\n            this._active = false;\n        }\n    }\n}\nfunction effectScope(detached) {\n    return new EffectScope(detached);\n}\nfunction recordEffectScope(effect, scope = activeEffectScope) {\n    if (scope && scope.active) {\n        scope.effects.push(effect);\n    }\n}\nfunction getCurrentScope() {\n    return activeEffectScope;\n}\nfunction onScopeDispose(fn) {\n    if (activeEffectScope) {\n        activeEffectScope.cleanups.push(fn);\n    }\n    else if ((true)) {\n        warn(`onScopeDispose() is called when there is no active effect scope` +\n            ` to be associated with.`);\n    }\n}\n\nconst createDep = (effects) => {\n    const dep = new Set(effects);\n    dep.w = 0;\n    dep.n = 0;\n    return dep;\n};\nconst wasTracked = (dep) => (dep.w & trackOpBit) > 0;\nconst newTracked = (dep) => (dep.n & trackOpBit) > 0;\nconst initDepMarkers = ({ deps }) => {\n    if (deps.length) {\n        for (let i = 0; i < deps.length; i++) {\n            deps[i].w |= trackOpBit; // set was tracked\n        }\n    }\n};\nconst finalizeDepMarkers = (effect) => {\n    const { deps } = effect;\n    if (deps.length) {\n        let ptr = 0;\n        for (let i = 0; i < deps.length; i++) {\n            const dep = deps[i];\n            if (wasTracked(dep) && !newTracked(dep)) {\n                dep.delete(effect);\n            }\n            else {\n                deps[ptr++] = dep;\n            }\n            // clear bits\n            dep.w &= ~trackOpBit;\n            dep.n &= ~trackOpBit;\n        }\n        deps.length = ptr;\n    }\n};\n\nconst targetMap = new WeakMap();\n// The number of effects currently being tracked recursively.\nlet effectTrackDepth = 0;\nlet trackOpBit = 1;\n/**\n * The bitwise track markers support at most 30 levels of recursion.\n * This value is chosen to enable modern JS engines to use a SMI on all platforms.\n * When recursion depth is greater, fall back to using a full cleanup.\n */\nconst maxMarkerBits = 30;\nlet activeEffect;\nconst ITERATE_KEY = Symbol(( true) ? 'iterate' : 0);\nconst MAP_KEY_ITERATE_KEY = Symbol(( true) ? 'Map key iterate' : 0);\nclass ReactiveEffect {\n    constructor(fn, scheduler = null, scope) {\n        this.fn = fn;\n        this.scheduler = scheduler;\n        this.active = true;\n        this.deps = [];\n        this.parent = undefined;\n        recordEffectScope(this, scope);\n    }\n    run() {\n        if (!this.active) {\n            return this.fn();\n        }\n        let parent = activeEffect;\n        let lastShouldTrack = shouldTrack;\n        while (parent) {\n            if (parent === this) {\n                return;\n            }\n            parent = parent.parent;\n        }\n        try {\n            this.parent = activeEffect;\n            activeEffect = this;\n            shouldTrack = true;\n            trackOpBit = 1 << ++effectTrackDepth;\n            if (effectTrackDepth <= maxMarkerBits) {\n                initDepMarkers(this);\n            }\n            else {\n                cleanupEffect(this);\n            }\n            return this.fn();\n        }\n        finally {\n            if (effectTrackDepth <= maxMarkerBits) {\n                finalizeDepMarkers(this);\n            }\n            trackOpBit = 1 << --effectTrackDepth;\n            activeEffect = this.parent;\n            shouldTrack = lastShouldTrack;\n            this.parent = undefined;\n            if (this.deferStop) {\n                this.stop();\n            }\n        }\n    }\n    stop() {\n        // stopped while running itself - defer the cleanup\n        if (activeEffect === this) {\n            this.deferStop = true;\n        }\n        else if (this.active) {\n            cleanupEffect(this);\n            if (this.onStop) {\n                this.onStop();\n            }\n            this.active = false;\n        }\n    }\n}\nfunction cleanupEffect(effect) {\n    const { deps } = effect;\n    if (deps.length) {\n        for (let i = 0; i < deps.length; i++) {\n            deps[i].delete(effect);\n        }\n        deps.length = 0;\n    }\n}\nfunction effect(fn, options) {\n    if (fn.effect) {\n        fn = fn.effect.fn;\n    }\n    const _effect = new ReactiveEffect(fn);\n    if (options) {\n        (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)(_effect, options);\n        if (options.scope)\n            recordEffectScope(_effect, options.scope);\n    }\n    if (!options || !options.lazy) {\n        _effect.run();\n    }\n    const runner = _effect.run.bind(_effect);\n    runner.effect = _effect;\n    return runner;\n}\nfunction stop(runner) {\n    runner.effect.stop();\n}\nlet shouldTrack = true;\nconst trackStack = [];\nfunction pauseTracking() {\n    trackStack.push(shouldTrack);\n    shouldTrack = false;\n}\nfunction enableTracking() {\n    trackStack.push(shouldTrack);\n    shouldTrack = true;\n}\nfunction resetTracking() {\n    const last = trackStack.pop();\n    shouldTrack = last === undefined ? true : last;\n}\nfunction track(target, type, key) {\n    if (shouldTrack && activeEffect) {\n        let depsMap = targetMap.get(target);\n        if (!depsMap) {\n            targetMap.set(target, (depsMap = new Map()));\n        }\n        let dep = depsMap.get(key);\n        if (!dep) {\n            depsMap.set(key, (dep = createDep()));\n        }\n        const eventInfo = ( true)\n            ? { effect: activeEffect, target, type, key }\n            : 0;\n        trackEffects(dep, eventInfo);\n    }\n}\nfunction trackEffects(dep, debuggerEventExtraInfo) {\n    let shouldTrack = false;\n    if (effectTrackDepth <= maxMarkerBits) {\n        if (!newTracked(dep)) {\n            dep.n |= trackOpBit; // set newly tracked\n            shouldTrack = !wasTracked(dep);\n        }\n    }\n    else {\n        // Full cleanup mode.\n        shouldTrack = !dep.has(activeEffect);\n    }\n    if (shouldTrack) {\n        dep.add(activeEffect);\n        activeEffect.deps.push(dep);\n        if (( true) && activeEffect.onTrack) {\n            activeEffect.onTrack(Object.assign({ effect: activeEffect }, debuggerEventExtraInfo));\n        }\n    }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n    const depsMap = targetMap.get(target);\n    if (!depsMap) {\n        // never been tracked\n        return;\n    }\n    let deps = [];\n    if (type === \"clear\" /* TriggerOpTypes.CLEAR */) {\n        // collection being cleared\n        // trigger all effects for target\n        deps = [...depsMap.values()];\n    }\n    else if (key === 'length' && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target)) {\n        const newLength = Number(newValue);\n        depsMap.forEach((dep, key) => {\n            if (key === 'length' || key >= newLength) {\n                deps.push(dep);\n            }\n        });\n    }\n    else {\n        // schedule runs for SET | ADD | DELETE\n        if (key !== void 0) {\n            deps.push(depsMap.get(key));\n        }\n        // also run for iteration key on ADD | DELETE | Map.SET\n        switch (type) {\n            case \"add\" /* TriggerOpTypes.ADD */:\n                if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target)) {\n                    deps.push(depsMap.get(ITERATE_KEY));\n                    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(target)) {\n                        deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));\n                    }\n                }\n                else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isIntegerKey)(key)) {\n                    // new index added to array -> length changes\n                    deps.push(depsMap.get('length'));\n                }\n                break;\n            case \"delete\" /* TriggerOpTypes.DELETE */:\n                if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target)) {\n                    deps.push(depsMap.get(ITERATE_KEY));\n                    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(target)) {\n                        deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));\n                    }\n                }\n                break;\n            case \"set\" /* TriggerOpTypes.SET */:\n                if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(target)) {\n                    deps.push(depsMap.get(ITERATE_KEY));\n                }\n                break;\n        }\n    }\n    const eventInfo = ( true)\n        ? { target, type, key, newValue, oldValue, oldTarget }\n        : 0;\n    if (deps.length === 1) {\n        if (deps[0]) {\n            if ((true)) {\n                triggerEffects(deps[0], eventInfo);\n            }\n            else {}\n        }\n    }\n    else {\n        const effects = [];\n        for (const dep of deps) {\n            if (dep) {\n                effects.push(...dep);\n            }\n        }\n        if ((true)) {\n            triggerEffects(createDep(effects), eventInfo);\n        }\n        else {}\n    }\n}\nfunction triggerEffects(dep, debuggerEventExtraInfo) {\n    // spread into array for stabilization\n    const effects = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(dep) ? dep : [...dep];\n    for (const effect of effects) {\n        if (effect.computed) {\n            triggerEffect(effect, debuggerEventExtraInfo);\n        }\n    }\n    for (const effect of effects) {\n        if (!effect.computed) {\n            triggerEffect(effect, debuggerEventExtraInfo);\n        }\n    }\n}\nfunction triggerEffect(effect, debuggerEventExtraInfo) {\n    if (effect !== activeEffect || effect.allowRecurse) {\n        if (( true) && effect.onTrigger) {\n            effect.onTrigger((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({ effect }, debuggerEventExtraInfo));\n        }\n        if (effect.scheduler) {\n            effect.scheduler();\n        }\n        else {\n            effect.run();\n        }\n    }\n}\nfunction getDepFromReactive(object, key) {\n    var _a;\n    return (_a = targetMap.get(object)) === null || _a === void 0 ? void 0 : _a.get(key);\n}\n\nconst isNonTrackableKeys = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.makeMap)(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n/*#__PURE__*/\nObject.getOwnPropertyNames(Symbol)\n    // ios10.x Object.getOwnPropertyNames(Symbol) can enumerate 'arguments' and 'caller'\n    // but accessing them on Symbol leads to TypeError because Symbol is a strict mode\n    // function\n    .filter(key => key !== 'arguments' && key !== 'caller')\n    .map(key => Symbol[key])\n    .filter(_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol));\nconst get$1 = /*#__PURE__*/ createGetter();\nconst shallowGet = /*#__PURE__*/ createGetter(false, true);\nconst readonlyGet = /*#__PURE__*/ createGetter(true);\nconst shallowReadonlyGet = /*#__PURE__*/ createGetter(true, true);\nconst arrayInstrumentations = /*#__PURE__*/ createArrayInstrumentations();\nfunction createArrayInstrumentations() {\n    const instrumentations = {};\n    ['includes', 'indexOf', 'lastIndexOf'].forEach(key => {\n        instrumentations[key] = function (...args) {\n            const arr = toRaw(this);\n            for (let i = 0, l = this.length; i < l; i++) {\n                track(arr, \"get\" /* TrackOpTypes.GET */, i + '');\n            }\n            // we run the method using the original args first (which may be reactive)\n            const res = arr[key](...args);\n            if (res === -1 || res === false) {\n                // if that didn't work, run it again using raw values.\n                return arr[key](...args.map(toRaw));\n            }\n            else {\n                return res;\n            }\n        };\n    });\n    ['push', 'pop', 'shift', 'unshift', 'splice'].forEach(key => {\n        instrumentations[key] = function (...args) {\n            pauseTracking();\n            const res = toRaw(this)[key].apply(this, args);\n            resetTracking();\n            return res;\n        };\n    });\n    return instrumentations;\n}\nfunction hasOwnProperty(key) {\n    const obj = toRaw(this);\n    track(obj, \"has\" /* TrackOpTypes.HAS */, key);\n    return obj.hasOwnProperty(key);\n}\nfunction createGetter(isReadonly = false, shallow = false) {\n    return function get(target, key, receiver) {\n        if (key === \"__v_isReactive\" /* ReactiveFlags.IS_REACTIVE */) {\n            return !isReadonly;\n        }\n        else if (key === \"__v_isReadonly\" /* ReactiveFlags.IS_READONLY */) {\n            return isReadonly;\n        }\n        else if (key === \"__v_isShallow\" /* ReactiveFlags.IS_SHALLOW */) {\n            return shallow;\n        }\n        else if (key === \"__v_raw\" /* ReactiveFlags.RAW */ &&\n            receiver ===\n                (isReadonly\n                    ? shallow\n                        ? shallowReadonlyMap\n                        : readonlyMap\n                    : shallow\n                        ? shallowReactiveMap\n                        : reactiveMap).get(target)) {\n            return target;\n        }\n        const targetIsArray = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target);\n        if (!isReadonly) {\n            if (targetIsArray && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasOwn)(arrayInstrumentations, key)) {\n                return Reflect.get(arrayInstrumentations, key, receiver);\n            }\n            if (key === 'hasOwnProperty') {\n                return hasOwnProperty;\n            }\n        }\n        const res = Reflect.get(target, key, receiver);\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n            return res;\n        }\n        if (!isReadonly) {\n            track(target, \"get\" /* TrackOpTypes.GET */, key);\n        }\n        if (shallow) {\n            return res;\n        }\n        if (isRef(res)) {\n            // ref unwrapping - skip unwrap for Array + integer key.\n            return targetIsArray && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isIntegerKey)(key) ? res : res.value;\n        }\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(res)) {\n            // Convert returned value into a proxy as well. we do the isObject check\n            // here to avoid invalid value warning. Also need to lazy access readonly\n            // and reactive here to avoid circular dependency.\n            return isReadonly ? readonly(res) : reactive(res);\n        }\n        return res;\n    };\n}\nconst set$1 = /*#__PURE__*/ createSetter();\nconst shallowSet = /*#__PURE__*/ createSetter(true);\nfunction createSetter(shallow = false) {\n    return function set(target, key, value, receiver) {\n        let oldValue = target[key];\n        if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) {\n            return false;\n        }\n        if (!shallow) {\n            if (!isShallow(value) && !isReadonly(value)) {\n                oldValue = toRaw(oldValue);\n                value = toRaw(value);\n            }\n            if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target) && isRef(oldValue) && !isRef(value)) {\n                oldValue.value = value;\n                return true;\n            }\n        }\n        const hadKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isIntegerKey)(key)\n            ? Number(key) < target.length\n            : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasOwn)(target, key);\n        const result = Reflect.set(target, key, value, receiver);\n        // don't trigger if target is something up in the prototype chain of original\n        if (target === toRaw(receiver)) {\n            if (!hadKey) {\n                trigger(target, \"add\" /* TriggerOpTypes.ADD */, key, value);\n            }\n            else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(value, oldValue)) {\n                trigger(target, \"set\" /* TriggerOpTypes.SET */, key, value, oldValue);\n            }\n        }\n        return result;\n    };\n}\nfunction deleteProperty(target, key) {\n    const hadKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasOwn)(target, key);\n    const oldValue = target[key];\n    const result = Reflect.deleteProperty(target, key);\n    if (result && hadKey) {\n        trigger(target, \"delete\" /* TriggerOpTypes.DELETE */, key, undefined, oldValue);\n    }\n    return result;\n}\nfunction has$1(target, key) {\n    const result = Reflect.has(target, key);\n    if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(key) || !builtInSymbols.has(key)) {\n        track(target, \"has\" /* TrackOpTypes.HAS */, key);\n    }\n    return result;\n}\nfunction ownKeys(target) {\n    track(target, \"iterate\" /* TrackOpTypes.ITERATE */, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target) ? 'length' : ITERATE_KEY);\n    return Reflect.ownKeys(target);\n}\nconst mutableHandlers = {\n    get: get$1,\n    set: set$1,\n    deleteProperty,\n    has: has$1,\n    ownKeys\n};\nconst readonlyHandlers = {\n    get: readonlyGet,\n    set(target, key) {\n        if ((true)) {\n            warn(`Set operation on key \"${String(key)}\" failed: target is readonly.`, target);\n        }\n        return true;\n    },\n    deleteProperty(target, key) {\n        if ((true)) {\n            warn(`Delete operation on key \"${String(key)}\" failed: target is readonly.`, target);\n        }\n        return true;\n    }\n};\nconst shallowReactiveHandlers = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, mutableHandlers, {\n    get: shallowGet,\n    set: shallowSet\n});\n// Props handlers are special in the sense that it should not unwrap top-level\n// refs (in order to allow refs to be explicitly passed down), but should\n// retain the reactivity of the normal readonly object.\nconst shallowReadonlyHandlers = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, readonlyHandlers, {\n    get: shallowReadonlyGet\n});\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction get(target, key, isReadonly = false, isShallow = false) {\n    // #1772: readonly(reactive(Map)) should return readonly + reactive version\n    // of the value\n    target = target[\"__v_raw\" /* ReactiveFlags.RAW */];\n    const rawTarget = toRaw(target);\n    const rawKey = toRaw(key);\n    if (!isReadonly) {\n        if (key !== rawKey) {\n            track(rawTarget, \"get\" /* TrackOpTypes.GET */, key);\n        }\n        track(rawTarget, \"get\" /* TrackOpTypes.GET */, rawKey);\n    }\n    const { has } = getProto(rawTarget);\n    const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n    if (has.call(rawTarget, key)) {\n        return wrap(target.get(key));\n    }\n    else if (has.call(rawTarget, rawKey)) {\n        return wrap(target.get(rawKey));\n    }\n    else if (target !== rawTarget) {\n        // #3602 readonly(reactive(Map))\n        // ensure that the nested reactive `Map` can do tracking for itself\n        target.get(key);\n    }\n}\nfunction has(key, isReadonly = false) {\n    const target = this[\"__v_raw\" /* ReactiveFlags.RAW */];\n    const rawTarget = toRaw(target);\n    const rawKey = toRaw(key);\n    if (!isReadonly) {\n        if (key !== rawKey) {\n            track(rawTarget, \"has\" /* TrackOpTypes.HAS */, key);\n        }\n        track(rawTarget, \"has\" /* TrackOpTypes.HAS */, rawKey);\n    }\n    return key === rawKey\n        ? target.has(key)\n        : target.has(key) || target.has(rawKey);\n}\nfunction size(target, isReadonly = false) {\n    target = target[\"__v_raw\" /* ReactiveFlags.RAW */];\n    !isReadonly && track(toRaw(target), \"iterate\" /* TrackOpTypes.ITERATE */, ITERATE_KEY);\n    return Reflect.get(target, 'size', target);\n}\nfunction add(value) {\n    value = toRaw(value);\n    const target = toRaw(this);\n    const proto = getProto(target);\n    const hadKey = proto.has.call(target, value);\n    if (!hadKey) {\n        target.add(value);\n        trigger(target, \"add\" /* TriggerOpTypes.ADD */, value, value);\n    }\n    return this;\n}\nfunction set(key, value) {\n    value = toRaw(value);\n    const target = toRaw(this);\n    const { has, get } = getProto(target);\n    let hadKey = has.call(target, key);\n    if (!hadKey) {\n        key = toRaw(key);\n        hadKey = has.call(target, key);\n    }\n    else if ((true)) {\n        checkIdentityKeys(target, has, key);\n    }\n    const oldValue = get.call(target, key);\n    target.set(key, value);\n    if (!hadKey) {\n        trigger(target, \"add\" /* TriggerOpTypes.ADD */, key, value);\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(value, oldValue)) {\n        trigger(target, \"set\" /* TriggerOpTypes.SET */, key, value, oldValue);\n    }\n    return this;\n}\nfunction deleteEntry(key) {\n    const target = toRaw(this);\n    const { has, get } = getProto(target);\n    let hadKey = has.call(target, key);\n    if (!hadKey) {\n        key = toRaw(key);\n        hadKey = has.call(target, key);\n    }\n    else if ((true)) {\n        checkIdentityKeys(target, has, key);\n    }\n    const oldValue = get ? get.call(target, key) : undefined;\n    // forward the operation before queueing reactions\n    const result = target.delete(key);\n    if (hadKey) {\n        trigger(target, \"delete\" /* TriggerOpTypes.DELETE */, key, undefined, oldValue);\n    }\n    return result;\n}\nfunction clear() {\n    const target = toRaw(this);\n    const hadItems = target.size !== 0;\n    const oldTarget = ( true)\n        ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(target)\n            ? new Map(target)\n            : new Set(target)\n        : 0;\n    // forward the operation before queueing reactions\n    const result = target.clear();\n    if (hadItems) {\n        trigger(target, \"clear\" /* TriggerOpTypes.CLEAR */, undefined, undefined, oldTarget);\n    }\n    return result;\n}\nfunction createForEach(isReadonly, isShallow) {\n    return function forEach(callback, thisArg) {\n        const observed = this;\n        const target = observed[\"__v_raw\" /* ReactiveFlags.RAW */];\n        const rawTarget = toRaw(target);\n        const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n        !isReadonly && track(rawTarget, \"iterate\" /* TrackOpTypes.ITERATE */, ITERATE_KEY);\n        return target.forEach((value, key) => {\n            // important: make sure the callback is\n            // 1. invoked with the reactive map as `this` and 3rd arg\n            // 2. the value received should be a corresponding reactive/readonly.\n            return callback.call(thisArg, wrap(value), wrap(key), observed);\n        });\n    };\n}\nfunction createIterableMethod(method, isReadonly, isShallow) {\n    return function (...args) {\n        const target = this[\"__v_raw\" /* ReactiveFlags.RAW */];\n        const rawTarget = toRaw(target);\n        const targetIsMap = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(rawTarget);\n        const isPair = method === 'entries' || (method === Symbol.iterator && targetIsMap);\n        const isKeyOnly = method === 'keys' && targetIsMap;\n        const innerIterator = target[method](...args);\n        const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n        !isReadonly &&\n            track(rawTarget, \"iterate\" /* TrackOpTypes.ITERATE */, isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY);\n        // return a wrapped iterator which returns observed versions of the\n        // values emitted from the real iterator\n        return {\n            // iterator protocol\n            next() {\n                const { value, done } = innerIterator.next();\n                return done\n                    ? { value, done }\n                    : {\n                        value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n                        done\n                    };\n            },\n            // iterable protocol\n            [Symbol.iterator]() {\n                return this;\n            }\n        };\n    };\n}\nfunction createReadonlyMethod(type) {\n    return function (...args) {\n        if ((true)) {\n            const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n            console.warn(`${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.capitalize)(type)} operation ${key}failed: target is readonly.`, toRaw(this));\n        }\n        return type === \"delete\" /* TriggerOpTypes.DELETE */ ? false : this;\n    };\n}\nfunction createInstrumentations() {\n    const mutableInstrumentations = {\n        get(key) {\n            return get(this, key);\n        },\n        get size() {\n            return size(this);\n        },\n        has,\n        add,\n        set,\n        delete: deleteEntry,\n        clear,\n        forEach: createForEach(false, false)\n    };\n    const shallowInstrumentations = {\n        get(key) {\n            return get(this, key, false, true);\n        },\n        get size() {\n            return size(this);\n        },\n        has,\n        add,\n        set,\n        delete: deleteEntry,\n        clear,\n        forEach: createForEach(false, true)\n    };\n    const readonlyInstrumentations = {\n        get(key) {\n            return get(this, key, true);\n        },\n        get size() {\n            return size(this, true);\n        },\n        has(key) {\n            return has.call(this, key, true);\n        },\n        add: createReadonlyMethod(\"add\" /* TriggerOpTypes.ADD */),\n        set: createReadonlyMethod(\"set\" /* TriggerOpTypes.SET */),\n        delete: createReadonlyMethod(\"delete\" /* TriggerOpTypes.DELETE */),\n        clear: createReadonlyMethod(\"clear\" /* TriggerOpTypes.CLEAR */),\n        forEach: createForEach(true, false)\n    };\n    const shallowReadonlyInstrumentations = {\n        get(key) {\n            return get(this, key, true, true);\n        },\n        get size() {\n            return size(this, true);\n        },\n        has(key) {\n            return has.call(this, key, true);\n        },\n        add: createReadonlyMethod(\"add\" /* TriggerOpTypes.ADD */),\n        set: createReadonlyMethod(\"set\" /* TriggerOpTypes.SET */),\n        delete: createReadonlyMethod(\"delete\" /* TriggerOpTypes.DELETE */),\n        clear: createReadonlyMethod(\"clear\" /* TriggerOpTypes.CLEAR */),\n        forEach: createForEach(true, true)\n    };\n    const iteratorMethods = ['keys', 'values', 'entries', Symbol.iterator];\n    iteratorMethods.forEach(method => {\n        mutableInstrumentations[method] = createIterableMethod(method, false, false);\n        readonlyInstrumentations[method] = createIterableMethod(method, true, false);\n        shallowInstrumentations[method] = createIterableMethod(method, false, true);\n        shallowReadonlyInstrumentations[method] = createIterableMethod(method, true, true);\n    });\n    return [\n        mutableInstrumentations,\n        readonlyInstrumentations,\n        shallowInstrumentations,\n        shallowReadonlyInstrumentations\n    ];\n}\nconst [mutableInstrumentations, readonlyInstrumentations, shallowInstrumentations, shallowReadonlyInstrumentations] = /* #__PURE__*/ createInstrumentations();\nfunction createInstrumentationGetter(isReadonly, shallow) {\n    const instrumentations = shallow\n        ? isReadonly\n            ? shallowReadonlyInstrumentations\n            : shallowInstrumentations\n        : isReadonly\n            ? readonlyInstrumentations\n            : mutableInstrumentations;\n    return (target, key, receiver) => {\n        if (key === \"__v_isReactive\" /* ReactiveFlags.IS_REACTIVE */) {\n            return !isReadonly;\n        }\n        else if (key === \"__v_isReadonly\" /* ReactiveFlags.IS_READONLY */) {\n            return isReadonly;\n        }\n        else if (key === \"__v_raw\" /* ReactiveFlags.RAW */) {\n            return target;\n        }\n        return Reflect.get((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasOwn)(instrumentations, key) && key in target\n            ? instrumentations\n            : target, key, receiver);\n    };\n}\nconst mutableCollectionHandlers = {\n    get: /*#__PURE__*/ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n    get: /*#__PURE__*/ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n    get: /*#__PURE__*/ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n    get: /*#__PURE__*/ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has, key) {\n    const rawKey = toRaw(key);\n    if (rawKey !== key && has.call(target, rawKey)) {\n        const type = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.toRawType)(target);\n        console.warn(`Reactive ${type} contains both the raw and reactive ` +\n            `versions of the same object${type === `Map` ? ` as keys` : ``}, ` +\n            `which can lead to inconsistencies. ` +\n            `Avoid differentiating between the raw and reactive versions ` +\n            `of an object and only use the reactive version if possible.`);\n    }\n}\n\nconst reactiveMap = new WeakMap();\nconst shallowReactiveMap = new WeakMap();\nconst readonlyMap = new WeakMap();\nconst shallowReadonlyMap = new WeakMap();\nfunction targetTypeMap(rawType) {\n    switch (rawType) {\n        case 'Object':\n        case 'Array':\n            return 1 /* TargetType.COMMON */;\n        case 'Map':\n        case 'Set':\n        case 'WeakMap':\n        case 'WeakSet':\n            return 2 /* TargetType.COLLECTION */;\n        default:\n            return 0 /* TargetType.INVALID */;\n    }\n}\nfunction getTargetType(value) {\n    return value[\"__v_skip\" /* ReactiveFlags.SKIP */] || !Object.isExtensible(value)\n        ? 0 /* TargetType.INVALID */\n        : targetTypeMap((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.toRawType)(value));\n}\nfunction reactive(target) {\n    // if trying to observe a readonly proxy, return the readonly version.\n    if (isReadonly(target)) {\n        return target;\n    }\n    return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap);\n}\n/**\n * Return a shallowly-reactive copy of the original object, where only the root\n * level properties are reactive. It also does not auto-unwrap refs (even at the\n * root level).\n */\nfunction shallowReactive(target) {\n    return createReactiveObject(target, false, shallowReactiveHandlers, shallowCollectionHandlers, shallowReactiveMap);\n}\n/**\n * Creates a readonly copy of the original object. Note the returned copy is not\n * made reactive, but `readonly` can be called on an already reactive object.\n */\nfunction readonly(target) {\n    return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap);\n}\n/**\n * Returns a reactive-copy of the original object, where only the root level\n * properties are readonly, and does NOT unwrap refs nor recursively convert\n * returned properties.\n * This is used for creating the props proxy object for stateful components.\n */\nfunction shallowReadonly(target) {\n    return createReactiveObject(target, true, shallowReadonlyHandlers, shallowReadonlyCollectionHandlers, shallowReadonlyMap);\n}\nfunction createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers, proxyMap) {\n    if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(target)) {\n        if ((true)) {\n            console.warn(`value cannot be made reactive: ${String(target)}`);\n        }\n        return target;\n    }\n    // target is already a Proxy, return it.\n    // exception: calling readonly() on a reactive object\n    if (target[\"__v_raw\" /* ReactiveFlags.RAW */] &&\n        !(isReadonly && target[\"__v_isReactive\" /* ReactiveFlags.IS_REACTIVE */])) {\n        return target;\n    }\n    // target already has corresponding Proxy\n    const existingProxy = proxyMap.get(target);\n    if (existingProxy) {\n        return existingProxy;\n    }\n    // only specific value types can be observed.\n    const targetType = getTargetType(target);\n    if (targetType === 0 /* TargetType.INVALID */) {\n        return target;\n    }\n    const proxy = new Proxy(target, targetType === 2 /* TargetType.COLLECTION */ ? collectionHandlers : baseHandlers);\n    proxyMap.set(target, proxy);\n    return proxy;\n}\nfunction isReactive(value) {\n    if (isReadonly(value)) {\n        return isReactive(value[\"__v_raw\" /* ReactiveFlags.RAW */]);\n    }\n    return !!(value && value[\"__v_isReactive\" /* ReactiveFlags.IS_REACTIVE */]);\n}\nfunction isReadonly(value) {\n    return !!(value && value[\"__v_isReadonly\" /* ReactiveFlags.IS_READONLY */]);\n}\nfunction isShallow(value) {\n    return !!(value && value[\"__v_isShallow\" /* ReactiveFlags.IS_SHALLOW */]);\n}\nfunction isProxy(value) {\n    return isReactive(value) || isReadonly(value);\n}\nfunction toRaw(observed) {\n    const raw = observed && observed[\"__v_raw\" /* ReactiveFlags.RAW */];\n    return raw ? toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.def)(value, \"__v_skip\" /* ReactiveFlags.SKIP */, true);\n    return value;\n}\nconst toReactive = (value) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(value) ? reactive(value) : value;\nconst toReadonly = (value) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(value) ? readonly(value) : value;\n\nfunction trackRefValue(ref) {\n    if (shouldTrack && activeEffect) {\n        ref = toRaw(ref);\n        if ((true)) {\n            trackEffects(ref.dep || (ref.dep = createDep()), {\n                target: ref,\n                type: \"get\" /* TrackOpTypes.GET */,\n                key: 'value'\n            });\n        }\n        else {}\n    }\n}\nfunction triggerRefValue(ref, newVal) {\n    ref = toRaw(ref);\n    const dep = ref.dep;\n    if (dep) {\n        if ((true)) {\n            triggerEffects(dep, {\n                target: ref,\n                type: \"set\" /* TriggerOpTypes.SET */,\n                key: 'value',\n                newValue: newVal\n            });\n        }\n        else {}\n    }\n}\nfunction isRef(r) {\n    return !!(r && r.__v_isRef === true);\n}\nfunction ref(value) {\n    return createRef(value, false);\n}\nfunction shallowRef(value) {\n    return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n    if (isRef(rawValue)) {\n        return rawValue;\n    }\n    return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n    constructor(value, __v_isShallow) {\n        this.__v_isShallow = __v_isShallow;\n        this.dep = undefined;\n        this.__v_isRef = true;\n        this._rawValue = __v_isShallow ? value : toRaw(value);\n        this._value = __v_isShallow ? value : toReactive(value);\n    }\n    get value() {\n        trackRefValue(this);\n        return this._value;\n    }\n    set value(newVal) {\n        const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);\n        newVal = useDirectValue ? newVal : toRaw(newVal);\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(newVal, this._rawValue)) {\n            this._rawValue = newVal;\n            this._value = useDirectValue ? newVal : toReactive(newVal);\n            triggerRefValue(this, newVal);\n        }\n    }\n}\nfunction triggerRef(ref) {\n    triggerRefValue(ref, ( true) ? ref.value : 0);\n}\nfunction unref(ref) {\n    return isRef(ref) ? ref.value : ref;\n}\nconst shallowUnwrapHandlers = {\n    get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),\n    set: (target, key, value, receiver) => {\n        const oldValue = target[key];\n        if (isRef(oldValue) && !isRef(value)) {\n            oldValue.value = value;\n            return true;\n        }\n        else {\n            return Reflect.set(target, key, value, receiver);\n        }\n    }\n};\nfunction proxyRefs(objectWithRefs) {\n    return isReactive(objectWithRefs)\n        ? objectWithRefs\n        : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n    constructor(factory) {\n        this.dep = undefined;\n        this.__v_isRef = true;\n        const { get, set } = factory(() => trackRefValue(this), () => triggerRefValue(this));\n        this._get = get;\n        this._set = set;\n    }\n    get value() {\n        return this._get();\n    }\n    set value(newVal) {\n        this._set(newVal);\n    }\n}\nfunction customRef(factory) {\n    return new CustomRefImpl(factory);\n}\nfunction toRefs(object) {\n    if (( true) && !isProxy(object)) {\n        console.warn(`toRefs() expects a reactive object but received a plain one.`);\n    }\n    const ret = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(object) ? new Array(object.length) : {};\n    for (const key in object) {\n        ret[key] = toRef(object, key);\n    }\n    return ret;\n}\nclass ObjectRefImpl {\n    constructor(_object, _key, _defaultValue) {\n        this._object = _object;\n        this._key = _key;\n        this._defaultValue = _defaultValue;\n        this.__v_isRef = true;\n    }\n    get value() {\n        const val = this._object[this._key];\n        return val === undefined ? this._defaultValue : val;\n    }\n    set value(newVal) {\n        this._object[this._key] = newVal;\n    }\n    get dep() {\n        return getDepFromReactive(toRaw(this._object), this._key);\n    }\n}\nfunction toRef(object, key, defaultValue) {\n    const val = object[key];\n    return isRef(val)\n        ? val\n        : new ObjectRefImpl(object, key, defaultValue);\n}\n\nvar _a$1;\nclass ComputedRefImpl {\n    constructor(getter, _setter, isReadonly, isSSR) {\n        this._setter = _setter;\n        this.dep = undefined;\n        this.__v_isRef = true;\n        this[_a$1] = false;\n        this._dirty = true;\n        this.effect = new ReactiveEffect(getter, () => {\n            if (!this._dirty) {\n                this._dirty = true;\n                triggerRefValue(this);\n            }\n        });\n        this.effect.computed = this;\n        this.effect.active = this._cacheable = !isSSR;\n        this[\"__v_isReadonly\" /* ReactiveFlags.IS_READONLY */] = isReadonly;\n    }\n    get value() {\n        // the computed ref may get wrapped by other proxies e.g. readonly() #3376\n        const self = toRaw(this);\n        trackRefValue(self);\n        if (self._dirty || !self._cacheable) {\n            self._dirty = false;\n            self._value = self.effect.run();\n        }\n        return self._value;\n    }\n    set value(newValue) {\n        this._setter(newValue);\n    }\n}\n_a$1 = \"__v_isReadonly\" /* ReactiveFlags.IS_READONLY */;\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n    let getter;\n    let setter;\n    const onlyGetter = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isFunction)(getterOrOptions);\n    if (onlyGetter) {\n        getter = getterOrOptions;\n        setter = ( true)\n            ? () => {\n                console.warn('Write operation failed: computed value is readonly');\n            }\n            : 0;\n    }\n    else {\n        getter = getterOrOptions.get;\n        setter = getterOrOptions.set;\n    }\n    const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);\n    if (( true) && debugOptions && !isSSR) {\n        cRef.effect.onTrack = debugOptions.onTrack;\n        cRef.effect.onTrigger = debugOptions.onTrigger;\n    }\n    return cRef;\n}\n\nvar _a;\nconst tick = /*#__PURE__*/ Promise.resolve();\nconst queue = [];\nlet queued = false;\nconst scheduler = (fn) => {\n    queue.push(fn);\n    if (!queued) {\n        queued = true;\n        tick.then(flush);\n    }\n};\nconst flush = () => {\n    for (let i = 0; i < queue.length; i++) {\n        queue[i]();\n    }\n    queue.length = 0;\n    queued = false;\n};\nclass DeferredComputedRefImpl {\n    constructor(getter) {\n        this.dep = undefined;\n        this._dirty = true;\n        this.__v_isRef = true;\n        this[_a] = true;\n        let compareTarget;\n        let hasCompareTarget = false;\n        let scheduled = false;\n        this.effect = new ReactiveEffect(getter, (computedTrigger) => {\n            if (this.dep) {\n                if (computedTrigger) {\n                    compareTarget = this._value;\n                    hasCompareTarget = true;\n                }\n                else if (!scheduled) {\n                    const valueToCompare = hasCompareTarget ? compareTarget : this._value;\n                    scheduled = true;\n                    hasCompareTarget = false;\n                    scheduler(() => {\n                        if (this.effect.active && this._get() !== valueToCompare) {\n                            triggerRefValue(this);\n                        }\n                        scheduled = false;\n                    });\n                }\n                // chained upstream computeds are notified synchronously to ensure\n                // value invalidation in case of sync access; normal effects are\n                // deferred to be triggered in scheduler.\n                for (const e of this.dep) {\n                    if (e.computed instanceof DeferredComputedRefImpl) {\n                        e.scheduler(true /* computedTrigger */);\n                    }\n                }\n            }\n            this._dirty = true;\n        });\n        this.effect.computed = this;\n    }\n    _get() {\n        if (this._dirty) {\n            this._dirty = false;\n            return (this._value = this.effect.run());\n        }\n        return this._value;\n    }\n    get value() {\n        trackRefValue(this);\n        // the computed ref may get wrapped by other proxies e.g. readonly() #3376\n        return toRaw(this)._get();\n    }\n}\n_a = \"__v_isReadonly\" /* ReactiveFlags.IS_READONLY */;\nfunction deferredComputed(getter) {\n    return new DeferredComputedRefImpl(getter);\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHZ1ZS9yZWFjdGl2aXR5L2Rpc3QvcmVhY3Rpdml0eS5lc20tYnVuZGxlci5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFrSzs7QUFFbEs7QUFDQSwrQkFBK0IsSUFBSTtBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsSUFBcUM7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxPQUFPO0FBQ3hEO0FBQ0E7QUFDQSxrREFBa0QsT0FBTztBQUN6RDtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsT0FBTztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxJQUFxQztBQUNuRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLE1BQU07QUFDaEM7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0Esd0JB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsdURBQVU7QUFDakM7QUFDQTtBQUNBLGtCQUFrQixLQUFxQztBQUN2RDtBQUNBO0FBQ0E7QUFDQSxjQUFjLENBQUk7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxLQUFxQztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrQkFBa0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsOERBQThEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTRZIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B2dWUvcmVhY3Rpdml0eS9kaXN0L3JlYWN0aXZpdHkuZXNtLWJ1bmRsZXIuanM/ODlkYyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHRlbmQsIGlzQXJyYXksIGlzTWFwLCBpc0ludGVnZXJLZXksIGhhc093biwgaXNTeW1ib2wsIGlzT2JqZWN0LCBoYXNDaGFuZ2VkLCBtYWtlTWFwLCBjYXBpdGFsaXplLCB0b1Jhd1R5cGUsIGRlZiwgaXNGdW5jdGlvbiwgTk9PUCB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuZnVuY3Rpb24gd2Fybihtc2csIC4uLmFyZ3MpIHtcbiAgICBjb25zb2xlLndhcm4oYFtWdWUgd2Fybl0gJHttc2d9YCwgLi4uYXJncyk7XG59XG5cbmxldCBhY3RpdmVFZmZlY3RTY29wZTtcbmNsYXNzIEVmZmVjdFNjb3BlIHtcbiAgICBjb25zdHJ1Y3RvcihkZXRhY2hlZCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuZGV0YWNoZWQgPSBkZXRhY2hlZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lZmZlY3RzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2xlYW51cHMgPSBbXTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBhY3RpdmVFZmZlY3RTY29wZTtcbiAgICAgICAgaWYgKCFkZXRhY2hlZCAmJiBhY3RpdmVFZmZlY3RTY29wZSkge1xuICAgICAgICAgICAgdGhpcy5pbmRleCA9XG4gICAgICAgICAgICAgICAgKGFjdGl2ZUVmZmVjdFNjb3BlLnNjb3BlcyB8fCAoYWN0aXZlRWZmZWN0U2NvcGUuc2NvcGVzID0gW10pKS5wdXNoKHRoaXMpIC0gMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgYWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH1cbiAgICBydW4oZm4pIHtcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEVmZmVjdFNjb3BlID0gYWN0aXZlRWZmZWN0U2NvcGU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gdGhpcztcbiAgICAgICAgICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gY3VycmVudEVmZmVjdFNjb3BlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgd2FybihgY2Fubm90IHJ1biBhbiBpbmFjdGl2ZSBlZmZlY3Qgc2NvcGUuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gbm9uLWRldGFjaGVkIHNjb3Blc1xuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIG9uKCkge1xuICAgICAgICBhY3RpdmVFZmZlY3RTY29wZSA9IHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIG5vbi1kZXRhY2hlZCBzY29wZXNcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBvZmYoKSB7XG4gICAgICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gdGhpcy5wYXJlbnQ7XG4gICAgfVxuICAgIHN0b3AoZnJvbVBhcmVudCkge1xuICAgICAgICBpZiAodGhpcy5fYWN0aXZlKSB7XG4gICAgICAgICAgICBsZXQgaSwgbDtcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSB0aGlzLmVmZmVjdHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZmZlY3RzW2ldLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSB0aGlzLmNsZWFudXBzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYW51cHNbaV0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNjb3Blcykge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSB0aGlzLnNjb3Blcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY29wZXNbaV0uc3RvcCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBuZXN0ZWQgc2NvcGUsIGRlcmVmZXJlbmNlIGZyb20gcGFyZW50IHRvIGF2b2lkIG1lbW9yeSBsZWFrc1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRldGFjaGVkICYmIHRoaXMucGFyZW50ICYmICFmcm9tUGFyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW1pemVkIE8oMSkgcmVtb3ZhbFxuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLnBhcmVudC5zY29wZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3QgJiYgbGFzdCAhPT0gdGhpcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5zY29wZXNbdGhpcy5pbmRleF0gPSBsYXN0O1xuICAgICAgICAgICAgICAgICAgICBsYXN0LmluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZWZmZWN0U2NvcGUoZGV0YWNoZWQpIHtcbiAgICByZXR1cm4gbmV3IEVmZmVjdFNjb3BlKGRldGFjaGVkKTtcbn1cbmZ1bmN0aW9uIHJlY29yZEVmZmVjdFNjb3BlKGVmZmVjdCwgc2NvcGUgPSBhY3RpdmVFZmZlY3RTY29wZSkge1xuICAgIGlmIChzY29wZSAmJiBzY29wZS5hY3RpdmUpIHtcbiAgICAgICAgc2NvcGUuZWZmZWN0cy5wdXNoKGVmZmVjdCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0Q3VycmVudFNjb3BlKCkge1xuICAgIHJldHVybiBhY3RpdmVFZmZlY3RTY29wZTtcbn1cbmZ1bmN0aW9uIG9uU2NvcGVEaXNwb3NlKGZuKSB7XG4gICAgaWYgKGFjdGl2ZUVmZmVjdFNjb3BlKSB7XG4gICAgICAgIGFjdGl2ZUVmZmVjdFNjb3BlLmNsZWFudXBzLnB1c2goZm4pO1xuICAgIH1cbiAgICBlbHNlIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgd2Fybihgb25TY29wZURpc3Bvc2UoKSBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBhY3RpdmUgZWZmZWN0IHNjb3BlYCArXG4gICAgICAgICAgICBgIHRvIGJlIGFzc29jaWF0ZWQgd2l0aC5gKTtcbiAgICB9XG59XG5cbmNvbnN0IGNyZWF0ZURlcCA9IChlZmZlY3RzKSA9PiB7XG4gICAgY29uc3QgZGVwID0gbmV3IFNldChlZmZlY3RzKTtcbiAgICBkZXAudyA9IDA7XG4gICAgZGVwLm4gPSAwO1xuICAgIHJldHVybiBkZXA7XG59O1xuY29uc3Qgd2FzVHJhY2tlZCA9IChkZXApID0+IChkZXAudyAmIHRyYWNrT3BCaXQpID4gMDtcbmNvbnN0IG5ld1RyYWNrZWQgPSAoZGVwKSA9PiAoZGVwLm4gJiB0cmFja09wQml0KSA+IDA7XG5jb25zdCBpbml0RGVwTWFya2VycyA9ICh7IGRlcHMgfSkgPT4ge1xuICAgIGlmIChkZXBzLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRlcHNbaV0udyB8PSB0cmFja09wQml0OyAvLyBzZXQgd2FzIHRyYWNrZWRcbiAgICAgICAgfVxuICAgIH1cbn07XG5jb25zdCBmaW5hbGl6ZURlcE1hcmtlcnMgPSAoZWZmZWN0KSA9PiB7XG4gICAgY29uc3QgeyBkZXBzIH0gPSBlZmZlY3Q7XG4gICAgaWYgKGRlcHMubGVuZ3RoKSB7XG4gICAgICAgIGxldCBwdHIgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRlcCA9IGRlcHNbaV07XG4gICAgICAgICAgICBpZiAod2FzVHJhY2tlZChkZXApICYmICFuZXdUcmFja2VkKGRlcCkpIHtcbiAgICAgICAgICAgICAgICBkZXAuZGVsZXRlKGVmZmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZXBzW3B0cisrXSA9IGRlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNsZWFyIGJpdHNcbiAgICAgICAgICAgIGRlcC53ICY9IH50cmFja09wQml0O1xuICAgICAgICAgICAgZGVwLm4gJj0gfnRyYWNrT3BCaXQ7XG4gICAgICAgIH1cbiAgICAgICAgZGVwcy5sZW5ndGggPSBwdHI7XG4gICAgfVxufTtcblxuY29uc3QgdGFyZ2V0TWFwID0gbmV3IFdlYWtNYXAoKTtcbi8vIFRoZSBudW1iZXIgb2YgZWZmZWN0cyBjdXJyZW50bHkgYmVpbmcgdHJhY2tlZCByZWN1cnNpdmVseS5cbmxldCBlZmZlY3RUcmFja0RlcHRoID0gMDtcbmxldCB0cmFja09wQml0ID0gMTtcbi8qKlxuICogVGhlIGJpdHdpc2UgdHJhY2sgbWFya2VycyBzdXBwb3J0IGF0IG1vc3QgMzAgbGV2ZWxzIG9mIHJlY3Vyc2lvbi5cbiAqIFRoaXMgdmFsdWUgaXMgY2hvc2VuIHRvIGVuYWJsZSBtb2Rlcm4gSlMgZW5naW5lcyB0byB1c2UgYSBTTUkgb24gYWxsIHBsYXRmb3Jtcy5cbiAqIFdoZW4gcmVjdXJzaW9uIGRlcHRoIGlzIGdyZWF0ZXIsIGZhbGwgYmFjayB0byB1c2luZyBhIGZ1bGwgY2xlYW51cC5cbiAqL1xuY29uc3QgbWF4TWFya2VyQml0cyA9IDMwO1xubGV0IGFjdGl2ZUVmZmVjdDtcbmNvbnN0IElURVJBVEVfS0VZID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/ICdpdGVyYXRlJyA6ICcnKTtcbmNvbnN0IE1BUF9LRVlfSVRFUkFURV9LRVkgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gJ01hcCBrZXkgaXRlcmF0ZScgOiAnJyk7XG5jbGFzcyBSZWFjdGl2ZUVmZmVjdCB7XG4gICAgY29uc3RydWN0b3IoZm4sIHNjaGVkdWxlciA9IG51bGwsIHNjb3BlKSB7XG4gICAgICAgIHRoaXMuZm4gPSBmbjtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZXBzID0gW107XG4gICAgICAgIHRoaXMucGFyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICByZWNvcmRFZmZlY3RTY29wZSh0aGlzLCBzY29wZSk7XG4gICAgfVxuICAgIHJ1bigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm4oKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFyZW50ID0gYWN0aXZlRWZmZWN0O1xuICAgICAgICBsZXQgbGFzdFNob3VsZFRyYWNrID0gc2hvdWxkVHJhY2s7XG4gICAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnQgPT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudCA9IGFjdGl2ZUVmZmVjdDtcbiAgICAgICAgICAgIGFjdGl2ZUVmZmVjdCA9IHRoaXM7XG4gICAgICAgICAgICBzaG91bGRUcmFjayA9IHRydWU7XG4gICAgICAgICAgICB0cmFja09wQml0ID0gMSA8PCArK2VmZmVjdFRyYWNrRGVwdGg7XG4gICAgICAgICAgICBpZiAoZWZmZWN0VHJhY2tEZXB0aCA8PSBtYXhNYXJrZXJCaXRzKSB7XG4gICAgICAgICAgICAgICAgaW5pdERlcE1hcmtlcnModGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwRWZmZWN0KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm4oKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChlZmZlY3RUcmFja0RlcHRoIDw9IG1heE1hcmtlckJpdHMpIHtcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZURlcE1hcmtlcnModGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFja09wQml0ID0gMSA8PCAtLWVmZmVjdFRyYWNrRGVwdGg7XG4gICAgICAgICAgICBhY3RpdmVFZmZlY3QgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgICAgIHNob3VsZFRyYWNrID0gbGFzdFNob3VsZFRyYWNrO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWZlclN0b3ApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICAvLyBzdG9wcGVkIHdoaWxlIHJ1bm5pbmcgaXRzZWxmIC0gZGVmZXIgdGhlIGNsZWFudXBcbiAgICAgICAgaWYgKGFjdGl2ZUVmZmVjdCA9PT0gdGhpcykge1xuICAgICAgICAgICAgdGhpcy5kZWZlclN0b3AgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgICAgICAgICBjbGVhbnVwRWZmZWN0KHRoaXMpO1xuICAgICAgICAgICAgaWYgKHRoaXMub25TdG9wKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjbGVhbnVwRWZmZWN0KGVmZmVjdCkge1xuICAgIGNvbnN0IHsgZGVwcyB9ID0gZWZmZWN0O1xuICAgIGlmIChkZXBzLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRlcHNbaV0uZGVsZXRlKGVmZmVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVwcy5sZW5ndGggPSAwO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVmZmVjdChmbiwgb3B0aW9ucykge1xuICAgIGlmIChmbi5lZmZlY3QpIHtcbiAgICAgICAgZm4gPSBmbi5lZmZlY3QuZm47XG4gICAgfVxuICAgIGNvbnN0IF9lZmZlY3QgPSBuZXcgUmVhY3RpdmVFZmZlY3QoZm4pO1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIGV4dGVuZChfZWZmZWN0LCBvcHRpb25zKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuc2NvcGUpXG4gICAgICAgICAgICByZWNvcmRFZmZlY3RTY29wZShfZWZmZWN0LCBvcHRpb25zLnNjb3BlKTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLmxhenkpIHtcbiAgICAgICAgX2VmZmVjdC5ydW4oKTtcbiAgICB9XG4gICAgY29uc3QgcnVubmVyID0gX2VmZmVjdC5ydW4uYmluZChfZWZmZWN0KTtcbiAgICBydW5uZXIuZWZmZWN0ID0gX2VmZmVjdDtcbiAgICByZXR1cm4gcnVubmVyO1xufVxuZnVuY3Rpb24gc3RvcChydW5uZXIpIHtcbiAgICBydW5uZXIuZWZmZWN0LnN0b3AoKTtcbn1cbmxldCBzaG91bGRUcmFjayA9IHRydWU7XG5jb25zdCB0cmFja1N0YWNrID0gW107XG5mdW5jdGlvbiBwYXVzZVRyYWNraW5nKCkge1xuICAgIHRyYWNrU3RhY2sucHVzaChzaG91bGRUcmFjayk7XG4gICAgc2hvdWxkVHJhY2sgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIGVuYWJsZVRyYWNraW5nKCkge1xuICAgIHRyYWNrU3RhY2sucHVzaChzaG91bGRUcmFjayk7XG4gICAgc2hvdWxkVHJhY2sgPSB0cnVlO1xufVxuZnVuY3Rpb24gcmVzZXRUcmFja2luZygpIHtcbiAgICBjb25zdCBsYXN0ID0gdHJhY2tTdGFjay5wb3AoKTtcbiAgICBzaG91bGRUcmFjayA9IGxhc3QgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBsYXN0O1xufVxuZnVuY3Rpb24gdHJhY2sodGFyZ2V0LCB0eXBlLCBrZXkpIHtcbiAgICBpZiAoc2hvdWxkVHJhY2sgJiYgYWN0aXZlRWZmZWN0KSB7XG4gICAgICAgIGxldCBkZXBzTWFwID0gdGFyZ2V0TWFwLmdldCh0YXJnZXQpO1xuICAgICAgICBpZiAoIWRlcHNNYXApIHtcbiAgICAgICAgICAgIHRhcmdldE1hcC5zZXQodGFyZ2V0LCAoZGVwc01hcCA9IG5ldyBNYXAoKSkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkZXAgPSBkZXBzTWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWRlcCkge1xuICAgICAgICAgICAgZGVwc01hcC5zZXQoa2V5LCAoZGVwID0gY3JlYXRlRGVwKCkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudEluZm8gPSAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJylcbiAgICAgICAgICAgID8geyBlZmZlY3Q6IGFjdGl2ZUVmZmVjdCwgdGFyZ2V0LCB0eXBlLCBrZXkgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRyYWNrRWZmZWN0cyhkZXAsIGV2ZW50SW5mbyk7XG4gICAgfVxufVxuZnVuY3Rpb24gdHJhY2tFZmZlY3RzKGRlcCwgZGVidWdnZXJFdmVudEV4dHJhSW5mbykge1xuICAgIGxldCBzaG91bGRUcmFjayA9IGZhbHNlO1xuICAgIGlmIChlZmZlY3RUcmFja0RlcHRoIDw9IG1heE1hcmtlckJpdHMpIHtcbiAgICAgICAgaWYgKCFuZXdUcmFja2VkKGRlcCkpIHtcbiAgICAgICAgICAgIGRlcC5uIHw9IHRyYWNrT3BCaXQ7IC8vIHNldCBuZXdseSB0cmFja2VkXG4gICAgICAgICAgICBzaG91bGRUcmFjayA9ICF3YXNUcmFja2VkKGRlcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIEZ1bGwgY2xlYW51cCBtb2RlLlxuICAgICAgICBzaG91bGRUcmFjayA9ICFkZXAuaGFzKGFjdGl2ZUVmZmVjdCk7XG4gICAgfVxuICAgIGlmIChzaG91bGRUcmFjaykge1xuICAgICAgICBkZXAuYWRkKGFjdGl2ZUVmZmVjdCk7XG4gICAgICAgIGFjdGl2ZUVmZmVjdC5kZXBzLnB1c2goZGVwKTtcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiBhY3RpdmVFZmZlY3Qub25UcmFjaykge1xuICAgICAgICAgICAgYWN0aXZlRWZmZWN0Lm9uVHJhY2soT2JqZWN0LmFzc2lnbih7IGVmZmVjdDogYWN0aXZlRWZmZWN0IH0sIGRlYnVnZ2VyRXZlbnRFeHRyYUluZm8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHRyaWdnZXIodGFyZ2V0LCB0eXBlLCBrZXksIG5ld1ZhbHVlLCBvbGRWYWx1ZSwgb2xkVGFyZ2V0KSB7XG4gICAgY29uc3QgZGVwc01hcCA9IHRhcmdldE1hcC5nZXQodGFyZ2V0KTtcbiAgICBpZiAoIWRlcHNNYXApIHtcbiAgICAgICAgLy8gbmV2ZXIgYmVlbiB0cmFja2VkXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGRlcHMgPSBbXTtcbiAgICBpZiAodHlwZSA9PT0gXCJjbGVhclwiIC8qIFRyaWdnZXJPcFR5cGVzLkNMRUFSICovKSB7XG4gICAgICAgIC8vIGNvbGxlY3Rpb24gYmVpbmcgY2xlYXJlZFxuICAgICAgICAvLyB0cmlnZ2VyIGFsbCBlZmZlY3RzIGZvciB0YXJnZXRcbiAgICAgICAgZGVwcyA9IFsuLi5kZXBzTWFwLnZhbHVlcygpXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoa2V5ID09PSAnbGVuZ3RoJyAmJiBpc0FycmF5KHRhcmdldCkpIHtcbiAgICAgICAgY29uc3QgbmV3TGVuZ3RoID0gTnVtYmVyKG5ld1ZhbHVlKTtcbiAgICAgICAgZGVwc01hcC5mb3JFYWNoKChkZXAsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ2xlbmd0aCcgfHwga2V5ID49IG5ld0xlbmd0aCkge1xuICAgICAgICAgICAgICAgIGRlcHMucHVzaChkZXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIHNjaGVkdWxlIHJ1bnMgZm9yIFNFVCB8IEFERCB8IERFTEVURVxuICAgICAgICBpZiAoa2V5ICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChrZXkpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhbHNvIHJ1biBmb3IgaXRlcmF0aW9uIGtleSBvbiBBREQgfCBERUxFVEUgfCBNYXAuU0VUXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcImFkZFwiIC8qIFRyaWdnZXJPcFR5cGVzLkFERCAqLzpcbiAgICAgICAgICAgICAgICBpZiAoIWlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoSVRFUkFURV9LRVkpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWFwKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChNQVBfS0VZX0lURVJBVEVfS0VZKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNJbnRlZ2VyS2V5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmV3IGluZGV4IGFkZGVkIHRvIGFycmF5IC0+IGxlbmd0aCBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldCgnbGVuZ3RoJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJkZWxldGVcIiAvKiBUcmlnZ2VyT3BUeXBlcy5ERUxFVEUgKi86XG4gICAgICAgICAgICAgICAgaWYgKCFpc0FycmF5KHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwcy5wdXNoKGRlcHNNYXAuZ2V0KElURVJBVEVfS0VZKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc01hcCh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoTUFQX0tFWV9JVEVSQVRFX0tFWSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInNldFwiIC8qIFRyaWdnZXJPcFR5cGVzLlNFVCAqLzpcbiAgICAgICAgICAgICAgICBpZiAoaXNNYXAodGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoSVRFUkFURV9LRVkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZXZlbnRJbmZvID0gKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpXG4gICAgICAgID8geyB0YXJnZXQsIHR5cGUsIGtleSwgbmV3VmFsdWUsIG9sZFZhbHVlLCBvbGRUYXJnZXQgfVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoZGVwcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgaWYgKGRlcHNbMF0pIHtcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyRWZmZWN0cyhkZXBzWzBdLCBldmVudEluZm8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlckVmZmVjdHMoZGVwc1swXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGVmZmVjdHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgICAgICAgICAgaWYgKGRlcCkge1xuICAgICAgICAgICAgICAgIGVmZmVjdHMucHVzaCguLi5kZXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFZmZlY3RzKGNyZWF0ZURlcChlZmZlY3RzKSwgZXZlbnRJbmZvKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJFZmZlY3RzKGNyZWF0ZURlcChlZmZlY3RzKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB0cmlnZ2VyRWZmZWN0cyhkZXAsIGRlYnVnZ2VyRXZlbnRFeHRyYUluZm8pIHtcbiAgICAvLyBzcHJlYWQgaW50byBhcnJheSBmb3Igc3RhYmlsaXphdGlvblxuICAgIGNvbnN0IGVmZmVjdHMgPSBpc0FycmF5KGRlcCkgPyBkZXAgOiBbLi4uZGVwXTtcbiAgICBmb3IgKGNvbnN0IGVmZmVjdCBvZiBlZmZlY3RzKSB7XG4gICAgICAgIGlmIChlZmZlY3QuY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFZmZlY3QoZWZmZWN0LCBkZWJ1Z2dlckV2ZW50RXh0cmFJbmZvKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVmZmVjdCBvZiBlZmZlY3RzKSB7XG4gICAgICAgIGlmICghZWZmZWN0LmNvbXB1dGVkKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRWZmZWN0KGVmZmVjdCwgZGVidWdnZXJFdmVudEV4dHJhSW5mbyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB0cmlnZ2VyRWZmZWN0KGVmZmVjdCwgZGVidWdnZXJFdmVudEV4dHJhSW5mbykge1xuICAgIGlmIChlZmZlY3QgIT09IGFjdGl2ZUVmZmVjdCB8fCBlZmZlY3QuYWxsb3dSZWN1cnNlKSB7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgZWZmZWN0Lm9uVHJpZ2dlcikge1xuICAgICAgICAgICAgZWZmZWN0Lm9uVHJpZ2dlcihleHRlbmQoeyBlZmZlY3QgfSwgZGVidWdnZXJFdmVudEV4dHJhSW5mbykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlZmZlY3Quc2NoZWR1bGVyKSB7XG4gICAgICAgICAgICBlZmZlY3Quc2NoZWR1bGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlZmZlY3QucnVuKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXREZXBGcm9tUmVhY3RpdmUob2JqZWN0LCBrZXkpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IHRhcmdldE1hcC5nZXQob2JqZWN0KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldChrZXkpO1xufVxuXG5jb25zdCBpc05vblRyYWNrYWJsZUtleXMgPSAvKiNfX1BVUkVfXyovIG1ha2VNYXAoYF9fcHJvdG9fXyxfX3ZfaXNSZWYsX19pc1Z1ZWApO1xuY29uc3QgYnVpbHRJblN5bWJvbHMgPSBuZXcgU2V0KFxuLyojX19QVVJFX18qL1xuT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3ltYm9sKVxuICAgIC8vIGlvczEwLnggT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3ltYm9sKSBjYW4gZW51bWVyYXRlICdhcmd1bWVudHMnIGFuZCAnY2FsbGVyJ1xuICAgIC8vIGJ1dCBhY2Nlc3NpbmcgdGhlbSBvbiBTeW1ib2wgbGVhZHMgdG8gVHlwZUVycm9yIGJlY2F1c2UgU3ltYm9sIGlzIGEgc3RyaWN0IG1vZGVcbiAgICAvLyBmdW5jdGlvblxuICAgIC5maWx0ZXIoa2V5ID0+IGtleSAhPT0gJ2FyZ3VtZW50cycgJiYga2V5ICE9PSAnY2FsbGVyJylcbiAgICAubWFwKGtleSA9PiBTeW1ib2xba2V5XSlcbiAgICAuZmlsdGVyKGlzU3ltYm9sKSk7XG5jb25zdCBnZXQkMSA9IC8qI19fUFVSRV9fKi8gY3JlYXRlR2V0dGVyKCk7XG5jb25zdCBzaGFsbG93R2V0ID0gLyojX19QVVJFX18qLyBjcmVhdGVHZXR0ZXIoZmFsc2UsIHRydWUpO1xuY29uc3QgcmVhZG9ubHlHZXQgPSAvKiNfX1BVUkVfXyovIGNyZWF0ZUdldHRlcih0cnVlKTtcbmNvbnN0IHNoYWxsb3dSZWFkb25seUdldCA9IC8qI19fUFVSRV9fKi8gY3JlYXRlR2V0dGVyKHRydWUsIHRydWUpO1xuY29uc3QgYXJyYXlJbnN0cnVtZW50YXRpb25zID0gLyojX19QVVJFX18qLyBjcmVhdGVBcnJheUluc3RydW1lbnRhdGlvbnMoKTtcbmZ1bmN0aW9uIGNyZWF0ZUFycmF5SW5zdHJ1bWVudGF0aW9ucygpIHtcbiAgICBjb25zdCBpbnN0cnVtZW50YXRpb25zID0ge307XG4gICAgWydpbmNsdWRlcycsICdpbmRleE9mJywgJ2xhc3RJbmRleE9mJ10uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpbnN0cnVtZW50YXRpb25zW2tleV0gPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgYXJyID0gdG9SYXcodGhpcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdHJhY2soYXJyLCBcImdldFwiIC8qIFRyYWNrT3BUeXBlcy5HRVQgKi8sIGkgKyAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB3ZSBydW4gdGhlIG1ldGhvZCB1c2luZyB0aGUgb3JpZ2luYWwgYXJncyBmaXJzdCAod2hpY2ggbWF5IGJlIHJlYWN0aXZlKVxuICAgICAgICAgICAgY29uc3QgcmVzID0gYXJyW2tleV0oLi4uYXJncyk7XG4gICAgICAgICAgICBpZiAocmVzID09PSAtMSB8fCByZXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhhdCBkaWRuJ3Qgd29yaywgcnVuIGl0IGFnYWluIHVzaW5nIHJhdyB2YWx1ZXMuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycltrZXldKC4uLmFyZ3MubWFwKHRvUmF3KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xuICAgIFsncHVzaCcsICdwb3AnLCAnc2hpZnQnLCAndW5zaGlmdCcsICdzcGxpY2UnXS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGluc3RydW1lbnRhdGlvbnNba2V5XSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSB0b1Jhdyh0aGlzKVtrZXldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gaW5zdHJ1bWVudGF0aW9ucztcbn1cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KGtleSkge1xuICAgIGNvbnN0IG9iaiA9IHRvUmF3KHRoaXMpO1xuICAgIHRyYWNrKG9iaiwgXCJoYXNcIiAvKiBUcmFja09wVHlwZXMuSEFTICovLCBrZXkpO1xuICAgIHJldHVybiBvYmouaGFzT3duUHJvcGVydHkoa2V5KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUdldHRlcihpc1JlYWRvbmx5ID0gZmFsc2UsIHNoYWxsb3cgPSBmYWxzZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBnZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSB7XG4gICAgICAgIGlmIChrZXkgPT09IFwiX192X2lzUmVhY3RpdmVcIiAvKiBSZWFjdGl2ZUZsYWdzLklTX1JFQUNUSVZFICovKSB7XG4gICAgICAgICAgICByZXR1cm4gIWlzUmVhZG9ubHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9pc1JlYWRvbmx5XCIgLyogUmVhY3RpdmVGbGFncy5JU19SRUFET05MWSAqLykge1xuICAgICAgICAgICAgcmV0dXJuIGlzUmVhZG9ubHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9pc1NoYWxsb3dcIiAvKiBSZWFjdGl2ZUZsYWdzLklTX1NIQUxMT1cgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBzaGFsbG93O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJfX3ZfcmF3XCIgLyogUmVhY3RpdmVGbGFncy5SQVcgKi8gJiZcbiAgICAgICAgICAgIHJlY2VpdmVyID09PVxuICAgICAgICAgICAgICAgIChpc1JlYWRvbmx5XG4gICAgICAgICAgICAgICAgICAgID8gc2hhbGxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBzaGFsbG93UmVhZG9ubHlNYXBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcmVhZG9ubHlNYXBcbiAgICAgICAgICAgICAgICAgICAgOiBzaGFsbG93XG4gICAgICAgICAgICAgICAgICAgICAgICA/IHNoYWxsb3dSZWFjdGl2ZU1hcFxuICAgICAgICAgICAgICAgICAgICAgICAgOiByZWFjdGl2ZU1hcCkuZ2V0KHRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFyZ2V0SXNBcnJheSA9IGlzQXJyYXkodGFyZ2V0KTtcbiAgICAgICAgaWYgKCFpc1JlYWRvbmx5KSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0SXNBcnJheSAmJiBoYXNPd24oYXJyYXlJbnN0cnVtZW50YXRpb25zLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KGFycmF5SW5zdHJ1bWVudGF0aW9ucywga2V5LCByZWNlaXZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnaGFzT3duUHJvcGVydHknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcyA9IFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcik7XG4gICAgICAgIGlmIChpc1N5bWJvbChrZXkpID8gYnVpbHRJblN5bWJvbHMuaGFzKGtleSkgOiBpc05vblRyYWNrYWJsZUtleXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzUmVhZG9ubHkpIHtcbiAgICAgICAgICAgIHRyYWNrKHRhcmdldCwgXCJnZXRcIiAvKiBUcmFja09wVHlwZXMuR0VUICovLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaGFsbG93KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1JlZihyZXMpKSB7XG4gICAgICAgICAgICAvLyByZWYgdW53cmFwcGluZyAtIHNraXAgdW53cmFwIGZvciBBcnJheSArIGludGVnZXIga2V5LlxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldElzQXJyYXkgJiYgaXNJbnRlZ2VyS2V5KGtleSkgPyByZXMgOiByZXMudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzT2JqZWN0KHJlcykpIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgcmV0dXJuZWQgdmFsdWUgaW50byBhIHByb3h5IGFzIHdlbGwuIHdlIGRvIHRoZSBpc09iamVjdCBjaGVja1xuICAgICAgICAgICAgLy8gaGVyZSB0byBhdm9pZCBpbnZhbGlkIHZhbHVlIHdhcm5pbmcuIEFsc28gbmVlZCB0byBsYXp5IGFjY2VzcyByZWFkb25seVxuICAgICAgICAgICAgLy8gYW5kIHJlYWN0aXZlIGhlcmUgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeS5cbiAgICAgICAgICAgIHJldHVybiBpc1JlYWRvbmx5ID8gcmVhZG9ubHkocmVzKSA6IHJlYWN0aXZlKHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xufVxuY29uc3Qgc2V0JDEgPSAvKiNfX1BVUkVfXyovIGNyZWF0ZVNldHRlcigpO1xuY29uc3Qgc2hhbGxvd1NldCA9IC8qI19fUFVSRV9fKi8gY3JlYXRlU2V0dGVyKHRydWUpO1xuZnVuY3Rpb24gY3JlYXRlU2V0dGVyKHNoYWxsb3cgPSBmYWxzZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBzZXQodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcikge1xuICAgICAgICBsZXQgb2xkVmFsdWUgPSB0YXJnZXRba2V5XTtcbiAgICAgICAgaWYgKGlzUmVhZG9ubHkob2xkVmFsdWUpICYmIGlzUmVmKG9sZFZhbHVlKSAmJiAhaXNSZWYodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzaGFsbG93KSB7XG4gICAgICAgICAgICBpZiAoIWlzU2hhbGxvdyh2YWx1ZSkgJiYgIWlzUmVhZG9ubHkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgb2xkVmFsdWUgPSB0b1JhdyhvbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzQXJyYXkodGFyZ2V0KSAmJiBpc1JlZihvbGRWYWx1ZSkgJiYgIWlzUmVmKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIG9sZFZhbHVlLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFkS2V5ID0gaXNBcnJheSh0YXJnZXQpICYmIGlzSW50ZWdlcktleShrZXkpXG4gICAgICAgICAgICA/IE51bWJlcihrZXkpIDwgdGFyZ2V0Lmxlbmd0aFxuICAgICAgICAgICAgOiBoYXNPd24odGFyZ2V0LCBrZXkpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LnNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICAgICAgLy8gZG9uJ3QgdHJpZ2dlciBpZiB0YXJnZXQgaXMgc29tZXRoaW5nIHVwIGluIHRoZSBwcm90b3R5cGUgY2hhaW4gb2Ygb3JpZ2luYWxcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gdG9SYXcocmVjZWl2ZXIpKSB7XG4gICAgICAgICAgICBpZiAoIWhhZEtleSkge1xuICAgICAgICAgICAgICAgIHRyaWdnZXIodGFyZ2V0LCBcImFkZFwiIC8qIFRyaWdnZXJPcFR5cGVzLkFERCAqLywga2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChoYXNDaGFuZ2VkKHZhbHVlLCBvbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyKHRhcmdldCwgXCJzZXRcIiAvKiBUcmlnZ2VyT3BUeXBlcy5TRVQgKi8sIGtleSwgdmFsdWUsIG9sZFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG59XG5mdW5jdGlvbiBkZWxldGVQcm9wZXJ0eSh0YXJnZXQsIGtleSkge1xuICAgIGNvbnN0IGhhZEtleSA9IGhhc093bih0YXJnZXQsIGtleSk7XG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0YXJnZXRba2V5XTtcbiAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHRhcmdldCwga2V5KTtcbiAgICBpZiAocmVzdWx0ICYmIGhhZEtleSkge1xuICAgICAgICB0cmlnZ2VyKHRhcmdldCwgXCJkZWxldGVcIiAvKiBUcmlnZ2VyT3BUeXBlcy5ERUxFVEUgKi8sIGtleSwgdW5kZWZpbmVkLCBvbGRWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBoYXMkMSh0YXJnZXQsIGtleSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuaGFzKHRhcmdldCwga2V5KTtcbiAgICBpZiAoIWlzU3ltYm9sKGtleSkgfHwgIWJ1aWx0SW5TeW1ib2xzLmhhcyhrZXkpKSB7XG4gICAgICAgIHRyYWNrKHRhcmdldCwgXCJoYXNcIiAvKiBUcmFja09wVHlwZXMuSEFTICovLCBrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gb3duS2V5cyh0YXJnZXQpIHtcbiAgICB0cmFjayh0YXJnZXQsIFwiaXRlcmF0ZVwiIC8qIFRyYWNrT3BUeXBlcy5JVEVSQVRFICovLCBpc0FycmF5KHRhcmdldCkgPyAnbGVuZ3RoJyA6IElURVJBVEVfS0VZKTtcbiAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG59XG5jb25zdCBtdXRhYmxlSGFuZGxlcnMgPSB7XG4gICAgZ2V0OiBnZXQkMSxcbiAgICBzZXQ6IHNldCQxLFxuICAgIGRlbGV0ZVByb3BlcnR5LFxuICAgIGhhczogaGFzJDEsXG4gICAgb3duS2V5c1xufTtcbmNvbnN0IHJlYWRvbmx5SGFuZGxlcnMgPSB7XG4gICAgZ2V0OiByZWFkb25seUdldCxcbiAgICBzZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgd2FybihgU2V0IG9wZXJhdGlvbiBvbiBrZXkgXCIke1N0cmluZyhrZXkpfVwiIGZhaWxlZDogdGFyZ2V0IGlzIHJlYWRvbmx5LmAsIHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBkZWxldGVQcm9wZXJ0eSh0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICB3YXJuKGBEZWxldGUgb3BlcmF0aW9uIG9uIGtleSBcIiR7U3RyaW5nKGtleSl9XCIgZmFpbGVkOiB0YXJnZXQgaXMgcmVhZG9ubHkuYCwgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59O1xuY29uc3Qgc2hhbGxvd1JlYWN0aXZlSGFuZGxlcnMgPSAvKiNfX1BVUkVfXyovIGV4dGVuZCh7fSwgbXV0YWJsZUhhbmRsZXJzLCB7XG4gICAgZ2V0OiBzaGFsbG93R2V0LFxuICAgIHNldDogc2hhbGxvd1NldFxufSk7XG4vLyBQcm9wcyBoYW5kbGVycyBhcmUgc3BlY2lhbCBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBzaG91bGQgbm90IHVud3JhcCB0b3AtbGV2ZWxcbi8vIHJlZnMgKGluIG9yZGVyIHRvIGFsbG93IHJlZnMgdG8gYmUgZXhwbGljaXRseSBwYXNzZWQgZG93biksIGJ1dCBzaG91bGRcbi8vIHJldGFpbiB0aGUgcmVhY3Rpdml0eSBvZiB0aGUgbm9ybWFsIHJlYWRvbmx5IG9iamVjdC5cbmNvbnN0IHNoYWxsb3dSZWFkb25seUhhbmRsZXJzID0gLyojX19QVVJFX18qLyBleHRlbmQoe30sIHJlYWRvbmx5SGFuZGxlcnMsIHtcbiAgICBnZXQ6IHNoYWxsb3dSZWFkb25seUdldFxufSk7XG5cbmNvbnN0IHRvU2hhbGxvdyA9ICh2YWx1ZSkgPT4gdmFsdWU7XG5jb25zdCBnZXRQcm90byA9ICh2KSA9PiBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHYpO1xuZnVuY3Rpb24gZ2V0KHRhcmdldCwga2V5LCBpc1JlYWRvbmx5ID0gZmFsc2UsIGlzU2hhbGxvdyA9IGZhbHNlKSB7XG4gICAgLy8gIzE3NzI6IHJlYWRvbmx5KHJlYWN0aXZlKE1hcCkpIHNob3VsZCByZXR1cm4gcmVhZG9ubHkgKyByZWFjdGl2ZSB2ZXJzaW9uXG4gICAgLy8gb2YgdGhlIHZhbHVlXG4gICAgdGFyZ2V0ID0gdGFyZ2V0W1wiX192X3Jhd1wiIC8qIFJlYWN0aXZlRmxhZ3MuUkFXICovXTtcbiAgICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICAgIGNvbnN0IHJhd0tleSA9IHRvUmF3KGtleSk7XG4gICAgaWYgKCFpc1JlYWRvbmx5KSB7XG4gICAgICAgIGlmIChrZXkgIT09IHJhd0tleSkge1xuICAgICAgICAgICAgdHJhY2socmF3VGFyZ2V0LCBcImdldFwiIC8qIFRyYWNrT3BUeXBlcy5HRVQgKi8sIGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2socmF3VGFyZ2V0LCBcImdldFwiIC8qIFRyYWNrT3BUeXBlcy5HRVQgKi8sIHJhd0tleSk7XG4gICAgfVxuICAgIGNvbnN0IHsgaGFzIH0gPSBnZXRQcm90byhyYXdUYXJnZXQpO1xuICAgIGNvbnN0IHdyYXAgPSBpc1NoYWxsb3cgPyB0b1NoYWxsb3cgOiBpc1JlYWRvbmx5ID8gdG9SZWFkb25seSA6IHRvUmVhY3RpdmU7XG4gICAgaWYgKGhhcy5jYWxsKHJhd1RhcmdldCwga2V5KSkge1xuICAgICAgICByZXR1cm4gd3JhcCh0YXJnZXQuZ2V0KGtleSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChoYXMuY2FsbChyYXdUYXJnZXQsIHJhd0tleSkpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAodGFyZ2V0LmdldChyYXdLZXkpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodGFyZ2V0ICE9PSByYXdUYXJnZXQpIHtcbiAgICAgICAgLy8gIzM2MDIgcmVhZG9ubHkocmVhY3RpdmUoTWFwKSlcbiAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIG5lc3RlZCByZWFjdGl2ZSBgTWFwYCBjYW4gZG8gdHJhY2tpbmcgZm9yIGl0c2VsZlxuICAgICAgICB0YXJnZXQuZ2V0KGtleSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFzKGtleSwgaXNSZWFkb25seSA9IGZhbHNlKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpc1tcIl9fdl9yYXdcIiAvKiBSZWFjdGl2ZUZsYWdzLlJBVyAqL107XG4gICAgY29uc3QgcmF3VGFyZ2V0ID0gdG9SYXcodGFyZ2V0KTtcbiAgICBjb25zdCByYXdLZXkgPSB0b1JhdyhrZXkpO1xuICAgIGlmICghaXNSZWFkb25seSkge1xuICAgICAgICBpZiAoa2V5ICE9PSByYXdLZXkpIHtcbiAgICAgICAgICAgIHRyYWNrKHJhd1RhcmdldCwgXCJoYXNcIiAvKiBUcmFja09wVHlwZXMuSEFTICovLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRyYWNrKHJhd1RhcmdldCwgXCJoYXNcIiAvKiBUcmFja09wVHlwZXMuSEFTICovLCByYXdLZXkpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5ID09PSByYXdLZXlcbiAgICAgICAgPyB0YXJnZXQuaGFzKGtleSlcbiAgICAgICAgOiB0YXJnZXQuaGFzKGtleSkgfHwgdGFyZ2V0LmhhcyhyYXdLZXkpO1xufVxuZnVuY3Rpb24gc2l6ZSh0YXJnZXQsIGlzUmVhZG9ubHkgPSBmYWxzZSkge1xuICAgIHRhcmdldCA9IHRhcmdldFtcIl9fdl9yYXdcIiAvKiBSZWFjdGl2ZUZsYWdzLlJBVyAqL107XG4gICAgIWlzUmVhZG9ubHkgJiYgdHJhY2sodG9SYXcodGFyZ2V0KSwgXCJpdGVyYXRlXCIgLyogVHJhY2tPcFR5cGVzLklURVJBVEUgKi8sIElURVJBVEVfS0VZKTtcbiAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCAnc2l6ZScsIHRhcmdldCk7XG59XG5mdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICB2YWx1ZSA9IHRvUmF3KHZhbHVlKTtcbiAgICBjb25zdCB0YXJnZXQgPSB0b1Jhdyh0aGlzKTtcbiAgICBjb25zdCBwcm90byA9IGdldFByb3RvKHRhcmdldCk7XG4gICAgY29uc3QgaGFkS2V5ID0gcHJvdG8uaGFzLmNhbGwodGFyZ2V0LCB2YWx1ZSk7XG4gICAgaWYgKCFoYWRLZXkpIHtcbiAgICAgICAgdGFyZ2V0LmFkZCh2YWx1ZSk7XG4gICAgICAgIHRyaWdnZXIodGFyZ2V0LCBcImFkZFwiIC8qIFRyaWdnZXJPcFR5cGVzLkFERCAqLywgdmFsdWUsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG59XG5mdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHZhbHVlID0gdG9SYXcodmFsdWUpO1xuICAgIGNvbnN0IHRhcmdldCA9IHRvUmF3KHRoaXMpO1xuICAgIGNvbnN0IHsgaGFzLCBnZXQgfSA9IGdldFByb3RvKHRhcmdldCk7XG4gICAgbGV0IGhhZEtleSA9IGhhcy5jYWxsKHRhcmdldCwga2V5KTtcbiAgICBpZiAoIWhhZEtleSkge1xuICAgICAgICBrZXkgPSB0b1JhdyhrZXkpO1xuICAgICAgICBoYWRLZXkgPSBoYXMuY2FsbCh0YXJnZXQsIGtleSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICBjaGVja0lkZW50aXR5S2V5cyh0YXJnZXQsIGhhcywga2V5KTtcbiAgICB9XG4gICAgY29uc3Qgb2xkVmFsdWUgPSBnZXQuY2FsbCh0YXJnZXQsIGtleSk7XG4gICAgdGFyZ2V0LnNldChrZXksIHZhbHVlKTtcbiAgICBpZiAoIWhhZEtleSkge1xuICAgICAgICB0cmlnZ2VyKHRhcmdldCwgXCJhZGRcIiAvKiBUcmlnZ2VyT3BUeXBlcy5BREQgKi8sIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChoYXNDaGFuZ2VkKHZhbHVlLCBvbGRWYWx1ZSkpIHtcbiAgICAgICAgdHJpZ2dlcih0YXJnZXQsIFwic2V0XCIgLyogVHJpZ2dlck9wVHlwZXMuU0VUICovLCBrZXksIHZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xufVxuZnVuY3Rpb24gZGVsZXRlRW50cnkoa2V5KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdG9SYXcodGhpcyk7XG4gICAgY29uc3QgeyBoYXMsIGdldCB9ID0gZ2V0UHJvdG8odGFyZ2V0KTtcbiAgICBsZXQgaGFkS2V5ID0gaGFzLmNhbGwodGFyZ2V0LCBrZXkpO1xuICAgIGlmICghaGFkS2V5KSB7XG4gICAgICAgIGtleSA9IHRvUmF3KGtleSk7XG4gICAgICAgIGhhZEtleSA9IGhhcy5jYWxsKHRhcmdldCwga2V5KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgIGNoZWNrSWRlbnRpdHlLZXlzKHRhcmdldCwgaGFzLCBrZXkpO1xuICAgIH1cbiAgICBjb25zdCBvbGRWYWx1ZSA9IGdldCA/IGdldC5jYWxsKHRhcmdldCwga2V5KSA6IHVuZGVmaW5lZDtcbiAgICAvLyBmb3J3YXJkIHRoZSBvcGVyYXRpb24gYmVmb3JlIHF1ZXVlaW5nIHJlYWN0aW9uc1xuICAgIGNvbnN0IHJlc3VsdCA9IHRhcmdldC5kZWxldGUoa2V5KTtcbiAgICBpZiAoaGFkS2V5KSB7XG4gICAgICAgIHRyaWdnZXIodGFyZ2V0LCBcImRlbGV0ZVwiIC8qIFRyaWdnZXJPcFR5cGVzLkRFTEVURSAqLywga2V5LCB1bmRlZmluZWQsIG9sZFZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIGNvbnN0IHRhcmdldCA9IHRvUmF3KHRoaXMpO1xuICAgIGNvbnN0IGhhZEl0ZW1zID0gdGFyZ2V0LnNpemUgIT09IDA7XG4gICAgY29uc3Qgb2xkVGFyZ2V0ID0gKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpXG4gICAgICAgID8gaXNNYXAodGFyZ2V0KVxuICAgICAgICAgICAgPyBuZXcgTWFwKHRhcmdldClcbiAgICAgICAgICAgIDogbmV3IFNldCh0YXJnZXQpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIC8vIGZvcndhcmQgdGhlIG9wZXJhdGlvbiBiZWZvcmUgcXVldWVpbmcgcmVhY3Rpb25zXG4gICAgY29uc3QgcmVzdWx0ID0gdGFyZ2V0LmNsZWFyKCk7XG4gICAgaWYgKGhhZEl0ZW1zKSB7XG4gICAgICAgIHRyaWdnZXIodGFyZ2V0LCBcImNsZWFyXCIgLyogVHJpZ2dlck9wVHlwZXMuQ0xFQVIgKi8sIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBvbGRUYXJnZXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY3JlYXRlRm9yRWFjaChpc1JlYWRvbmx5LCBpc1NoYWxsb3cpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBvYnNlcnZlZCA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IG9ic2VydmVkW1wiX192X3Jhd1wiIC8qIFJlYWN0aXZlRmxhZ3MuUkFXICovXTtcbiAgICAgICAgY29uc3QgcmF3VGFyZ2V0ID0gdG9SYXcodGFyZ2V0KTtcbiAgICAgICAgY29uc3Qgd3JhcCA9IGlzU2hhbGxvdyA/IHRvU2hhbGxvdyA6IGlzUmVhZG9ubHkgPyB0b1JlYWRvbmx5IDogdG9SZWFjdGl2ZTtcbiAgICAgICAgIWlzUmVhZG9ubHkgJiYgdHJhY2socmF3VGFyZ2V0LCBcIml0ZXJhdGVcIiAvKiBUcmFja09wVHlwZXMuSVRFUkFURSAqLywgSVRFUkFURV9LRVkpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0LmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIC8vIGltcG9ydGFudDogbWFrZSBzdXJlIHRoZSBjYWxsYmFjayBpc1xuICAgICAgICAgICAgLy8gMS4gaW52b2tlZCB3aXRoIHRoZSByZWFjdGl2ZSBtYXAgYXMgYHRoaXNgIGFuZCAzcmQgYXJnXG4gICAgICAgICAgICAvLyAyLiB0aGUgdmFsdWUgcmVjZWl2ZWQgc2hvdWxkIGJlIGEgY29ycmVzcG9uZGluZyByZWFjdGl2ZS9yZWFkb25seS5cbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHdyYXAodmFsdWUpLCB3cmFwKGtleSksIG9ic2VydmVkKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUl0ZXJhYmxlTWV0aG9kKG1ldGhvZCwgaXNSZWFkb25seSwgaXNTaGFsbG93KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXNbXCJfX3ZfcmF3XCIgLyogUmVhY3RpdmVGbGFncy5SQVcgKi9dO1xuICAgICAgICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICAgICAgICBjb25zdCB0YXJnZXRJc01hcCA9IGlzTWFwKHJhd1RhcmdldCk7XG4gICAgICAgIGNvbnN0IGlzUGFpciA9IG1ldGhvZCA9PT0gJ2VudHJpZXMnIHx8IChtZXRob2QgPT09IFN5bWJvbC5pdGVyYXRvciAmJiB0YXJnZXRJc01hcCk7XG4gICAgICAgIGNvbnN0IGlzS2V5T25seSA9IG1ldGhvZCA9PT0gJ2tleXMnICYmIHRhcmdldElzTWFwO1xuICAgICAgICBjb25zdCBpbm5lckl0ZXJhdG9yID0gdGFyZ2V0W21ldGhvZF0oLi4uYXJncyk7XG4gICAgICAgIGNvbnN0IHdyYXAgPSBpc1NoYWxsb3cgPyB0b1NoYWxsb3cgOiBpc1JlYWRvbmx5ID8gdG9SZWFkb25seSA6IHRvUmVhY3RpdmU7XG4gICAgICAgICFpc1JlYWRvbmx5ICYmXG4gICAgICAgICAgICB0cmFjayhyYXdUYXJnZXQsIFwiaXRlcmF0ZVwiIC8qIFRyYWNrT3BUeXBlcy5JVEVSQVRFICovLCBpc0tleU9ubHkgPyBNQVBfS0VZX0lURVJBVEVfS0VZIDogSVRFUkFURV9LRVkpO1xuICAgICAgICAvLyByZXR1cm4gYSB3cmFwcGVkIGl0ZXJhdG9yIHdoaWNoIHJldHVybnMgb2JzZXJ2ZWQgdmVyc2lvbnMgb2YgdGhlXG4gICAgICAgIC8vIHZhbHVlcyBlbWl0dGVkIGZyb20gdGhlIHJlYWwgaXRlcmF0b3JcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC8vIGl0ZXJhdG9yIHByb3RvY29sXG4gICAgICAgICAgICBuZXh0KCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGlubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkb25lXG4gICAgICAgICAgICAgICAgICAgID8geyB2YWx1ZSwgZG9uZSB9XG4gICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGlzUGFpciA/IFt3cmFwKHZhbHVlWzBdKSwgd3JhcCh2YWx1ZVsxXSldIDogd3JhcCh2YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gaXRlcmFibGUgcHJvdG9jb2xcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVSZWFkb25seU1ldGhvZCh0eXBlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGFyZ3NbMF0gPyBgb24ga2V5IFwiJHthcmdzWzBdfVwiIGAgOiBgYDtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHtjYXBpdGFsaXplKHR5cGUpfSBvcGVyYXRpb24gJHtrZXl9ZmFpbGVkOiB0YXJnZXQgaXMgcmVhZG9ubHkuYCwgdG9SYXcodGhpcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlID09PSBcImRlbGV0ZVwiIC8qIFRyaWdnZXJPcFR5cGVzLkRFTEVURSAqLyA/IGZhbHNlIDogdGhpcztcbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSW5zdHJ1bWVudGF0aW9ucygpIHtcbiAgICBjb25zdCBtdXRhYmxlSW5zdHJ1bWVudGF0aW9ucyA9IHtcbiAgICAgICAgZ2V0KGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCBrZXkpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBzaXplKHRoaXMpO1xuICAgICAgICB9LFxuICAgICAgICBoYXMsXG4gICAgICAgIGFkZCxcbiAgICAgICAgc2V0LFxuICAgICAgICBkZWxldGU6IGRlbGV0ZUVudHJ5LFxuICAgICAgICBjbGVhcixcbiAgICAgICAgZm9yRWFjaDogY3JlYXRlRm9yRWFjaChmYWxzZSwgZmFsc2UpXG4gICAgfTtcbiAgICBjb25zdCBzaGFsbG93SW5zdHJ1bWVudGF0aW9ucyA9IHtcbiAgICAgICAgZ2V0KGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCBrZXksIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHNpemUoKSB7XG4gICAgICAgICAgICByZXR1cm4gc2l6ZSh0aGlzKTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzLFxuICAgICAgICBhZGQsXG4gICAgICAgIHNldCxcbiAgICAgICAgZGVsZXRlOiBkZWxldGVFbnRyeSxcbiAgICAgICAgY2xlYXIsXG4gICAgICAgIGZvckVhY2g6IGNyZWF0ZUZvckVhY2goZmFsc2UsIHRydWUpXG4gICAgfTtcbiAgICBjb25zdCByZWFkb25seUluc3RydW1lbnRhdGlvbnMgPSB7XG4gICAgICAgIGdldChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQodGhpcywga2V5LCB0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHNpemUoKSB7XG4gICAgICAgICAgICByZXR1cm4gc2l6ZSh0aGlzLCB0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGhhcy5jYWxsKHRoaXMsIGtleSwgdHJ1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFkZDogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJhZGRcIiAvKiBUcmlnZ2VyT3BUeXBlcy5BREQgKi8pLFxuICAgICAgICBzZXQ6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwic2V0XCIgLyogVHJpZ2dlck9wVHlwZXMuU0VUICovKSxcbiAgICAgICAgZGVsZXRlOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImRlbGV0ZVwiIC8qIFRyaWdnZXJPcFR5cGVzLkRFTEVURSAqLyksXG4gICAgICAgIGNsZWFyOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImNsZWFyXCIgLyogVHJpZ2dlck9wVHlwZXMuQ0xFQVIgKi8pLFxuICAgICAgICBmb3JFYWNoOiBjcmVhdGVGb3JFYWNoKHRydWUsIGZhbHNlKVxuICAgIH07XG4gICAgY29uc3Qgc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9ucyA9IHtcbiAgICAgICAgZ2V0KGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCBrZXksIHRydWUsIHRydWUpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBzaXplKHRoaXMsIHRydWUpO1xuICAgICAgICB9LFxuICAgICAgICBoYXMoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gaGFzLmNhbGwodGhpcywga2V5LCB0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWRkOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImFkZFwiIC8qIFRyaWdnZXJPcFR5cGVzLkFERCAqLyksXG4gICAgICAgIHNldDogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJzZXRcIiAvKiBUcmlnZ2VyT3BUeXBlcy5TRVQgKi8pLFxuICAgICAgICBkZWxldGU6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiZGVsZXRlXCIgLyogVHJpZ2dlck9wVHlwZXMuREVMRVRFICovKSxcbiAgICAgICAgY2xlYXI6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiY2xlYXJcIiAvKiBUcmlnZ2VyT3BUeXBlcy5DTEVBUiAqLyksXG4gICAgICAgIGZvckVhY2g6IGNyZWF0ZUZvckVhY2godHJ1ZSwgdHJ1ZSlcbiAgICB9O1xuICAgIGNvbnN0IGl0ZXJhdG9yTWV0aG9kcyA9IFsna2V5cycsICd2YWx1ZXMnLCAnZW50cmllcycsIFN5bWJvbC5pdGVyYXRvcl07XG4gICAgaXRlcmF0b3JNZXRob2RzLmZvckVhY2gobWV0aG9kID0+IHtcbiAgICAgICAgbXV0YWJsZUluc3RydW1lbnRhdGlvbnNbbWV0aG9kXSA9IGNyZWF0ZUl0ZXJhYmxlTWV0aG9kKG1ldGhvZCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zW21ldGhvZF0gPSBjcmVhdGVJdGVyYWJsZU1ldGhvZChtZXRob2QsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgc2hhbGxvd0luc3RydW1lbnRhdGlvbnNbbWV0aG9kXSA9IGNyZWF0ZUl0ZXJhYmxlTWV0aG9kKG1ldGhvZCwgZmFsc2UsIHRydWUpO1xuICAgICAgICBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zW21ldGhvZF0gPSBjcmVhdGVJdGVyYWJsZU1ldGhvZChtZXRob2QsIHRydWUsIHRydWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBbXG4gICAgICAgIG11dGFibGVJbnN0cnVtZW50YXRpb25zLFxuICAgICAgICByZWFkb25seUluc3RydW1lbnRhdGlvbnMsXG4gICAgICAgIHNoYWxsb3dJbnN0cnVtZW50YXRpb25zLFxuICAgICAgICBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zXG4gICAgXTtcbn1cbmNvbnN0IFttdXRhYmxlSW5zdHJ1bWVudGF0aW9ucywgcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zLCBzaGFsbG93SW5zdHJ1bWVudGF0aW9ucywgc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9uc10gPSAvKiAjX19QVVJFX18qLyBjcmVhdGVJbnN0cnVtZW50YXRpb25zKCk7XG5mdW5jdGlvbiBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIoaXNSZWFkb25seSwgc2hhbGxvdykge1xuICAgIGNvbnN0IGluc3RydW1lbnRhdGlvbnMgPSBzaGFsbG93XG4gICAgICAgID8gaXNSZWFkb25seVxuICAgICAgICAgICAgPyBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zXG4gICAgICAgICAgICA6IHNoYWxsb3dJbnN0cnVtZW50YXRpb25zXG4gICAgICAgIDogaXNSZWFkb25seVxuICAgICAgICAgICAgPyByZWFkb25seUluc3RydW1lbnRhdGlvbnNcbiAgICAgICAgICAgIDogbXV0YWJsZUluc3RydW1lbnRhdGlvbnM7XG4gICAgcmV0dXJuICh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJfX3ZfaXNSZWFjdGl2ZVwiIC8qIFJlYWN0aXZlRmxhZ3MuSVNfUkVBQ1RJVkUgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiAhaXNSZWFkb25seTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09IFwiX192X2lzUmVhZG9ubHlcIiAvKiBSZWFjdGl2ZUZsYWdzLklTX1JFQURPTkxZICovKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNSZWFkb25seTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09IFwiX192X3Jhd1wiIC8qIFJlYWN0aXZlRmxhZ3MuUkFXICovKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldChoYXNPd24oaW5zdHJ1bWVudGF0aW9ucywga2V5KSAmJiBrZXkgaW4gdGFyZ2V0XG4gICAgICAgICAgICA/IGluc3RydW1lbnRhdGlvbnNcbiAgICAgICAgICAgIDogdGFyZ2V0LCBrZXksIHJlY2VpdmVyKTtcbiAgICB9O1xufVxuY29uc3QgbXV0YWJsZUNvbGxlY3Rpb25IYW5kbGVycyA9IHtcbiAgICBnZXQ6IC8qI19fUFVSRV9fKi8gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKGZhbHNlLCBmYWxzZSlcbn07XG5jb25zdCBzaGFsbG93Q29sbGVjdGlvbkhhbmRsZXJzID0ge1xuICAgIGdldDogLyojX19QVVJFX18qLyBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIoZmFsc2UsIHRydWUpXG59O1xuY29uc3QgcmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMgPSB7XG4gICAgZ2V0OiAvKiNfX1BVUkVfXyovIGNyZWF0ZUluc3RydW1lbnRhdGlvbkdldHRlcih0cnVlLCBmYWxzZSlcbn07XG5jb25zdCBzaGFsbG93UmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMgPSB7XG4gICAgZ2V0OiAvKiNfX1BVUkVfXyovIGNyZWF0ZUluc3RydW1lbnRhdGlvbkdldHRlcih0cnVlLCB0cnVlKVxufTtcbmZ1bmN0aW9uIGNoZWNrSWRlbnRpdHlLZXlzKHRhcmdldCwgaGFzLCBrZXkpIHtcbiAgICBjb25zdCByYXdLZXkgPSB0b1JhdyhrZXkpO1xuICAgIGlmIChyYXdLZXkgIT09IGtleSAmJiBoYXMuY2FsbCh0YXJnZXQsIHJhd0tleSkpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRvUmF3VHlwZSh0YXJnZXQpO1xuICAgICAgICBjb25zb2xlLndhcm4oYFJlYWN0aXZlICR7dHlwZX0gY29udGFpbnMgYm90aCB0aGUgcmF3IGFuZCByZWFjdGl2ZSBgICtcbiAgICAgICAgICAgIGB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBvYmplY3Qke3R5cGUgPT09IGBNYXBgID8gYCBhcyBrZXlzYCA6IGBgfSwgYCArXG4gICAgICAgICAgICBgd2hpY2ggY2FuIGxlYWQgdG8gaW5jb25zaXN0ZW5jaWVzLiBgICtcbiAgICAgICAgICAgIGBBdm9pZCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiB0aGUgcmF3IGFuZCByZWFjdGl2ZSB2ZXJzaW9ucyBgICtcbiAgICAgICAgICAgIGBvZiBhbiBvYmplY3QgYW5kIG9ubHkgdXNlIHRoZSByZWFjdGl2ZSB2ZXJzaW9uIGlmIHBvc3NpYmxlLmApO1xuICAgIH1cbn1cblxuY29uc3QgcmVhY3RpdmVNYXAgPSBuZXcgV2Vha01hcCgpO1xuY29uc3Qgc2hhbGxvd1JlYWN0aXZlTWFwID0gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHJlYWRvbmx5TWFwID0gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHNoYWxsb3dSZWFkb25seU1hcCA9IG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiB0YXJnZXRUeXBlTWFwKHJhd1R5cGUpIHtcbiAgICBzd2l0Y2ggKHJhd1R5cGUpIHtcbiAgICAgICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgICAgY2FzZSAnQXJyYXknOlxuICAgICAgICAgICAgcmV0dXJuIDEgLyogVGFyZ2V0VHlwZS5DT01NT04gKi87XG4gICAgICAgIGNhc2UgJ01hcCc6XG4gICAgICAgIGNhc2UgJ1NldCc6XG4gICAgICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgICAgICBjYXNlICdXZWFrU2V0JzpcbiAgICAgICAgICAgIHJldHVybiAyIC8qIFRhcmdldFR5cGUuQ09MTEVDVElPTiAqLztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFRhcmdldFR5cGUuSU5WQUxJRCAqLztcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRUYXJnZXRUeXBlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlW1wiX192X3NraXBcIiAvKiBSZWFjdGl2ZUZsYWdzLlNLSVAgKi9dIHx8ICFPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKVxuICAgICAgICA/IDAgLyogVGFyZ2V0VHlwZS5JTlZBTElEICovXG4gICAgICAgIDogdGFyZ2V0VHlwZU1hcCh0b1Jhd1R5cGUodmFsdWUpKTtcbn1cbmZ1bmN0aW9uIHJlYWN0aXZlKHRhcmdldCkge1xuICAgIC8vIGlmIHRyeWluZyB0byBvYnNlcnZlIGEgcmVhZG9ubHkgcHJveHksIHJldHVybiB0aGUgcmVhZG9ubHkgdmVyc2lvbi5cbiAgICBpZiAoaXNSZWFkb25seSh0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVSZWFjdGl2ZU9iamVjdCh0YXJnZXQsIGZhbHNlLCBtdXRhYmxlSGFuZGxlcnMsIG11dGFibGVDb2xsZWN0aW9uSGFuZGxlcnMsIHJlYWN0aXZlTWFwKTtcbn1cbi8qKlxuICogUmV0dXJuIGEgc2hhbGxvd2x5LXJlYWN0aXZlIGNvcHkgb2YgdGhlIG9yaWdpbmFsIG9iamVjdCwgd2hlcmUgb25seSB0aGUgcm9vdFxuICogbGV2ZWwgcHJvcGVydGllcyBhcmUgcmVhY3RpdmUuIEl0IGFsc28gZG9lcyBub3QgYXV0by11bndyYXAgcmVmcyAoZXZlbiBhdCB0aGVcbiAqIHJvb3QgbGV2ZWwpLlxuICovXG5mdW5jdGlvbiBzaGFsbG93UmVhY3RpdmUodGFyZ2V0KSB7XG4gICAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlT2JqZWN0KHRhcmdldCwgZmFsc2UsIHNoYWxsb3dSZWFjdGl2ZUhhbmRsZXJzLCBzaGFsbG93Q29sbGVjdGlvbkhhbmRsZXJzLCBzaGFsbG93UmVhY3RpdmVNYXApO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgcmVhZG9ubHkgY29weSBvZiB0aGUgb3JpZ2luYWwgb2JqZWN0LiBOb3RlIHRoZSByZXR1cm5lZCBjb3B5IGlzIG5vdFxuICogbWFkZSByZWFjdGl2ZSwgYnV0IGByZWFkb25seWAgY2FuIGJlIGNhbGxlZCBvbiBhbiBhbHJlYWR5IHJlYWN0aXZlIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gcmVhZG9ubHkodGFyZ2V0KSB7XG4gICAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlT2JqZWN0KHRhcmdldCwgdHJ1ZSwgcmVhZG9ubHlIYW5kbGVycywgcmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMsIHJlYWRvbmx5TWFwKTtcbn1cbi8qKlxuICogUmV0dXJucyBhIHJlYWN0aXZlLWNvcHkgb2YgdGhlIG9yaWdpbmFsIG9iamVjdCwgd2hlcmUgb25seSB0aGUgcm9vdCBsZXZlbFxuICogcHJvcGVydGllcyBhcmUgcmVhZG9ubHksIGFuZCBkb2VzIE5PVCB1bndyYXAgcmVmcyBub3IgcmVjdXJzaXZlbHkgY29udmVydFxuICogcmV0dXJuZWQgcHJvcGVydGllcy5cbiAqIFRoaXMgaXMgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIHByb3BzIHByb3h5IG9iamVjdCBmb3Igc3RhdGVmdWwgY29tcG9uZW50cy5cbiAqL1xuZnVuY3Rpb24gc2hhbGxvd1JlYWRvbmx5KHRhcmdldCkge1xuICAgIHJldHVybiBjcmVhdGVSZWFjdGl2ZU9iamVjdCh0YXJnZXQsIHRydWUsIHNoYWxsb3dSZWFkb25seUhhbmRsZXJzLCBzaGFsbG93UmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMsIHNoYWxsb3dSZWFkb25seU1hcCk7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWFjdGl2ZU9iamVjdCh0YXJnZXQsIGlzUmVhZG9ubHksIGJhc2VIYW5kbGVycywgY29sbGVjdGlvbkhhbmRsZXJzLCBwcm94eU1hcCkge1xuICAgIGlmICghaXNPYmplY3QodGFyZ2V0KSkge1xuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYHZhbHVlIGNhbm5vdCBiZSBtYWRlIHJlYWN0aXZlOiAke1N0cmluZyh0YXJnZXQpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIC8vIHRhcmdldCBpcyBhbHJlYWR5IGEgUHJveHksIHJldHVybiBpdC5cbiAgICAvLyBleGNlcHRpb246IGNhbGxpbmcgcmVhZG9ubHkoKSBvbiBhIHJlYWN0aXZlIG9iamVjdFxuICAgIGlmICh0YXJnZXRbXCJfX3ZfcmF3XCIgLyogUmVhY3RpdmVGbGFncy5SQVcgKi9dICYmXG4gICAgICAgICEoaXNSZWFkb25seSAmJiB0YXJnZXRbXCJfX3ZfaXNSZWFjdGl2ZVwiIC8qIFJlYWN0aXZlRmxhZ3MuSVNfUkVBQ1RJVkUgKi9dKSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICAvLyB0YXJnZXQgYWxyZWFkeSBoYXMgY29ycmVzcG9uZGluZyBQcm94eVxuICAgIGNvbnN0IGV4aXN0aW5nUHJveHkgPSBwcm94eU1hcC5nZXQodGFyZ2V0KTtcbiAgICBpZiAoZXhpc3RpbmdQcm94eSkge1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdQcm94eTtcbiAgICB9XG4gICAgLy8gb25seSBzcGVjaWZpYyB2YWx1ZSB0eXBlcyBjYW4gYmUgb2JzZXJ2ZWQuXG4gICAgY29uc3QgdGFyZ2V0VHlwZSA9IGdldFRhcmdldFR5cGUodGFyZ2V0KTtcbiAgICBpZiAodGFyZ2V0VHlwZSA9PT0gMCAvKiBUYXJnZXRUeXBlLklOVkFMSUQgKi8pIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0LCB0YXJnZXRUeXBlID09PSAyIC8qIFRhcmdldFR5cGUuQ09MTEVDVElPTiAqLyA/IGNvbGxlY3Rpb25IYW5kbGVycyA6IGJhc2VIYW5kbGVycyk7XG4gICAgcHJveHlNYXAuc2V0KHRhcmdldCwgcHJveHkpO1xuICAgIHJldHVybiBwcm94eTtcbn1cbmZ1bmN0aW9uIGlzUmVhY3RpdmUodmFsdWUpIHtcbiAgICBpZiAoaXNSZWFkb25seSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGlzUmVhY3RpdmUodmFsdWVbXCJfX3ZfcmF3XCIgLyogUmVhY3RpdmVGbGFncy5SQVcgKi9dKTtcbiAgICB9XG4gICAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlW1wiX192X2lzUmVhY3RpdmVcIiAvKiBSZWFjdGl2ZUZsYWdzLklTX1JFQUNUSVZFICovXSk7XG59XG5mdW5jdGlvbiBpc1JlYWRvbmx5KHZhbHVlKSB7XG4gICAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlW1wiX192X2lzUmVhZG9ubHlcIiAvKiBSZWFjdGl2ZUZsYWdzLklTX1JFQURPTkxZICovXSk7XG59XG5mdW5jdGlvbiBpc1NoYWxsb3codmFsdWUpIHtcbiAgICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWVbXCJfX3ZfaXNTaGFsbG93XCIgLyogUmVhY3RpdmVGbGFncy5JU19TSEFMTE9XICovXSk7XG59XG5mdW5jdGlvbiBpc1Byb3h5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzUmVhY3RpdmUodmFsdWUpIHx8IGlzUmVhZG9ubHkodmFsdWUpO1xufVxuZnVuY3Rpb24gdG9SYXcob2JzZXJ2ZWQpIHtcbiAgICBjb25zdCByYXcgPSBvYnNlcnZlZCAmJiBvYnNlcnZlZFtcIl9fdl9yYXdcIiAvKiBSZWFjdGl2ZUZsYWdzLlJBVyAqL107XG4gICAgcmV0dXJuIHJhdyA/IHRvUmF3KHJhdykgOiBvYnNlcnZlZDtcbn1cbmZ1bmN0aW9uIG1hcmtSYXcodmFsdWUpIHtcbiAgICBkZWYodmFsdWUsIFwiX192X3NraXBcIiAvKiBSZWFjdGl2ZUZsYWdzLlNLSVAgKi8sIHRydWUpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cbmNvbnN0IHRvUmVhY3RpdmUgPSAodmFsdWUpID0+IGlzT2JqZWN0KHZhbHVlKSA/IHJlYWN0aXZlKHZhbHVlKSA6IHZhbHVlO1xuY29uc3QgdG9SZWFkb25seSA9ICh2YWx1ZSkgPT4gaXNPYmplY3QodmFsdWUpID8gcmVhZG9ubHkodmFsdWUpIDogdmFsdWU7XG5cbmZ1bmN0aW9uIHRyYWNrUmVmVmFsdWUocmVmKSB7XG4gICAgaWYgKHNob3VsZFRyYWNrICYmIGFjdGl2ZUVmZmVjdCkge1xuICAgICAgICByZWYgPSB0b1JhdyhyZWYpO1xuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICB0cmFja0VmZmVjdHMocmVmLmRlcCB8fCAocmVmLmRlcCA9IGNyZWF0ZURlcCgpKSwge1xuICAgICAgICAgICAgICAgIHRhcmdldDogcmVmLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiZ2V0XCIgLyogVHJhY2tPcFR5cGVzLkdFVCAqLyxcbiAgICAgICAgICAgICAgICBrZXk6ICd2YWx1ZSdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdHJhY2tFZmZlY3RzKHJlZi5kZXAgfHwgKHJlZi5kZXAgPSBjcmVhdGVEZXAoKSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlclJlZlZhbHVlKHJlZiwgbmV3VmFsKSB7XG4gICAgcmVmID0gdG9SYXcocmVmKTtcbiAgICBjb25zdCBkZXAgPSByZWYuZGVwO1xuICAgIGlmIChkZXApIHtcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgdHJpZ2dlckVmZmVjdHMoZGVwLCB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiByZWYsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJzZXRcIiAvKiBUcmlnZ2VyT3BUeXBlcy5TRVQgKi8sXG4gICAgICAgICAgICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiBuZXdWYWxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdHJpZ2dlckVmZmVjdHMoZGVwKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGlzUmVmKHIpIHtcbiAgICByZXR1cm4gISEociAmJiByLl9fdl9pc1JlZiA9PT0gdHJ1ZSk7XG59XG5mdW5jdGlvbiByZWYodmFsdWUpIHtcbiAgICByZXR1cm4gY3JlYXRlUmVmKHZhbHVlLCBmYWxzZSk7XG59XG5mdW5jdGlvbiBzaGFsbG93UmVmKHZhbHVlKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVJlZih2YWx1ZSwgdHJ1ZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWYocmF3VmFsdWUsIHNoYWxsb3cpIHtcbiAgICBpZiAoaXNSZWYocmF3VmFsdWUpKSB7XG4gICAgICAgIHJldHVybiByYXdWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBSZWZJbXBsKHJhd1ZhbHVlLCBzaGFsbG93KTtcbn1cbmNsYXNzIFJlZkltcGwge1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlLCBfX3ZfaXNTaGFsbG93KSB7XG4gICAgICAgIHRoaXMuX192X2lzU2hhbGxvdyA9IF9fdl9pc1NoYWxsb3c7XG4gICAgICAgIHRoaXMuZGVwID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9fdl9pc1JlZiA9IHRydWU7XG4gICAgICAgIHRoaXMuX3Jhd1ZhbHVlID0gX192X2lzU2hhbGxvdyA/IHZhbHVlIDogdG9SYXcodmFsdWUpO1xuICAgICAgICB0aGlzLl92YWx1ZSA9IF9fdl9pc1NoYWxsb3cgPyB2YWx1ZSA6IHRvUmVhY3RpdmUodmFsdWUpO1xuICAgIH1cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHRyYWNrUmVmVmFsdWUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgc2V0IHZhbHVlKG5ld1ZhbCkge1xuICAgICAgICBjb25zdCB1c2VEaXJlY3RWYWx1ZSA9IHRoaXMuX192X2lzU2hhbGxvdyB8fCBpc1NoYWxsb3cobmV3VmFsKSB8fCBpc1JlYWRvbmx5KG5ld1ZhbCk7XG4gICAgICAgIG5ld1ZhbCA9IHVzZURpcmVjdFZhbHVlID8gbmV3VmFsIDogdG9SYXcobmV3VmFsKTtcbiAgICAgICAgaWYgKGhhc0NoYW5nZWQobmV3VmFsLCB0aGlzLl9yYXdWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jhd1ZhbHVlID0gbmV3VmFsO1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB1c2VEaXJlY3RWYWx1ZSA/IG5ld1ZhbCA6IHRvUmVhY3RpdmUobmV3VmFsKTtcbiAgICAgICAgICAgIHRyaWdnZXJSZWZWYWx1ZSh0aGlzLCBuZXdWYWwpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlclJlZihyZWYpIHtcbiAgICB0cmlnZ2VyUmVmVmFsdWUocmVmLCAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyByZWYudmFsdWUgOiB2b2lkIDApO1xufVxuZnVuY3Rpb24gdW5yZWYocmVmKSB7XG4gICAgcmV0dXJuIGlzUmVmKHJlZikgPyByZWYudmFsdWUgOiByZWY7XG59XG5jb25zdCBzaGFsbG93VW53cmFwSGFuZGxlcnMgPSB7XG4gICAgZ2V0OiAodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSA9PiB1bnJlZihSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpKSxcbiAgICBzZXQ6ICh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gICAgICAgIGlmIChpc1JlZihvbGRWYWx1ZSkgJiYgIWlzUmVmKHZhbHVlKSkge1xuICAgICAgICAgICAgb2xkVmFsdWUudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpO1xuICAgICAgICB9XG4gICAgfVxufTtcbmZ1bmN0aW9uIHByb3h5UmVmcyhvYmplY3RXaXRoUmVmcykge1xuICAgIHJldHVybiBpc1JlYWN0aXZlKG9iamVjdFdpdGhSZWZzKVxuICAgICAgICA/IG9iamVjdFdpdGhSZWZzXG4gICAgICAgIDogbmV3IFByb3h5KG9iamVjdFdpdGhSZWZzLCBzaGFsbG93VW53cmFwSGFuZGxlcnMpO1xufVxuY2xhc3MgQ3VzdG9tUmVmSW1wbCB7XG4gICAgY29uc3RydWN0b3IoZmFjdG9yeSkge1xuICAgICAgICB0aGlzLmRlcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fX3ZfaXNSZWYgPSB0cnVlO1xuICAgICAgICBjb25zdCB7IGdldCwgc2V0IH0gPSBmYWN0b3J5KCgpID0+IHRyYWNrUmVmVmFsdWUodGhpcyksICgpID0+IHRyaWdnZXJSZWZWYWx1ZSh0aGlzKSk7XG4gICAgICAgIHRoaXMuX2dldCA9IGdldDtcbiAgICAgICAgdGhpcy5fc2V0ID0gc2V0O1xuICAgIH1cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXQoKTtcbiAgICB9XG4gICAgc2V0IHZhbHVlKG5ld1ZhbCkge1xuICAgICAgICB0aGlzLl9zZXQobmV3VmFsKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjdXN0b21SZWYoZmFjdG9yeSkge1xuICAgIHJldHVybiBuZXcgQ3VzdG9tUmVmSW1wbChmYWN0b3J5KTtcbn1cbmZ1bmN0aW9uIHRvUmVmcyhvYmplY3QpIHtcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmICFpc1Byb3h5KG9iamVjdCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGB0b1JlZnMoKSBleHBlY3RzIGEgcmVhY3RpdmUgb2JqZWN0IGJ1dCByZWNlaXZlZCBhIHBsYWluIG9uZS5gKTtcbiAgICB9XG4gICAgY29uc3QgcmV0ID0gaXNBcnJheShvYmplY3QpID8gbmV3IEFycmF5KG9iamVjdC5sZW5ndGgpIDoge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgIHJldFtrZXldID0gdG9SZWYob2JqZWN0LCBrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuY2xhc3MgT2JqZWN0UmVmSW1wbCB7XG4gICAgY29uc3RydWN0b3IoX29iamVjdCwgX2tleSwgX2RlZmF1bHRWYWx1ZSkge1xuICAgICAgICB0aGlzLl9vYmplY3QgPSBfb2JqZWN0O1xuICAgICAgICB0aGlzLl9rZXkgPSBfa2V5O1xuICAgICAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSBfZGVmYXVsdFZhbHVlO1xuICAgICAgICB0aGlzLl9fdl9pc1JlZiA9IHRydWU7XG4gICAgfVxuICAgIGdldCB2YWx1ZSgpIHtcbiAgICAgICAgY29uc3QgdmFsID0gdGhpcy5fb2JqZWN0W3RoaXMuX2tleV07XG4gICAgICAgIHJldHVybiB2YWwgPT09IHVuZGVmaW5lZCA/IHRoaXMuX2RlZmF1bHRWYWx1ZSA6IHZhbDtcbiAgICB9XG4gICAgc2V0IHZhbHVlKG5ld1ZhbCkge1xuICAgICAgICB0aGlzLl9vYmplY3RbdGhpcy5fa2V5XSA9IG5ld1ZhbDtcbiAgICB9XG4gICAgZ2V0IGRlcCgpIHtcbiAgICAgICAgcmV0dXJuIGdldERlcEZyb21SZWFjdGl2ZSh0b1Jhdyh0aGlzLl9vYmplY3QpLCB0aGlzLl9rZXkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRvUmVmKG9iamVjdCwga2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgICBjb25zdCB2YWwgPSBvYmplY3Rba2V5XTtcbiAgICByZXR1cm4gaXNSZWYodmFsKVxuICAgICAgICA/IHZhbFxuICAgICAgICA6IG5ldyBPYmplY3RSZWZJbXBsKG9iamVjdCwga2V5LCBkZWZhdWx0VmFsdWUpO1xufVxuXG52YXIgX2EkMTtcbmNsYXNzIENvbXB1dGVkUmVmSW1wbCB7XG4gICAgY29uc3RydWN0b3IoZ2V0dGVyLCBfc2V0dGVyLCBpc1JlYWRvbmx5LCBpc1NTUikge1xuICAgICAgICB0aGlzLl9zZXR0ZXIgPSBfc2V0dGVyO1xuICAgICAgICB0aGlzLmRlcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fX3ZfaXNSZWYgPSB0cnVlO1xuICAgICAgICB0aGlzW19hJDFdID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lZmZlY3QgPSBuZXcgUmVhY3RpdmVFZmZlY3QoZ2V0dGVyLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2RpcnR5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyaWdnZXJSZWZWYWx1ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWZmZWN0LmNvbXB1dGVkID0gdGhpcztcbiAgICAgICAgdGhpcy5lZmZlY3QuYWN0aXZlID0gdGhpcy5fY2FjaGVhYmxlID0gIWlzU1NSO1xuICAgICAgICB0aGlzW1wiX192X2lzUmVhZG9ubHlcIiAvKiBSZWFjdGl2ZUZsYWdzLklTX1JFQURPTkxZICovXSA9IGlzUmVhZG9ubHk7XG4gICAgfVxuICAgIGdldCB2YWx1ZSgpIHtcbiAgICAgICAgLy8gdGhlIGNvbXB1dGVkIHJlZiBtYXkgZ2V0IHdyYXBwZWQgYnkgb3RoZXIgcHJveGllcyBlLmcuIHJlYWRvbmx5KCkgIzMzNzZcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRvUmF3KHRoaXMpO1xuICAgICAgICB0cmFja1JlZlZhbHVlKHNlbGYpO1xuICAgICAgICBpZiAoc2VsZi5fZGlydHkgfHwgIXNlbGYuX2NhY2hlYWJsZSkge1xuICAgICAgICAgICAgc2VsZi5fZGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgIHNlbGYuX3ZhbHVlID0gc2VsZi5lZmZlY3QucnVuKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbHVlO1xuICAgIH1cbiAgICBzZXQgdmFsdWUobmV3VmFsdWUpIHtcbiAgICAgICAgdGhpcy5fc2V0dGVyKG5ld1ZhbHVlKTtcbiAgICB9XG59XG5fYSQxID0gXCJfX3ZfaXNSZWFkb25seVwiIC8qIFJlYWN0aXZlRmxhZ3MuSVNfUkVBRE9OTFkgKi87XG5mdW5jdGlvbiBjb21wdXRlZChnZXR0ZXJPck9wdGlvbnMsIGRlYnVnT3B0aW9ucywgaXNTU1IgPSBmYWxzZSkge1xuICAgIGxldCBnZXR0ZXI7XG4gICAgbGV0IHNldHRlcjtcbiAgICBjb25zdCBvbmx5R2V0dGVyID0gaXNGdW5jdGlvbihnZXR0ZXJPck9wdGlvbnMpO1xuICAgIGlmIChvbmx5R2V0dGVyKSB7XG4gICAgICAgIGdldHRlciA9IGdldHRlck9yT3B0aW9ucztcbiAgICAgICAgc2V0dGVyID0gKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpXG4gICAgICAgICAgICA/ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1dyaXRlIG9wZXJhdGlvbiBmYWlsZWQ6IGNvbXB1dGVkIHZhbHVlIGlzIHJlYWRvbmx5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IE5PT1A7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBnZXR0ZXIgPSBnZXR0ZXJPck9wdGlvbnMuZ2V0O1xuICAgICAgICBzZXR0ZXIgPSBnZXR0ZXJPck9wdGlvbnMuc2V0O1xuICAgIH1cbiAgICBjb25zdCBjUmVmID0gbmV3IENvbXB1dGVkUmVmSW1wbChnZXR0ZXIsIHNldHRlciwgb25seUdldHRlciB8fCAhc2V0dGVyLCBpc1NTUik7XG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiBkZWJ1Z09wdGlvbnMgJiYgIWlzU1NSKSB7XG4gICAgICAgIGNSZWYuZWZmZWN0Lm9uVHJhY2sgPSBkZWJ1Z09wdGlvbnMub25UcmFjaztcbiAgICAgICAgY1JlZi5lZmZlY3Qub25UcmlnZ2VyID0gZGVidWdPcHRpb25zLm9uVHJpZ2dlcjtcbiAgICB9XG4gICAgcmV0dXJuIGNSZWY7XG59XG5cbnZhciBfYTtcbmNvbnN0IHRpY2sgPSAvKiNfX1BVUkVfXyovIFByb21pc2UucmVzb2x2ZSgpO1xuY29uc3QgcXVldWUgPSBbXTtcbmxldCBxdWV1ZWQgPSBmYWxzZTtcbmNvbnN0IHNjaGVkdWxlciA9IChmbikgPT4ge1xuICAgIHF1ZXVlLnB1c2goZm4pO1xuICAgIGlmICghcXVldWVkKSB7XG4gICAgICAgIHF1ZXVlZCA9IHRydWU7XG4gICAgICAgIHRpY2sudGhlbihmbHVzaCk7XG4gICAgfVxufTtcbmNvbnN0IGZsdXNoID0gKCkgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcXVldWVbaV0oKTtcbiAgICB9XG4gICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICBxdWV1ZWQgPSBmYWxzZTtcbn07XG5jbGFzcyBEZWZlcnJlZENvbXB1dGVkUmVmSW1wbCB7XG4gICAgY29uc3RydWN0b3IoZ2V0dGVyKSB7XG4gICAgICAgIHRoaXMuZGVwID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuX192X2lzUmVmID0gdHJ1ZTtcbiAgICAgICAgdGhpc1tfYV0gPSB0cnVlO1xuICAgICAgICBsZXQgY29tcGFyZVRhcmdldDtcbiAgICAgICAgbGV0IGhhc0NvbXBhcmVUYXJnZXQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHNjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVmZmVjdCA9IG5ldyBSZWFjdGl2ZUVmZmVjdChnZXR0ZXIsIChjb21wdXRlZFRyaWdnZXIpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlcCkge1xuICAgICAgICAgICAgICAgIGlmIChjb21wdXRlZFRyaWdnZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGFyZVRhcmdldCA9IHRoaXMuX3ZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBoYXNDb21wYXJlVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXNjaGVkdWxlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZVRvQ29tcGFyZSA9IGhhc0NvbXBhcmVUYXJnZXQgPyBjb21wYXJlVGFyZ2V0IDogdGhpcy5fdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGhhc0NvbXBhcmVUYXJnZXQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVmZmVjdC5hY3RpdmUgJiYgdGhpcy5fZ2V0KCkgIT09IHZhbHVlVG9Db21wYXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlZlZhbHVlKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBjaGFpbmVkIHVwc3RyZWFtIGNvbXB1dGVkcyBhcmUgbm90aWZpZWQgc3luY2hyb25vdXNseSB0byBlbnN1cmVcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpbnZhbGlkYXRpb24gaW4gY2FzZSBvZiBzeW5jIGFjY2Vzczsgbm9ybWFsIGVmZmVjdHMgYXJlXG4gICAgICAgICAgICAgICAgLy8gZGVmZXJyZWQgdG8gYmUgdHJpZ2dlcmVkIGluIHNjaGVkdWxlci5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5kZXApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuY29tcHV0ZWQgaW5zdGFuY2VvZiBEZWZlcnJlZENvbXB1dGVkUmVmSW1wbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5zY2hlZHVsZXIodHJ1ZSAvKiBjb21wdXRlZFRyaWdnZXIgKi8pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lZmZlY3QuY29tcHV0ZWQgPSB0aGlzO1xuICAgIH1cbiAgICBfZ2V0KCkge1xuICAgICAgICBpZiAodGhpcy5fZGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuX3ZhbHVlID0gdGhpcy5lZmZlY3QucnVuKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICB0cmFja1JlZlZhbHVlKHRoaXMpO1xuICAgICAgICAvLyB0aGUgY29tcHV0ZWQgcmVmIG1heSBnZXQgd3JhcHBlZCBieSBvdGhlciBwcm94aWVzIGUuZy4gcmVhZG9ubHkoKSAjMzM3NlxuICAgICAgICByZXR1cm4gdG9SYXcodGhpcykuX2dldCgpO1xuICAgIH1cbn1cbl9hID0gXCJfX3ZfaXNSZWFkb25seVwiIC8qIFJlYWN0aXZlRmxhZ3MuSVNfUkVBRE9OTFkgKi87XG5mdW5jdGlvbiBkZWZlcnJlZENvbXB1dGVkKGdldHRlcikge1xuICAgIHJldHVybiBuZXcgRGVmZXJyZWRDb21wdXRlZFJlZkltcGwoZ2V0dGVyKTtcbn1cblxuZXhwb3J0IHsgRWZmZWN0U2NvcGUsIElURVJBVEVfS0VZLCBSZWFjdGl2ZUVmZmVjdCwgY29tcHV0ZWQsIGN1c3RvbVJlZiwgZGVmZXJyZWRDb21wdXRlZCwgZWZmZWN0LCBlZmZlY3RTY29wZSwgZW5hYmxlVHJhY2tpbmcsIGdldEN1cnJlbnRTY29wZSwgaXNQcm94eSwgaXNSZWFjdGl2ZSwgaXNSZWFkb25seSwgaXNSZWYsIGlzU2hhbGxvdywgbWFya1Jhdywgb25TY29wZURpc3Bvc2UsIHBhdXNlVHJhY2tpbmcsIHByb3h5UmVmcywgcmVhY3RpdmUsIHJlYWRvbmx5LCByZWYsIHJlc2V0VHJhY2tpbmcsIHNoYWxsb3dSZWFjdGl2ZSwgc2hhbGxvd1JlYWRvbmx5LCBzaGFsbG93UmVmLCBzdG9wLCB0b1JhdywgdG9SZWYsIHRvUmVmcywgdHJhY2ssIHRyaWdnZXIsIHRyaWdnZXJSZWYsIHVucmVmIH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js\n");

/***/ }),

/***/ "./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js":
/*!*************************************************************************!*\
  !*** ./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js ***!
  \*************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"BaseTransition\": () => (/* binding */ BaseTransition),\n/* harmony export */   \"Comment\": () => (/* binding */ Comment),\n/* harmony export */   \"EffectScope\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.EffectScope),\n/* harmony export */   \"Fragment\": () => (/* binding */ Fragment),\n/* harmony export */   \"KeepAlive\": () => (/* binding */ KeepAlive),\n/* harmony export */   \"ReactiveEffect\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ReactiveEffect),\n/* harmony export */   \"Static\": () => (/* binding */ Static),\n/* harmony export */   \"Suspense\": () => (/* binding */ Suspense),\n/* harmony export */   \"Teleport\": () => (/* binding */ Teleport),\n/* harmony export */   \"Text\": () => (/* binding */ Text),\n/* harmony export */   \"assertNumber\": () => (/* binding */ assertNumber),\n/* harmony export */   \"callWithAsyncErrorHandling\": () => (/* binding */ callWithAsyncErrorHandling),\n/* harmony export */   \"callWithErrorHandling\": () => (/* binding */ callWithErrorHandling),\n/* harmony export */   \"camelize\": () => (/* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize),\n/* harmony export */   \"capitalize\": () => (/* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize),\n/* harmony export */   \"cloneVNode\": () => (/* binding */ cloneVNode),\n/* harmony export */   \"compatUtils\": () => (/* binding */ compatUtils),\n/* harmony export */   \"computed\": () => (/* binding */ computed),\n/* harmony export */   \"createBlock\": () => (/* binding */ createBlock),\n/* harmony export */   \"createCommentVNode\": () => (/* binding */ createCommentVNode),\n/* harmony export */   \"createElementBlock\": () => (/* binding */ createElementBlock),\n/* harmony export */   \"createElementVNode\": () => (/* binding */ createBaseVNode),\n/* harmony export */   \"createHydrationRenderer\": () => (/* binding */ createHydrationRenderer),\n/* harmony export */   \"createPropsRestProxy\": () => (/* binding */ createPropsRestProxy),\n/* harmony export */   \"createRenderer\": () => (/* binding */ createRenderer),\n/* harmony export */   \"createSlots\": () => (/* binding */ createSlots),\n/* harmony export */   \"createStaticVNode\": () => (/* binding */ createStaticVNode),\n/* harmony export */   \"createTextVNode\": () => (/* binding */ createTextVNode),\n/* harmony export */   \"createVNode\": () => (/* binding */ createVNode),\n/* harmony export */   \"customRef\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.customRef),\n/* harmony export */   \"defineAsyncComponent\": () => (/* binding */ defineAsyncComponent),\n/* harmony export */   \"defineComponent\": () => (/* binding */ defineComponent),\n/* harmony export */   \"defineEmits\": () => (/* binding */ defineEmits),\n/* harmony export */   \"defineExpose\": () => (/* binding */ defineExpose),\n/* harmony export */   \"defineProps\": () => (/* binding */ defineProps),\n/* harmony export */   \"devtools\": () => (/* binding */ devtools),\n/* harmony export */   \"effect\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.effect),\n/* harmony export */   \"effectScope\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.effectScope),\n/* harmony export */   \"getCurrentInstance\": () => (/* binding */ getCurrentInstance),\n/* harmony export */   \"getCurrentScope\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.getCurrentScope),\n/* harmony export */   \"getTransitionRawChildren\": () => (/* binding */ getTransitionRawChildren),\n/* harmony export */   \"guardReactiveProps\": () => (/* binding */ guardReactiveProps),\n/* harmony export */   \"h\": () => (/* binding */ h),\n/* harmony export */   \"handleError\": () => (/* binding */ handleError),\n/* harmony export */   \"initCustomFormatter\": () => (/* binding */ initCustomFormatter),\n/* harmony export */   \"inject\": () => (/* binding */ inject),\n/* harmony export */   \"isMemoSame\": () => (/* binding */ isMemoSame),\n/* harmony export */   \"isProxy\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isProxy),\n/* harmony export */   \"isReactive\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive),\n/* harmony export */   \"isReadonly\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReadonly),\n/* harmony export */   \"isRef\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef),\n/* harmony export */   \"isRuntimeOnly\": () => (/* binding */ isRuntimeOnly),\n/* harmony export */   \"isShallow\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isShallow),\n/* harmony export */   \"isVNode\": () => (/* binding */ isVNode),\n/* harmony export */   \"markRaw\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.markRaw),\n/* harmony export */   \"mergeDefaults\": () => (/* binding */ mergeDefaults),\n/* harmony export */   \"mergeProps\": () => (/* binding */ mergeProps),\n/* harmony export */   \"nextTick\": () => (/* binding */ nextTick),\n/* harmony export */   \"normalizeClass\": () => (/* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeClass),\n/* harmony export */   \"normalizeProps\": () => (/* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeProps),\n/* harmony export */   \"normalizeStyle\": () => (/* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeStyle),\n/* harmony export */   \"onActivated\": () => (/* binding */ onActivated),\n/* harmony export */   \"onBeforeMount\": () => (/* binding */ onBeforeMount),\n/* harmony export */   \"onBeforeUnmount\": () => (/* binding */ onBeforeUnmount),\n/* harmony export */   \"onBeforeUpdate\": () => (/* binding */ onBeforeUpdate),\n/* harmony export */   \"onDeactivated\": () => (/* binding */ onDeactivated),\n/* harmony export */   \"onErrorCaptured\": () => (/* binding */ onErrorCaptured),\n/* harmony export */   \"onMounted\": () => (/* binding */ onMounted),\n/* harmony export */   \"onRenderTracked\": () => (/* binding */ onRenderTracked),\n/* harmony export */   \"onRenderTriggered\": () => (/* binding */ onRenderTriggered),\n/* harmony export */   \"onScopeDispose\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.onScopeDispose),\n/* harmony export */   \"onServerPrefetch\": () => (/* binding */ onServerPrefetch),\n/* harmony export */   \"onUnmounted\": () => (/* binding */ onUnmounted),\n/* harmony export */   \"onUpdated\": () => (/* binding */ onUpdated),\n/* harmony export */   \"openBlock\": () => (/* binding */ openBlock),\n/* harmony export */   \"popScopeId\": () => (/* binding */ popScopeId),\n/* harmony export */   \"provide\": () => (/* binding */ provide),\n/* harmony export */   \"proxyRefs\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.proxyRefs),\n/* harmony export */   \"pushScopeId\": () => (/* binding */ pushScopeId),\n/* harmony export */   \"queuePostFlushCb\": () => (/* binding */ queuePostFlushCb),\n/* harmony export */   \"reactive\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.reactive),\n/* harmony export */   \"readonly\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.readonly),\n/* harmony export */   \"ref\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref),\n/* harmony export */   \"registerRuntimeCompiler\": () => (/* binding */ registerRuntimeCompiler),\n/* harmony export */   \"renderList\": () => (/* binding */ renderList),\n/* harmony export */   \"renderSlot\": () => (/* binding */ renderSlot),\n/* harmony export */   \"resolveComponent\": () => (/* binding */ resolveComponent),\n/* harmony export */   \"resolveDirective\": () => (/* binding */ resolveDirective),\n/* harmony export */   \"resolveDynamicComponent\": () => (/* binding */ resolveDynamicComponent),\n/* harmony export */   \"resolveFilter\": () => (/* binding */ resolveFilter),\n/* harmony export */   \"resolveTransitionHooks\": () => (/* binding */ resolveTransitionHooks),\n/* harmony export */   \"setBlockTracking\": () => (/* binding */ setBlockTracking),\n/* harmony export */   \"setDevtoolsHook\": () => (/* binding */ setDevtoolsHook),\n/* harmony export */   \"setTransitionHooks\": () => (/* binding */ setTransitionHooks),\n/* harmony export */   \"shallowReactive\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReactive),\n/* harmony export */   \"shallowReadonly\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly),\n/* harmony export */   \"shallowRef\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowRef),\n/* harmony export */   \"ssrContextKey\": () => (/* binding */ ssrContextKey),\n/* harmony export */   \"ssrUtils\": () => (/* binding */ ssrUtils),\n/* harmony export */   \"stop\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.stop),\n/* harmony export */   \"toDisplayString\": () => (/* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.toDisplayString),\n/* harmony export */   \"toHandlerKey\": () => (/* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey),\n/* harmony export */   \"toHandlers\": () => (/* binding */ toHandlers),\n/* harmony export */   \"toRaw\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw),\n/* harmony export */   \"toRef\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRef),\n/* harmony export */   \"toRefs\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRefs),\n/* harmony export */   \"transformVNodeArgs\": () => (/* binding */ transformVNodeArgs),\n/* harmony export */   \"triggerRef\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.triggerRef),\n/* harmony export */   \"unref\": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.unref),\n/* harmony export */   \"useAttrs\": () => (/* binding */ useAttrs),\n/* harmony export */   \"useSSRContext\": () => (/* binding */ useSSRContext),\n/* harmony export */   \"useSlots\": () => (/* binding */ useSlots),\n/* harmony export */   \"useTransitionState\": () => (/* binding */ useTransitionState),\n/* harmony export */   \"version\": () => (/* binding */ version),\n/* harmony export */   \"warn\": () => (/* binding */ warn),\n/* harmony export */   \"watch\": () => (/* binding */ watch),\n/* harmony export */   \"watchEffect\": () => (/* binding */ watchEffect),\n/* harmony export */   \"watchPostEffect\": () => (/* binding */ watchPostEffect),\n/* harmony export */   \"watchSyncEffect\": () => (/* binding */ watchSyncEffect),\n/* harmony export */   \"withAsyncContext\": () => (/* binding */ withAsyncContext),\n/* harmony export */   \"withCtx\": () => (/* binding */ withCtx),\n/* harmony export */   \"withDefaults\": () => (/* binding */ withDefaults),\n/* harmony export */   \"withDirectives\": () => (/* binding */ withDirectives),\n/* harmony export */   \"withMemo\": () => (/* binding */ withMemo),\n/* harmony export */   \"withScopeId\": () => (/* binding */ withScopeId)\n/* harmony export */ });\n/* harmony import */ var _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/reactivity */ \"./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js\");\n/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/shared */ \"./node_modules/@vue/shared/dist/shared.esm-bundler.js\");\n\n\n\n\n\nconst stack = [];\nfunction pushWarningContext(vnode) {\n    stack.push(vnode);\n}\nfunction popWarningContext() {\n    stack.pop();\n}\nfunction warn(msg, ...args) {\n    if (false)\n        {}\n    // avoid props formatting or warn handler tracking deps that might be mutated\n    // during patch, leading to infinite recursion.\n    (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();\n    const instance = stack.length ? stack[stack.length - 1].component : null;\n    const appWarnHandler = instance && instance.appContext.config.warnHandler;\n    const trace = getComponentTrace();\n    if (appWarnHandler) {\n        callWithErrorHandling(appWarnHandler, instance, 11 /* ErrorCodes.APP_WARN_HANDLER */, [\n            msg + args.join(''),\n            instance && instance.proxy,\n            trace\n                .map(({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`)\n                .join('\\n'),\n            trace\n        ]);\n    }\n    else {\n        const warnArgs = [`[Vue warn]: ${msg}`, ...args];\n        /* istanbul ignore if */\n        if (trace.length &&\n            // avoid spamming console during tests\n            !false) {\n            warnArgs.push(`\\n`, ...formatTrace(trace));\n        }\n        console.warn(...warnArgs);\n    }\n    (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();\n}\nfunction getComponentTrace() {\n    let currentVNode = stack[stack.length - 1];\n    if (!currentVNode) {\n        return [];\n    }\n    // we can't just use the stack because it will be incomplete during updates\n    // that did not start from the root. Re-construct the parent chain using\n    // instance parent pointers.\n    const normalizedStack = [];\n    while (currentVNode) {\n        const last = normalizedStack[0];\n        if (last && last.vnode === currentVNode) {\n            last.recurseCount++;\n        }\n        else {\n            normalizedStack.push({\n                vnode: currentVNode,\n                recurseCount: 0\n            });\n        }\n        const parentInstance = currentVNode.component && currentVNode.component.parent;\n        currentVNode = parentInstance && parentInstance.vnode;\n    }\n    return normalizedStack;\n}\n/* istanbul ignore next */\nfunction formatTrace(trace) {\n    const logs = [];\n    trace.forEach((entry, i) => {\n        logs.push(...(i === 0 ? [] : [`\\n`]), ...formatTraceEntry(entry));\n    });\n    return logs;\n}\nfunction formatTraceEntry({ vnode, recurseCount }) {\n    const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;\n    const isRoot = vnode.component ? vnode.component.parent == null : false;\n    const open = ` at <${formatComponentName(vnode.component, vnode.type, isRoot)}`;\n    const close = `>` + postfix;\n    return vnode.props\n        ? [open, ...formatProps(vnode.props), close]\n        : [open + close];\n}\n/* istanbul ignore next */\nfunction formatProps(props) {\n    const res = [];\n    const keys = Object.keys(props);\n    keys.slice(0, 3).forEach(key => {\n        res.push(...formatProp(key, props[key]));\n    });\n    if (keys.length > 3) {\n        res.push(` ...`);\n    }\n    return res;\n}\n/* istanbul ignore next */\nfunction formatProp(key, value, raw) {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(value)) {\n        value = JSON.stringify(value);\n        return raw ? value : [`${key}=${value}`];\n    }\n    else if (typeof value === 'number' ||\n        typeof value === 'boolean' ||\n        value == null) {\n        return raw ? value : [`${key}=${value}`];\n    }\n    else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(value)) {\n        value = formatProp(key, (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(value.value), true);\n        return raw ? value : [`${key}=Ref<`, value, `>`];\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value)) {\n        return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];\n    }\n    else {\n        value = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(value);\n        return raw ? value : [`${key}=`, value];\n    }\n}\n/**\n * @internal\n */\nfunction assertNumber(val, type) {\n    if (false)\n        {}\n    if (val === undefined) {\n        return;\n    }\n    else if (typeof val !== 'number') {\n        warn(`${type} is not a valid number - ` + `got ${JSON.stringify(val)}.`);\n    }\n    else if (isNaN(val)) {\n        warn(`${type} is NaN - ` + 'the duration expression might be incorrect.');\n    }\n}\n\nconst ErrorTypeStrings = {\n    [\"sp\" /* LifecycleHooks.SERVER_PREFETCH */]: 'serverPrefetch hook',\n    [\"bc\" /* LifecycleHooks.BEFORE_CREATE */]: 'beforeCreate hook',\n    [\"c\" /* LifecycleHooks.CREATED */]: 'created hook',\n    [\"bm\" /* LifecycleHooks.BEFORE_MOUNT */]: 'beforeMount hook',\n    [\"m\" /* LifecycleHooks.MOUNTED */]: 'mounted hook',\n    [\"bu\" /* LifecycleHooks.BEFORE_UPDATE */]: 'beforeUpdate hook',\n    [\"u\" /* LifecycleHooks.UPDATED */]: 'updated',\n    [\"bum\" /* LifecycleHooks.BEFORE_UNMOUNT */]: 'beforeUnmount hook',\n    [\"um\" /* LifecycleHooks.UNMOUNTED */]: 'unmounted hook',\n    [\"a\" /* LifecycleHooks.ACTIVATED */]: 'activated hook',\n    [\"da\" /* LifecycleHooks.DEACTIVATED */]: 'deactivated hook',\n    [\"ec\" /* LifecycleHooks.ERROR_CAPTURED */]: 'errorCaptured hook',\n    [\"rtc\" /* LifecycleHooks.RENDER_TRACKED */]: 'renderTracked hook',\n    [\"rtg\" /* LifecycleHooks.RENDER_TRIGGERED */]: 'renderTriggered hook',\n    [0 /* ErrorCodes.SETUP_FUNCTION */]: 'setup function',\n    [1 /* ErrorCodes.RENDER_FUNCTION */]: 'render function',\n    [2 /* ErrorCodes.WATCH_GETTER */]: 'watcher getter',\n    [3 /* ErrorCodes.WATCH_CALLBACK */]: 'watcher callback',\n    [4 /* ErrorCodes.WATCH_CLEANUP */]: 'watcher cleanup function',\n    [5 /* ErrorCodes.NATIVE_EVENT_HANDLER */]: 'native event handler',\n    [6 /* ErrorCodes.COMPONENT_EVENT_HANDLER */]: 'component event handler',\n    [7 /* ErrorCodes.VNODE_HOOK */]: 'vnode hook',\n    [8 /* ErrorCodes.DIRECTIVE_HOOK */]: 'directive hook',\n    [9 /* ErrorCodes.TRANSITION_HOOK */]: 'transition hook',\n    [10 /* ErrorCodes.APP_ERROR_HANDLER */]: 'app errorHandler',\n    [11 /* ErrorCodes.APP_WARN_HANDLER */]: 'app warnHandler',\n    [12 /* ErrorCodes.FUNCTION_REF */]: 'ref function',\n    [13 /* ErrorCodes.ASYNC_COMPONENT_LOADER */]: 'async component loader',\n    [14 /* ErrorCodes.SCHEDULER */]: 'scheduler flush. This is likely a Vue internals bug. ' +\n        'Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/core'\n};\nfunction callWithErrorHandling(fn, instance, type, args) {\n    let res;\n    try {\n        res = args ? fn(...args) : fn();\n    }\n    catch (err) {\n        handleError(err, instance, type);\n    }\n    return res;\n}\nfunction callWithAsyncErrorHandling(fn, instance, type, args) {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(fn)) {\n        const res = callWithErrorHandling(fn, instance, type, args);\n        if (res && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPromise)(res)) {\n            res.catch(err => {\n                handleError(err, instance, type);\n            });\n        }\n        return res;\n    }\n    const values = [];\n    for (let i = 0; i < fn.length; i++) {\n        values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));\n    }\n    return values;\n}\nfunction handleError(err, instance, type, throwInDev = true) {\n    const contextVNode = instance ? instance.vnode : null;\n    if (instance) {\n        let cur = instance.parent;\n        // the exposed instance is the render proxy to keep it consistent with 2.x\n        const exposedInstance = instance.proxy;\n        // in production the hook receives only the error code\n        const errorInfo = ( true) ? ErrorTypeStrings[type] : 0;\n        while (cur) {\n            const errorCapturedHooks = cur.ec;\n            if (errorCapturedHooks) {\n                for (let i = 0; i < errorCapturedHooks.length; i++) {\n                    if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {\n                        return;\n                    }\n                }\n            }\n            cur = cur.parent;\n        }\n        // app-level handling\n        const appErrorHandler = instance.appContext.config.errorHandler;\n        if (appErrorHandler) {\n            callWithErrorHandling(appErrorHandler, null, 10 /* ErrorCodes.APP_ERROR_HANDLER */, [err, exposedInstance, errorInfo]);\n            return;\n        }\n    }\n    logError(err, type, contextVNode, throwInDev);\n}\nfunction logError(err, type, contextVNode, throwInDev = true) {\n    if ((true)) {\n        const info = ErrorTypeStrings[type];\n        if (contextVNode) {\n            pushWarningContext(contextVNode);\n        }\n        warn(`Unhandled error${info ? ` during execution of ${info}` : ``}`);\n        if (contextVNode) {\n            popWarningContext();\n        }\n        // crash in dev by default so it's more noticeable\n        if (throwInDev) {\n            throw err;\n        }\n        else {\n            console.error(err);\n        }\n    }\n    else {}\n}\n\nlet isFlushing = false;\nlet isFlushPending = false;\nconst queue = [];\nlet flushIndex = 0;\nconst pendingPostFlushCbs = [];\nlet activePostFlushCbs = null;\nlet postFlushIndex = 0;\nconst resolvedPromise = /*#__PURE__*/ Promise.resolve();\nlet currentFlushPromise = null;\nconst RECURSION_LIMIT = 100;\nfunction nextTick(fn) {\n    const p = currentFlushPromise || resolvedPromise;\n    return fn ? p.then(this ? fn.bind(this) : fn) : p;\n}\n// #2768\n// Use binary-search to find a suitable position in the queue,\n// so that the queue maintains the increasing order of job's id,\n// which can prevent the job from being skipped and also can avoid repeated patching.\nfunction findInsertionIndex(id) {\n    // the start index should be `flushIndex + 1`\n    let start = flushIndex + 1;\n    let end = queue.length;\n    while (start < end) {\n        const middle = (start + end) >>> 1;\n        const middleJobId = getId(queue[middle]);\n        middleJobId < id ? (start = middle + 1) : (end = middle);\n    }\n    return start;\n}\nfunction queueJob(job) {\n    // the dedupe search uses the startIndex argument of Array.includes()\n    // by default the search index includes the current job that is being run\n    // so it cannot recursively trigger itself again.\n    // if the job is a watch() callback, the search will start with a +1 index to\n    // allow it recursively trigger itself - it is the user's responsibility to\n    // ensure it doesn't end up in an infinite loop.\n    if (!queue.length ||\n        !queue.includes(job, isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex)) {\n        if (job.id == null) {\n            queue.push(job);\n        }\n        else {\n            queue.splice(findInsertionIndex(job.id), 0, job);\n        }\n        queueFlush();\n    }\n}\nfunction queueFlush() {\n    if (!isFlushing && !isFlushPending) {\n        isFlushPending = true;\n        currentFlushPromise = resolvedPromise.then(flushJobs);\n    }\n}\nfunction invalidateJob(job) {\n    const i = queue.indexOf(job);\n    if (i > flushIndex) {\n        queue.splice(i, 1);\n    }\n}\nfunction queuePostFlushCb(cb) {\n    if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(cb)) {\n        if (!activePostFlushCbs ||\n            !activePostFlushCbs.includes(cb, cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex)) {\n            pendingPostFlushCbs.push(cb);\n        }\n    }\n    else {\n        // if cb is an array, it is a component lifecycle hook which can only be\n        // triggered by a job, which is already deduped in the main queue, so\n        // we can skip duplicate check here to improve perf\n        pendingPostFlushCbs.push(...cb);\n    }\n    queueFlush();\n}\nfunction flushPreFlushCbs(seen, \n// if currently flushing, skip the current job itself\ni = isFlushing ? flushIndex + 1 : 0) {\n    if ((true)) {\n        seen = seen || new Map();\n    }\n    for (; i < queue.length; i++) {\n        const cb = queue[i];\n        if (cb && cb.pre) {\n            if (( true) && checkRecursiveUpdates(seen, cb)) {\n                continue;\n            }\n            queue.splice(i, 1);\n            i--;\n            cb();\n        }\n    }\n}\nfunction flushPostFlushCbs(seen) {\n    if (pendingPostFlushCbs.length) {\n        const deduped = [...new Set(pendingPostFlushCbs)];\n        pendingPostFlushCbs.length = 0;\n        // #1947 already has active queue, nested flushPostFlushCbs call\n        if (activePostFlushCbs) {\n            activePostFlushCbs.push(...deduped);\n            return;\n        }\n        activePostFlushCbs = deduped;\n        if ((true)) {\n            seen = seen || new Map();\n        }\n        activePostFlushCbs.sort((a, b) => getId(a) - getId(b));\n        for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {\n            if (( true) &&\n                checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex])) {\n                continue;\n            }\n            activePostFlushCbs[postFlushIndex]();\n        }\n        activePostFlushCbs = null;\n        postFlushIndex = 0;\n    }\n}\nconst getId = (job) => job.id == null ? Infinity : job.id;\nconst comparator = (a, b) => {\n    const diff = getId(a) - getId(b);\n    if (diff === 0) {\n        if (a.pre && !b.pre)\n            return -1;\n        if (b.pre && !a.pre)\n            return 1;\n    }\n    return diff;\n};\nfunction flushJobs(seen) {\n    isFlushPending = false;\n    isFlushing = true;\n    if ((true)) {\n        seen = seen || new Map();\n    }\n    // Sort queue before flush.\n    // This ensures that:\n    // 1. Components are updated from parent to child. (because parent is always\n    //    created before the child so its render effect will have smaller\n    //    priority number)\n    // 2. If a component is unmounted during a parent component's update,\n    //    its update can be skipped.\n    queue.sort(comparator);\n    // conditional usage of checkRecursiveUpdate must be determined out of\n    // try ... catch block since Rollup by default de-optimizes treeshaking\n    // inside try-catch. This can leave all warning code unshaked. Although\n    // they would get eventually shaken by a minifier like terser, some minifiers\n    // would fail to do that (e.g. https://github.com/evanw/esbuild/issues/1610)\n    const check = ( true)\n        ? (job) => checkRecursiveUpdates(seen, job)\n        : 0;\n    try {\n        for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {\n            const job = queue[flushIndex];\n            if (job && job.active !== false) {\n                if (( true) && check(job)) {\n                    continue;\n                }\n                // console.log(`running:`, job.id)\n                callWithErrorHandling(job, null, 14 /* ErrorCodes.SCHEDULER */);\n            }\n        }\n    }\n    finally {\n        flushIndex = 0;\n        queue.length = 0;\n        flushPostFlushCbs(seen);\n        isFlushing = false;\n        currentFlushPromise = null;\n        // some postFlushCb queued jobs!\n        // keep flushing until it drains.\n        if (queue.length || pendingPostFlushCbs.length) {\n            flushJobs(seen);\n        }\n    }\n}\nfunction checkRecursiveUpdates(seen, fn) {\n    if (!seen.has(fn)) {\n        seen.set(fn, 1);\n    }\n    else {\n        const count = seen.get(fn);\n        if (count > RECURSION_LIMIT) {\n            const instance = fn.ownerInstance;\n            const componentName = instance && getComponentName(instance.type);\n            warn(`Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. ` +\n                `This means you have a reactive effect that is mutating its own ` +\n                `dependencies and thus recursively triggering itself. Possible sources ` +\n                `include component template, render function, updated hook or ` +\n                `watcher source function.`);\n            return true;\n        }\n        else {\n            seen.set(fn, count + 1);\n        }\n    }\n}\n\n/* eslint-disable no-restricted-globals */\nlet isHmrUpdating = false;\nconst hmrDirtyComponents = new Set();\n// Expose the HMR runtime on the global object\n// This makes it entirely tree-shakable without polluting the exports and makes\n// it easier to be used in toolings like vue-loader\n// Note: for a component to be eligible for HMR it also needs the __hmrId option\n// to be set so that its instances can be registered / removed.\nif ((true)) {\n    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.getGlobalThis)().__VUE_HMR_RUNTIME__ = {\n        createRecord: tryWrap(createRecord),\n        rerender: tryWrap(rerender),\n        reload: tryWrap(reload)\n    };\n}\nconst map = new Map();\nfunction registerHMR(instance) {\n    const id = instance.type.__hmrId;\n    let record = map.get(id);\n    if (!record) {\n        createRecord(id, instance.type);\n        record = map.get(id);\n    }\n    record.instances.add(instance);\n}\nfunction unregisterHMR(instance) {\n    map.get(instance.type.__hmrId).instances.delete(instance);\n}\nfunction createRecord(id, initialDef) {\n    if (map.has(id)) {\n        return false;\n    }\n    map.set(id, {\n        initialDef: normalizeClassComponent(initialDef),\n        instances: new Set()\n    });\n    return true;\n}\nfunction normalizeClassComponent(component) {\n    return isClassComponent(component) ? component.__vccOpts : component;\n}\nfunction rerender(id, newRender) {\n    const record = map.get(id);\n    if (!record) {\n        return;\n    }\n    // update initial record (for not-yet-rendered component)\n    record.initialDef.render = newRender;\n    [...record.instances].forEach(instance => {\n        if (newRender) {\n            instance.render = newRender;\n            normalizeClassComponent(instance.type).render = newRender;\n        }\n        instance.renderCache = [];\n        // this flag forces child components with slot content to update\n        isHmrUpdating = true;\n        instance.update();\n        isHmrUpdating = false;\n    });\n}\nfunction reload(id, newComp) {\n    const record = map.get(id);\n    if (!record)\n        return;\n    newComp = normalizeClassComponent(newComp);\n    // update initial def (for not-yet-rendered components)\n    updateComponentDef(record.initialDef, newComp);\n    // create a snapshot which avoids the set being mutated during updates\n    const instances = [...record.instances];\n    for (const instance of instances) {\n        const oldComp = normalizeClassComponent(instance.type);\n        if (!hmrDirtyComponents.has(oldComp)) {\n            // 1. Update existing comp definition to match new one\n            if (oldComp !== record.initialDef) {\n                updateComponentDef(oldComp, newComp);\n            }\n            // 2. mark definition dirty. This forces the renderer to replace the\n            // component on patch.\n            hmrDirtyComponents.add(oldComp);\n        }\n        // 3. invalidate options resolution cache\n        instance.appContext.optionsCache.delete(instance.type);\n        // 4. actually update\n        if (instance.ceReload) {\n            // custom element\n            hmrDirtyComponents.add(oldComp);\n            instance.ceReload(newComp.styles);\n            hmrDirtyComponents.delete(oldComp);\n        }\n        else if (instance.parent) {\n            // 4. Force the parent instance to re-render. This will cause all updated\n            // components to be unmounted and re-mounted. Queue the update so that we\n            // don't end up forcing the same parent to re-render multiple times.\n            queueJob(instance.parent.update);\n        }\n        else if (instance.appContext.reload) {\n            // root instance mounted via createApp() has a reload method\n            instance.appContext.reload();\n        }\n        else if (typeof window !== 'undefined') {\n            // root instance inside tree created via raw render(). Force reload.\n            window.location.reload();\n        }\n        else {\n            console.warn('[HMR] Root or manually mounted instance modified. Full reload required.');\n        }\n    }\n    // 5. make sure to cleanup dirty hmr components after update\n    queuePostFlushCb(() => {\n        for (const instance of instances) {\n            hmrDirtyComponents.delete(normalizeClassComponent(instance.type));\n        }\n    });\n}\nfunction updateComponentDef(oldComp, newComp) {\n    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(oldComp, newComp);\n    for (const key in oldComp) {\n        if (key !== '__file' && !(key in newComp)) {\n            delete oldComp[key];\n        }\n    }\n}\nfunction tryWrap(fn) {\n    return (id, arg) => {\n        try {\n            return fn(id, arg);\n        }\n        catch (e) {\n            console.error(e);\n            console.warn(`[HMR] Something went wrong during Vue component hot-reload. ` +\n                `Full reload required.`);\n        }\n    };\n}\n\nlet devtools;\nlet buffer = [];\nlet devtoolsNotInstalled = false;\nfunction emit$1(event, ...args) {\n    if (devtools) {\n        devtools.emit(event, ...args);\n    }\n    else if (!devtoolsNotInstalled) {\n        buffer.push({ event, args });\n    }\n}\nfunction setDevtoolsHook(hook, target) {\n    var _a, _b;\n    devtools = hook;\n    if (devtools) {\n        devtools.enabled = true;\n        buffer.forEach(({ event, args }) => devtools.emit(event, ...args));\n        buffer = [];\n    }\n    else if (\n    // handle late devtools injection - only do this if we are in an actual\n    // browser environment to avoid the timer handle stalling test runner exit\n    // (#4815)\n    typeof window !== 'undefined' &&\n        // some envs mock window but not fully\n        window.HTMLElement &&\n        // also exclude jsdom\n        !((_b = (_a = window.navigator) === null || _a === void 0 ? void 0 : _a.userAgent) === null || _b === void 0 ? void 0 : _b.includes('jsdom'))) {\n        const replay = (target.__VUE_DEVTOOLS_HOOK_REPLAY__ =\n            target.__VUE_DEVTOOLS_HOOK_REPLAY__ || []);\n        replay.push((newHook) => {\n            setDevtoolsHook(newHook, target);\n        });\n        // clear buffer after 3s - the user probably doesn't have devtools installed\n        // at all, and keeping the buffer will cause memory leaks (#4738)\n        setTimeout(() => {\n            if (!devtools) {\n                target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;\n                devtoolsNotInstalled = true;\n                buffer = [];\n            }\n        }, 3000);\n    }\n    else {\n        // non-browser env, assume not installed\n        devtoolsNotInstalled = true;\n        buffer = [];\n    }\n}\nfunction devtoolsInitApp(app, version) {\n    emit$1(\"app:init\" /* DevtoolsHooks.APP_INIT */, app, version, {\n        Fragment,\n        Text,\n        Comment,\n        Static\n    });\n}\nfunction devtoolsUnmountApp(app) {\n    emit$1(\"app:unmount\" /* DevtoolsHooks.APP_UNMOUNT */, app);\n}\nconst devtoolsComponentAdded = /*#__PURE__*/ createDevtoolsComponentHook(\"component:added\" /* DevtoolsHooks.COMPONENT_ADDED */);\nconst devtoolsComponentUpdated = \n/*#__PURE__*/ createDevtoolsComponentHook(\"component:updated\" /* DevtoolsHooks.COMPONENT_UPDATED */);\nconst _devtoolsComponentRemoved = /*#__PURE__*/ createDevtoolsComponentHook(\"component:removed\" /* DevtoolsHooks.COMPONENT_REMOVED */);\nconst devtoolsComponentRemoved = (component) => {\n    if (devtools &&\n        typeof devtools.cleanupBuffer === 'function' &&\n        // remove the component if it wasn't buffered\n        !devtools.cleanupBuffer(component)) {\n        _devtoolsComponentRemoved(component);\n    }\n};\nfunction createDevtoolsComponentHook(hook) {\n    return (component) => {\n        emit$1(hook, component.appContext.app, component.uid, component.parent ? component.parent.uid : undefined, component);\n    };\n}\nconst devtoolsPerfStart = /*#__PURE__*/ createDevtoolsPerformanceHook(\"perf:start\" /* DevtoolsHooks.PERFORMANCE_START */);\nconst devtoolsPerfEnd = /*#__PURE__*/ createDevtoolsPerformanceHook(\"perf:end\" /* DevtoolsHooks.PERFORMANCE_END */);\nfunction createDevtoolsPerformanceHook(hook) {\n    return (component, type, time) => {\n        emit$1(hook, component.appContext.app, component.uid, component, type, time);\n    };\n}\nfunction devtoolsComponentEmit(component, event, params) {\n    emit$1(\"component:emit\" /* DevtoolsHooks.COMPONENT_EMIT */, component.appContext.app, component, event, params);\n}\n\nfunction emit(instance, event, ...rawArgs) {\n    if (instance.isUnmounted)\n        return;\n    const props = instance.vnode.props || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;\n    if ((true)) {\n        const { emitsOptions, propsOptions: [propsOptions] } = instance;\n        if (emitsOptions) {\n            if (!(event in emitsOptions) &&\n                !(false )) {\n                if (!propsOptions || !((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(event) in propsOptions)) {\n                    warn(`Component emitted event \"${event}\" but it is neither declared in ` +\n                        `the emits option nor as an \"${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(event)}\" prop.`);\n                }\n            }\n            else {\n                const validator = emitsOptions[event];\n                if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(validator)) {\n                    const isValid = validator(...rawArgs);\n                    if (!isValid) {\n                        warn(`Invalid event arguments: event validation failed for event \"${event}\".`);\n                    }\n                }\n            }\n        }\n    }\n    let args = rawArgs;\n    const isModelListener = event.startsWith('update:');\n    // for v-model update:xxx events, apply modifiers on args\n    const modelArg = isModelListener && event.slice(7);\n    if (modelArg && modelArg in props) {\n        const modifiersKey = `${modelArg === 'modelValue' ? 'model' : modelArg}Modifiers`;\n        const { number, trim } = props[modifiersKey] || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;\n        if (trim) {\n            args = rawArgs.map(a => ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(a) ? a.trim() : a));\n        }\n        if (number) {\n            args = rawArgs.map(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseToNumber);\n        }\n    }\n    if (true) {\n        devtoolsComponentEmit(instance, event, args);\n    }\n    if ((true)) {\n        const lowerCaseEvent = event.toLowerCase();\n        if (lowerCaseEvent !== event && props[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(lowerCaseEvent)]) {\n            warn(`Event \"${lowerCaseEvent}\" is emitted in component ` +\n                `${formatComponentName(instance, instance.type)} but the handler is registered for \"${event}\". ` +\n                `Note that HTML attributes are case-insensitive and you cannot use ` +\n                `v-on to listen to camelCase events when using in-DOM templates. ` +\n                `You should probably use \"${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(event)}\" instead of \"${event}\".`);\n        }\n    }\n    let handlerName;\n    let handler = props[(handlerName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(event))] ||\n        // also try camelCase event handler (#2249)\n        props[(handlerName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(event)))];\n    // for v-model update:xxx events, also trigger kebab-case equivalent\n    // for props passed via kebab-case\n    if (!handler && isModelListener) {\n        handler = props[(handlerName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(event)))];\n    }\n    if (handler) {\n        callWithAsyncErrorHandling(handler, instance, 6 /* ErrorCodes.COMPONENT_EVENT_HANDLER */, args);\n    }\n    const onceHandler = props[handlerName + `Once`];\n    if (onceHandler) {\n        if (!instance.emitted) {\n            instance.emitted = {};\n        }\n        else if (instance.emitted[handlerName]) {\n            return;\n        }\n        instance.emitted[handlerName] = true;\n        callWithAsyncErrorHandling(onceHandler, instance, 6 /* ErrorCodes.COMPONENT_EVENT_HANDLER */, args);\n    }\n}\nfunction normalizeEmitsOptions(comp, appContext, asMixin = false) {\n    const cache = appContext.emitsCache;\n    const cached = cache.get(comp);\n    if (cached !== undefined) {\n        return cached;\n    }\n    const raw = comp.emits;\n    let normalized = {};\n    // apply mixin/extends props\n    let hasExtends = false;\n    if ( true && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(comp)) {\n        const extendEmits = (raw) => {\n            const normalizedFromExtend = normalizeEmitsOptions(raw, appContext, true);\n            if (normalizedFromExtend) {\n                hasExtends = true;\n                (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(normalized, normalizedFromExtend);\n            }\n        };\n        if (!asMixin && appContext.mixins.length) {\n            appContext.mixins.forEach(extendEmits);\n        }\n        if (comp.extends) {\n            extendEmits(comp.extends);\n        }\n        if (comp.mixins) {\n            comp.mixins.forEach(extendEmits);\n        }\n    }\n    if (!raw && !hasExtends) {\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(comp)) {\n            cache.set(comp, null);\n        }\n        return null;\n    }\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(raw)) {\n        raw.forEach(key => (normalized[key] = null));\n    }\n    else {\n        (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(normalized, raw);\n    }\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(comp)) {\n        cache.set(comp, normalized);\n    }\n    return normalized;\n}\n// Check if an incoming prop key is a declared emit event listener.\n// e.g. With `emits: { click: null }`, props named `onClick` and `onclick` are\n// both considered matched listeners.\nfunction isEmitListener(options, key) {\n    if (!options || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) {\n        return false;\n    }\n    key = key.slice(2).replace(/Once$/, '');\n    return ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(options, key[0].toLowerCase() + key.slice(1)) ||\n        (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(options, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key)) ||\n        (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(options, key));\n}\n\n/**\n * mark the current rendering instance for asset resolution (e.g.\n * resolveComponent, resolveDirective) during render\n */\nlet currentRenderingInstance = null;\nlet currentScopeId = null;\n/**\n * Note: rendering calls maybe nested. The function returns the parent rendering\n * instance if present, which should be restored after the render is done:\n *\n * ```js\n * const prev = setCurrentRenderingInstance(i)\n * // ...render\n * setCurrentRenderingInstance(prev)\n * ```\n */\nfunction setCurrentRenderingInstance(instance) {\n    const prev = currentRenderingInstance;\n    currentRenderingInstance = instance;\n    currentScopeId = (instance && instance.type.__scopeId) || null;\n    return prev;\n}\n/**\n * Set scope id when creating hoisted vnodes.\n * @private compiler helper\n */\nfunction pushScopeId(id) {\n    currentScopeId = id;\n}\n/**\n * Technically we no longer need this after 3.0.8 but we need to keep the same\n * API for backwards compat w/ code generated by compilers.\n * @private\n */\nfunction popScopeId() {\n    currentScopeId = null;\n}\n/**\n * Only for backwards compat\n * @private\n */\nconst withScopeId = (_id) => withCtx;\n/**\n * Wrap a slot function to memoize current rendering instance\n * @private compiler helper\n */\nfunction withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot // false only\n) {\n    if (!ctx)\n        return fn;\n    // already normalized\n    if (fn._n) {\n        return fn;\n    }\n    const renderFnWithContext = (...args) => {\n        // If a user calls a compiled slot inside a template expression (#1745), it\n        // can mess up block tracking, so by default we disable block tracking and\n        // force bail out when invoking a compiled slot (indicated by the ._d flag).\n        // This isn't necessary if rendering a compiled `<slot>`, so we flip the\n        // ._d flag off when invoking the wrapped fn inside `renderSlot`.\n        if (renderFnWithContext._d) {\n            setBlockTracking(-1);\n        }\n        const prevInstance = setCurrentRenderingInstance(ctx);\n        let res;\n        try {\n            res = fn(...args);\n        }\n        finally {\n            setCurrentRenderingInstance(prevInstance);\n            if (renderFnWithContext._d) {\n                setBlockTracking(1);\n            }\n        }\n        if (true) {\n            devtoolsComponentUpdated(ctx);\n        }\n        return res;\n    };\n    // mark normalized to avoid duplicated wrapping\n    renderFnWithContext._n = true;\n    // mark this as compiled by default\n    // this is used in vnode.ts -> normalizeChildren() to set the slot\n    // rendering flag.\n    renderFnWithContext._c = true;\n    // disable block tracking by default\n    renderFnWithContext._d = true;\n    return renderFnWithContext;\n}\n\n/**\n * dev only flag to track whether $attrs was used during render.\n * If $attrs was used during render then the warning for failed attrs\n * fallthrough can be suppressed.\n */\nlet accessedAttrs = false;\nfunction markAttrsAccessed() {\n    accessedAttrs = true;\n}\nfunction renderComponentRoot(instance) {\n    const { type: Component, vnode, proxy, withProxy, props, propsOptions: [propsOptions], slots, attrs, emit, render, renderCache, data, setupState, ctx, inheritAttrs } = instance;\n    let result;\n    let fallthroughAttrs;\n    const prev = setCurrentRenderingInstance(instance);\n    if ((true)) {\n        accessedAttrs = false;\n    }\n    try {\n        if (vnode.shapeFlag & 4 /* ShapeFlags.STATEFUL_COMPONENT */) {\n            // withProxy is a proxy with a different `has` trap only for\n            // runtime-compiled render functions using `with` block.\n            const proxyToUse = withProxy || proxy;\n            result = normalizeVNode(render.call(proxyToUse, proxyToUse, renderCache, props, setupState, data, ctx));\n            fallthroughAttrs = attrs;\n        }\n        else {\n            // functional\n            const render = Component;\n            // in dev, mark attrs accessed if optional props (attrs === props)\n            if (( true) && attrs === props) {\n                markAttrsAccessed();\n            }\n            result = normalizeVNode(render.length > 1\n                ? render(props, ( true)\n                    ? {\n                        get attrs() {\n                            markAttrsAccessed();\n                            return attrs;\n                        },\n                        slots,\n                        emit\n                    }\n                    : 0)\n                : render(props, null /* we know it doesn't need it */));\n            fallthroughAttrs = Component.props\n                ? attrs\n                : getFunctionalFallthrough(attrs);\n        }\n    }\n    catch (err) {\n        blockStack.length = 0;\n        handleError(err, instance, 1 /* ErrorCodes.RENDER_FUNCTION */);\n        result = createVNode(Comment);\n    }\n    // attr merging\n    // in dev mode, comments are preserved, and it's possible for a template\n    // to have comments along side the root element which makes it a fragment\n    let root = result;\n    let setRoot = undefined;\n    if (( true) &&\n        result.patchFlag > 0 &&\n        result.patchFlag & 2048 /* PatchFlags.DEV_ROOT_FRAGMENT */) {\n        [root, setRoot] = getChildRoot(result);\n    }\n    if (fallthroughAttrs && inheritAttrs !== false) {\n        const keys = Object.keys(fallthroughAttrs);\n        const { shapeFlag } = root;\n        if (keys.length) {\n            if (shapeFlag & (1 /* ShapeFlags.ELEMENT */ | 6 /* ShapeFlags.COMPONENT */)) {\n                if (propsOptions && keys.some(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isModelListener)) {\n                    // If a v-model listener (onUpdate:xxx) has a corresponding declared\n                    // prop, it indicates this component expects to handle v-model and\n                    // it should not fallthrough.\n                    // related: #1543, #1643, #1989\n                    fallthroughAttrs = filterModelListeners(fallthroughAttrs, propsOptions);\n                }\n                root = cloneVNode(root, fallthroughAttrs);\n            }\n            else if (( true) && !accessedAttrs && root.type !== Comment) {\n                const allAttrs = Object.keys(attrs);\n                const eventAttrs = [];\n                const extraAttrs = [];\n                for (let i = 0, l = allAttrs.length; i < l; i++) {\n                    const key = allAttrs[i];\n                    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) {\n                        // ignore v-model handlers when they fail to fallthrough\n                        if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isModelListener)(key)) {\n                            // remove `on`, lowercase first letter to reflect event casing\n                            // accurately\n                            eventAttrs.push(key[2].toLowerCase() + key.slice(3));\n                        }\n                    }\n                    else {\n                        extraAttrs.push(key);\n                    }\n                }\n                if (extraAttrs.length) {\n                    warn(`Extraneous non-props attributes (` +\n                        `${extraAttrs.join(', ')}) ` +\n                        `were passed to component but could not be automatically inherited ` +\n                        `because component renders fragment or text root nodes.`);\n                }\n                if (eventAttrs.length) {\n                    warn(`Extraneous non-emits event listeners (` +\n                        `${eventAttrs.join(', ')}) ` +\n                        `were passed to component but could not be automatically inherited ` +\n                        `because component renders fragment or text root nodes. ` +\n                        `If the listener is intended to be a component custom event listener only, ` +\n                        `declare it using the \"emits\" option.`);\n                }\n            }\n        }\n    }\n    // inherit directives\n    if (vnode.dirs) {\n        if (( true) && !isElementRoot(root)) {\n            warn(`Runtime directive used on component with non-element root node. ` +\n                `The directives will not function as intended.`);\n        }\n        // clone before mutating since the root may be a hoisted vnode\n        root = cloneVNode(root);\n        root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;\n    }\n    // inherit transition data\n    if (vnode.transition) {\n        if (( true) && !isElementRoot(root)) {\n            warn(`Component inside <Transition> renders non-element root node ` +\n                `that cannot be animated.`);\n        }\n        root.transition = vnode.transition;\n    }\n    if (( true) && setRoot) {\n        setRoot(root);\n    }\n    else {\n        result = root;\n    }\n    setCurrentRenderingInstance(prev);\n    return result;\n}\n/**\n * dev only\n * In dev mode, template root level comments are rendered, which turns the\n * template into a fragment root, but we need to locate the single element\n * root for attrs and scope id processing.\n */\nconst getChildRoot = (vnode) => {\n    const rawChildren = vnode.children;\n    const dynamicChildren = vnode.dynamicChildren;\n    const childRoot = filterSingleRoot(rawChildren);\n    if (!childRoot) {\n        return [vnode, undefined];\n    }\n    const index = rawChildren.indexOf(childRoot);\n    const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1;\n    const setRoot = (updatedRoot) => {\n        rawChildren[index] = updatedRoot;\n        if (dynamicChildren) {\n            if (dynamicIndex > -1) {\n                dynamicChildren[dynamicIndex] = updatedRoot;\n            }\n            else if (updatedRoot.patchFlag > 0) {\n                vnode.dynamicChildren = [...dynamicChildren, updatedRoot];\n            }\n        }\n    };\n    return [normalizeVNode(childRoot), setRoot];\n};\nfunction filterSingleRoot(children) {\n    let singleRoot;\n    for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n        if (isVNode(child)) {\n            // ignore user comment\n            if (child.type !== Comment || child.children === 'v-if') {\n                if (singleRoot) {\n                    // has more than 1 non-comment child, return now\n                    return;\n                }\n                else {\n                    singleRoot = child;\n                }\n            }\n        }\n        else {\n            return;\n        }\n    }\n    return singleRoot;\n}\nconst getFunctionalFallthrough = (attrs) => {\n    let res;\n    for (const key in attrs) {\n        if (key === 'class' || key === 'style' || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) {\n            (res || (res = {}))[key] = attrs[key];\n        }\n    }\n    return res;\n};\nconst filterModelListeners = (attrs, props) => {\n    const res = {};\n    for (const key in attrs) {\n        if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isModelListener)(key) || !(key.slice(9) in props)) {\n            res[key] = attrs[key];\n        }\n    }\n    return res;\n};\nconst isElementRoot = (vnode) => {\n    return (vnode.shapeFlag & (6 /* ShapeFlags.COMPONENT */ | 1 /* ShapeFlags.ELEMENT */) ||\n        vnode.type === Comment // potential v-if branch switch\n    );\n};\nfunction shouldUpdateComponent(prevVNode, nextVNode, optimized) {\n    const { props: prevProps, children: prevChildren, component } = prevVNode;\n    const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;\n    const emits = component.emitsOptions;\n    // Parent component's render function was hot-updated. Since this may have\n    // caused the child component's slots content to have changed, we need to\n    // force the child to update as well.\n    if (( true) && (prevChildren || nextChildren) && isHmrUpdating) {\n        return true;\n    }\n    // force child update for runtime directive or transition on component vnode.\n    if (nextVNode.dirs || nextVNode.transition) {\n        return true;\n    }\n    if (optimized && patchFlag >= 0) {\n        if (patchFlag & 1024 /* PatchFlags.DYNAMIC_SLOTS */) {\n            // slot content that references values that might have changed,\n            // e.g. in a v-for\n            return true;\n        }\n        if (patchFlag & 16 /* PatchFlags.FULL_PROPS */) {\n            if (!prevProps) {\n                return !!nextProps;\n            }\n            // presence of this flag indicates props are always non-null\n            return hasPropsChanged(prevProps, nextProps, emits);\n        }\n        else if (patchFlag & 8 /* PatchFlags.PROPS */) {\n            const dynamicProps = nextVNode.dynamicProps;\n            for (let i = 0; i < dynamicProps.length; i++) {\n                const key = dynamicProps[i];\n                if (nextProps[key] !== prevProps[key] &&\n                    !isEmitListener(emits, key)) {\n                    return true;\n                }\n            }\n        }\n    }\n    else {\n        // this path is only taken by manually written render functions\n        // so presence of any children leads to a forced update\n        if (prevChildren || nextChildren) {\n            if (!nextChildren || !nextChildren.$stable) {\n                return true;\n            }\n        }\n        if (prevProps === nextProps) {\n            return false;\n        }\n        if (!prevProps) {\n            return !!nextProps;\n        }\n        if (!nextProps) {\n            return true;\n        }\n        return hasPropsChanged(prevProps, nextProps, emits);\n    }\n    return false;\n}\nfunction hasPropsChanged(prevProps, nextProps, emitsOptions) {\n    const nextKeys = Object.keys(nextProps);\n    if (nextKeys.length !== Object.keys(prevProps).length) {\n        return true;\n    }\n    for (let i = 0; i < nextKeys.length; i++) {\n        const key = nextKeys[i];\n        if (nextProps[key] !== prevProps[key] &&\n            !isEmitListener(emitsOptions, key)) {\n            return true;\n        }\n    }\n    return false;\n}\nfunction updateHOCHostEl({ vnode, parent }, el // HostNode\n) {\n    while (parent && parent.subTree === vnode) {\n        (vnode = parent.vnode).el = el;\n        parent = parent.parent;\n    }\n}\n\nconst isSuspense = (type) => type.__isSuspense;\n// Suspense exposes a component-like API, and is treated like a component\n// in the compiler, but internally it's a special built-in type that hooks\n// directly into the renderer.\nconst SuspenseImpl = {\n    name: 'Suspense',\n    // In order to make Suspense tree-shakable, we need to avoid importing it\n    // directly in the renderer. The renderer checks for the __isSuspense flag\n    // on a vnode's type and calls the `process` method, passing in renderer\n    // internals.\n    __isSuspense: true,\n    process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, \n    // platform-specific impl passed from renderer\n    rendererInternals) {\n        if (n1 == null) {\n            mountSuspense(n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals);\n        }\n        else {\n            patchSuspense(n1, n2, container, anchor, parentComponent, isSVG, slotScopeIds, optimized, rendererInternals);\n        }\n    },\n    hydrate: hydrateSuspense,\n    create: createSuspenseBoundary,\n    normalize: normalizeSuspenseChildren\n};\n// Force-casted public typing for h and TSX props inference\nconst Suspense = (SuspenseImpl\n    );\nfunction triggerEvent(vnode, name) {\n    const eventListener = vnode.props && vnode.props[name];\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(eventListener)) {\n        eventListener();\n    }\n}\nfunction mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals) {\n    const { p: patch, o: { createElement } } = rendererInternals;\n    const hiddenContainer = createElement('div');\n    const suspense = (vnode.suspense = createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, isSVG, slotScopeIds, optimized, rendererInternals));\n    // start mounting the content subtree in an off-dom container\n    patch(null, (suspense.pendingBranch = vnode.ssContent), hiddenContainer, null, parentComponent, suspense, isSVG, slotScopeIds);\n    // now check if we have encountered any async deps\n    if (suspense.deps > 0) {\n        // has async\n        // invoke @fallback event\n        triggerEvent(vnode, 'onPending');\n        triggerEvent(vnode, 'onFallback');\n        // mount the fallback tree\n        patch(null, vnode.ssFallback, container, anchor, parentComponent, null, // fallback tree will not have suspense context\n        isSVG, slotScopeIds);\n        setActiveBranch(suspense, vnode.ssFallback);\n    }\n    else {\n        // Suspense has no async deps. Just resolve.\n        suspense.resolve();\n    }\n}\nfunction patchSuspense(n1, n2, container, anchor, parentComponent, isSVG, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) {\n    const suspense = (n2.suspense = n1.suspense);\n    suspense.vnode = n2;\n    n2.el = n1.el;\n    const newBranch = n2.ssContent;\n    const newFallback = n2.ssFallback;\n    const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense;\n    if (pendingBranch) {\n        suspense.pendingBranch = newBranch;\n        if (isSameVNodeType(newBranch, pendingBranch)) {\n            // same root type but content may have changed.\n            patch(pendingBranch, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG, slotScopeIds, optimized);\n            if (suspense.deps <= 0) {\n                suspense.resolve();\n            }\n            else if (isInFallback) {\n                patch(activeBranch, newFallback, container, anchor, parentComponent, null, // fallback tree will not have suspense context\n                isSVG, slotScopeIds, optimized);\n                setActiveBranch(suspense, newFallback);\n            }\n        }\n        else {\n            // toggled before pending tree is resolved\n            suspense.pendingId++;\n            if (isHydrating) {\n                // if toggled before hydration is finished, the current DOM tree is\n                // no longer valid. set it as the active branch so it will be unmounted\n                // when resolved\n                suspense.isHydrating = false;\n                suspense.activeBranch = pendingBranch;\n            }\n            else {\n                unmount(pendingBranch, parentComponent, suspense);\n            }\n            // increment pending ID. this is used to invalidate async callbacks\n            // reset suspense state\n            suspense.deps = 0;\n            // discard effects from pending branch\n            suspense.effects.length = 0;\n            // discard previous container\n            suspense.hiddenContainer = createElement('div');\n            if (isInFallback) {\n                // already in fallback state\n                patch(null, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG, slotScopeIds, optimized);\n                if (suspense.deps <= 0) {\n                    suspense.resolve();\n                }\n                else {\n                    patch(activeBranch, newFallback, container, anchor, parentComponent, null, // fallback tree will not have suspense context\n                    isSVG, slotScopeIds, optimized);\n                    setActiveBranch(suspense, newFallback);\n                }\n            }\n            else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {\n                // toggled \"back\" to current active branch\n                patch(activeBranch, newBranch, container, anchor, parentComponent, suspense, isSVG, slotScopeIds, optimized);\n                // force resolve\n                suspense.resolve(true);\n            }\n            else {\n                // switched to a 3rd branch\n                patch(null, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG, slotScopeIds, optimized);\n                if (suspense.deps <= 0) {\n                    suspense.resolve();\n                }\n            }\n        }\n    }\n    else {\n        if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {\n            // root did not change, just normal patch\n            patch(activeBranch, newBranch, container, anchor, parentComponent, suspense, isSVG, slotScopeIds, optimized);\n            setActiveBranch(suspense, newBranch);\n        }\n        else {\n            // root node toggled\n            // invoke @pending event\n            triggerEvent(n2, 'onPending');\n            // mount pending branch in off-dom container\n            suspense.pendingBranch = newBranch;\n            suspense.pendingId++;\n            patch(null, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG, slotScopeIds, optimized);\n            if (suspense.deps <= 0) {\n                // incoming branch has no async deps, resolve now.\n                suspense.resolve();\n            }\n            else {\n                const { timeout, pendingId } = suspense;\n                if (timeout > 0) {\n                    setTimeout(() => {\n                        if (suspense.pendingId === pendingId) {\n                            suspense.fallback(newFallback);\n                        }\n                    }, timeout);\n                }\n                else if (timeout === 0) {\n                    suspense.fallback(newFallback);\n                }\n            }\n        }\n    }\n}\nlet hasWarned = false;\nfunction createSuspenseBoundary(vnode, parent, parentComponent, container, hiddenContainer, anchor, isSVG, slotScopeIds, optimized, rendererInternals, isHydrating = false) {\n    /* istanbul ignore if */\n    if ( true && !hasWarned) {\n        hasWarned = true;\n        // @ts-ignore `console.info` cannot be null error\n        console[console.info ? 'info' : 'log'](`<Suspense> is an experimental feature and its API will likely change.`);\n    }\n    const { p: patch, m: move, um: unmount, n: next, o: { parentNode, remove } } = rendererInternals;\n    const timeout = vnode.props ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(vnode.props.timeout) : undefined;\n    if ((true)) {\n        assertNumber(timeout, `Suspense timeout`);\n    }\n    const suspense = {\n        vnode,\n        parent,\n        parentComponent,\n        isSVG,\n        container,\n        hiddenContainer,\n        anchor,\n        deps: 0,\n        pendingId: 0,\n        timeout: typeof timeout === 'number' ? timeout : -1,\n        activeBranch: null,\n        pendingBranch: null,\n        isInFallback: true,\n        isHydrating,\n        isUnmounted: false,\n        effects: [],\n        resolve(resume = false) {\n            if ((true)) {\n                if (!resume && !suspense.pendingBranch) {\n                    throw new Error(`suspense.resolve() is called without a pending branch.`);\n                }\n                if (suspense.isUnmounted) {\n                    throw new Error(`suspense.resolve() is called on an already unmounted suspense boundary.`);\n                }\n            }\n            const { vnode, activeBranch, pendingBranch, pendingId, effects, parentComponent, container } = suspense;\n            if (suspense.isHydrating) {\n                suspense.isHydrating = false;\n            }\n            else if (!resume) {\n                const delayEnter = activeBranch &&\n                    pendingBranch.transition &&\n                    pendingBranch.transition.mode === 'out-in';\n                if (delayEnter) {\n                    activeBranch.transition.afterLeave = () => {\n                        if (pendingId === suspense.pendingId) {\n                            move(pendingBranch, container, anchor, 0 /* MoveType.ENTER */);\n                        }\n                    };\n                }\n                // this is initial anchor on mount\n                let { anchor } = suspense;\n                // unmount current active tree\n                if (activeBranch) {\n                    // if the fallback tree was mounted, it may have been moved\n                    // as part of a parent suspense. get the latest anchor for insertion\n                    anchor = next(activeBranch);\n                    unmount(activeBranch, parentComponent, suspense, true);\n                }\n                if (!delayEnter) {\n                    // move content from off-dom container to actual container\n                    move(pendingBranch, container, anchor, 0 /* MoveType.ENTER */);\n                }\n            }\n            setActiveBranch(suspense, pendingBranch);\n            suspense.pendingBranch = null;\n            suspense.isInFallback = false;\n            // flush buffered effects\n            // check if there is a pending parent suspense\n            let parent = suspense.parent;\n            let hasUnresolvedAncestor = false;\n            while (parent) {\n                if (parent.pendingBranch) {\n                    // found a pending parent suspense, merge buffered post jobs\n                    // into that parent\n                    parent.effects.push(...effects);\n                    hasUnresolvedAncestor = true;\n                    break;\n                }\n                parent = parent.parent;\n            }\n            // no pending parent suspense, flush all jobs\n            if (!hasUnresolvedAncestor) {\n                queuePostFlushCb(effects);\n            }\n            suspense.effects = [];\n            // invoke @resolve event\n            triggerEvent(vnode, 'onResolve');\n        },\n        fallback(fallbackVNode) {\n            if (!suspense.pendingBranch) {\n                return;\n            }\n            const { vnode, activeBranch, parentComponent, container, isSVG } = suspense;\n            // invoke @fallback event\n            triggerEvent(vnode, 'onFallback');\n            const anchor = next(activeBranch);\n            const mountFallback = () => {\n                if (!suspense.isInFallback) {\n                    return;\n                }\n                // mount the fallback tree\n                patch(null, fallbackVNode, container, anchor, parentComponent, null, // fallback tree will not have suspense context\n                isSVG, slotScopeIds, optimized);\n                setActiveBranch(suspense, fallbackVNode);\n            };\n            const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === 'out-in';\n            if (delayEnter) {\n                activeBranch.transition.afterLeave = mountFallback;\n            }\n            suspense.isInFallback = true;\n            // unmount current active branch\n            unmount(activeBranch, parentComponent, null, // no suspense so unmount hooks fire now\n            true // shouldRemove\n            );\n            if (!delayEnter) {\n                mountFallback();\n            }\n        },\n        move(container, anchor, type) {\n            suspense.activeBranch &&\n                move(suspense.activeBranch, container, anchor, type);\n            suspense.container = container;\n        },\n        next() {\n            return suspense.activeBranch && next(suspense.activeBranch);\n        },\n        registerDep(instance, setupRenderEffect) {\n            const isInPendingSuspense = !!suspense.pendingBranch;\n            if (isInPendingSuspense) {\n                suspense.deps++;\n            }\n            const hydratedEl = instance.vnode.el;\n            instance\n                .asyncDep.catch(err => {\n                handleError(err, instance, 0 /* ErrorCodes.SETUP_FUNCTION */);\n            })\n                .then(asyncSetupResult => {\n                // retry when the setup() promise resolves.\n                // component may have been unmounted before resolve.\n                if (instance.isUnmounted ||\n                    suspense.isUnmounted ||\n                    suspense.pendingId !== instance.suspenseId) {\n                    return;\n                }\n                // retry from this component\n                instance.asyncResolved = true;\n                const { vnode } = instance;\n                if ((true)) {\n                    pushWarningContext(vnode);\n                }\n                handleSetupResult(instance, asyncSetupResult, false);\n                if (hydratedEl) {\n                    // vnode may have been replaced if an update happened before the\n                    // async dep is resolved.\n                    vnode.el = hydratedEl;\n                }\n                const placeholder = !hydratedEl && instance.subTree.el;\n                setupRenderEffect(instance, vnode, \n                // component may have been moved before resolve.\n                // if this is not a hydration, instance.subTree will be the comment\n                // placeholder.\n                parentNode(hydratedEl || instance.subTree.el), \n                // anchor will not be used if this is hydration, so only need to\n                // consider the comment placeholder case.\n                hydratedEl ? null : next(instance.subTree), suspense, isSVG, optimized);\n                if (placeholder) {\n                    remove(placeholder);\n                }\n                updateHOCHostEl(instance, vnode.el);\n                if ((true)) {\n                    popWarningContext();\n                }\n                // only decrease deps count if suspense is not already resolved\n                if (isInPendingSuspense && --suspense.deps === 0) {\n                    suspense.resolve();\n                }\n            });\n        },\n        unmount(parentSuspense, doRemove) {\n            suspense.isUnmounted = true;\n            if (suspense.activeBranch) {\n                unmount(suspense.activeBranch, parentComponent, parentSuspense, doRemove);\n            }\n            if (suspense.pendingBranch) {\n                unmount(suspense.pendingBranch, parentComponent, parentSuspense, doRemove);\n            }\n        }\n    };\n    return suspense;\n}\nfunction hydrateSuspense(node, vnode, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals, hydrateNode) {\n    /* eslint-disable no-restricted-globals */\n    const suspense = (vnode.suspense = createSuspenseBoundary(vnode, parentSuspense, parentComponent, node.parentNode, document.createElement('div'), null, isSVG, slotScopeIds, optimized, rendererInternals, true /* hydrating */));\n    // there are two possible scenarios for server-rendered suspense:\n    // - success: ssr content should be fully resolved\n    // - failure: ssr content should be the fallback branch.\n    // however, on the client we don't really know if it has failed or not\n    // attempt to hydrate the DOM assuming it has succeeded, but we still\n    // need to construct a suspense boundary first\n    const result = hydrateNode(node, (suspense.pendingBranch = vnode.ssContent), parentComponent, suspense, slotScopeIds, optimized);\n    if (suspense.deps === 0) {\n        suspense.resolve();\n    }\n    return result;\n    /* eslint-enable no-restricted-globals */\n}\nfunction normalizeSuspenseChildren(vnode) {\n    const { shapeFlag, children } = vnode;\n    const isSlotChildren = shapeFlag & 32 /* ShapeFlags.SLOTS_CHILDREN */;\n    vnode.ssContent = normalizeSuspenseSlot(isSlotChildren ? children.default : children);\n    vnode.ssFallback = isSlotChildren\n        ? normalizeSuspenseSlot(children.fallback)\n        : createVNode(Comment);\n}\nfunction normalizeSuspenseSlot(s) {\n    let block;\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(s)) {\n        const trackBlock = isBlockTreeEnabled && s._c;\n        if (trackBlock) {\n            // disableTracking: false\n            // allow block tracking for compiled slots\n            // (see ./componentRenderContext.ts)\n            s._d = false;\n            openBlock();\n        }\n        s = s();\n        if (trackBlock) {\n            s._d = true;\n            block = currentBlock;\n            closeBlock();\n        }\n    }\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(s)) {\n        const singleChild = filterSingleRoot(s);\n        if (( true) && !singleChild) {\n            warn(`<Suspense> slots expect a single root node.`);\n        }\n        s = singleChild;\n    }\n    s = normalizeVNode(s);\n    if (block && !s.dynamicChildren) {\n        s.dynamicChildren = block.filter(c => c !== s);\n    }\n    return s;\n}\nfunction queueEffectWithSuspense(fn, suspense) {\n    if (suspense && suspense.pendingBranch) {\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(fn)) {\n            suspense.effects.push(...fn);\n        }\n        else {\n            suspense.effects.push(fn);\n        }\n    }\n    else {\n        queuePostFlushCb(fn);\n    }\n}\nfunction setActiveBranch(suspense, branch) {\n    suspense.activeBranch = branch;\n    const { vnode, parentComponent } = suspense;\n    const el = (vnode.el = branch.el);\n    // in case suspense is the root node of a component,\n    // recursively update the HOC el\n    if (parentComponent && parentComponent.subTree === vnode) {\n        parentComponent.vnode.el = el;\n        updateHOCHostEl(parentComponent, el);\n    }\n}\n\nfunction provide(key, value) {\n    if (!currentInstance) {\n        if ((true)) {\n            warn(`provide() can only be used inside setup().`);\n        }\n    }\n    else {\n        let provides = currentInstance.provides;\n        // by default an instance inherits its parent's provides object\n        // but when it needs to provide values of its own, it creates its\n        // own provides object using parent provides object as prototype.\n        // this way in `inject` we can simply look up injections from direct\n        // parent and let the prototype chain do the work.\n        const parentProvides = currentInstance.parent && currentInstance.parent.provides;\n        if (parentProvides === provides) {\n            provides = currentInstance.provides = Object.create(parentProvides);\n        }\n        // TS doesn't allow symbol as index type\n        provides[key] = value;\n    }\n}\nfunction inject(key, defaultValue, treatDefaultAsFactory = false) {\n    // fallback to `currentRenderingInstance` so that this can be called in\n    // a functional component\n    const instance = currentInstance || currentRenderingInstance;\n    if (instance) {\n        // #2400\n        // to support `app.use` plugins,\n        // fallback to appContext's `provides` if the instance is at root\n        const provides = instance.parent == null\n            ? instance.vnode.appContext && instance.vnode.appContext.provides\n            : instance.parent.provides;\n        if (provides && key in provides) {\n            // TS doesn't allow symbol as index type\n            return provides[key];\n        }\n        else if (arguments.length > 1) {\n            return treatDefaultAsFactory && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(defaultValue)\n                ? defaultValue.call(instance.proxy)\n                : defaultValue;\n        }\n        else if ((true)) {\n            warn(`injection \"${String(key)}\" not found.`);\n        }\n    }\n    else if ((true)) {\n        warn(`inject() can only be used inside setup() or functional components.`);\n    }\n}\n\n// Simple effect.\nfunction watchEffect(effect, options) {\n    return doWatch(effect, null, options);\n}\nfunction watchPostEffect(effect, options) {\n    return doWatch(effect, null, ( true) ? Object.assign(Object.assign({}, options), { flush: 'post' }) : 0);\n}\nfunction watchSyncEffect(effect, options) {\n    return doWatch(effect, null, ( true) ? Object.assign(Object.assign({}, options), { flush: 'sync' }) : 0);\n}\n// initial value for watchers to trigger on undefined initial values\nconst INITIAL_WATCHER_VALUE = {};\n// implementation\nfunction watch(source, cb, options) {\n    if (( true) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(cb)) {\n        warn(`\\`watch(fn, options?)\\` signature has been moved to a separate API. ` +\n            `Use \\`watchEffect(fn, options?)\\` instead. \\`watch\\` now only ` +\n            `supports \\`watch(source, cb, options?) signature.`);\n    }\n    return doWatch(source, cb, options);\n}\nfunction doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) {\n    if (( true) && !cb) {\n        if (immediate !== undefined) {\n            warn(`watch() \"immediate\" option is only respected when using the ` +\n                `watch(source, callback, options?) signature.`);\n        }\n        if (deep !== undefined) {\n            warn(`watch() \"deep\" option is only respected when using the ` +\n                `watch(source, callback, options?) signature.`);\n        }\n    }\n    const warnInvalidSource = (s) => {\n        warn(`Invalid watch source: `, s, `A watch source can only be a getter/effect function, a ref, ` +\n            `a reactive object, or an array of these types.`);\n    };\n    const instance = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.getCurrentScope)() === (currentInstance === null || currentInstance === void 0 ? void 0 : currentInstance.scope) ? currentInstance : null;\n    // const instance = currentInstance\n    let getter;\n    let forceTrigger = false;\n    let isMultiSource = false;\n    if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(source)) {\n        getter = () => source.value;\n        forceTrigger = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isShallow)(source);\n    }\n    else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive)(source)) {\n        getter = () => source;\n        deep = true;\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(source)) {\n        isMultiSource = true;\n        forceTrigger = source.some(s => (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive)(s) || (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isShallow)(s));\n        getter = () => source.map(s => {\n            if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(s)) {\n                return s.value;\n            }\n            else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive)(s)) {\n                return traverse(s);\n            }\n            else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(s)) {\n                return callWithErrorHandling(s, instance, 2 /* ErrorCodes.WATCH_GETTER */);\n            }\n            else {\n                ( true) && warnInvalidSource(s);\n            }\n        });\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(source)) {\n        if (cb) {\n            // getter with cb\n            getter = () => callWithErrorHandling(source, instance, 2 /* ErrorCodes.WATCH_GETTER */);\n        }\n        else {\n            // no cb -> simple effect\n            getter = () => {\n                if (instance && instance.isUnmounted) {\n                    return;\n                }\n                if (cleanup) {\n                    cleanup();\n                }\n                return callWithAsyncErrorHandling(source, instance, 3 /* ErrorCodes.WATCH_CALLBACK */, [onCleanup]);\n            };\n        }\n    }\n    else {\n        getter = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP;\n        ( true) && warnInvalidSource(source);\n    }\n    if (cb && deep) {\n        const baseGetter = getter;\n        getter = () => traverse(baseGetter());\n    }\n    let cleanup;\n    let onCleanup = (fn) => {\n        cleanup = effect.onStop = () => {\n            callWithErrorHandling(fn, instance, 4 /* ErrorCodes.WATCH_CLEANUP */);\n        };\n    };\n    // in SSR there is no need to setup an actual effect, and it should be noop\n    // unless it's eager or sync flush\n    let ssrCleanup;\n    if (isInSSRComponentSetup) {\n        // we will also not call the invalidate callback (+ runner is not set up)\n        onCleanup = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP;\n        if (!cb) {\n            getter();\n        }\n        else if (immediate) {\n            callWithAsyncErrorHandling(cb, instance, 3 /* ErrorCodes.WATCH_CALLBACK */, [\n                getter(),\n                isMultiSource ? [] : undefined,\n                onCleanup\n            ]);\n        }\n        if (flush === 'sync') {\n            const ctx = useSSRContext();\n            ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []);\n        }\n        else {\n            return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP;\n        }\n    }\n    let oldValue = isMultiSource\n        ? new Array(source.length).fill(INITIAL_WATCHER_VALUE)\n        : INITIAL_WATCHER_VALUE;\n    const job = () => {\n        if (!effect.active) {\n            return;\n        }\n        if (cb) {\n            // watch(source, cb)\n            const newValue = effect.run();\n            if (deep ||\n                forceTrigger ||\n                (isMultiSource\n                    ? newValue.some((v, i) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(v, oldValue[i]))\n                    : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(newValue, oldValue)) ||\n                (false  )) {\n                // cleanup before running cb again\n                if (cleanup) {\n                    cleanup();\n                }\n                callWithAsyncErrorHandling(cb, instance, 3 /* ErrorCodes.WATCH_CALLBACK */, [\n                    newValue,\n                    // pass undefined as the old value when it's changed for the first time\n                    oldValue === INITIAL_WATCHER_VALUE\n                        ? undefined\n                        : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE\n                            ? []\n                            : oldValue,\n                    onCleanup\n                ]);\n                oldValue = newValue;\n            }\n        }\n        else {\n            // watchEffect\n            effect.run();\n        }\n    };\n    // important: mark the job as a watcher callback so that scheduler knows\n    // it is allowed to self-trigger (#1727)\n    job.allowRecurse = !!cb;\n    let scheduler;\n    if (flush === 'sync') {\n        scheduler = job; // the scheduler function gets called directly\n    }\n    else if (flush === 'post') {\n        scheduler = () => queuePostRenderEffect(job, instance && instance.suspense);\n    }\n    else {\n        // default: 'pre'\n        job.pre = true;\n        if (instance)\n            job.id = instance.uid;\n        scheduler = () => queueJob(job);\n    }\n    const effect = new _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ReactiveEffect(getter, scheduler);\n    if ((true)) {\n        effect.onTrack = onTrack;\n        effect.onTrigger = onTrigger;\n    }\n    // initial run\n    if (cb) {\n        if (immediate) {\n            job();\n        }\n        else {\n            oldValue = effect.run();\n        }\n    }\n    else if (flush === 'post') {\n        queuePostRenderEffect(effect.run.bind(effect), instance && instance.suspense);\n    }\n    else {\n        effect.run();\n    }\n    const unwatch = () => {\n        effect.stop();\n        if (instance && instance.scope) {\n            (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.remove)(instance.scope.effects, effect);\n        }\n    };\n    if (ssrCleanup)\n        ssrCleanup.push(unwatch);\n    return unwatch;\n}\n// this.$watch\nfunction instanceWatch(source, value, options) {\n    const publicThis = this.proxy;\n    const getter = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(source)\n        ? source.includes('.')\n            ? createPathGetter(publicThis, source)\n            : () => publicThis[source]\n        : source.bind(publicThis, publicThis);\n    let cb;\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value)) {\n        cb = value;\n    }\n    else {\n        cb = value.handler;\n        options = value;\n    }\n    const cur = currentInstance;\n    setCurrentInstance(this);\n    const res = doWatch(getter, cb.bind(publicThis), options);\n    if (cur) {\n        setCurrentInstance(cur);\n    }\n    else {\n        unsetCurrentInstance();\n    }\n    return res;\n}\nfunction createPathGetter(ctx, path) {\n    const segments = path.split('.');\n    return () => {\n        let cur = ctx;\n        for (let i = 0; i < segments.length && cur; i++) {\n            cur = cur[segments[i]];\n        }\n        return cur;\n    };\n}\nfunction traverse(value, seen) {\n    if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(value) || value[\"__v_skip\" /* ReactiveFlags.SKIP */]) {\n        return value;\n    }\n    seen = seen || new Set();\n    if (seen.has(value)) {\n        return value;\n    }\n    seen.add(value);\n    if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(value)) {\n        traverse(value.value, seen);\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) {\n        for (let i = 0; i < value.length; i++) {\n            traverse(value[i], seen);\n        }\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isMap)(value)) {\n        value.forEach((v) => {\n            traverse(v, seen);\n        });\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(value)) {\n        for (const key in value) {\n            traverse(value[key], seen);\n        }\n    }\n    return value;\n}\n\nfunction useTransitionState() {\n    const state = {\n        isMounted: false,\n        isLeaving: false,\n        isUnmounting: false,\n        leavingVNodes: new Map()\n    };\n    onMounted(() => {\n        state.isMounted = true;\n    });\n    onBeforeUnmount(() => {\n        state.isUnmounting = true;\n    });\n    return state;\n}\nconst TransitionHookValidator = [Function, Array];\nconst BaseTransitionImpl = {\n    name: `BaseTransition`,\n    props: {\n        mode: String,\n        appear: Boolean,\n        persisted: Boolean,\n        // enter\n        onBeforeEnter: TransitionHookValidator,\n        onEnter: TransitionHookValidator,\n        onAfterEnter: TransitionHookValidator,\n        onEnterCancelled: TransitionHookValidator,\n        // leave\n        onBeforeLeave: TransitionHookValidator,\n        onLeave: TransitionHookValidator,\n        onAfterLeave: TransitionHookValidator,\n        onLeaveCancelled: TransitionHookValidator,\n        // appear\n        onBeforeAppear: TransitionHookValidator,\n        onAppear: TransitionHookValidator,\n        onAfterAppear: TransitionHookValidator,\n        onAppearCancelled: TransitionHookValidator\n    },\n    setup(props, { slots }) {\n        const instance = getCurrentInstance();\n        const state = useTransitionState();\n        let prevTransitionKey;\n        return () => {\n            const children = slots.default && getTransitionRawChildren(slots.default(), true);\n            if (!children || !children.length) {\n                return;\n            }\n            let child = children[0];\n            if (children.length > 1) {\n                let hasFound = false;\n                // locate first non-comment child\n                for (const c of children) {\n                    if (c.type !== Comment) {\n                        if (( true) && hasFound) {\n                            // warn more than one non-comment child\n                            warn('<transition> can only be used on a single element or component. ' +\n                                'Use <transition-group> for lists.');\n                            break;\n                        }\n                        child = c;\n                        hasFound = true;\n                        if (false)\n                            {}\n                    }\n                }\n            }\n            // there's no need to track reactivity for these props so use the raw\n            // props for a bit better perf\n            const rawProps = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(props);\n            const { mode } = rawProps;\n            // check mode\n            if (( true) &&\n                mode &&\n                mode !== 'in-out' &&\n                mode !== 'out-in' &&\n                mode !== 'default') {\n                warn(`invalid <transition> mode: ${mode}`);\n            }\n            if (state.isLeaving) {\n                return emptyPlaceholder(child);\n            }\n            // in the case of <transition><keep-alive/></transition>, we need to\n            // compare the type of the kept-alive children.\n            const innerChild = getKeepAliveChild(child);\n            if (!innerChild) {\n                return emptyPlaceholder(child);\n            }\n            const enterHooks = resolveTransitionHooks(innerChild, rawProps, state, instance);\n            setTransitionHooks(innerChild, enterHooks);\n            const oldChild = instance.subTree;\n            const oldInnerChild = oldChild && getKeepAliveChild(oldChild);\n            let transitionKeyChanged = false;\n            const { getTransitionKey } = innerChild.type;\n            if (getTransitionKey) {\n                const key = getTransitionKey();\n                if (prevTransitionKey === undefined) {\n                    prevTransitionKey = key;\n                }\n                else if (key !== prevTransitionKey) {\n                    prevTransitionKey = key;\n                    transitionKeyChanged = true;\n                }\n            }\n            // handle mode\n            if (oldInnerChild &&\n                oldInnerChild.type !== Comment &&\n                (!isSameVNodeType(innerChild, oldInnerChild) || transitionKeyChanged)) {\n                const leavingHooks = resolveTransitionHooks(oldInnerChild, rawProps, state, instance);\n                // update old tree's hooks in case of dynamic transition\n                setTransitionHooks(oldInnerChild, leavingHooks);\n                // switching between different views\n                if (mode === 'out-in') {\n                    state.isLeaving = true;\n                    // return placeholder node and queue update when leave finishes\n                    leavingHooks.afterLeave = () => {\n                        state.isLeaving = false;\n                        // #6835\n                        // it also needs to be updated when active is undefined\n                        if (instance.update.active !== false) {\n                            instance.update();\n                        }\n                    };\n                    return emptyPlaceholder(child);\n                }\n                else if (mode === 'in-out' && innerChild.type !== Comment) {\n                    leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {\n                        const leavingVNodesCache = getLeavingNodesForType(state, oldInnerChild);\n                        leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;\n                        // early removal callback\n                        el._leaveCb = () => {\n                            earlyRemove();\n                            el._leaveCb = undefined;\n                            delete enterHooks.delayedLeave;\n                        };\n                        enterHooks.delayedLeave = delayedLeave;\n                    };\n                }\n            }\n            return child;\n        };\n    }\n};\n// export the public type for h/tsx inference\n// also to avoid inline import() in generated d.ts files\nconst BaseTransition = BaseTransitionImpl;\nfunction getLeavingNodesForType(state, vnode) {\n    const { leavingVNodes } = state;\n    let leavingVNodesCache = leavingVNodes.get(vnode.type);\n    if (!leavingVNodesCache) {\n        leavingVNodesCache = Object.create(null);\n        leavingVNodes.set(vnode.type, leavingVNodesCache);\n    }\n    return leavingVNodesCache;\n}\n// The transition hooks are attached to the vnode as vnode.transition\n// and will be called at appropriate timing in the renderer.\nfunction resolveTransitionHooks(vnode, props, state, instance) {\n    const { appear, mode, persisted = false, onBeforeEnter, onEnter, onAfterEnter, onEnterCancelled, onBeforeLeave, onLeave, onAfterLeave, onLeaveCancelled, onBeforeAppear, onAppear, onAfterAppear, onAppearCancelled } = props;\n    const key = String(vnode.key);\n    const leavingVNodesCache = getLeavingNodesForType(state, vnode);\n    const callHook = (hook, args) => {\n        hook &&\n            callWithAsyncErrorHandling(hook, instance, 9 /* ErrorCodes.TRANSITION_HOOK */, args);\n    };\n    const callAsyncHook = (hook, args) => {\n        const done = args[1];\n        callHook(hook, args);\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(hook)) {\n            if (hook.every(hook => hook.length <= 1))\n                done();\n        }\n        else if (hook.length <= 1) {\n            done();\n        }\n    };\n    const hooks = {\n        mode,\n        persisted,\n        beforeEnter(el) {\n            let hook = onBeforeEnter;\n            if (!state.isMounted) {\n                if (appear) {\n                    hook = onBeforeAppear || onBeforeEnter;\n                }\n                else {\n                    return;\n                }\n            }\n            // for same element (v-show)\n            if (el._leaveCb) {\n                el._leaveCb(true /* cancelled */);\n            }\n            // for toggled element with same key (v-if)\n            const leavingVNode = leavingVNodesCache[key];\n            if (leavingVNode &&\n                isSameVNodeType(vnode, leavingVNode) &&\n                leavingVNode.el._leaveCb) {\n                // force early removal (not cancelled)\n                leavingVNode.el._leaveCb();\n            }\n            callHook(hook, [el]);\n        },\n        enter(el) {\n            let hook = onEnter;\n            let afterHook = onAfterEnter;\n            let cancelHook = onEnterCancelled;\n            if (!state.isMounted) {\n                if (appear) {\n                    hook = onAppear || onEnter;\n                    afterHook = onAfterAppear || onAfterEnter;\n                    cancelHook = onAppearCancelled || onEnterCancelled;\n                }\n                else {\n                    return;\n                }\n            }\n            let called = false;\n            const done = (el._enterCb = (cancelled) => {\n                if (called)\n                    return;\n                called = true;\n                if (cancelled) {\n                    callHook(cancelHook, [el]);\n                }\n                else {\n                    callHook(afterHook, [el]);\n                }\n                if (hooks.delayedLeave) {\n                    hooks.delayedLeave();\n                }\n                el._enterCb = undefined;\n            });\n            if (hook) {\n                callAsyncHook(hook, [el, done]);\n            }\n            else {\n                done();\n            }\n        },\n        leave(el, remove) {\n            const key = String(vnode.key);\n            if (el._enterCb) {\n                el._enterCb(true /* cancelled */);\n            }\n            if (state.isUnmounting) {\n                return remove();\n            }\n            callHook(onBeforeLeave, [el]);\n            let called = false;\n            const done = (el._leaveCb = (cancelled) => {\n                if (called)\n                    return;\n                called = true;\n                remove();\n                if (cancelled) {\n                    callHook(onLeaveCancelled, [el]);\n                }\n                else {\n                    callHook(onAfterLeave, [el]);\n                }\n                el._leaveCb = undefined;\n                if (leavingVNodesCache[key] === vnode) {\n                    delete leavingVNodesCache[key];\n                }\n            });\n            leavingVNodesCache[key] = vnode;\n            if (onLeave) {\n                callAsyncHook(onLeave, [el, done]);\n            }\n            else {\n                done();\n            }\n        },\n        clone(vnode) {\n            return resolveTransitionHooks(vnode, props, state, instance);\n        }\n    };\n    return hooks;\n}\n// the placeholder really only handles one special case: KeepAlive\n// in the case of a KeepAlive in a leave phase we need to return a KeepAlive\n// placeholder with empty content to avoid the KeepAlive instance from being\n// unmounted.\nfunction emptyPlaceholder(vnode) {\n    if (isKeepAlive(vnode)) {\n        vnode = cloneVNode(vnode);\n        vnode.children = null;\n        return vnode;\n    }\n}\nfunction getKeepAliveChild(vnode) {\n    return isKeepAlive(vnode)\n        ? vnode.children\n            ? vnode.children[0]\n            : undefined\n        : vnode;\n}\nfunction setTransitionHooks(vnode, hooks) {\n    if (vnode.shapeFlag & 6 /* ShapeFlags.COMPONENT */ && vnode.component) {\n        setTransitionHooks(vnode.component.subTree, hooks);\n    }\n    else if (vnode.shapeFlag & 128 /* ShapeFlags.SUSPENSE */) {\n        vnode.ssContent.transition = hooks.clone(vnode.ssContent);\n        vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);\n    }\n    else {\n        vnode.transition = hooks;\n    }\n}\nfunction getTransitionRawChildren(children, keepComment = false, parentKey) {\n    let ret = [];\n    let keyedFragmentCount = 0;\n    for (let i = 0; i < children.length; i++) {\n        let child = children[i];\n        // #5360 inherit parent key in case of <template v-for>\n        const key = parentKey == null\n            ? child.key\n            : String(parentKey) + String(child.key != null ? child.key : i);\n        // handle fragment children case, e.g. v-for\n        if (child.type === Fragment) {\n            if (child.patchFlag & 128 /* PatchFlags.KEYED_FRAGMENT */)\n                keyedFragmentCount++;\n            ret = ret.concat(getTransitionRawChildren(child.children, keepComment, key));\n        }\n        // comment placeholders should be skipped, e.g. v-if\n        else if (keepComment || child.type !== Comment) {\n            ret.push(key != null ? cloneVNode(child, { key }) : child);\n        }\n    }\n    // #1126 if a transition children list contains multiple sub fragments, these\n    // fragments will be merged into a flat children array. Since each v-for\n    // fragment may contain different static bindings inside, we need to de-op\n    // these children to force full diffs to ensure correct behavior.\n    if (keyedFragmentCount > 1) {\n        for (let i = 0; i < ret.length; i++) {\n            ret[i].patchFlag = -2 /* PatchFlags.BAIL */;\n        }\n    }\n    return ret;\n}\n\n// implementation, close to no-op\nfunction defineComponent(options) {\n    return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(options) ? { setup: options, name: options.name } : options;\n}\n\nconst isAsyncWrapper = (i) => !!i.type.__asyncLoader;\nfunction defineAsyncComponent(source) {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(source)) {\n        source = { loader: source };\n    }\n    const { loader, loadingComponent, errorComponent, delay = 200, timeout, // undefined = never times out\n    suspensible = true, onError: userOnError } = source;\n    let pendingRequest = null;\n    let resolvedComp;\n    let retries = 0;\n    const retry = () => {\n        retries++;\n        pendingRequest = null;\n        return load();\n    };\n    const load = () => {\n        let thisRequest;\n        return (pendingRequest ||\n            (thisRequest = pendingRequest =\n                loader()\n                    .catch(err => {\n                    err = err instanceof Error ? err : new Error(String(err));\n                    if (userOnError) {\n                        return new Promise((resolve, reject) => {\n                            const userRetry = () => resolve(retry());\n                            const userFail = () => reject(err);\n                            userOnError(err, userRetry, userFail, retries + 1);\n                        });\n                    }\n                    else {\n                        throw err;\n                    }\n                })\n                    .then((comp) => {\n                    if (thisRequest !== pendingRequest && pendingRequest) {\n                        return pendingRequest;\n                    }\n                    if (( true) && !comp) {\n                        warn(`Async component loader resolved to undefined. ` +\n                            `If you are using retry(), make sure to return its return value.`);\n                    }\n                    // interop module default\n                    if (comp &&\n                        (comp.__esModule || comp[Symbol.toStringTag] === 'Module')) {\n                        comp = comp.default;\n                    }\n                    if (( true) && comp && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(comp) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(comp)) {\n                        throw new Error(`Invalid async component load result: ${comp}`);\n                    }\n                    resolvedComp = comp;\n                    return comp;\n                })));\n    };\n    return defineComponent({\n        name: 'AsyncComponentWrapper',\n        __asyncLoader: load,\n        get __asyncResolved() {\n            return resolvedComp;\n        },\n        setup() {\n            const instance = currentInstance;\n            // already resolved\n            if (resolvedComp) {\n                return () => createInnerComp(resolvedComp, instance);\n            }\n            const onError = (err) => {\n                pendingRequest = null;\n                handleError(err, instance, 13 /* ErrorCodes.ASYNC_COMPONENT_LOADER */, !errorComponent /* do not throw in dev if user provided error component */);\n            };\n            // suspense-controlled or SSR.\n            if ((suspensible && instance.suspense) ||\n                (isInSSRComponentSetup)) {\n                return load()\n                    .then(comp => {\n                    return () => createInnerComp(comp, instance);\n                })\n                    .catch(err => {\n                    onError(err);\n                    return () => errorComponent\n                        ? createVNode(errorComponent, {\n                            error: err\n                        })\n                        : null;\n                });\n            }\n            const loaded = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref)(false);\n            const error = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref)();\n            const delayed = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref)(!!delay);\n            if (delay) {\n                setTimeout(() => {\n                    delayed.value = false;\n                }, delay);\n            }\n            if (timeout != null) {\n                setTimeout(() => {\n                    if (!loaded.value && !error.value) {\n                        const err = new Error(`Async component timed out after ${timeout}ms.`);\n                        onError(err);\n                        error.value = err;\n                    }\n                }, timeout);\n            }\n            load()\n                .then(() => {\n                loaded.value = true;\n                if (instance.parent && isKeepAlive(instance.parent.vnode)) {\n                    // parent is keep-alive, force update so the loaded component's\n                    // name is taken into account\n                    queueJob(instance.parent.update);\n                }\n            })\n                .catch(err => {\n                onError(err);\n                error.value = err;\n            });\n            return () => {\n                if (loaded.value && resolvedComp) {\n                    return createInnerComp(resolvedComp, instance);\n                }\n                else if (error.value && errorComponent) {\n                    return createVNode(errorComponent, {\n                        error: error.value\n                    });\n                }\n                else if (loadingComponent && !delayed.value) {\n                    return createVNode(loadingComponent);\n                }\n            };\n        }\n    });\n}\nfunction createInnerComp(comp, parent) {\n    const { ref, props, children, ce } = parent.vnode;\n    const vnode = createVNode(comp, props, children);\n    // ensure inner component inherits the async wrapper's ref owner\n    vnode.ref = ref;\n    // pass the custom element callback on to the inner comp\n    // and remove it from the async wrapper\n    vnode.ce = ce;\n    delete parent.vnode.ce;\n    return vnode;\n}\n\nconst isKeepAlive = (vnode) => vnode.type.__isKeepAlive;\nconst KeepAliveImpl = {\n    name: `KeepAlive`,\n    // Marker for special handling inside the renderer. We are not using a ===\n    // check directly on KeepAlive in the renderer, because importing it directly\n    // would prevent it from being tree-shaken.\n    __isKeepAlive: true,\n    props: {\n        include: [String, RegExp, Array],\n        exclude: [String, RegExp, Array],\n        max: [String, Number]\n    },\n    setup(props, { slots }) {\n        const instance = getCurrentInstance();\n        // KeepAlive communicates with the instantiated renderer via the\n        // ctx where the renderer passes in its internals,\n        // and the KeepAlive instance exposes activate/deactivate implementations.\n        // The whole point of this is to avoid importing KeepAlive directly in the\n        // renderer to facilitate tree-shaking.\n        const sharedContext = instance.ctx;\n        // if the internal renderer is not registered, it indicates that this is server-side rendering,\n        // for KeepAlive, we just need to render its children\n        if (!sharedContext.renderer) {\n            return () => {\n                const children = slots.default && slots.default();\n                return children && children.length === 1 ? children[0] : children;\n            };\n        }\n        const cache = new Map();\n        const keys = new Set();\n        let current = null;\n        if (true) {\n            instance.__v_cache = cache;\n        }\n        const parentSuspense = instance.suspense;\n        const { renderer: { p: patch, m: move, um: _unmount, o: { createElement } } } = sharedContext;\n        const storageContainer = createElement('div');\n        sharedContext.activate = (vnode, container, anchor, isSVG, optimized) => {\n            const instance = vnode.component;\n            move(vnode, container, anchor, 0 /* MoveType.ENTER */, parentSuspense);\n            // in case props have changed\n            patch(instance.vnode, vnode, container, anchor, instance, parentSuspense, isSVG, vnode.slotScopeIds, optimized);\n            queuePostRenderEffect(() => {\n                instance.isDeactivated = false;\n                if (instance.a) {\n                    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(instance.a);\n                }\n                const vnodeHook = vnode.props && vnode.props.onVnodeMounted;\n                if (vnodeHook) {\n                    invokeVNodeHook(vnodeHook, instance.parent, vnode);\n                }\n            }, parentSuspense);\n            if (true) {\n                // Update components tree\n                devtoolsComponentAdded(instance);\n            }\n        };\n        sharedContext.deactivate = (vnode) => {\n            const instance = vnode.component;\n            move(vnode, storageContainer, null, 1 /* MoveType.LEAVE */, parentSuspense);\n            queuePostRenderEffect(() => {\n                if (instance.da) {\n                    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(instance.da);\n                }\n                const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;\n                if (vnodeHook) {\n                    invokeVNodeHook(vnodeHook, instance.parent, vnode);\n                }\n                instance.isDeactivated = true;\n            }, parentSuspense);\n            if (true) {\n                // Update components tree\n                devtoolsComponentAdded(instance);\n            }\n        };\n        function unmount(vnode) {\n            // reset the shapeFlag so it can be properly unmounted\n            resetShapeFlag(vnode);\n            _unmount(vnode, instance, parentSuspense, true);\n        }\n        function pruneCache(filter) {\n            cache.forEach((vnode, key) => {\n                const name = getComponentName(vnode.type);\n                if (name && (!filter || !filter(name))) {\n                    pruneCacheEntry(key);\n                }\n            });\n        }\n        function pruneCacheEntry(key) {\n            const cached = cache.get(key);\n            if (!current || !isSameVNodeType(cached, current)) {\n                unmount(cached);\n            }\n            else if (current) {\n                // current active instance should no longer be kept-alive.\n                // we can't unmount it now but it might be later, so reset its flag now.\n                resetShapeFlag(current);\n            }\n            cache.delete(key);\n            keys.delete(key);\n        }\n        // prune cache on include/exclude prop change\n        watch(() => [props.include, props.exclude], ([include, exclude]) => {\n            include && pruneCache(name => matches(include, name));\n            exclude && pruneCache(name => !matches(exclude, name));\n        }, \n        // prune post-render after `current` has been updated\n        { flush: 'post', deep: true });\n        // cache sub tree after render\n        let pendingCacheKey = null;\n        const cacheSubtree = () => {\n            // fix #1621, the pendingCacheKey could be 0\n            if (pendingCacheKey != null) {\n                cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n            }\n        };\n        onMounted(cacheSubtree);\n        onUpdated(cacheSubtree);\n        onBeforeUnmount(() => {\n            cache.forEach(cached => {\n                const { subTree, suspense } = instance;\n                const vnode = getInnerChild(subTree);\n                if (cached.type === vnode.type && cached.key === vnode.key) {\n                    // current instance will be unmounted as part of keep-alive's unmount\n                    resetShapeFlag(vnode);\n                    // but invoke its deactivated hook here\n                    const da = vnode.component.da;\n                    da && queuePostRenderEffect(da, suspense);\n                    return;\n                }\n                unmount(cached);\n            });\n        });\n        return () => {\n            pendingCacheKey = null;\n            if (!slots.default) {\n                return null;\n            }\n            const children = slots.default();\n            const rawVNode = children[0];\n            if (children.length > 1) {\n                if ((true)) {\n                    warn(`KeepAlive should contain exactly one component child.`);\n                }\n                current = null;\n                return children;\n            }\n            else if (!isVNode(rawVNode) ||\n                (!(rawVNode.shapeFlag & 4 /* ShapeFlags.STATEFUL_COMPONENT */) &&\n                    !(rawVNode.shapeFlag & 128 /* ShapeFlags.SUSPENSE */))) {\n                current = null;\n                return rawVNode;\n            }\n            let vnode = getInnerChild(rawVNode);\n            const comp = vnode.type;\n            // for async components, name check should be based in its loaded\n            // inner component if available\n            const name = getComponentName(isAsyncWrapper(vnode)\n                ? vnode.type.__asyncResolved || {}\n                : comp);\n            const { include, exclude, max } = props;\n            if ((include && (!name || !matches(include, name))) ||\n                (exclude && name && matches(exclude, name))) {\n                current = vnode;\n                return rawVNode;\n            }\n            const key = vnode.key == null ? comp : vnode.key;\n            const cachedVNode = cache.get(key);\n            // clone vnode if it's reused because we are going to mutate it\n            if (vnode.el) {\n                vnode = cloneVNode(vnode);\n                if (rawVNode.shapeFlag & 128 /* ShapeFlags.SUSPENSE */) {\n                    rawVNode.ssContent = vnode;\n                }\n            }\n            // #1513 it's possible for the returned vnode to be cloned due to attr\n            // fallthrough or scopeId, so the vnode here may not be the final vnode\n            // that is mounted. Instead of caching it directly, we store the pending\n            // key and cache `instance.subTree` (the normalized vnode) in\n            // beforeMount/beforeUpdate hooks.\n            pendingCacheKey = key;\n            if (cachedVNode) {\n                // copy over mounted state\n                vnode.el = cachedVNode.el;\n                vnode.component = cachedVNode.component;\n                if (vnode.transition) {\n                    // recursively update transition hooks on subTree\n                    setTransitionHooks(vnode, vnode.transition);\n                }\n                // avoid vnode being mounted as fresh\n                vnode.shapeFlag |= 512 /* ShapeFlags.COMPONENT_KEPT_ALIVE */;\n                // make this key the freshest\n                keys.delete(key);\n                keys.add(key);\n            }\n            else {\n                keys.add(key);\n                // prune oldest entry\n                if (max && keys.size > parseInt(max, 10)) {\n                    pruneCacheEntry(keys.values().next().value);\n                }\n            }\n            // avoid vnode being unmounted\n            vnode.shapeFlag |= 256 /* ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE */;\n            current = vnode;\n            return isSuspense(rawVNode.type) ? rawVNode : vnode;\n        };\n    }\n};\n// export the public type for h/tsx inference\n// also to avoid inline import() in generated d.ts files\nconst KeepAlive = KeepAliveImpl;\nfunction matches(pattern, name) {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(pattern)) {\n        return pattern.some((p) => matches(p, name));\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(pattern)) {\n        return pattern.split(',').includes(name);\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isRegExp)(pattern)) {\n        return pattern.test(name);\n    }\n    /* istanbul ignore next */\n    return false;\n}\nfunction onActivated(hook, target) {\n    registerKeepAliveHook(hook, \"a\" /* LifecycleHooks.ACTIVATED */, target);\n}\nfunction onDeactivated(hook, target) {\n    registerKeepAliveHook(hook, \"da\" /* LifecycleHooks.DEACTIVATED */, target);\n}\nfunction registerKeepAliveHook(hook, type, target = currentInstance) {\n    // cache the deactivate branch check wrapper for injected hooks so the same\n    // hook can be properly deduped by the scheduler. \"__wdc\" stands for \"with\n    // deactivation check\".\n    const wrappedHook = hook.__wdc ||\n        (hook.__wdc = () => {\n            // only fire the hook if the target instance is NOT in a deactivated branch.\n            let current = target;\n            while (current) {\n                if (current.isDeactivated) {\n                    return;\n                }\n                current = current.parent;\n            }\n            return hook();\n        });\n    injectHook(type, wrappedHook, target);\n    // In addition to registering it on the target instance, we walk up the parent\n    // chain and register it on all ancestor instances that are keep-alive roots.\n    // This avoids the need to walk the entire component tree when invoking these\n    // hooks, and more importantly, avoids the need to track child components in\n    // arrays.\n    if (target) {\n        let current = target.parent;\n        while (current && current.parent) {\n            if (isKeepAlive(current.parent.vnode)) {\n                injectToKeepAliveRoot(wrappedHook, type, target, current);\n            }\n            current = current.parent;\n        }\n    }\n}\nfunction injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {\n    // injectHook wraps the original for error handling, so make sure to remove\n    // the wrapped version.\n    const injected = injectHook(type, hook, keepAliveRoot, true /* prepend */);\n    onUnmounted(() => {\n        (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.remove)(keepAliveRoot[type], injected);\n    }, target);\n}\nfunction resetShapeFlag(vnode) {\n    // bitwise operations to remove keep alive flags\n    vnode.shapeFlag &= ~256 /* ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE */;\n    vnode.shapeFlag &= ~512 /* ShapeFlags.COMPONENT_KEPT_ALIVE */;\n}\nfunction getInnerChild(vnode) {\n    return vnode.shapeFlag & 128 /* ShapeFlags.SUSPENSE */ ? vnode.ssContent : vnode;\n}\n\nfunction injectHook(type, hook, target = currentInstance, prepend = false) {\n    if (target) {\n        const hooks = target[type] || (target[type] = []);\n        // cache the error handling wrapper for injected hooks so the same hook\n        // can be properly deduped by the scheduler. \"__weh\" stands for \"with error\n        // handling\".\n        const wrappedHook = hook.__weh ||\n            (hook.__weh = (...args) => {\n                if (target.isUnmounted) {\n                    return;\n                }\n                // disable tracking inside all lifecycle hooks\n                // since they can potentially be called inside effects.\n                (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();\n                // Set currentInstance during hook invocation.\n                // This assumes the hook does not synchronously trigger other hooks, which\n                // can only be false when the user does something really funky.\n                setCurrentInstance(target);\n                const res = callWithAsyncErrorHandling(hook, target, type, args);\n                unsetCurrentInstance();\n                (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();\n                return res;\n            });\n        if (prepend) {\n            hooks.unshift(wrappedHook);\n        }\n        else {\n            hooks.push(wrappedHook);\n        }\n        return wrappedHook;\n    }\n    else if ((true)) {\n        const apiName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(ErrorTypeStrings[type].replace(/ hook$/, ''));\n        warn(`${apiName} is called when there is no active component instance to be ` +\n            `associated with. ` +\n            `Lifecycle injection APIs can only be used during execution of setup().` +\n            (` If you are using async setup(), make sure to register lifecycle ` +\n                    `hooks before the first await statement.`\n                ));\n    }\n}\nconst createHook = (lifecycle) => (hook, target = currentInstance) => \n// post-create lifecycle registrations are noops during SSR (except for serverPrefetch)\n(!isInSSRComponentSetup || lifecycle === \"sp\" /* LifecycleHooks.SERVER_PREFETCH */) &&\n    injectHook(lifecycle, (...args) => hook(...args), target);\nconst onBeforeMount = createHook(\"bm\" /* LifecycleHooks.BEFORE_MOUNT */);\nconst onMounted = createHook(\"m\" /* LifecycleHooks.MOUNTED */);\nconst onBeforeUpdate = createHook(\"bu\" /* LifecycleHooks.BEFORE_UPDATE */);\nconst onUpdated = createHook(\"u\" /* LifecycleHooks.UPDATED */);\nconst onBeforeUnmount = createHook(\"bum\" /* LifecycleHooks.BEFORE_UNMOUNT */);\nconst onUnmounted = createHook(\"um\" /* LifecycleHooks.UNMOUNTED */);\nconst onServerPrefetch = createHook(\"sp\" /* LifecycleHooks.SERVER_PREFETCH */);\nconst onRenderTriggered = createHook(\"rtg\" /* LifecycleHooks.RENDER_TRIGGERED */);\nconst onRenderTracked = createHook(\"rtc\" /* LifecycleHooks.RENDER_TRACKED */);\nfunction onErrorCaptured(hook, target = currentInstance) {\n    injectHook(\"ec\" /* LifecycleHooks.ERROR_CAPTURED */, hook, target);\n}\n\n/**\nRuntime helper for applying directives to a vnode. Example usage:\n\nconst comp = resolveComponent('comp')\nconst foo = resolveDirective('foo')\nconst bar = resolveDirective('bar')\n\nreturn withDirectives(h(comp), [\n  [foo, this.x],\n  [bar, this.y]\n])\n*/\nfunction validateDirectiveName(name) {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isBuiltInDirective)(name)) {\n        warn('Do not use built-in directive ids as custom directive id: ' + name);\n    }\n}\n/**\n * Adds directives to a VNode.\n */\nfunction withDirectives(vnode, directives) {\n    const internalInstance = currentRenderingInstance;\n    if (internalInstance === null) {\n        ( true) && warn(`withDirectives can only be used inside render functions.`);\n        return vnode;\n    }\n    const instance = getExposeProxy(internalInstance) ||\n        internalInstance.proxy;\n    const bindings = vnode.dirs || (vnode.dirs = []);\n    for (let i = 0; i < directives.length; i++) {\n        let [dir, value, arg, modifiers = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ] = directives[i];\n        if (dir) {\n            if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(dir)) {\n                dir = {\n                    mounted: dir,\n                    updated: dir\n                };\n            }\n            if (dir.deep) {\n                traverse(value);\n            }\n            bindings.push({\n                dir,\n                instance,\n                value,\n                oldValue: void 0,\n                arg,\n                modifiers\n            });\n        }\n    }\n    return vnode;\n}\nfunction invokeDirectiveHook(vnode, prevVNode, instance, name) {\n    const bindings = vnode.dirs;\n    const oldBindings = prevVNode && prevVNode.dirs;\n    for (let i = 0; i < bindings.length; i++) {\n        const binding = bindings[i];\n        if (oldBindings) {\n            binding.oldValue = oldBindings[i].value;\n        }\n        let hook = binding.dir[name];\n        if (hook) {\n            // disable tracking inside all lifecycle hooks\n            // since they can potentially be called inside effects.\n            (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();\n            callWithAsyncErrorHandling(hook, instance, 8 /* ErrorCodes.DIRECTIVE_HOOK */, [\n                vnode.el,\n                binding,\n                vnode,\n                prevVNode\n            ]);\n            (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();\n        }\n    }\n}\n\nconst COMPONENTS = 'components';\nconst DIRECTIVES = 'directives';\n/**\n * @private\n */\nfunction resolveComponent(name, maybeSelfReference) {\n    return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;\n}\nconst NULL_DYNAMIC_COMPONENT = Symbol();\n/**\n * @private\n */\nfunction resolveDynamicComponent(component) {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(component)) {\n        return resolveAsset(COMPONENTS, component, false) || component;\n    }\n    else {\n        // invalid types will fallthrough to createVNode and raise warning\n        return (component || NULL_DYNAMIC_COMPONENT);\n    }\n}\n/**\n * @private\n */\nfunction resolveDirective(name) {\n    return resolveAsset(DIRECTIVES, name);\n}\n// implementation\nfunction resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {\n    const instance = currentRenderingInstance || currentInstance;\n    if (instance) {\n        const Component = instance.type;\n        // explicit self name has highest priority\n        if (type === COMPONENTS) {\n            const selfName = getComponentName(Component, false /* do not include inferred name to avoid breaking existing code */);\n            if (selfName &&\n                (selfName === name ||\n                    selfName === (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name) ||\n                    selfName === (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name)))) {\n                return Component;\n            }\n        }\n        const res = \n        // local registration\n        // check instance[type] first which is resolved for options API\n        resolve(instance[type] || Component[type], name) ||\n            // global registration\n            resolve(instance.appContext[type], name);\n        if (!res && maybeSelfReference) {\n            // fallback to implicit self-reference\n            return Component;\n        }\n        if (( true) && warnMissing && !res) {\n            const extra = type === COMPONENTS\n                ? `\\nIf this is a native custom element, make sure to exclude it from ` +\n                    `component resolution via compilerOptions.isCustomElement.`\n                : ``;\n            warn(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);\n        }\n        return res;\n    }\n    else if ((true)) {\n        warn(`resolve${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize)(type.slice(0, -1))} ` +\n            `can only be used in render() or setup().`);\n    }\n}\nfunction resolve(registry, name) {\n    return (registry &&\n        (registry[name] ||\n            registry[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name)] ||\n            registry[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name))]));\n}\n\n/**\n * Actual implementation\n */\nfunction renderList(source, renderItem, cache, index) {\n    let ret;\n    const cached = (cache && cache[index]);\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(source) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(source)) {\n        ret = new Array(source.length);\n        for (let i = 0, l = source.length; i < l; i++) {\n            ret[i] = renderItem(source[i], i, undefined, cached && cached[i]);\n        }\n    }\n    else if (typeof source === 'number') {\n        if (( true) && !Number.isInteger(source)) {\n            warn(`The v-for range expect an integer value but got ${source}.`);\n        }\n        ret = new Array(source);\n        for (let i = 0; i < source; i++) {\n            ret[i] = renderItem(i + 1, i, undefined, cached && cached[i]);\n        }\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(source)) {\n        if (source[Symbol.iterator]) {\n            ret = Array.from(source, (item, i) => renderItem(item, i, undefined, cached && cached[i]));\n        }\n        else {\n            const keys = Object.keys(source);\n            ret = new Array(keys.length);\n            for (let i = 0, l = keys.length; i < l; i++) {\n                const key = keys[i];\n                ret[i] = renderItem(source[key], key, i, cached && cached[i]);\n            }\n        }\n    }\n    else {\n        ret = [];\n    }\n    if (cache) {\n        cache[index] = ret;\n    }\n    return ret;\n}\n\n/**\n * Compiler runtime helper for creating dynamic slots object\n * @private\n */\nfunction createSlots(slots, dynamicSlots) {\n    for (let i = 0; i < dynamicSlots.length; i++) {\n        const slot = dynamicSlots[i];\n        // array of dynamic slot generated by <template v-for=\"...\" #[...]>\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(slot)) {\n            for (let j = 0; j < slot.length; j++) {\n                slots[slot[j].name] = slot[j].fn;\n            }\n        }\n        else if (slot) {\n            // conditional single slot generated by <template v-if=\"...\" #foo>\n            slots[slot.name] = slot.key\n                ? (...args) => {\n                    const res = slot.fn(...args);\n                    // attach branch key so each conditional branch is considered a\n                    // different fragment\n                    if (res)\n                        res.key = slot.key;\n                    return res;\n                }\n                : slot.fn;\n        }\n    }\n    return slots;\n}\n\n/**\n * Compiler runtime helper for rendering `<slot/>`\n * @private\n */\nfunction renderSlot(slots, name, props = {}, \n// this is not a user-facing function, so the fallback is always generated by\n// the compiler and guaranteed to be a function returning an array\nfallback, noSlotted) {\n    if (currentRenderingInstance.isCE ||\n        (currentRenderingInstance.parent &&\n            isAsyncWrapper(currentRenderingInstance.parent) &&\n            currentRenderingInstance.parent.isCE)) {\n        if (name !== 'default')\n            props.name = name;\n        return createVNode('slot', props, fallback && fallback());\n    }\n    let slot = slots[name];\n    if (( true) && slot && slot.length > 1) {\n        warn(`SSR-optimized slot function detected in a non-SSR-optimized render ` +\n            `function. You need to mark this component with $dynamic-slots in the ` +\n            `parent template.`);\n        slot = () => [];\n    }\n    // a compiled slot disables block tracking by default to avoid manual\n    // invocation interfering with template-based block tracking, but in\n    // `renderSlot` we can be sure that it's template-based so we can force\n    // enable it.\n    if (slot && slot._c) {\n        slot._d = false;\n    }\n    openBlock();\n    const validSlotContent = slot && ensureValidVNode(slot(props));\n    const rendered = createBlock(Fragment, {\n        key: props.key ||\n            // slot content array of a dynamic conditional slot may have a branch\n            // key attached in the `createSlots` helper, respect that\n            (validSlotContent && validSlotContent.key) ||\n            `_${name}`\n    }, validSlotContent || (fallback ? fallback() : []), validSlotContent && slots._ === 1 /* SlotFlags.STABLE */\n        ? 64 /* PatchFlags.STABLE_FRAGMENT */\n        : -2 /* PatchFlags.BAIL */);\n    if (!noSlotted && rendered.scopeId) {\n        rendered.slotScopeIds = [rendered.scopeId + '-s'];\n    }\n    if (slot && slot._c) {\n        slot._d = true;\n    }\n    return rendered;\n}\nfunction ensureValidVNode(vnodes) {\n    return vnodes.some(child => {\n        if (!isVNode(child))\n            return true;\n        if (child.type === Comment)\n            return false;\n        if (child.type === Fragment &&\n            !ensureValidVNode(child.children))\n            return false;\n        return true;\n    })\n        ? vnodes\n        : null;\n}\n\n/**\n * For prefixing keys in v-on=\"obj\" with \"on\"\n * @private\n */\nfunction toHandlers(obj, preserveCaseIfNecessary) {\n    const ret = {};\n    if (( true) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(obj)) {\n        warn(`v-on with no argument expects an object value.`);\n        return ret;\n    }\n    for (const key in obj) {\n        ret[preserveCaseIfNecessary && /[A-Z]/.test(key)\n            ? `on:${key}`\n            : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(key)] = obj[key];\n    }\n    return ret;\n}\n\n/**\n * #2437 In Vue 3, functional components do not have a public instance proxy but\n * they exist in the internal parent chain. For code that relies on traversing\n * public $parent chains, skip functional ones and go to the parent instead.\n */\nconst getPublicInstance = (i) => {\n    if (!i)\n        return null;\n    if (isStatefulComponent(i))\n        return getExposeProxy(i) || i.proxy;\n    return getPublicInstance(i.parent);\n};\nconst publicPropertiesMap = \n// Move PURE marker to new line to workaround compiler discarding it\n// due to type annotation\n/*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(Object.create(null), {\n    $: i => i,\n    $el: i => i.vnode.el,\n    $data: i => i.data,\n    $props: i => (( true) ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(i.props) : 0),\n    $attrs: i => (( true) ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(i.attrs) : 0),\n    $slots: i => (( true) ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(i.slots) : 0),\n    $refs: i => (( true) ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(i.refs) : 0),\n    $parent: i => getPublicInstance(i.parent),\n    $root: i => getPublicInstance(i.root),\n    $emit: i => i.emit,\n    $options: i => ( true ? resolveMergedOptions(i) : 0),\n    $forceUpdate: i => i.f || (i.f = () => queueJob(i.update)),\n    $nextTick: i => i.n || (i.n = nextTick.bind(i.proxy)),\n    $watch: i => ( true ? instanceWatch.bind(i) : 0)\n});\nconst isReservedPrefix = (key) => key === '_' || key === '$';\nconst hasSetupBinding = (state, key) => state !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && !state.__isScriptSetup && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(state, key);\nconst PublicInstanceProxyHandlers = {\n    get({ _: instance }, key) {\n        const { ctx, setupState, data, props, accessCache, type, appContext } = instance;\n        // for internal formatters to know that this is a Vue instance\n        if (( true) && key === '__isVue') {\n            return true;\n        }\n        // data / props / ctx\n        // This getter gets called for every property access on the render context\n        // during render and is a major hotspot. The most expensive part of this\n        // is the multiple hasOwn() calls. It's much faster to do a simple property\n        // access on a plain object, so we use an accessCache object (with null\n        // prototype) to memoize what access type a key corresponds to.\n        let normalizedProps;\n        if (key[0] !== '$') {\n            const n = accessCache[key];\n            if (n !== undefined) {\n                switch (n) {\n                    case 1 /* AccessTypes.SETUP */:\n                        return setupState[key];\n                    case 2 /* AccessTypes.DATA */:\n                        return data[key];\n                    case 4 /* AccessTypes.CONTEXT */:\n                        return ctx[key];\n                    case 3 /* AccessTypes.PROPS */:\n                        return props[key];\n                    // default: just fallthrough\n                }\n            }\n            else if (hasSetupBinding(setupState, key)) {\n                accessCache[key] = 1 /* AccessTypes.SETUP */;\n                return setupState[key];\n            }\n            else if (data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(data, key)) {\n                accessCache[key] = 2 /* AccessTypes.DATA */;\n                return data[key];\n            }\n            else if (\n            // only cache other properties when instance has declared (thus stable)\n            // props\n            (normalizedProps = instance.propsOptions[0]) &&\n                (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(normalizedProps, key)) {\n                accessCache[key] = 3 /* AccessTypes.PROPS */;\n                return props[key];\n            }\n            else if (ctx !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(ctx, key)) {\n                accessCache[key] = 4 /* AccessTypes.CONTEXT */;\n                return ctx[key];\n            }\n            else if ( false || shouldCacheAccess) {\n                accessCache[key] = 0 /* AccessTypes.OTHER */;\n            }\n        }\n        const publicGetter = publicPropertiesMap[key];\n        let cssModule, globalProperties;\n        // public $xxx properties\n        if (publicGetter) {\n            if (key === '$attrs') {\n                (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.track)(instance, \"get\" /* TrackOpTypes.GET */, key);\n                ( true) && markAttrsAccessed();\n            }\n            return publicGetter(instance);\n        }\n        else if (\n        // css module (injected by vue-loader)\n        (cssModule = type.__cssModules) &&\n            (cssModule = cssModule[key])) {\n            return cssModule;\n        }\n        else if (ctx !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(ctx, key)) {\n            // user may set custom properties to `this` that start with `$`\n            accessCache[key] = 4 /* AccessTypes.CONTEXT */;\n            return ctx[key];\n        }\n        else if (\n        // global properties\n        ((globalProperties = appContext.config.globalProperties),\n            (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(globalProperties, key))) {\n            {\n                return globalProperties[key];\n            }\n        }\n        else if (( true) &&\n            currentRenderingInstance &&\n            (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(key) ||\n                // #1091 avoid internal isRef/isVNode checks on component instance leading\n                // to infinite warning loop\n                key.indexOf('__v') !== 0)) {\n            if (data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && isReservedPrefix(key[0]) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(data, key)) {\n                warn(`Property ${JSON.stringify(key)} must be accessed via $data because it starts with a reserved ` +\n                    `character (\"$\" or \"_\") and is not proxied on the render context.`);\n            }\n            else if (instance === currentRenderingInstance) {\n                warn(`Property ${JSON.stringify(key)} was accessed during render ` +\n                    `but is not defined on instance.`);\n            }\n        }\n    },\n    set({ _: instance }, key, value) {\n        const { data, setupState, ctx } = instance;\n        if (hasSetupBinding(setupState, key)) {\n            setupState[key] = value;\n            return true;\n        }\n        else if (( true) &&\n            setupState.__isScriptSetup &&\n            (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, key)) {\n            warn(`Cannot mutate <script setup> binding \"${key}\" from Options API.`);\n            return false;\n        }\n        else if (data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(data, key)) {\n            data[key] = value;\n            return true;\n        }\n        else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(instance.props, key)) {\n            ( true) && warn(`Attempting to mutate prop \"${key}\". Props are readonly.`);\n            return false;\n        }\n        if (key[0] === '$' && key.slice(1) in instance) {\n            ( true) &&\n                warn(`Attempting to mutate public property \"${key}\". ` +\n                    `Properties starting with $ are reserved and readonly.`);\n            return false;\n        }\n        else {\n            if (( true) && key in instance.appContext.config.globalProperties) {\n                Object.defineProperty(ctx, key, {\n                    enumerable: true,\n                    configurable: true,\n                    value\n                });\n            }\n            else {\n                ctx[key] = value;\n            }\n        }\n        return true;\n    },\n    has({ _: { data, setupState, accessCache, ctx, appContext, propsOptions } }, key) {\n        let normalizedProps;\n        return (!!accessCache[key] ||\n            (data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(data, key)) ||\n            hasSetupBinding(setupState, key) ||\n            ((normalizedProps = propsOptions[0]) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(normalizedProps, key)) ||\n            (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(ctx, key) ||\n            (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(publicPropertiesMap, key) ||\n            (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(appContext.config.globalProperties, key));\n    },\n    defineProperty(target, key, descriptor) {\n        if (descriptor.get != null) {\n            // invalidate key cache of a getter based property #5417\n            target._.accessCache[key] = 0;\n        }\n        else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(descriptor, 'value')) {\n            this.set(target, key, descriptor.value, null);\n        }\n        return Reflect.defineProperty(target, key, descriptor);\n    }\n};\nif (true) {\n    PublicInstanceProxyHandlers.ownKeys = (target) => {\n        warn(`Avoid app logic that relies on enumerating keys on a component instance. ` +\n            `The keys will be empty in production mode to avoid performance overhead.`);\n        return Reflect.ownKeys(target);\n    };\n}\nconst RuntimeCompiledPublicInstanceProxyHandlers = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, PublicInstanceProxyHandlers, {\n    get(target, key) {\n        // fast path for unscopables when using `with` block\n        if (key === Symbol.unscopables) {\n            return;\n        }\n        return PublicInstanceProxyHandlers.get(target, key, target);\n    },\n    has(_, key) {\n        const has = key[0] !== '_' && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isGloballyWhitelisted)(key);\n        if (( true) && !has && PublicInstanceProxyHandlers.has(_, key)) {\n            warn(`Property ${JSON.stringify(key)} should not start with _ which is a reserved prefix for Vue internals.`);\n        }\n        return has;\n    }\n});\n// dev only\n// In dev mode, the proxy target exposes the same properties as seen on `this`\n// for easier console inspection. In prod mode it will be an empty object so\n// these properties definitions can be skipped.\nfunction createDevRenderContext(instance) {\n    const target = {};\n    // expose internal instance for proxy handlers\n    Object.defineProperty(target, `_`, {\n        configurable: true,\n        enumerable: false,\n        get: () => instance\n    });\n    // expose public properties\n    Object.keys(publicPropertiesMap).forEach(key => {\n        Object.defineProperty(target, key, {\n            configurable: true,\n            enumerable: false,\n            get: () => publicPropertiesMap[key](instance),\n            // intercepted by the proxy so no need for implementation,\n            // but needed to prevent set errors\n            set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP\n        });\n    });\n    return target;\n}\n// dev only\nfunction exposePropsOnRenderContext(instance) {\n    const { ctx, propsOptions: [propsOptions] } = instance;\n    if (propsOptions) {\n        Object.keys(propsOptions).forEach(key => {\n            Object.defineProperty(ctx, key, {\n                enumerable: true,\n                configurable: true,\n                get: () => instance.props[key],\n                set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP\n            });\n        });\n    }\n}\n// dev only\nfunction exposeSetupStateOnRenderContext(instance) {\n    const { ctx, setupState } = instance;\n    Object.keys((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(setupState)).forEach(key => {\n        if (!setupState.__isScriptSetup) {\n            if (isReservedPrefix(key[0])) {\n                warn(`setup() return property ${JSON.stringify(key)} should not start with \"$\" or \"_\" ` +\n                    `which are reserved prefixes for Vue internals.`);\n                return;\n            }\n            Object.defineProperty(ctx, key, {\n                enumerable: true,\n                configurable: true,\n                get: () => setupState[key],\n                set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP\n            });\n        }\n    });\n}\n\nfunction createDuplicateChecker() {\n    const cache = Object.create(null);\n    return (type, key) => {\n        if (cache[key]) {\n            warn(`${type} property \"${key}\" is already defined in ${cache[key]}.`);\n        }\n        else {\n            cache[key] = type;\n        }\n    };\n}\nlet shouldCacheAccess = true;\nfunction applyOptions(instance) {\n    const options = resolveMergedOptions(instance);\n    const publicThis = instance.proxy;\n    const ctx = instance.ctx;\n    // do not cache property access on public proxy during state initialization\n    shouldCacheAccess = false;\n    // call beforeCreate first before accessing other options since\n    // the hook may mutate resolved options (#2791)\n    if (options.beforeCreate) {\n        callHook(options.beforeCreate, instance, \"bc\" /* LifecycleHooks.BEFORE_CREATE */);\n    }\n    const { \n    // state\n    data: dataOptions, computed: computedOptions, methods, watch: watchOptions, provide: provideOptions, inject: injectOptions, \n    // lifecycle\n    created, beforeMount, mounted, beforeUpdate, updated, activated, deactivated, beforeDestroy, beforeUnmount, destroyed, unmounted, render, renderTracked, renderTriggered, errorCaptured, serverPrefetch, \n    // public API\n    expose, inheritAttrs, \n    // assets\n    components, directives, filters } = options;\n    const checkDuplicateProperties = ( true) ? createDuplicateChecker() : 0;\n    if ((true)) {\n        const [propsOptions] = instance.propsOptions;\n        if (propsOptions) {\n            for (const key in propsOptions) {\n                checkDuplicateProperties(\"Props\" /* OptionTypes.PROPS */, key);\n            }\n        }\n    }\n    // options initialization order (to be consistent with Vue 2):\n    // - props (already done outside of this function)\n    // - inject\n    // - methods\n    // - data (deferred since it relies on `this` access)\n    // - computed\n    // - watch (deferred since it relies on `this` access)\n    if (injectOptions) {\n        resolveInjections(injectOptions, ctx, checkDuplicateProperties, instance.appContext.config.unwrapInjectedRef);\n    }\n    if (methods) {\n        for (const key in methods) {\n            const methodHandler = methods[key];\n            if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(methodHandler)) {\n                // In dev mode, we use the `createRenderContext` function to define\n                // methods to the proxy target, and those are read-only but\n                // reconfigurable, so it needs to be redefined here\n                if ((true)) {\n                    Object.defineProperty(ctx, key, {\n                        value: methodHandler.bind(publicThis),\n                        configurable: true,\n                        enumerable: true,\n                        writable: true\n                    });\n                }\n                else {}\n                if ((true)) {\n                    checkDuplicateProperties(\"Methods\" /* OptionTypes.METHODS */, key);\n                }\n            }\n            else if ((true)) {\n                warn(`Method \"${key}\" has type \"${typeof methodHandler}\" in the component definition. ` +\n                    `Did you reference the function correctly?`);\n            }\n        }\n    }\n    if (dataOptions) {\n        if (( true) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(dataOptions)) {\n            warn(`The data option must be a function. ` +\n                `Plain object usage is no longer supported.`);\n        }\n        const data = dataOptions.call(publicThis, publicThis);\n        if (( true) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPromise)(data)) {\n            warn(`data() returned a Promise - note data() cannot be async; If you ` +\n                `intend to perform data fetching before component renders, use ` +\n                `async setup() + <Suspense>.`);\n        }\n        if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(data)) {\n            ( true) && warn(`data() should return an object.`);\n        }\n        else {\n            instance.data = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.reactive)(data);\n            if ((true)) {\n                for (const key in data) {\n                    checkDuplicateProperties(\"Data\" /* OptionTypes.DATA */, key);\n                    // expose data on ctx during dev\n                    if (!isReservedPrefix(key[0])) {\n                        Object.defineProperty(ctx, key, {\n                            configurable: true,\n                            enumerable: true,\n                            get: () => data[key],\n                            set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP\n                        });\n                    }\n                }\n            }\n        }\n    }\n    // state initialization complete at this point - start caching access\n    shouldCacheAccess = true;\n    if (computedOptions) {\n        for (const key in computedOptions) {\n            const opt = computedOptions[key];\n            const get = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt)\n                ? opt.bind(publicThis, publicThis)\n                : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt.get)\n                    ? opt.get.bind(publicThis, publicThis)\n                    : _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP;\n            if (( true) && get === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP) {\n                warn(`Computed property \"${key}\" has no getter.`);\n            }\n            const set = !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt.set)\n                ? opt.set.bind(publicThis)\n                : ( true)\n                    ? () => {\n                        warn(`Write operation failed: computed property \"${key}\" is readonly.`);\n                    }\n                    : 0;\n            const c = computed({\n                get,\n                set\n            });\n            Object.defineProperty(ctx, key, {\n                enumerable: true,\n                configurable: true,\n                get: () => c.value,\n                set: v => (c.value = v)\n            });\n            if ((true)) {\n                checkDuplicateProperties(\"Computed\" /* OptionTypes.COMPUTED */, key);\n            }\n        }\n    }\n    if (watchOptions) {\n        for (const key in watchOptions) {\n            createWatcher(watchOptions[key], ctx, publicThis, key);\n        }\n    }\n    if (provideOptions) {\n        const provides = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(provideOptions)\n            ? provideOptions.call(publicThis)\n            : provideOptions;\n        Reflect.ownKeys(provides).forEach(key => {\n            provide(key, provides[key]);\n        });\n    }\n    if (created) {\n        callHook(created, instance, \"c\" /* LifecycleHooks.CREATED */);\n    }\n    function registerLifecycleHook(register, hook) {\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(hook)) {\n            hook.forEach(_hook => register(_hook.bind(publicThis)));\n        }\n        else if (hook) {\n            register(hook.bind(publicThis));\n        }\n    }\n    registerLifecycleHook(onBeforeMount, beforeMount);\n    registerLifecycleHook(onMounted, mounted);\n    registerLifecycleHook(onBeforeUpdate, beforeUpdate);\n    registerLifecycleHook(onUpdated, updated);\n    registerLifecycleHook(onActivated, activated);\n    registerLifecycleHook(onDeactivated, deactivated);\n    registerLifecycleHook(onErrorCaptured, errorCaptured);\n    registerLifecycleHook(onRenderTracked, renderTracked);\n    registerLifecycleHook(onRenderTriggered, renderTriggered);\n    registerLifecycleHook(onBeforeUnmount, beforeUnmount);\n    registerLifecycleHook(onUnmounted, unmounted);\n    registerLifecycleHook(onServerPrefetch, serverPrefetch);\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(expose)) {\n        if (expose.length) {\n            const exposed = instance.exposed || (instance.exposed = {});\n            expose.forEach(key => {\n                Object.defineProperty(exposed, key, {\n                    get: () => publicThis[key],\n                    set: val => (publicThis[key] = val)\n                });\n            });\n        }\n        else if (!instance.exposed) {\n            instance.exposed = {};\n        }\n    }\n    // options that are handled when creating the instance but also need to be\n    // applied from mixins\n    if (render && instance.render === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP) {\n        instance.render = render;\n    }\n    if (inheritAttrs != null) {\n        instance.inheritAttrs = inheritAttrs;\n    }\n    // asset options.\n    if (components)\n        instance.components = components;\n    if (directives)\n        instance.directives = directives;\n}\nfunction resolveInjections(injectOptions, ctx, checkDuplicateProperties = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP, unwrapRef = false) {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(injectOptions)) {\n        injectOptions = normalizeInject(injectOptions);\n    }\n    for (const key in injectOptions) {\n        const opt = injectOptions[key];\n        let injected;\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(opt)) {\n            if ('default' in opt) {\n                injected = inject(opt.from || key, opt.default, true /* treat default function as factory */);\n            }\n            else {\n                injected = inject(opt.from || key);\n            }\n        }\n        else {\n            injected = inject(opt);\n        }\n        if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(injected)) {\n            // TODO remove the check in 3.3\n            if (unwrapRef) {\n                Object.defineProperty(ctx, key, {\n                    enumerable: true,\n                    configurable: true,\n                    get: () => injected.value,\n                    set: v => (injected.value = v)\n                });\n            }\n            else {\n                if ((true)) {\n                    warn(`injected property \"${key}\" is a ref and will be auto-unwrapped ` +\n                        `and no longer needs \\`.value\\` in the next minor release. ` +\n                        `To opt-in to the new behavior now, ` +\n                        `set \\`app.config.unwrapInjectedRef = true\\` (this config is ` +\n                        `temporary and will not be needed in the future.)`);\n                }\n                ctx[key] = injected;\n            }\n        }\n        else {\n            ctx[key] = injected;\n        }\n        if ((true)) {\n            checkDuplicateProperties(\"Inject\" /* OptionTypes.INJECT */, key);\n        }\n    }\n}\nfunction callHook(hook, instance, type) {\n    callWithAsyncErrorHandling((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(hook)\n        ? hook.map(h => h.bind(instance.proxy))\n        : hook.bind(instance.proxy), instance, type);\n}\nfunction createWatcher(raw, ctx, publicThis, key) {\n    const getter = key.includes('.')\n        ? createPathGetter(publicThis, key)\n        : () => publicThis[key];\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(raw)) {\n        const handler = ctx[raw];\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(handler)) {\n            watch(getter, handler);\n        }\n        else if ((true)) {\n            warn(`Invalid watch handler specified by key \"${raw}\"`, handler);\n        }\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(raw)) {\n        watch(getter, raw.bind(publicThis));\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(raw)) {\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(raw)) {\n            raw.forEach(r => createWatcher(r, ctx, publicThis, key));\n        }\n        else {\n            const handler = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(raw.handler)\n                ? raw.handler.bind(publicThis)\n                : ctx[raw.handler];\n            if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(handler)) {\n                watch(getter, handler, raw);\n            }\n            else if ((true)) {\n                warn(`Invalid watch handler specified by key \"${raw.handler}\"`, handler);\n            }\n        }\n    }\n    else if ((true)) {\n        warn(`Invalid watch option: \"${key}\"`, raw);\n    }\n}\n/**\n * Resolve merged options and cache it on the component.\n * This is done only once per-component since the merging does not involve\n * instances.\n */\nfunction resolveMergedOptions(instance) {\n    const base = instance.type;\n    const { mixins, extends: extendsOptions } = base;\n    const { mixins: globalMixins, optionsCache: cache, config: { optionMergeStrategies } } = instance.appContext;\n    const cached = cache.get(base);\n    let resolved;\n    if (cached) {\n        resolved = cached;\n    }\n    else if (!globalMixins.length && !mixins && !extendsOptions) {\n        {\n            resolved = base;\n        }\n    }\n    else {\n        resolved = {};\n        if (globalMixins.length) {\n            globalMixins.forEach(m => mergeOptions(resolved, m, optionMergeStrategies, true));\n        }\n        mergeOptions(resolved, base, optionMergeStrategies);\n    }\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(base)) {\n        cache.set(base, resolved);\n    }\n    return resolved;\n}\nfunction mergeOptions(to, from, strats, asMixin = false) {\n    const { mixins, extends: extendsOptions } = from;\n    if (extendsOptions) {\n        mergeOptions(to, extendsOptions, strats, true);\n    }\n    if (mixins) {\n        mixins.forEach((m) => mergeOptions(to, m, strats, true));\n    }\n    for (const key in from) {\n        if (asMixin && key === 'expose') {\n            ( true) &&\n                warn(`\"expose\" option is ignored when declared in mixins or extends. ` +\n                    `It should only be declared in the base component itself.`);\n        }\n        else {\n            const strat = internalOptionMergeStrats[key] || (strats && strats[key]);\n            to[key] = strat ? strat(to[key], from[key]) : from[key];\n        }\n    }\n    return to;\n}\nconst internalOptionMergeStrats = {\n    data: mergeDataFn,\n    props: mergeObjectOptions,\n    emits: mergeObjectOptions,\n    // objects\n    methods: mergeObjectOptions,\n    computed: mergeObjectOptions,\n    // lifecycle\n    beforeCreate: mergeAsArray,\n    created: mergeAsArray,\n    beforeMount: mergeAsArray,\n    mounted: mergeAsArray,\n    beforeUpdate: mergeAsArray,\n    updated: mergeAsArray,\n    beforeDestroy: mergeAsArray,\n    beforeUnmount: mergeAsArray,\n    destroyed: mergeAsArray,\n    unmounted: mergeAsArray,\n    activated: mergeAsArray,\n    deactivated: mergeAsArray,\n    errorCaptured: mergeAsArray,\n    serverPrefetch: mergeAsArray,\n    // assets\n    components: mergeObjectOptions,\n    directives: mergeObjectOptions,\n    // watch\n    watch: mergeWatchOptions,\n    // provide / inject\n    provide: mergeDataFn,\n    inject: mergeInject\n};\nfunction mergeDataFn(to, from) {\n    if (!from) {\n        return to;\n    }\n    if (!to) {\n        return from;\n    }\n    return function mergedDataFn() {\n        return ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend))((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(to) ? to.call(this, this) : to, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(from) ? from.call(this, this) : from);\n    };\n}\nfunction mergeInject(to, from) {\n    return mergeObjectOptions(normalizeInject(to), normalizeInject(from));\n}\nfunction normalizeInject(raw) {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(raw)) {\n        const res = {};\n        for (let i = 0; i < raw.length; i++) {\n            res[raw[i]] = raw[i];\n        }\n        return res;\n    }\n    return raw;\n}\nfunction mergeAsArray(to, from) {\n    return to ? [...new Set([].concat(to, from))] : from;\n}\nfunction mergeObjectOptions(to, from) {\n    return to ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(Object.create(null), to), from) : from;\n}\nfunction mergeWatchOptions(to, from) {\n    if (!to)\n        return from;\n    if (!from)\n        return to;\n    const merged = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(Object.create(null), to);\n    for (const key in from) {\n        merged[key] = mergeAsArray(to[key], from[key]);\n    }\n    return merged;\n}\n\nfunction initProps(instance, rawProps, isStateful, // result of bitwise flag comparison\nisSSR = false) {\n    const props = {};\n    const attrs = {};\n    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.def)(attrs, InternalObjectKey, 1);\n    instance.propsDefaults = Object.create(null);\n    setFullProps(instance, rawProps, props, attrs);\n    // ensure all declared prop keys are present\n    for (const key in instance.propsOptions[0]) {\n        if (!(key in props)) {\n            props[key] = undefined;\n        }\n    }\n    // validation\n    if ((true)) {\n        validateProps(rawProps || {}, props, instance);\n    }\n    if (isStateful) {\n        // stateful\n        instance.props = isSSR ? props : (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReactive)(props);\n    }\n    else {\n        if (!instance.type.props) {\n            // functional w/ optional props, props === attrs\n            instance.props = attrs;\n        }\n        else {\n            // functional w/ declared props\n            instance.props = props;\n        }\n    }\n    instance.attrs = attrs;\n}\nfunction isInHmrContext(instance) {\n    while (instance) {\n        if (instance.type.__hmrId)\n            return true;\n        instance = instance.parent;\n    }\n}\nfunction updateProps(instance, rawProps, rawPrevProps, optimized) {\n    const { props, attrs, vnode: { patchFlag } } = instance;\n    const rawCurrentProps = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(props);\n    const [options] = instance.propsOptions;\n    let hasAttrsChanged = false;\n    if (\n    // always force full diff in dev\n    // - #1942 if hmr is enabled with sfc component\n    // - vite#872 non-sfc component used by sfc component\n    !(( true) && isInHmrContext(instance)) &&\n        (optimized || patchFlag > 0) &&\n        !(patchFlag & 16 /* PatchFlags.FULL_PROPS */)) {\n        if (patchFlag & 8 /* PatchFlags.PROPS */) {\n            // Compiler-generated props & no keys change, just set the updated\n            // the props.\n            const propsToUpdate = instance.vnode.dynamicProps;\n            for (let i = 0; i < propsToUpdate.length; i++) {\n                let key = propsToUpdate[i];\n                // skip if the prop key is a declared emit event listener\n                if (isEmitListener(instance.emitsOptions, key)) {\n                    continue;\n                }\n                // PROPS flag guarantees rawProps to be non-null\n                const value = rawProps[key];\n                if (options) {\n                    // attr / props separation was done on init and will be consistent\n                    // in this code path, so just check if attrs have it.\n                    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(attrs, key)) {\n                        if (value !== attrs[key]) {\n                            attrs[key] = value;\n                            hasAttrsChanged = true;\n                        }\n                    }\n                    else {\n                        const camelizedKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key);\n                        props[camelizedKey] = resolvePropValue(options, rawCurrentProps, camelizedKey, value, instance, false /* isAbsent */);\n                    }\n                }\n                else {\n                    if (value !== attrs[key]) {\n                        attrs[key] = value;\n                        hasAttrsChanged = true;\n                    }\n                }\n            }\n        }\n    }\n    else {\n        // full props update.\n        if (setFullProps(instance, rawProps, props, attrs)) {\n            hasAttrsChanged = true;\n        }\n        // in case of dynamic props, check if we need to delete keys from\n        // the props object\n        let kebabKey;\n        for (const key in rawCurrentProps) {\n            if (!rawProps ||\n                // for camelCase\n                (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, key) &&\n                    // it's possible the original props was passed in as kebab-case\n                    // and converted to camelCase (#955)\n                    ((kebabKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key)) === key || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, kebabKey)))) {\n                if (options) {\n                    if (rawPrevProps &&\n                        // for camelCase\n                        (rawPrevProps[key] !== undefined ||\n                            // for kebab-case\n                            rawPrevProps[kebabKey] !== undefined)) {\n                        props[key] = resolvePropValue(options, rawCurrentProps, key, undefined, instance, true /* isAbsent */);\n                    }\n                }\n                else {\n                    delete props[key];\n                }\n            }\n        }\n        // in the case of functional component w/o props declaration, props and\n        // attrs point to the same object so it should already have been updated.\n        if (attrs !== rawCurrentProps) {\n            for (const key in attrs) {\n                if (!rawProps ||\n                    (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, key) &&\n                        (!false ))) {\n                    delete attrs[key];\n                    hasAttrsChanged = true;\n                }\n            }\n        }\n    }\n    // trigger updates for $attrs in case it's used in component slots\n    if (hasAttrsChanged) {\n        (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.trigger)(instance, \"set\" /* TriggerOpTypes.SET */, '$attrs');\n    }\n    if ((true)) {\n        validateProps(rawProps || {}, props, instance);\n    }\n}\nfunction setFullProps(instance, rawProps, props, attrs) {\n    const [options, needCastKeys] = instance.propsOptions;\n    let hasAttrsChanged = false;\n    let rawCastValues;\n    if (rawProps) {\n        for (let key in rawProps) {\n            // key, ref are reserved and never passed down\n            if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key)) {\n                continue;\n            }\n            const value = rawProps[key];\n            // prop option names are camelized during normalization, so to support\n            // kebab -> camel conversion here we need to camelize the key.\n            let camelKey;\n            if (options && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(options, (camelKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key)))) {\n                if (!needCastKeys || !needCastKeys.includes(camelKey)) {\n                    props[camelKey] = value;\n                }\n                else {\n                    (rawCastValues || (rawCastValues = {}))[camelKey] = value;\n                }\n            }\n            else if (!isEmitListener(instance.emitsOptions, key)) {\n                if (!(key in attrs) || value !== attrs[key]) {\n                    attrs[key] = value;\n                    hasAttrsChanged = true;\n                }\n            }\n        }\n    }\n    if (needCastKeys) {\n        const rawCurrentProps = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(props);\n        const castValues = rawCastValues || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;\n        for (let i = 0; i < needCastKeys.length; i++) {\n            const key = needCastKeys[i];\n            props[key] = resolvePropValue(options, rawCurrentProps, key, castValues[key], instance, !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(castValues, key));\n        }\n    }\n    return hasAttrsChanged;\n}\nfunction resolvePropValue(options, props, key, value, instance, isAbsent) {\n    const opt = options[key];\n    if (opt != null) {\n        const hasDefault = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(opt, 'default');\n        // default values\n        if (hasDefault && value === undefined) {\n            const defaultValue = opt.default;\n            if (opt.type !== Function && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(defaultValue)) {\n                const { propsDefaults } = instance;\n                if (key in propsDefaults) {\n                    value = propsDefaults[key];\n                }\n                else {\n                    setCurrentInstance(instance);\n                    value = propsDefaults[key] = defaultValue.call(null, props);\n                    unsetCurrentInstance();\n                }\n            }\n            else {\n                value = defaultValue;\n            }\n        }\n        // boolean casting\n        if (opt[0 /* BooleanFlags.shouldCast */]) {\n            if (isAbsent && !hasDefault) {\n                value = false;\n            }\n            else if (opt[1 /* BooleanFlags.shouldCastTrue */] &&\n                (value === '' || value === (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key))) {\n                value = true;\n            }\n        }\n    }\n    return value;\n}\nfunction normalizePropsOptions(comp, appContext, asMixin = false) {\n    const cache = appContext.propsCache;\n    const cached = cache.get(comp);\n    if (cached) {\n        return cached;\n    }\n    const raw = comp.props;\n    const normalized = {};\n    const needCastKeys = [];\n    // apply mixin/extends props\n    let hasExtends = false;\n    if ( true && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(comp)) {\n        const extendProps = (raw) => {\n            hasExtends = true;\n            const [props, keys] = normalizePropsOptions(raw, appContext, true);\n            (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(normalized, props);\n            if (keys)\n                needCastKeys.push(...keys);\n        };\n        if (!asMixin && appContext.mixins.length) {\n            appContext.mixins.forEach(extendProps);\n        }\n        if (comp.extends) {\n            extendProps(comp.extends);\n        }\n        if (comp.mixins) {\n            comp.mixins.forEach(extendProps);\n        }\n    }\n    if (!raw && !hasExtends) {\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(comp)) {\n            cache.set(comp, _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR);\n        }\n        return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR;\n    }\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(raw)) {\n        for (let i = 0; i < raw.length; i++) {\n            if (( true) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(raw[i])) {\n                warn(`props must be strings when using array syntax.`, raw[i]);\n            }\n            const normalizedKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(raw[i]);\n            if (validatePropName(normalizedKey)) {\n                normalized[normalizedKey] = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;\n            }\n        }\n    }\n    else if (raw) {\n        if (( true) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(raw)) {\n            warn(`invalid props options`, raw);\n        }\n        for (const key in raw) {\n            const normalizedKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key);\n            if (validatePropName(normalizedKey)) {\n                const opt = raw[key];\n                const prop = (normalized[normalizedKey] =\n                    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(opt) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt) ? { type: opt } : Object.assign({}, opt));\n                if (prop) {\n                    const booleanIndex = getTypeIndex(Boolean, prop.type);\n                    const stringIndex = getTypeIndex(String, prop.type);\n                    prop[0 /* BooleanFlags.shouldCast */] = booleanIndex > -1;\n                    prop[1 /* BooleanFlags.shouldCastTrue */] =\n                        stringIndex < 0 || booleanIndex < stringIndex;\n                    // if the prop needs boolean casting or default value\n                    if (booleanIndex > -1 || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(prop, 'default')) {\n                        needCastKeys.push(normalizedKey);\n                    }\n                }\n            }\n        }\n    }\n    const res = [normalized, needCastKeys];\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(comp)) {\n        cache.set(comp, res);\n    }\n    return res;\n}\nfunction validatePropName(key) {\n    if (key[0] !== '$') {\n        return true;\n    }\n    else if ((true)) {\n        warn(`Invalid prop name: \"${key}\" is a reserved property.`);\n    }\n    return false;\n}\n// use function string name to check type constructors\n// so that it works across vms / iframes.\nfunction getType(ctor) {\n    const match = ctor && ctor.toString().match(/^\\s*(function|class) (\\w+)/);\n    return match ? match[2] : ctor === null ? 'null' : '';\n}\nfunction isSameType(a, b) {\n    return getType(a) === getType(b);\n}\nfunction getTypeIndex(type, expectedTypes) {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(expectedTypes)) {\n        return expectedTypes.findIndex(t => isSameType(t, type));\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(expectedTypes)) {\n        return isSameType(expectedTypes, type) ? 0 : -1;\n    }\n    return -1;\n}\n/**\n * dev only\n */\nfunction validateProps(rawProps, props, instance) {\n    const resolvedValues = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(props);\n    const options = instance.propsOptions[0];\n    for (const key in options) {\n        let opt = options[key];\n        if (opt == null)\n            continue;\n        validateProp(key, resolvedValues[key], opt, !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, key) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key)));\n    }\n}\n/**\n * dev only\n */\nfunction validateProp(name, value, prop, isAbsent) {\n    const { type, required, validator } = prop;\n    // required!\n    if (required && isAbsent) {\n        warn('Missing required prop: \"' + name + '\"');\n        return;\n    }\n    // missing but optional\n    if (value == null && !prop.required) {\n        return;\n    }\n    // type check\n    if (type != null && type !== true) {\n        let isValid = false;\n        const types = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(type) ? type : [type];\n        const expectedTypes = [];\n        // value is valid as long as one of the specified types match\n        for (let i = 0; i < types.length && !isValid; i++) {\n            const { valid, expectedType } = assertType(value, types[i]);\n            expectedTypes.push(expectedType || '');\n            isValid = valid;\n        }\n        if (!isValid) {\n            warn(getInvalidTypeMessage(name, value, expectedTypes));\n            return;\n        }\n    }\n    // custom validator\n    if (validator && !validator(value)) {\n        warn('Invalid prop: custom validator check failed for prop \"' + name + '\".');\n    }\n}\nconst isSimpleType = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)('String,Number,Boolean,Function,Symbol,BigInt');\n/**\n * dev only\n */\nfunction assertType(value, type) {\n    let valid;\n    const expectedType = getType(type);\n    if (isSimpleType(expectedType)) {\n        const t = typeof value;\n        valid = t === expectedType.toLowerCase();\n        // for primitive wrapper objects\n        if (!valid && t === 'object') {\n            valid = value instanceof type;\n        }\n    }\n    else if (expectedType === 'Object') {\n        valid = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(value);\n    }\n    else if (expectedType === 'Array') {\n        valid = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value);\n    }\n    else if (expectedType === 'null') {\n        valid = value === null;\n    }\n    else {\n        valid = value instanceof type;\n    }\n    return {\n        valid,\n        expectedType\n    };\n}\n/**\n * dev only\n */\nfunction getInvalidTypeMessage(name, value, expectedTypes) {\n    let message = `Invalid prop: type check failed for prop \"${name}\".` +\n        ` Expected ${expectedTypes.map(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize).join(' | ')}`;\n    const expectedType = expectedTypes[0];\n    const receivedType = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toRawType)(value);\n    const expectedValue = styleValue(value, expectedType);\n    const receivedValue = styleValue(value, receivedType);\n    // check if we need to specify expected value\n    if (expectedTypes.length === 1 &&\n        isExplicable(expectedType) &&\n        !isBoolean(expectedType, receivedType)) {\n        message += ` with value ${expectedValue}`;\n    }\n    message += `, got ${receivedType} `;\n    // check if we need to specify received value\n    if (isExplicable(receivedType)) {\n        message += `with value ${receivedValue}.`;\n    }\n    return message;\n}\n/**\n * dev only\n */\nfunction styleValue(value, type) {\n    if (type === 'String') {\n        return `\"${value}\"`;\n    }\n    else if (type === 'Number') {\n        return `${Number(value)}`;\n    }\n    else {\n        return `${value}`;\n    }\n}\n/**\n * dev only\n */\nfunction isExplicable(type) {\n    const explicitTypes = ['string', 'number', 'boolean'];\n    return explicitTypes.some(elem => type.toLowerCase() === elem);\n}\n/**\n * dev only\n */\nfunction isBoolean(...args) {\n    return args.some(elem => elem.toLowerCase() === 'boolean');\n}\n\nconst isInternalKey = (key) => key[0] === '_' || key === '$stable';\nconst normalizeSlotValue = (value) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)\n    ? value.map(normalizeVNode)\n    : [normalizeVNode(value)];\nconst normalizeSlot = (key, rawSlot, ctx) => {\n    if (rawSlot._n) {\n        // already normalized - #5353\n        return rawSlot;\n    }\n    const normalized = withCtx((...args) => {\n        if (( true) && currentInstance) {\n            warn(`Slot \"${key}\" invoked outside of the render function: ` +\n                `this will not track dependencies used in the slot. ` +\n                `Invoke the slot function inside the render function instead.`);\n        }\n        return normalizeSlotValue(rawSlot(...args));\n    }, ctx);\n    normalized._c = false;\n    return normalized;\n};\nconst normalizeObjectSlots = (rawSlots, slots, instance) => {\n    const ctx = rawSlots._ctx;\n    for (const key in rawSlots) {\n        if (isInternalKey(key))\n            continue;\n        const value = rawSlots[key];\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value)) {\n            slots[key] = normalizeSlot(key, value, ctx);\n        }\n        else if (value != null) {\n            if (true) {\n                warn(`Non-function value encountered for slot \"${key}\". ` +\n                    `Prefer function slots for better performance.`);\n            }\n            const normalized = normalizeSlotValue(value);\n            slots[key] = () => normalized;\n        }\n    }\n};\nconst normalizeVNodeSlots = (instance, children) => {\n    if (( true) &&\n        !isKeepAlive(instance.vnode) &&\n        !(false )) {\n        warn(`Non-function value encountered for default slot. ` +\n            `Prefer function slots for better performance.`);\n    }\n    const normalized = normalizeSlotValue(children);\n    instance.slots.default = () => normalized;\n};\nconst initSlots = (instance, children) => {\n    if (instance.vnode.shapeFlag & 32 /* ShapeFlags.SLOTS_CHILDREN */) {\n        const type = children._;\n        if (type) {\n            // users can get the shallow readonly version of the slots object through `this.$slots`,\n            // we should avoid the proxy object polluting the slots of the internal instance\n            instance.slots = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(children);\n            // make compiler marker non-enumerable\n            (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.def)(children, '_', type);\n        }\n        else {\n            normalizeObjectSlots(children, (instance.slots = {}));\n        }\n    }\n    else {\n        instance.slots = {};\n        if (children) {\n            normalizeVNodeSlots(instance, children);\n        }\n    }\n    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.def)(instance.slots, InternalObjectKey, 1);\n};\nconst updateSlots = (instance, children, optimized) => {\n    const { vnode, slots } = instance;\n    let needDeletionCheck = true;\n    let deletionComparisonTarget = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;\n    if (vnode.shapeFlag & 32 /* ShapeFlags.SLOTS_CHILDREN */) {\n        const type = children._;\n        if (type) {\n            // compiled slots.\n            if (( true) && isHmrUpdating) {\n                // Parent was HMR updated so slot content may have changed.\n                // force update slots and mark instance for hmr as well\n                (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(slots, children);\n            }\n            else if (optimized && type === 1 /* SlotFlags.STABLE */) {\n                // compiled AND stable.\n                // no need to update, and skip stale slots removal.\n                needDeletionCheck = false;\n            }\n            else {\n                // compiled but dynamic (v-if/v-for on slots) - update slots, but skip\n                // normalization.\n                (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(slots, children);\n                // #2893\n                // when rendering the optimized slots by manually written render function,\n                // we need to delete the `slots._` flag if necessary to make subsequent updates reliable,\n                // i.e. let the `renderSlot` create the bailed Fragment\n                if (!optimized && type === 1 /* SlotFlags.STABLE */) {\n                    delete slots._;\n                }\n            }\n        }\n        else {\n            needDeletionCheck = !children.$stable;\n            normalizeObjectSlots(children, slots);\n        }\n        deletionComparisonTarget = children;\n    }\n    else if (children) {\n        // non slot object children (direct value) passed to a component\n        normalizeVNodeSlots(instance, children);\n        deletionComparisonTarget = { default: 1 };\n    }\n    // delete stale slots\n    if (needDeletionCheck) {\n        for (const key in slots) {\n            if (!isInternalKey(key) && !(key in deletionComparisonTarget)) {\n                delete slots[key];\n            }\n        }\n    }\n};\n\nfunction createAppContext() {\n    return {\n        app: null,\n        config: {\n            isNativeTag: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NO,\n            performance: false,\n            globalProperties: {},\n            optionMergeStrategies: {},\n            errorHandler: undefined,\n            warnHandler: undefined,\n            compilerOptions: {}\n        },\n        mixins: [],\n        components: {},\n        directives: {},\n        provides: Object.create(null),\n        optionsCache: new WeakMap(),\n        propsCache: new WeakMap(),\n        emitsCache: new WeakMap()\n    };\n}\nlet uid$1 = 0;\nfunction createAppAPI(render, hydrate) {\n    return function createApp(rootComponent, rootProps = null) {\n        if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(rootComponent)) {\n            rootComponent = Object.assign({}, rootComponent);\n        }\n        if (rootProps != null && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(rootProps)) {\n            ( true) && warn(`root props passed to app.mount() must be an object.`);\n            rootProps = null;\n        }\n        const context = createAppContext();\n        const installedPlugins = new Set();\n        let isMounted = false;\n        const app = (context.app = {\n            _uid: uid$1++,\n            _component: rootComponent,\n            _props: rootProps,\n            _container: null,\n            _context: context,\n            _instance: null,\n            version,\n            get config() {\n                return context.config;\n            },\n            set config(v) {\n                if ((true)) {\n                    warn(`app.config cannot be replaced. Modify individual options instead.`);\n                }\n            },\n            use(plugin, ...options) {\n                if (installedPlugins.has(plugin)) {\n                    ( true) && warn(`Plugin has already been applied to target app.`);\n                }\n                else if (plugin && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(plugin.install)) {\n                    installedPlugins.add(plugin);\n                    plugin.install(app, ...options);\n                }\n                else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(plugin)) {\n                    installedPlugins.add(plugin);\n                    plugin(app, ...options);\n                }\n                else if ((true)) {\n                    warn(`A plugin must either be a function or an object with an \"install\" ` +\n                        `function.`);\n                }\n                return app;\n            },\n            mixin(mixin) {\n                if (true) {\n                    if (!context.mixins.includes(mixin)) {\n                        context.mixins.push(mixin);\n                    }\n                    else if ((true)) {\n                        warn('Mixin has already been applied to target app' +\n                            (mixin.name ? `: ${mixin.name}` : ''));\n                    }\n                }\n                else {}\n                return app;\n            },\n            component(name, component) {\n                if ((true)) {\n                    validateComponentName(name, context.config);\n                }\n                if (!component) {\n                    return context.components[name];\n                }\n                if (( true) && context.components[name]) {\n                    warn(`Component \"${name}\" has already been registered in target app.`);\n                }\n                context.components[name] = component;\n                return app;\n            },\n            directive(name, directive) {\n                if ((true)) {\n                    validateDirectiveName(name);\n                }\n                if (!directive) {\n                    return context.directives[name];\n                }\n                if (( true) && context.directives[name]) {\n                    warn(`Directive \"${name}\" has already been registered in target app.`);\n                }\n                context.directives[name] = directive;\n                return app;\n            },\n            mount(rootContainer, isHydrate, isSVG) {\n                if (!isMounted) {\n                    // #5571\n                    if (( true) && rootContainer.__vue_app__) {\n                        warn(`There is already an app instance mounted on the host container.\\n` +\n                            ` If you want to mount another app on the same host container,` +\n                            ` you need to unmount the previous app by calling \\`app.unmount()\\` first.`);\n                    }\n                    const vnode = createVNode(rootComponent, rootProps);\n                    // store app context on the root VNode.\n                    // this will be set on the root instance on initial mount.\n                    vnode.appContext = context;\n                    // HMR root reload\n                    if ((true)) {\n                        context.reload = () => {\n                            render(cloneVNode(vnode), rootContainer, isSVG);\n                        };\n                    }\n                    if (isHydrate && hydrate) {\n                        hydrate(vnode, rootContainer);\n                    }\n                    else {\n                        render(vnode, rootContainer, isSVG);\n                    }\n                    isMounted = true;\n                    app._container = rootContainer;\n                    rootContainer.__vue_app__ = app;\n                    if (true) {\n                        app._instance = vnode.component;\n                        devtoolsInitApp(app, version);\n                    }\n                    return getExposeProxy(vnode.component) || vnode.component.proxy;\n                }\n                else if ((true)) {\n                    warn(`App has already been mounted.\\n` +\n                        `If you want to remount the same app, move your app creation logic ` +\n                        `into a factory function and create fresh app instances for each ` +\n                        `mount - e.g. \\`const createMyApp = () => createApp(App)\\``);\n                }\n            },\n            unmount() {\n                if (isMounted) {\n                    render(null, app._container);\n                    if (true) {\n                        app._instance = null;\n                        devtoolsUnmountApp(app);\n                    }\n                    delete app._container.__vue_app__;\n                }\n                else if ((true)) {\n                    warn(`Cannot unmount an app that is not mounted.`);\n                }\n            },\n            provide(key, value) {\n                if (( true) && key in context.provides) {\n                    warn(`App already provides property with key \"${String(key)}\". ` +\n                        `It will be overwritten with the new value.`);\n                }\n                context.provides[key] = value;\n                return app;\n            }\n        });\n        return app;\n    };\n}\n\n/**\n * Function for handling a template ref\n */\nfunction setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(rawRef)) {\n        rawRef.forEach((r, i) => setRef(r, oldRawRef && ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(oldRawRef) ? oldRawRef[i] : oldRawRef), parentSuspense, vnode, isUnmount));\n        return;\n    }\n    if (isAsyncWrapper(vnode) && !isUnmount) {\n        // when mounting async components, nothing needs to be done,\n        // because the template ref is forwarded to inner component\n        return;\n    }\n    const refValue = vnode.shapeFlag & 4 /* ShapeFlags.STATEFUL_COMPONENT */\n        ? getExposeProxy(vnode.component) || vnode.component.proxy\n        : vnode.el;\n    const value = isUnmount ? null : refValue;\n    const { i: owner, r: ref } = rawRef;\n    if (( true) && !owner) {\n        warn(`Missing ref owner context. ref cannot be used on hoisted vnodes. ` +\n            `A vnode with ref must be created inside the render function.`);\n        return;\n    }\n    const oldRef = oldRawRef && oldRawRef.r;\n    const refs = owner.refs === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ ? (owner.refs = {}) : owner.refs;\n    const setupState = owner.setupState;\n    // dynamic ref changed. unset old ref\n    if (oldRef != null && oldRef !== ref) {\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(oldRef)) {\n            refs[oldRef] = null;\n            if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, oldRef)) {\n                setupState[oldRef] = null;\n            }\n        }\n        else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(oldRef)) {\n            oldRef.value = null;\n        }\n    }\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(ref)) {\n        callWithErrorHandling(ref, owner, 12 /* ErrorCodes.FUNCTION_REF */, [value, refs]);\n    }\n    else {\n        const _isString = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(ref);\n        const _isRef = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(ref);\n        if (_isString || _isRef) {\n            const doSet = () => {\n                if (rawRef.f) {\n                    const existing = _isString\n                        ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, ref)\n                            ? setupState[ref]\n                            : refs[ref]\n                        : ref.value;\n                    if (isUnmount) {\n                        (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(existing) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.remove)(existing, refValue);\n                    }\n                    else {\n                        if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(existing)) {\n                            if (_isString) {\n                                refs[ref] = [refValue];\n                                if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, ref)) {\n                                    setupState[ref] = refs[ref];\n                                }\n                            }\n                            else {\n                                ref.value = [refValue];\n                                if (rawRef.k)\n                                    refs[rawRef.k] = ref.value;\n                            }\n                        }\n                        else if (!existing.includes(refValue)) {\n                            existing.push(refValue);\n                        }\n                    }\n                }\n                else if (_isString) {\n                    refs[ref] = value;\n                    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, ref)) {\n                        setupState[ref] = value;\n                    }\n                }\n                else if (_isRef) {\n                    ref.value = value;\n                    if (rawRef.k)\n                        refs[rawRef.k] = value;\n                }\n                else if ((true)) {\n                    warn('Invalid template ref type:', ref, `(${typeof ref})`);\n                }\n            };\n            if (value) {\n                doSet.id = -1;\n                queuePostRenderEffect(doSet, parentSuspense);\n            }\n            else {\n                doSet();\n            }\n        }\n        else if ((true)) {\n            warn('Invalid template ref type:', ref, `(${typeof ref})`);\n        }\n    }\n}\n\nlet hasMismatch = false;\nconst isSVGContainer = (container) => /svg/.test(container.namespaceURI) && container.tagName !== 'foreignObject';\nconst isComment = (node) => node.nodeType === 8 /* DOMNodeTypes.COMMENT */;\n// Note: hydration is DOM-specific\n// But we have to place it in core due to tight coupling with core - splitting\n// it out creates a ton of unnecessary complexity.\n// Hydration also depends on some renderer internal logic which needs to be\n// passed in via arguments.\nfunction createHydrationFunctions(rendererInternals) {\n    const { mt: mountComponent, p: patch, o: { patchProp, createText, nextSibling, parentNode, remove, insert, createComment } } = rendererInternals;\n    const hydrate = (vnode, container) => {\n        if (!container.hasChildNodes()) {\n            ( true) &&\n                warn(`Attempting to hydrate existing markup but container is empty. ` +\n                    `Performing full mount instead.`);\n            patch(null, vnode, container);\n            flushPostFlushCbs();\n            container._vnode = vnode;\n            return;\n        }\n        hasMismatch = false;\n        hydrateNode(container.firstChild, vnode, null, null, null);\n        flushPostFlushCbs();\n        container._vnode = vnode;\n        if (hasMismatch && !false) {\n            // this error should show up in production\n            console.error(`Hydration completed but contains mismatches.`);\n        }\n    };\n    const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {\n        const isFragmentStart = isComment(node) && node.data === '[';\n        const onMismatch = () => handleMismatch(node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragmentStart);\n        const { type, ref, shapeFlag, patchFlag } = vnode;\n        let domType = node.nodeType;\n        vnode.el = node;\n        if (patchFlag === -2 /* PatchFlags.BAIL */) {\n            optimized = false;\n            vnode.dynamicChildren = null;\n        }\n        let nextNode = null;\n        switch (type) {\n            case Text:\n                if (domType !== 3 /* DOMNodeTypes.TEXT */) {\n                    // #5728 empty text node inside a slot can cause hydration failure\n                    // because the server rendered HTML won't contain a text node\n                    if (vnode.children === '') {\n                        insert((vnode.el = createText('')), parentNode(node), node);\n                        nextNode = node;\n                    }\n                    else {\n                        nextNode = onMismatch();\n                    }\n                }\n                else {\n                    if (node.data !== vnode.children) {\n                        hasMismatch = true;\n                        ( true) &&\n                            warn(`Hydration text mismatch:` +\n                                `\\n- Client: ${JSON.stringify(node.data)}` +\n                                `\\n- Server: ${JSON.stringify(vnode.children)}`);\n                        node.data = vnode.children;\n                    }\n                    nextNode = nextSibling(node);\n                }\n                break;\n            case Comment:\n                if (domType !== 8 /* DOMNodeTypes.COMMENT */ || isFragmentStart) {\n                    nextNode = onMismatch();\n                }\n                else {\n                    nextNode = nextSibling(node);\n                }\n                break;\n            case Static:\n                if (isFragmentStart) {\n                    // entire template is static but SSRed as a fragment\n                    node = nextSibling(node);\n                    domType = node.nodeType;\n                }\n                if (domType === 1 /* DOMNodeTypes.ELEMENT */ || domType === 3 /* DOMNodeTypes.TEXT */) {\n                    // determine anchor, adopt content\n                    nextNode = node;\n                    // if the static vnode has its content stripped during build,\n                    // adopt it from the server-rendered HTML.\n                    const needToAdoptContent = !vnode.children.length;\n                    for (let i = 0; i < vnode.staticCount; i++) {\n                        if (needToAdoptContent)\n                            vnode.children +=\n                                nextNode.nodeType === 1 /* DOMNodeTypes.ELEMENT */\n                                    ? nextNode.outerHTML\n                                    : nextNode.data;\n                        if (i === vnode.staticCount - 1) {\n                            vnode.anchor = nextNode;\n                        }\n                        nextNode = nextSibling(nextNode);\n                    }\n                    return isFragmentStart ? nextSibling(nextNode) : nextNode;\n                }\n                else {\n                    onMismatch();\n                }\n                break;\n            case Fragment:\n                if (!isFragmentStart) {\n                    nextNode = onMismatch();\n                }\n                else {\n                    nextNode = hydrateFragment(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized);\n                }\n                break;\n            default:\n                if (shapeFlag & 1 /* ShapeFlags.ELEMENT */) {\n                    if (domType !== 1 /* DOMNodeTypes.ELEMENT */ ||\n                        vnode.type.toLowerCase() !==\n                            node.tagName.toLowerCase()) {\n                        nextNode = onMismatch();\n                    }\n                    else {\n                        nextNode = hydrateElement(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized);\n                    }\n                }\n                else if (shapeFlag & 6 /* ShapeFlags.COMPONENT */) {\n                    // when setting up the render effect, if the initial vnode already\n                    // has .el set, the component will perform hydration instead of mount\n                    // on its sub-tree.\n                    vnode.slotScopeIds = slotScopeIds;\n                    const container = parentNode(node);\n                    mountComponent(vnode, container, null, parentComponent, parentSuspense, isSVGContainer(container), optimized);\n                    // component may be async, so in the case of fragments we cannot rely\n                    // on component's rendered output to determine the end of the fragment\n                    // instead, we do a lookahead to find the end anchor node.\n                    nextNode = isFragmentStart\n                        ? locateClosingAsyncAnchor(node)\n                        : nextSibling(node);\n                    // #4293 teleport as component root\n                    if (nextNode &&\n                        isComment(nextNode) &&\n                        nextNode.data === 'teleport end') {\n                        nextNode = nextSibling(nextNode);\n                    }\n                    // #3787\n                    // if component is async, it may get moved / unmounted before its\n                    // inner component is loaded, so we need to give it a placeholder\n                    // vnode that matches its adopted DOM.\n                    if (isAsyncWrapper(vnode)) {\n                        let subTree;\n                        if (isFragmentStart) {\n                            subTree = createVNode(Fragment);\n                            subTree.anchor = nextNode\n                                ? nextNode.previousSibling\n                                : container.lastChild;\n                        }\n                        else {\n                            subTree =\n                                node.nodeType === 3 ? createTextVNode('') : createVNode('div');\n                        }\n                        subTree.el = node;\n                        vnode.component.subTree = subTree;\n                    }\n                }\n                else if (shapeFlag & 64 /* ShapeFlags.TELEPORT */) {\n                    if (domType !== 8 /* DOMNodeTypes.COMMENT */) {\n                        nextNode = onMismatch();\n                    }\n                    else {\n                        nextNode = vnode.type.hydrate(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, rendererInternals, hydrateChildren);\n                    }\n                }\n                else if (shapeFlag & 128 /* ShapeFlags.SUSPENSE */) {\n                    nextNode = vnode.type.hydrate(node, vnode, parentComponent, parentSuspense, isSVGContainer(parentNode(node)), slotScopeIds, optimized, rendererInternals, hydrateNode);\n                }\n                else if ((true)) {\n                    warn('Invalid HostVNode type:', type, `(${typeof type})`);\n                }\n        }\n        if (ref != null) {\n            setRef(ref, null, parentSuspense, vnode);\n        }\n        return nextNode;\n    };\n    const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n        optimized = optimized || !!vnode.dynamicChildren;\n        const { type, props, patchFlag, shapeFlag, dirs } = vnode;\n        // #4006 for form elements with non-string v-model value bindings\n        // e.g. <option :value=\"obj\">, <input type=\"checkbox\" :true-value=\"1\">\n        const forcePatchValue = (type === 'input' && dirs) || type === 'option';\n        // skip props & children if this is hoisted static nodes\n        // #5405 in dev, always hydrate children for HMR\n        if (true /* PatchFlags.HOISTED */) {\n            if (dirs) {\n                invokeDirectiveHook(vnode, null, parentComponent, 'created');\n            }\n            // props\n            if (props) {\n                if (forcePatchValue ||\n                    !optimized ||\n                    patchFlag & (16 /* PatchFlags.FULL_PROPS */ | 32 /* PatchFlags.HYDRATE_EVENTS */)) {\n                    for (const key in props) {\n                        if ((forcePatchValue && key.endsWith('value')) ||\n                            ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key))) {\n                            patchProp(el, key, null, props[key], false, undefined, parentComponent);\n                        }\n                    }\n                }\n                else if (props.onClick) {\n                    // Fast path for click listeners (which is most often) to avoid\n                    // iterating through props.\n                    patchProp(el, 'onClick', null, props.onClick, false, undefined, parentComponent);\n                }\n            }\n            // vnode / directive hooks\n            let vnodeHooks;\n            if ((vnodeHooks = props && props.onVnodeBeforeMount)) {\n                invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n            }\n            if (dirs) {\n                invokeDirectiveHook(vnode, null, parentComponent, 'beforeMount');\n            }\n            if ((vnodeHooks = props && props.onVnodeMounted) || dirs) {\n                queueEffectWithSuspense(() => {\n                    vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n                    dirs && invokeDirectiveHook(vnode, null, parentComponent, 'mounted');\n                }, parentSuspense);\n            }\n            // children\n            if (shapeFlag & 16 /* ShapeFlags.ARRAY_CHILDREN */ &&\n                // skip if element has innerHTML / textContent\n                !(props && (props.innerHTML || props.textContent))) {\n                let next = hydrateChildren(el.firstChild, vnode, el, parentComponent, parentSuspense, slotScopeIds, optimized);\n                let hasWarned = false;\n                while (next) {\n                    hasMismatch = true;\n                    if (( true) && !hasWarned) {\n                        warn(`Hydration children mismatch in <${vnode.type}>: ` +\n                            `server rendered element contains more child nodes than client vdom.`);\n                        hasWarned = true;\n                    }\n                    // The SSRed DOM contains more nodes than it should. Remove them.\n                    const cur = next;\n                    next = next.nextSibling;\n                    remove(cur);\n                }\n            }\n            else if (shapeFlag & 8 /* ShapeFlags.TEXT_CHILDREN */) {\n                if (el.textContent !== vnode.children) {\n                    hasMismatch = true;\n                    ( true) &&\n                        warn(`Hydration text content mismatch in <${vnode.type}>:\\n` +\n                            `- Client: ${el.textContent}\\n` +\n                            `- Server: ${vnode.children}`);\n                    el.textContent = vnode.children;\n                }\n            }\n        }\n        return el.nextSibling;\n    };\n    const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n        optimized = optimized || !!parentVNode.dynamicChildren;\n        const children = parentVNode.children;\n        const l = children.length;\n        let hasWarned = false;\n        for (let i = 0; i < l; i++) {\n            const vnode = optimized\n                ? children[i]\n                : (children[i] = normalizeVNode(children[i]));\n            if (node) {\n                node = hydrateNode(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized);\n            }\n            else if (vnode.type === Text && !vnode.children) {\n                continue;\n            }\n            else {\n                hasMismatch = true;\n                if (( true) && !hasWarned) {\n                    warn(`Hydration children mismatch in <${container.tagName.toLowerCase()}>: ` +\n                        `server rendered element contains fewer child nodes than client vdom.`);\n                    hasWarned = true;\n                }\n                // the SSRed DOM didn't contain enough nodes. Mount the missing ones.\n                patch(null, vnode, container, null, parentComponent, parentSuspense, isSVGContainer(container), slotScopeIds);\n            }\n        }\n        return node;\n    };\n    const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n        const { slotScopeIds: fragmentSlotScopeIds } = vnode;\n        if (fragmentSlotScopeIds) {\n            slotScopeIds = slotScopeIds\n                ? slotScopeIds.concat(fragmentSlotScopeIds)\n                : fragmentSlotScopeIds;\n        }\n        const container = parentNode(node);\n        const next = hydrateChildren(nextSibling(node), vnode, container, parentComponent, parentSuspense, slotScopeIds, optimized);\n        if (next && isComment(next) && next.data === ']') {\n            return nextSibling((vnode.anchor = next));\n        }\n        else {\n            // fragment didn't hydrate successfully, since we didn't get a end anchor\n            // back. This should have led to node/children mismatch warnings.\n            hasMismatch = true;\n            // since the anchor is missing, we need to create one and insert it\n            insert((vnode.anchor = createComment(`]`)), container, next);\n            return next;\n        }\n    };\n    const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {\n        hasMismatch = true;\n        ( true) &&\n            warn(`Hydration node mismatch:\\n- Client vnode:`, vnode.type, `\\n- Server rendered DOM:`, node, node.nodeType === 3 /* DOMNodeTypes.TEXT */\n                ? `(text)`\n                : isComment(node) && node.data === '['\n                    ? `(start of fragment)`\n                    : ``);\n        vnode.el = null;\n        if (isFragment) {\n            // remove excessive fragment nodes\n            const end = locateClosingAsyncAnchor(node);\n            while (true) {\n                const next = nextSibling(node);\n                if (next && next !== end) {\n                    remove(next);\n                }\n                else {\n                    break;\n                }\n            }\n        }\n        const next = nextSibling(node);\n        const container = parentNode(node);\n        remove(node);\n        patch(null, vnode, container, next, parentComponent, parentSuspense, isSVGContainer(container), slotScopeIds);\n        return next;\n    };\n    const locateClosingAsyncAnchor = (node) => {\n        let match = 0;\n        while (node) {\n            node = nextSibling(node);\n            if (node && isComment(node)) {\n                if (node.data === '[')\n                    match++;\n                if (node.data === ']') {\n                    if (match === 0) {\n                        return nextSibling(node);\n                    }\n                    else {\n                        match--;\n                    }\n                }\n            }\n        }\n        return node;\n    };\n    return [hydrate, hydrateNode];\n}\n\n/* eslint-disable no-restricted-globals */\nlet supported;\nlet perf;\nfunction startMeasure(instance, type) {\n    if (instance.appContext.config.performance && isSupported()) {\n        perf.mark(`vue-${type}-${instance.uid}`);\n    }\n    if (true) {\n        devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now());\n    }\n}\nfunction endMeasure(instance, type) {\n    if (instance.appContext.config.performance && isSupported()) {\n        const startTag = `vue-${type}-${instance.uid}`;\n        const endTag = startTag + `:end`;\n        perf.mark(endTag);\n        perf.measure(`<${formatComponentName(instance, instance.type)}> ${type}`, startTag, endTag);\n        perf.clearMarks(startTag);\n        perf.clearMarks(endTag);\n    }\n    if (true) {\n        devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now());\n    }\n}\nfunction isSupported() {\n    if (supported !== undefined) {\n        return supported;\n    }\n    if (typeof window !== 'undefined' && window.performance) {\n        supported = true;\n        perf = window.performance;\n    }\n    else {\n        supported = false;\n    }\n    return supported;\n}\n\n/**\n * This is only called in esm-bundler builds.\n * It is called when a renderer is created, in `baseCreateRenderer` so that\n * importing runtime-core is side-effects free.\n *\n * istanbul-ignore-next\n */\nfunction initFeatureFlags() {\n    const needWarn = [];\n    if (false) {}\n    if (false) {}\n    if (( true) && needWarn.length) {\n        const multi = needWarn.length > 1;\n        console.warn(`Feature flag${multi ? `s` : ``} ${needWarn.join(', ')} ${multi ? `are` : `is`} not explicitly defined. You are running the esm-bundler build of Vue, ` +\n            `which expects these compile-time feature flags to be globally injected ` +\n            `via the bundler config in order to get better tree-shaking in the ` +\n            `production bundle.\\n\\n` +\n            `For more details, see https://link.vuejs.org/feature-flags.`);\n    }\n}\n\nconst queuePostRenderEffect = queueEffectWithSuspense\n    ;\n/**\n * The createRenderer function accepts two generic arguments:\n * HostNode and HostElement, corresponding to Node and Element types in the\n * host environment. For example, for runtime-dom, HostNode would be the DOM\n * `Node` interface and HostElement would be the DOM `Element` interface.\n *\n * Custom renderers can pass in the platform specific types like this:\n *\n * ``` js\n * const { render, createApp } = createRenderer<Node, Element>({\n *   patchProp,\n *   ...nodeOps\n * })\n * ```\n */\nfunction createRenderer(options) {\n    return baseCreateRenderer(options);\n}\n// Separate API for creating hydration-enabled renderer.\n// Hydration logic is only used when calling this function, making it\n// tree-shakable.\nfunction createHydrationRenderer(options) {\n    return baseCreateRenderer(options, createHydrationFunctions);\n}\n// implementation\nfunction baseCreateRenderer(options, createHydrationFns) {\n    // compile-time feature flags check\n    {\n        initFeatureFlags();\n    }\n    const target = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.getGlobalThis)();\n    target.__VUE__ = true;\n    if (true) {\n        setDevtoolsHook(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target);\n    }\n    const { insert: hostInsert, remove: hostRemove, patchProp: hostPatchProp, createElement: hostCreateElement, createText: hostCreateText, createComment: hostCreateComment, setText: hostSetText, setElementText: hostSetElementText, parentNode: hostParentNode, nextSibling: hostNextSibling, setScopeId: hostSetScopeId = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP, insertStaticContent: hostInsertStaticContent } = options;\n    // Note: functions inside this closure should use `const xxx = () => {}`\n    // style in order to prevent being inlined by minifiers.\n    const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, isSVG = false, slotScopeIds = null, optimized = ( true) && isHmrUpdating ? false : !!n2.dynamicChildren) => {\n        if (n1 === n2) {\n            return;\n        }\n        // patching & not same type, unmount old tree\n        if (n1 && !isSameVNodeType(n1, n2)) {\n            anchor = getNextHostNode(n1);\n            unmount(n1, parentComponent, parentSuspense, true);\n            n1 = null;\n        }\n        if (n2.patchFlag === -2 /* PatchFlags.BAIL */) {\n            optimized = false;\n            n2.dynamicChildren = null;\n        }\n        const { type, ref, shapeFlag } = n2;\n        switch (type) {\n            case Text:\n                processText(n1, n2, container, anchor);\n                break;\n            case Comment:\n                processCommentNode(n1, n2, container, anchor);\n                break;\n            case Static:\n                if (n1 == null) {\n                    mountStaticNode(n2, container, anchor, isSVG);\n                }\n                else if ((true)) {\n                    patchStaticNode(n1, n2, container, isSVG);\n                }\n                break;\n            case Fragment:\n                processFragment(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n                break;\n            default:\n                if (shapeFlag & 1 /* ShapeFlags.ELEMENT */) {\n                    processElement(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n                }\n                else if (shapeFlag & 6 /* ShapeFlags.COMPONENT */) {\n                    processComponent(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n                }\n                else if (shapeFlag & 64 /* ShapeFlags.TELEPORT */) {\n                    type.process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, internals);\n                }\n                else if (shapeFlag & 128 /* ShapeFlags.SUSPENSE */) {\n                    type.process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, internals);\n                }\n                else if ((true)) {\n                    warn('Invalid VNode type:', type, `(${typeof type})`);\n                }\n        }\n        // set ref\n        if (ref != null && parentComponent) {\n            setRef(ref, n1 && n1.ref, parentSuspense, n2 || n1, !n2);\n        }\n    };\n    const processText = (n1, n2, container, anchor) => {\n        if (n1 == null) {\n            hostInsert((n2.el = hostCreateText(n2.children)), container, anchor);\n        }\n        else {\n            const el = (n2.el = n1.el);\n            if (n2.children !== n1.children) {\n                hostSetText(el, n2.children);\n            }\n        }\n    };\n    const processCommentNode = (n1, n2, container, anchor) => {\n        if (n1 == null) {\n            hostInsert((n2.el = hostCreateComment(n2.children || '')), container, anchor);\n        }\n        else {\n            // there's no support for dynamic comments\n            n2.el = n1.el;\n        }\n    };\n    const mountStaticNode = (n2, container, anchor, isSVG) => {\n        [n2.el, n2.anchor] = hostInsertStaticContent(n2.children, container, anchor, isSVG, n2.el, n2.anchor);\n    };\n    /**\n     * Dev / HMR only\n     */\n    const patchStaticNode = (n1, n2, container, isSVG) => {\n        // static nodes are only patched during dev for HMR\n        if (n2.children !== n1.children) {\n            const anchor = hostNextSibling(n1.anchor);\n            // remove existing\n            removeStaticNode(n1);\n            [n2.el, n2.anchor] = hostInsertStaticContent(n2.children, container, anchor, isSVG);\n        }\n        else {\n            n2.el = n1.el;\n            n2.anchor = n1.anchor;\n        }\n    };\n    const moveStaticNode = ({ el, anchor }, container, nextSibling) => {\n        let next;\n        while (el && el !== anchor) {\n            next = hostNextSibling(el);\n            hostInsert(el, container, nextSibling);\n            el = next;\n        }\n        hostInsert(anchor, container, nextSibling);\n    };\n    const removeStaticNode = ({ el, anchor }) => {\n        let next;\n        while (el && el !== anchor) {\n            next = hostNextSibling(el);\n            hostRemove(el);\n            el = next;\n        }\n        hostRemove(anchor);\n    };\n    const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {\n        isSVG = isSVG || n2.type === 'svg';\n        if (n1 == null) {\n            mountElement(n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n        }\n        else {\n            patchElement(n1, n2, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n        }\n    };\n    const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {\n        let el;\n        let vnodeHook;\n        const { type, props, shapeFlag, transition, dirs } = vnode;\n        el = vnode.el = hostCreateElement(vnode.type, isSVG, props && props.is, props);\n        // mount children first, since some props may rely on child content\n        // being already rendered, e.g. `<select value>`\n        if (shapeFlag & 8 /* ShapeFlags.TEXT_CHILDREN */) {\n            hostSetElementText(el, vnode.children);\n        }\n        else if (shapeFlag & 16 /* ShapeFlags.ARRAY_CHILDREN */) {\n            mountChildren(vnode.children, el, null, parentComponent, parentSuspense, isSVG && type !== 'foreignObject', slotScopeIds, optimized);\n        }\n        if (dirs) {\n            invokeDirectiveHook(vnode, null, parentComponent, 'created');\n        }\n        // scopeId\n        setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent);\n        // props\n        if (props) {\n            for (const key in props) {\n                if (key !== 'value' && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key)) {\n                    hostPatchProp(el, key, null, props[key], isSVG, vnode.children, parentComponent, parentSuspense, unmountChildren);\n                }\n            }\n            /**\n             * Special case for setting value on DOM elements:\n             * - it can be order-sensitive (e.g. should be set *after* min/max, #2325, #4024)\n             * - it needs to be forced (#1471)\n             * #2353 proposes adding another renderer option to configure this, but\n             * the properties affects are so finite it is worth special casing it\n             * here to reduce the complexity. (Special casing it also should not\n             * affect non-DOM renderers)\n             */\n            if ('value' in props) {\n                hostPatchProp(el, 'value', null, props.value);\n            }\n            if ((vnodeHook = props.onVnodeBeforeMount)) {\n                invokeVNodeHook(vnodeHook, parentComponent, vnode);\n            }\n        }\n        if (true) {\n            Object.defineProperty(el, '__vnode', {\n                value: vnode,\n                enumerable: false\n            });\n            Object.defineProperty(el, '__vueParentComponent', {\n                value: parentComponent,\n                enumerable: false\n            });\n        }\n        if (dirs) {\n            invokeDirectiveHook(vnode, null, parentComponent, 'beforeMount');\n        }\n        // #1583 For inside suspense + suspense not resolved case, enter hook should call when suspense resolved\n        // #1689 For inside suspense + suspense resolved case, just call it\n        const needCallTransitionHooks = (!parentSuspense || (parentSuspense && !parentSuspense.pendingBranch)) &&\n            transition &&\n            !transition.persisted;\n        if (needCallTransitionHooks) {\n            transition.beforeEnter(el);\n        }\n        hostInsert(el, container, anchor);\n        if ((vnodeHook = props && props.onVnodeMounted) ||\n            needCallTransitionHooks ||\n            dirs) {\n            queuePostRenderEffect(() => {\n                vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);\n                needCallTransitionHooks && transition.enter(el);\n                dirs && invokeDirectiveHook(vnode, null, parentComponent, 'mounted');\n            }, parentSuspense);\n        }\n    };\n    const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => {\n        if (scopeId) {\n            hostSetScopeId(el, scopeId);\n        }\n        if (slotScopeIds) {\n            for (let i = 0; i < slotScopeIds.length; i++) {\n                hostSetScopeId(el, slotScopeIds[i]);\n            }\n        }\n        if (parentComponent) {\n            let subTree = parentComponent.subTree;\n            if (( true) &&\n                subTree.patchFlag > 0 &&\n                subTree.patchFlag & 2048 /* PatchFlags.DEV_ROOT_FRAGMENT */) {\n                subTree =\n                    filterSingleRoot(subTree.children) || subTree;\n            }\n            if (vnode === subTree) {\n                const parentVNode = parentComponent.vnode;\n                setScopeId(el, parentVNode, parentVNode.scopeId, parentVNode.slotScopeIds, parentComponent.parent);\n            }\n        }\n    };\n    const mountChildren = (children, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, start = 0) => {\n        for (let i = start; i < children.length; i++) {\n            const child = (children[i] = optimized\n                ? cloneIfMounted(children[i])\n                : normalizeVNode(children[i]));\n            patch(null, child, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n        }\n    };\n    const patchElement = (n1, n2, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {\n        const el = (n2.el = n1.el);\n        let { patchFlag, dynamicChildren, dirs } = n2;\n        // #1426 take the old vnode's patch flag into account since user may clone a\n        // compiler-generated vnode, which de-opts to FULL_PROPS\n        patchFlag |= n1.patchFlag & 16 /* PatchFlags.FULL_PROPS */;\n        const oldProps = n1.props || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;\n        const newProps = n2.props || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;\n        let vnodeHook;\n        // disable recurse in beforeUpdate hooks\n        parentComponent && toggleRecurse(parentComponent, false);\n        if ((vnodeHook = newProps.onVnodeBeforeUpdate)) {\n            invokeVNodeHook(vnodeHook, parentComponent, n2, n1);\n        }\n        if (dirs) {\n            invokeDirectiveHook(n2, n1, parentComponent, 'beforeUpdate');\n        }\n        parentComponent && toggleRecurse(parentComponent, true);\n        if (( true) && isHmrUpdating) {\n            // HMR updated, force full diff\n            patchFlag = 0;\n            optimized = false;\n            dynamicChildren = null;\n        }\n        const areChildrenSVG = isSVG && n2.type !== 'foreignObject';\n        if (dynamicChildren) {\n            patchBlockChildren(n1.dynamicChildren, dynamicChildren, el, parentComponent, parentSuspense, areChildrenSVG, slotScopeIds);\n            if (( true) && parentComponent && parentComponent.type.__hmrId) {\n                traverseStaticChildren(n1, n2);\n            }\n        }\n        else if (!optimized) {\n            // full diff\n            patchChildren(n1, n2, el, null, parentComponent, parentSuspense, areChildrenSVG, slotScopeIds, false);\n        }\n        if (patchFlag > 0) {\n            // the presence of a patchFlag means this element's render code was\n            // generated by the compiler and can take the fast path.\n            // in this path old node and new node are guaranteed to have the same shape\n            // (i.e. at the exact same position in the source template)\n            if (patchFlag & 16 /* PatchFlags.FULL_PROPS */) {\n                // element props contain dynamic keys, full diff needed\n                patchProps(el, n2, oldProps, newProps, parentComponent, parentSuspense, isSVG);\n            }\n            else {\n                // class\n                // this flag is matched when the element has dynamic class bindings.\n                if (patchFlag & 2 /* PatchFlags.CLASS */) {\n                    if (oldProps.class !== newProps.class) {\n                        hostPatchProp(el, 'class', null, newProps.class, isSVG);\n                    }\n                }\n                // style\n                // this flag is matched when the element has dynamic style bindings\n                if (patchFlag & 4 /* PatchFlags.STYLE */) {\n                    hostPatchProp(el, 'style', oldProps.style, newProps.style, isSVG);\n                }\n                // props\n                // This flag is matched when the element has dynamic prop/attr bindings\n                // other than class and style. The keys of dynamic prop/attrs are saved for\n                // faster iteration.\n                // Note dynamic keys like :[foo]=\"bar\" will cause this optimization to\n                // bail out and go through a full diff because we need to unset the old key\n                if (patchFlag & 8 /* PatchFlags.PROPS */) {\n                    // if the flag is present then dynamicProps must be non-null\n                    const propsToUpdate = n2.dynamicProps;\n                    for (let i = 0; i < propsToUpdate.length; i++) {\n                        const key = propsToUpdate[i];\n                        const prev = oldProps[key];\n                        const next = newProps[key];\n                        // #1471 force patch value\n                        if (next !== prev || key === 'value') {\n                            hostPatchProp(el, key, prev, next, isSVG, n1.children, parentComponent, parentSuspense, unmountChildren);\n                        }\n                    }\n                }\n            }\n            // text\n            // This flag is matched when the element has only dynamic text children.\n            if (patchFlag & 1 /* PatchFlags.TEXT */) {\n                if (n1.children !== n2.children) {\n                    hostSetElementText(el, n2.children);\n                }\n            }\n        }\n        else if (!optimized && dynamicChildren == null) {\n            // unoptimized, full diff\n            patchProps(el, n2, oldProps, newProps, parentComponent, parentSuspense, isSVG);\n        }\n        if ((vnodeHook = newProps.onVnodeUpdated) || dirs) {\n            queuePostRenderEffect(() => {\n                vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1);\n                dirs && invokeDirectiveHook(n2, n1, parentComponent, 'updated');\n            }, parentSuspense);\n        }\n    };\n    // The fast path for blocks.\n    const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, isSVG, slotScopeIds) => {\n        for (let i = 0; i < newChildren.length; i++) {\n            const oldVNode = oldChildren[i];\n            const newVNode = newChildren[i];\n            // Determine the container (parent element) for the patch.\n            const container = \n            // oldVNode may be an errored async setup() component inside Suspense\n            // which will not have a mounted element\n            oldVNode.el &&\n                // - In the case of a Fragment, we need to provide the actual parent\n                // of the Fragment itself so it can move its children.\n                (oldVNode.type === Fragment ||\n                    // - In the case of different nodes, there is going to be a replacement\n                    // which also requires the correct parent container\n                    !isSameVNodeType(oldVNode, newVNode) ||\n                    // - In the case of a component, it could contain anything.\n                    oldVNode.shapeFlag & (6 /* ShapeFlags.COMPONENT */ | 64 /* ShapeFlags.TELEPORT */))\n                ? hostParentNode(oldVNode.el)\n                : // In other cases, the parent container is not actually used so we\n                    // just pass the block element here to avoid a DOM parentNode call.\n                    fallbackContainer;\n            patch(oldVNode, newVNode, container, null, parentComponent, parentSuspense, isSVG, slotScopeIds, true);\n        }\n    };\n    const patchProps = (el, vnode, oldProps, newProps, parentComponent, parentSuspense, isSVG) => {\n        if (oldProps !== newProps) {\n            if (oldProps !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) {\n                for (const key in oldProps) {\n                    if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key) && !(key in newProps)) {\n                        hostPatchProp(el, key, oldProps[key], null, isSVG, vnode.children, parentComponent, parentSuspense, unmountChildren);\n                    }\n                }\n            }\n            for (const key in newProps) {\n                // empty string is not valid prop\n                if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key))\n                    continue;\n                const next = newProps[key];\n                const prev = oldProps[key];\n                // defer patching value\n                if (next !== prev && key !== 'value') {\n                    hostPatchProp(el, key, prev, next, isSVG, vnode.children, parentComponent, parentSuspense, unmountChildren);\n                }\n            }\n            if ('value' in newProps) {\n                hostPatchProp(el, 'value', oldProps.value, newProps.value);\n            }\n        }\n    };\n    const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {\n        const fragmentStartAnchor = (n2.el = n1 ? n1.el : hostCreateText(''));\n        const fragmentEndAnchor = (n2.anchor = n1 ? n1.anchor : hostCreateText(''));\n        let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2;\n        if (( true) &&\n            // #5523 dev root fragment may inherit directives\n            (isHmrUpdating || patchFlag & 2048 /* PatchFlags.DEV_ROOT_FRAGMENT */)) {\n            // HMR updated / Dev root fragment (w/ comments), force full diff\n            patchFlag = 0;\n            optimized = false;\n            dynamicChildren = null;\n        }\n        // check if this is a slot fragment with :slotted scope ids\n        if (fragmentSlotScopeIds) {\n            slotScopeIds = slotScopeIds\n                ? slotScopeIds.concat(fragmentSlotScopeIds)\n                : fragmentSlotScopeIds;\n        }\n        if (n1 == null) {\n            hostInsert(fragmentStartAnchor, container, anchor);\n            hostInsert(fragmentEndAnchor, container, anchor);\n            // a fragment can only have array children\n            // since they are either generated by the compiler, or implicitly created\n            // from arrays.\n            mountChildren(n2.children, container, fragmentEndAnchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n        }\n        else {\n            if (patchFlag > 0 &&\n                patchFlag & 64 /* PatchFlags.STABLE_FRAGMENT */ &&\n                dynamicChildren &&\n                // #2715 the previous fragment could've been a BAILed one as a result\n                // of renderSlot() with no valid children\n                n1.dynamicChildren) {\n                // a stable fragment (template root or <template v-for>) doesn't need to\n                // patch children order, but it may contain dynamicChildren.\n                patchBlockChildren(n1.dynamicChildren, dynamicChildren, container, parentComponent, parentSuspense, isSVG, slotScopeIds);\n                if (( true) && parentComponent && parentComponent.type.__hmrId) {\n                    traverseStaticChildren(n1, n2);\n                }\n                else if (\n                // #2080 if the stable fragment has a key, it's a <template v-for> that may\n                //  get moved around. Make sure all root level vnodes inherit el.\n                // #2134 or if it's a component root, it may also get moved around\n                // as the component is being moved.\n                n2.key != null ||\n                    (parentComponent && n2 === parentComponent.subTree)) {\n                    traverseStaticChildren(n1, n2, true /* shallow */);\n                }\n            }\n            else {\n                // keyed / unkeyed, or manual fragments.\n                // for keyed & unkeyed, since they are compiler generated from v-for,\n                // each child is guaranteed to be a block so the fragment will never\n                // have dynamicChildren.\n                patchChildren(n1, n2, container, fragmentEndAnchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n            }\n        }\n    };\n    const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {\n        n2.slotScopeIds = slotScopeIds;\n        if (n1 == null) {\n            if (n2.shapeFlag & 512 /* ShapeFlags.COMPONENT_KEPT_ALIVE */) {\n                parentComponent.ctx.activate(n2, container, anchor, isSVG, optimized);\n            }\n            else {\n                mountComponent(n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);\n            }\n        }\n        else {\n            updateComponent(n1, n2, optimized);\n        }\n    };\n    const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {\n        const instance = (initialVNode.component = createComponentInstance(initialVNode, parentComponent, parentSuspense));\n        if (( true) && instance.type.__hmrId) {\n            registerHMR(instance);\n        }\n        if ((true)) {\n            pushWarningContext(initialVNode);\n            startMeasure(instance, `mount`);\n        }\n        // inject renderer internals for keepAlive\n        if (isKeepAlive(initialVNode)) {\n            instance.ctx.renderer = internals;\n        }\n        // resolve props and slots for setup context\n        {\n            if ((true)) {\n                startMeasure(instance, `init`);\n            }\n            setupComponent(instance);\n            if ((true)) {\n                endMeasure(instance, `init`);\n            }\n        }\n        // setup() is async. This component relies on async logic to be resolved\n        // before proceeding\n        if (instance.asyncDep) {\n            parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect);\n            // Give it a placeholder if this is not hydration\n            // TODO handle self-defined fallback\n            if (!initialVNode.el) {\n                const placeholder = (instance.subTree = createVNode(Comment));\n                processCommentNode(null, placeholder, container, anchor);\n            }\n            return;\n        }\n        setupRenderEffect(instance, initialVNode, container, anchor, parentSuspense, isSVG, optimized);\n        if ((true)) {\n            popWarningContext();\n            endMeasure(instance, `mount`);\n        }\n    };\n    const updateComponent = (n1, n2, optimized) => {\n        const instance = (n2.component = n1.component);\n        if (shouldUpdateComponent(n1, n2, optimized)) {\n            if (instance.asyncDep &&\n                !instance.asyncResolved) {\n                // async & still pending - just update props and slots\n                // since the component's reactive effect for render isn't set-up yet\n                if ((true)) {\n                    pushWarningContext(n2);\n                }\n                updateComponentPreRender(instance, n2, optimized);\n                if ((true)) {\n                    popWarningContext();\n                }\n                return;\n            }\n            else {\n                // normal update\n                instance.next = n2;\n                // in case the child component is also queued, remove it to avoid\n                // double updating the same child component in the same flush.\n                invalidateJob(instance.update);\n                // instance.update is the reactive effect.\n                instance.update();\n            }\n        }\n        else {\n            // no update needed. just copy over properties\n            n2.el = n1.el;\n            instance.vnode = n2;\n        }\n    };\n    const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, isSVG, optimized) => {\n        const componentUpdateFn = () => {\n            if (!instance.isMounted) {\n                let vnodeHook;\n                const { el, props } = initialVNode;\n                const { bm, m, parent } = instance;\n                const isAsyncWrapperVNode = isAsyncWrapper(initialVNode);\n                toggleRecurse(instance, false);\n                // beforeMount hook\n                if (bm) {\n                    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(bm);\n                }\n                // onVnodeBeforeMount\n                if (!isAsyncWrapperVNode &&\n                    (vnodeHook = props && props.onVnodeBeforeMount)) {\n                    invokeVNodeHook(vnodeHook, parent, initialVNode);\n                }\n                toggleRecurse(instance, true);\n                if (el && hydrateNode) {\n                    // vnode has adopted host node - perform hydration instead of mount.\n                    const hydrateSubTree = () => {\n                        if ((true)) {\n                            startMeasure(instance, `render`);\n                        }\n                        instance.subTree = renderComponentRoot(instance);\n                        if ((true)) {\n                            endMeasure(instance, `render`);\n                        }\n                        if ((true)) {\n                            startMeasure(instance, `hydrate`);\n                        }\n                        hydrateNode(el, instance.subTree, instance, parentSuspense, null);\n                        if ((true)) {\n                            endMeasure(instance, `hydrate`);\n                        }\n                    };\n                    if (isAsyncWrapperVNode) {\n                        initialVNode.type.__asyncLoader().then(\n                        // note: we are moving the render call into an async callback,\n                        // which means it won't track dependencies - but it's ok because\n                        // a server-rendered async wrapper is already in resolved state\n                        // and it will never need to change.\n                        () => !instance.isUnmounted && hydrateSubTree());\n                    }\n                    else {\n                        hydrateSubTree();\n                    }\n                }\n                else {\n                    if ((true)) {\n                        startMeasure(instance, `render`);\n                    }\n                    const subTree = (instance.subTree = renderComponentRoot(instance));\n                    if ((true)) {\n                        endMeasure(instance, `render`);\n                    }\n                    if ((true)) {\n                        startMeasure(instance, `patch`);\n                    }\n                    patch(null, subTree, container, anchor, instance, parentSuspense, isSVG);\n                    if ((true)) {\n                        endMeasure(instance, `patch`);\n                    }\n                    initialVNode.el = subTree.el;\n                }\n                // mounted hook\n                if (m) {\n                    queuePostRenderEffect(m, parentSuspense);\n                }\n                // onVnodeMounted\n                if (!isAsyncWrapperVNode &&\n                    (vnodeHook = props && props.onVnodeMounted)) {\n                    const scopedInitialVNode = initialVNode;\n                    queuePostRenderEffect(() => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode), parentSuspense);\n                }\n                // activated hook for keep-alive roots.\n                // #1742 activated hook must be accessed after first render\n                // since the hook may be injected by a child keep-alive\n                if (initialVNode.shapeFlag & 256 /* ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE */ ||\n                    (parent &&\n                        isAsyncWrapper(parent.vnode) &&\n                        parent.vnode.shapeFlag & 256 /* ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE */)) {\n                    instance.a && queuePostRenderEffect(instance.a, parentSuspense);\n                }\n                instance.isMounted = true;\n                if (true) {\n                    devtoolsComponentAdded(instance);\n                }\n                // #2458: deference mount-only object parameters to prevent memleaks\n                initialVNode = container = anchor = null;\n            }\n            else {\n                // updateComponent\n                // This is triggered by mutation of component's own state (next: null)\n                // OR parent calling processComponent (next: VNode)\n                let { next, bu, u, parent, vnode } = instance;\n                let originNext = next;\n                let vnodeHook;\n                if ((true)) {\n                    pushWarningContext(next || instance.vnode);\n                }\n                // Disallow component effect recursion during pre-lifecycle hooks.\n                toggleRecurse(instance, false);\n                if (next) {\n                    next.el = vnode.el;\n                    updateComponentPreRender(instance, next, optimized);\n                }\n                else {\n                    next = vnode;\n                }\n                // beforeUpdate hook\n                if (bu) {\n                    (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(bu);\n                }\n                // onVnodeBeforeUpdate\n                if ((vnodeHook = next.props && next.props.onVnodeBeforeUpdate)) {\n                    invokeVNodeHook(vnodeHook, parent, next, vnode);\n                }\n                toggleRecurse(instance, true);\n                // render\n                if ((true)) {\n                    startMeasure(instance, `render`);\n                }\n                const nextTree = renderComponentRoot(instance);\n                if ((true)) {\n                    endMeasure(instance, `render`);\n                }\n                const prevTree = instance.subTree;\n                instance.subTree = nextTree;\n                if ((true)) {\n                    startMeasure(instance, `patch`);\n                }\n                patch(prevTree, nextTree, \n                // parent may have changed if it's in a teleport\n                hostParentNode(prevTree.el), \n                // anchor may have changed if it's in a fragment\n                getNextHostNode(prevTree), instance, parentSuspense, isSVG);\n                if ((true)) {\n                    endMeasure(instance, `patch`);\n                }\n                next.el = nextTree.el;\n                if (originNext === null) {\n                    // self-triggered update. In case of HOC, update parent component\n                    // vnode el. HOC is indicated by parent instance's subTree pointing\n                    // to child component's vnode\n                    updateHOCHostEl(instance, nextTree.el);\n                }\n                // updated hook\n                if (u) {\n                    queuePostRenderEffect(u, parentSuspense);\n                }\n                // onVnodeUpdated\n                if ((vnodeHook = next.props && next.props.onVnodeUpdated)) {\n                    queuePostRenderEffect(() => invokeVNodeHook(vnodeHook, parent, next, vnode), parentSuspense);\n                }\n                if (true) {\n                    devtoolsComponentUpdated(instance);\n                }\n                if ((true)) {\n                    popWarningContext();\n                }\n            }\n        };\n        // create reactive effect for rendering\n        const effect = (instance.effect = new _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ReactiveEffect(componentUpdateFn, () => queueJob(update), instance.scope // track it in component's effect scope\n        ));\n        const update = (instance.update = () => effect.run());\n        update.id = instance.uid;\n        // allowRecurse\n        // #1801, #2043 component render effects should allow recursive updates\n        toggleRecurse(instance, true);\n        if ((true)) {\n            effect.onTrack = instance.rtc\n                ? e => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(instance.rtc, e)\n                : void 0;\n            effect.onTrigger = instance.rtg\n                ? e => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(instance.rtg, e)\n                : void 0;\n            update.ownerInstance = instance;\n        }\n        update();\n    };\n    const updateComponentPreRender = (instance, nextVNode, optimized) => {\n        nextVNode.component = instance;\n        const prevProps = instance.vnode.props;\n        instance.vnode = nextVNode;\n        instance.next = null;\n        updateProps(instance, nextVNode.props, prevProps, optimized);\n        updateSlots(instance, nextVNode.children, optimized);\n        (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();\n        // props update may have triggered pre-flush watchers.\n        // flush them before the render update.\n        flushPreFlushCbs();\n        (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();\n    };\n    const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized = false) => {\n        const c1 = n1 && n1.children;\n        const prevShapeFlag = n1 ? n1.shapeFlag : 0;\n        const c2 = n2.children;\n        const { patchFlag, shapeFlag } = n2;\n        // fast path\n        if (patchFlag > 0) {\n            if (patchFlag & 128 /* PatchFlags.KEYED_FRAGMENT */) {\n                // this could be either fully-keyed or mixed (some keyed some not)\n                // presence of patchFlag means children are guaranteed to be arrays\n                patchKeyedChildren(c1, c2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n                return;\n            }\n            else if (patchFlag & 256 /* PatchFlags.UNKEYED_FRAGMENT */) {\n                // unkeyed\n                patchUnkeyedChildren(c1, c2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n                return;\n            }\n        }\n        // children has 3 possibilities: text, array or no children.\n        if (shapeFlag & 8 /* ShapeFlags.TEXT_CHILDREN */) {\n            // text children fast path\n            if (prevShapeFlag & 16 /* ShapeFlags.ARRAY_CHILDREN */) {\n                unmountChildren(c1, parentComponent, parentSuspense);\n            }\n            if (c2 !== c1) {\n                hostSetElementText(container, c2);\n            }\n        }\n        else {\n            if (prevShapeFlag & 16 /* ShapeFlags.ARRAY_CHILDREN */) {\n                // prev children was array\n                if (shapeFlag & 16 /* ShapeFlags.ARRAY_CHILDREN */) {\n                    // two arrays, cannot assume anything, do full diff\n                    patchKeyedChildren(c1, c2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n                }\n                else {\n                    // no new children, just unmount old\n                    unmountChildren(c1, parentComponent, parentSuspense, true);\n                }\n            }\n            else {\n                // prev children was text OR null\n                // new children is array OR null\n                if (prevShapeFlag & 8 /* ShapeFlags.TEXT_CHILDREN */) {\n                    hostSetElementText(container, '');\n                }\n                // mount new if array\n                if (shapeFlag & 16 /* ShapeFlags.ARRAY_CHILDREN */) {\n                    mountChildren(c2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n                }\n            }\n        }\n    };\n    const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {\n        c1 = c1 || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR;\n        c2 = c2 || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR;\n        const oldLength = c1.length;\n        const newLength = c2.length;\n        const commonLength = Math.min(oldLength, newLength);\n        let i;\n        for (i = 0; i < commonLength; i++) {\n            const nextChild = (c2[i] = optimized\n                ? cloneIfMounted(c2[i])\n                : normalizeVNode(c2[i]));\n            patch(c1[i], nextChild, container, null, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n        }\n        if (oldLength > newLength) {\n            // remove old\n            unmountChildren(c1, parentComponent, parentSuspense, true, false, commonLength);\n        }\n        else {\n            // mount new\n            mountChildren(c2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, commonLength);\n        }\n    };\n    // can be all-keyed or mixed\n    const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {\n        let i = 0;\n        const l2 = c2.length;\n        let e1 = c1.length - 1; // prev ending index\n        let e2 = l2 - 1; // next ending index\n        // 1. sync from start\n        // (a b) c\n        // (a b) d e\n        while (i <= e1 && i <= e2) {\n            const n1 = c1[i];\n            const n2 = (c2[i] = optimized\n                ? cloneIfMounted(c2[i])\n                : normalizeVNode(c2[i]));\n            if (isSameVNodeType(n1, n2)) {\n                patch(n1, n2, container, null, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n            }\n            else {\n                break;\n            }\n            i++;\n        }\n        // 2. sync from end\n        // a (b c)\n        // d e (b c)\n        while (i <= e1 && i <= e2) {\n            const n1 = c1[e1];\n            const n2 = (c2[e2] = optimized\n                ? cloneIfMounted(c2[e2])\n                : normalizeVNode(c2[e2]));\n            if (isSameVNodeType(n1, n2)) {\n                patch(n1, n2, container, null, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n            }\n            else {\n                break;\n            }\n            e1--;\n            e2--;\n        }\n        // 3. common sequence + mount\n        // (a b)\n        // (a b) c\n        // i = 2, e1 = 1, e2 = 2\n        // (a b)\n        // c (a b)\n        // i = 0, e1 = -1, e2 = 0\n        if (i > e1) {\n            if (i <= e2) {\n                const nextPos = e2 + 1;\n                const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor;\n                while (i <= e2) {\n                    patch(null, (c2[i] = optimized\n                        ? cloneIfMounted(c2[i])\n                        : normalizeVNode(c2[i])), container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n                    i++;\n                }\n            }\n        }\n        // 4. common sequence + unmount\n        // (a b) c\n        // (a b)\n        // i = 2, e1 = 2, e2 = 1\n        // a (b c)\n        // (b c)\n        // i = 0, e1 = 0, e2 = -1\n        else if (i > e2) {\n            while (i <= e1) {\n                unmount(c1[i], parentComponent, parentSuspense, true);\n                i++;\n            }\n        }\n        // 5. unknown sequence\n        // [i ... e1 + 1]: a b [c d e] f g\n        // [i ... e2 + 1]: a b [e d c h] f g\n        // i = 2, e1 = 4, e2 = 5\n        else {\n            const s1 = i; // prev starting index\n            const s2 = i; // next starting index\n            // 5.1 build key:index map for newChildren\n            const keyToNewIndexMap = new Map();\n            for (i = s2; i <= e2; i++) {\n                const nextChild = (c2[i] = optimized\n                    ? cloneIfMounted(c2[i])\n                    : normalizeVNode(c2[i]));\n                if (nextChild.key != null) {\n                    if (( true) && keyToNewIndexMap.has(nextChild.key)) {\n                        warn(`Duplicate keys found during update:`, JSON.stringify(nextChild.key), `Make sure keys are unique.`);\n                    }\n                    keyToNewIndexMap.set(nextChild.key, i);\n                }\n            }\n            // 5.2 loop through old children left to be patched and try to patch\n            // matching nodes & remove nodes that are no longer present\n            let j;\n            let patched = 0;\n            const toBePatched = e2 - s2 + 1;\n            let moved = false;\n            // used to track whether any node has moved\n            let maxNewIndexSoFar = 0;\n            // works as Map<newIndex, oldIndex>\n            // Note that oldIndex is offset by +1\n            // and oldIndex = 0 is a special value indicating the new node has\n            // no corresponding old node.\n            // used for determining longest stable subsequence\n            const newIndexToOldIndexMap = new Array(toBePatched);\n            for (i = 0; i < toBePatched; i++)\n                newIndexToOldIndexMap[i] = 0;\n            for (i = s1; i <= e1; i++) {\n                const prevChild = c1[i];\n                if (patched >= toBePatched) {\n                    // all new children have been patched so this can only be a removal\n                    unmount(prevChild, parentComponent, parentSuspense, true);\n                    continue;\n                }\n                let newIndex;\n                if (prevChild.key != null) {\n                    newIndex = keyToNewIndexMap.get(prevChild.key);\n                }\n                else {\n                    // key-less node, try to locate a key-less node of the same type\n                    for (j = s2; j <= e2; j++) {\n                        if (newIndexToOldIndexMap[j - s2] === 0 &&\n                            isSameVNodeType(prevChild, c2[j])) {\n                            newIndex = j;\n                            break;\n                        }\n                    }\n                }\n                if (newIndex === undefined) {\n                    unmount(prevChild, parentComponent, parentSuspense, true);\n                }\n                else {\n                    newIndexToOldIndexMap[newIndex - s2] = i + 1;\n                    if (newIndex >= maxNewIndexSoFar) {\n                        maxNewIndexSoFar = newIndex;\n                    }\n                    else {\n                        moved = true;\n                    }\n                    patch(prevChild, c2[newIndex], container, null, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n                    patched++;\n                }\n            }\n            // 5.3 move and mount\n            // generate longest stable subsequence only when nodes have moved\n            const increasingNewIndexSequence = moved\n                ? getSequence(newIndexToOldIndexMap)\n                : _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR;\n            j = increasingNewIndexSequence.length - 1;\n            // looping backwards so that we can use last patched node as anchor\n            for (i = toBePatched - 1; i >= 0; i--) {\n                const nextIndex = s2 + i;\n                const nextChild = c2[nextIndex];\n                const anchor = nextIndex + 1 < l2 ? c2[nextIndex + 1].el : parentAnchor;\n                if (newIndexToOldIndexMap[i] === 0) {\n                    // mount new\n                    patch(null, nextChild, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n                }\n                else if (moved) {\n                    // move if:\n                    // There is no stable subsequence (e.g. a reverse)\n                    // OR current node is not among the stable sequence\n                    if (j < 0 || i !== increasingNewIndexSequence[j]) {\n                        move(nextChild, container, anchor, 2 /* MoveType.REORDER */);\n                    }\n                    else {\n                        j--;\n                    }\n                }\n            }\n        }\n    };\n    const move = (vnode, container, anchor, moveType, parentSuspense = null) => {\n        const { el, type, transition, children, shapeFlag } = vnode;\n        if (shapeFlag & 6 /* ShapeFlags.COMPONENT */) {\n            move(vnode.component.subTree, container, anchor, moveType);\n            return;\n        }\n        if (shapeFlag & 128 /* ShapeFlags.SUSPENSE */) {\n            vnode.suspense.move(container, anchor, moveType);\n            return;\n        }\n        if (shapeFlag & 64 /* ShapeFlags.TELEPORT */) {\n            type.move(vnode, container, anchor, internals);\n            return;\n        }\n        if (type === Fragment) {\n            hostInsert(el, container, anchor);\n            for (let i = 0; i < children.length; i++) {\n                move(children[i], container, anchor, moveType);\n            }\n            hostInsert(vnode.anchor, container, anchor);\n            return;\n        }\n        if (type === Static) {\n            moveStaticNode(vnode, container, anchor);\n            return;\n        }\n        // single nodes\n        const needTransition = moveType !== 2 /* MoveType.REORDER */ &&\n            shapeFlag & 1 /* ShapeFlags.ELEMENT */ &&\n            transition;\n        if (needTransition) {\n            if (moveType === 0 /* MoveType.ENTER */) {\n                transition.beforeEnter(el);\n                hostInsert(el, container, anchor);\n                queuePostRenderEffect(() => transition.enter(el), parentSuspense);\n            }\n            else {\n                const { leave, delayLeave, afterLeave } = transition;\n                const remove = () => hostInsert(el, container, anchor);\n                const performLeave = () => {\n                    leave(el, () => {\n                        remove();\n                        afterLeave && afterLeave();\n                    });\n                };\n                if (delayLeave) {\n                    delayLeave(el, remove, performLeave);\n                }\n                else {\n                    performLeave();\n                }\n            }\n        }\n        else {\n            hostInsert(el, container, anchor);\n        }\n    };\n    const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => {\n        const { type, props, ref, children, dynamicChildren, shapeFlag, patchFlag, dirs } = vnode;\n        // unset ref\n        if (ref != null) {\n            setRef(ref, null, parentSuspense, vnode, true);\n        }\n        if (shapeFlag & 256 /* ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE */) {\n            parentComponent.ctx.deactivate(vnode);\n            return;\n        }\n        const shouldInvokeDirs = shapeFlag & 1 /* ShapeFlags.ELEMENT */ && dirs;\n        const shouldInvokeVnodeHook = !isAsyncWrapper(vnode);\n        let vnodeHook;\n        if (shouldInvokeVnodeHook &&\n            (vnodeHook = props && props.onVnodeBeforeUnmount)) {\n            invokeVNodeHook(vnodeHook, parentComponent, vnode);\n        }\n        if (shapeFlag & 6 /* ShapeFlags.COMPONENT */) {\n            unmountComponent(vnode.component, parentSuspense, doRemove);\n        }\n        else {\n            if (shapeFlag & 128 /* ShapeFlags.SUSPENSE */) {\n                vnode.suspense.unmount(parentSuspense, doRemove);\n                return;\n            }\n            if (shouldInvokeDirs) {\n                invokeDirectiveHook(vnode, null, parentComponent, 'beforeUnmount');\n            }\n            if (shapeFlag & 64 /* ShapeFlags.TELEPORT */) {\n                vnode.type.remove(vnode, parentComponent, parentSuspense, optimized, internals, doRemove);\n            }\n            else if (dynamicChildren &&\n                // #1153: fast path should not be taken for non-stable (v-for) fragments\n                (type !== Fragment ||\n                    (patchFlag > 0 && patchFlag & 64 /* PatchFlags.STABLE_FRAGMENT */))) {\n                // fast path for block nodes: only need to unmount dynamic children.\n                unmountChildren(dynamicChildren, parentComponent, parentSuspense, false, true);\n            }\n            else if ((type === Fragment &&\n                patchFlag &\n                    (128 /* PatchFlags.KEYED_FRAGMENT */ | 256 /* PatchFlags.UNKEYED_FRAGMENT */)) ||\n                (!optimized && shapeFlag & 16 /* ShapeFlags.ARRAY_CHILDREN */)) {\n                unmountChildren(children, parentComponent, parentSuspense);\n            }\n            if (doRemove) {\n                remove(vnode);\n            }\n        }\n        if ((shouldInvokeVnodeHook &&\n            (vnodeHook = props && props.onVnodeUnmounted)) ||\n            shouldInvokeDirs) {\n            queuePostRenderEffect(() => {\n                vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);\n                shouldInvokeDirs &&\n                    invokeDirectiveHook(vnode, null, parentComponent, 'unmounted');\n            }, parentSuspense);\n        }\n    };\n    const remove = vnode => {\n        const { type, el, anchor, transition } = vnode;\n        if (type === Fragment) {\n            if (( true) &&\n                vnode.patchFlag > 0 &&\n                vnode.patchFlag & 2048 /* PatchFlags.DEV_ROOT_FRAGMENT */ &&\n                transition &&\n                !transition.persisted) {\n                vnode.children.forEach(child => {\n                    if (child.type === Comment) {\n                        hostRemove(child.el);\n                    }\n                    else {\n                        remove(child);\n                    }\n                });\n            }\n            else {\n                removeFragment(el, anchor);\n            }\n            return;\n        }\n        if (type === Static) {\n            removeStaticNode(vnode);\n            return;\n        }\n        const performRemove = () => {\n            hostRemove(el);\n            if (transition && !transition.persisted && transition.afterLeave) {\n                transition.afterLeave();\n            }\n        };\n        if (vnode.shapeFlag & 1 /* ShapeFlags.ELEMENT */ &&\n            transition &&\n            !transition.persisted) {\n            const { leave, delayLeave } = transition;\n            const performLeave = () => leave(el, performRemove);\n            if (delayLeave) {\n                delayLeave(vnode.el, performRemove, performLeave);\n            }\n            else {\n                performLeave();\n            }\n        }\n        else {\n            performRemove();\n        }\n    };\n    const removeFragment = (cur, end) => {\n        // For fragments, directly remove all contained DOM nodes.\n        // (fragment child nodes cannot have transition)\n        let next;\n        while (cur !== end) {\n            next = hostNextSibling(cur);\n            hostRemove(cur);\n            cur = next;\n        }\n        hostRemove(end);\n    };\n    const unmountComponent = (instance, parentSuspense, doRemove) => {\n        if (( true) && instance.type.__hmrId) {\n            unregisterHMR(instance);\n        }\n        const { bum, scope, update, subTree, um } = instance;\n        // beforeUnmount hook\n        if (bum) {\n            (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(bum);\n        }\n        // stop effects in component scope\n        scope.stop();\n        // update may be null if a component is unmounted before its async\n        // setup has resolved.\n        if (update) {\n            // so that scheduler will no longer invoke it\n            update.active = false;\n            unmount(subTree, instance, parentSuspense, doRemove);\n        }\n        // unmounted hook\n        if (um) {\n            queuePostRenderEffect(um, parentSuspense);\n        }\n        queuePostRenderEffect(() => {\n            instance.isUnmounted = true;\n        }, parentSuspense);\n        // A component with async dep inside a pending suspense is unmounted before\n        // its async dep resolves. This should remove the dep from the suspense, and\n        // cause the suspense to resolve immediately if that was the last dep.\n        if (parentSuspense &&\n            parentSuspense.pendingBranch &&\n            !parentSuspense.isUnmounted &&\n            instance.asyncDep &&\n            !instance.asyncResolved &&\n            instance.suspenseId === parentSuspense.pendingId) {\n            parentSuspense.deps--;\n            if (parentSuspense.deps === 0) {\n                parentSuspense.resolve();\n            }\n        }\n        if (true) {\n            devtoolsComponentRemoved(instance);\n        }\n    };\n    const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => {\n        for (let i = start; i < children.length; i++) {\n            unmount(children[i], parentComponent, parentSuspense, doRemove, optimized);\n        }\n    };\n    const getNextHostNode = vnode => {\n        if (vnode.shapeFlag & 6 /* ShapeFlags.COMPONENT */) {\n            return getNextHostNode(vnode.component.subTree);\n        }\n        if (vnode.shapeFlag & 128 /* ShapeFlags.SUSPENSE */) {\n            return vnode.suspense.next();\n        }\n        return hostNextSibling((vnode.anchor || vnode.el));\n    };\n    const render = (vnode, container, isSVG) => {\n        if (vnode == null) {\n            if (container._vnode) {\n                unmount(container._vnode, null, null, true);\n            }\n        }\n        else {\n            patch(container._vnode || null, vnode, container, null, null, null, isSVG);\n        }\n        flushPreFlushCbs();\n        flushPostFlushCbs();\n        container._vnode = vnode;\n    };\n    const internals = {\n        p: patch,\n        um: unmount,\n        m: move,\n        r: remove,\n        mt: mountComponent,\n        mc: mountChildren,\n        pc: patchChildren,\n        pbc: patchBlockChildren,\n        n: getNextHostNode,\n        o: options\n    };\n    let hydrate;\n    let hydrateNode;\n    if (createHydrationFns) {\n        [hydrate, hydrateNode] = createHydrationFns(internals);\n    }\n    return {\n        render,\n        hydrate,\n        createApp: createAppAPI(render, hydrate)\n    };\n}\nfunction toggleRecurse({ effect, update }, allowed) {\n    effect.allowRecurse = update.allowRecurse = allowed;\n}\n/**\n * #1156\n * When a component is HMR-enabled, we need to make sure that all static nodes\n * inside a block also inherit the DOM element from the previous tree so that\n * HMR updates (which are full updates) can retrieve the element for patching.\n *\n * #2080\n * Inside keyed `template` fragment static children, if a fragment is moved,\n * the children will always be moved. Therefore, in order to ensure correct move\n * position, el should be inherited from previous nodes.\n */\nfunction traverseStaticChildren(n1, n2, shallow = false) {\n    const ch1 = n1.children;\n    const ch2 = n2.children;\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(ch1) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(ch2)) {\n        for (let i = 0; i < ch1.length; i++) {\n            // this is only called in the optimized path so array children are\n            // guaranteed to be vnodes\n            const c1 = ch1[i];\n            let c2 = ch2[i];\n            if (c2.shapeFlag & 1 /* ShapeFlags.ELEMENT */ && !c2.dynamicChildren) {\n                if (c2.patchFlag <= 0 || c2.patchFlag === 32 /* PatchFlags.HYDRATE_EVENTS */) {\n                    c2 = ch2[i] = cloneIfMounted(ch2[i]);\n                    c2.el = c1.el;\n                }\n                if (!shallow)\n                    traverseStaticChildren(c1, c2);\n            }\n            // #6852 also inherit for text nodes\n            if (c2.type === Text) {\n                c2.el = c1.el;\n            }\n            // also inherit for comment nodes, but not placeholders (e.g. v-if which\n            // would have received .el during block patch)\n            if (( true) && c2.type === Comment && !c2.el) {\n                c2.el = c1.el;\n            }\n        }\n    }\n}\n// https://en.wikipedia.org/wiki/Longest_increasing_subsequence\nfunction getSequence(arr) {\n    const p = arr.slice();\n    const result = [0];\n    let i, j, u, v, c;\n    const len = arr.length;\n    for (i = 0; i < len; i++) {\n        const arrI = arr[i];\n        if (arrI !== 0) {\n            j = result[result.length - 1];\n            if (arr[j] < arrI) {\n                p[i] = j;\n                result.push(i);\n                continue;\n            }\n            u = 0;\n            v = result.length - 1;\n            while (u < v) {\n                c = (u + v) >> 1;\n                if (arr[result[c]] < arrI) {\n                    u = c + 1;\n                }\n                else {\n                    v = c;\n                }\n            }\n            if (arrI < arr[result[u]]) {\n                if (u > 0) {\n                    p[i] = result[u - 1];\n                }\n                result[u] = i;\n            }\n        }\n    }\n    u = result.length;\n    v = result[u - 1];\n    while (u-- > 0) {\n        result[u] = v;\n        v = p[v];\n    }\n    return result;\n}\n\nconst isTeleport = (type) => type.__isTeleport;\nconst isTeleportDisabled = (props) => props && (props.disabled || props.disabled === '');\nconst isTargetSVG = (target) => typeof SVGElement !== 'undefined' && target instanceof SVGElement;\nconst resolveTarget = (props, select) => {\n    const targetSelector = props && props.to;\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(targetSelector)) {\n        if (!select) {\n            ( true) &&\n                warn(`Current renderer does not support string target for Teleports. ` +\n                    `(missing querySelector renderer option)`);\n            return null;\n        }\n        else {\n            const target = select(targetSelector);\n            if (!target) {\n                ( true) &&\n                    warn(`Failed to locate Teleport target with selector \"${targetSelector}\". ` +\n                        `Note the target element must exist before the component is mounted - ` +\n                        `i.e. the target cannot be rendered by the component itself, and ` +\n                        `ideally should be outside of the entire Vue component tree.`);\n            }\n            return target;\n        }\n    }\n    else {\n        if (( true) && !targetSelector && !isTeleportDisabled(props)) {\n            warn(`Invalid Teleport target: ${targetSelector}`);\n        }\n        return targetSelector;\n    }\n};\nconst TeleportImpl = {\n    __isTeleport: true,\n    process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, internals) {\n        const { mc: mountChildren, pc: patchChildren, pbc: patchBlockChildren, o: { insert, querySelector, createText, createComment } } = internals;\n        const disabled = isTeleportDisabled(n2.props);\n        let { shapeFlag, children, dynamicChildren } = n2;\n        // #3302\n        // HMR updated, force full diff\n        if (( true) && isHmrUpdating) {\n            optimized = false;\n            dynamicChildren = null;\n        }\n        if (n1 == null) {\n            // insert anchors in the main view\n            const placeholder = (n2.el = ( true)\n                ? createComment('teleport start')\n                : 0);\n            const mainAnchor = (n2.anchor = ( true)\n                ? createComment('teleport end')\n                : 0);\n            insert(placeholder, container, anchor);\n            insert(mainAnchor, container, anchor);\n            const target = (n2.target = resolveTarget(n2.props, querySelector));\n            const targetAnchor = (n2.targetAnchor = createText(''));\n            if (target) {\n                insert(targetAnchor, target);\n                // #2652 we could be teleporting from a non-SVG tree into an SVG tree\n                isSVG = isSVG || isTargetSVG(target);\n            }\n            else if (( true) && !disabled) {\n                warn('Invalid Teleport target on mount:', target, `(${typeof target})`);\n            }\n            const mount = (container, anchor) => {\n                // Teleport *always* has Array children. This is enforced in both the\n                // compiler and vnode children normalization.\n                if (shapeFlag & 16 /* ShapeFlags.ARRAY_CHILDREN */) {\n                    mountChildren(children, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized);\n                }\n            };\n            if (disabled) {\n                mount(container, mainAnchor);\n            }\n            else if (target) {\n                mount(target, targetAnchor);\n            }\n        }\n        else {\n            // update content\n            n2.el = n1.el;\n            const mainAnchor = (n2.anchor = n1.anchor);\n            const target = (n2.target = n1.target);\n            const targetAnchor = (n2.targetAnchor = n1.targetAnchor);\n            const wasDisabled = isTeleportDisabled(n1.props);\n            const currentContainer = wasDisabled ? container : target;\n            const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;\n            isSVG = isSVG || isTargetSVG(target);\n            if (dynamicChildren) {\n                // fast path when the teleport happens to be a block root\n                patchBlockChildren(n1.dynamicChildren, dynamicChildren, currentContainer, parentComponent, parentSuspense, isSVG, slotScopeIds);\n                // even in block tree mode we need to make sure all root-level nodes\n                // in the teleport inherit previous DOM references so that they can\n                // be moved in future patches.\n                traverseStaticChildren(n1, n2, true);\n            }\n            else if (!optimized) {\n                patchChildren(n1, n2, currentContainer, currentAnchor, parentComponent, parentSuspense, isSVG, slotScopeIds, false);\n            }\n            if (disabled) {\n                if (!wasDisabled) {\n                    // enabled -> disabled\n                    // move into main container\n                    moveTeleport(n2, container, mainAnchor, internals, 1 /* TeleportMoveTypes.TOGGLE */);\n                }\n            }\n            else {\n                // target changed\n                if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {\n                    const nextTarget = (n2.target = resolveTarget(n2.props, querySelector));\n                    if (nextTarget) {\n                        moveTeleport(n2, nextTarget, null, internals, 0 /* TeleportMoveTypes.TARGET_CHANGE */);\n                    }\n                    else if ((true)) {\n                        warn('Invalid Teleport target on update:', target, `(${typeof target})`);\n                    }\n                }\n                else if (wasDisabled) {\n                    // disabled -> enabled\n                    // move into teleport target\n                    moveTeleport(n2, target, targetAnchor, internals, 1 /* TeleportMoveTypes.TOGGLE */);\n                }\n            }\n        }\n        updateCssVars(n2);\n    },\n    remove(vnode, parentComponent, parentSuspense, optimized, { um: unmount, o: { remove: hostRemove } }, doRemove) {\n        const { shapeFlag, children, anchor, targetAnchor, target, props } = vnode;\n        if (target) {\n            hostRemove(targetAnchor);\n        }\n        // an unmounted teleport should always remove its children if not disabled\n        if (doRemove || !isTeleportDisabled(props)) {\n            hostRemove(anchor);\n            if (shapeFlag & 16 /* ShapeFlags.ARRAY_CHILDREN */) {\n                for (let i = 0; i < children.length; i++) {\n                    const child = children[i];\n                    unmount(child, parentComponent, parentSuspense, true, !!child.dynamicChildren);\n                }\n            }\n        }\n    },\n    move: moveTeleport,\n    hydrate: hydrateTeleport\n};\nfunction moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2 /* TeleportMoveTypes.REORDER */) {\n    // move target anchor if this is a target change.\n    if (moveType === 0 /* TeleportMoveTypes.TARGET_CHANGE */) {\n        insert(vnode.targetAnchor, container, parentAnchor);\n    }\n    const { el, anchor, shapeFlag, children, props } = vnode;\n    const isReorder = moveType === 2 /* TeleportMoveTypes.REORDER */;\n    // move main view anchor if this is a re-order.\n    if (isReorder) {\n        insert(el, container, parentAnchor);\n    }\n    // if this is a re-order and teleport is enabled (content is in target)\n    // do not move children. So the opposite is: only move children if this\n    // is not a reorder, or the teleport is disabled\n    if (!isReorder || isTeleportDisabled(props)) {\n        // Teleport has either Array children or no children.\n        if (shapeFlag & 16 /* ShapeFlags.ARRAY_CHILDREN */) {\n            for (let i = 0; i < children.length; i++) {\n                move(children[i], container, parentAnchor, 2 /* MoveType.REORDER */);\n            }\n        }\n    }\n    // move main view anchor if this is a re-order.\n    if (isReorder) {\n        insert(anchor, container, parentAnchor);\n    }\n}\nfunction hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, { o: { nextSibling, parentNode, querySelector } }, hydrateChildren) {\n    const target = (vnode.target = resolveTarget(vnode.props, querySelector));\n    if (target) {\n        // if multiple teleports rendered to the same target element, we need to\n        // pick up from where the last teleport finished instead of the first node\n        const targetNode = target._lpa || target.firstChild;\n        if (vnode.shapeFlag & 16 /* ShapeFlags.ARRAY_CHILDREN */) {\n            if (isTeleportDisabled(vnode.props)) {\n                vnode.anchor = hydrateChildren(nextSibling(node), vnode, parentNode(node), parentComponent, parentSuspense, slotScopeIds, optimized);\n                vnode.targetAnchor = targetNode;\n            }\n            else {\n                vnode.anchor = nextSibling(node);\n                // lookahead until we find the target anchor\n                // we cannot rely on return value of hydrateChildren() because there\n                // could be nested teleports\n                let targetAnchor = targetNode;\n                while (targetAnchor) {\n                    targetAnchor = nextSibling(targetAnchor);\n                    if (targetAnchor &&\n                        targetAnchor.nodeType === 8 &&\n                        targetAnchor.data === 'teleport anchor') {\n                        vnode.targetAnchor = targetAnchor;\n                        target._lpa =\n                            vnode.targetAnchor && nextSibling(vnode.targetAnchor);\n                        break;\n                    }\n                }\n                hydrateChildren(targetNode, vnode, target, parentComponent, parentSuspense, slotScopeIds, optimized);\n            }\n        }\n        updateCssVars(vnode);\n    }\n    return vnode.anchor && nextSibling(vnode.anchor);\n}\n// Force-casted public typing for h and TSX props inference\nconst Teleport = TeleportImpl;\nfunction updateCssVars(vnode) {\n    // presence of .ut method indicates owner component uses css vars.\n    // code path here can assume browser environment.\n    const ctx = vnode.ctx;\n    if (ctx && ctx.ut) {\n        let node = vnode.children[0].el;\n        while (node !== vnode.targetAnchor) {\n            if (node.nodeType === 1)\n                node.setAttribute('data-v-owner', ctx.uid);\n            node = node.nextSibling;\n        }\n        ctx.ut();\n    }\n}\n\nconst Fragment = Symbol(( true) ? 'Fragment' : 0);\nconst Text = Symbol(( true) ? 'Text' : 0);\nconst Comment = Symbol(( true) ? 'Comment' : 0);\nconst Static = Symbol(( true) ? 'Static' : 0);\n// Since v-if and v-for are the two possible ways node structure can dynamically\n// change, once we consider v-if branches and each v-for fragment a block, we\n// can divide a template into nested blocks, and within each block the node\n// structure would be stable. This allows us to skip most children diffing\n// and only worry about the dynamic nodes (indicated by patch flags).\nconst blockStack = [];\nlet currentBlock = null;\n/**\n * Open a block.\n * This must be called before `createBlock`. It cannot be part of `createBlock`\n * because the children of the block are evaluated before `createBlock` itself\n * is called. The generated code typically looks like this:\n *\n * ```js\n * function render() {\n *   return (openBlock(),createBlock('div', null, [...]))\n * }\n * ```\n * disableTracking is true when creating a v-for fragment block, since a v-for\n * fragment always diffs its children.\n *\n * @private\n */\nfunction openBlock(disableTracking = false) {\n    blockStack.push((currentBlock = disableTracking ? null : []));\n}\nfunction closeBlock() {\n    blockStack.pop();\n    currentBlock = blockStack[blockStack.length - 1] || null;\n}\n// Whether we should be tracking dynamic child nodes inside a block.\n// Only tracks when this value is > 0\n// We are not using a simple boolean because this value may need to be\n// incremented/decremented by nested usage of v-once (see below)\nlet isBlockTreeEnabled = 1;\n/**\n * Block tracking sometimes needs to be disabled, for example during the\n * creation of a tree that needs to be cached by v-once. The compiler generates\n * code like this:\n *\n * ``` js\n * _cache[1] || (\n *   setBlockTracking(-1),\n *   _cache[1] = createVNode(...),\n *   setBlockTracking(1),\n *   _cache[1]\n * )\n * ```\n *\n * @private\n */\nfunction setBlockTracking(value) {\n    isBlockTreeEnabled += value;\n}\nfunction setupBlock(vnode) {\n    // save current block children on the block vnode\n    vnode.dynamicChildren =\n        isBlockTreeEnabled > 0 ? currentBlock || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR : null;\n    // close block\n    closeBlock();\n    // a block is always going to be patched, so track it as a child of its\n    // parent block\n    if (isBlockTreeEnabled > 0 && currentBlock) {\n        currentBlock.push(vnode);\n    }\n    return vnode;\n}\n/**\n * @private\n */\nfunction createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) {\n    return setupBlock(createBaseVNode(type, props, children, patchFlag, dynamicProps, shapeFlag, true /* isBlock */));\n}\n/**\n * Create a block root vnode. Takes the same exact arguments as `createVNode`.\n * A block root keeps track of dynamic nodes within the block in the\n * `dynamicChildren` array.\n *\n * @private\n */\nfunction createBlock(type, props, children, patchFlag, dynamicProps) {\n    return setupBlock(createVNode(type, props, children, patchFlag, dynamicProps, true /* isBlock: prevent a block from tracking itself */));\n}\nfunction isVNode(value) {\n    return value ? value.__v_isVNode === true : false;\n}\nfunction isSameVNodeType(n1, n2) {\n    if (( true) &&\n        n2.shapeFlag & 6 /* ShapeFlags.COMPONENT */ &&\n        hmrDirtyComponents.has(n2.type)) {\n        // #7042, ensure the vnode being unmounted during HMR\n        // bitwise operations to remove keep alive flags\n        n1.shapeFlag &= ~256 /* ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE */;\n        n2.shapeFlag &= ~512 /* ShapeFlags.COMPONENT_KEPT_ALIVE */;\n        // HMR only: if the component has been hot-updated, force a reload.\n        return false;\n    }\n    return n1.type === n2.type && n1.key === n2.key;\n}\nlet vnodeArgsTransformer;\n/**\n * Internal API for registering an arguments transform for createVNode\n * used for creating stubs in the test-utils\n * It is *internal* but needs to be exposed for test-utils to pick up proper\n * typings\n */\nfunction transformVNodeArgs(transformer) {\n    vnodeArgsTransformer = transformer;\n}\nconst createVNodeWithArgsTransform = (...args) => {\n    return _createVNode(...(vnodeArgsTransformer\n        ? vnodeArgsTransformer(args, currentRenderingInstance)\n        : args));\n};\nconst InternalObjectKey = `__vInternal`;\nconst normalizeKey = ({ key }) => key != null ? key : null;\nconst normalizeRef = ({ ref, ref_key, ref_for }) => {\n    return (ref != null\n        ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(ref) || (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(ref) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(ref)\n            ? { i: currentRenderingInstance, r: ref, k: ref_key, f: !!ref_for }\n            : ref\n        : null);\n};\nfunction createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1 /* ShapeFlags.ELEMENT */, isBlockNode = false, needFullChildrenNormalization = false) {\n    const vnode = {\n        __v_isVNode: true,\n        __v_skip: true,\n        type,\n        props,\n        key: props && normalizeKey(props),\n        ref: props && normalizeRef(props),\n        scopeId: currentScopeId,\n        slotScopeIds: null,\n        children,\n        component: null,\n        suspense: null,\n        ssContent: null,\n        ssFallback: null,\n        dirs: null,\n        transition: null,\n        el: null,\n        anchor: null,\n        target: null,\n        targetAnchor: null,\n        staticCount: 0,\n        shapeFlag,\n        patchFlag,\n        dynamicProps,\n        dynamicChildren: null,\n        appContext: null,\n        ctx: currentRenderingInstance\n    };\n    if (needFullChildrenNormalization) {\n        normalizeChildren(vnode, children);\n        // normalize suspense children\n        if (shapeFlag & 128 /* ShapeFlags.SUSPENSE */) {\n            type.normalize(vnode);\n        }\n    }\n    else if (children) {\n        // compiled element vnode - if children is passed, only possible types are\n        // string or Array.\n        vnode.shapeFlag |= (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(children)\n            ? 8 /* ShapeFlags.TEXT_CHILDREN */\n            : 16 /* ShapeFlags.ARRAY_CHILDREN */;\n    }\n    // validate key\n    if (( true) && vnode.key !== vnode.key) {\n        warn(`VNode created with invalid key (NaN). VNode type:`, vnode.type);\n    }\n    // track vnode for block tree\n    if (isBlockTreeEnabled > 0 &&\n        // avoid a block node from tracking itself\n        !isBlockNode &&\n        // has current parent block\n        currentBlock &&\n        // presence of a patch flag indicates this node needs patching on updates.\n        // component nodes also should always be patched, because even if the\n        // component doesn't need to update, it needs to persist the instance on to\n        // the next vnode so that it can be properly unmounted later.\n        (vnode.patchFlag > 0 || shapeFlag & 6 /* ShapeFlags.COMPONENT */) &&\n        // the EVENTS flag is only for hydration and if it is the only flag, the\n        // vnode should not be considered dynamic due to handler caching.\n        vnode.patchFlag !== 32 /* PatchFlags.HYDRATE_EVENTS */) {\n        currentBlock.push(vnode);\n    }\n    return vnode;\n}\nconst createVNode = (( true) ? createVNodeWithArgsTransform : 0);\nfunction _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) {\n    if (!type || type === NULL_DYNAMIC_COMPONENT) {\n        if (( true) && !type) {\n            warn(`Invalid vnode type when creating vnode: ${type}.`);\n        }\n        type = Comment;\n    }\n    if (isVNode(type)) {\n        // createVNode receiving an existing vnode. This happens in cases like\n        // <component :is=\"vnode\"/>\n        // #2078 make sure to merge refs during the clone instead of overwriting it\n        const cloned = cloneVNode(type, props, true /* mergeRef: true */);\n        if (children) {\n            normalizeChildren(cloned, children);\n        }\n        if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) {\n            if (cloned.shapeFlag & 6 /* ShapeFlags.COMPONENT */) {\n                currentBlock[currentBlock.indexOf(type)] = cloned;\n            }\n            else {\n                currentBlock.push(cloned);\n            }\n        }\n        cloned.patchFlag |= -2 /* PatchFlags.BAIL */;\n        return cloned;\n    }\n    // class component normalization.\n    if (isClassComponent(type)) {\n        type = type.__vccOpts;\n    }\n    // class & style normalization.\n    if (props) {\n        // for reactive or proxy objects, we need to clone it to enable mutation.\n        props = guardReactiveProps(props);\n        let { class: klass, style } = props;\n        if (klass && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(klass)) {\n            props.class = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)(klass);\n        }\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(style)) {\n            // reactive state objects need to be cloned since they are likely to be\n            // mutated\n            if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isProxy)(style) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(style)) {\n                style = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, style);\n            }\n            props.style = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeStyle)(style);\n        }\n    }\n    // encode the vnode type information into a bitmap\n    const shapeFlag = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(type)\n        ? 1 /* ShapeFlags.ELEMENT */\n        : isSuspense(type)\n            ? 128 /* ShapeFlags.SUSPENSE */\n            : isTeleport(type)\n                ? 64 /* ShapeFlags.TELEPORT */\n                : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(type)\n                    ? 4 /* ShapeFlags.STATEFUL_COMPONENT */\n                    : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(type)\n                        ? 2 /* ShapeFlags.FUNCTIONAL_COMPONENT */\n                        : 0;\n    if (( true) && shapeFlag & 4 /* ShapeFlags.STATEFUL_COMPONENT */ && (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isProxy)(type)) {\n        type = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(type);\n        warn(`Vue received a Component which was made a reactive object. This can ` +\n            `lead to unnecessary performance overhead, and should be avoided by ` +\n            `marking the component with \\`markRaw\\` or using \\`shallowRef\\` ` +\n            `instead of \\`ref\\`.`, `\\nComponent that was made reactive: `, type);\n    }\n    return createBaseVNode(type, props, children, patchFlag, dynamicProps, shapeFlag, isBlockNode, true);\n}\nfunction guardReactiveProps(props) {\n    if (!props)\n        return null;\n    return (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isProxy)(props) || InternalObjectKey in props\n        ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, props)\n        : props;\n}\nfunction cloneVNode(vnode, extraProps, mergeRef = false) {\n    // This is intentionally NOT using spread or extend to avoid the runtime\n    // key enumeration cost.\n    const { props, ref, patchFlag, children } = vnode;\n    const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props;\n    const cloned = {\n        __v_isVNode: true,\n        __v_skip: true,\n        type: vnode.type,\n        props: mergedProps,\n        key: mergedProps && normalizeKey(mergedProps),\n        ref: extraProps && extraProps.ref\n            ? // #2078 in the case of <component :is=\"vnode\" ref=\"extra\"/>\n                // if the vnode itself already has a ref, cloneVNode will need to merge\n                // the refs so the single vnode can be set on multiple refs\n                mergeRef && ref\n                    ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(ref)\n                        ? ref.concat(normalizeRef(extraProps))\n                        : [ref, normalizeRef(extraProps)]\n                    : normalizeRef(extraProps)\n            : ref,\n        scopeId: vnode.scopeId,\n        slotScopeIds: vnode.slotScopeIds,\n        children: ( true) && patchFlag === -1 /* PatchFlags.HOISTED */ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(children)\n            ? children.map(deepCloneVNode)\n            : children,\n        target: vnode.target,\n        targetAnchor: vnode.targetAnchor,\n        staticCount: vnode.staticCount,\n        shapeFlag: vnode.shapeFlag,\n        // if the vnode is cloned with extra props, we can no longer assume its\n        // existing patch flag to be reliable and need to add the FULL_PROPS flag.\n        // note: preserve flag for fragments since they use the flag for children\n        // fast paths only.\n        patchFlag: extraProps && vnode.type !== Fragment\n            ? patchFlag === -1 // hoisted node\n                ? 16 /* PatchFlags.FULL_PROPS */\n                : patchFlag | 16 /* PatchFlags.FULL_PROPS */\n            : patchFlag,\n        dynamicProps: vnode.dynamicProps,\n        dynamicChildren: vnode.dynamicChildren,\n        appContext: vnode.appContext,\n        dirs: vnode.dirs,\n        transition: vnode.transition,\n        // These should technically only be non-null on mounted VNodes. However,\n        // they *should* be copied for kept-alive vnodes. So we just always copy\n        // them since them being non-null during a mount doesn't affect the logic as\n        // they will simply be overwritten.\n        component: vnode.component,\n        suspense: vnode.suspense,\n        ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),\n        ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),\n        el: vnode.el,\n        anchor: vnode.anchor,\n        ctx: vnode.ctx,\n        ce: vnode.ce\n    };\n    return cloned;\n}\n/**\n * Dev only, for HMR of hoisted vnodes reused in v-for\n * https://github.com/vitejs/vite/issues/2022\n */\nfunction deepCloneVNode(vnode) {\n    const cloned = cloneVNode(vnode);\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(vnode.children)) {\n        cloned.children = vnode.children.map(deepCloneVNode);\n    }\n    return cloned;\n}\n/**\n * @private\n */\nfunction createTextVNode(text = ' ', flag = 0) {\n    return createVNode(Text, null, text, flag);\n}\n/**\n * @private\n */\nfunction createStaticVNode(content, numberOfNodes) {\n    // A static vnode can contain multiple stringified elements, and the number\n    // of elements is necessary for hydration.\n    const vnode = createVNode(Static, null, content);\n    vnode.staticCount = numberOfNodes;\n    return vnode;\n}\n/**\n * @private\n */\nfunction createCommentVNode(text = '', \n// when used as the v-else branch, the comment node must be created as a\n// block to ensure correct updates.\nasBlock = false) {\n    return asBlock\n        ? (openBlock(), createBlock(Comment, null, text))\n        : createVNode(Comment, null, text);\n}\nfunction normalizeVNode(child) {\n    if (child == null || typeof child === 'boolean') {\n        // empty placeholder\n        return createVNode(Comment);\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(child)) {\n        // fragment\n        return createVNode(Fragment, null, \n        // #3666, avoid reference pollution when reusing vnode\n        child.slice());\n    }\n    else if (typeof child === 'object') {\n        // already vnode, this should be the most common since compiled templates\n        // always produce all-vnode children arrays\n        return cloneIfMounted(child);\n    }\n    else {\n        // strings and numbers\n        return createVNode(Text, null, String(child));\n    }\n}\n// optimized normalization for template-compiled render fns\nfunction cloneIfMounted(child) {\n    return (child.el === null && child.patchFlag !== -1 /* PatchFlags.HOISTED */) ||\n        child.memo\n        ? child\n        : cloneVNode(child);\n}\nfunction normalizeChildren(vnode, children) {\n    let type = 0;\n    const { shapeFlag } = vnode;\n    if (children == null) {\n        children = null;\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(children)) {\n        type = 16 /* ShapeFlags.ARRAY_CHILDREN */;\n    }\n    else if (typeof children === 'object') {\n        if (shapeFlag & (1 /* ShapeFlags.ELEMENT */ | 64 /* ShapeFlags.TELEPORT */)) {\n            // Normalize slot to plain children for plain element and Teleport\n            const slot = children.default;\n            if (slot) {\n                // _c marker is added by withCtx() indicating this is a compiled slot\n                slot._c && (slot._d = false);\n                normalizeChildren(vnode, slot());\n                slot._c && (slot._d = true);\n            }\n            return;\n        }\n        else {\n            type = 32 /* ShapeFlags.SLOTS_CHILDREN */;\n            const slotFlag = children._;\n            if (!slotFlag && !(InternalObjectKey in children)) {\n                children._ctx = currentRenderingInstance;\n            }\n            else if (slotFlag === 3 /* SlotFlags.FORWARDED */ && currentRenderingInstance) {\n                // a child component receives forwarded slots from the parent.\n                // its slot type is determined by its parent's slot type.\n                if (currentRenderingInstance.slots._ === 1 /* SlotFlags.STABLE */) {\n                    children._ = 1 /* SlotFlags.STABLE */;\n                }\n                else {\n                    children._ = 2 /* SlotFlags.DYNAMIC */;\n                    vnode.patchFlag |= 1024 /* PatchFlags.DYNAMIC_SLOTS */;\n                }\n            }\n        }\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(children)) {\n        children = { default: children, _ctx: currentRenderingInstance };\n        type = 32 /* ShapeFlags.SLOTS_CHILDREN */;\n    }\n    else {\n        children = String(children);\n        // force teleport children to array so it can be moved around\n        if (shapeFlag & 64 /* ShapeFlags.TELEPORT */) {\n            type = 16 /* ShapeFlags.ARRAY_CHILDREN */;\n            children = [createTextVNode(children)];\n        }\n        else {\n            type = 8 /* ShapeFlags.TEXT_CHILDREN */;\n        }\n    }\n    vnode.children = children;\n    vnode.shapeFlag |= type;\n}\nfunction mergeProps(...args) {\n    const ret = {};\n    for (let i = 0; i < args.length; i++) {\n        const toMerge = args[i];\n        for (const key in toMerge) {\n            if (key === 'class') {\n                if (ret.class !== toMerge.class) {\n                    ret.class = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)([ret.class, toMerge.class]);\n                }\n            }\n            else if (key === 'style') {\n                ret.style = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeStyle)([ret.style, toMerge.style]);\n            }\n            else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) {\n                const existing = ret[key];\n                const incoming = toMerge[key];\n                if (incoming &&\n                    existing !== incoming &&\n                    !((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(existing) && existing.includes(incoming))) {\n                    ret[key] = existing\n                        ? [].concat(existing, incoming)\n                        : incoming;\n                }\n            }\n            else if (key !== '') {\n                ret[key] = toMerge[key];\n            }\n        }\n    }\n    return ret;\n}\nfunction invokeVNodeHook(hook, instance, vnode, prevVNode = null) {\n    callWithAsyncErrorHandling(hook, instance, 7 /* ErrorCodes.VNODE_HOOK */, [\n        vnode,\n        prevVNode\n    ]);\n}\n\nconst emptyAppContext = createAppContext();\nlet uid = 0;\nfunction createComponentInstance(vnode, parent, suspense) {\n    const type = vnode.type;\n    // inherit parent app context - or - if root, adopt from root vnode\n    const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;\n    const instance = {\n        uid: uid++,\n        vnode,\n        type,\n        parent,\n        appContext,\n        root: null,\n        next: null,\n        subTree: null,\n        effect: null,\n        update: null,\n        scope: new _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.EffectScope(true /* detached */),\n        render: null,\n        proxy: null,\n        exposed: null,\n        exposeProxy: null,\n        withProxy: null,\n        provides: parent ? parent.provides : Object.create(appContext.provides),\n        accessCache: null,\n        renderCache: [],\n        // local resolved assets\n        components: null,\n        directives: null,\n        // resolved props and emits options\n        propsOptions: normalizePropsOptions(type, appContext),\n        emitsOptions: normalizeEmitsOptions(type, appContext),\n        // emit\n        emit: null,\n        emitted: null,\n        // props default value\n        propsDefaults: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,\n        // inheritAttrs\n        inheritAttrs: type.inheritAttrs,\n        // state\n        ctx: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,\n        data: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,\n        props: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,\n        attrs: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,\n        slots: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,\n        refs: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,\n        setupState: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,\n        setupContext: null,\n        // suspense related\n        suspense,\n        suspenseId: suspense ? suspense.pendingId : 0,\n        asyncDep: null,\n        asyncResolved: false,\n        // lifecycle hooks\n        // not using enums here because it results in computed properties\n        isMounted: false,\n        isUnmounted: false,\n        isDeactivated: false,\n        bc: null,\n        c: null,\n        bm: null,\n        m: null,\n        bu: null,\n        u: null,\n        um: null,\n        bum: null,\n        da: null,\n        a: null,\n        rtg: null,\n        rtc: null,\n        ec: null,\n        sp: null\n    };\n    if ((true)) {\n        instance.ctx = createDevRenderContext(instance);\n    }\n    else {}\n    instance.root = parent ? parent.root : instance;\n    instance.emit = emit.bind(null, instance);\n    // apply custom element special handling\n    if (vnode.ce) {\n        vnode.ce(instance);\n    }\n    return instance;\n}\nlet currentInstance = null;\nconst getCurrentInstance = () => currentInstance || currentRenderingInstance;\nconst setCurrentInstance = (instance) => {\n    currentInstance = instance;\n    instance.scope.on();\n};\nconst unsetCurrentInstance = () => {\n    currentInstance && currentInstance.scope.off();\n    currentInstance = null;\n};\nconst isBuiltInTag = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)('slot,component');\nfunction validateComponentName(name, config) {\n    const appIsNativeTag = config.isNativeTag || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NO;\n    if (isBuiltInTag(name) || appIsNativeTag(name)) {\n        warn('Do not use built-in or reserved HTML elements as component id: ' + name);\n    }\n}\nfunction isStatefulComponent(instance) {\n    return instance.vnode.shapeFlag & 4 /* ShapeFlags.STATEFUL_COMPONENT */;\n}\nlet isInSSRComponentSetup = false;\nfunction setupComponent(instance, isSSR = false) {\n    isInSSRComponentSetup = isSSR;\n    const { props, children } = instance.vnode;\n    const isStateful = isStatefulComponent(instance);\n    initProps(instance, props, isStateful, isSSR);\n    initSlots(instance, children);\n    const setupResult = isStateful\n        ? setupStatefulComponent(instance, isSSR)\n        : undefined;\n    isInSSRComponentSetup = false;\n    return setupResult;\n}\nfunction setupStatefulComponent(instance, isSSR) {\n    var _a;\n    const Component = instance.type;\n    if ((true)) {\n        if (Component.name) {\n            validateComponentName(Component.name, instance.appContext.config);\n        }\n        if (Component.components) {\n            const names = Object.keys(Component.components);\n            for (let i = 0; i < names.length; i++) {\n                validateComponentName(names[i], instance.appContext.config);\n            }\n        }\n        if (Component.directives) {\n            const names = Object.keys(Component.directives);\n            for (let i = 0; i < names.length; i++) {\n                validateDirectiveName(names[i]);\n            }\n        }\n        if (Component.compilerOptions && isRuntimeOnly()) {\n            warn(`\"compilerOptions\" is only supported when using a build of Vue that ` +\n                `includes the runtime compiler. Since you are using a runtime-only ` +\n                `build, the options should be passed via your build tool config instead.`);\n        }\n    }\n    // 0. create render proxy property access cache\n    instance.accessCache = Object.create(null);\n    // 1. create public instance / render proxy\n    // also mark it raw so it's never observed\n    instance.proxy = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.markRaw)(new Proxy(instance.ctx, PublicInstanceProxyHandlers));\n    if ((true)) {\n        exposePropsOnRenderContext(instance);\n    }\n    // 2. call setup()\n    const { setup } = Component;\n    if (setup) {\n        const setupContext = (instance.setupContext =\n            setup.length > 1 ? createSetupContext(instance) : null);\n        setCurrentInstance(instance);\n        (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();\n        const setupResult = callWithErrorHandling(setup, instance, 0 /* ErrorCodes.SETUP_FUNCTION */, [( true) ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(instance.props) : 0, setupContext]);\n        (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();\n        unsetCurrentInstance();\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPromise)(setupResult)) {\n            setupResult.then(unsetCurrentInstance, unsetCurrentInstance);\n            if (isSSR) {\n                // return the promise so server-renderer can wait on it\n                return setupResult\n                    .then((resolvedResult) => {\n                    handleSetupResult(instance, resolvedResult, isSSR);\n                })\n                    .catch(e => {\n                    handleError(e, instance, 0 /* ErrorCodes.SETUP_FUNCTION */);\n                });\n            }\n            else {\n                // async setup returned Promise.\n                // bail here and wait for re-entry.\n                instance.asyncDep = setupResult;\n                if (( true) && !instance.suspense) {\n                    const name = (_a = Component.name) !== null && _a !== void 0 ? _a : 'Anonymous';\n                    warn(`Component <${name}>: setup function returned a promise, but no ` +\n                        `<Suspense> boundary was found in the parent component tree. ` +\n                        `A component with async setup() must be nested in a <Suspense> ` +\n                        `in order to be rendered.`);\n                }\n            }\n        }\n        else {\n            handleSetupResult(instance, setupResult, isSSR);\n        }\n    }\n    else {\n        finishComponentSetup(instance, isSSR);\n    }\n}\nfunction handleSetupResult(instance, setupResult, isSSR) {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(setupResult)) {\n        // setup returned an inline render function\n        if (instance.type.__ssrInlineRender) {\n            // when the function's name is `ssrRender` (compiled by SFC inline mode),\n            // set it as ssrRender instead.\n            instance.ssrRender = setupResult;\n        }\n        else {\n            instance.render = setupResult;\n        }\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(setupResult)) {\n        if (( true) && isVNode(setupResult)) {\n            warn(`setup() should not return VNodes directly - ` +\n                `return a render function instead.`);\n        }\n        // setup returned bindings.\n        // assuming a render function compiled from template is present.\n        if (true) {\n            instance.devtoolsRawSetupState = setupResult;\n        }\n        instance.setupState = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.proxyRefs)(setupResult);\n        if ((true)) {\n            exposeSetupStateOnRenderContext(instance);\n        }\n    }\n    else if (( true) && setupResult !== undefined) {\n        warn(`setup() should return an object. Received: ${setupResult === null ? 'null' : typeof setupResult}`);\n    }\n    finishComponentSetup(instance, isSSR);\n}\nlet compile;\nlet installWithProxy;\n/**\n * For runtime-dom to register the compiler.\n * Note the exported method uses any to avoid d.ts relying on the compiler types.\n */\nfunction registerRuntimeCompiler(_compile) {\n    compile = _compile;\n    installWithProxy = i => {\n        if (i.render._rc) {\n            i.withProxy = new Proxy(i.ctx, RuntimeCompiledPublicInstanceProxyHandlers);\n        }\n    };\n}\n// dev only\nconst isRuntimeOnly = () => !compile;\nfunction finishComponentSetup(instance, isSSR, skipOptions) {\n    const Component = instance.type;\n    // template / render function normalization\n    // could be already set when returned from setup()\n    if (!instance.render) {\n        // only do on-the-fly compile if not in SSR - SSR on-the-fly compilation\n        // is done by server-renderer\n        if (!isSSR && compile && !Component.render) {\n            const template = Component.template ||\n                resolveMergedOptions(instance).template;\n            if (template) {\n                if ((true)) {\n                    startMeasure(instance, `compile`);\n                }\n                const { isCustomElement, compilerOptions } = instance.appContext.config;\n                const { delimiters, compilerOptions: componentCompilerOptions } = Component;\n                const finalCompilerOptions = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({\n                    isCustomElement,\n                    delimiters\n                }, compilerOptions), componentCompilerOptions);\n                Component.render = compile(template, finalCompilerOptions);\n                if ((true)) {\n                    endMeasure(instance, `compile`);\n                }\n            }\n        }\n        instance.render = (Component.render || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP);\n        // for runtime-compiled render functions using `with` blocks, the render\n        // proxy used needs a different `has` handler which is more performant and\n        // also only allows a whitelist of globals to fallthrough.\n        if (installWithProxy) {\n            installWithProxy(instance);\n        }\n    }\n    // support for 2.x options\n    if (true) {\n        setCurrentInstance(instance);\n        (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();\n        applyOptions(instance);\n        (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();\n        unsetCurrentInstance();\n    }\n    // warn missing template/render\n    // the runtime compilation of template in SSR is done by server-render\n    if (( true) && !Component.render && instance.render === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP && !isSSR) {\n        /* istanbul ignore if */\n        if (!compile && Component.template) {\n            warn(`Component provided template option but ` +\n                `runtime compilation is not supported in this build of Vue.` +\n                (` Configure your bundler to alias \"vue\" to \"vue/dist/vue.esm-bundler.js\".`\n                    ) /* should not happen */);\n        }\n        else {\n            warn(`Component is missing template or render function.`);\n        }\n    }\n}\nfunction createAttrsProxy(instance) {\n    return new Proxy(instance.attrs, ( true)\n        ? {\n            get(target, key) {\n                markAttrsAccessed();\n                (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.track)(instance, \"get\" /* TrackOpTypes.GET */, '$attrs');\n                return target[key];\n            },\n            set() {\n                warn(`setupContext.attrs is readonly.`);\n                return false;\n            },\n            deleteProperty() {\n                warn(`setupContext.attrs is readonly.`);\n                return false;\n            }\n        }\n        : 0);\n}\nfunction createSetupContext(instance) {\n    const expose = exposed => {\n        if ((true)) {\n            if (instance.exposed) {\n                warn(`expose() should be called only once per setup().`);\n            }\n            if (exposed != null) {\n                let exposedType = typeof exposed;\n                if (exposedType === 'object') {\n                    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(exposed)) {\n                        exposedType = 'array';\n                    }\n                    else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(exposed)) {\n                        exposedType = 'ref';\n                    }\n                }\n                if (exposedType !== 'object') {\n                    warn(`expose() should be passed a plain object, received ${exposedType}.`);\n                }\n            }\n        }\n        instance.exposed = exposed || {};\n    };\n    let attrs;\n    if ((true)) {\n        // We use getters in dev in case libs like test-utils overwrite instance\n        // properties (overwrites should not be done in prod)\n        return Object.freeze({\n            get attrs() {\n                return attrs || (attrs = createAttrsProxy(instance));\n            },\n            get slots() {\n                return (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(instance.slots);\n            },\n            get emit() {\n                return (event, ...args) => instance.emit(event, ...args);\n            },\n            expose\n        });\n    }\n    else {}\n}\nfunction getExposeProxy(instance) {\n    if (instance.exposed) {\n        return (instance.exposeProxy ||\n            (instance.exposeProxy = new Proxy((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.proxyRefs)((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.markRaw)(instance.exposed)), {\n                get(target, key) {\n                    if (key in target) {\n                        return target[key];\n                    }\n                    else if (key in publicPropertiesMap) {\n                        return publicPropertiesMap[key](instance);\n                    }\n                },\n                has(target, key) {\n                    return key in target || key in publicPropertiesMap;\n                }\n            })));\n    }\n}\nconst classifyRE = /(?:^|[-_])(\\w)/g;\nconst classify = (str) => str.replace(classifyRE, c => c.toUpperCase()).replace(/[-_]/g, '');\nfunction getComponentName(Component, includeInferred = true) {\n    return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(Component)\n        ? Component.displayName || Component.name\n        : Component.name || (includeInferred && Component.__name);\n}\n/* istanbul ignore next */\nfunction formatComponentName(instance, Component, isRoot = false) {\n    let name = getComponentName(Component);\n    if (!name && Component.__file) {\n        const match = Component.__file.match(/([^/\\\\]+)\\.\\w+$/);\n        if (match) {\n            name = match[1];\n        }\n    }\n    if (!name && instance && instance.parent) {\n        // try to infer the name based on reverse resolution\n        const inferFromRegistry = (registry) => {\n            for (const key in registry) {\n                if (registry[key] === Component) {\n                    return key;\n                }\n            }\n        };\n        name =\n            inferFromRegistry(instance.components ||\n                instance.parent.type.components) || inferFromRegistry(instance.appContext.components);\n    }\n    return name ? classify(name) : isRoot ? `App` : `Anonymous`;\n}\nfunction isClassComponent(value) {\n    return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value) && '__vccOpts' in value;\n}\n\nconst computed = ((getterOrOptions, debugOptions) => {\n    // @ts-ignore\n    return (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.computed)(getterOrOptions, debugOptions, isInSSRComponentSetup);\n});\n\n// dev only\nconst warnRuntimeUsage = (method) => warn(`${method}() is a compiler-hint helper that is only usable inside ` +\n    `<script setup> of a single file component. Its arguments should be ` +\n    `compiled away and passing it at runtime has no effect.`);\n// implementation\nfunction defineProps() {\n    if ((true)) {\n        warnRuntimeUsage(`defineProps`);\n    }\n    return null;\n}\n// implementation\nfunction defineEmits() {\n    if ((true)) {\n        warnRuntimeUsage(`defineEmits`);\n    }\n    return null;\n}\n/**\n * Vue `<script setup>` compiler macro for declaring a component's exposed\n * instance properties when it is accessed by a parent component via template\n * refs.\n *\n * `<script setup>` components are closed by default - i.e. variables inside\n * the `<script setup>` scope is not exposed to parent unless explicitly exposed\n * via `defineExpose`.\n *\n * This is only usable inside `<script setup>`, is compiled away in the\n * output and should **not** be actually called at runtime.\n */\nfunction defineExpose(exposed) {\n    if ((true)) {\n        warnRuntimeUsage(`defineExpose`);\n    }\n}\n/**\n * Vue `<script setup>` compiler macro for providing props default values when\n * using type-based `defineProps` declaration.\n *\n * Example usage:\n * ```ts\n * withDefaults(defineProps<{\n *   size?: number\n *   labels?: string[]\n * }>(), {\n *   size: 3,\n *   labels: () => ['default label']\n * })\n * ```\n *\n * This is only usable inside `<script setup>`, is compiled away in the output\n * and should **not** be actually called at runtime.\n */\nfunction withDefaults(props, defaults) {\n    if ((true)) {\n        warnRuntimeUsage(`withDefaults`);\n    }\n    return null;\n}\nfunction useSlots() {\n    return getContext().slots;\n}\nfunction useAttrs() {\n    return getContext().attrs;\n}\nfunction getContext() {\n    const i = getCurrentInstance();\n    if (( true) && !i) {\n        warn(`useContext() called without active instance.`);\n    }\n    return i.setupContext || (i.setupContext = createSetupContext(i));\n}\n/**\n * Runtime helper for merging default declarations. Imported by compiled code\n * only.\n * @internal\n */\nfunction mergeDefaults(raw, defaults) {\n    const props = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(raw)\n        ? raw.reduce((normalized, p) => ((normalized[p] = {}), normalized), {})\n        : raw;\n    for (const key in defaults) {\n        const opt = props[key];\n        if (opt) {\n            if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(opt) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt)) {\n                props[key] = { type: opt, default: defaults[key] };\n            }\n            else {\n                opt.default = defaults[key];\n            }\n        }\n        else if (opt === null) {\n            props[key] = { default: defaults[key] };\n        }\n        else if ((true)) {\n            warn(`props default key \"${key}\" has no corresponding declaration.`);\n        }\n    }\n    return props;\n}\n/**\n * Used to create a proxy for the rest element when destructuring props with\n * defineProps().\n * @internal\n */\nfunction createPropsRestProxy(props, excludedKeys) {\n    const ret = {};\n    for (const key in props) {\n        if (!excludedKeys.includes(key)) {\n            Object.defineProperty(ret, key, {\n                enumerable: true,\n                get: () => props[key]\n            });\n        }\n    }\n    return ret;\n}\n/**\n * `<script setup>` helper for persisting the current instance context over\n * async/await flows.\n *\n * `@vue/compiler-sfc` converts the following:\n *\n * ```ts\n * const x = await foo()\n * ```\n *\n * into:\n *\n * ```ts\n * let __temp, __restore\n * const x = (([__temp, __restore] = withAsyncContext(() => foo())),__temp=await __temp,__restore(),__temp)\n * ```\n * @internal\n */\nfunction withAsyncContext(getAwaitable) {\n    const ctx = getCurrentInstance();\n    if (( true) && !ctx) {\n        warn(`withAsyncContext called without active current instance. ` +\n            `This is likely a bug.`);\n    }\n    let awaitable = getAwaitable();\n    unsetCurrentInstance();\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPromise)(awaitable)) {\n        awaitable = awaitable.catch(e => {\n            setCurrentInstance(ctx);\n            throw e;\n        });\n    }\n    return [awaitable, () => setCurrentInstance(ctx)];\n}\n\n// Actual implementation\nfunction h(type, propsOrChildren, children) {\n    const l = arguments.length;\n    if (l === 2) {\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(propsOrChildren) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(propsOrChildren)) {\n            // single vnode without props\n            if (isVNode(propsOrChildren)) {\n                return createVNode(type, null, [propsOrChildren]);\n            }\n            // props without children\n            return createVNode(type, propsOrChildren);\n        }\n        else {\n            // omit props\n            return createVNode(type, null, propsOrChildren);\n        }\n    }\n    else {\n        if (l > 3) {\n            children = Array.prototype.slice.call(arguments, 2);\n        }\n        else if (l === 3 && isVNode(children)) {\n            children = [children];\n        }\n        return createVNode(type, propsOrChildren, children);\n    }\n}\n\nconst ssrContextKey = Symbol(( true) ? `ssrContext` : 0);\nconst useSSRContext = () => {\n    {\n        const ctx = inject(ssrContextKey);\n        if (!ctx) {\n            ( true) &&\n                warn(`Server rendering context not provided. Make sure to only call ` +\n                    `useSSRContext() conditionally in the server build.`);\n        }\n        return ctx;\n    }\n};\n\nfunction isShallow(value) {\n    return !!(value && value[\"__v_isShallow\" /* ReactiveFlags.IS_SHALLOW */]);\n}\n\nfunction initCustomFormatter() {\n    /* eslint-disable no-restricted-globals */\n    if ( false || typeof window === 'undefined') {\n        return;\n    }\n    const vueStyle = { style: 'color:#3ba776' };\n    const numberStyle = { style: 'color:#0b1bc9' };\n    const stringStyle = { style: 'color:#b62e24' };\n    const keywordStyle = { style: 'color:#9d288c' };\n    // custom formatter for Chrome\n    // https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html\n    const formatter = {\n        header(obj) {\n            // TODO also format ComponentPublicInstance & ctx.slots/attrs in setup\n            if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(obj)) {\n                return null;\n            }\n            if (obj.__isVue) {\n                return ['div', vueStyle, `VueInstance`];\n            }\n            else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(obj)) {\n                return [\n                    'div',\n                    {},\n                    ['span', vueStyle, genRefFlag(obj)],\n                    '<',\n                    formatValue(obj.value),\n                    `>`\n                ];\n            }\n            else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive)(obj)) {\n                return [\n                    'div',\n                    {},\n                    ['span', vueStyle, isShallow(obj) ? 'ShallowReactive' : 'Reactive'],\n                    '<',\n                    formatValue(obj),\n                    `>${(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReadonly)(obj) ? ` (readonly)` : ``}`\n                ];\n            }\n            else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReadonly)(obj)) {\n                return [\n                    'div',\n                    {},\n                    ['span', vueStyle, isShallow(obj) ? 'ShallowReadonly' : 'Readonly'],\n                    '<',\n                    formatValue(obj),\n                    '>'\n                ];\n            }\n            return null;\n        },\n        hasBody(obj) {\n            return obj && obj.__isVue;\n        },\n        body(obj) {\n            if (obj && obj.__isVue) {\n                return [\n                    'div',\n                    {},\n                    ...formatInstance(obj.$)\n                ];\n            }\n        }\n    };\n    function formatInstance(instance) {\n        const blocks = [];\n        if (instance.type.props && instance.props) {\n            blocks.push(createInstanceBlock('props', (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(instance.props)));\n        }\n        if (instance.setupState !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) {\n            blocks.push(createInstanceBlock('setup', instance.setupState));\n        }\n        if (instance.data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) {\n            blocks.push(createInstanceBlock('data', (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(instance.data)));\n        }\n        const computed = extractKeys(instance, 'computed');\n        if (computed) {\n            blocks.push(createInstanceBlock('computed', computed));\n        }\n        const injected = extractKeys(instance, 'inject');\n        if (injected) {\n            blocks.push(createInstanceBlock('injected', injected));\n        }\n        blocks.push([\n            'div',\n            {},\n            [\n                'span',\n                {\n                    style: keywordStyle.style + ';opacity:0.66'\n                },\n                '$ (internal): '\n            ],\n            ['object', { object: instance }]\n        ]);\n        return blocks;\n    }\n    function createInstanceBlock(type, target) {\n        target = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, target);\n        if (!Object.keys(target).length) {\n            return ['span', {}];\n        }\n        return [\n            'div',\n            { style: 'line-height:1.25em;margin-bottom:0.6em' },\n            [\n                'div',\n                {\n                    style: 'color:#476582'\n                },\n                type\n            ],\n            [\n                'div',\n                {\n                    style: 'padding-left:1.25em'\n                },\n                ...Object.keys(target).map(key => {\n                    return [\n                        'div',\n                        {},\n                        ['span', keywordStyle, key + ': '],\n                        formatValue(target[key], false)\n                    ];\n                })\n            ]\n        ];\n    }\n    function formatValue(v, asRaw = true) {\n        if (typeof v === 'number') {\n            return ['span', numberStyle, v];\n        }\n        else if (typeof v === 'string') {\n            return ['span', stringStyle, JSON.stringify(v)];\n        }\n        else if (typeof v === 'boolean') {\n            return ['span', keywordStyle, v];\n        }\n        else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(v)) {\n            return ['object', { object: asRaw ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(v) : v }];\n        }\n        else {\n            return ['span', stringStyle, String(v)];\n        }\n    }\n    function extractKeys(instance, type) {\n        const Comp = instance.type;\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(Comp)) {\n            return;\n        }\n        const extracted = {};\n        for (const key in instance.ctx) {\n            if (isKeyOfType(Comp, key, type)) {\n                extracted[key] = instance.ctx[key];\n            }\n        }\n        return extracted;\n    }\n    function isKeyOfType(Comp, key, type) {\n        const opts = Comp[type];\n        if (((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(opts) && opts.includes(key)) ||\n            ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(opts) && key in opts)) {\n            return true;\n        }\n        if (Comp.extends && isKeyOfType(Comp.extends, key, type)) {\n            return true;\n        }\n        if (Comp.mixins && Comp.mixins.some(m => isKeyOfType(m, key, type))) {\n            return true;\n        }\n    }\n    function genRefFlag(v) {\n        if (isShallow(v)) {\n            return `ShallowRef`;\n        }\n        if (v.effect) {\n            return `ComputedRef`;\n        }\n        return `Ref`;\n    }\n    if (window.devtoolsFormatters) {\n        window.devtoolsFormatters.push(formatter);\n    }\n    else {\n        window.devtoolsFormatters = [formatter];\n    }\n}\n\nfunction withMemo(memo, render, cache, index) {\n    const cached = cache[index];\n    if (cached && isMemoSame(cached, memo)) {\n        return cached;\n    }\n    const ret = render();\n    // shallow clone\n    ret.memo = memo.slice();\n    return (cache[index] = ret);\n}\nfunction isMemoSame(cached, memo) {\n    const prev = cached.memo;\n    if (prev.length != memo.length) {\n        return false;\n    }\n    for (let i = 0; i < prev.length; i++) {\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(prev[i], memo[i])) {\n            return false;\n        }\n    }\n    // make sure to let parent block track it when returning cached\n    if (isBlockTreeEnabled > 0 && currentBlock) {\n        currentBlock.push(cached);\n    }\n    return true;\n}\n\n// Core API ------------------------------------------------------------------\nconst version = \"3.2.47\";\nconst _ssrUtils = {\n    createComponentInstance,\n    setupComponent,\n    renderComponentRoot,\n    setCurrentRenderingInstance,\n    isVNode,\n    normalizeVNode\n};\n/**\n * SSR utils for \\@vue/server-renderer. Only exposed in ssr-possible builds.\n * @internal\n */\nconst ssrUtils = (_ssrUtils );\n/**\n * @internal only exposed in compat builds\n */\nconst resolveFilter = null;\n/**\n * @internal only exposed in compat builds.\n */\nconst compatUtils = (null);\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHZ1ZS9ydW50aW1lLWNvcmUvZGlzdC9ydW50aW1lLWNvcmUuZXNtLWJ1bmRsZXIuanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFtUztBQUN5QjtBQUNrSDtBQUM1Uzs7QUFFbEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsS0FBd0M7QUFDaEQsUUFBUSxFQUFPO0FBQ2Y7QUFDQTtBQUNBLElBQUksOERBQWE7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixPQUFPLFlBQVksMENBQTBDO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsSUFBSTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSw4REFBYTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSw0QkFBNEIscUJBQXFCO0FBQ2pELCtDQUErQyxjQUFjO0FBQzdEO0FBQ0EseUJBQXlCLHlEQUF5RDtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxxREFBUTtBQUNoQjtBQUNBLGlD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QUFDQSxTQUFTLElBQXFDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixLQUFxQztBQUN4RDtBQUNBLFVBQVUsQ0FBSTtBQUNkO0FBQ0EsNkJBQTZCLDJCQUEyQjtBQUN4RDtBQUNBO0FBQ0EscUJBQXFCLEtBQXFDO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Qsa0NBQWtDLGNBQWMsUUFBUTtBQUM5RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLElBQXFDO0FBQzFDLElBQUksMERBQWE7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxtREFBTTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGFBQWE7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsYUFBYTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsa0RBQVM7QUFDbkQsU0FBUyxJQUFxQztBQUM5QyxnQkFBZ0IsNkNBQTZDO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qyx5REFBWTtBQUNuRCxxREFBcUQsTUFBTTtBQUMzRCx1REFBdUQseURBQVksUUFBUTtBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix1REFBVTtBQUM5QjtBQUNBO0FBQ0EsNEZBQTRGLE1BQU07QUFDbEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsK0NBQStDO0FBQy9FLGdCQUFnQixlQUFlLHlCQUF5QixrREFBUztBQUNqRTtBQUNBLHFDQUFxQyxxREFBUTtBQUM3QztBQUNBO0FBQ0EsK0JBQStCLHNEQUFhO0FBQzVDO0FBQ0E7QUFDQSxRQUFRLElBQWdFO0FBQ3hFO0FBQ0E7QUFDQSxTQUFTLElBQXFDO0FBQzlDO0FBQ0EsOENBQThDLHlEQUFZO0FBQzFELDJCQUEyQixlQUFlO0FBQzFDLG1CQUFtQiw4Q0FBOEMscUNBQXFDLE1BQU07QUFDNUc7QUFDQTtBQUNBLDRDQUE0QyxzREFBUyxRQUFRLGdCQUFnQixNQUFNO0FBQ25GO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qyx5REFBWTtBQUNuRDtBQUNBLDZCQUE2Qix5REFBWSxDQUFDLHFEQUFRO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qyx5REFBWSxDQUFDLHNEQUFTO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLEtBQW1CLEtBQUssdURBQVU7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsbURBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFEQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxvREFBTztBQUNmO0FBQ0E7QUFDQTtBQUNBLFFBQVEsbURBQU07QUFDZDtBQUNBLFFBQVEscURBQVE7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixhQUFhO0FBQ3BDO0FBQ0E7QUFDQSxxQkFBcUIsaURBQUk7QUFDekI7QUFDQTtBQUNBO0FBQ0EsWUFBWSxtREFBTTtBQUNsQixRQUFRLG1EQUFNLFVBQVUsc0RBQVM7QUFDakMsUUFBUSxtREFBTTtBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLElBQWdFO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDhKQUE4SjtBQUMxSztBQUNBO0FBQ0E7QUFDQSxTQUFTLElBQXFDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsS0FBcUM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLEtBQXFDO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixDQUFzQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsS0FBcUM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFlBQVk7QUFDNUI7QUFDQTtBQUNBLDhDQUE4Qyx3REFBZTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLEtBQXFDO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxPQUFPO0FBQzVEO0FBQ0Esd0JBQXdCLGlEQUFJO0FBQzVCO0FBQ0EsNkJBQTZCLDREQUFlO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsc0JBQXNCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsc0JBQXNCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFxQztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQXFDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLEtBQXFDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IscUJBQXFCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELGlEQUFJO0FBQ3RELDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsNERBQWU7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksc0RBQXNEO0FBQ2xFLFlBQVksc0RBQXNEO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxLQUFxQztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIseUJBQXlCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHFCQUFxQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGVBQWU7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSx1REFBVTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksZUFBZSxrQkFBa0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFHQUFxRyw0QkFBNEIsaUJBQWlCO0FBQ2xKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHlEQUF5RDtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHFCQUFxQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLEtBQWlEO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSw4Q0FBOEMsdUJBQXVCO0FBQ2pGLGtDQUFrQyxxREFBUTtBQUMxQyxTQUFTLElBQXFDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsSUFBcUM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IscUZBQXFGO0FBQ3pHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix5REFBeUQ7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFFBQVE7QUFDaEMscUJBQXFCLElBQXFDO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixJQUFxQztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHNCQUFzQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSx1REFBVTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLG9EQUFPO0FBQ2Y7QUFDQSxhQUFhLEtBQXFDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksb0RBQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSx5QkFBeUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxJQUFxQztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0Qyx1REFBVTtBQUN0RDtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsSUFBcUM7QUFDdkQsK0JBQStCLFlBQVk7QUFDM0M7QUFDQTtBQUNBLGNBQWMsSUFBcUM7QUFDbkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsS0FBcUMsa0NBQWtDLGNBQWMsZUFBZSxJQUFJLENBQWlCO0FBQzNKO0FBQ0E7QUFDQSxrQ0FBa0MsS0FBcUMsa0NBQWtDLGNBQWMsZUFBZSxJQUFJLENBQWlCO0FBQzNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLEtBQXFDLE1BQU0sdURBQVU7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLDZDQUE2QyxFQUFFLGtEQUFTO0FBQ3ZGLFNBQVMsS0FBcUM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsZ0VBQWU7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHNEQUFLO0FBQ2I7QUFDQSx1QkFBdUIsMERBQVc7QUFDbEM7QUFDQSxhQUFhLDJEQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLGFBQWEsb0RBQU87QUFDcEI7QUFDQSx3Q0FBd0MsMkRBQVUsT0FBTywwREFBVztBQUNwRTtBQUNBLGdCQUFnQixzREFBSztBQUNyQjtBQUNBO0FBQ0EscUJBQXFCLDJEQUFVO0FBQy9CO0FBQ0E7QUFDQSxxQkFBcUIsdURBQVU7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLEtBQXFDO0FBQ3REO0FBQ0EsU0FBUztBQUNUO0FBQ0EsYUFBYSx1REFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsNkNBQUk7QUFDckIsU0FBUyxLQUFxQztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiw2Q0FBSTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsNkNBQUk7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLHVEQUFVO0FBQ3hELHNCQUFzQix1REFBVTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDJEQUFjO0FBQ3JDLFNBQVMsSUFBcUM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxtREFBTTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIscURBQVE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdURBQVU7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDRCQUE0QjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHFEQUFRO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxzREFBSztBQUNiO0FBQ0E7QUFDQSxhQUFhLG9EQUFPO0FBQ3BCLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0EsYUFBYSxrREFBSyxXQUFXLGtEQUFLO0FBQ2xDO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxhQUFhLDBEQUFhO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixLQUFxQztBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixLQUF3QztBQUNwRSw0QkFBNEIsRUFBTTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHNEQUFLO0FBQ2xDLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0EsaUJBQWlCLEtBQXFDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELEtBQUs7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG1CQUFtQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxnQkFBZ0I7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDhNQUE4TTtBQUMxTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLG9EQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IscUJBQXFCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELEtBQUs7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZ0JBQWdCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsdURBQVUsY0FBYyxxQ0FBcUM7QUFDeEU7O0FBRUE7QUFDQTtBQUNBLFFBQVEsdURBQVU7QUFDbEIsbUJBQW1CO0FBQ25CO0FBQ0EsWUFBWTtBQUNaLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLEtBQXFDO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsS0FBcUMsY0FBYyxxREFBUSxXQUFXLHVEQUFVO0FBQ3pHLGdGQUFnRixLQUFLO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLDJCQUEyQixvREFBRztBQUM5QiwwQkFBMEIsb0RBQUc7QUFDN0IsNEJBQTRCLG9EQUFHO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlGQUFpRixRQUFRO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsWUFBWSwyQkFBMkI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUFnRTtBQUM1RTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsWUFBWSxzQ0FBc0Msb0JBQW9CO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiwyREFBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLGdCQUFnQixJQUFnRTtBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsMkRBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLGdCQUFnQixJQUFnRTtBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsVUFBVSwyQkFBMkI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9CQUFvQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixJQUFxQztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isd0JBQXdCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxvREFBTztBQUNmO0FBQ0E7QUFDQSxhQUFhLHFEQUFRO0FBQ3JCO0FBQ0E7QUFDQSxhQUFhLHFEQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxtREFBTTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLElBQXFDO0FBQy9ELDBEQUEwRCxZQUFZO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFlBQVk7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxZQUFZO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsMkNBQTJDO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsMkRBQWM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLElBQWdFO0FBQzVFO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFODJDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B2dWUvcnVudGltZS1jb3JlL2Rpc3QvcnVudGltZS1jb3JlLmVzbS1idW5kbGVyLmpzP2QyZGQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGF1c2VUcmFja2luZywgcmVzZXRUcmFja2luZywgaXNSZWYsIHRvUmF3LCBnZXRDdXJyZW50U2NvcGUsIGlzU2hhbGxvdyBhcyBpc1NoYWxsb3ckMSwgaXNSZWFjdGl2ZSwgUmVhY3RpdmVFZmZlY3QsIHJlZiwgc2hhbGxvd1JlYWRvbmx5LCB0cmFjaywgcmVhY3RpdmUsIHNoYWxsb3dSZWFjdGl2ZSwgdHJpZ2dlciwgaXNQcm94eSwgcHJveHlSZWZzLCBtYXJrUmF3LCBFZmZlY3RTY29wZSwgY29tcHV0ZWQgYXMgY29tcHV0ZWQkMSwgaXNSZWFkb25seSB9IGZyb20gJ0B2dWUvcmVhY3Rpdml0eSc7XG5leHBvcnQgeyBFZmZlY3RTY29wZSwgUmVhY3RpdmVFZmZlY3QsIGN1c3RvbVJlZiwgZWZmZWN0LCBlZmZlY3RTY29wZSwgZ2V0Q3VycmVudFNjb3BlLCBpc1Byb3h5LCBpc1JlYWN0aXZlLCBpc1JlYWRvbmx5LCBpc1JlZiwgaXNTaGFsbG93LCBtYXJrUmF3LCBvblNjb3BlRGlzcG9zZSwgcHJveHlSZWZzLCByZWFjdGl2ZSwgcmVhZG9ubHksIHJlZiwgc2hhbGxvd1JlYWN0aXZlLCBzaGFsbG93UmVhZG9ubHksIHNoYWxsb3dSZWYsIHN0b3AsIHRvUmF3LCB0b1JlZiwgdG9SZWZzLCB0cmlnZ2VyUmVmLCB1bnJlZiB9IGZyb20gJ0B2dWUvcmVhY3Rpdml0eSc7XG5pbXBvcnQgeyBpc1N0cmluZywgaXNGdW5jdGlvbiwgaXNQcm9taXNlLCBpc0FycmF5LCBOT09QLCBnZXRHbG9iYWxUaGlzLCBleHRlbmQsIEVNUFRZX09CSiwgdG9IYW5kbGVyS2V5LCBsb29zZVRvTnVtYmVyLCBoeXBoZW5hdGUsIGNhbWVsaXplLCBpc09iamVjdCwgaXNPbiwgaGFzT3duLCBpc01vZGVsTGlzdGVuZXIsIHRvTnVtYmVyLCBoYXNDaGFuZ2VkLCByZW1vdmUsIGlzU2V0LCBpc01hcCwgaXNQbGFpbk9iamVjdCwgaW52b2tlQXJyYXlGbnMsIGlzUmVnRXhwLCBpc0J1aWx0SW5EaXJlY3RpdmUsIGNhcGl0YWxpemUsIGlzR2xvYmFsbHlXaGl0ZWxpc3RlZCwgZGVmLCBpc1Jlc2VydmVkUHJvcCwgRU1QVFlfQVJSLCB0b1Jhd1R5cGUsIG1ha2VNYXAsIE5PLCBub3JtYWxpemVDbGFzcywgbm9ybWFsaXplU3R5bGUgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5leHBvcnQgeyBjYW1lbGl6ZSwgY2FwaXRhbGl6ZSwgbm9ybWFsaXplQ2xhc3MsIG5vcm1hbGl6ZVByb3BzLCBub3JtYWxpemVTdHlsZSwgdG9EaXNwbGF5U3RyaW5nLCB0b0hhbmRsZXJLZXkgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5cbmNvbnN0IHN0YWNrID0gW107XG5mdW5jdGlvbiBwdXNoV2FybmluZ0NvbnRleHQodm5vZGUpIHtcbiAgICBzdGFjay5wdXNoKHZub2RlKTtcbn1cbmZ1bmN0aW9uIHBvcFdhcm5pbmdDb250ZXh0KCkge1xuICAgIHN0YWNrLnBvcCgpO1xufVxuZnVuY3Rpb24gd2Fybihtc2csIC4uLmFyZ3MpIHtcbiAgICBpZiAoIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIC8vIGF2b2lkIHByb3BzIGZvcm1hdHRpbmcgb3Igd2FybiBoYW5kbGVyIHRyYWNraW5nIGRlcHMgdGhhdCBtaWdodCBiZSBtdXRhdGVkXG4gICAgLy8gZHVyaW5nIHBhdGNoLCBsZWFkaW5nIHRvIGluZmluaXRlIHJlY3Vyc2lvbi5cbiAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBzdGFjay5sZW5ndGggPyBzdGFja1tzdGFjay5sZW5ndGggLSAxXS5jb21wb25lbnQgOiBudWxsO1xuICAgIGNvbnN0IGFwcFdhcm5IYW5kbGVyID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcud2FybkhhbmRsZXI7XG4gICAgY29uc3QgdHJhY2UgPSBnZXRDb21wb25lbnRUcmFjZSgpO1xuICAgIGlmIChhcHBXYXJuSGFuZGxlcikge1xuICAgICAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoYXBwV2FybkhhbmRsZXIsIGluc3RhbmNlLCAxMSAvKiBFcnJvckNvZGVzLkFQUF9XQVJOX0hBTkRMRVIgKi8sIFtcbiAgICAgICAgICAgIG1zZyArIGFyZ3Muam9pbignJyksXG4gICAgICAgICAgICBpbnN0YW5jZSAmJiBpbnN0YW5jZS5wcm94eSxcbiAgICAgICAgICAgIHRyYWNlXG4gICAgICAgICAgICAgICAgLm1hcCgoeyB2bm9kZSB9KSA9PiBgYXQgPCR7Zm9ybWF0Q29tcG9uZW50TmFtZShpbnN0YW5jZSwgdm5vZGUudHlwZSl9PmApXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgdHJhY2VcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCB3YXJuQXJncyA9IFtgW1Z1ZSB3YXJuXTogJHttc2d9YCwgLi4uYXJnc107XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAodHJhY2UubGVuZ3RoICYmXG4gICAgICAgICAgICAvLyBhdm9pZCBzcGFtbWluZyBjb25zb2xlIGR1cmluZyB0ZXN0c1xuICAgICAgICAgICAgIWZhbHNlKSB7XG4gICAgICAgICAgICB3YXJuQXJncy5wdXNoKGBcXG5gLCAuLi5mb3JtYXRUcmFjZSh0cmFjZSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybiguLi53YXJuQXJncyk7XG4gICAgfVxuICAgIHJlc2V0VHJhY2tpbmcoKTtcbn1cbmZ1bmN0aW9uIGdldENvbXBvbmVudFRyYWNlKCkge1xuICAgIGxldCBjdXJyZW50Vk5vZGUgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICBpZiAoIWN1cnJlbnRWTm9kZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8vIHdlIGNhbid0IGp1c3QgdXNlIHRoZSBzdGFjayBiZWNhdXNlIGl0IHdpbGwgYmUgaW5jb21wbGV0ZSBkdXJpbmcgdXBkYXRlc1xuICAgIC8vIHRoYXQgZGlkIG5vdCBzdGFydCBmcm9tIHRoZSByb290LiBSZS1jb25zdHJ1Y3QgdGhlIHBhcmVudCBjaGFpbiB1c2luZ1xuICAgIC8vIGluc3RhbmNlIHBhcmVudCBwb2ludGVycy5cbiAgICBjb25zdCBub3JtYWxpemVkU3RhY2sgPSBbXTtcbiAgICB3aGlsZSAoY3VycmVudFZOb2RlKSB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSBub3JtYWxpemVkU3RhY2tbMF07XG4gICAgICAgIGlmIChsYXN0ICYmIGxhc3Qudm5vZGUgPT09IGN1cnJlbnRWTm9kZSkge1xuICAgICAgICAgICAgbGFzdC5yZWN1cnNlQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRTdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICB2bm9kZTogY3VycmVudFZOb2RlLFxuICAgICAgICAgICAgICAgIHJlY3Vyc2VDb3VudDogMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyZW50SW5zdGFuY2UgPSBjdXJyZW50Vk5vZGUuY29tcG9uZW50ICYmIGN1cnJlbnRWTm9kZS5jb21wb25lbnQucGFyZW50O1xuICAgICAgICBjdXJyZW50Vk5vZGUgPSBwYXJlbnRJbnN0YW5jZSAmJiBwYXJlbnRJbnN0YW5jZS52bm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRTdGFjaztcbn1cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBmb3JtYXRUcmFjZSh0cmFjZSkge1xuICAgIGNvbnN0IGxvZ3MgPSBbXTtcbiAgICB0cmFjZS5mb3JFYWNoKChlbnRyeSwgaSkgPT4ge1xuICAgICAgICBsb2dzLnB1c2goLi4uKGkgPT09IDAgPyBbXSA6IFtgXFxuYF0pLCAuLi5mb3JtYXRUcmFjZUVudHJ5KGVudHJ5KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGxvZ3M7XG59XG5mdW5jdGlvbiBmb3JtYXRUcmFjZUVudHJ5KHsgdm5vZGUsIHJlY3Vyc2VDb3VudCB9KSB7XG4gICAgY29uc3QgcG9zdGZpeCA9IHJlY3Vyc2VDb3VudCA+IDAgPyBgLi4uICgke3JlY3Vyc2VDb3VudH0gcmVjdXJzaXZlIGNhbGxzKWAgOiBgYDtcbiAgICBjb25zdCBpc1Jvb3QgPSB2bm9kZS5jb21wb25lbnQgPyB2bm9kZS5jb21wb25lbnQucGFyZW50ID09IG51bGwgOiBmYWxzZTtcbiAgICBjb25zdCBvcGVuID0gYCBhdCA8JHtmb3JtYXRDb21wb25lbnROYW1lKHZub2RlLmNvbXBvbmVudCwgdm5vZGUudHlwZSwgaXNSb290KX1gO1xuICAgIGNvbnN0IGNsb3NlID0gYD5gICsgcG9zdGZpeDtcbiAgICByZXR1cm4gdm5vZGUucHJvcHNcbiAgICAgICAgPyBbb3BlbiwgLi4uZm9ybWF0UHJvcHModm5vZGUucHJvcHMpLCBjbG9zZV1cbiAgICAgICAgOiBbb3BlbiArIGNsb3NlXTtcbn1cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBmb3JtYXRQcm9wcyhwcm9wcykge1xuICAgIGNvbnN0IHJlcyA9IFtdO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gICAga2V5cy5zbGljZSgwLCAzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHJlcy5wdXNoKC4uLmZvcm1hdFByb3Aoa2V5LCBwcm9wc1trZXldKSk7XG4gICAgfSk7XG4gICAgaWYgKGtleXMubGVuZ3RoID4gMykge1xuICAgICAgICByZXMucHVzaChgIC4uLmApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGZvcm1hdFByb3Aoa2V5LCB2YWx1ZSwgcmF3KSB7XG4gICAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09JHt2YWx1ZX1gXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fFxuICAgICAgICB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiByYXcgPyB2YWx1ZSA6IFtgJHtrZXl9PSR7dmFsdWV9YF07XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzUmVmKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IGZvcm1hdFByb3Aoa2V5LCB0b1Jhdyh2YWx1ZS52YWx1ZSksIHRydWUpO1xuICAgICAgICByZXR1cm4gcmF3ID8gdmFsdWUgOiBbYCR7a2V5fT1SZWY8YCwgdmFsdWUsIGA+YF07XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBbYCR7a2V5fT1mbiR7dmFsdWUubmFtZSA/IGA8JHt2YWx1ZS5uYW1lfT5gIDogYGB9YF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHRvUmF3KHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09YCwgdmFsdWVdO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE51bWJlcih2YWwsIHR5cGUpIHtcbiAgICBpZiAoIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHdhcm4oYCR7dHlwZX0gaXMgbm90IGEgdmFsaWQgbnVtYmVyIC0gYCArIGBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWwpfS5gKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNOYU4odmFsKSkge1xuICAgICAgICB3YXJuKGAke3R5cGV9IGlzIE5hTiAtIGAgKyAndGhlIGR1cmF0aW9uIGV4cHJlc3Npb24gbWlnaHQgYmUgaW5jb3JyZWN0LicpO1xuICAgIH1cbn1cblxuY29uc3QgRXJyb3JUeXBlU3RyaW5ncyA9IHtcbiAgICBbXCJzcFwiIC8qIExpZmVjeWNsZUhvb2tzLlNFUlZFUl9QUkVGRVRDSCAqL106ICdzZXJ2ZXJQcmVmZXRjaCBob29rJyxcbiAgICBbXCJiY1wiIC8qIExpZmVjeWNsZUhvb2tzLkJFRk9SRV9DUkVBVEUgKi9dOiAnYmVmb3JlQ3JlYXRlIGhvb2snLFxuICAgIFtcImNcIiAvKiBMaWZlY3ljbGVIb29rcy5DUkVBVEVEICovXTogJ2NyZWF0ZWQgaG9vaycsXG4gICAgW1wiYm1cIiAvKiBMaWZlY3ljbGVIb29rcy5CRUZPUkVfTU9VTlQgKi9dOiAnYmVmb3JlTW91bnQgaG9vaycsXG4gICAgW1wibVwiIC8qIExpZmVjeWNsZUhvb2tzLk1PVU5URUQgKi9dOiAnbW91bnRlZCBob29rJyxcbiAgICBbXCJidVwiIC8qIExpZmVjeWNsZUhvb2tzLkJFRk9SRV9VUERBVEUgKi9dOiAnYmVmb3JlVXBkYXRlIGhvb2snLFxuICAgIFtcInVcIiAvKiBMaWZlY3ljbGVIb29rcy5VUERBVEVEICovXTogJ3VwZGF0ZWQnLFxuICAgIFtcImJ1bVwiIC8qIExpZmVjeWNsZUhvb2tzLkJFRk9SRV9VTk1PVU5UICovXTogJ2JlZm9yZVVubW91bnQgaG9vaycsXG4gICAgW1widW1cIiAvKiBMaWZlY3ljbGVIb29rcy5VTk1PVU5URUQgKi9dOiAndW5tb3VudGVkIGhvb2snLFxuICAgIFtcImFcIiAvKiBMaWZlY3ljbGVIb29rcy5BQ1RJVkFURUQgKi9dOiAnYWN0aXZhdGVkIGhvb2snLFxuICAgIFtcImRhXCIgLyogTGlmZWN5Y2xlSG9va3MuREVBQ1RJVkFURUQgKi9dOiAnZGVhY3RpdmF0ZWQgaG9vaycsXG4gICAgW1wiZWNcIiAvKiBMaWZlY3ljbGVIb29rcy5FUlJPUl9DQVBUVVJFRCAqL106ICdlcnJvckNhcHR1cmVkIGhvb2snLFxuICAgIFtcInJ0Y1wiIC8qIExpZmVjeWNsZUhvb2tzLlJFTkRFUl9UUkFDS0VEICovXTogJ3JlbmRlclRyYWNrZWQgaG9vaycsXG4gICAgW1wicnRnXCIgLyogTGlmZWN5Y2xlSG9va3MuUkVOREVSX1RSSUdHRVJFRCAqL106ICdyZW5kZXJUcmlnZ2VyZWQgaG9vaycsXG4gICAgWzAgLyogRXJyb3JDb2Rlcy5TRVRVUF9GVU5DVElPTiAqL106ICdzZXR1cCBmdW5jdGlvbicsXG4gICAgWzEgLyogRXJyb3JDb2Rlcy5SRU5ERVJfRlVOQ1RJT04gKi9dOiAncmVuZGVyIGZ1bmN0aW9uJyxcbiAgICBbMiAvKiBFcnJvckNvZGVzLldBVENIX0dFVFRFUiAqL106ICd3YXRjaGVyIGdldHRlcicsXG4gICAgWzMgLyogRXJyb3JDb2Rlcy5XQVRDSF9DQUxMQkFDSyAqL106ICd3YXRjaGVyIGNhbGxiYWNrJyxcbiAgICBbNCAvKiBFcnJvckNvZGVzLldBVENIX0NMRUFOVVAgKi9dOiAnd2F0Y2hlciBjbGVhbnVwIGZ1bmN0aW9uJyxcbiAgICBbNSAvKiBFcnJvckNvZGVzLk5BVElWRV9FVkVOVF9IQU5ETEVSICovXTogJ25hdGl2ZSBldmVudCBoYW5kbGVyJyxcbiAgICBbNiAvKiBFcnJvckNvZGVzLkNPTVBPTkVOVF9FVkVOVF9IQU5ETEVSICovXTogJ2NvbXBvbmVudCBldmVudCBoYW5kbGVyJyxcbiAgICBbNyAvKiBFcnJvckNvZGVzLlZOT0RFX0hPT0sgKi9dOiAndm5vZGUgaG9vaycsXG4gICAgWzggLyogRXJyb3JDb2Rlcy5ESVJFQ1RJVkVfSE9PSyAqL106ICdkaXJlY3RpdmUgaG9vaycsXG4gICAgWzkgLyogRXJyb3JDb2Rlcy5UUkFOU0lUSU9OX0hPT0sgKi9dOiAndHJhbnNpdGlvbiBob29rJyxcbiAgICBbMTAgLyogRXJyb3JDb2Rlcy5BUFBfRVJST1JfSEFORExFUiAqL106ICdhcHAgZXJyb3JIYW5kbGVyJyxcbiAgICBbMTEgLyogRXJyb3JDb2Rlcy5BUFBfV0FSTl9IQU5ETEVSICovXTogJ2FwcCB3YXJuSGFuZGxlcicsXG4gICAgWzEyIC8qIEVycm9yQ29kZXMuRlVOQ1RJT05fUkVGICovXTogJ3JlZiBmdW5jdGlvbicsXG4gICAgWzEzIC8qIEVycm9yQ29kZXMuQVNZTkNfQ09NUE9ORU5UX0xPQURFUiAqL106ICdhc3luYyBjb21wb25lbnQgbG9hZGVyJyxcbiAgICBbMTQgLyogRXJyb3JDb2Rlcy5TQ0hFRFVMRVIgKi9dOiAnc2NoZWR1bGVyIGZsdXNoLiBUaGlzIGlzIGxpa2VseSBhIFZ1ZSBpbnRlcm5hbHMgYnVnLiAnICtcbiAgICAgICAgJ1BsZWFzZSBvcGVuIGFuIGlzc3VlIGF0IGh0dHBzOi8vbmV3LWlzc3VlLnZ1ZWpzLm9yZy8/cmVwbz12dWVqcy9jb3JlJ1xufTtcbmZ1bmN0aW9uIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpIHtcbiAgICBsZXQgcmVzO1xuICAgIHRyeSB7XG4gICAgICAgIHJlcyA9IGFyZ3MgPyBmbiguLi5hcmdzKSA6IGZuKCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyLCBpbnN0YW5jZSwgdHlwZSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihmbikpIHtcbiAgICAgICAgY29uc3QgcmVzID0gY2FsbFdpdGhFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgdHlwZSwgYXJncyk7XG4gICAgICAgIGlmIChyZXMgJiYgaXNQcm9taXNlKHJlcykpIHtcbiAgICAgICAgICAgIHJlcy5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIHR5cGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZXMucHVzaChjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhmbltpXSwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbn1cbmZ1bmN0aW9uIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIHR5cGUsIHRocm93SW5EZXYgPSB0cnVlKSB7XG4gICAgY29uc3QgY29udGV4dFZOb2RlID0gaW5zdGFuY2UgPyBpbnN0YW5jZS52bm9kZSA6IG51bGw7XG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIGxldCBjdXIgPSBpbnN0YW5jZS5wYXJlbnQ7XG4gICAgICAgIC8vIHRoZSBleHBvc2VkIGluc3RhbmNlIGlzIHRoZSByZW5kZXIgcHJveHkgdG8ga2VlcCBpdCBjb25zaXN0ZW50IHdpdGggMi54XG4gICAgICAgIGNvbnN0IGV4cG9zZWRJbnN0YW5jZSA9IGluc3RhbmNlLnByb3h5O1xuICAgICAgICAvLyBpbiBwcm9kdWN0aW9uIHRoZSBob29rIHJlY2VpdmVzIG9ubHkgdGhlIGVycm9yIGNvZGVcbiAgICAgICAgY29uc3QgZXJyb3JJbmZvID0gKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gRXJyb3JUeXBlU3RyaW5nc1t0eXBlXSA6IHR5cGU7XG4gICAgICAgIHdoaWxlIChjdXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yQ2FwdHVyZWRIb29rcyA9IGN1ci5lYztcbiAgICAgICAgICAgIGlmIChlcnJvckNhcHR1cmVkSG9va3MpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9yQ2FwdHVyZWRIb29rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JDYXB0dXJlZEhvb2tzW2ldKGVyciwgZXhwb3NlZEluc3RhbmNlLCBlcnJvckluZm8pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyID0gY3VyLnBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICAvLyBhcHAtbGV2ZWwgaGFuZGxpbmdcbiAgICAgICAgY29uc3QgYXBwRXJyb3JIYW5kbGVyID0gaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcuZXJyb3JIYW5kbGVyO1xuICAgICAgICBpZiAoYXBwRXJyb3JIYW5kbGVyKSB7XG4gICAgICAgICAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoYXBwRXJyb3JIYW5kbGVyLCBudWxsLCAxMCAvKiBFcnJvckNvZGVzLkFQUF9FUlJPUl9IQU5ETEVSICovLCBbZXJyLCBleHBvc2VkSW5zdGFuY2UsIGVycm9ySW5mb10pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxvZ0Vycm9yKGVyciwgdHlwZSwgY29udGV4dFZOb2RlLCB0aHJvd0luRGV2KTtcbn1cbmZ1bmN0aW9uIGxvZ0Vycm9yKGVyciwgdHlwZSwgY29udGV4dFZOb2RlLCB0aHJvd0luRGV2ID0gdHJ1ZSkge1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgY29uc3QgaW5mbyA9IEVycm9yVHlwZVN0cmluZ3NbdHlwZV07XG4gICAgICAgIGlmIChjb250ZXh0Vk5vZGUpIHtcbiAgICAgICAgICAgIHB1c2hXYXJuaW5nQ29udGV4dChjb250ZXh0Vk5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHdhcm4oYFVuaGFuZGxlZCBlcnJvciR7aW5mbyA/IGAgZHVyaW5nIGV4ZWN1dGlvbiBvZiAke2luZm99YCA6IGBgfWApO1xuICAgICAgICBpZiAoY29udGV4dFZOb2RlKSB7XG4gICAgICAgICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNyYXNoIGluIGRldiBieSBkZWZhdWx0IHNvIGl0J3MgbW9yZSBub3RpY2VhYmxlXG4gICAgICAgIGlmICh0aHJvd0luRGV2KSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIHJlY292ZXIgaW4gcHJvZCB0byByZWR1Y2UgdGhlIGltcGFjdCBvbiBlbmQtdXNlclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfVxufVxuXG5sZXQgaXNGbHVzaGluZyA9IGZhbHNlO1xubGV0IGlzRmx1c2hQZW5kaW5nID0gZmFsc2U7XG5jb25zdCBxdWV1ZSA9IFtdO1xubGV0IGZsdXNoSW5kZXggPSAwO1xuY29uc3QgcGVuZGluZ1Bvc3RGbHVzaENicyA9IFtdO1xubGV0IGFjdGl2ZVBvc3RGbHVzaENicyA9IG51bGw7XG5sZXQgcG9zdEZsdXNoSW5kZXggPSAwO1xuY29uc3QgcmVzb2x2ZWRQcm9taXNlID0gLyojX19QVVJFX18qLyBQcm9taXNlLnJlc29sdmUoKTtcbmxldCBjdXJyZW50Rmx1c2hQcm9taXNlID0gbnVsbDtcbmNvbnN0IFJFQ1VSU0lPTl9MSU1JVCA9IDEwMDtcbmZ1bmN0aW9uIG5leHRUaWNrKGZuKSB7XG4gICAgY29uc3QgcCA9IGN1cnJlbnRGbHVzaFByb21pc2UgfHwgcmVzb2x2ZWRQcm9taXNlO1xuICAgIHJldHVybiBmbiA/IHAudGhlbih0aGlzID8gZm4uYmluZCh0aGlzKSA6IGZuKSA6IHA7XG59XG4vLyAjMjc2OFxuLy8gVXNlIGJpbmFyeS1zZWFyY2ggdG8gZmluZCBhIHN1aXRhYmxlIHBvc2l0aW9uIGluIHRoZSBxdWV1ZSxcbi8vIHNvIHRoYXQgdGhlIHF1ZXVlIG1haW50YWlucyB0aGUgaW5jcmVhc2luZyBvcmRlciBvZiBqb2IncyBpZCxcbi8vIHdoaWNoIGNhbiBwcmV2ZW50IHRoZSBqb2IgZnJvbSBiZWluZyBza2lwcGVkIGFuZCBhbHNvIGNhbiBhdm9pZCByZXBlYXRlZCBwYXRjaGluZy5cbmZ1bmN0aW9uIGZpbmRJbnNlcnRpb25JbmRleChpZCkge1xuICAgIC8vIHRoZSBzdGFydCBpbmRleCBzaG91bGQgYmUgYGZsdXNoSW5kZXggKyAxYFxuICAgIGxldCBzdGFydCA9IGZsdXNoSW5kZXggKyAxO1xuICAgIGxldCBlbmQgPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7XG4gICAgICAgIGNvbnN0IG1pZGRsZSA9IChzdGFydCArIGVuZCkgPj4+IDE7XG4gICAgICAgIGNvbnN0IG1pZGRsZUpvYklkID0gZ2V0SWQocXVldWVbbWlkZGxlXSk7XG4gICAgICAgIG1pZGRsZUpvYklkIDwgaWQgPyAoc3RhcnQgPSBtaWRkbGUgKyAxKSA6IChlbmQgPSBtaWRkbGUpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhcnQ7XG59XG5mdW5jdGlvbiBxdWV1ZUpvYihqb2IpIHtcbiAgICAvLyB0aGUgZGVkdXBlIHNlYXJjaCB1c2VzIHRoZSBzdGFydEluZGV4IGFyZ3VtZW50IG9mIEFycmF5LmluY2x1ZGVzKClcbiAgICAvLyBieSBkZWZhdWx0IHRoZSBzZWFyY2ggaW5kZXggaW5jbHVkZXMgdGhlIGN1cnJlbnQgam9iIHRoYXQgaXMgYmVpbmcgcnVuXG4gICAgLy8gc28gaXQgY2Fubm90IHJlY3Vyc2l2ZWx5IHRyaWdnZXIgaXRzZWxmIGFnYWluLlxuICAgIC8vIGlmIHRoZSBqb2IgaXMgYSB3YXRjaCgpIGNhbGxiYWNrLCB0aGUgc2VhcmNoIHdpbGwgc3RhcnQgd2l0aCBhICsxIGluZGV4IHRvXG4gICAgLy8gYWxsb3cgaXQgcmVjdXJzaXZlbHkgdHJpZ2dlciBpdHNlbGYgLSBpdCBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvXG4gICAgLy8gZW5zdXJlIGl0IGRvZXNuJ3QgZW5kIHVwIGluIGFuIGluZmluaXRlIGxvb3AuXG4gICAgaWYgKCFxdWV1ZS5sZW5ndGggfHxcbiAgICAgICAgIXF1ZXVlLmluY2x1ZGVzKGpvYiwgaXNGbHVzaGluZyAmJiBqb2IuYWxsb3dSZWN1cnNlID8gZmx1c2hJbmRleCArIDEgOiBmbHVzaEluZGV4KSkge1xuICAgICAgICBpZiAoam9iLmlkID09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goam9iKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHF1ZXVlLnNwbGljZShmaW5kSW5zZXJ0aW9uSW5kZXgoam9iLmlkKSwgMCwgam9iKTtcbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUZsdXNoKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gcXVldWVGbHVzaCgpIHtcbiAgICBpZiAoIWlzRmx1c2hpbmcgJiYgIWlzRmx1c2hQZW5kaW5nKSB7XG4gICAgICAgIGlzRmx1c2hQZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgY3VycmVudEZsdXNoUHJvbWlzZSA9IHJlc29sdmVkUHJvbWlzZS50aGVuKGZsdXNoSm9icyk7XG4gICAgfVxufVxuZnVuY3Rpb24gaW52YWxpZGF0ZUpvYihqb2IpIHtcbiAgICBjb25zdCBpID0gcXVldWUuaW5kZXhPZihqb2IpO1xuICAgIGlmIChpID4gZmx1c2hJbmRleCkge1xuICAgICAgICBxdWV1ZS5zcGxpY2UoaSwgMSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcXVldWVQb3N0Rmx1c2hDYihjYikge1xuICAgIGlmICghaXNBcnJheShjYikpIHtcbiAgICAgICAgaWYgKCFhY3RpdmVQb3N0Rmx1c2hDYnMgfHxcbiAgICAgICAgICAgICFhY3RpdmVQb3N0Rmx1c2hDYnMuaW5jbHVkZXMoY2IsIGNiLmFsbG93UmVjdXJzZSA/IHBvc3RGbHVzaEluZGV4ICsgMSA6IHBvc3RGbHVzaEluZGV4KSkge1xuICAgICAgICAgICAgcGVuZGluZ1Bvc3RGbHVzaENicy5wdXNoKGNiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gaWYgY2IgaXMgYW4gYXJyYXksIGl0IGlzIGEgY29tcG9uZW50IGxpZmVjeWNsZSBob29rIHdoaWNoIGNhbiBvbmx5IGJlXG4gICAgICAgIC8vIHRyaWdnZXJlZCBieSBhIGpvYiwgd2hpY2ggaXMgYWxyZWFkeSBkZWR1cGVkIGluIHRoZSBtYWluIHF1ZXVlLCBzb1xuICAgICAgICAvLyB3ZSBjYW4gc2tpcCBkdXBsaWNhdGUgY2hlY2sgaGVyZSB0byBpbXByb3ZlIHBlcmZcbiAgICAgICAgcGVuZGluZ1Bvc3RGbHVzaENicy5wdXNoKC4uLmNiKTtcbiAgICB9XG4gICAgcXVldWVGbHVzaCgpO1xufVxuZnVuY3Rpb24gZmx1c2hQcmVGbHVzaENicyhzZWVuLCBcbi8vIGlmIGN1cnJlbnRseSBmbHVzaGluZywgc2tpcCB0aGUgY3VycmVudCBqb2IgaXRzZWxmXG5pID0gaXNGbHVzaGluZyA/IGZsdXNoSW5kZXggKyAxIDogMCkge1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgc2VlbiA9IHNlZW4gfHwgbmV3IE1hcCgpO1xuICAgIH1cbiAgICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNiID0gcXVldWVbaV07XG4gICAgICAgIGlmIChjYiAmJiBjYi5wcmUpIHtcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGNiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVldWUuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGZsdXNoUG9zdEZsdXNoQ2JzKHNlZW4pIHtcbiAgICBpZiAocGVuZGluZ1Bvc3RGbHVzaENicy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZGVkdXBlZCA9IFsuLi5uZXcgU2V0KHBlbmRpbmdQb3N0Rmx1c2hDYnMpXTtcbiAgICAgICAgcGVuZGluZ1Bvc3RGbHVzaENicy5sZW5ndGggPSAwO1xuICAgICAgICAvLyAjMTk0NyBhbHJlYWR5IGhhcyBhY3RpdmUgcXVldWUsIG5lc3RlZCBmbHVzaFBvc3RGbHVzaENicyBjYWxsXG4gICAgICAgIGlmIChhY3RpdmVQb3N0Rmx1c2hDYnMpIHtcbiAgICAgICAgICAgIGFjdGl2ZVBvc3RGbHVzaENicy5wdXNoKC4uLmRlZHVwZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGFjdGl2ZVBvc3RGbHVzaENicyA9IGRlZHVwZWQ7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgIHNlZW4gPSBzZWVuIHx8IG5ldyBNYXAoKTtcbiAgICAgICAgfVxuICAgICAgICBhY3RpdmVQb3N0Rmx1c2hDYnMuc29ydCgoYSwgYikgPT4gZ2V0SWQoYSkgLSBnZXRJZChiKSk7XG4gICAgICAgIGZvciAocG9zdEZsdXNoSW5kZXggPSAwOyBwb3N0Rmx1c2hJbmRleCA8IGFjdGl2ZVBvc3RGbHVzaENicy5sZW5ndGg7IHBvc3RGbHVzaEluZGV4KyspIHtcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiZcbiAgICAgICAgICAgICAgICBjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMoc2VlbiwgYWN0aXZlUG9zdEZsdXNoQ2JzW3Bvc3RGbHVzaEluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjdGl2ZVBvc3RGbHVzaENic1twb3N0Rmx1c2hJbmRleF0oKTtcbiAgICAgICAgfVxuICAgICAgICBhY3RpdmVQb3N0Rmx1c2hDYnMgPSBudWxsO1xuICAgICAgICBwb3N0Rmx1c2hJbmRleCA9IDA7XG4gICAgfVxufVxuY29uc3QgZ2V0SWQgPSAoam9iKSA9PiBqb2IuaWQgPT0gbnVsbCA/IEluZmluaXR5IDogam9iLmlkO1xuY29uc3QgY29tcGFyYXRvciA9IChhLCBiKSA9PiB7XG4gICAgY29uc3QgZGlmZiA9IGdldElkKGEpIC0gZ2V0SWQoYik7XG4gICAgaWYgKGRpZmYgPT09IDApIHtcbiAgICAgICAgaWYgKGEucHJlICYmICFiLnByZSlcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgaWYgKGIucHJlICYmICFhLnByZSlcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gZGlmZjtcbn07XG5mdW5jdGlvbiBmbHVzaEpvYnMoc2Vlbikge1xuICAgIGlzRmx1c2hQZW5kaW5nID0gZmFsc2U7XG4gICAgaXNGbHVzaGluZyA9IHRydWU7XG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICBzZWVuID0gc2VlbiB8fCBuZXcgTWFwKCk7XG4gICAgfVxuICAgIC8vIFNvcnQgcXVldWUgYmVmb3JlIGZsdXNoLlxuICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0OlxuICAgIC8vIDEuIENvbXBvbmVudHMgYXJlIHVwZGF0ZWQgZnJvbSBwYXJlbnQgdG8gY2hpbGQuIChiZWNhdXNlIHBhcmVudCBpcyBhbHdheXNcbiAgICAvLyAgICBjcmVhdGVkIGJlZm9yZSB0aGUgY2hpbGQgc28gaXRzIHJlbmRlciBlZmZlY3Qgd2lsbCBoYXZlIHNtYWxsZXJcbiAgICAvLyAgICBwcmlvcml0eSBudW1iZXIpXG4gICAgLy8gMi4gSWYgYSBjb21wb25lbnQgaXMgdW5tb3VudGVkIGR1cmluZyBhIHBhcmVudCBjb21wb25lbnQncyB1cGRhdGUsXG4gICAgLy8gICAgaXRzIHVwZGF0ZSBjYW4gYmUgc2tpcHBlZC5cbiAgICBxdWV1ZS5zb3J0KGNvbXBhcmF0b3IpO1xuICAgIC8vIGNvbmRpdGlvbmFsIHVzYWdlIG9mIGNoZWNrUmVjdXJzaXZlVXBkYXRlIG11c3QgYmUgZGV0ZXJtaW5lZCBvdXQgb2ZcbiAgICAvLyB0cnkgLi4uIGNhdGNoIGJsb2NrIHNpbmNlIFJvbGx1cCBieSBkZWZhdWx0IGRlLW9wdGltaXplcyB0cmVlc2hha2luZ1xuICAgIC8vIGluc2lkZSB0cnktY2F0Y2guIFRoaXMgY2FuIGxlYXZlIGFsbCB3YXJuaW5nIGNvZGUgdW5zaGFrZWQuIEFsdGhvdWdoXG4gICAgLy8gdGhleSB3b3VsZCBnZXQgZXZlbnR1YWxseSBzaGFrZW4gYnkgYSBtaW5pZmllciBsaWtlIHRlcnNlciwgc29tZSBtaW5pZmllcnNcbiAgICAvLyB3b3VsZCBmYWlsIHRvIGRvIHRoYXQgKGUuZy4gaHR0cHM6Ly9naXRodWIuY29tL2V2YW53L2VzYnVpbGQvaXNzdWVzLzE2MTApXG4gICAgY29uc3QgY2hlY2sgPSAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJylcbiAgICAgICAgPyAoam9iKSA9PiBjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMoc2Vlbiwgam9iKVxuICAgICAgICA6IE5PT1A7XG4gICAgdHJ5IHtcbiAgICAgICAgZm9yIChmbHVzaEluZGV4ID0gMDsgZmx1c2hJbmRleCA8IHF1ZXVlLmxlbmd0aDsgZmx1c2hJbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBqb2IgPSBxdWV1ZVtmbHVzaEluZGV4XTtcbiAgICAgICAgICAgIGlmIChqb2IgJiYgam9iLmFjdGl2ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIGNoZWNrKGpvYikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBydW5uaW5nOmAsIGpvYi5pZClcbiAgICAgICAgICAgICAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoam9iLCBudWxsLCAxNCAvKiBFcnJvckNvZGVzLlNDSEVEVUxFUiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIGZsdXNoSW5kZXggPSAwO1xuICAgICAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICBmbHVzaFBvc3RGbHVzaENicyhzZWVuKTtcbiAgICAgICAgaXNGbHVzaGluZyA9IGZhbHNlO1xuICAgICAgICBjdXJyZW50Rmx1c2hQcm9taXNlID0gbnVsbDtcbiAgICAgICAgLy8gc29tZSBwb3N0Rmx1c2hDYiBxdWV1ZWQgam9icyFcbiAgICAgICAgLy8ga2VlcCBmbHVzaGluZyB1bnRpbCBpdCBkcmFpbnMuXG4gICAgICAgIGlmIChxdWV1ZS5sZW5ndGggfHwgcGVuZGluZ1Bvc3RGbHVzaENicy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZsdXNoSm9icyhzZWVuKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlVXBkYXRlcyhzZWVuLCBmbikge1xuICAgIGlmICghc2Vlbi5oYXMoZm4pKSB7XG4gICAgICAgIHNlZW4uc2V0KGZuLCAxKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gc2Vlbi5nZXQoZm4pO1xuICAgICAgICBpZiAoY291bnQgPiBSRUNVUlNJT05fTElNSVQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gZm4ub3duZXJJbnN0YW5jZTtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBpbnN0YW5jZSAmJiBnZXRDb21wb25lbnROYW1lKGluc3RhbmNlLnR5cGUpO1xuICAgICAgICAgICAgd2FybihgTWF4aW11bSByZWN1cnNpdmUgdXBkYXRlcyBleGNlZWRlZCR7Y29tcG9uZW50TmFtZSA/IGAgaW4gY29tcG9uZW50IDwke2NvbXBvbmVudE5hbWV9PmAgOiBgYH0uIGAgK1xuICAgICAgICAgICAgICAgIGBUaGlzIG1lYW5zIHlvdSBoYXZlIGEgcmVhY3RpdmUgZWZmZWN0IHRoYXQgaXMgbXV0YXRpbmcgaXRzIG93biBgICtcbiAgICAgICAgICAgICAgICBgZGVwZW5kZW5jaWVzIGFuZCB0aHVzIHJlY3Vyc2l2ZWx5IHRyaWdnZXJpbmcgaXRzZWxmLiBQb3NzaWJsZSBzb3VyY2VzIGAgK1xuICAgICAgICAgICAgICAgIGBpbmNsdWRlIGNvbXBvbmVudCB0ZW1wbGF0ZSwgcmVuZGVyIGZ1bmN0aW9uLCB1cGRhdGVkIGhvb2sgb3IgYCArXG4gICAgICAgICAgICAgICAgYHdhdGNoZXIgc291cmNlIGZ1bmN0aW9uLmApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZWVuLnNldChmbiwgY291bnQgKyAxKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzICovXG5sZXQgaXNIbXJVcGRhdGluZyA9IGZhbHNlO1xuY29uc3QgaG1yRGlydHlDb21wb25lbnRzID0gbmV3IFNldCgpO1xuLy8gRXhwb3NlIHRoZSBITVIgcnVudGltZSBvbiB0aGUgZ2xvYmFsIG9iamVjdFxuLy8gVGhpcyBtYWtlcyBpdCBlbnRpcmVseSB0cmVlLXNoYWthYmxlIHdpdGhvdXQgcG9sbHV0aW5nIHRoZSBleHBvcnRzIGFuZCBtYWtlc1xuLy8gaXQgZWFzaWVyIHRvIGJlIHVzZWQgaW4gdG9vbGluZ3MgbGlrZSB2dWUtbG9hZGVyXG4vLyBOb3RlOiBmb3IgYSBjb21wb25lbnQgdG8gYmUgZWxpZ2libGUgZm9yIEhNUiBpdCBhbHNvIG5lZWRzIHRoZSBfX2htcklkIG9wdGlvblxuLy8gdG8gYmUgc2V0IHNvIHRoYXQgaXRzIGluc3RhbmNlcyBjYW4gYmUgcmVnaXN0ZXJlZCAvIHJlbW92ZWQuXG5pZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgZ2V0R2xvYmFsVGhpcygpLl9fVlVFX0hNUl9SVU5USU1FX18gPSB7XG4gICAgICAgIGNyZWF0ZVJlY29yZDogdHJ5V3JhcChjcmVhdGVSZWNvcmQpLFxuICAgICAgICByZXJlbmRlcjogdHJ5V3JhcChyZXJlbmRlciksXG4gICAgICAgIHJlbG9hZDogdHJ5V3JhcChyZWxvYWQpXG4gICAgfTtcbn1cbmNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIHJlZ2lzdGVySE1SKGluc3RhbmNlKSB7XG4gICAgY29uc3QgaWQgPSBpbnN0YW5jZS50eXBlLl9faG1ySWQ7XG4gICAgbGV0IHJlY29yZCA9IG1hcC5nZXQoaWQpO1xuICAgIGlmICghcmVjb3JkKSB7XG4gICAgICAgIGNyZWF0ZVJlY29yZChpZCwgaW5zdGFuY2UudHlwZSk7XG4gICAgICAgIHJlY29yZCA9IG1hcC5nZXQoaWQpO1xuICAgIH1cbiAgICByZWNvcmQuaW5zdGFuY2VzLmFkZChpbnN0YW5jZSk7XG59XG5mdW5jdGlvbiB1bnJlZ2lzdGVySE1SKGluc3RhbmNlKSB7XG4gICAgbWFwLmdldChpbnN0YW5jZS50eXBlLl9faG1ySWQpLmluc3RhbmNlcy5kZWxldGUoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gY3JlYXRlUmVjb3JkKGlkLCBpbml0aWFsRGVmKSB7XG4gICAgaWYgKG1hcC5oYXMoaWQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbWFwLnNldChpZCwge1xuICAgICAgICBpbml0aWFsRGVmOiBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbml0aWFsRGVmKSxcbiAgICAgICAgaW5zdGFuY2VzOiBuZXcgU2V0KClcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNsYXNzQ29tcG9uZW50KGNvbXBvbmVudCkge1xuICAgIHJldHVybiBpc0NsYXNzQ29tcG9uZW50KGNvbXBvbmVudCkgPyBjb21wb25lbnQuX192Y2NPcHRzIDogY29tcG9uZW50O1xufVxuZnVuY3Rpb24gcmVyZW5kZXIoaWQsIG5ld1JlbmRlcikge1xuICAgIGNvbnN0IHJlY29yZCA9IG1hcC5nZXQoaWQpO1xuICAgIGlmICghcmVjb3JkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gdXBkYXRlIGluaXRpYWwgcmVjb3JkIChmb3Igbm90LXlldC1yZW5kZXJlZCBjb21wb25lbnQpXG4gICAgcmVjb3JkLmluaXRpYWxEZWYucmVuZGVyID0gbmV3UmVuZGVyO1xuICAgIFsuLi5yZWNvcmQuaW5zdGFuY2VzXS5mb3JFYWNoKGluc3RhbmNlID0+IHtcbiAgICAgICAgaWYgKG5ld1JlbmRlcikge1xuICAgICAgICAgICAgaW5zdGFuY2UucmVuZGVyID0gbmV3UmVuZGVyO1xuICAgICAgICAgICAgbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoaW5zdGFuY2UudHlwZSkucmVuZGVyID0gbmV3UmVuZGVyO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLnJlbmRlckNhY2hlID0gW107XG4gICAgICAgIC8vIHRoaXMgZmxhZyBmb3JjZXMgY2hpbGQgY29tcG9uZW50cyB3aXRoIHNsb3QgY29udGVudCB0byB1cGRhdGVcbiAgICAgICAgaXNIbXJVcGRhdGluZyA9IHRydWU7XG4gICAgICAgIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgICBpc0htclVwZGF0aW5nID0gZmFsc2U7XG4gICAgfSk7XG59XG5mdW5jdGlvbiByZWxvYWQoaWQsIG5ld0NvbXApIHtcbiAgICBjb25zdCByZWNvcmQgPSBtYXAuZ2V0KGlkKTtcbiAgICBpZiAoIXJlY29yZClcbiAgICAgICAgcmV0dXJuO1xuICAgIG5ld0NvbXAgPSBub3JtYWxpemVDbGFzc0NvbXBvbmVudChuZXdDb21wKTtcbiAgICAvLyB1cGRhdGUgaW5pdGlhbCBkZWYgKGZvciBub3QteWV0LXJlbmRlcmVkIGNvbXBvbmVudHMpXG4gICAgdXBkYXRlQ29tcG9uZW50RGVmKHJlY29yZC5pbml0aWFsRGVmLCBuZXdDb21wKTtcbiAgICAvLyBjcmVhdGUgYSBzbmFwc2hvdCB3aGljaCBhdm9pZHMgdGhlIHNldCBiZWluZyBtdXRhdGVkIGR1cmluZyB1cGRhdGVzXG4gICAgY29uc3QgaW5zdGFuY2VzID0gWy4uLnJlY29yZC5pbnN0YW5jZXNdO1xuICAgIGZvciAoY29uc3QgaW5zdGFuY2Ugb2YgaW5zdGFuY2VzKSB7XG4gICAgICAgIGNvbnN0IG9sZENvbXAgPSBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbnN0YW5jZS50eXBlKTtcbiAgICAgICAgaWYgKCFobXJEaXJ0eUNvbXBvbmVudHMuaGFzKG9sZENvbXApKSB7XG4gICAgICAgICAgICAvLyAxLiBVcGRhdGUgZXhpc3RpbmcgY29tcCBkZWZpbml0aW9uIHRvIG1hdGNoIG5ldyBvbmVcbiAgICAgICAgICAgIGlmIChvbGRDb21wICE9PSByZWNvcmQuaW5pdGlhbERlZikge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudERlZihvbGRDb21wLCBuZXdDb21wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDIuIG1hcmsgZGVmaW5pdGlvbiBkaXJ0eS4gVGhpcyBmb3JjZXMgdGhlIHJlbmRlcmVyIHRvIHJlcGxhY2UgdGhlXG4gICAgICAgICAgICAvLyBjb21wb25lbnQgb24gcGF0Y2guXG4gICAgICAgICAgICBobXJEaXJ0eUNvbXBvbmVudHMuYWRkKG9sZENvbXApO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuIGludmFsaWRhdGUgb3B0aW9ucyByZXNvbHV0aW9uIGNhY2hlXG4gICAgICAgIGluc3RhbmNlLmFwcENvbnRleHQub3B0aW9uc0NhY2hlLmRlbGV0ZShpbnN0YW5jZS50eXBlKTtcbiAgICAgICAgLy8gNC4gYWN0dWFsbHkgdXBkYXRlXG4gICAgICAgIGlmIChpbnN0YW5jZS5jZVJlbG9hZCkge1xuICAgICAgICAgICAgLy8gY3VzdG9tIGVsZW1lbnRcbiAgICAgICAgICAgIGhtckRpcnR5Q29tcG9uZW50cy5hZGQob2xkQ29tcCk7XG4gICAgICAgICAgICBpbnN0YW5jZS5jZVJlbG9hZChuZXdDb21wLnN0eWxlcyk7XG4gICAgICAgICAgICBobXJEaXJ0eUNvbXBvbmVudHMuZGVsZXRlKG9sZENvbXApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluc3RhbmNlLnBhcmVudCkge1xuICAgICAgICAgICAgLy8gNC4gRm9yY2UgdGhlIHBhcmVudCBpbnN0YW5jZSB0byByZS1yZW5kZXIuIFRoaXMgd2lsbCBjYXVzZSBhbGwgdXBkYXRlZFxuICAgICAgICAgICAgLy8gY29tcG9uZW50cyB0byBiZSB1bm1vdW50ZWQgYW5kIHJlLW1vdW50ZWQuIFF1ZXVlIHRoZSB1cGRhdGUgc28gdGhhdCB3ZVxuICAgICAgICAgICAgLy8gZG9uJ3QgZW5kIHVwIGZvcmNpbmcgdGhlIHNhbWUgcGFyZW50IHRvIHJlLXJlbmRlciBtdWx0aXBsZSB0aW1lcy5cbiAgICAgICAgICAgIHF1ZXVlSm9iKGluc3RhbmNlLnBhcmVudC51cGRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluc3RhbmNlLmFwcENvbnRleHQucmVsb2FkKSB7XG4gICAgICAgICAgICAvLyByb290IGluc3RhbmNlIG1vdW50ZWQgdmlhIGNyZWF0ZUFwcCgpIGhhcyBhIHJlbG9hZCBtZXRob2RcbiAgICAgICAgICAgIGluc3RhbmNlLmFwcENvbnRleHQucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIHJvb3QgaW5zdGFuY2UgaW5zaWRlIHRyZWUgY3JlYXRlZCB2aWEgcmF3IHJlbmRlcigpLiBGb3JjZSByZWxvYWQuXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tITVJdIFJvb3Qgb3IgbWFudWFsbHkgbW91bnRlZCBpbnN0YW5jZSBtb2RpZmllZC4gRnVsbCByZWxvYWQgcmVxdWlyZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gNS4gbWFrZSBzdXJlIHRvIGNsZWFudXAgZGlydHkgaG1yIGNvbXBvbmVudHMgYWZ0ZXIgdXBkYXRlXG4gICAgcXVldWVQb3N0Rmx1c2hDYigoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgaW5zdGFuY2Ugb2YgaW5zdGFuY2VzKSB7XG4gICAgICAgICAgICBobXJEaXJ0eUNvbXBvbmVudHMuZGVsZXRlKG5vcm1hbGl6ZUNsYXNzQ29tcG9uZW50KGluc3RhbmNlLnR5cGUpKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50RGVmKG9sZENvbXAsIG5ld0NvbXApIHtcbiAgICBleHRlbmQob2xkQ29tcCwgbmV3Q29tcCk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2xkQ29tcCkge1xuICAgICAgICBpZiAoa2V5ICE9PSAnX19maWxlJyAmJiAhKGtleSBpbiBuZXdDb21wKSkge1xuICAgICAgICAgICAgZGVsZXRlIG9sZENvbXBba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHRyeVdyYXAoZm4pIHtcbiAgICByZXR1cm4gKGlkLCBhcmcpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBmbihpZCwgYXJnKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgW0hNUl0gU29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIFZ1ZSBjb21wb25lbnQgaG90LXJlbG9hZC4gYCArXG4gICAgICAgICAgICAgICAgYEZ1bGwgcmVsb2FkIHJlcXVpcmVkLmApO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxubGV0IGRldnRvb2xzO1xubGV0IGJ1ZmZlciA9IFtdO1xubGV0IGRldnRvb2xzTm90SW5zdGFsbGVkID0gZmFsc2U7XG5mdW5jdGlvbiBlbWl0JDEoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoZGV2dG9vbHMpIHtcbiAgICAgICAgZGV2dG9vbHMuZW1pdChldmVudCwgLi4uYXJncyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFkZXZ0b29sc05vdEluc3RhbGxlZCkge1xuICAgICAgICBidWZmZXIucHVzaCh7IGV2ZW50LCBhcmdzIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldERldnRvb2xzSG9vayhob29rLCB0YXJnZXQpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGRldnRvb2xzID0gaG9vaztcbiAgICBpZiAoZGV2dG9vbHMpIHtcbiAgICAgICAgZGV2dG9vbHMuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIGJ1ZmZlci5mb3JFYWNoKCh7IGV2ZW50LCBhcmdzIH0pID0+IGRldnRvb2xzLmVtaXQoZXZlbnQsIC4uLmFyZ3MpKTtcbiAgICAgICAgYnVmZmVyID0gW107XG4gICAgfVxuICAgIGVsc2UgaWYgKFxuICAgIC8vIGhhbmRsZSBsYXRlIGRldnRvb2xzIGluamVjdGlvbiAtIG9ubHkgZG8gdGhpcyBpZiB3ZSBhcmUgaW4gYW4gYWN0dWFsXG4gICAgLy8gYnJvd3NlciBlbnZpcm9ubWVudCB0byBhdm9pZCB0aGUgdGltZXIgaGFuZGxlIHN0YWxsaW5nIHRlc3QgcnVubmVyIGV4aXRcbiAgICAvLyAoIzQ4MTUpXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgLy8gc29tZSBlbnZzIG1vY2sgd2luZG93IGJ1dCBub3QgZnVsbHlcbiAgICAgICAgd2luZG93LkhUTUxFbGVtZW50ICYmXG4gICAgICAgIC8vIGFsc28gZXhjbHVkZSBqc2RvbVxuICAgICAgICAhKChfYiA9IChfYSA9IHdpbmRvdy5uYXZpZ2F0b3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS51c2VyQWdlbnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pbmNsdWRlcygnanNkb20nKSkpIHtcbiAgICAgICAgY29uc3QgcmVwbGF5ID0gKHRhcmdldC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fID1cbiAgICAgICAgICAgIHRhcmdldC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fIHx8IFtdKTtcbiAgICAgICAgcmVwbGF5LnB1c2goKG5ld0hvb2spID0+IHtcbiAgICAgICAgICAgIHNldERldnRvb2xzSG9vayhuZXdIb29rLCB0YXJnZXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gY2xlYXIgYnVmZmVyIGFmdGVyIDNzIC0gdGhlIHVzZXIgcHJvYmFibHkgZG9lc24ndCBoYXZlIGRldnRvb2xzIGluc3RhbGxlZFxuICAgICAgICAvLyBhdCBhbGwsIGFuZCBrZWVwaW5nIHRoZSBidWZmZXIgd2lsbCBjYXVzZSBtZW1vcnkgbGVha3MgKCM0NzM4KVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghZGV2dG9vbHMpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXyA9IG51bGw7XG4gICAgICAgICAgICAgICAgZGV2dG9vbHNOb3RJbnN0YWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAzMDAwKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIG5vbi1icm93c2VyIGVudiwgYXNzdW1lIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgZGV2dG9vbHNOb3RJbnN0YWxsZWQgPSB0cnVlO1xuICAgICAgICBidWZmZXIgPSBbXTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZXZ0b29sc0luaXRBcHAoYXBwLCB2ZXJzaW9uKSB7XG4gICAgZW1pdCQxKFwiYXBwOmluaXRcIiAvKiBEZXZ0b29sc0hvb2tzLkFQUF9JTklUICovLCBhcHAsIHZlcnNpb24sIHtcbiAgICAgICAgRnJhZ21lbnQsXG4gICAgICAgIFRleHQsXG4gICAgICAgIENvbW1lbnQsXG4gICAgICAgIFN0YXRpY1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZGV2dG9vbHNVbm1vdW50QXBwKGFwcCkge1xuICAgIGVtaXQkMShcImFwcDp1bm1vdW50XCIgLyogRGV2dG9vbHNIb29rcy5BUFBfVU5NT1VOVCAqLywgYXBwKTtcbn1cbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50QWRkZWQgPSAvKiNfX1BVUkVfXyovIGNyZWF0ZURldnRvb2xzQ29tcG9uZW50SG9vayhcImNvbXBvbmVudDphZGRlZFwiIC8qIERldnRvb2xzSG9va3MuQ09NUE9ORU5UX0FEREVEICovKTtcbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50VXBkYXRlZCA9IFxuLyojX19QVVJFX18qLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soXCJjb21wb25lbnQ6dXBkYXRlZFwiIC8qIERldnRvb2xzSG9va3MuQ09NUE9ORU5UX1VQREFURUQgKi8pO1xuY29uc3QgX2RldnRvb2xzQ29tcG9uZW50UmVtb3ZlZCA9IC8qI19fUFVSRV9fKi8gY3JlYXRlRGV2dG9vbHNDb21wb25lbnRIb29rKFwiY29tcG9uZW50OnJlbW92ZWRcIiAvKiBEZXZ0b29sc0hvb2tzLkNPTVBPTkVOVF9SRU1PVkVEICovKTtcbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50UmVtb3ZlZCA9IChjb21wb25lbnQpID0+IHtcbiAgICBpZiAoZGV2dG9vbHMgJiZcbiAgICAgICAgdHlwZW9mIGRldnRvb2xzLmNsZWFudXBCdWZmZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBjb21wb25lbnQgaWYgaXQgd2Fzbid0IGJ1ZmZlcmVkXG4gICAgICAgICFkZXZ0b29scy5jbGVhbnVwQnVmZmVyKGNvbXBvbmVudCkpIHtcbiAgICAgICAgX2RldnRvb2xzQ29tcG9uZW50UmVtb3ZlZChjb21wb25lbnQpO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soaG9vaykge1xuICAgIHJldHVybiAoY29tcG9uZW50KSA9PiB7XG4gICAgICAgIGVtaXQkMShob29rLCBjb21wb25lbnQuYXBwQ29udGV4dC5hcHAsIGNvbXBvbmVudC51aWQsIGNvbXBvbmVudC5wYXJlbnQgPyBjb21wb25lbnQucGFyZW50LnVpZCA6IHVuZGVmaW5lZCwgY29tcG9uZW50KTtcbiAgICB9O1xufVxuY29uc3QgZGV2dG9vbHNQZXJmU3RhcnQgPSAvKiNfX1BVUkVfXyovIGNyZWF0ZURldnRvb2xzUGVyZm9ybWFuY2VIb29rKFwicGVyZjpzdGFydFwiIC8qIERldnRvb2xzSG9va3MuUEVSRk9STUFOQ0VfU1RBUlQgKi8pO1xuY29uc3QgZGV2dG9vbHNQZXJmRW5kID0gLyojX19QVVJFX18qLyBjcmVhdGVEZXZ0b29sc1BlcmZvcm1hbmNlSG9vayhcInBlcmY6ZW5kXCIgLyogRGV2dG9vbHNIb29rcy5QRVJGT1JNQU5DRV9FTkQgKi8pO1xuZnVuY3Rpb24gY3JlYXRlRGV2dG9vbHNQZXJmb3JtYW5jZUhvb2soaG9vaykge1xuICAgIHJldHVybiAoY29tcG9uZW50LCB0eXBlLCB0aW1lKSA9PiB7XG4gICAgICAgIGVtaXQkMShob29rLCBjb21wb25lbnQuYXBwQ29udGV4dC5hcHAsIGNvbXBvbmVudC51aWQsIGNvbXBvbmVudCwgdHlwZSwgdGltZSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGRldnRvb2xzQ29tcG9uZW50RW1pdChjb21wb25lbnQsIGV2ZW50LCBwYXJhbXMpIHtcbiAgICBlbWl0JDEoXCJjb21wb25lbnQ6ZW1pdFwiIC8qIERldnRvb2xzSG9va3MuQ09NUE9ORU5UX0VNSVQgKi8sIGNvbXBvbmVudC5hcHBDb250ZXh0LmFwcCwgY29tcG9uZW50LCBldmVudCwgcGFyYW1zKTtcbn1cblxuZnVuY3Rpb24gZW1pdChpbnN0YW5jZSwgZXZlbnQsIC4uLnJhd0FyZ3MpIHtcbiAgICBpZiAoaW5zdGFuY2UuaXNVbm1vdW50ZWQpXG4gICAgICAgIHJldHVybjtcbiAgICBjb25zdCBwcm9wcyA9IGluc3RhbmNlLnZub2RlLnByb3BzIHx8IEVNUFRZX09CSjtcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgIGNvbnN0IHsgZW1pdHNPcHRpb25zLCBwcm9wc09wdGlvbnM6IFtwcm9wc09wdGlvbnNdIH0gPSBpbnN0YW5jZTtcbiAgICAgICAgaWYgKGVtaXRzT3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKCEoZXZlbnQgaW4gZW1pdHNPcHRpb25zKSAmJlxuICAgICAgICAgICAgICAgICEoZmFsc2UgKSkge1xuICAgICAgICAgICAgICAgIGlmICghcHJvcHNPcHRpb25zIHx8ICEodG9IYW5kbGVyS2V5KGV2ZW50KSBpbiBwcm9wc09wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm4oYENvbXBvbmVudCBlbWl0dGVkIGV2ZW50IFwiJHtldmVudH1cIiBidXQgaXQgaXMgbmVpdGhlciBkZWNsYXJlZCBpbiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGB0aGUgZW1pdHMgb3B0aW9uIG5vciBhcyBhbiBcIiR7dG9IYW5kbGVyS2V5KGV2ZW50KX1cIiBwcm9wLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGVtaXRzT3B0aW9uc1tldmVudF07XG4gICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFsaWRhdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gdmFsaWRhdG9yKC4uLnJhd0FyZ3MpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4oYEludmFsaWQgZXZlbnQgYXJndW1lbnRzOiBldmVudCB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgZXZlbnQgXCIke2V2ZW50fVwiLmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBhcmdzID0gcmF3QXJncztcbiAgICBjb25zdCBpc01vZGVsTGlzdGVuZXIgPSBldmVudC5zdGFydHNXaXRoKCd1cGRhdGU6Jyk7XG4gICAgLy8gZm9yIHYtbW9kZWwgdXBkYXRlOnh4eCBldmVudHMsIGFwcGx5IG1vZGlmaWVycyBvbiBhcmdzXG4gICAgY29uc3QgbW9kZWxBcmcgPSBpc01vZGVsTGlzdGVuZXIgJiYgZXZlbnQuc2xpY2UoNyk7XG4gICAgaWYgKG1vZGVsQXJnICYmIG1vZGVsQXJnIGluIHByb3BzKSB7XG4gICAgICAgIGNvbnN0IG1vZGlmaWVyc0tleSA9IGAke21vZGVsQXJnID09PSAnbW9kZWxWYWx1ZScgPyAnbW9kZWwnIDogbW9kZWxBcmd9TW9kaWZpZXJzYDtcbiAgICAgICAgY29uc3QgeyBudW1iZXIsIHRyaW0gfSA9IHByb3BzW21vZGlmaWVyc0tleV0gfHwgRU1QVFlfT0JKO1xuICAgICAgICBpZiAodHJpbSkge1xuICAgICAgICAgICAgYXJncyA9IHJhd0FyZ3MubWFwKGEgPT4gKGlzU3RyaW5nKGEpID8gYS50cmltKCkgOiBhKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bWJlcikge1xuICAgICAgICAgICAgYXJncyA9IHJhd0FyZ3MubWFwKGxvb3NlVG9OdW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgIGRldnRvb2xzQ29tcG9uZW50RW1pdChpbnN0YW5jZSwgZXZlbnQsIGFyZ3MpO1xuICAgIH1cbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyQ2FzZUV2ZW50ID0gZXZlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGxvd2VyQ2FzZUV2ZW50ICE9PSBldmVudCAmJiBwcm9wc1t0b0hhbmRsZXJLZXkobG93ZXJDYXNlRXZlbnQpXSkge1xuICAgICAgICAgICAgd2FybihgRXZlbnQgXCIke2xvd2VyQ2FzZUV2ZW50fVwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50IGAgK1xuICAgICAgICAgICAgICAgIGAke2Zvcm1hdENvbXBvbmVudE5hbWUoaW5zdGFuY2UsIGluc3RhbmNlLnR5cGUpfSBidXQgdGhlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBmb3IgXCIke2V2ZW50fVwiLiBgICtcbiAgICAgICAgICAgICAgICBgTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgeW91IGNhbm5vdCB1c2UgYCArXG4gICAgICAgICAgICAgICAgYHYtb24gdG8gbGlzdGVuIHRvIGNhbWVsQ2FzZSBldmVudHMgd2hlbiB1c2luZyBpbi1ET00gdGVtcGxhdGVzLiBgICtcbiAgICAgICAgICAgICAgICBgWW91IHNob3VsZCBwcm9iYWJseSB1c2UgXCIke2h5cGhlbmF0ZShldmVudCl9XCIgaW5zdGVhZCBvZiBcIiR7ZXZlbnR9XCIuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGhhbmRsZXJOYW1lO1xuICAgIGxldCBoYW5kbGVyID0gcHJvcHNbKGhhbmRsZXJOYW1lID0gdG9IYW5kbGVyS2V5KGV2ZW50KSldIHx8XG4gICAgICAgIC8vIGFsc28gdHJ5IGNhbWVsQ2FzZSBldmVudCBoYW5kbGVyICgjMjI0OSlcbiAgICAgICAgcHJvcHNbKGhhbmRsZXJOYW1lID0gdG9IYW5kbGVyS2V5KGNhbWVsaXplKGV2ZW50KSkpXTtcbiAgICAvLyBmb3Igdi1tb2RlbCB1cGRhdGU6eHh4IGV2ZW50cywgYWxzbyB0cmlnZ2VyIGtlYmFiLWNhc2UgZXF1aXZhbGVudFxuICAgIC8vIGZvciBwcm9wcyBwYXNzZWQgdmlhIGtlYmFiLWNhc2VcbiAgICBpZiAoIWhhbmRsZXIgJiYgaXNNb2RlbExpc3RlbmVyKSB7XG4gICAgICAgIGhhbmRsZXIgPSBwcm9wc1soaGFuZGxlck5hbWUgPSB0b0hhbmRsZXJLZXkoaHlwaGVuYXRlKGV2ZW50KSkpXTtcbiAgICB9XG4gICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoaGFuZGxlciwgaW5zdGFuY2UsIDYgLyogRXJyb3JDb2Rlcy5DT01QT05FTlRfRVZFTlRfSEFORExFUiAqLywgYXJncyk7XG4gICAgfVxuICAgIGNvbnN0IG9uY2VIYW5kbGVyID0gcHJvcHNbaGFuZGxlck5hbWUgKyBgT25jZWBdO1xuICAgIGlmIChvbmNlSGFuZGxlcikge1xuICAgICAgICBpZiAoIWluc3RhbmNlLmVtaXR0ZWQpIHtcbiAgICAgICAgICAgIGluc3RhbmNlLmVtaXR0ZWQgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbnN0YW5jZS5lbWl0dGVkW2hhbmRsZXJOYW1lXSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLmVtaXR0ZWRbaGFuZGxlck5hbWVdID0gdHJ1ZTtcbiAgICAgICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcob25jZUhhbmRsZXIsIGluc3RhbmNlLCA2IC8qIEVycm9yQ29kZXMuQ09NUE9ORU5UX0VWRU5UX0hBTkRMRVIgKi8sIGFyZ3MpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVtaXRzT3B0aW9ucyhjb21wLCBhcHBDb250ZXh0LCBhc01peGluID0gZmFsc2UpIHtcbiAgICBjb25zdCBjYWNoZSA9IGFwcENvbnRleHQuZW1pdHNDYWNoZTtcbiAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoY29tcCk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJhdyA9IGNvbXAuZW1pdHM7XG4gICAgbGV0IG5vcm1hbGl6ZWQgPSB7fTtcbiAgICAvLyBhcHBseSBtaXhpbi9leHRlbmRzIHByb3BzXG4gICAgbGV0IGhhc0V4dGVuZHMgPSBmYWxzZTtcbiAgICBpZiAoX19WVUVfT1BUSU9OU19BUElfXyAmJiAhaXNGdW5jdGlvbihjb21wKSkge1xuICAgICAgICBjb25zdCBleHRlbmRFbWl0cyA9IChyYXcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGcm9tRXh0ZW5kID0gbm9ybWFsaXplRW1pdHNPcHRpb25zKHJhdywgYXBwQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZEZyb21FeHRlbmQpIHtcbiAgICAgICAgICAgICAgICBoYXNFeHRlbmRzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBleHRlbmQobm9ybWFsaXplZCwgbm9ybWFsaXplZEZyb21FeHRlbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoIWFzTWl4aW4gJiYgYXBwQ29udGV4dC5taXhpbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhcHBDb250ZXh0Lm1peGlucy5mb3JFYWNoKGV4dGVuZEVtaXRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcC5leHRlbmRzKSB7XG4gICAgICAgICAgICBleHRlbmRFbWl0cyhjb21wLmV4dGVuZHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wLm1peGlucykge1xuICAgICAgICAgICAgY29tcC5taXhpbnMuZm9yRWFjaChleHRlbmRFbWl0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFyYXcgJiYgIWhhc0V4dGVuZHMpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgICAgICAgICBjYWNoZS5zZXQoY29tcCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICAgICAgcmF3LmZvckVhY2goa2V5ID0+IChub3JtYWxpemVkW2tleV0gPSBudWxsKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBleHRlbmQobm9ybWFsaXplZCwgcmF3KTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgICAgIGNhY2hlLnNldChjb21wLCBub3JtYWxpemVkKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG4vLyBDaGVjayBpZiBhbiBpbmNvbWluZyBwcm9wIGtleSBpcyBhIGRlY2xhcmVkIGVtaXQgZXZlbnQgbGlzdGVuZXIuXG4vLyBlLmcuIFdpdGggYGVtaXRzOiB7IGNsaWNrOiBudWxsIH1gLCBwcm9wcyBuYW1lZCBgb25DbGlja2AgYW5kIGBvbmNsaWNrYCBhcmVcbi8vIGJvdGggY29uc2lkZXJlZCBtYXRjaGVkIGxpc3RlbmVycy5cbmZ1bmN0aW9uIGlzRW1pdExpc3RlbmVyKG9wdGlvbnMsIGtleSkge1xuICAgIGlmICghb3B0aW9ucyB8fCAhaXNPbihrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAga2V5ID0ga2V5LnNsaWNlKDIpLnJlcGxhY2UoL09uY2UkLywgJycpO1xuICAgIHJldHVybiAoaGFzT3duKG9wdGlvbnMsIGtleVswXS50b0xvd2VyQ2FzZSgpICsga2V5LnNsaWNlKDEpKSB8fFxuICAgICAgICBoYXNPd24ob3B0aW9ucywgaHlwaGVuYXRlKGtleSkpIHx8XG4gICAgICAgIGhhc093bihvcHRpb25zLCBrZXkpKTtcbn1cblxuLyoqXG4gKiBtYXJrIHRoZSBjdXJyZW50IHJlbmRlcmluZyBpbnN0YW5jZSBmb3IgYXNzZXQgcmVzb2x1dGlvbiAoZS5nLlxuICogcmVzb2x2ZUNvbXBvbmVudCwgcmVzb2x2ZURpcmVjdGl2ZSkgZHVyaW5nIHJlbmRlclxuICovXG5sZXQgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gbnVsbDtcbmxldCBjdXJyZW50U2NvcGVJZCA9IG51bGw7XG4vKipcbiAqIE5vdGU6IHJlbmRlcmluZyBjYWxscyBtYXliZSBuZXN0ZWQuIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBwYXJlbnQgcmVuZGVyaW5nXG4gKiBpbnN0YW5jZSBpZiBwcmVzZW50LCB3aGljaCBzaG91bGQgYmUgcmVzdG9yZWQgYWZ0ZXIgdGhlIHJlbmRlciBpcyBkb25lOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwcmV2ID0gc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKGkpXG4gKiAvLyAuLi5yZW5kZXJcbiAqIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShwcmV2KVxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShpbnN0YW5jZSkge1xuICAgIGNvbnN0IHByZXYgPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U7XG4gICAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgY3VycmVudFNjb3BlSWQgPSAoaW5zdGFuY2UgJiYgaW5zdGFuY2UudHlwZS5fX3Njb3BlSWQpIHx8IG51bGw7XG4gICAgcmV0dXJuIHByZXY7XG59XG4vKipcbiAqIFNldCBzY29wZSBpZCB3aGVuIGNyZWF0aW5nIGhvaXN0ZWQgdm5vZGVzLlxuICogQHByaXZhdGUgY29tcGlsZXIgaGVscGVyXG4gKi9cbmZ1bmN0aW9uIHB1c2hTY29wZUlkKGlkKSB7XG4gICAgY3VycmVudFNjb3BlSWQgPSBpZDtcbn1cbi8qKlxuICogVGVjaG5pY2FsbHkgd2Ugbm8gbG9uZ2VyIG5lZWQgdGhpcyBhZnRlciAzLjAuOCBidXQgd2UgbmVlZCB0byBrZWVwIHRoZSBzYW1lXG4gKiBBUEkgZm9yIGJhY2t3YXJkcyBjb21wYXQgdy8gY29kZSBnZW5lcmF0ZWQgYnkgY29tcGlsZXJzLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcG9wU2NvcGVJZCgpIHtcbiAgICBjdXJyZW50U2NvcGVJZCA9IG51bGw7XG59XG4vKipcbiAqIE9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHdpdGhTY29wZUlkID0gKF9pZCkgPT4gd2l0aEN0eDtcbi8qKlxuICogV3JhcCBhIHNsb3QgZnVuY3Rpb24gdG8gbWVtb2l6ZSBjdXJyZW50IHJlbmRlcmluZyBpbnN0YW5jZVxuICogQHByaXZhdGUgY29tcGlsZXIgaGVscGVyXG4gKi9cbmZ1bmN0aW9uIHdpdGhDdHgoZm4sIGN0eCA9IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSwgaXNOb25TY29wZWRTbG90IC8vIGZhbHNlIG9ubHlcbikge1xuICAgIGlmICghY3R4KVxuICAgICAgICByZXR1cm4gZm47XG4gICAgLy8gYWxyZWFkeSBub3JtYWxpemVkXG4gICAgaWYgKGZuLl9uKSB7XG4gICAgICAgIHJldHVybiBmbjtcbiAgICB9XG4gICAgY29uc3QgcmVuZGVyRm5XaXRoQ29udGV4dCA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIC8vIElmIGEgdXNlciBjYWxscyBhIGNvbXBpbGVkIHNsb3QgaW5zaWRlIGEgdGVtcGxhdGUgZXhwcmVzc2lvbiAoIzE3NDUpLCBpdFxuICAgICAgICAvLyBjYW4gbWVzcyB1cCBibG9jayB0cmFja2luZywgc28gYnkgZGVmYXVsdCB3ZSBkaXNhYmxlIGJsb2NrIHRyYWNraW5nIGFuZFxuICAgICAgICAvLyBmb3JjZSBiYWlsIG91dCB3aGVuIGludm9raW5nIGEgY29tcGlsZWQgc2xvdCAoaW5kaWNhdGVkIGJ5IHRoZSAuX2QgZmxhZykuXG4gICAgICAgIC8vIFRoaXMgaXNuJ3QgbmVjZXNzYXJ5IGlmIHJlbmRlcmluZyBhIGNvbXBpbGVkIGA8c2xvdD5gLCBzbyB3ZSBmbGlwIHRoZVxuICAgICAgICAvLyAuX2QgZmxhZyBvZmYgd2hlbiBpbnZva2luZyB0aGUgd3JhcHBlZCBmbiBpbnNpZGUgYHJlbmRlclNsb3RgLlxuICAgICAgICBpZiAocmVuZGVyRm5XaXRoQ29udGV4dC5fZCkge1xuICAgICAgICAgICAgc2V0QmxvY2tUcmFja2luZygtMSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJldkluc3RhbmNlID0gc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKGN0eCk7XG4gICAgICAgIGxldCByZXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXMgPSBmbiguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShwcmV2SW5zdGFuY2UpO1xuICAgICAgICAgICAgaWYgKHJlbmRlckZuV2l0aENvbnRleHQuX2QpIHtcbiAgICAgICAgICAgICAgICBzZXRCbG9ja1RyYWNraW5nKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgICBkZXZ0b29sc0NvbXBvbmVudFVwZGF0ZWQoY3R4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgLy8gbWFyayBub3JtYWxpemVkIHRvIGF2b2lkIGR1cGxpY2F0ZWQgd3JhcHBpbmdcbiAgICByZW5kZXJGbldpdGhDb250ZXh0Ll9uID0gdHJ1ZTtcbiAgICAvLyBtYXJrIHRoaXMgYXMgY29tcGlsZWQgYnkgZGVmYXVsdFxuICAgIC8vIHRoaXMgaXMgdXNlZCBpbiB2bm9kZS50cyAtPiBub3JtYWxpemVDaGlsZHJlbigpIHRvIHNldCB0aGUgc2xvdFxuICAgIC8vIHJlbmRlcmluZyBmbGFnLlxuICAgIHJlbmRlckZuV2l0aENvbnRleHQuX2MgPSB0cnVlO1xuICAgIC8vIGRpc2FibGUgYmxvY2sgdHJhY2tpbmcgYnkgZGVmYXVsdFxuICAgIHJlbmRlckZuV2l0aENvbnRleHQuX2QgPSB0cnVlO1xuICAgIHJldHVybiByZW5kZXJGbldpdGhDb250ZXh0O1xufVxuXG4vKipcbiAqIGRldiBvbmx5IGZsYWcgdG8gdHJhY2sgd2hldGhlciAkYXR0cnMgd2FzIHVzZWQgZHVyaW5nIHJlbmRlci5cbiAqIElmICRhdHRycyB3YXMgdXNlZCBkdXJpbmcgcmVuZGVyIHRoZW4gdGhlIHdhcm5pbmcgZm9yIGZhaWxlZCBhdHRyc1xuICogZmFsbHRocm91Z2ggY2FuIGJlIHN1cHByZXNzZWQuXG4gKi9cbmxldCBhY2Nlc3NlZEF0dHJzID0gZmFsc2U7XG5mdW5jdGlvbiBtYXJrQXR0cnNBY2Nlc3NlZCgpIHtcbiAgICBhY2Nlc3NlZEF0dHJzID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlbmRlckNvbXBvbmVudFJvb3QoaW5zdGFuY2UpIHtcbiAgICBjb25zdCB7IHR5cGU6IENvbXBvbmVudCwgdm5vZGUsIHByb3h5LCB3aXRoUHJveHksIHByb3BzLCBwcm9wc09wdGlvbnM6IFtwcm9wc09wdGlvbnNdLCBzbG90cywgYXR0cnMsIGVtaXQsIHJlbmRlciwgcmVuZGVyQ2FjaGUsIGRhdGEsIHNldHVwU3RhdGUsIGN0eCwgaW5oZXJpdEF0dHJzIH0gPSBpbnN0YW5jZTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGxldCBmYWxsdGhyb3VnaEF0dHJzO1xuICAgIGNvbnN0IHByZXYgPSBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgYWNjZXNzZWRBdHRycyA9IGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgNCAvKiBTaGFwZUZsYWdzLlNUQVRFRlVMX0NPTVBPTkVOVCAqLykge1xuICAgICAgICAgICAgLy8gd2l0aFByb3h5IGlzIGEgcHJveHkgd2l0aCBhIGRpZmZlcmVudCBgaGFzYCB0cmFwIG9ubHkgZm9yXG4gICAgICAgICAgICAvLyBydW50aW1lLWNvbXBpbGVkIHJlbmRlciBmdW5jdGlvbnMgdXNpbmcgYHdpdGhgIGJsb2NrLlxuICAgICAgICAgICAgY29uc3QgcHJveHlUb1VzZSA9IHdpdGhQcm94eSB8fCBwcm94eTtcbiAgICAgICAgICAgIHJlc3VsdCA9IG5vcm1hbGl6ZVZOb2RlKHJlbmRlci5jYWxsKHByb3h5VG9Vc2UsIHByb3h5VG9Vc2UsIHJlbmRlckNhY2hlLCBwcm9wcywgc2V0dXBTdGF0ZSwgZGF0YSwgY3R4KSk7XG4gICAgICAgICAgICBmYWxsdGhyb3VnaEF0dHJzID0gYXR0cnM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBmdW5jdGlvbmFsXG4gICAgICAgICAgICBjb25zdCByZW5kZXIgPSBDb21wb25lbnQ7XG4gICAgICAgICAgICAvLyBpbiBkZXYsIG1hcmsgYXR0cnMgYWNjZXNzZWQgaWYgb3B0aW9uYWwgcHJvcHMgKGF0dHJzID09PSBwcm9wcylcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgYXR0cnMgPT09IHByb3BzKSB7XG4gICAgICAgICAgICAgICAgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCA9IG5vcm1hbGl6ZVZOb2RlKHJlbmRlci5sZW5ndGggPiAxXG4gICAgICAgICAgICAgICAgPyByZW5kZXIocHJvcHMsIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKVxuICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldCBhdHRycygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrQXR0cnNBY2Nlc3NlZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRycztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzbG90cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA6IHsgYXR0cnMsIHNsb3RzLCBlbWl0IH0pXG4gICAgICAgICAgICAgICAgOiByZW5kZXIocHJvcHMsIG51bGwgLyogd2Uga25vdyBpdCBkb2Vzbid0IG5lZWQgaXQgKi8pKTtcbiAgICAgICAgICAgIGZhbGx0aHJvdWdoQXR0cnMgPSBDb21wb25lbnQucHJvcHNcbiAgICAgICAgICAgICAgICA/IGF0dHJzXG4gICAgICAgICAgICAgICAgOiBnZXRGdW5jdGlvbmFsRmFsbHRocm91Z2goYXR0cnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgYmxvY2tTdGFjay5sZW5ndGggPSAwO1xuICAgICAgICBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCAxIC8qIEVycm9yQ29kZXMuUkVOREVSX0ZVTkNUSU9OICovKTtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlVk5vZGUoQ29tbWVudCk7XG4gICAgfVxuICAgIC8vIGF0dHIgbWVyZ2luZ1xuICAgIC8vIGluIGRldiBtb2RlLCBjb21tZW50cyBhcmUgcHJlc2VydmVkLCBhbmQgaXQncyBwb3NzaWJsZSBmb3IgYSB0ZW1wbGF0ZVxuICAgIC8vIHRvIGhhdmUgY29tbWVudHMgYWxvbmcgc2lkZSB0aGUgcm9vdCBlbGVtZW50IHdoaWNoIG1ha2VzIGl0IGEgZnJhZ21lbnRcbiAgICBsZXQgcm9vdCA9IHJlc3VsdDtcbiAgICBsZXQgc2V0Um9vdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmXG4gICAgICAgIHJlc3VsdC5wYXRjaEZsYWcgPiAwICYmXG4gICAgICAgIHJlc3VsdC5wYXRjaEZsYWcgJiAyMDQ4IC8qIFBhdGNoRmxhZ3MuREVWX1JPT1RfRlJBR01FTlQgKi8pIHtcbiAgICAgICAgW3Jvb3QsIHNldFJvb3RdID0gZ2V0Q2hpbGRSb290KHJlc3VsdCk7XG4gICAgfVxuICAgIGlmIChmYWxsdGhyb3VnaEF0dHJzICYmIGluaGVyaXRBdHRycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZhbGx0aHJvdWdoQXR0cnMpO1xuICAgICAgICBjb25zdCB7IHNoYXBlRmxhZyB9ID0gcm9vdDtcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoc2hhcGVGbGFnICYgKDEgLyogU2hhcGVGbGFncy5FTEVNRU5UICovIHwgNiAvKiBTaGFwZUZsYWdzLkNPTVBPTkVOVCAqLykpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcHNPcHRpb25zICYmIGtleXMuc29tZShpc01vZGVsTGlzdGVuZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGEgdi1tb2RlbCBsaXN0ZW5lciAob25VcGRhdGU6eHh4KSBoYXMgYSBjb3JyZXNwb25kaW5nIGRlY2xhcmVkXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb3AsIGl0IGluZGljYXRlcyB0aGlzIGNvbXBvbmVudCBleHBlY3RzIHRvIGhhbmRsZSB2LW1vZGVsIGFuZFxuICAgICAgICAgICAgICAgICAgICAvLyBpdCBzaG91bGQgbm90IGZhbGx0aHJvdWdoLlxuICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGVkOiAjMTU0MywgIzE2NDMsICMxOTg5XG4gICAgICAgICAgICAgICAgICAgIGZhbGx0aHJvdWdoQXR0cnMgPSBmaWx0ZXJNb2RlbExpc3RlbmVycyhmYWxsdGhyb3VnaEF0dHJzLCBwcm9wc09wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByb290ID0gY2xvbmVWTm9kZShyb290LCBmYWxsdGhyb3VnaEF0dHJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhYWNjZXNzZWRBdHRycyAmJiByb290LnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGxBdHRycyA9IE9iamVjdC5rZXlzKGF0dHJzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudEF0dHJzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgZXh0cmFBdHRycyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gYWxsQXR0cnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGFsbEF0dHJzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNPbihrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdi1tb2RlbCBoYW5kbGVycyB3aGVuIHRoZXkgZmFpbCB0byBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc01vZGVsTGlzdGVuZXIoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBgb25gLCBsb3dlcmNhc2UgZmlyc3QgbGV0dGVyIHRvIHJlZmxlY3QgZXZlbnQgY2FzaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjdXJhdGVseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50QXR0cnMucHVzaChrZXlbMl0udG9Mb3dlckNhc2UoKSArIGtleS5zbGljZSgzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZXh0cmFBdHRycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FybihgRXh0cmFuZW91cyBub24tcHJvcHMgYXR0cmlidXRlcyAoYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtleHRyYUF0dHJzLmpvaW4oJywgJyl9KSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGB3ZXJlIHBhc3NlZCB0byBjb21wb25lbnQgYnV0IGNvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBiZWNhdXNlIGNvbXBvbmVudCByZW5kZXJzIGZyYWdtZW50IG9yIHRleHQgcm9vdCBub2Rlcy5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50QXR0cnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm4oYEV4dHJhbmVvdXMgbm9uLWVtaXRzIGV2ZW50IGxpc3RlbmVycyAoYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtldmVudEF0dHJzLmpvaW4oJywgJyl9KSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGB3ZXJlIHBhc3NlZCB0byBjb21wb25lbnQgYnV0IGNvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBiZWNhdXNlIGNvbXBvbmVudCByZW5kZXJzIGZyYWdtZW50IG9yIHRleHQgcm9vdCBub2Rlcy4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgSWYgdGhlIGxpc3RlbmVyIGlzIGludGVuZGVkIHRvIGJlIGEgY29tcG9uZW50IGN1c3RvbSBldmVudCBsaXN0ZW5lciBvbmx5LCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBkZWNsYXJlIGl0IHVzaW5nIHRoZSBcImVtaXRzXCIgb3B0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBpbmhlcml0IGRpcmVjdGl2ZXNcbiAgICBpZiAodm5vZGUuZGlycykge1xuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmICFpc0VsZW1lbnRSb290KHJvb3QpKSB7XG4gICAgICAgICAgICB3YXJuKGBSdW50aW1lIGRpcmVjdGl2ZSB1c2VkIG9uIGNvbXBvbmVudCB3aXRoIG5vbi1lbGVtZW50IHJvb3Qgbm9kZS4gYCArXG4gICAgICAgICAgICAgICAgYFRoZSBkaXJlY3RpdmVzIHdpbGwgbm90IGZ1bmN0aW9uIGFzIGludGVuZGVkLmApO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNsb25lIGJlZm9yZSBtdXRhdGluZyBzaW5jZSB0aGUgcm9vdCBtYXkgYmUgYSBob2lzdGVkIHZub2RlXG4gICAgICAgIHJvb3QgPSBjbG9uZVZOb2RlKHJvb3QpO1xuICAgICAgICByb290LmRpcnMgPSByb290LmRpcnMgPyByb290LmRpcnMuY29uY2F0KHZub2RlLmRpcnMpIDogdm5vZGUuZGlycztcbiAgICB9XG4gICAgLy8gaW5oZXJpdCB0cmFuc2l0aW9uIGRhdGFcbiAgICBpZiAodm5vZGUudHJhbnNpdGlvbikge1xuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmICFpc0VsZW1lbnRSb290KHJvb3QpKSB7XG4gICAgICAgICAgICB3YXJuKGBDb21wb25lbnQgaW5zaWRlIDxUcmFuc2l0aW9uPiByZW5kZXJzIG5vbi1lbGVtZW50IHJvb3Qgbm9kZSBgICtcbiAgICAgICAgICAgICAgICBgdGhhdCBjYW5ub3QgYmUgYW5pbWF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC50cmFuc2l0aW9uID0gdm5vZGUudHJhbnNpdGlvbjtcbiAgICB9XG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiBzZXRSb290KSB7XG4gICAgICAgIHNldFJvb3Qocm9vdCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQgPSByb290O1xuICAgIH1cbiAgICBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UocHJldik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogZGV2IG9ubHlcbiAqIEluIGRldiBtb2RlLCB0ZW1wbGF0ZSByb290IGxldmVsIGNvbW1lbnRzIGFyZSByZW5kZXJlZCwgd2hpY2ggdHVybnMgdGhlXG4gKiB0ZW1wbGF0ZSBpbnRvIGEgZnJhZ21lbnQgcm9vdCwgYnV0IHdlIG5lZWQgdG8gbG9jYXRlIHRoZSBzaW5nbGUgZWxlbWVudFxuICogcm9vdCBmb3IgYXR0cnMgYW5kIHNjb3BlIGlkIHByb2Nlc3NpbmcuXG4gKi9cbmNvbnN0IGdldENoaWxkUm9vdCA9ICh2bm9kZSkgPT4ge1xuICAgIGNvbnN0IHJhd0NoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG4gICAgY29uc3QgZHluYW1pY0NoaWxkcmVuID0gdm5vZGUuZHluYW1pY0NoaWxkcmVuO1xuICAgIGNvbnN0IGNoaWxkUm9vdCA9IGZpbHRlclNpbmdsZVJvb3QocmF3Q2hpbGRyZW4pO1xuICAgIGlmICghY2hpbGRSb290KSB7XG4gICAgICAgIHJldHVybiBbdm5vZGUsIHVuZGVmaW5lZF07XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gcmF3Q2hpbGRyZW4uaW5kZXhPZihjaGlsZFJvb3QpO1xuICAgIGNvbnN0IGR5bmFtaWNJbmRleCA9IGR5bmFtaWNDaGlsZHJlbiA/IGR5bmFtaWNDaGlsZHJlbi5pbmRleE9mKGNoaWxkUm9vdCkgOiAtMTtcbiAgICBjb25zdCBzZXRSb290ID0gKHVwZGF0ZWRSb290KSA9PiB7XG4gICAgICAgIHJhd0NoaWxkcmVuW2luZGV4XSA9IHVwZGF0ZWRSb290O1xuICAgICAgICBpZiAoZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoZHluYW1pY0luZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBkeW5hbWljQ2hpbGRyZW5bZHluYW1pY0luZGV4XSA9IHVwZGF0ZWRSb290O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodXBkYXRlZFJvb3QucGF0Y2hGbGFnID4gMCkge1xuICAgICAgICAgICAgICAgIHZub2RlLmR5bmFtaWNDaGlsZHJlbiA9IFsuLi5keW5hbWljQ2hpbGRyZW4sIHVwZGF0ZWRSb290XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFtub3JtYWxpemVWTm9kZShjaGlsZFJvb3QpLCBzZXRSb290XTtcbn07XG5mdW5jdGlvbiBmaWx0ZXJTaW5nbGVSb290KGNoaWxkcmVuKSB7XG4gICAgbGV0IHNpbmdsZVJvb3Q7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoaXNWTm9kZShjaGlsZCkpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSB1c2VyIGNvbW1lbnRcbiAgICAgICAgICAgIGlmIChjaGlsZC50eXBlICE9PSBDb21tZW50IHx8IGNoaWxkLmNoaWxkcmVuID09PSAndi1pZicpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2luZ2xlUm9vdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBoYXMgbW9yZSB0aGFuIDEgbm9uLWNvbW1lbnQgY2hpbGQsIHJldHVybiBub3dcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2luZ2xlUm9vdCA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2luZ2xlUm9vdDtcbn1cbmNvbnN0IGdldEZ1bmN0aW9uYWxGYWxsdGhyb3VnaCA9IChhdHRycykgPT4ge1xuICAgIGxldCByZXM7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ2NsYXNzJyB8fCBrZXkgPT09ICdzdHlsZScgfHwgaXNPbihrZXkpKSB7XG4gICAgICAgICAgICAocmVzIHx8IChyZXMgPSB7fSkpW2tleV0gPSBhdHRyc1trZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59O1xuY29uc3QgZmlsdGVyTW9kZWxMaXN0ZW5lcnMgPSAoYXR0cnMsIHByb3BzKSA9PiB7XG4gICAgY29uc3QgcmVzID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICAgICAgaWYgKCFpc01vZGVsTGlzdGVuZXIoa2V5KSB8fCAhKGtleS5zbGljZSg5KSBpbiBwcm9wcykpIHtcbiAgICAgICAgICAgIHJlc1trZXldID0gYXR0cnNba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufTtcbmNvbnN0IGlzRWxlbWVudFJvb3QgPSAodm5vZGUpID0+IHtcbiAgICByZXR1cm4gKHZub2RlLnNoYXBlRmxhZyAmICg2IC8qIFNoYXBlRmxhZ3MuQ09NUE9ORU5UICovIHwgMSAvKiBTaGFwZUZsYWdzLkVMRU1FTlQgKi8pIHx8XG4gICAgICAgIHZub2RlLnR5cGUgPT09IENvbW1lbnQgLy8gcG90ZW50aWFsIHYtaWYgYnJhbmNoIHN3aXRjaFxuICAgICk7XG59O1xuZnVuY3Rpb24gc2hvdWxkVXBkYXRlQ29tcG9uZW50KHByZXZWTm9kZSwgbmV4dFZOb2RlLCBvcHRpbWl6ZWQpIHtcbiAgICBjb25zdCB7IHByb3BzOiBwcmV2UHJvcHMsIGNoaWxkcmVuOiBwcmV2Q2hpbGRyZW4sIGNvbXBvbmVudCB9ID0gcHJldlZOb2RlO1xuICAgIGNvbnN0IHsgcHJvcHM6IG5leHRQcm9wcywgY2hpbGRyZW46IG5leHRDaGlsZHJlbiwgcGF0Y2hGbGFnIH0gPSBuZXh0Vk5vZGU7XG4gICAgY29uc3QgZW1pdHMgPSBjb21wb25lbnQuZW1pdHNPcHRpb25zO1xuICAgIC8vIFBhcmVudCBjb21wb25lbnQncyByZW5kZXIgZnVuY3Rpb24gd2FzIGhvdC11cGRhdGVkLiBTaW5jZSB0aGlzIG1heSBoYXZlXG4gICAgLy8gY2F1c2VkIHRoZSBjaGlsZCBjb21wb25lbnQncyBzbG90cyBjb250ZW50IHRvIGhhdmUgY2hhbmdlZCwgd2UgbmVlZCB0b1xuICAgIC8vIGZvcmNlIHRoZSBjaGlsZCB0byB1cGRhdGUgYXMgd2VsbC5cbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIChwcmV2Q2hpbGRyZW4gfHwgbmV4dENoaWxkcmVuKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBmb3JjZSBjaGlsZCB1cGRhdGUgZm9yIHJ1bnRpbWUgZGlyZWN0aXZlIG9yIHRyYW5zaXRpb24gb24gY29tcG9uZW50IHZub2RlLlxuICAgIGlmIChuZXh0Vk5vZGUuZGlycyB8fCBuZXh0Vk5vZGUudHJhbnNpdGlvbikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG9wdGltaXplZCAmJiBwYXRjaEZsYWcgPj0gMCkge1xuICAgICAgICBpZiAocGF0Y2hGbGFnICYgMTAyNCAvKiBQYXRjaEZsYWdzLkRZTkFNSUNfU0xPVFMgKi8pIHtcbiAgICAgICAgICAgIC8vIHNsb3QgY29udGVudCB0aGF0IHJlZmVyZW5jZXMgdmFsdWVzIHRoYXQgbWlnaHQgaGF2ZSBjaGFuZ2VkLFxuICAgICAgICAgICAgLy8gZS5nLiBpbiBhIHYtZm9yXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0Y2hGbGFnICYgMTYgLyogUGF0Y2hGbGFncy5GVUxMX1BST1BTICovKSB7XG4gICAgICAgICAgICBpZiAoIXByZXZQcm9wcykge1xuICAgICAgICAgICAgICAgIHJldHVybiAhIW5leHRQcm9wcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHByZXNlbmNlIG9mIHRoaXMgZmxhZyBpbmRpY2F0ZXMgcHJvcHMgYXJlIGFsd2F5cyBub24tbnVsbFxuICAgICAgICAgICAgcmV0dXJuIGhhc1Byb3BzQ2hhbmdlZChwcmV2UHJvcHMsIG5leHRQcm9wcywgZW1pdHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhdGNoRmxhZyAmIDggLyogUGF0Y2hGbGFncy5QUk9QUyAqLykge1xuICAgICAgICAgICAgY29uc3QgZHluYW1pY1Byb3BzID0gbmV4dFZOb2RlLmR5bmFtaWNQcm9wcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZHluYW1pY1Byb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gZHluYW1pY1Byb3BzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0UHJvcHNba2V5XSAhPT0gcHJldlByb3BzW2tleV0gJiZcbiAgICAgICAgICAgICAgICAgICAgIWlzRW1pdExpc3RlbmVyKGVtaXRzLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gdGhpcyBwYXRoIGlzIG9ubHkgdGFrZW4gYnkgbWFudWFsbHkgd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zXG4gICAgICAgIC8vIHNvIHByZXNlbmNlIG9mIGFueSBjaGlsZHJlbiBsZWFkcyB0byBhIGZvcmNlZCB1cGRhdGVcbiAgICAgICAgaWYgKHByZXZDaGlsZHJlbiB8fCBuZXh0Q2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmICghbmV4dENoaWxkcmVuIHx8ICFuZXh0Q2hpbGRyZW4uJHN0YWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcmV2UHJvcHMgPT09IG5leHRQcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcHJldlByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gISFuZXh0UHJvcHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFuZXh0UHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNQcm9wc0NoYW5nZWQocHJldlByb3BzLCBuZXh0UHJvcHMsIGVtaXRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaGFzUHJvcHNDaGFuZ2VkKHByZXZQcm9wcywgbmV4dFByb3BzLCBlbWl0c09wdGlvbnMpIHtcbiAgICBjb25zdCBuZXh0S2V5cyA9IE9iamVjdC5rZXlzKG5leHRQcm9wcyk7XG4gICAgaWYgKG5leHRLZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMocHJldlByb3BzKS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV4dEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbmV4dEtleXNbaV07XG4gICAgICAgIGlmIChuZXh0UHJvcHNba2V5XSAhPT0gcHJldlByb3BzW2tleV0gJiZcbiAgICAgICAgICAgICFpc0VtaXRMaXN0ZW5lcihlbWl0c09wdGlvbnMsIGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUhPQ0hvc3RFbCh7IHZub2RlLCBwYXJlbnQgfSwgZWwgLy8gSG9zdE5vZGVcbikge1xuICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50LnN1YlRyZWUgPT09IHZub2RlKSB7XG4gICAgICAgICh2bm9kZSA9IHBhcmVudC52bm9kZSkuZWwgPSBlbDtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICB9XG59XG5cbmNvbnN0IGlzU3VzcGVuc2UgPSAodHlwZSkgPT4gdHlwZS5fX2lzU3VzcGVuc2U7XG4vLyBTdXNwZW5zZSBleHBvc2VzIGEgY29tcG9uZW50LWxpa2UgQVBJLCBhbmQgaXMgdHJlYXRlZCBsaWtlIGEgY29tcG9uZW50XG4vLyBpbiB0aGUgY29tcGlsZXIsIGJ1dCBpbnRlcm5hbGx5IGl0J3MgYSBzcGVjaWFsIGJ1aWx0LWluIHR5cGUgdGhhdCBob29rc1xuLy8gZGlyZWN0bHkgaW50byB0aGUgcmVuZGVyZXIuXG5jb25zdCBTdXNwZW5zZUltcGwgPSB7XG4gICAgbmFtZTogJ1N1c3BlbnNlJyxcbiAgICAvLyBJbiBvcmRlciB0byBtYWtlIFN1c3BlbnNlIHRyZWUtc2hha2FibGUsIHdlIG5lZWQgdG8gYXZvaWQgaW1wb3J0aW5nIGl0XG4gICAgLy8gZGlyZWN0bHkgaW4gdGhlIHJlbmRlcmVyLiBUaGUgcmVuZGVyZXIgY2hlY2tzIGZvciB0aGUgX19pc1N1c3BlbnNlIGZsYWdcbiAgICAvLyBvbiBhIHZub2RlJ3MgdHlwZSBhbmQgY2FsbHMgdGhlIGBwcm9jZXNzYCBtZXRob2QsIHBhc3NpbmcgaW4gcmVuZGVyZXJcbiAgICAvLyBpbnRlcm5hbHMuXG4gICAgX19pc1N1c3BlbnNlOiB0cnVlLFxuICAgIHByb2Nlc3MobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCBcbiAgICAvLyBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsIHBhc3NlZCBmcm9tIHJlbmRlcmVyXG4gICAgcmVuZGVyZXJJbnRlcm5hbHMpIHtcbiAgICAgICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgICAgICAgIG1vdW50U3VzcGVuc2UobjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhdGNoU3VzcGVuc2UobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaHlkcmF0ZTogaHlkcmF0ZVN1c3BlbnNlLFxuICAgIGNyZWF0ZTogY3JlYXRlU3VzcGVuc2VCb3VuZGFyeSxcbiAgICBub3JtYWxpemU6IG5vcm1hbGl6ZVN1c3BlbnNlQ2hpbGRyZW5cbn07XG4vLyBGb3JjZS1jYXN0ZWQgcHVibGljIHR5cGluZyBmb3IgaCBhbmQgVFNYIHByb3BzIGluZmVyZW5jZVxuY29uc3QgU3VzcGVuc2UgPSAoU3VzcGVuc2VJbXBsXG4gICAgKTtcbmZ1bmN0aW9uIHRyaWdnZXJFdmVudCh2bm9kZSwgbmFtZSkge1xuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wc1tuYW1lXTtcbiAgICBpZiAoaXNGdW5jdGlvbihldmVudExpc3RlbmVyKSkge1xuICAgICAgICBldmVudExpc3RlbmVyKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgcmVuZGVyZXJJbnRlcm5hbHMpIHtcbiAgICBjb25zdCB7IHA6IHBhdGNoLCBvOiB7IGNyZWF0ZUVsZW1lbnQgfSB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gICAgY29uc3QgaGlkZGVuQ29udGFpbmVyID0gY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3Qgc3VzcGVuc2UgPSAodm5vZGUuc3VzcGVuc2UgPSBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5KHZub2RlLCBwYXJlbnRTdXNwZW5zZSwgcGFyZW50Q29tcG9uZW50LCBjb250YWluZXIsIGhpZGRlbkNvbnRhaW5lciwgYW5jaG9yLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzKSk7XG4gICAgLy8gc3RhcnQgbW91bnRpbmcgdGhlIGNvbnRlbnQgc3VidHJlZSBpbiBhbiBvZmYtZG9tIGNvbnRhaW5lclxuICAgIHBhdGNoKG51bGwsIChzdXNwZW5zZS5wZW5kaW5nQnJhbmNoID0gdm5vZGUuc3NDb250ZW50KSwgaGlkZGVuQ29udGFpbmVyLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIHN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzKTtcbiAgICAvLyBub3cgY2hlY2sgaWYgd2UgaGF2ZSBlbmNvdW50ZXJlZCBhbnkgYXN5bmMgZGVwc1xuICAgIGlmIChzdXNwZW5zZS5kZXBzID4gMCkge1xuICAgICAgICAvLyBoYXMgYXN5bmNcbiAgICAgICAgLy8gaW52b2tlIEBmYWxsYmFjayBldmVudFxuICAgICAgICB0cmlnZ2VyRXZlbnQodm5vZGUsICdvblBlbmRpbmcnKTtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHZub2RlLCAnb25GYWxsYmFjaycpO1xuICAgICAgICAvLyBtb3VudCB0aGUgZmFsbGJhY2sgdHJlZVxuICAgICAgICBwYXRjaChudWxsLCB2bm9kZS5zc0ZhbGxiYWNrLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBudWxsLCAvLyBmYWxsYmFjayB0cmVlIHdpbGwgbm90IGhhdmUgc3VzcGVuc2UgY29udGV4dFxuICAgICAgICBpc1NWRywgc2xvdFNjb3BlSWRzKTtcbiAgICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCB2bm9kZS5zc0ZhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFN1c3BlbnNlIGhhcyBubyBhc3luYyBkZXBzLiBKdXN0IHJlc29sdmUuXG4gICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBwYXRjaFN1c3BlbnNlKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCB7IHA6IHBhdGNoLCB1bTogdW5tb3VudCwgbzogeyBjcmVhdGVFbGVtZW50IH0gfSkge1xuICAgIGNvbnN0IHN1c3BlbnNlID0gKG4yLnN1c3BlbnNlID0gbjEuc3VzcGVuc2UpO1xuICAgIHN1c3BlbnNlLnZub2RlID0gbjI7XG4gICAgbjIuZWwgPSBuMS5lbDtcbiAgICBjb25zdCBuZXdCcmFuY2ggPSBuMi5zc0NvbnRlbnQ7XG4gICAgY29uc3QgbmV3RmFsbGJhY2sgPSBuMi5zc0ZhbGxiYWNrO1xuICAgIGNvbnN0IHsgYWN0aXZlQnJhbmNoLCBwZW5kaW5nQnJhbmNoLCBpc0luRmFsbGJhY2ssIGlzSHlkcmF0aW5nIH0gPSBzdXNwZW5zZTtcbiAgICBpZiAocGVuZGluZ0JyYW5jaCkge1xuICAgICAgICBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoID0gbmV3QnJhbmNoO1xuICAgICAgICBpZiAoaXNTYW1lVk5vZGVUeXBlKG5ld0JyYW5jaCwgcGVuZGluZ0JyYW5jaCkpIHtcbiAgICAgICAgICAgIC8vIHNhbWUgcm9vdCB0eXBlIGJ1dCBjb250ZW50IG1heSBoYXZlIGNoYW5nZWQuXG4gICAgICAgICAgICBwYXRjaChwZW5kaW5nQnJhbmNoLCBuZXdCcmFuY2gsIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lciwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBzdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgICAgIGlmIChzdXNwZW5zZS5kZXBzIDw9IDApIHtcbiAgICAgICAgICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0luRmFsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBwYXRjaChhY3RpdmVCcmFuY2gsIG5ld0ZhbGxiYWNrLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBudWxsLCAvLyBmYWxsYmFjayB0cmVlIHdpbGwgbm90IGhhdmUgc3VzcGVuc2UgY29udGV4dFxuICAgICAgICAgICAgICAgIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCk7XG4gICAgICAgICAgICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBuZXdGYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyB0b2dnbGVkIGJlZm9yZSBwZW5kaW5nIHRyZWUgaXMgcmVzb2x2ZWRcbiAgICAgICAgICAgIHN1c3BlbnNlLnBlbmRpbmdJZCsrO1xuICAgICAgICAgICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdG9nZ2xlZCBiZWZvcmUgaHlkcmF0aW9uIGlzIGZpbmlzaGVkLCB0aGUgY3VycmVudCBET00gdHJlZSBpc1xuICAgICAgICAgICAgICAgIC8vIG5vIGxvbmdlciB2YWxpZC4gc2V0IGl0IGFzIHRoZSBhY3RpdmUgYnJhbmNoIHNvIGl0IHdpbGwgYmUgdW5tb3VudGVkXG4gICAgICAgICAgICAgICAgLy8gd2hlbiByZXNvbHZlZFxuICAgICAgICAgICAgICAgIHN1c3BlbnNlLmlzSHlkcmF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoID0gcGVuZGluZ0JyYW5jaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHVubW91bnQocGVuZGluZ0JyYW5jaCwgcGFyZW50Q29tcG9uZW50LCBzdXNwZW5zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpbmNyZW1lbnQgcGVuZGluZyBJRC4gdGhpcyBpcyB1c2VkIHRvIGludmFsaWRhdGUgYXN5bmMgY2FsbGJhY2tzXG4gICAgICAgICAgICAvLyByZXNldCBzdXNwZW5zZSBzdGF0ZVxuICAgICAgICAgICAgc3VzcGVuc2UuZGVwcyA9IDA7XG4gICAgICAgICAgICAvLyBkaXNjYXJkIGVmZmVjdHMgZnJvbSBwZW5kaW5nIGJyYW5jaFxuICAgICAgICAgICAgc3VzcGVuc2UuZWZmZWN0cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgLy8gZGlzY2FyZCBwcmV2aW91cyBjb250YWluZXJcbiAgICAgICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgaWYgKGlzSW5GYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaW4gZmFsbGJhY2sgc3RhdGVcbiAgICAgICAgICAgICAgICBwYXRjaChudWxsLCBuZXdCcmFuY2gsIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lciwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBzdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2UuZGVwcyA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGNoKGFjdGl2ZUJyYW5jaCwgbmV3RmFsbGJhY2ssIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIG51bGwsIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICAgICAgICAgICAgICAgIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCk7XG4gICAgICAgICAgICAgICAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgbmV3RmFsbGJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFjdGl2ZUJyYW5jaCAmJiBpc1NhbWVWTm9kZVR5cGUobmV3QnJhbmNoLCBhY3RpdmVCcmFuY2gpKSB7XG4gICAgICAgICAgICAgICAgLy8gdG9nZ2xlZCBcImJhY2tcIiB0byBjdXJyZW50IGFjdGl2ZSBicmFuY2hcbiAgICAgICAgICAgICAgICBwYXRjaChhY3RpdmVCcmFuY2gsIG5ld0JyYW5jaCwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgc3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCk7XG4gICAgICAgICAgICAgICAgLy8gZm9yY2UgcmVzb2x2ZVxuICAgICAgICAgICAgICAgIHN1c3BlbnNlLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBzd2l0Y2hlZCB0byBhIDNyZCBicmFuY2hcbiAgICAgICAgICAgICAgICBwYXRjaChudWxsLCBuZXdCcmFuY2gsIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lciwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBzdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2UuZGVwcyA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChhY3RpdmVCcmFuY2ggJiYgaXNTYW1lVk5vZGVUeXBlKG5ld0JyYW5jaCwgYWN0aXZlQnJhbmNoKSkge1xuICAgICAgICAgICAgLy8gcm9vdCBkaWQgbm90IGNoYW5nZSwganVzdCBub3JtYWwgcGF0Y2hcbiAgICAgICAgICAgIHBhdGNoKGFjdGl2ZUJyYW5jaCwgbmV3QnJhbmNoLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBzdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgbmV3QnJhbmNoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJvb3Qgbm9kZSB0b2dnbGVkXG4gICAgICAgICAgICAvLyBpbnZva2UgQHBlbmRpbmcgZXZlbnRcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChuMiwgJ29uUGVuZGluZycpO1xuICAgICAgICAgICAgLy8gbW91bnQgcGVuZGluZyBicmFuY2ggaW4gb2ZmLWRvbSBjb250YWluZXJcbiAgICAgICAgICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSBuZXdCcmFuY2g7XG4gICAgICAgICAgICBzdXNwZW5zZS5wZW5kaW5nSWQrKztcbiAgICAgICAgICAgIHBhdGNoKG51bGwsIG5ld0JyYW5jaCwgc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIHN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpO1xuICAgICAgICAgICAgaWYgKHN1c3BlbnNlLmRlcHMgPD0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGluY29taW5nIGJyYW5jaCBoYXMgbm8gYXN5bmMgZGVwcywgcmVzb2x2ZSBub3cuXG4gICAgICAgICAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB0aW1lb3V0LCBwZW5kaW5nSWQgfSA9IHN1c3BlbnNlO1xuICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zZS5wZW5kaW5nSWQgPT09IHBlbmRpbmdJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNlLmZhbGxiYWNrKG5ld0ZhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRpbWVvdXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2UuZmFsbGJhY2sobmV3RmFsbGJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmxldCBoYXNXYXJuZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGNyZWF0ZVN1c3BlbnNlQm91bmRhcnkodm5vZGUsIHBhcmVudCwgcGFyZW50Q29tcG9uZW50LCBjb250YWluZXIsIGhpZGRlbkNvbnRhaW5lciwgYW5jaG9yLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzLCBpc0h5ZHJhdGluZyA9IGZhbHNlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhZmFsc2UgJiYgIWhhc1dhcm5lZCkge1xuICAgICAgICBoYXNXYXJuZWQgPSB0cnVlO1xuICAgICAgICAvLyBAdHMtaWdub3JlIGBjb25zb2xlLmluZm9gIGNhbm5vdCBiZSBudWxsIGVycm9yXG4gICAgICAgIGNvbnNvbGVbY29uc29sZS5pbmZvID8gJ2luZm8nIDogJ2xvZyddKGA8U3VzcGVuc2U+IGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBpdHMgQVBJIHdpbGwgbGlrZWx5IGNoYW5nZS5gKTtcbiAgICB9XG4gICAgY29uc3QgeyBwOiBwYXRjaCwgbTogbW92ZSwgdW06IHVubW91bnQsIG46IG5leHQsIG86IHsgcGFyZW50Tm9kZSwgcmVtb3ZlIH0gfSA9IHJlbmRlcmVySW50ZXJuYWxzO1xuICAgIGNvbnN0IHRpbWVvdXQgPSB2bm9kZS5wcm9wcyA/IHRvTnVtYmVyKHZub2RlLnByb3BzLnRpbWVvdXQpIDogdW5kZWZpbmVkO1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgYXNzZXJ0TnVtYmVyKHRpbWVvdXQsIGBTdXNwZW5zZSB0aW1lb3V0YCk7XG4gICAgfVxuICAgIGNvbnN0IHN1c3BlbnNlID0ge1xuICAgICAgICB2bm9kZSxcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIGlzU1ZHLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBkZXBzOiAwLFxuICAgICAgICBwZW5kaW5nSWQ6IDAsXG4gICAgICAgIHRpbWVvdXQ6IHR5cGVvZiB0aW1lb3V0ID09PSAnbnVtYmVyJyA/IHRpbWVvdXQgOiAtMSxcbiAgICAgICAgYWN0aXZlQnJhbmNoOiBudWxsLFxuICAgICAgICBwZW5kaW5nQnJhbmNoOiBudWxsLFxuICAgICAgICBpc0luRmFsbGJhY2s6IHRydWUsXG4gICAgICAgIGlzSHlkcmF0aW5nLFxuICAgICAgICBpc1VubW91bnRlZDogZmFsc2UsXG4gICAgICAgIGVmZmVjdHM6IFtdLFxuICAgICAgICByZXNvbHZlKHJlc3VtZSA9IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bWUgJiYgIXN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdXNwZW5zZS5yZXNvbHZlKCkgaXMgY2FsbGVkIHdpdGhvdXQgYSBwZW5kaW5nIGJyYW5jaC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNlLmlzVW5tb3VudGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc3VzcGVuc2UucmVzb2x2ZSgpIGlzIGNhbGxlZCBvbiBhbiBhbHJlYWR5IHVubW91bnRlZCBzdXNwZW5zZSBib3VuZGFyeS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IHZub2RlLCBhY3RpdmVCcmFuY2gsIHBlbmRpbmdCcmFuY2gsIHBlbmRpbmdJZCwgZWZmZWN0cywgcGFyZW50Q29tcG9uZW50LCBjb250YWluZXIgfSA9IHN1c3BlbnNlO1xuICAgICAgICAgICAgaWYgKHN1c3BlbnNlLmlzSHlkcmF0aW5nKSB7XG4gICAgICAgICAgICAgICAgc3VzcGVuc2UuaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFyZXN1bWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWxheUVudGVyID0gYWN0aXZlQnJhbmNoICYmXG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmdCcmFuY2gudHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nQnJhbmNoLnRyYW5zaXRpb24ubW9kZSA9PT0gJ291dC1pbic7XG4gICAgICAgICAgICAgICAgaWYgKGRlbGF5RW50ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlQnJhbmNoLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nSWQgPT09IHN1c3BlbnNlLnBlbmRpbmdJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUocGVuZGluZ0JyYW5jaCwgY29udGFpbmVyLCBhbmNob3IsIDAgLyogTW92ZVR5cGUuRU5URVIgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGluaXRpYWwgYW5jaG9yIG9uIG1vdW50XG4gICAgICAgICAgICAgICAgbGV0IHsgYW5jaG9yIH0gPSBzdXNwZW5zZTtcbiAgICAgICAgICAgICAgICAvLyB1bm1vdW50IGN1cnJlbnQgYWN0aXZlIHRyZWVcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlQnJhbmNoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBmYWxsYmFjayB0cmVlIHdhcyBtb3VudGVkLCBpdCBtYXkgaGF2ZSBiZWVuIG1vdmVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGFzIHBhcnQgb2YgYSBwYXJlbnQgc3VzcGVuc2UuIGdldCB0aGUgbGF0ZXN0IGFuY2hvciBmb3IgaW5zZXJ0aW9uXG4gICAgICAgICAgICAgICAgICAgIGFuY2hvciA9IG5leHQoYWN0aXZlQnJhbmNoKTtcbiAgICAgICAgICAgICAgICAgICAgdW5tb3VudChhY3RpdmVCcmFuY2gsIHBhcmVudENvbXBvbmVudCwgc3VzcGVuc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWRlbGF5RW50ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSBjb250ZW50IGZyb20gb2ZmLWRvbSBjb250YWluZXIgdG8gYWN0dWFsIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBtb3ZlKHBlbmRpbmdCcmFuY2gsIGNvbnRhaW5lciwgYW5jaG9yLCAwIC8qIE1vdmVUeXBlLkVOVEVSICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIHBlbmRpbmdCcmFuY2gpO1xuICAgICAgICAgICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IG51bGw7XG4gICAgICAgICAgICBzdXNwZW5zZS5pc0luRmFsbGJhY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIGZsdXNoIGJ1ZmZlcmVkIGVmZmVjdHNcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgcGVuZGluZyBwYXJlbnQgc3VzcGVuc2VcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBzdXNwZW5zZS5wYXJlbnQ7XG4gICAgICAgICAgICBsZXQgaGFzVW5yZXNvbHZlZEFuY2VzdG9yID0gZmFsc2U7XG4gICAgICAgICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudC5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIGEgcGVuZGluZyBwYXJlbnQgc3VzcGVuc2UsIG1lcmdlIGJ1ZmZlcmVkIHBvc3Qgam9ic1xuICAgICAgICAgICAgICAgICAgICAvLyBpbnRvIHRoYXQgcGFyZW50XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5lZmZlY3RzLnB1c2goLi4uZWZmZWN0cyk7XG4gICAgICAgICAgICAgICAgICAgIGhhc1VucmVzb2x2ZWRBbmNlc3RvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbm8gcGVuZGluZyBwYXJlbnQgc3VzcGVuc2UsIGZsdXNoIGFsbCBqb2JzXG4gICAgICAgICAgICBpZiAoIWhhc1VucmVzb2x2ZWRBbmNlc3Rvcikge1xuICAgICAgICAgICAgICAgIHF1ZXVlUG9zdEZsdXNoQ2IoZWZmZWN0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdXNwZW5zZS5lZmZlY3RzID0gW107XG4gICAgICAgICAgICAvLyBpbnZva2UgQHJlc29sdmUgZXZlbnRcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudCh2bm9kZSwgJ29uUmVzb2x2ZScpO1xuICAgICAgICB9LFxuICAgICAgICBmYWxsYmFjayhmYWxsYmFja1ZOb2RlKSB7XG4gICAgICAgICAgICBpZiAoIXN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IHZub2RlLCBhY3RpdmVCcmFuY2gsIHBhcmVudENvbXBvbmVudCwgY29udGFpbmVyLCBpc1NWRyB9ID0gc3VzcGVuc2U7XG4gICAgICAgICAgICAvLyBpbnZva2UgQGZhbGxiYWNrIGV2ZW50XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQodm5vZGUsICdvbkZhbGxiYWNrJyk7XG4gICAgICAgICAgICBjb25zdCBhbmNob3IgPSBuZXh0KGFjdGl2ZUJyYW5jaCk7XG4gICAgICAgICAgICBjb25zdCBtb3VudEZhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc3VzcGVuc2UuaXNJbkZhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gbW91bnQgdGhlIGZhbGxiYWNrIHRyZWVcbiAgICAgICAgICAgICAgICBwYXRjaChudWxsLCBmYWxsYmFja1ZOb2RlLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBudWxsLCAvLyBmYWxsYmFjayB0cmVlIHdpbGwgbm90IGhhdmUgc3VzcGVuc2UgY29udGV4dFxuICAgICAgICAgICAgICAgIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCk7XG4gICAgICAgICAgICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBmYWxsYmFja1ZOb2RlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBkZWxheUVudGVyID0gZmFsbGJhY2tWTm9kZS50cmFuc2l0aW9uICYmIGZhbGxiYWNrVk5vZGUudHJhbnNpdGlvbi5tb2RlID09PSAnb3V0LWluJztcbiAgICAgICAgICAgIGlmIChkZWxheUVudGVyKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlQnJhbmNoLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSA9IG1vdW50RmFsbGJhY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdXNwZW5zZS5pc0luRmFsbGJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgLy8gdW5tb3VudCBjdXJyZW50IGFjdGl2ZSBicmFuY2hcbiAgICAgICAgICAgIHVubW91bnQoYWN0aXZlQnJhbmNoLCBwYXJlbnRDb21wb25lbnQsIG51bGwsIC8vIG5vIHN1c3BlbnNlIHNvIHVubW91bnQgaG9va3MgZmlyZSBub3dcbiAgICAgICAgICAgIHRydWUgLy8gc2hvdWxkUmVtb3ZlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFkZWxheUVudGVyKSB7XG4gICAgICAgICAgICAgICAgbW91bnRGYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb3ZlKGNvbnRhaW5lciwgYW5jaG9yLCB0eXBlKSB7XG4gICAgICAgICAgICBzdXNwZW5zZS5hY3RpdmVCcmFuY2ggJiZcbiAgICAgICAgICAgICAgICBtb3ZlKHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCwgY29udGFpbmVyLCBhbmNob3IsIHR5cGUpO1xuICAgICAgICAgICAgc3VzcGVuc2UuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgICAgICB9LFxuICAgICAgICBuZXh0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCAmJiBuZXh0KHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZ2lzdGVyRGVwKGluc3RhbmNlLCBzZXR1cFJlbmRlckVmZmVjdCkge1xuICAgICAgICAgICAgY29uc3QgaXNJblBlbmRpbmdTdXNwZW5zZSA9ICEhc3VzcGVuc2UucGVuZGluZ0JyYW5jaDtcbiAgICAgICAgICAgIGlmIChpc0luUGVuZGluZ1N1c3BlbnNlKSB7XG4gICAgICAgICAgICAgICAgc3VzcGVuc2UuZGVwcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaHlkcmF0ZWRFbCA9IGluc3RhbmNlLnZub2RlLmVsO1xuICAgICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICAuYXN5bmNEZXAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCAwIC8qIEVycm9yQ29kZXMuU0VUVVBfRlVOQ1RJT04gKi8pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbihhc3luY1NldHVwUmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAvLyByZXRyeSB3aGVuIHRoZSBzZXR1cCgpIHByb21pc2UgcmVzb2x2ZXMuXG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50IG1heSBoYXZlIGJlZW4gdW5tb3VudGVkIGJlZm9yZSByZXNvbHZlLlxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5pc1VubW91bnRlZCB8fFxuICAgICAgICAgICAgICAgICAgICBzdXNwZW5zZS5pc1VubW91bnRlZCB8fFxuICAgICAgICAgICAgICAgICAgICBzdXNwZW5zZS5wZW5kaW5nSWQgIT09IGluc3RhbmNlLnN1c3BlbnNlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXRyeSBmcm9tIHRoaXMgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgaW5zdGFuY2UuYXN5bmNSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB2bm9kZSB9ID0gaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICBwdXNoV2FybmluZ0NvbnRleHQodm5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVTZXR1cFJlc3VsdChpbnN0YW5jZSwgYXN5bmNTZXR1cFJlc3VsdCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChoeWRyYXRlZEVsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHZub2RlIG1heSBoYXZlIGJlZW4gcmVwbGFjZWQgaWYgYW4gdXBkYXRlIGhhcHBlbmVkIGJlZm9yZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gYXN5bmMgZGVwIGlzIHJlc29sdmVkLlxuICAgICAgICAgICAgICAgICAgICB2bm9kZS5lbCA9IGh5ZHJhdGVkRWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gIWh5ZHJhdGVkRWwgJiYgaW5zdGFuY2Uuc3ViVHJlZS5lbDtcbiAgICAgICAgICAgICAgICBzZXR1cFJlbmRlckVmZmVjdChpbnN0YW5jZSwgdm5vZGUsIFxuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCBtYXkgaGF2ZSBiZWVuIG1vdmVkIGJlZm9yZSByZXNvbHZlLlxuICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgbm90IGEgaHlkcmF0aW9uLCBpbnN0YW5jZS5zdWJUcmVlIHdpbGwgYmUgdGhlIGNvbW1lbnRcbiAgICAgICAgICAgICAgICAvLyBwbGFjZWhvbGRlci5cbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlKGh5ZHJhdGVkRWwgfHwgaW5zdGFuY2Uuc3ViVHJlZS5lbCksIFxuICAgICAgICAgICAgICAgIC8vIGFuY2hvciB3aWxsIG5vdCBiZSB1c2VkIGlmIHRoaXMgaXMgaHlkcmF0aW9uLCBzbyBvbmx5IG5lZWQgdG9cbiAgICAgICAgICAgICAgICAvLyBjb25zaWRlciB0aGUgY29tbWVudCBwbGFjZWhvbGRlciBjYXNlLlxuICAgICAgICAgICAgICAgIGh5ZHJhdGVkRWwgPyBudWxsIDogbmV4dChpbnN0YW5jZS5zdWJUcmVlKSwgc3VzcGVuc2UsIGlzU1ZHLCBvcHRpbWl6ZWQpO1xuICAgICAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmUocGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cGRhdGVIT0NIb3N0RWwoaW5zdGFuY2UsIHZub2RlLmVsKTtcbiAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG9ubHkgZGVjcmVhc2UgZGVwcyBjb3VudCBpZiBzdXNwZW5zZSBpcyBub3QgYWxyZWFkeSByZXNvbHZlZFxuICAgICAgICAgICAgICAgIGlmIChpc0luUGVuZGluZ1N1c3BlbnNlICYmIC0tc3VzcGVuc2UuZGVwcyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHVubW91bnQocGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlKSB7XG4gICAgICAgICAgICBzdXNwZW5zZS5pc1VubW91bnRlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoc3VzcGVuc2UuYWN0aXZlQnJhbmNoKSB7XG4gICAgICAgICAgICAgICAgdW5tb3VudChzdXNwZW5zZS5hY3RpdmVCcmFuY2gsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICAgICAgICAgICAgdW5tb3VudChzdXNwZW5zZS5wZW5kaW5nQnJhbmNoLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBzdXNwZW5zZTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVTdXNwZW5zZShub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCByZW5kZXJlckludGVybmFscywgaHlkcmF0ZU5vZGUpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgKi9cbiAgICBjb25zdCBzdXNwZW5zZSA9ICh2bm9kZS5zdXNwZW5zZSA9IGNyZWF0ZVN1c3BlbnNlQm91bmRhcnkodm5vZGUsIHBhcmVudFN1c3BlbnNlLCBwYXJlbnRDb21wb25lbnQsIG5vZGUucGFyZW50Tm9kZSwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIG51bGwsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgcmVuZGVyZXJJbnRlcm5hbHMsIHRydWUgLyogaHlkcmF0aW5nICovKSk7XG4gICAgLy8gdGhlcmUgYXJlIHR3byBwb3NzaWJsZSBzY2VuYXJpb3MgZm9yIHNlcnZlci1yZW5kZXJlZCBzdXNwZW5zZTpcbiAgICAvLyAtIHN1Y2Nlc3M6IHNzciBjb250ZW50IHNob3VsZCBiZSBmdWxseSByZXNvbHZlZFxuICAgIC8vIC0gZmFpbHVyZTogc3NyIGNvbnRlbnQgc2hvdWxkIGJlIHRoZSBmYWxsYmFjayBicmFuY2guXG4gICAgLy8gaG93ZXZlciwgb24gdGhlIGNsaWVudCB3ZSBkb24ndCByZWFsbHkga25vdyBpZiBpdCBoYXMgZmFpbGVkIG9yIG5vdFxuICAgIC8vIGF0dGVtcHQgdG8gaHlkcmF0ZSB0aGUgRE9NIGFzc3VtaW5nIGl0IGhhcyBzdWNjZWVkZWQsIGJ1dCB3ZSBzdGlsbFxuICAgIC8vIG5lZWQgdG8gY29uc3RydWN0IGEgc3VzcGVuc2UgYm91bmRhcnkgZmlyc3RcbiAgICBjb25zdCByZXN1bHQgPSBoeWRyYXRlTm9kZShub2RlLCAoc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IHZub2RlLnNzQ29udGVudCksIHBhcmVudENvbXBvbmVudCwgc3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICBpZiAoc3VzcGVuc2UuZGVwcyA9PT0gMCkge1xuICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgKi9cbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN1c3BlbnNlQ2hpbGRyZW4odm5vZGUpIHtcbiAgICBjb25zdCB7IHNoYXBlRmxhZywgY2hpbGRyZW4gfSA9IHZub2RlO1xuICAgIGNvbnN0IGlzU2xvdENoaWxkcmVuID0gc2hhcGVGbGFnICYgMzIgLyogU2hhcGVGbGFncy5TTE9UU19DSElMRFJFTiAqLztcbiAgICB2bm9kZS5zc0NvbnRlbnQgPSBub3JtYWxpemVTdXNwZW5zZVNsb3QoaXNTbG90Q2hpbGRyZW4gPyBjaGlsZHJlbi5kZWZhdWx0IDogY2hpbGRyZW4pO1xuICAgIHZub2RlLnNzRmFsbGJhY2sgPSBpc1Nsb3RDaGlsZHJlblxuICAgICAgICA/IG5vcm1hbGl6ZVN1c3BlbnNlU2xvdChjaGlsZHJlbi5mYWxsYmFjaylcbiAgICAgICAgOiBjcmVhdGVWTm9kZShDb21tZW50KTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN1c3BlbnNlU2xvdChzKSB7XG4gICAgbGV0IGJsb2NrO1xuICAgIGlmIChpc0Z1bmN0aW9uKHMpKSB7XG4gICAgICAgIGNvbnN0IHRyYWNrQmxvY2sgPSBpc0Jsb2NrVHJlZUVuYWJsZWQgJiYgcy5fYztcbiAgICAgICAgaWYgKHRyYWNrQmxvY2spIHtcbiAgICAgICAgICAgIC8vIGRpc2FibGVUcmFja2luZzogZmFsc2VcbiAgICAgICAgICAgIC8vIGFsbG93IGJsb2NrIHRyYWNraW5nIGZvciBjb21waWxlZCBzbG90c1xuICAgICAgICAgICAgLy8gKHNlZSAuL2NvbXBvbmVudFJlbmRlckNvbnRleHQudHMpXG4gICAgICAgICAgICBzLl9kID0gZmFsc2U7XG4gICAgICAgICAgICBvcGVuQmxvY2soKTtcbiAgICAgICAgfVxuICAgICAgICBzID0gcygpO1xuICAgICAgICBpZiAodHJhY2tCbG9jaykge1xuICAgICAgICAgICAgcy5fZCA9IHRydWU7XG4gICAgICAgICAgICBibG9jayA9IGN1cnJlbnRCbG9jaztcbiAgICAgICAgICAgIGNsb3NlQmxvY2soKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNBcnJheShzKSkge1xuICAgICAgICBjb25zdCBzaW5nbGVDaGlsZCA9IGZpbHRlclNpbmdsZVJvb3Qocyk7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIXNpbmdsZUNoaWxkKSB7XG4gICAgICAgICAgICB3YXJuKGA8U3VzcGVuc2U+IHNsb3RzIGV4cGVjdCBhIHNpbmdsZSByb290IG5vZGUuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcyA9IHNpbmdsZUNoaWxkO1xuICAgIH1cbiAgICBzID0gbm9ybWFsaXplVk5vZGUocyk7XG4gICAgaWYgKGJsb2NrICYmICFzLmR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgICBzLmR5bmFtaWNDaGlsZHJlbiA9IGJsb2NrLmZpbHRlcihjID0+IGMgIT09IHMpO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn1cbmZ1bmN0aW9uIHF1ZXVlRWZmZWN0V2l0aFN1c3BlbnNlKGZuLCBzdXNwZW5zZSkge1xuICAgIGlmIChzdXNwZW5zZSAmJiBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICAgIGlmIChpc0FycmF5KGZuKSkge1xuICAgICAgICAgICAgc3VzcGVuc2UuZWZmZWN0cy5wdXNoKC4uLmZuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN1c3BlbnNlLmVmZmVjdHMucHVzaChmbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHF1ZXVlUG9zdEZsdXNoQ2IoZm4pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgYnJhbmNoKSB7XG4gICAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoID0gYnJhbmNoO1xuICAgIGNvbnN0IHsgdm5vZGUsIHBhcmVudENvbXBvbmVudCB9ID0gc3VzcGVuc2U7XG4gICAgY29uc3QgZWwgPSAodm5vZGUuZWwgPSBicmFuY2guZWwpO1xuICAgIC8vIGluIGNhc2Ugc3VzcGVuc2UgaXMgdGhlIHJvb3Qgbm9kZSBvZiBhIGNvbXBvbmVudCxcbiAgICAvLyByZWN1cnNpdmVseSB1cGRhdGUgdGhlIEhPQyBlbFxuICAgIGlmIChwYXJlbnRDb21wb25lbnQgJiYgcGFyZW50Q29tcG9uZW50LnN1YlRyZWUgPT09IHZub2RlKSB7XG4gICAgICAgIHBhcmVudENvbXBvbmVudC52bm9kZS5lbCA9IGVsO1xuICAgICAgICB1cGRhdGVIT0NIb3N0RWwocGFyZW50Q29tcG9uZW50LCBlbCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwcm92aWRlKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoIWN1cnJlbnRJbnN0YW5jZSkge1xuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICB3YXJuKGBwcm92aWRlKCkgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgc2V0dXAoKS5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IHByb3ZpZGVzID0gY3VycmVudEluc3RhbmNlLnByb3ZpZGVzO1xuICAgICAgICAvLyBieSBkZWZhdWx0IGFuIGluc3RhbmNlIGluaGVyaXRzIGl0cyBwYXJlbnQncyBwcm92aWRlcyBvYmplY3RcbiAgICAgICAgLy8gYnV0IHdoZW4gaXQgbmVlZHMgdG8gcHJvdmlkZSB2YWx1ZXMgb2YgaXRzIG93biwgaXQgY3JlYXRlcyBpdHNcbiAgICAgICAgLy8gb3duIHByb3ZpZGVzIG9iamVjdCB1c2luZyBwYXJlbnQgcHJvdmlkZXMgb2JqZWN0IGFzIHByb3RvdHlwZS5cbiAgICAgICAgLy8gdGhpcyB3YXkgaW4gYGluamVjdGAgd2UgY2FuIHNpbXBseSBsb29rIHVwIGluamVjdGlvbnMgZnJvbSBkaXJlY3RcbiAgICAgICAgLy8gcGFyZW50IGFuZCBsZXQgdGhlIHByb3RvdHlwZSBjaGFpbiBkbyB0aGUgd29yay5cbiAgICAgICAgY29uc3QgcGFyZW50UHJvdmlkZXMgPSBjdXJyZW50SW5zdGFuY2UucGFyZW50ICYmIGN1cnJlbnRJbnN0YW5jZS5wYXJlbnQucHJvdmlkZXM7XG4gICAgICAgIGlmIChwYXJlbnRQcm92aWRlcyA9PT0gcHJvdmlkZXMpIHtcbiAgICAgICAgICAgIHByb3ZpZGVzID0gY3VycmVudEluc3RhbmNlLnByb3ZpZGVzID0gT2JqZWN0LmNyZWF0ZShwYXJlbnRQcm92aWRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVFMgZG9lc24ndCBhbGxvdyBzeW1ib2wgYXMgaW5kZXggdHlwZVxuICAgICAgICBwcm92aWRlc1trZXldID0gdmFsdWU7XG4gICAgfVxufVxuZnVuY3Rpb24gaW5qZWN0KGtleSwgZGVmYXVsdFZhbHVlLCB0cmVhdERlZmF1bHRBc0ZhY3RvcnkgPSBmYWxzZSkge1xuICAgIC8vIGZhbGxiYWNrIHRvIGBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2VgIHNvIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGluXG4gICAgLy8gYSBmdW5jdGlvbmFsIGNvbXBvbmVudFxuICAgIGNvbnN0IGluc3RhbmNlID0gY3VycmVudEluc3RhbmNlIHx8IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTtcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgLy8gIzI0MDBcbiAgICAgICAgLy8gdG8gc3VwcG9ydCBgYXBwLnVzZWAgcGx1Z2lucyxcbiAgICAgICAgLy8gZmFsbGJhY2sgdG8gYXBwQ29udGV4dCdzIGBwcm92aWRlc2AgaWYgdGhlIGluc3RhbmNlIGlzIGF0IHJvb3RcbiAgICAgICAgY29uc3QgcHJvdmlkZXMgPSBpbnN0YW5jZS5wYXJlbnQgPT0gbnVsbFxuICAgICAgICAgICAgPyBpbnN0YW5jZS52bm9kZS5hcHBDb250ZXh0ICYmIGluc3RhbmNlLnZub2RlLmFwcENvbnRleHQucHJvdmlkZXNcbiAgICAgICAgICAgIDogaW5zdGFuY2UucGFyZW50LnByb3ZpZGVzO1xuICAgICAgICBpZiAocHJvdmlkZXMgJiYga2V5IGluIHByb3ZpZGVzKSB7XG4gICAgICAgICAgICAvLyBUUyBkb2Vzbid0IGFsbG93IHN5bWJvbCBhcyBpbmRleCB0eXBlXG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyZWF0RGVmYXVsdEFzRmFjdG9yeSAmJiBpc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSlcbiAgICAgICAgICAgICAgICA/IGRlZmF1bHRWYWx1ZS5jYWxsKGluc3RhbmNlLnByb3h5KVxuICAgICAgICAgICAgICAgIDogZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgd2FybihgaW5qZWN0aW9uIFwiJHtTdHJpbmcoa2V5KX1cIiBub3QgZm91bmQuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgIHdhcm4oYGluamVjdCgpIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHNldHVwKCkgb3IgZnVuY3Rpb25hbCBjb21wb25lbnRzLmApO1xuICAgIH1cbn1cblxuLy8gU2ltcGxlIGVmZmVjdC5cbmZ1bmN0aW9uIHdhdGNoRWZmZWN0KGVmZmVjdCwgb3B0aW9ucykge1xuICAgIHJldHVybiBkb1dhdGNoKGVmZmVjdCwgbnVsbCwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiB3YXRjaFBvc3RFZmZlY3QoZWZmZWN0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGRvV2F0Y2goZWZmZWN0LCBudWxsLCAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGZsdXNoOiAncG9zdCcgfSkgOiB7IGZsdXNoOiAncG9zdCcgfSk7XG59XG5mdW5jdGlvbiB3YXRjaFN5bmNFZmZlY3QoZWZmZWN0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGRvV2F0Y2goZWZmZWN0LCBudWxsLCAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGZsdXNoOiAnc3luYycgfSkgOiB7IGZsdXNoOiAnc3luYycgfSk7XG59XG4vLyBpbml0aWFsIHZhbHVlIGZvciB3YXRjaGVycyB0byB0cmlnZ2VyIG9uIHVuZGVmaW5lZCBpbml0aWFsIHZhbHVlc1xuY29uc3QgSU5JVElBTF9XQVRDSEVSX1ZBTFVFID0ge307XG4vLyBpbXBsZW1lbnRhdGlvblxuZnVuY3Rpb24gd2F0Y2goc291cmNlLCBjYiwgb3B0aW9ucykge1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgICAgIHdhcm4oYFxcYHdhdGNoKGZuLCBvcHRpb25zPylcXGAgc2lnbmF0dXJlIGhhcyBiZWVuIG1vdmVkIHRvIGEgc2VwYXJhdGUgQVBJLiBgICtcbiAgICAgICAgICAgIGBVc2UgXFxgd2F0Y2hFZmZlY3QoZm4sIG9wdGlvbnM/KVxcYCBpbnN0ZWFkLiBcXGB3YXRjaFxcYCBub3cgb25seSBgICtcbiAgICAgICAgICAgIGBzdXBwb3J0cyBcXGB3YXRjaChzb3VyY2UsIGNiLCBvcHRpb25zPykgc2lnbmF0dXJlLmApO1xuICAgIH1cbiAgICByZXR1cm4gZG9XYXRjaChzb3VyY2UsIGNiLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIGRvV2F0Y2goc291cmNlLCBjYiwgeyBpbW1lZGlhdGUsIGRlZXAsIGZsdXNoLCBvblRyYWNrLCBvblRyaWdnZXIgfSA9IEVNUFRZX09CSikge1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIWNiKSB7XG4gICAgICAgIGlmIChpbW1lZGlhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd2Fybihgd2F0Y2goKSBcImltbWVkaWF0ZVwiIG9wdGlvbiBpcyBvbmx5IHJlc3BlY3RlZCB3aGVuIHVzaW5nIHRoZSBgICtcbiAgICAgICAgICAgICAgICBgd2F0Y2goc291cmNlLCBjYWxsYmFjaywgb3B0aW9ucz8pIHNpZ25hdHVyZS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVlcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3YXJuKGB3YXRjaCgpIFwiZGVlcFwiIG9wdGlvbiBpcyBvbmx5IHJlc3BlY3RlZCB3aGVuIHVzaW5nIHRoZSBgICtcbiAgICAgICAgICAgICAgICBgd2F0Y2goc291cmNlLCBjYWxsYmFjaywgb3B0aW9ucz8pIHNpZ25hdHVyZS5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB3YXJuSW52YWxpZFNvdXJjZSA9IChzKSA9PiB7XG4gICAgICAgIHdhcm4oYEludmFsaWQgd2F0Y2ggc291cmNlOiBgLCBzLCBgQSB3YXRjaCBzb3VyY2UgY2FuIG9ubHkgYmUgYSBnZXR0ZXIvZWZmZWN0IGZ1bmN0aW9uLCBhIHJlZiwgYCArXG4gICAgICAgICAgICBgYSByZWFjdGl2ZSBvYmplY3QsIG9yIGFuIGFycmF5IG9mIHRoZXNlIHR5cGVzLmApO1xuICAgIH07XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50U2NvcGUoKSA9PT0gKGN1cnJlbnRJbnN0YW5jZSA9PT0gbnVsbCB8fCBjdXJyZW50SW5zdGFuY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN1cnJlbnRJbnN0YW5jZS5zY29wZSkgPyBjdXJyZW50SW5zdGFuY2UgOiBudWxsO1xuICAgIC8vIGNvbnN0IGluc3RhbmNlID0gY3VycmVudEluc3RhbmNlXG4gICAgbGV0IGdldHRlcjtcbiAgICBsZXQgZm9yY2VUcmlnZ2VyID0gZmFsc2U7XG4gICAgbGV0IGlzTXVsdGlTb3VyY2UgPSBmYWxzZTtcbiAgICBpZiAoaXNSZWYoc291cmNlKSkge1xuICAgICAgICBnZXR0ZXIgPSAoKSA9PiBzb3VyY2UudmFsdWU7XG4gICAgICAgIGZvcmNlVHJpZ2dlciA9IGlzU2hhbGxvdyQxKHNvdXJjZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzUmVhY3RpdmUoc291cmNlKSkge1xuICAgICAgICBnZXR0ZXIgPSAoKSA9PiBzb3VyY2U7XG4gICAgICAgIGRlZXAgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgaXNNdWx0aVNvdXJjZSA9IHRydWU7XG4gICAgICAgIGZvcmNlVHJpZ2dlciA9IHNvdXJjZS5zb21lKHMgPT4gaXNSZWFjdGl2ZShzKSB8fCBpc1NoYWxsb3ckMShzKSk7XG4gICAgICAgIGdldHRlciA9ICgpID0+IHNvdXJjZS5tYXAocyA9PiB7XG4gICAgICAgICAgICBpZiAoaXNSZWYocykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcy52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzUmVhY3RpdmUocykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhdmVyc2Uocyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0Z1bmN0aW9uKHMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhzLCBpbnN0YW5jZSwgMiAvKiBFcnJvckNvZGVzLldBVENIX0dFVFRFUiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgd2FybkludmFsaWRTb3VyY2Uocyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0Z1bmN0aW9uKHNvdXJjZSkpIHtcbiAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICAvLyBnZXR0ZXIgd2l0aCBjYlxuICAgICAgICAgICAgZ2V0dGVyID0gKCkgPT4gY2FsbFdpdGhFcnJvckhhbmRsaW5nKHNvdXJjZSwgaW5zdGFuY2UsIDIgLyogRXJyb3JDb2Rlcy5XQVRDSF9HRVRURVIgKi8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gbm8gY2IgLT4gc2ltcGxlIGVmZmVjdFxuICAgICAgICAgICAgZ2V0dGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5pc1VubW91bnRlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKHNvdXJjZSwgaW5zdGFuY2UsIDMgLyogRXJyb3JDb2Rlcy5XQVRDSF9DQUxMQkFDSyAqLywgW29uQ2xlYW51cF0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZ2V0dGVyID0gTk9PUDtcbiAgICAgICAgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIHdhcm5JbnZhbGlkU291cmNlKHNvdXJjZSk7XG4gICAgfVxuICAgIGlmIChjYiAmJiBkZWVwKSB7XG4gICAgICAgIGNvbnN0IGJhc2VHZXR0ZXIgPSBnZXR0ZXI7XG4gICAgICAgIGdldHRlciA9ICgpID0+IHRyYXZlcnNlKGJhc2VHZXR0ZXIoKSk7XG4gICAgfVxuICAgIGxldCBjbGVhbnVwO1xuICAgIGxldCBvbkNsZWFudXAgPSAoZm4pID0+IHtcbiAgICAgICAgY2xlYW51cCA9IGVmZmVjdC5vblN0b3AgPSAoKSA9PiB7XG4gICAgICAgICAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoZm4sIGluc3RhbmNlLCA0IC8qIEVycm9yQ29kZXMuV0FUQ0hfQ0xFQU5VUCAqLyk7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvLyBpbiBTU1IgdGhlcmUgaXMgbm8gbmVlZCB0byBzZXR1cCBhbiBhY3R1YWwgZWZmZWN0LCBhbmQgaXQgc2hvdWxkIGJlIG5vb3BcbiAgICAvLyB1bmxlc3MgaXQncyBlYWdlciBvciBzeW5jIGZsdXNoXG4gICAgbGV0IHNzckNsZWFudXA7XG4gICAgaWYgKGlzSW5TU1JDb21wb25lbnRTZXR1cCkge1xuICAgICAgICAvLyB3ZSB3aWxsIGFsc28gbm90IGNhbGwgdGhlIGludmFsaWRhdGUgY2FsbGJhY2sgKCsgcnVubmVyIGlzIG5vdCBzZXQgdXApXG4gICAgICAgIG9uQ2xlYW51cCA9IE5PT1A7XG4gICAgICAgIGlmICghY2IpIHtcbiAgICAgICAgICAgIGdldHRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGltbWVkaWF0ZSkge1xuICAgICAgICAgICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoY2IsIGluc3RhbmNlLCAzIC8qIEVycm9yQ29kZXMuV0FUQ0hfQ0FMTEJBQ0sgKi8sIFtcbiAgICAgICAgICAgICAgICBnZXR0ZXIoKSxcbiAgICAgICAgICAgICAgICBpc011bHRpU291cmNlID8gW10gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgb25DbGVhbnVwXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmx1c2ggPT09ICdzeW5jJykge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdXNlU1NSQ29udGV4dCgpO1xuICAgICAgICAgICAgc3NyQ2xlYW51cCA9IGN0eC5fX3dhdGNoZXJIYW5kbGVzIHx8IChjdHguX193YXRjaGVySGFuZGxlcyA9IFtdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBOT09QO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBvbGRWYWx1ZSA9IGlzTXVsdGlTb3VyY2VcbiAgICAgICAgPyBuZXcgQXJyYXkoc291cmNlLmxlbmd0aCkuZmlsbChJTklUSUFMX1dBVENIRVJfVkFMVUUpXG4gICAgICAgIDogSU5JVElBTF9XQVRDSEVSX1ZBTFVFO1xuICAgIGNvbnN0IGpvYiA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFlZmZlY3QuYWN0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICAvLyB3YXRjaChzb3VyY2UsIGNiKVxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBlZmZlY3QucnVuKCk7XG4gICAgICAgICAgICBpZiAoZGVlcCB8fFxuICAgICAgICAgICAgICAgIGZvcmNlVHJpZ2dlciB8fFxuICAgICAgICAgICAgICAgIChpc011bHRpU291cmNlXG4gICAgICAgICAgICAgICAgICAgID8gbmV3VmFsdWUuc29tZSgodiwgaSkgPT4gaGFzQ2hhbmdlZCh2LCBvbGRWYWx1ZVtpXSkpXG4gICAgICAgICAgICAgICAgICAgIDogaGFzQ2hhbmdlZChuZXdWYWx1ZSwgb2xkVmFsdWUpKSB8fFxuICAgICAgICAgICAgICAgIChmYWxzZSAgKSkge1xuICAgICAgICAgICAgICAgIC8vIGNsZWFudXAgYmVmb3JlIHJ1bm5pbmcgY2IgYWdhaW5cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGNiLCBpbnN0YW5jZSwgMyAvKiBFcnJvckNvZGVzLldBVENIX0NBTExCQUNLICovLCBbXG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIHVuZGVmaW5lZCBhcyB0aGUgb2xkIHZhbHVlIHdoZW4gaXQncyBjaGFuZ2VkIGZvciB0aGUgZmlyc3QgdGltZVxuICAgICAgICAgICAgICAgICAgICBvbGRWYWx1ZSA9PT0gSU5JVElBTF9XQVRDSEVSX1ZBTFVFXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpc011bHRpU291cmNlICYmIG9sZFZhbHVlWzBdID09PSBJTklUSUFMX1dBVENIRVJfVkFMVUVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvbGRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgb25DbGVhbnVwXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgb2xkVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHdhdGNoRWZmZWN0XG4gICAgICAgICAgICBlZmZlY3QucnVuKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIGltcG9ydGFudDogbWFyayB0aGUgam9iIGFzIGEgd2F0Y2hlciBjYWxsYmFjayBzbyB0aGF0IHNjaGVkdWxlciBrbm93c1xuICAgIC8vIGl0IGlzIGFsbG93ZWQgdG8gc2VsZi10cmlnZ2VyICgjMTcyNylcbiAgICBqb2IuYWxsb3dSZWN1cnNlID0gISFjYjtcbiAgICBsZXQgc2NoZWR1bGVyO1xuICAgIGlmIChmbHVzaCA9PT0gJ3N5bmMnKSB7XG4gICAgICAgIHNjaGVkdWxlciA9IGpvYjsgLy8gdGhlIHNjaGVkdWxlciBmdW5jdGlvbiBnZXRzIGNhbGxlZCBkaXJlY3RseVxuICAgIH1cbiAgICBlbHNlIGlmIChmbHVzaCA9PT0gJ3Bvc3QnKSB7XG4gICAgICAgIHNjaGVkdWxlciA9ICgpID0+IHF1ZXVlUG9zdFJlbmRlckVmZmVjdChqb2IsIGluc3RhbmNlICYmIGluc3RhbmNlLnN1c3BlbnNlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIGRlZmF1bHQ6ICdwcmUnXG4gICAgICAgIGpvYi5wcmUgPSB0cnVlO1xuICAgICAgICBpZiAoaW5zdGFuY2UpXG4gICAgICAgICAgICBqb2IuaWQgPSBpbnN0YW5jZS51aWQ7XG4gICAgICAgIHNjaGVkdWxlciA9ICgpID0+IHF1ZXVlSm9iKGpvYik7XG4gICAgfVxuICAgIGNvbnN0IGVmZmVjdCA9IG5ldyBSZWFjdGl2ZUVmZmVjdChnZXR0ZXIsIHNjaGVkdWxlcik7XG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICBlZmZlY3Qub25UcmFjayA9IG9uVHJhY2s7XG4gICAgICAgIGVmZmVjdC5vblRyaWdnZXIgPSBvblRyaWdnZXI7XG4gICAgfVxuICAgIC8vIGluaXRpYWwgcnVuXG4gICAgaWYgKGNiKSB7XG4gICAgICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgICAgICAgIGpvYigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb2xkVmFsdWUgPSBlZmZlY3QucnVuKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZmx1c2ggPT09ICdwb3N0Jykge1xuICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoZWZmZWN0LnJ1bi5iaW5kKGVmZmVjdCksIGluc3RhbmNlICYmIGluc3RhbmNlLnN1c3BlbnNlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVmZmVjdC5ydW4oKTtcbiAgICB9XG4gICAgY29uc3QgdW53YXRjaCA9ICgpID0+IHtcbiAgICAgICAgZWZmZWN0LnN0b3AoKTtcbiAgICAgICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLnNjb3BlKSB7XG4gICAgICAgICAgICByZW1vdmUoaW5zdGFuY2Uuc2NvcGUuZWZmZWN0cywgZWZmZWN0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWYgKHNzckNsZWFudXApXG4gICAgICAgIHNzckNsZWFudXAucHVzaCh1bndhdGNoKTtcbiAgICByZXR1cm4gdW53YXRjaDtcbn1cbi8vIHRoaXMuJHdhdGNoXG5mdW5jdGlvbiBpbnN0YW5jZVdhdGNoKHNvdXJjZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBwdWJsaWNUaGlzID0gdGhpcy5wcm94eTtcbiAgICBjb25zdCBnZXR0ZXIgPSBpc1N0cmluZyhzb3VyY2UpXG4gICAgICAgID8gc291cmNlLmluY2x1ZGVzKCcuJylcbiAgICAgICAgICAgID8gY3JlYXRlUGF0aEdldHRlcihwdWJsaWNUaGlzLCBzb3VyY2UpXG4gICAgICAgICAgICA6ICgpID0+IHB1YmxpY1RoaXNbc291cmNlXVxuICAgICAgICA6IHNvdXJjZS5iaW5kKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpO1xuICAgIGxldCBjYjtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgY2IgPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNiID0gdmFsdWUuaGFuZGxlcjtcbiAgICAgICAgb3B0aW9ucyA9IHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBjdXIgPSBjdXJyZW50SW5zdGFuY2U7XG4gICAgc2V0Q3VycmVudEluc3RhbmNlKHRoaXMpO1xuICAgIGNvbnN0IHJlcyA9IGRvV2F0Y2goZ2V0dGVyLCBjYi5iaW5kKHB1YmxpY1RoaXMpLCBvcHRpb25zKTtcbiAgICBpZiAoY3VyKSB7XG4gICAgICAgIHNldEN1cnJlbnRJbnN0YW5jZShjdXIpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdW5zZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhdGhHZXR0ZXIoY3R4LCBwYXRoKSB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgbGV0IGN1ciA9IGN0eDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGggJiYgY3VyOyBpKyspIHtcbiAgICAgICAgICAgIGN1ciA9IGN1cltzZWdtZW50c1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cjtcbiAgICB9O1xufVxuZnVuY3Rpb24gdHJhdmVyc2UodmFsdWUsIHNlZW4pIHtcbiAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCB2YWx1ZVtcIl9fdl9za2lwXCIgLyogUmVhY3RpdmVGbGFncy5TS0lQICovXSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHNlZW4gPSBzZWVuIHx8IG5ldyBTZXQoKTtcbiAgICBpZiAoc2Vlbi5oYXModmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgIGlmIChpc1JlZih2YWx1ZSkpIHtcbiAgICAgICAgdHJhdmVyc2UodmFsdWUudmFsdWUsIHNlZW4pO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0cmF2ZXJzZSh2YWx1ZVtpXSwgc2Vlbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTZXQodmFsdWUpIHx8IGlzTWFwKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgICB0cmF2ZXJzZSh2LCBzZWVuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICAgICAgICB0cmF2ZXJzZSh2YWx1ZVtrZXldLCBzZWVuKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb25TdGF0ZSgpIHtcbiAgICBjb25zdCBzdGF0ZSA9IHtcbiAgICAgICAgaXNNb3VudGVkOiBmYWxzZSxcbiAgICAgICAgaXNMZWF2aW5nOiBmYWxzZSxcbiAgICAgICAgaXNVbm1vdW50aW5nOiBmYWxzZSxcbiAgICAgICAgbGVhdmluZ1ZOb2RlczogbmV3IE1hcCgpXG4gICAgfTtcbiAgICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgICAgICBzdGF0ZS5pc01vdW50ZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XG4gICAgICAgIHN0YXRlLmlzVW5tb3VudGluZyA9IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0YXRlO1xufVxuY29uc3QgVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IgPSBbRnVuY3Rpb24sIEFycmF5XTtcbmNvbnN0IEJhc2VUcmFuc2l0aW9uSW1wbCA9IHtcbiAgICBuYW1lOiBgQmFzZVRyYW5zaXRpb25gLFxuICAgIHByb3BzOiB7XG4gICAgICAgIG1vZGU6IFN0cmluZyxcbiAgICAgICAgYXBwZWFyOiBCb29sZWFuLFxuICAgICAgICBwZXJzaXN0ZWQ6IEJvb2xlYW4sXG4gICAgICAgIC8vIGVudGVyXG4gICAgICAgIG9uQmVmb3JlRW50ZXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICAgICAgICBvbkVudGVyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgICAgICAgb25BZnRlckVudGVyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgICAgICAgb25FbnRlckNhbmNlbGxlZDogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gICAgICAgIC8vIGxlYXZlXG4gICAgICAgIG9uQmVmb3JlTGVhdmU6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICAgICAgICBvbkxlYXZlOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgICAgICAgb25BZnRlckxlYXZlOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgICAgICAgb25MZWF2ZUNhbmNlbGxlZDogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gICAgICAgIC8vIGFwcGVhclxuICAgICAgICBvbkJlZm9yZUFwcGVhcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gICAgICAgIG9uQXBwZWFyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgICAgICAgb25BZnRlckFwcGVhcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gICAgICAgIG9uQXBwZWFyQ2FuY2VsbGVkOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvclxuICAgIH0sXG4gICAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHVzZVRyYW5zaXRpb25TdGF0ZSgpO1xuICAgICAgICBsZXQgcHJldlRyYW5zaXRpb25LZXk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHNsb3RzLmRlZmF1bHQgJiYgZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuKHNsb3RzLmRlZmF1bHQoKSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBjaGlsZHJlblswXTtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhc0ZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gbG9jYXRlIGZpcnN0IG5vbi1jb21tZW50IGNoaWxkXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjLnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgaGFzRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXJuIG1vcmUgdGhhbiBvbmUgbm9uLWNvbW1lbnQgY2hpbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuKCc8dHJhbnNpdGlvbj4gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIHNpbmdsZSBlbGVtZW50IG9yIGNvbXBvbmVudC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVc2UgPHRyYW5zaXRpb24tZ3JvdXA+IGZvciBsaXN0cy4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gYztcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0ZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGhlcmUncyBubyBuZWVkIHRvIHRyYWNrIHJlYWN0aXZpdHkgZm9yIHRoZXNlIHByb3BzIHNvIHVzZSB0aGUgcmF3XG4gICAgICAgICAgICAvLyBwcm9wcyBmb3IgYSBiaXQgYmV0dGVyIHBlcmZcbiAgICAgICAgICAgIGNvbnN0IHJhd1Byb3BzID0gdG9SYXcocHJvcHMpO1xuICAgICAgICAgICAgY29uc3QgeyBtb2RlIH0gPSByYXdQcm9wcztcbiAgICAgICAgICAgIC8vIGNoZWNrIG1vZGVcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiZcbiAgICAgICAgICAgICAgICBtb2RlICYmXG4gICAgICAgICAgICAgICAgbW9kZSAhPT0gJ2luLW91dCcgJiZcbiAgICAgICAgICAgICAgICBtb2RlICE9PSAnb3V0LWluJyAmJlxuICAgICAgICAgICAgICAgIG1vZGUgIT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgICAgIHdhcm4oYGludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICR7bW9kZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZS5pc0xlYXZpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHlQbGFjZWhvbGRlcihjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiA8dHJhbnNpdGlvbj48a2VlcC1hbGl2ZS8+PC90cmFuc2l0aW9uPiwgd2UgbmVlZCB0b1xuICAgICAgICAgICAgLy8gY29tcGFyZSB0aGUgdHlwZSBvZiB0aGUga2VwdC1hbGl2ZSBjaGlsZHJlbi5cbiAgICAgICAgICAgIGNvbnN0IGlubmVyQ2hpbGQgPSBnZXRLZWVwQWxpdmVDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICBpZiAoIWlubmVyQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHlQbGFjZWhvbGRlcihjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbnRlckhvb2tzID0gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhpbm5lckNoaWxkLCByYXdQcm9wcywgc3RhdGUsIGluc3RhbmNlKTtcbiAgICAgICAgICAgIHNldFRyYW5zaXRpb25Ib29rcyhpbm5lckNoaWxkLCBlbnRlckhvb2tzKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZENoaWxkID0gaW5zdGFuY2Uuc3ViVHJlZTtcbiAgICAgICAgICAgIGNvbnN0IG9sZElubmVyQ2hpbGQgPSBvbGRDaGlsZCAmJiBnZXRLZWVwQWxpdmVDaGlsZChvbGRDaGlsZCk7XG4gICAgICAgICAgICBsZXQgdHJhbnNpdGlvbktleUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHsgZ2V0VHJhbnNpdGlvbktleSB9ID0gaW5uZXJDaGlsZC50eXBlO1xuICAgICAgICAgICAgaWYgKGdldFRyYW5zaXRpb25LZXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBnZXRUcmFuc2l0aW9uS2V5KCk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZUcmFuc2l0aW9uS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldlRyYW5zaXRpb25LZXkgPSBrZXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleSAhPT0gcHJldlRyYW5zaXRpb25LZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldlRyYW5zaXRpb25LZXkgPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25LZXlDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBoYW5kbGUgbW9kZVxuICAgICAgICAgICAgaWYgKG9sZElubmVyQ2hpbGQgJiZcbiAgICAgICAgICAgICAgICBvbGRJbm5lckNoaWxkLnR5cGUgIT09IENvbW1lbnQgJiZcbiAgICAgICAgICAgICAgICAoIWlzU2FtZVZOb2RlVHlwZShpbm5lckNoaWxkLCBvbGRJbm5lckNoaWxkKSB8fCB0cmFuc2l0aW9uS2V5Q2hhbmdlZCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsZWF2aW5nSG9va3MgPSByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKG9sZElubmVyQ2hpbGQsIHJhd1Byb3BzLCBzdGF0ZSwgaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBvbGQgdHJlZSdzIGhvb2tzIGluIGNhc2Ugb2YgZHluYW1pYyB0cmFuc2l0aW9uXG4gICAgICAgICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKG9sZElubmVyQ2hpbGQsIGxlYXZpbmdIb29rcyk7XG4gICAgICAgICAgICAgICAgLy8gc3dpdGNoaW5nIGJldHdlZW4gZGlmZmVyZW50IHZpZXdzXG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdvdXQtaW4nKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmlzTGVhdmluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBwbGFjZWhvbGRlciBub2RlIGFuZCBxdWV1ZSB1cGRhdGUgd2hlbiBsZWF2ZSBmaW5pc2hlc1xuICAgICAgICAgICAgICAgICAgICBsZWF2aW5nSG9va3MuYWZ0ZXJMZWF2ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmlzTGVhdmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIzY4MzVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGFsc28gbmVlZHMgdG8gYmUgdXBkYXRlZCB3aGVuIGFjdGl2ZSBpcyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS51cGRhdGUuYWN0aXZlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHlQbGFjZWhvbGRlcihjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vZGUgPT09ICdpbi1vdXQnICYmIGlubmVyQ2hpbGQudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZWF2aW5nSG9va3MuZGVsYXlMZWF2ZSA9IChlbCwgZWFybHlSZW1vdmUsIGRlbGF5ZWRMZWF2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVhdmluZ1ZOb2Rlc0NhY2hlID0gZ2V0TGVhdmluZ05vZGVzRm9yVHlwZShzdGF0ZSwgb2xkSW5uZXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nVk5vZGVzQ2FjaGVbU3RyaW5nKG9sZElubmVyQ2hpbGQua2V5KV0gPSBvbGRJbm5lckNoaWxkO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWFybHkgcmVtb3ZhbCBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuX2xlYXZlQ2IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFybHlSZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5fbGVhdmVDYiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZW50ZXJIb29rcy5kZWxheWVkTGVhdmU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50ZXJIb29rcy5kZWxheWVkTGVhdmUgPSBkZWxheWVkTGVhdmU7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICB9O1xuICAgIH1cbn07XG4vLyBleHBvcnQgdGhlIHB1YmxpYyB0eXBlIGZvciBoL3RzeCBpbmZlcmVuY2Vcbi8vIGFsc28gdG8gYXZvaWQgaW5saW5lIGltcG9ydCgpIGluIGdlbmVyYXRlZCBkLnRzIGZpbGVzXG5jb25zdCBCYXNlVHJhbnNpdGlvbiA9IEJhc2VUcmFuc2l0aW9uSW1wbDtcbmZ1bmN0aW9uIGdldExlYXZpbmdOb2Rlc0ZvclR5cGUoc3RhdGUsIHZub2RlKSB7XG4gICAgY29uc3QgeyBsZWF2aW5nVk5vZGVzIH0gPSBzdGF0ZTtcbiAgICBsZXQgbGVhdmluZ1ZOb2Rlc0NhY2hlID0gbGVhdmluZ1ZOb2Rlcy5nZXQodm5vZGUudHlwZSk7XG4gICAgaWYgKCFsZWF2aW5nVk5vZGVzQ2FjaGUpIHtcbiAgICAgICAgbGVhdmluZ1ZOb2Rlc0NhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbGVhdmluZ1ZOb2Rlcy5zZXQodm5vZGUudHlwZSwgbGVhdmluZ1ZOb2Rlc0NhY2hlKTtcbiAgICB9XG4gICAgcmV0dXJuIGxlYXZpbmdWTm9kZXNDYWNoZTtcbn1cbi8vIFRoZSB0cmFuc2l0aW9uIGhvb2tzIGFyZSBhdHRhY2hlZCB0byB0aGUgdm5vZGUgYXMgdm5vZGUudHJhbnNpdGlvblxuLy8gYW5kIHdpbGwgYmUgY2FsbGVkIGF0IGFwcHJvcHJpYXRlIHRpbWluZyBpbiB0aGUgcmVuZGVyZXIuXG5mdW5jdGlvbiByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKHZub2RlLCBwcm9wcywgc3RhdGUsIGluc3RhbmNlKSB7XG4gICAgY29uc3QgeyBhcHBlYXIsIG1vZGUsIHBlcnNpc3RlZCA9IGZhbHNlLCBvbkJlZm9yZUVudGVyLCBvbkVudGVyLCBvbkFmdGVyRW50ZXIsIG9uRW50ZXJDYW5jZWxsZWQsIG9uQmVmb3JlTGVhdmUsIG9uTGVhdmUsIG9uQWZ0ZXJMZWF2ZSwgb25MZWF2ZUNhbmNlbGxlZCwgb25CZWZvcmVBcHBlYXIsIG9uQXBwZWFyLCBvbkFmdGVyQXBwZWFyLCBvbkFwcGVhckNhbmNlbGxlZCB9ID0gcHJvcHM7XG4gICAgY29uc3Qga2V5ID0gU3RyaW5nKHZub2RlLmtleSk7XG4gICAgY29uc3QgbGVhdmluZ1ZOb2Rlc0NhY2hlID0gZ2V0TGVhdmluZ05vZGVzRm9yVHlwZShzdGF0ZSwgdm5vZGUpO1xuICAgIGNvbnN0IGNhbGxIb29rID0gKGhvb2ssIGFyZ3MpID0+IHtcbiAgICAgICAgaG9vayAmJlxuICAgICAgICAgICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoaG9vaywgaW5zdGFuY2UsIDkgLyogRXJyb3JDb2Rlcy5UUkFOU0lUSU9OX0hPT0sgKi8sIGFyZ3MpO1xuICAgIH07XG4gICAgY29uc3QgY2FsbEFzeW5jSG9vayA9IChob29rLCBhcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IGRvbmUgPSBhcmdzWzFdO1xuICAgICAgICBjYWxsSG9vayhob29rLCBhcmdzKTtcbiAgICAgICAgaWYgKGlzQXJyYXkoaG9vaykpIHtcbiAgICAgICAgICAgIGlmIChob29rLmV2ZXJ5KGhvb2sgPT4gaG9vay5sZW5ndGggPD0gMSkpXG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGhvb2subGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgaG9va3MgPSB7XG4gICAgICAgIG1vZGUsXG4gICAgICAgIHBlcnNpc3RlZCxcbiAgICAgICAgYmVmb3JlRW50ZXIoZWwpIHtcbiAgICAgICAgICAgIGxldCBob29rID0gb25CZWZvcmVFbnRlcjtcbiAgICAgICAgICAgIGlmICghc3RhdGUuaXNNb3VudGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGVhcikge1xuICAgICAgICAgICAgICAgICAgICBob29rID0gb25CZWZvcmVBcHBlYXIgfHwgb25CZWZvcmVFbnRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmb3Igc2FtZSBlbGVtZW50ICh2LXNob3cpXG4gICAgICAgICAgICBpZiAoZWwuX2xlYXZlQ2IpIHtcbiAgICAgICAgICAgICAgICBlbC5fbGVhdmVDYih0cnVlIC8qIGNhbmNlbGxlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmb3IgdG9nZ2xlZCBlbGVtZW50IHdpdGggc2FtZSBrZXkgKHYtaWYpXG4gICAgICAgICAgICBjb25zdCBsZWF2aW5nVk5vZGUgPSBsZWF2aW5nVk5vZGVzQ2FjaGVba2V5XTtcbiAgICAgICAgICAgIGlmIChsZWF2aW5nVk5vZGUgJiZcbiAgICAgICAgICAgICAgICBpc1NhbWVWTm9kZVR5cGUodm5vZGUsIGxlYXZpbmdWTm9kZSkgJiZcbiAgICAgICAgICAgICAgICBsZWF2aW5nVk5vZGUuZWwuX2xlYXZlQ2IpIHtcbiAgICAgICAgICAgICAgICAvLyBmb3JjZSBlYXJseSByZW1vdmFsIChub3QgY2FuY2VsbGVkKVxuICAgICAgICAgICAgICAgIGxlYXZpbmdWTm9kZS5lbC5fbGVhdmVDYigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbEhvb2soaG9vaywgW2VsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudGVyKGVsKSB7XG4gICAgICAgICAgICBsZXQgaG9vayA9IG9uRW50ZXI7XG4gICAgICAgICAgICBsZXQgYWZ0ZXJIb29rID0gb25BZnRlckVudGVyO1xuICAgICAgICAgICAgbGV0IGNhbmNlbEhvb2sgPSBvbkVudGVyQ2FuY2VsbGVkO1xuICAgICAgICAgICAgaWYgKCFzdGF0ZS5pc01vdW50ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXBwZWFyKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvb2sgPSBvbkFwcGVhciB8fCBvbkVudGVyO1xuICAgICAgICAgICAgICAgICAgICBhZnRlckhvb2sgPSBvbkFmdGVyQXBwZWFyIHx8IG9uQWZ0ZXJFbnRlcjtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsSG9vayA9IG9uQXBwZWFyQ2FuY2VsbGVkIHx8IG9uRW50ZXJDYW5jZWxsZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgZG9uZSA9IChlbC5fZW50ZXJDYiA9IChjYW5jZWxsZWQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxIb29rKGNhbmNlbEhvb2ssIFtlbF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbEhvb2soYWZ0ZXJIb29rLCBbZWxdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhvb2tzLmRlbGF5ZWRMZWF2ZSkge1xuICAgICAgICAgICAgICAgICAgICBob29rcy5kZWxheWVkTGVhdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWwuX2VudGVyQ2IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChob29rKSB7XG4gICAgICAgICAgICAgICAgY2FsbEFzeW5jSG9vayhob29rLCBbZWwsIGRvbmVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbGVhdmUoZWwsIHJlbW92ZSkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHZub2RlLmtleSk7XG4gICAgICAgICAgICBpZiAoZWwuX2VudGVyQ2IpIHtcbiAgICAgICAgICAgICAgICBlbC5fZW50ZXJDYih0cnVlIC8qIGNhbmNlbGxlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUuaXNVbm1vdW50aW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbEhvb2sob25CZWZvcmVMZWF2ZSwgW2VsXSk7XG4gICAgICAgICAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBkb25lID0gKGVsLl9sZWF2ZUNiID0gKGNhbmNlbGxlZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjYWxsZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbEhvb2sob25MZWF2ZUNhbmNlbGxlZCwgW2VsXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsSG9vayhvbkFmdGVyTGVhdmUsIFtlbF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbC5fbGVhdmVDYiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAobGVhdmluZ1ZOb2Rlc0NhY2hlW2tleV0gPT09IHZub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsZWF2aW5nVk5vZGVzQ2FjaGVba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxlYXZpbmdWTm9kZXNDYWNoZVtrZXldID0gdm5vZGU7XG4gICAgICAgICAgICBpZiAob25MZWF2ZSkge1xuICAgICAgICAgICAgICAgIGNhbGxBc3luY0hvb2sob25MZWF2ZSwgW2VsLCBkb25lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNsb25lKHZub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyh2bm9kZSwgcHJvcHMsIHN0YXRlLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBob29rcztcbn1cbi8vIHRoZSBwbGFjZWhvbGRlciByZWFsbHkgb25seSBoYW5kbGVzIG9uZSBzcGVjaWFsIGNhc2U6IEtlZXBBbGl2ZVxuLy8gaW4gdGhlIGNhc2Ugb2YgYSBLZWVwQWxpdmUgaW4gYSBsZWF2ZSBwaGFzZSB3ZSBuZWVkIHRvIHJldHVybiBhIEtlZXBBbGl2ZVxuLy8gcGxhY2Vob2xkZXIgd2l0aCBlbXB0eSBjb250ZW50IHRvIGF2b2lkIHRoZSBLZWVwQWxpdmUgaW5zdGFuY2UgZnJvbSBiZWluZ1xuLy8gdW5tb3VudGVkLlxuZnVuY3Rpb24gZW1wdHlQbGFjZWhvbGRlcih2bm9kZSkge1xuICAgIGlmIChpc0tlZXBBbGl2ZSh2bm9kZSkpIHtcbiAgICAgICAgdm5vZGUgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4gPSBudWxsO1xuICAgICAgICByZXR1cm4gdm5vZGU7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0S2VlcEFsaXZlQ2hpbGQodm5vZGUpIHtcbiAgICByZXR1cm4gaXNLZWVwQWxpdmUodm5vZGUpXG4gICAgICAgID8gdm5vZGUuY2hpbGRyZW5cbiAgICAgICAgICAgID8gdm5vZGUuY2hpbGRyZW5bMF1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgIDogdm5vZGU7XG59XG5mdW5jdGlvbiBzZXRUcmFuc2l0aW9uSG9va3Modm5vZGUsIGhvb2tzKSB7XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDYgLyogU2hhcGVGbGFncy5DT01QT05FTlQgKi8gJiYgdm5vZGUuY29tcG9uZW50KSB7XG4gICAgICAgIHNldFRyYW5zaXRpb25Ib29rcyh2bm9kZS5jb21wb25lbnQuc3ViVHJlZSwgaG9va3MpO1xuICAgIH1cbiAgICBlbHNlIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxMjggLyogU2hhcGVGbGFncy5TVVNQRU5TRSAqLykge1xuICAgICAgICB2bm9kZS5zc0NvbnRlbnQudHJhbnNpdGlvbiA9IGhvb2tzLmNsb25lKHZub2RlLnNzQ29udGVudCk7XG4gICAgICAgIHZub2RlLnNzRmFsbGJhY2sudHJhbnNpdGlvbiA9IGhvb2tzLmNsb25lKHZub2RlLnNzRmFsbGJhY2spO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdm5vZGUudHJhbnNpdGlvbiA9IGhvb2tzO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihjaGlsZHJlbiwga2VlcENvbW1lbnQgPSBmYWxzZSwgcGFyZW50S2V5KSB7XG4gICAgbGV0IHJldCA9IFtdO1xuICAgIGxldCBrZXllZEZyYWdtZW50Q291bnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIC8vICM1MzYwIGluaGVyaXQgcGFyZW50IGtleSBpbiBjYXNlIG9mIDx0ZW1wbGF0ZSB2LWZvcj5cbiAgICAgICAgY29uc3Qga2V5ID0gcGFyZW50S2V5ID09IG51bGxcbiAgICAgICAgICAgID8gY2hpbGQua2V5XG4gICAgICAgICAgICA6IFN0cmluZyhwYXJlbnRLZXkpICsgU3RyaW5nKGNoaWxkLmtleSAhPSBudWxsID8gY2hpbGQua2V5IDogaSk7XG4gICAgICAgIC8vIGhhbmRsZSBmcmFnbWVudCBjaGlsZHJlbiBjYXNlLCBlLmcuIHYtZm9yXG4gICAgICAgIGlmIChjaGlsZC50eXBlID09PSBGcmFnbWVudCkge1xuICAgICAgICAgICAgaWYgKGNoaWxkLnBhdGNoRmxhZyAmIDEyOCAvKiBQYXRjaEZsYWdzLktFWUVEX0ZSQUdNRU5UICovKVxuICAgICAgICAgICAgICAgIGtleWVkRnJhZ21lbnRDb3VudCsrO1xuICAgICAgICAgICAgcmV0ID0gcmV0LmNvbmNhdChnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4oY2hpbGQuY2hpbGRyZW4sIGtlZXBDb21tZW50LCBrZXkpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb21tZW50IHBsYWNlaG9sZGVycyBzaG91bGQgYmUgc2tpcHBlZCwgZS5nLiB2LWlmXG4gICAgICAgIGVsc2UgaWYgKGtlZXBDb21tZW50IHx8IGNoaWxkLnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgICAgICAgIHJldC5wdXNoKGtleSAhPSBudWxsID8gY2xvbmVWTm9kZShjaGlsZCwgeyBrZXkgfSkgOiBjaGlsZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gIzExMjYgaWYgYSB0cmFuc2l0aW9uIGNoaWxkcmVuIGxpc3QgY29udGFpbnMgbXVsdGlwbGUgc3ViIGZyYWdtZW50cywgdGhlc2VcbiAgICAvLyBmcmFnbWVudHMgd2lsbCBiZSBtZXJnZWQgaW50byBhIGZsYXQgY2hpbGRyZW4gYXJyYXkuIFNpbmNlIGVhY2ggdi1mb3JcbiAgICAvLyBmcmFnbWVudCBtYXkgY29udGFpbiBkaWZmZXJlbnQgc3RhdGljIGJpbmRpbmdzIGluc2lkZSwgd2UgbmVlZCB0byBkZS1vcFxuICAgIC8vIHRoZXNlIGNoaWxkcmVuIHRvIGZvcmNlIGZ1bGwgZGlmZnMgdG8gZW5zdXJlIGNvcnJlY3QgYmVoYXZpb3IuXG4gICAgaWYgKGtleWVkRnJhZ21lbnRDb3VudCA+IDEpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJldFtpXS5wYXRjaEZsYWcgPSAtMiAvKiBQYXRjaEZsYWdzLkJBSUwgKi87XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cblxuLy8gaW1wbGVtZW50YXRpb24sIGNsb3NlIHRvIG5vLW9wXG5mdW5jdGlvbiBkZWZpbmVDb21wb25lbnQob3B0aW9ucykge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKG9wdGlvbnMpID8geyBzZXR1cDogb3B0aW9ucywgbmFtZTogb3B0aW9ucy5uYW1lIH0gOiBvcHRpb25zO1xufVxuXG5jb25zdCBpc0FzeW5jV3JhcHBlciA9IChpKSA9PiAhIWkudHlwZS5fX2FzeW5jTG9hZGVyO1xuZnVuY3Rpb24gZGVmaW5lQXN5bmNDb21wb25lbnQoc291cmNlKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oc291cmNlKSkge1xuICAgICAgICBzb3VyY2UgPSB7IGxvYWRlcjogc291cmNlIH07XG4gICAgfVxuICAgIGNvbnN0IHsgbG9hZGVyLCBsb2FkaW5nQ29tcG9uZW50LCBlcnJvckNvbXBvbmVudCwgZGVsYXkgPSAyMDAsIHRpbWVvdXQsIC8vIHVuZGVmaW5lZCA9IG5ldmVyIHRpbWVzIG91dFxuICAgIHN1c3BlbnNpYmxlID0gdHJ1ZSwgb25FcnJvcjogdXNlck9uRXJyb3IgfSA9IHNvdXJjZTtcbiAgICBsZXQgcGVuZGluZ1JlcXVlc3QgPSBudWxsO1xuICAgIGxldCByZXNvbHZlZENvbXA7XG4gICAgbGV0IHJldHJpZXMgPSAwO1xuICAgIGNvbnN0IHJldHJ5ID0gKCkgPT4ge1xuICAgICAgICByZXRyaWVzKys7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGxvYWQoKTtcbiAgICB9O1xuICAgIGNvbnN0IGxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGxldCB0aGlzUmVxdWVzdDtcbiAgICAgICAgcmV0dXJuIChwZW5kaW5nUmVxdWVzdCB8fFxuICAgICAgICAgICAgKHRoaXNSZXF1ZXN0ID0gcGVuZGluZ1JlcXVlc3QgPVxuICAgICAgICAgICAgICAgIGxvYWRlcigpXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnIgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VyT25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyUmV0cnkgPSAoKSA9PiByZXNvbHZlKHJldHJ5KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJGYWlsID0gKCkgPT4gcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck9uRXJyb3IoZXJyLCB1c2VyUmV0cnksIHVzZXJGYWlsLCByZXRyaWVzICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChjb21wKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzUmVxdWVzdCAhPT0gcGVuZGluZ1JlcXVlc3QgJiYgcGVuZGluZ1JlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwZW5kaW5nUmVxdWVzdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmICFjb21wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXJuKGBBc3luYyBjb21wb25lbnQgbG9hZGVyIHJlc29sdmVkIHRvIHVuZGVmaW5lZC4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYElmIHlvdSBhcmUgdXNpbmcgcmV0cnkoKSwgbWFrZSBzdXJlIHRvIHJldHVybiBpdHMgcmV0dXJuIHZhbHVlLmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGludGVyb3AgbW9kdWxlIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChjb21wLl9fZXNNb2R1bGUgfHwgY29tcFtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnTW9kdWxlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiBjb21wICYmICFpc09iamVjdChjb21wKSAmJiAhaXNGdW5jdGlvbihjb21wKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFzeW5jIGNvbXBvbmVudCBsb2FkIHJlc3VsdDogJHtjb21wfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkQ29tcCA9IGNvbXA7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wO1xuICAgICAgICAgICAgICAgIH0pKSk7XG4gICAgfTtcbiAgICByZXR1cm4gZGVmaW5lQ29tcG9uZW50KHtcbiAgICAgICAgbmFtZTogJ0FzeW5jQ29tcG9uZW50V3JhcHBlcicsXG4gICAgICAgIF9fYXN5bmNMb2FkZXI6IGxvYWQsXG4gICAgICAgIGdldCBfX2FzeW5jUmVzb2x2ZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWRDb21wO1xuICAgICAgICB9LFxuICAgICAgICBzZXR1cCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gY3VycmVudEluc3RhbmNlO1xuICAgICAgICAgICAgLy8gYWxyZWFkeSByZXNvbHZlZFxuICAgICAgICAgICAgaWYgKHJlc29sdmVkQ29tcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiBjcmVhdGVJbm5lckNvbXAocmVzb2x2ZWRDb21wLCBpbnN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvbkVycm9yID0gKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCAxMyAvKiBFcnJvckNvZGVzLkFTWU5DX0NPTVBPTkVOVF9MT0FERVIgKi8sICFlcnJvckNvbXBvbmVudCAvKiBkbyBub3QgdGhyb3cgaW4gZGV2IGlmIHVzZXIgcHJvdmlkZWQgZXJyb3IgY29tcG9uZW50ICovKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBzdXNwZW5zZS1jb250cm9sbGVkIG9yIFNTUi5cbiAgICAgICAgICAgIGlmICgoc3VzcGVuc2libGUgJiYgaW5zdGFuY2Uuc3VzcGVuc2UpIHx8XG4gICAgICAgICAgICAgICAgKGlzSW5TU1JDb21wb25lbnRTZXR1cCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9hZCgpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGNvbXAgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gY3JlYXRlSW5uZXJDb21wKGNvbXAsIGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gZXJyb3JDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gY3JlYXRlVk5vZGUoZXJyb3JDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gcmVmKGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVmKCk7XG4gICAgICAgICAgICBjb25zdCBkZWxheWVkID0gcmVmKCEhZGVsYXkpO1xuICAgICAgICAgICAgaWYgKGRlbGF5KSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGF5ZWQudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LCBkZWxheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGltZW91dCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbG9hZGVkLnZhbHVlICYmICFlcnJvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGBBc3luYyBjb21wb25lbnQgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tcy5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnZhbHVlID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2FkKClcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9hZGVkLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucGFyZW50ICYmIGlzS2VlcEFsaXZlKGluc3RhbmNlLnBhcmVudC52bm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50IGlzIGtlZXAtYWxpdmUsIGZvcmNlIHVwZGF0ZSBzbyB0aGUgbG9hZGVkIGNvbXBvbmVudCdzXG4gICAgICAgICAgICAgICAgICAgIC8vIG5hbWUgaXMgdGFrZW4gaW50byBhY2NvdW50XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlSm9iKGluc3RhbmNlLnBhcmVudC51cGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIGVycm9yLnZhbHVlID0gZXJyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChsb2FkZWQudmFsdWUgJiYgcmVzb2x2ZWRDb21wKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbm5lckNvbXAocmVzb2x2ZWRDb21wLCBpbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yLnZhbHVlICYmIGVycm9yQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVWTm9kZShlcnJvckNvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2FkaW5nQ29tcG9uZW50ICYmICFkZWxheWVkLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVWTm9kZShsb2FkaW5nQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVJbm5lckNvbXAoY29tcCwgcGFyZW50KSB7XG4gICAgY29uc3QgeyByZWYsIHByb3BzLCBjaGlsZHJlbiwgY2UgfSA9IHBhcmVudC52bm9kZTtcbiAgICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKGNvbXAsIHByb3BzLCBjaGlsZHJlbik7XG4gICAgLy8gZW5zdXJlIGlubmVyIGNvbXBvbmVudCBpbmhlcml0cyB0aGUgYXN5bmMgd3JhcHBlcidzIHJlZiBvd25lclxuICAgIHZub2RlLnJlZiA9IHJlZjtcbiAgICAvLyBwYXNzIHRoZSBjdXN0b20gZWxlbWVudCBjYWxsYmFjayBvbiB0byB0aGUgaW5uZXIgY29tcFxuICAgIC8vIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYXN5bmMgd3JhcHBlclxuICAgIHZub2RlLmNlID0gY2U7XG4gICAgZGVsZXRlIHBhcmVudC52bm9kZS5jZTtcbiAgICByZXR1cm4gdm5vZGU7XG59XG5cbmNvbnN0IGlzS2VlcEFsaXZlID0gKHZub2RlKSA9PiB2bm9kZS50eXBlLl9faXNLZWVwQWxpdmU7XG5jb25zdCBLZWVwQWxpdmVJbXBsID0ge1xuICAgIG5hbWU6IGBLZWVwQWxpdmVgLFxuICAgIC8vIE1hcmtlciBmb3Igc3BlY2lhbCBoYW5kbGluZyBpbnNpZGUgdGhlIHJlbmRlcmVyLiBXZSBhcmUgbm90IHVzaW5nIGEgPT09XG4gICAgLy8gY2hlY2sgZGlyZWN0bHkgb24gS2VlcEFsaXZlIGluIHRoZSByZW5kZXJlciwgYmVjYXVzZSBpbXBvcnRpbmcgaXQgZGlyZWN0bHlcbiAgICAvLyB3b3VsZCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgdHJlZS1zaGFrZW4uXG4gICAgX19pc0tlZXBBbGl2ZTogdHJ1ZSxcbiAgICBwcm9wczoge1xuICAgICAgICBpbmNsdWRlOiBbU3RyaW5nLCBSZWdFeHAsIEFycmF5XSxcbiAgICAgICAgZXhjbHVkZTogW1N0cmluZywgUmVnRXhwLCBBcnJheV0sXG4gICAgICAgIG1heDogW1N0cmluZywgTnVtYmVyXVxuICAgIH0sXG4gICAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgICAgICAvLyBLZWVwQWxpdmUgY29tbXVuaWNhdGVzIHdpdGggdGhlIGluc3RhbnRpYXRlZCByZW5kZXJlciB2aWEgdGhlXG4gICAgICAgIC8vIGN0eCB3aGVyZSB0aGUgcmVuZGVyZXIgcGFzc2VzIGluIGl0cyBpbnRlcm5hbHMsXG4gICAgICAgIC8vIGFuZCB0aGUgS2VlcEFsaXZlIGluc3RhbmNlIGV4cG9zZXMgYWN0aXZhdGUvZGVhY3RpdmF0ZSBpbXBsZW1lbnRhdGlvbnMuXG4gICAgICAgIC8vIFRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIGlzIHRvIGF2b2lkIGltcG9ydGluZyBLZWVwQWxpdmUgZGlyZWN0bHkgaW4gdGhlXG4gICAgICAgIC8vIHJlbmRlcmVyIHRvIGZhY2lsaXRhdGUgdHJlZS1zaGFraW5nLlxuICAgICAgICBjb25zdCBzaGFyZWRDb250ZXh0ID0gaW5zdGFuY2UuY3R4O1xuICAgICAgICAvLyBpZiB0aGUgaW50ZXJuYWwgcmVuZGVyZXIgaXMgbm90IHJlZ2lzdGVyZWQsIGl0IGluZGljYXRlcyB0aGF0IHRoaXMgaXMgc2VydmVyLXNpZGUgcmVuZGVyaW5nLFxuICAgICAgICAvLyBmb3IgS2VlcEFsaXZlLCB3ZSBqdXN0IG5lZWQgdG8gcmVuZGVyIGl0cyBjaGlsZHJlblxuICAgICAgICBpZiAoIXNoYXJlZENvbnRleHQucmVuZGVyZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0ICYmIHNsb3RzLmRlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID09PSAxID8gY2hpbGRyZW5bMF0gOiBjaGlsZHJlbjtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGxldCBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgICAgIGluc3RhbmNlLl9fdl9jYWNoZSA9IGNhY2hlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudFN1c3BlbnNlID0gaW5zdGFuY2Uuc3VzcGVuc2U7XG4gICAgICAgIGNvbnN0IHsgcmVuZGVyZXI6IHsgcDogcGF0Y2gsIG06IG1vdmUsIHVtOiBfdW5tb3VudCwgbzogeyBjcmVhdGVFbGVtZW50IH0gfSB9ID0gc2hhcmVkQ29udGV4dDtcbiAgICAgICAgY29uc3Qgc3RvcmFnZUNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBzaGFyZWRDb250ZXh0LmFjdGl2YXRlID0gKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgaXNTVkcsIG9wdGltaXplZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB2bm9kZS5jb21wb25lbnQ7XG4gICAgICAgICAgICBtb3ZlKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgMCAvKiBNb3ZlVHlwZS5FTlRFUiAqLywgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICAgICAgLy8gaW4gY2FzZSBwcm9wcyBoYXZlIGNoYW5nZWRcbiAgICAgICAgICAgIHBhdGNoKGluc3RhbmNlLnZub2RlLCB2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHZub2RlLnNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2UuaXNEZWFjdGl2YXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5hKSB7XG4gICAgICAgICAgICAgICAgICAgIGludm9rZUFycmF5Rm5zKGluc3RhbmNlLmEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB2bm9kZUhvb2sgPSB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy5vblZub2RlTW91bnRlZDtcbiAgICAgICAgICAgICAgICBpZiAodm5vZGVIb29rKSB7XG4gICAgICAgICAgICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIGluc3RhbmNlLnBhcmVudCwgdm5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGNvbXBvbmVudHMgdHJlZVxuICAgICAgICAgICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzaGFyZWRDb250ZXh0LmRlYWN0aXZhdGUgPSAodm5vZGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50O1xuICAgICAgICAgICAgbW92ZSh2bm9kZSwgc3RvcmFnZUNvbnRhaW5lciwgbnVsbCwgMSAvKiBNb3ZlVHlwZS5MRUFWRSAqLywgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UuZGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaW52b2tlQXJyYXlGbnMoaW5zdGFuY2UuZGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB2bm9kZUhvb2sgPSB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy5vblZub2RlVW5tb3VudGVkO1xuICAgICAgICAgICAgICAgIGlmICh2bm9kZUhvb2spIHtcbiAgICAgICAgICAgICAgICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgaW5zdGFuY2UucGFyZW50LCB2bm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluc3RhbmNlLmlzRGVhY3RpdmF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50cyB0cmVlXG4gICAgICAgICAgICAgICAgZGV2dG9vbHNDb21wb25lbnRBZGRlZChpbnN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIHVubW91bnQodm5vZGUpIHtcbiAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBzaGFwZUZsYWcgc28gaXQgY2FuIGJlIHByb3Blcmx5IHVubW91bnRlZFxuICAgICAgICAgICAgcmVzZXRTaGFwZUZsYWcodm5vZGUpO1xuICAgICAgICAgICAgX3VubW91bnQodm5vZGUsIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcHJ1bmVDYWNoZShmaWx0ZXIpIHtcbiAgICAgICAgICAgIGNhY2hlLmZvckVhY2goKHZub2RlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh2bm9kZS50eXBlKTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSAmJiAoIWZpbHRlciB8fCAhZmlsdGVyKG5hbWUpKSkge1xuICAgICAgICAgICAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBwcnVuZUNhY2hlRW50cnkoa2V5KSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmICghY3VycmVudCB8fCAhaXNTYW1lVk5vZGVUeXBlKGNhY2hlZCwgY3VycmVudCkpIHtcbiAgICAgICAgICAgICAgICB1bm1vdW50KGNhY2hlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gY3VycmVudCBhY3RpdmUgaW5zdGFuY2Ugc2hvdWxkIG5vIGxvbmdlciBiZSBrZXB0LWFsaXZlLlxuICAgICAgICAgICAgICAgIC8vIHdlIGNhbid0IHVubW91bnQgaXQgbm93IGJ1dCBpdCBtaWdodCBiZSBsYXRlciwgc28gcmVzZXQgaXRzIGZsYWcgbm93LlxuICAgICAgICAgICAgICAgIHJlc2V0U2hhcGVGbGFnKGN1cnJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICBrZXlzLmRlbGV0ZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHBydW5lIGNhY2hlIG9uIGluY2x1ZGUvZXhjbHVkZSBwcm9wIGNoYW5nZVxuICAgICAgICB3YXRjaCgoKSA9PiBbcHJvcHMuaW5jbHVkZSwgcHJvcHMuZXhjbHVkZV0sIChbaW5jbHVkZSwgZXhjbHVkZV0pID0+IHtcbiAgICAgICAgICAgIGluY2x1ZGUgJiYgcHJ1bmVDYWNoZShuYW1lID0+IG1hdGNoZXMoaW5jbHVkZSwgbmFtZSkpO1xuICAgICAgICAgICAgZXhjbHVkZSAmJiBwcnVuZUNhY2hlKG5hbWUgPT4gIW1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpO1xuICAgICAgICB9LCBcbiAgICAgICAgLy8gcHJ1bmUgcG9zdC1yZW5kZXIgYWZ0ZXIgYGN1cnJlbnRgIGhhcyBiZWVuIHVwZGF0ZWRcbiAgICAgICAgeyBmbHVzaDogJ3Bvc3QnLCBkZWVwOiB0cnVlIH0pO1xuICAgICAgICAvLyBjYWNoZSBzdWIgdHJlZSBhZnRlciByZW5kZXJcbiAgICAgICAgbGV0IHBlbmRpbmdDYWNoZUtleSA9IG51bGw7XG4gICAgICAgIGNvbnN0IGNhY2hlU3VidHJlZSA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGZpeCAjMTYyMSwgdGhlIHBlbmRpbmdDYWNoZUtleSBjb3VsZCBiZSAwXG4gICAgICAgICAgICBpZiAocGVuZGluZ0NhY2hlS2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjYWNoZS5zZXQocGVuZGluZ0NhY2hlS2V5LCBnZXRJbm5lckNoaWxkKGluc3RhbmNlLnN1YlRyZWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgb25Nb3VudGVkKGNhY2hlU3VidHJlZSk7XG4gICAgICAgIG9uVXBkYXRlZChjYWNoZVN1YnRyZWUpO1xuICAgICAgICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgICAgICAgICAgY2FjaGUuZm9yRWFjaChjYWNoZWQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgc3ViVHJlZSwgc3VzcGVuc2UgfSA9IGluc3RhbmNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZub2RlID0gZ2V0SW5uZXJDaGlsZChzdWJUcmVlKTtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkLnR5cGUgPT09IHZub2RlLnR5cGUgJiYgY2FjaGVkLmtleSA9PT0gdm5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgaW5zdGFuY2Ugd2lsbCBiZSB1bm1vdW50ZWQgYXMgcGFydCBvZiBrZWVwLWFsaXZlJ3MgdW5tb3VudFxuICAgICAgICAgICAgICAgICAgICByZXNldFNoYXBlRmxhZyh2bm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBpbnZva2UgaXRzIGRlYWN0aXZhdGVkIGhvb2sgaGVyZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYSA9IHZub2RlLmNvbXBvbmVudC5kYTtcbiAgICAgICAgICAgICAgICAgICAgZGEgJiYgcXVldWVQb3N0UmVuZGVyRWZmZWN0KGRhLCBzdXNwZW5zZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdW5tb3VudChjYWNoZWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgcGVuZGluZ0NhY2hlS2V5ID0gbnVsbDtcbiAgICAgICAgICAgIGlmICghc2xvdHMuZGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0KCk7XG4gICAgICAgICAgICBjb25zdCByYXdWTm9kZSA9IGNoaWxkcmVuWzBdO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm4oYEtlZXBBbGl2ZSBzaG91bGQgY29udGFpbiBleGFjdGx5IG9uZSBjb21wb25lbnQgY2hpbGQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFpc1ZOb2RlKHJhd1ZOb2RlKSB8fFxuICAgICAgICAgICAgICAgICghKHJhd1ZOb2RlLnNoYXBlRmxhZyAmIDQgLyogU2hhcGVGbGFncy5TVEFURUZVTF9DT01QT05FTlQgKi8pICYmXG4gICAgICAgICAgICAgICAgICAgICEocmF3Vk5vZGUuc2hhcGVGbGFnICYgMTI4IC8qIFNoYXBlRmxhZ3MuU1VTUEVOU0UgKi8pKSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiByYXdWTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB2bm9kZSA9IGdldElubmVyQ2hpbGQocmF3Vk5vZGUpO1xuICAgICAgICAgICAgY29uc3QgY29tcCA9IHZub2RlLnR5cGU7XG4gICAgICAgICAgICAvLyBmb3IgYXN5bmMgY29tcG9uZW50cywgbmFtZSBjaGVjayBzaG91bGQgYmUgYmFzZWQgaW4gaXRzIGxvYWRlZFxuICAgICAgICAgICAgLy8gaW5uZXIgY29tcG9uZW50IGlmIGF2YWlsYWJsZVxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoaXNBc3luY1dyYXBwZXIodm5vZGUpXG4gICAgICAgICAgICAgICAgPyB2bm9kZS50eXBlLl9fYXN5bmNSZXNvbHZlZCB8fCB7fVxuICAgICAgICAgICAgICAgIDogY29tcCk7XG4gICAgICAgICAgICBjb25zdCB7IGluY2x1ZGUsIGV4Y2x1ZGUsIG1heCB9ID0gcHJvcHM7XG4gICAgICAgICAgICBpZiAoKGluY2x1ZGUgJiYgKCFuYW1lIHx8ICFtYXRjaGVzKGluY2x1ZGUsIG5hbWUpKSkgfHxcbiAgICAgICAgICAgICAgICAoZXhjbHVkZSAmJiBuYW1lICYmIG1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IHZub2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiByYXdWTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHZub2RlLmtleSA9PSBudWxsID8gY29tcCA6IHZub2RlLmtleTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZFZOb2RlID0gY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgICAgICAvLyBjbG9uZSB2bm9kZSBpZiBpdCdzIHJldXNlZCBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBtdXRhdGUgaXRcbiAgICAgICAgICAgIGlmICh2bm9kZS5lbCkge1xuICAgICAgICAgICAgICAgIHZub2RlID0gY2xvbmVWTm9kZSh2bm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJhd1ZOb2RlLnNoYXBlRmxhZyAmIDEyOCAvKiBTaGFwZUZsYWdzLlNVU1BFTlNFICovKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhd1ZOb2RlLnNzQ29udGVudCA9IHZub2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICMxNTEzIGl0J3MgcG9zc2libGUgZm9yIHRoZSByZXR1cm5lZCB2bm9kZSB0byBiZSBjbG9uZWQgZHVlIHRvIGF0dHJcbiAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoIG9yIHNjb3BlSWQsIHNvIHRoZSB2bm9kZSBoZXJlIG1heSBub3QgYmUgdGhlIGZpbmFsIHZub2RlXG4gICAgICAgICAgICAvLyB0aGF0IGlzIG1vdW50ZWQuIEluc3RlYWQgb2YgY2FjaGluZyBpdCBkaXJlY3RseSwgd2Ugc3RvcmUgdGhlIHBlbmRpbmdcbiAgICAgICAgICAgIC8vIGtleSBhbmQgY2FjaGUgYGluc3RhbmNlLnN1YlRyZWVgICh0aGUgbm9ybWFsaXplZCB2bm9kZSkgaW5cbiAgICAgICAgICAgIC8vIGJlZm9yZU1vdW50L2JlZm9yZVVwZGF0ZSBob29rcy5cbiAgICAgICAgICAgIHBlbmRpbmdDYWNoZUtleSA9IGtleTtcbiAgICAgICAgICAgIGlmIChjYWNoZWRWTm9kZSkge1xuICAgICAgICAgICAgICAgIC8vIGNvcHkgb3ZlciBtb3VudGVkIHN0YXRlXG4gICAgICAgICAgICAgICAgdm5vZGUuZWwgPSBjYWNoZWRWTm9kZS5lbDtcbiAgICAgICAgICAgICAgICB2bm9kZS5jb21wb25lbnQgPSBjYWNoZWRWTm9kZS5jb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHZub2RlLnRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVjdXJzaXZlbHkgdXBkYXRlIHRyYW5zaXRpb24gaG9va3Mgb24gc3ViVHJlZVxuICAgICAgICAgICAgICAgICAgICBzZXRUcmFuc2l0aW9uSG9va3Modm5vZGUsIHZub2RlLnRyYW5zaXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBhdm9pZCB2bm9kZSBiZWluZyBtb3VudGVkIGFzIGZyZXNoXG4gICAgICAgICAgICAgICAgdm5vZGUuc2hhcGVGbGFnIHw9IDUxMiAvKiBTaGFwZUZsYWdzLkNPTVBPTkVOVF9LRVBUX0FMSVZFICovO1xuICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhpcyBrZXkgdGhlIGZyZXNoZXN0XG4gICAgICAgICAgICAgICAga2V5cy5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgICAgICBrZXlzLmFkZChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAga2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAvLyBwcnVuZSBvbGRlc3QgZW50cnlcbiAgICAgICAgICAgICAgICBpZiAobWF4ICYmIGtleXMuc2l6ZSA+IHBhcnNlSW50KG1heCwgMTApKSB7XG4gICAgICAgICAgICAgICAgICAgIHBydW5lQ2FjaGVFbnRyeShrZXlzLnZhbHVlcygpLm5leHQoKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYXZvaWQgdm5vZGUgYmVpbmcgdW5tb3VudGVkXG4gICAgICAgICAgICB2bm9kZS5zaGFwZUZsYWcgfD0gMjU2IC8qIFNoYXBlRmxhZ3MuQ09NUE9ORU5UX1NIT1VMRF9LRUVQX0FMSVZFICovO1xuICAgICAgICAgICAgY3VycmVudCA9IHZub2RlO1xuICAgICAgICAgICAgcmV0dXJuIGlzU3VzcGVuc2UocmF3Vk5vZGUudHlwZSkgPyByYXdWTm9kZSA6IHZub2RlO1xuICAgICAgICB9O1xuICAgIH1cbn07XG4vLyBleHBvcnQgdGhlIHB1YmxpYyB0eXBlIGZvciBoL3RzeCBpbmZlcmVuY2Vcbi8vIGFsc28gdG8gYXZvaWQgaW5saW5lIGltcG9ydCgpIGluIGdlbmVyYXRlZCBkLnRzIGZpbGVzXG5jb25zdCBLZWVwQWxpdmUgPSBLZWVwQWxpdmVJbXBsO1xuZnVuY3Rpb24gbWF0Y2hlcyhwYXR0ZXJuLCBuYW1lKSB7XG4gICAgaWYgKGlzQXJyYXkocGF0dGVybikpIHtcbiAgICAgICAgcmV0dXJuIHBhdHRlcm4uc29tZSgocCkgPT4gbWF0Y2hlcyhwLCBuYW1lKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzU3RyaW5nKHBhdHRlcm4pKSB7XG4gICAgICAgIHJldHVybiBwYXR0ZXJuLnNwbGl0KCcsJykuaW5jbHVkZXMobmFtZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7XG4gICAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QobmFtZSk7XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gb25BY3RpdmF0ZWQoaG9vaywgdGFyZ2V0KSB7XG4gICAgcmVnaXN0ZXJLZWVwQWxpdmVIb29rKGhvb2ssIFwiYVwiIC8qIExpZmVjeWNsZUhvb2tzLkFDVElWQVRFRCAqLywgdGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIG9uRGVhY3RpdmF0ZWQoaG9vaywgdGFyZ2V0KSB7XG4gICAgcmVnaXN0ZXJLZWVwQWxpdmVIb29rKGhvb2ssIFwiZGFcIiAvKiBMaWZlY3ljbGVIb29rcy5ERUFDVElWQVRFRCAqLywgdGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyS2VlcEFsaXZlSG9vayhob29rLCB0eXBlLCB0YXJnZXQgPSBjdXJyZW50SW5zdGFuY2UpIHtcbiAgICAvLyBjYWNoZSB0aGUgZGVhY3RpdmF0ZSBicmFuY2ggY2hlY2sgd3JhcHBlciBmb3IgaW5qZWN0ZWQgaG9va3Mgc28gdGhlIHNhbWVcbiAgICAvLyBob29rIGNhbiBiZSBwcm9wZXJseSBkZWR1cGVkIGJ5IHRoZSBzY2hlZHVsZXIuIFwiX193ZGNcIiBzdGFuZHMgZm9yIFwid2l0aFxuICAgIC8vIGRlYWN0aXZhdGlvbiBjaGVja1wiLlxuICAgIGNvbnN0IHdyYXBwZWRIb29rID0gaG9vay5fX3dkYyB8fFxuICAgICAgICAoaG9vay5fX3dkYyA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIG9ubHkgZmlyZSB0aGUgaG9vayBpZiB0aGUgdGFyZ2V0IGluc3RhbmNlIGlzIE5PVCBpbiBhIGRlYWN0aXZhdGVkIGJyYW5jaC5cbiAgICAgICAgICAgIGxldCBjdXJyZW50ID0gdGFyZ2V0O1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5pc0RlYWN0aXZhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhvb2soKTtcbiAgICAgICAgfSk7XG4gICAgaW5qZWN0SG9vayh0eXBlLCB3cmFwcGVkSG9vaywgdGFyZ2V0KTtcbiAgICAvLyBJbiBhZGRpdGlvbiB0byByZWdpc3RlcmluZyBpdCBvbiB0aGUgdGFyZ2V0IGluc3RhbmNlLCB3ZSB3YWxrIHVwIHRoZSBwYXJlbnRcbiAgICAvLyBjaGFpbiBhbmQgcmVnaXN0ZXIgaXQgb24gYWxsIGFuY2VzdG9yIGluc3RhbmNlcyB0aGF0IGFyZSBrZWVwLWFsaXZlIHJvb3RzLlxuICAgIC8vIFRoaXMgYXZvaWRzIHRoZSBuZWVkIHRvIHdhbGsgdGhlIGVudGlyZSBjb21wb25lbnQgdHJlZSB3aGVuIGludm9raW5nIHRoZXNlXG4gICAgLy8gaG9va3MsIGFuZCBtb3JlIGltcG9ydGFudGx5LCBhdm9pZHMgdGhlIG5lZWQgdG8gdHJhY2sgY2hpbGQgY29tcG9uZW50cyBpblxuICAgIC8vIGFycmF5cy5cbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGFyZ2V0LnBhcmVudDtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChpc0tlZXBBbGl2ZShjdXJyZW50LnBhcmVudC52bm9kZSkpIHtcbiAgICAgICAgICAgICAgICBpbmplY3RUb0tlZXBBbGl2ZVJvb3Qod3JhcHBlZEhvb2ssIHR5cGUsIHRhcmdldCwgY3VycmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBpbmplY3RUb0tlZXBBbGl2ZVJvb3QoaG9vaywgdHlwZSwgdGFyZ2V0LCBrZWVwQWxpdmVSb290KSB7XG4gICAgLy8gaW5qZWN0SG9vayB3cmFwcyB0aGUgb3JpZ2luYWwgZm9yIGVycm9yIGhhbmRsaW5nLCBzbyBtYWtlIHN1cmUgdG8gcmVtb3ZlXG4gICAgLy8gdGhlIHdyYXBwZWQgdmVyc2lvbi5cbiAgICBjb25zdCBpbmplY3RlZCA9IGluamVjdEhvb2sodHlwZSwgaG9vaywga2VlcEFsaXZlUm9vdCwgdHJ1ZSAvKiBwcmVwZW5kICovKTtcbiAgICBvblVubW91bnRlZCgoKSA9PiB7XG4gICAgICAgIHJlbW92ZShrZWVwQWxpdmVSb290W3R5cGVdLCBpbmplY3RlZCk7XG4gICAgfSwgdGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIHJlc2V0U2hhcGVGbGFnKHZub2RlKSB7XG4gICAgLy8gYml0d2lzZSBvcGVyYXRpb25zIHRvIHJlbW92ZSBrZWVwIGFsaXZlIGZsYWdzXG4gICAgdm5vZGUuc2hhcGVGbGFnICY9IH4yNTYgLyogU2hhcGVGbGFncy5DT01QT05FTlRfU0hPVUxEX0tFRVBfQUxJVkUgKi87XG4gICAgdm5vZGUuc2hhcGVGbGFnICY9IH41MTIgLyogU2hhcGVGbGFncy5DT01QT05FTlRfS0VQVF9BTElWRSAqLztcbn1cbmZ1bmN0aW9uIGdldElubmVyQ2hpbGQodm5vZGUpIHtcbiAgICByZXR1cm4gdm5vZGUuc2hhcGVGbGFnICYgMTI4IC8qIFNoYXBlRmxhZ3MuU1VTUEVOU0UgKi8gPyB2bm9kZS5zc0NvbnRlbnQgOiB2bm9kZTtcbn1cblxuZnVuY3Rpb24gaW5qZWN0SG9vayh0eXBlLCBob29rLCB0YXJnZXQgPSBjdXJyZW50SW5zdGFuY2UsIHByZXBlbmQgPSBmYWxzZSkge1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgaG9va3MgPSB0YXJnZXRbdHlwZV0gfHwgKHRhcmdldFt0eXBlXSA9IFtdKTtcbiAgICAgICAgLy8gY2FjaGUgdGhlIGVycm9yIGhhbmRsaW5nIHdyYXBwZXIgZm9yIGluamVjdGVkIGhvb2tzIHNvIHRoZSBzYW1lIGhvb2tcbiAgICAgICAgLy8gY2FuIGJlIHByb3Blcmx5IGRlZHVwZWQgYnkgdGhlIHNjaGVkdWxlci4gXCJfX3dlaFwiIHN0YW5kcyBmb3IgXCJ3aXRoIGVycm9yXG4gICAgICAgIC8vIGhhbmRsaW5nXCIuXG4gICAgICAgIGNvbnN0IHdyYXBwZWRIb29rID0gaG9vay5fX3dlaCB8fFxuICAgICAgICAgICAgKGhvb2suX193ZWggPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIHRyYWNraW5nIGluc2lkZSBhbGwgbGlmZWN5Y2xlIGhvb2tzXG4gICAgICAgICAgICAgICAgLy8gc2luY2UgdGhleSBjYW4gcG90ZW50aWFsbHkgYmUgY2FsbGVkIGluc2lkZSBlZmZlY3RzLlxuICAgICAgICAgICAgICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICAgICAgICAgICAgICAvLyBTZXQgY3VycmVudEluc3RhbmNlIGR1cmluZyBob29rIGludm9jYXRpb24uXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBhc3N1bWVzIHRoZSBob29rIGRvZXMgbm90IHN5bmNocm9ub3VzbHkgdHJpZ2dlciBvdGhlciBob29rcywgd2hpY2hcbiAgICAgICAgICAgICAgICAvLyBjYW4gb25seSBiZSBmYWxzZSB3aGVuIHRoZSB1c2VyIGRvZXMgc29tZXRoaW5nIHJlYWxseSBmdW5reS5cbiAgICAgICAgICAgICAgICBzZXRDdXJyZW50SW5zdGFuY2UodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhob29rLCB0YXJnZXQsIHR5cGUsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIHVuc2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgaWYgKHByZXBlbmQpIHtcbiAgICAgICAgICAgIGhvb2tzLnVuc2hpZnQod3JhcHBlZEhvb2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaG9va3MucHVzaCh3cmFwcGVkSG9vayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyYXBwZWRIb29rO1xuICAgIH1cbiAgICBlbHNlIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgY29uc3QgYXBpTmFtZSA9IHRvSGFuZGxlcktleShFcnJvclR5cGVTdHJpbmdzW3R5cGVdLnJlcGxhY2UoLyBob29rJC8sICcnKSk7XG4gICAgICAgIHdhcm4oYCR7YXBpTmFtZX0gaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGNvbXBvbmVudCBpbnN0YW5jZSB0byBiZSBgICtcbiAgICAgICAgICAgIGBhc3NvY2lhdGVkIHdpdGguIGAgK1xuICAgICAgICAgICAgYExpZmVjeWNsZSBpbmplY3Rpb24gQVBJcyBjYW4gb25seSBiZSB1c2VkIGR1cmluZyBleGVjdXRpb24gb2Ygc2V0dXAoKS5gICtcbiAgICAgICAgICAgIChgIElmIHlvdSBhcmUgdXNpbmcgYXN5bmMgc2V0dXAoKSwgbWFrZSBzdXJlIHRvIHJlZ2lzdGVyIGxpZmVjeWNsZSBgICtcbiAgICAgICAgICAgICAgICAgICAgYGhvb2tzIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQgc3RhdGVtZW50LmBcbiAgICAgICAgICAgICAgICApKTtcbiAgICB9XG59XG5jb25zdCBjcmVhdGVIb29rID0gKGxpZmVjeWNsZSkgPT4gKGhvb2ssIHRhcmdldCA9IGN1cnJlbnRJbnN0YW5jZSkgPT4gXG4vLyBwb3N0LWNyZWF0ZSBsaWZlY3ljbGUgcmVnaXN0cmF0aW9ucyBhcmUgbm9vcHMgZHVyaW5nIFNTUiAoZXhjZXB0IGZvciBzZXJ2ZXJQcmVmZXRjaClcbighaXNJblNTUkNvbXBvbmVudFNldHVwIHx8IGxpZmVjeWNsZSA9PT0gXCJzcFwiIC8qIExpZmVjeWNsZUhvb2tzLlNFUlZFUl9QUkVGRVRDSCAqLykgJiZcbiAgICBpbmplY3RIb29rKGxpZmVjeWNsZSwgKC4uLmFyZ3MpID0+IGhvb2soLi4uYXJncyksIHRhcmdldCk7XG5jb25zdCBvbkJlZm9yZU1vdW50ID0gY3JlYXRlSG9vayhcImJtXCIgLyogTGlmZWN5Y2xlSG9va3MuQkVGT1JFX01PVU5UICovKTtcbmNvbnN0IG9uTW91bnRlZCA9IGNyZWF0ZUhvb2soXCJtXCIgLyogTGlmZWN5Y2xlSG9va3MuTU9VTlRFRCAqLyk7XG5jb25zdCBvbkJlZm9yZVVwZGF0ZSA9IGNyZWF0ZUhvb2soXCJidVwiIC8qIExpZmVjeWNsZUhvb2tzLkJFRk9SRV9VUERBVEUgKi8pO1xuY29uc3Qgb25VcGRhdGVkID0gY3JlYXRlSG9vayhcInVcIiAvKiBMaWZlY3ljbGVIb29rcy5VUERBVEVEICovKTtcbmNvbnN0IG9uQmVmb3JlVW5tb3VudCA9IGNyZWF0ZUhvb2soXCJidW1cIiAvKiBMaWZlY3ljbGVIb29rcy5CRUZPUkVfVU5NT1VOVCAqLyk7XG5jb25zdCBvblVubW91bnRlZCA9IGNyZWF0ZUhvb2soXCJ1bVwiIC8qIExpZmVjeWNsZUhvb2tzLlVOTU9VTlRFRCAqLyk7XG5jb25zdCBvblNlcnZlclByZWZldGNoID0gY3JlYXRlSG9vayhcInNwXCIgLyogTGlmZWN5Y2xlSG9va3MuU0VSVkVSX1BSRUZFVENIICovKTtcbmNvbnN0IG9uUmVuZGVyVHJpZ2dlcmVkID0gY3JlYXRlSG9vayhcInJ0Z1wiIC8qIExpZmVjeWNsZUhvb2tzLlJFTkRFUl9UUklHR0VSRUQgKi8pO1xuY29uc3Qgb25SZW5kZXJUcmFja2VkID0gY3JlYXRlSG9vayhcInJ0Y1wiIC8qIExpZmVjeWNsZUhvb2tzLlJFTkRFUl9UUkFDS0VEICovKTtcbmZ1bmN0aW9uIG9uRXJyb3JDYXB0dXJlZChob29rLCB0YXJnZXQgPSBjdXJyZW50SW5zdGFuY2UpIHtcbiAgICBpbmplY3RIb29rKFwiZWNcIiAvKiBMaWZlY3ljbGVIb29rcy5FUlJPUl9DQVBUVVJFRCAqLywgaG9vaywgdGFyZ2V0KTtcbn1cblxuLyoqXG5SdW50aW1lIGhlbHBlciBmb3IgYXBwbHlpbmcgZGlyZWN0aXZlcyB0byBhIHZub2RlLiBFeGFtcGxlIHVzYWdlOlxuXG5jb25zdCBjb21wID0gcmVzb2x2ZUNvbXBvbmVudCgnY29tcCcpXG5jb25zdCBmb28gPSByZXNvbHZlRGlyZWN0aXZlKCdmb28nKVxuY29uc3QgYmFyID0gcmVzb2x2ZURpcmVjdGl2ZSgnYmFyJylcblxucmV0dXJuIHdpdGhEaXJlY3RpdmVzKGgoY29tcCksIFtcbiAgW2ZvbywgdGhpcy54XSxcbiAgW2JhciwgdGhpcy55XVxuXSlcbiovXG5mdW5jdGlvbiB2YWxpZGF0ZURpcmVjdGl2ZU5hbWUobmFtZSkge1xuICAgIGlmIChpc0J1aWx0SW5EaXJlY3RpdmUobmFtZSkpIHtcbiAgICAgICAgd2FybignRG8gbm90IHVzZSBidWlsdC1pbiBkaXJlY3RpdmUgaWRzIGFzIGN1c3RvbSBkaXJlY3RpdmUgaWQ6ICcgKyBuYW1lKTtcbiAgICB9XG59XG4vKipcbiAqIEFkZHMgZGlyZWN0aXZlcyB0byBhIFZOb2RlLlxuICovXG5mdW5jdGlvbiB3aXRoRGlyZWN0aXZlcyh2bm9kZSwgZGlyZWN0aXZlcykge1xuICAgIGNvbnN0IGludGVybmFsSW5zdGFuY2UgPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U7XG4gICAgaWYgKGludGVybmFsSW5zdGFuY2UgPT09IG51bGwpIHtcbiAgICAgICAgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIHdhcm4oYHdpdGhEaXJlY3RpdmVzIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHJlbmRlciBmdW5jdGlvbnMuYCk7XG4gICAgICAgIHJldHVybiB2bm9kZTtcbiAgICB9XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRFeHBvc2VQcm94eShpbnRlcm5hbEluc3RhbmNlKSB8fFxuICAgICAgICBpbnRlcm5hbEluc3RhbmNlLnByb3h5O1xuICAgIGNvbnN0IGJpbmRpbmdzID0gdm5vZGUuZGlycyB8fCAodm5vZGUuZGlycyA9IFtdKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpcmVjdGl2ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IFtkaXIsIHZhbHVlLCBhcmcsIG1vZGlmaWVycyA9IEVNUFRZX09CSl0gPSBkaXJlY3RpdmVzW2ldO1xuICAgICAgICBpZiAoZGlyKSB7XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihkaXIpKSB7XG4gICAgICAgICAgICAgICAgZGlyID0ge1xuICAgICAgICAgICAgICAgICAgICBtb3VudGVkOiBkaXIsXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQ6IGRpclxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGlyLmRlZXApIHtcbiAgICAgICAgICAgICAgICB0cmF2ZXJzZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaW5kaW5ncy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkaXIsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgb2xkVmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgICAgICBhcmcsXG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdm5vZGU7XG59XG5mdW5jdGlvbiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBwcmV2Vk5vZGUsIGluc3RhbmNlLCBuYW1lKSB7XG4gICAgY29uc3QgYmluZGluZ3MgPSB2bm9kZS5kaXJzO1xuICAgIGNvbnN0IG9sZEJpbmRpbmdzID0gcHJldlZOb2RlICYmIHByZXZWTm9kZS5kaXJzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmluZGluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYmluZGluZyA9IGJpbmRpbmdzW2ldO1xuICAgICAgICBpZiAob2xkQmluZGluZ3MpIHtcbiAgICAgICAgICAgIGJpbmRpbmcub2xkVmFsdWUgPSBvbGRCaW5kaW5nc1tpXS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaG9vayA9IGJpbmRpbmcuZGlyW25hbWVdO1xuICAgICAgICBpZiAoaG9vaykge1xuICAgICAgICAgICAgLy8gZGlzYWJsZSB0cmFja2luZyBpbnNpZGUgYWxsIGxpZmVjeWNsZSBob29rc1xuICAgICAgICAgICAgLy8gc2luY2UgdGhleSBjYW4gcG90ZW50aWFsbHkgYmUgY2FsbGVkIGluc2lkZSBlZmZlY3RzLlxuICAgICAgICAgICAgcGF1c2VUcmFja2luZygpO1xuICAgICAgICAgICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoaG9vaywgaW5zdGFuY2UsIDggLyogRXJyb3JDb2Rlcy5ESVJFQ1RJVkVfSE9PSyAqLywgW1xuICAgICAgICAgICAgICAgIHZub2RlLmVsLFxuICAgICAgICAgICAgICAgIGJpbmRpbmcsXG4gICAgICAgICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgICAgICAgcHJldlZOb2RlXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgQ09NUE9ORU5UUyA9ICdjb21wb25lbnRzJztcbmNvbnN0IERJUkVDVElWRVMgPSAnZGlyZWN0aXZlcyc7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVDb21wb25lbnQobmFtZSwgbWF5YmVTZWxmUmVmZXJlbmNlKSB7XG4gICAgcmV0dXJuIHJlc29sdmVBc3NldChDT01QT05FTlRTLCBuYW1lLCB0cnVlLCBtYXliZVNlbGZSZWZlcmVuY2UpIHx8IG5hbWU7XG59XG5jb25zdCBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UID0gU3ltYm9sKCk7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVEeW5hbWljQ29tcG9uZW50KGNvbXBvbmVudCkge1xuICAgIGlmIChpc1N0cmluZyhjb21wb25lbnQpKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlQXNzZXQoQ09NUE9ORU5UUywgY29tcG9uZW50LCBmYWxzZSkgfHwgY29tcG9uZW50O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gaW52YWxpZCB0eXBlcyB3aWxsIGZhbGx0aHJvdWdoIHRvIGNyZWF0ZVZOb2RlIGFuZCByYWlzZSB3YXJuaW5nXG4gICAgICAgIHJldHVybiAoY29tcG9uZW50IHx8IE5VTExfRFlOQU1JQ19DT01QT05FTlQpO1xuICAgIH1cbn1cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZURpcmVjdGl2ZShuYW1lKSB7XG4gICAgcmV0dXJuIHJlc29sdmVBc3NldChESVJFQ1RJVkVTLCBuYW1lKTtcbn1cbi8vIGltcGxlbWVudGF0aW9uXG5mdW5jdGlvbiByZXNvbHZlQXNzZXQodHlwZSwgbmFtZSwgd2Fybk1pc3NpbmcgPSB0cnVlLCBtYXliZVNlbGZSZWZlcmVuY2UgPSBmYWxzZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlIHx8IGN1cnJlbnRJbnN0YW5jZTtcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3QgQ29tcG9uZW50ID0gaW5zdGFuY2UudHlwZTtcbiAgICAgICAgLy8gZXhwbGljaXQgc2VsZiBuYW1lIGhhcyBoaWdoZXN0IHByaW9yaXR5XG4gICAgICAgIGlmICh0eXBlID09PSBDT01QT05FTlRTKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxmTmFtZSA9IGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50LCBmYWxzZSAvKiBkbyBub3QgaW5jbHVkZSBpbmZlcnJlZCBuYW1lIHRvIGF2b2lkIGJyZWFraW5nIGV4aXN0aW5nIGNvZGUgKi8pO1xuICAgICAgICAgICAgaWYgKHNlbGZOYW1lICYmXG4gICAgICAgICAgICAgICAgKHNlbGZOYW1lID09PSBuYW1lIHx8XG4gICAgICAgICAgICAgICAgICAgIHNlbGZOYW1lID09PSBjYW1lbGl6ZShuYW1lKSB8fFxuICAgICAgICAgICAgICAgICAgICBzZWxmTmFtZSA9PT0gY2FwaXRhbGl6ZShjYW1lbGl6ZShuYW1lKSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXMgPSBcbiAgICAgICAgLy8gbG9jYWwgcmVnaXN0cmF0aW9uXG4gICAgICAgIC8vIGNoZWNrIGluc3RhbmNlW3R5cGVdIGZpcnN0IHdoaWNoIGlzIHJlc29sdmVkIGZvciBvcHRpb25zIEFQSVxuICAgICAgICByZXNvbHZlKGluc3RhbmNlW3R5cGVdIHx8IENvbXBvbmVudFt0eXBlXSwgbmFtZSkgfHxcbiAgICAgICAgICAgIC8vIGdsb2JhbCByZWdpc3RyYXRpb25cbiAgICAgICAgICAgIHJlc29sdmUoaW5zdGFuY2UuYXBwQ29udGV4dFt0eXBlXSwgbmFtZSk7XG4gICAgICAgIGlmICghcmVzICYmIG1heWJlU2VsZlJlZmVyZW5jZSkge1xuICAgICAgICAgICAgLy8gZmFsbGJhY2sgdG8gaW1wbGljaXQgc2VsZi1yZWZlcmVuY2VcbiAgICAgICAgICAgIHJldHVybiBDb21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiB3YXJuTWlzc2luZyAmJiAhcmVzKSB7XG4gICAgICAgICAgICBjb25zdCBleHRyYSA9IHR5cGUgPT09IENPTVBPTkVOVFNcbiAgICAgICAgICAgICAgICA/IGBcXG5JZiB0aGlzIGlzIGEgbmF0aXZlIGN1c3RvbSBlbGVtZW50LCBtYWtlIHN1cmUgdG8gZXhjbHVkZSBpdCBmcm9tIGAgK1xuICAgICAgICAgICAgICAgICAgICBgY29tcG9uZW50IHJlc29sdXRpb24gdmlhIGNvbXBpbGVyT3B0aW9ucy5pc0N1c3RvbUVsZW1lbnQuYFxuICAgICAgICAgICAgICAgIDogYGA7XG4gICAgICAgICAgICB3YXJuKGBGYWlsZWQgdG8gcmVzb2x2ZSAke3R5cGUuc2xpY2UoMCwgLTEpfTogJHtuYW1lfSR7ZXh0cmF9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgZWxzZSBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgIHdhcm4oYHJlc29sdmUke2NhcGl0YWxpemUodHlwZS5zbGljZSgwLCAtMSkpfSBgICtcbiAgICAgICAgICAgIGBjYW4gb25seSBiZSB1c2VkIGluIHJlbmRlcigpIG9yIHNldHVwKCkuYCk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZShyZWdpc3RyeSwgbmFtZSkge1xuICAgIHJldHVybiAocmVnaXN0cnkgJiZcbiAgICAgICAgKHJlZ2lzdHJ5W25hbWVdIHx8XG4gICAgICAgICAgICByZWdpc3RyeVtjYW1lbGl6ZShuYW1lKV0gfHxcbiAgICAgICAgICAgIHJlZ2lzdHJ5W2NhcGl0YWxpemUoY2FtZWxpemUobmFtZSkpXSkpO1xufVxuXG4vKipcbiAqIEFjdHVhbCBpbXBsZW1lbnRhdGlvblxuICovXG5mdW5jdGlvbiByZW5kZXJMaXN0KHNvdXJjZSwgcmVuZGVySXRlbSwgY2FjaGUsIGluZGV4KSB7XG4gICAgbGV0IHJldDtcbiAgICBjb25zdCBjYWNoZWQgPSAoY2FjaGUgJiYgY2FjaGVbaW5kZXhdKTtcbiAgICBpZiAoaXNBcnJheShzb3VyY2UpIHx8IGlzU3RyaW5nKHNvdXJjZSkpIHtcbiAgICAgICAgcmV0ID0gbmV3IEFycmF5KHNvdXJjZS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHNvdXJjZS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIHJldFtpXSA9IHJlbmRlckl0ZW0oc291cmNlW2ldLCBpLCB1bmRlZmluZWQsIGNhY2hlZCAmJiBjYWNoZWRbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIU51bWJlci5pc0ludGVnZXIoc291cmNlKSkge1xuICAgICAgICAgICAgd2FybihgVGhlIHYtZm9yIHJhbmdlIGV4cGVjdCBhbiBpbnRlZ2VyIHZhbHVlIGJ1dCBnb3QgJHtzb3VyY2V9LmApO1xuICAgICAgICB9XG4gICAgICAgIHJldCA9IG5ldyBBcnJheShzb3VyY2UpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZTsgaSsrKSB7XG4gICAgICAgICAgICByZXRbaV0gPSByZW5kZXJJdGVtKGkgKyAxLCBpLCB1bmRlZmluZWQsIGNhY2hlZCAmJiBjYWNoZWRbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgICAgaWYgKHNvdXJjZVtTeW1ib2wuaXRlcmF0b3JdKSB7XG4gICAgICAgICAgICByZXQgPSBBcnJheS5mcm9tKHNvdXJjZSwgKGl0ZW0sIGkpID0+IHJlbmRlckl0ZW0oaXRlbSwgaSwgdW5kZWZpbmVkLCBjYWNoZWQgJiYgY2FjaGVkW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICAgICAgICAgIHJldCA9IG5ldyBBcnJheShrZXlzLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgICAgICByZXRbaV0gPSByZW5kZXJJdGVtKHNvdXJjZVtrZXldLCBrZXksIGksIGNhY2hlZCAmJiBjYWNoZWRbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXQgPSBbXTtcbiAgICB9XG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICAgIGNhY2hlW2luZGV4XSA9IHJldDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBDb21waWxlciBydW50aW1lIGhlbHBlciBmb3IgY3JlYXRpbmcgZHluYW1pYyBzbG90cyBvYmplY3RcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNsb3RzKHNsb3RzLCBkeW5hbWljU2xvdHMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGR5bmFtaWNTbG90cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzbG90ID0gZHluYW1pY1Nsb3RzW2ldO1xuICAgICAgICAvLyBhcnJheSBvZiBkeW5hbWljIHNsb3QgZ2VuZXJhdGVkIGJ5IDx0ZW1wbGF0ZSB2LWZvcj1cIi4uLlwiICNbLi4uXT5cbiAgICAgICAgaWYgKGlzQXJyYXkoc2xvdCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2xvdC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHNsb3RzW3Nsb3Rbal0ubmFtZV0gPSBzbG90W2pdLmZuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNsb3QpIHtcbiAgICAgICAgICAgIC8vIGNvbmRpdGlvbmFsIHNpbmdsZSBzbG90IGdlbmVyYXRlZCBieSA8dGVtcGxhdGUgdi1pZj1cIi4uLlwiICNmb28+XG4gICAgICAgICAgICBzbG90c1tzbG90Lm5hbWVdID0gc2xvdC5rZXlcbiAgICAgICAgICAgICAgICA/ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHNsb3QuZm4oLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGF0dGFjaCBicmFuY2gga2V5IHNvIGVhY2ggY29uZGl0aW9uYWwgYnJhbmNoIGlzIGNvbnNpZGVyZWQgYVxuICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgZnJhZ21lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5rZXkgPSBzbG90LmtleTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBzbG90LmZuO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzbG90cztcbn1cblxuLyoqXG4gKiBDb21waWxlciBydW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIGA8c2xvdC8+YFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVuZGVyU2xvdChzbG90cywgbmFtZSwgcHJvcHMgPSB7fSwgXG4vLyB0aGlzIGlzIG5vdCBhIHVzZXItZmFjaW5nIGZ1bmN0aW9uLCBzbyB0aGUgZmFsbGJhY2sgaXMgYWx3YXlzIGdlbmVyYXRlZCBieVxuLy8gdGhlIGNvbXBpbGVyIGFuZCBndWFyYW50ZWVkIHRvIGJlIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGFuIGFycmF5XG5mYWxsYmFjaywgbm9TbG90dGVkKSB7XG4gICAgaWYgKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5pc0NFIHx8XG4gICAgICAgIChjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UucGFyZW50ICYmXG4gICAgICAgICAgICBpc0FzeW5jV3JhcHBlcihjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UucGFyZW50KSAmJlxuICAgICAgICAgICAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLnBhcmVudC5pc0NFKSkge1xuICAgICAgICBpZiAobmFtZSAhPT0gJ2RlZmF1bHQnKVxuICAgICAgICAgICAgcHJvcHMubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiBjcmVhdGVWTm9kZSgnc2xvdCcsIHByb3BzLCBmYWxsYmFjayAmJiBmYWxsYmFjaygpKTtcbiAgICB9XG4gICAgbGV0IHNsb3QgPSBzbG90c1tuYW1lXTtcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIHNsb3QgJiYgc2xvdC5sZW5ndGggPiAxKSB7XG4gICAgICAgIHdhcm4oYFNTUi1vcHRpbWl6ZWQgc2xvdCBmdW5jdGlvbiBkZXRlY3RlZCBpbiBhIG5vbi1TU1Itb3B0aW1pemVkIHJlbmRlciBgICtcbiAgICAgICAgICAgIGBmdW5jdGlvbi4gWW91IG5lZWQgdG8gbWFyayB0aGlzIGNvbXBvbmVudCB3aXRoICRkeW5hbWljLXNsb3RzIGluIHRoZSBgICtcbiAgICAgICAgICAgIGBwYXJlbnQgdGVtcGxhdGUuYCk7XG4gICAgICAgIHNsb3QgPSAoKSA9PiBbXTtcbiAgICB9XG4gICAgLy8gYSBjb21waWxlZCBzbG90IGRpc2FibGVzIGJsb2NrIHRyYWNraW5nIGJ5IGRlZmF1bHQgdG8gYXZvaWQgbWFudWFsXG4gICAgLy8gaW52b2NhdGlvbiBpbnRlcmZlcmluZyB3aXRoIHRlbXBsYXRlLWJhc2VkIGJsb2NrIHRyYWNraW5nLCBidXQgaW5cbiAgICAvLyBgcmVuZGVyU2xvdGAgd2UgY2FuIGJlIHN1cmUgdGhhdCBpdCdzIHRlbXBsYXRlLWJhc2VkIHNvIHdlIGNhbiBmb3JjZVxuICAgIC8vIGVuYWJsZSBpdC5cbiAgICBpZiAoc2xvdCAmJiBzbG90Ll9jKSB7XG4gICAgICAgIHNsb3QuX2QgPSBmYWxzZTtcbiAgICB9XG4gICAgb3BlbkJsb2NrKCk7XG4gICAgY29uc3QgdmFsaWRTbG90Q29udGVudCA9IHNsb3QgJiYgZW5zdXJlVmFsaWRWTm9kZShzbG90KHByb3BzKSk7XG4gICAgY29uc3QgcmVuZGVyZWQgPSBjcmVhdGVCbG9jayhGcmFnbWVudCwge1xuICAgICAgICBrZXk6IHByb3BzLmtleSB8fFxuICAgICAgICAgICAgLy8gc2xvdCBjb250ZW50IGFycmF5IG9mIGEgZHluYW1pYyBjb25kaXRpb25hbCBzbG90IG1heSBoYXZlIGEgYnJhbmNoXG4gICAgICAgICAgICAvLyBrZXkgYXR0YWNoZWQgaW4gdGhlIGBjcmVhdGVTbG90c2AgaGVscGVyLCByZXNwZWN0IHRoYXRcbiAgICAgICAgICAgICh2YWxpZFNsb3RDb250ZW50ICYmIHZhbGlkU2xvdENvbnRlbnQua2V5KSB8fFxuICAgICAgICAgICAgYF8ke25hbWV9YFxuICAgIH0sIHZhbGlkU2xvdENvbnRlbnQgfHwgKGZhbGxiYWNrID8gZmFsbGJhY2soKSA6IFtdKSwgdmFsaWRTbG90Q29udGVudCAmJiBzbG90cy5fID09PSAxIC8qIFNsb3RGbGFncy5TVEFCTEUgKi9cbiAgICAgICAgPyA2NCAvKiBQYXRjaEZsYWdzLlNUQUJMRV9GUkFHTUVOVCAqL1xuICAgICAgICA6IC0yIC8qIFBhdGNoRmxhZ3MuQkFJTCAqLyk7XG4gICAgaWYgKCFub1Nsb3R0ZWQgJiYgcmVuZGVyZWQuc2NvcGVJZCkge1xuICAgICAgICByZW5kZXJlZC5zbG90U2NvcGVJZHMgPSBbcmVuZGVyZWQuc2NvcGVJZCArICctcyddO1xuICAgIH1cbiAgICBpZiAoc2xvdCAmJiBzbG90Ll9jKSB7XG4gICAgICAgIHNsb3QuX2QgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVuZGVyZWQ7XG59XG5mdW5jdGlvbiBlbnN1cmVWYWxpZFZOb2RlKHZub2Rlcykge1xuICAgIHJldHVybiB2bm9kZXMuc29tZShjaGlsZCA9PiB7XG4gICAgICAgIGlmICghaXNWTm9kZShjaGlsZCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09IENvbW1lbnQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChjaGlsZC50eXBlID09PSBGcmFnbWVudCAmJlxuICAgICAgICAgICAgIWVuc3VyZVZhbGlkVk5vZGUoY2hpbGQuY2hpbGRyZW4pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KVxuICAgICAgICA/IHZub2Rlc1xuICAgICAgICA6IG51bGw7XG59XG5cbi8qKlxuICogRm9yIHByZWZpeGluZyBrZXlzIGluIHYtb249XCJvYmpcIiB3aXRoIFwib25cIlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gdG9IYW5kbGVycyhvYmosIHByZXNlcnZlQ2FzZUlmTmVjZXNzYXJ5KSB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhaXNPYmplY3Qob2JqKSkge1xuICAgICAgICB3YXJuKGB2LW9uIHdpdGggbm8gYXJndW1lbnQgZXhwZWN0cyBhbiBvYmplY3QgdmFsdWUuYCk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICByZXRbcHJlc2VydmVDYXNlSWZOZWNlc3NhcnkgJiYgL1tBLVpdLy50ZXN0KGtleSlcbiAgICAgICAgICAgID8gYG9uOiR7a2V5fWBcbiAgICAgICAgICAgIDogdG9IYW5kbGVyS2V5KGtleSldID0gb2JqW2tleV07XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogIzI0MzcgSW4gVnVlIDMsIGZ1bmN0aW9uYWwgY29tcG9uZW50cyBkbyBub3QgaGF2ZSBhIHB1YmxpYyBpbnN0YW5jZSBwcm94eSBidXRcbiAqIHRoZXkgZXhpc3QgaW4gdGhlIGludGVybmFsIHBhcmVudCBjaGFpbi4gRm9yIGNvZGUgdGhhdCByZWxpZXMgb24gdHJhdmVyc2luZ1xuICogcHVibGljICRwYXJlbnQgY2hhaW5zLCBza2lwIGZ1bmN0aW9uYWwgb25lcyBhbmQgZ28gdG8gdGhlIHBhcmVudCBpbnN0ZWFkLlxuICovXG5jb25zdCBnZXRQdWJsaWNJbnN0YW5jZSA9IChpKSA9PiB7XG4gICAgaWYgKCFpKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAoaXNTdGF0ZWZ1bENvbXBvbmVudChpKSlcbiAgICAgICAgcmV0dXJuIGdldEV4cG9zZVByb3h5KGkpIHx8IGkucHJveHk7XG4gICAgcmV0dXJuIGdldFB1YmxpY0luc3RhbmNlKGkucGFyZW50KTtcbn07XG5jb25zdCBwdWJsaWNQcm9wZXJ0aWVzTWFwID0gXG4vLyBNb3ZlIFBVUkUgbWFya2VyIHRvIG5ldyBsaW5lIHRvIHdvcmthcm91bmQgY29tcGlsZXIgZGlzY2FyZGluZyBpdFxuLy8gZHVlIHRvIHR5cGUgYW5ub3RhdGlvblxuLyojX19QVVJFX18qLyBleHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSwge1xuICAgICQ6IGkgPT4gaSxcbiAgICAkZWw6IGkgPT4gaS52bm9kZS5lbCxcbiAgICAkZGF0YTogaSA9PiBpLmRhdGEsXG4gICAgJHByb3BzOiBpID0+ICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBzaGFsbG93UmVhZG9ubHkoaS5wcm9wcykgOiBpLnByb3BzKSxcbiAgICAkYXR0cnM6IGkgPT4gKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IHNoYWxsb3dSZWFkb25seShpLmF0dHJzKSA6IGkuYXR0cnMpLFxuICAgICRzbG90czogaSA9PiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gc2hhbGxvd1JlYWRvbmx5KGkuc2xvdHMpIDogaS5zbG90cyksXG4gICAgJHJlZnM6IGkgPT4gKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IHNoYWxsb3dSZWFkb25seShpLnJlZnMpIDogaS5yZWZzKSxcbiAgICAkcGFyZW50OiBpID0+IGdldFB1YmxpY0luc3RhbmNlKGkucGFyZW50KSxcbiAgICAkcm9vdDogaSA9PiBnZXRQdWJsaWNJbnN0YW5jZShpLnJvb3QpLFxuICAgICRlbWl0OiBpID0+IGkuZW1pdCxcbiAgICAkb3B0aW9uczogaSA9PiAoX19WVUVfT1BUSU9OU19BUElfXyA/IHJlc29sdmVNZXJnZWRPcHRpb25zKGkpIDogaS50eXBlKSxcbiAgICAkZm9yY2VVcGRhdGU6IGkgPT4gaS5mIHx8IChpLmYgPSAoKSA9PiBxdWV1ZUpvYihpLnVwZGF0ZSkpLFxuICAgICRuZXh0VGljazogaSA9PiBpLm4gfHwgKGkubiA9IG5leHRUaWNrLmJpbmQoaS5wcm94eSkpLFxuICAgICR3YXRjaDogaSA9PiAoX19WVUVfT1BUSU9OU19BUElfXyA/IGluc3RhbmNlV2F0Y2guYmluZChpKSA6IE5PT1ApXG59KTtcbmNvbnN0IGlzUmVzZXJ2ZWRQcmVmaXggPSAoa2V5KSA9PiBrZXkgPT09ICdfJyB8fCBrZXkgPT09ICckJztcbmNvbnN0IGhhc1NldHVwQmluZGluZyA9IChzdGF0ZSwga2V5KSA9PiBzdGF0ZSAhPT0gRU1QVFlfT0JKICYmICFzdGF0ZS5fX2lzU2NyaXB0U2V0dXAgJiYgaGFzT3duKHN0YXRlLCBrZXkpO1xuY29uc3QgUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzID0ge1xuICAgIGdldCh7IF86IGluc3RhbmNlIH0sIGtleSkge1xuICAgICAgICBjb25zdCB7IGN0eCwgc2V0dXBTdGF0ZSwgZGF0YSwgcHJvcHMsIGFjY2Vzc0NhY2hlLCB0eXBlLCBhcHBDb250ZXh0IH0gPSBpbnN0YW5jZTtcbiAgICAgICAgLy8gZm9yIGludGVybmFsIGZvcm1hdHRlcnMgdG8ga25vdyB0aGF0IHRoaXMgaXMgYSBWdWUgaW5zdGFuY2VcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiBrZXkgPT09ICdfX2lzVnVlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGF0YSAvIHByb3BzIC8gY3R4XG4gICAgICAgIC8vIFRoaXMgZ2V0dGVyIGdldHMgY2FsbGVkIGZvciBldmVyeSBwcm9wZXJ0eSBhY2Nlc3Mgb24gdGhlIHJlbmRlciBjb250ZXh0XG4gICAgICAgIC8vIGR1cmluZyByZW5kZXIgYW5kIGlzIGEgbWFqb3IgaG90c3BvdC4gVGhlIG1vc3QgZXhwZW5zaXZlIHBhcnQgb2YgdGhpc1xuICAgICAgICAvLyBpcyB0aGUgbXVsdGlwbGUgaGFzT3duKCkgY2FsbHMuIEl0J3MgbXVjaCBmYXN0ZXIgdG8gZG8gYSBzaW1wbGUgcHJvcGVydHlcbiAgICAgICAgLy8gYWNjZXNzIG9uIGEgcGxhaW4gb2JqZWN0LCBzbyB3ZSB1c2UgYW4gYWNjZXNzQ2FjaGUgb2JqZWN0ICh3aXRoIG51bGxcbiAgICAgICAgLy8gcHJvdG90eXBlKSB0byBtZW1vaXplIHdoYXQgYWNjZXNzIHR5cGUgYSBrZXkgY29ycmVzcG9uZHMgdG8uXG4gICAgICAgIGxldCBub3JtYWxpemVkUHJvcHM7XG4gICAgICAgIGlmIChrZXlbMF0gIT09ICckJykge1xuICAgICAgICAgICAgY29uc3QgbiA9IGFjY2Vzc0NhY2hlW2tleV07XG4gICAgICAgICAgICBpZiAobiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBBY2Nlc3NUeXBlcy5TRVRVUCAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXR1cFN0YXRlW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBBY2Nlc3NUeXBlcy5EQVRBICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0IC8qIEFjY2Vzc1R5cGVzLkNPTlRFWFQgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4W2tleV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBBY2Nlc3NUeXBlcy5QUk9QUyAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wc1trZXldO1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0OiBqdXN0IGZhbGx0aHJvdWdoXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFzU2V0dXBCaW5kaW5nKHNldHVwU3RhdGUsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gMSAvKiBBY2Nlc3NUeXBlcy5TRVRVUCAqLztcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0dXBTdGF0ZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZGF0YSAhPT0gRU1QVFlfT0JKICYmIGhhc093bihkYXRhLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDIgLyogQWNjZXNzVHlwZXMuREFUQSAqLztcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAvLyBvbmx5IGNhY2hlIG90aGVyIHByb3BlcnRpZXMgd2hlbiBpbnN0YW5jZSBoYXMgZGVjbGFyZWQgKHRodXMgc3RhYmxlKVxuICAgICAgICAgICAgLy8gcHJvcHNcbiAgICAgICAgICAgIChub3JtYWxpemVkUHJvcHMgPSBpbnN0YW5jZS5wcm9wc09wdGlvbnNbMF0pICYmXG4gICAgICAgICAgICAgICAgaGFzT3duKG5vcm1hbGl6ZWRQcm9wcywga2V5KSkge1xuICAgICAgICAgICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSAzIC8qIEFjY2Vzc1R5cGVzLlBST1BTICovO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY3R4ICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGN0eCwga2V5KSkge1xuICAgICAgICAgICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSA0IC8qIEFjY2Vzc1R5cGVzLkNPTlRFWFQgKi87XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eFtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIV9fVlVFX09QVElPTlNfQVBJX18gfHwgc2hvdWxkQ2FjaGVBY2Nlc3MpIHtcbiAgICAgICAgICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gMCAvKiBBY2Nlc3NUeXBlcy5PVEhFUiAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwdWJsaWNHZXR0ZXIgPSBwdWJsaWNQcm9wZXJ0aWVzTWFwW2tleV07XG4gICAgICAgIGxldCBjc3NNb2R1bGUsIGdsb2JhbFByb3BlcnRpZXM7XG4gICAgICAgIC8vIHB1YmxpYyAkeHh4IHByb3BlcnRpZXNcbiAgICAgICAgaWYgKHB1YmxpY0dldHRlcikge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJyRhdHRycycpIHtcbiAgICAgICAgICAgICAgICB0cmFjayhpbnN0YW5jZSwgXCJnZXRcIiAvKiBUcmFja09wVHlwZXMuR0VUICovLCBrZXkpO1xuICAgICAgICAgICAgICAgIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiBtYXJrQXR0cnNBY2Nlc3NlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHB1YmxpY0dldHRlcihpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgIC8vIGNzcyBtb2R1bGUgKGluamVjdGVkIGJ5IHZ1ZS1sb2FkZXIpXG4gICAgICAgIChjc3NNb2R1bGUgPSB0eXBlLl9fY3NzTW9kdWxlcykgJiZcbiAgICAgICAgICAgIChjc3NNb2R1bGUgPSBjc3NNb2R1bGVba2V5XSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjc3NNb2R1bGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3R4ICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGN0eCwga2V5KSkge1xuICAgICAgICAgICAgLy8gdXNlciBtYXkgc2V0IGN1c3RvbSBwcm9wZXJ0aWVzIHRvIGB0aGlzYCB0aGF0IHN0YXJ0IHdpdGggYCRgXG4gICAgICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gNCAvKiBBY2Nlc3NUeXBlcy5DT05URVhUICovO1xuICAgICAgICAgICAgcmV0dXJuIGN0eFtrZXldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAvLyBnbG9iYWwgcHJvcGVydGllc1xuICAgICAgICAoKGdsb2JhbFByb3BlcnRpZXMgPSBhcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzKSxcbiAgICAgICAgICAgIGhhc093bihnbG9iYWxQcm9wZXJ0aWVzLCBrZXkpKSkge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWxQcm9wZXJ0aWVzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmXG4gICAgICAgICAgICBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgJiZcbiAgICAgICAgICAgICghaXNTdHJpbmcoa2V5KSB8fFxuICAgICAgICAgICAgICAgIC8vICMxMDkxIGF2b2lkIGludGVybmFsIGlzUmVmL2lzVk5vZGUgY2hlY2tzIG9uIGNvbXBvbmVudCBpbnN0YW5jZSBsZWFkaW5nXG4gICAgICAgICAgICAgICAgLy8gdG8gaW5maW5pdGUgd2FybmluZyBsb29wXG4gICAgICAgICAgICAgICAga2V5LmluZGV4T2YoJ19fdicpICE9PSAwKSkge1xuICAgICAgICAgICAgaWYgKGRhdGEgIT09IEVNUFRZX09CSiAmJiBpc1Jlc2VydmVkUHJlZml4KGtleVswXSkgJiYgaGFzT3duKGRhdGEsIGtleSkpIHtcbiAgICAgICAgICAgICAgICB3YXJuKGBQcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KGtleSl9IG11c3QgYmUgYWNjZXNzZWQgdmlhICRkYXRhIGJlY2F1c2UgaXQgc3RhcnRzIHdpdGggYSByZXNlcnZlZCBgICtcbiAgICAgICAgICAgICAgICAgICAgYGNoYXJhY3RlciAoXCIkXCIgb3IgXCJfXCIpIGFuZCBpcyBub3QgcHJveGllZCBvbiB0aGUgcmVuZGVyIGNvbnRleHQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpbnN0YW5jZSA9PT0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgd2FybihgUHJvcGVydHkgJHtKU09OLnN0cmluZ2lmeShrZXkpfSB3YXMgYWNjZXNzZWQgZHVyaW5nIHJlbmRlciBgICtcbiAgICAgICAgICAgICAgICAgICAgYGJ1dCBpcyBub3QgZGVmaW5lZCBvbiBpbnN0YW5jZS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgc2V0KHsgXzogaW5zdGFuY2UgfSwga2V5LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCB7IGRhdGEsIHNldHVwU3RhdGUsIGN0eCB9ID0gaW5zdGFuY2U7XG4gICAgICAgIGlmIChoYXNTZXR1cEJpbmRpbmcoc2V0dXBTdGF0ZSwga2V5KSkge1xuICAgICAgICAgICAgc2V0dXBTdGF0ZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiZcbiAgICAgICAgICAgIHNldHVwU3RhdGUuX19pc1NjcmlwdFNldHVwICYmXG4gICAgICAgICAgICBoYXNPd24oc2V0dXBTdGF0ZSwga2V5KSkge1xuICAgICAgICAgICAgd2FybihgQ2Fubm90IG11dGF0ZSA8c2NyaXB0IHNldHVwPiBiaW5kaW5nIFwiJHtrZXl9XCIgZnJvbSBPcHRpb25zIEFQSS5gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkYXRhICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGRhdGEsIGtleSkpIHtcbiAgICAgICAgICAgIGRhdGFba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaGFzT3duKGluc3RhbmNlLnByb3BzLCBrZXkpKSB7XG4gICAgICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgd2FybihgQXR0ZW1wdGluZyB0byBtdXRhdGUgcHJvcCBcIiR7a2V5fVwiLiBQcm9wcyBhcmUgcmVhZG9ubHkuYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleVswXSA9PT0gJyQnICYmIGtleS5zbGljZSgxKSBpbiBpbnN0YW5jZSkge1xuICAgICAgICAgICAgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmXG4gICAgICAgICAgICAgICAgd2FybihgQXR0ZW1wdGluZyB0byBtdXRhdGUgcHVibGljIHByb3BlcnR5IFwiJHtrZXl9XCIuIGAgK1xuICAgICAgICAgICAgICAgICAgICBgUHJvcGVydGllcyBzdGFydGluZyB3aXRoICQgYXJlIHJlc2VydmVkIGFuZCByZWFkb25seS5gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYga2V5IGluIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY3R4W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGhhcyh7IF86IHsgZGF0YSwgc2V0dXBTdGF0ZSwgYWNjZXNzQ2FjaGUsIGN0eCwgYXBwQ29udGV4dCwgcHJvcHNPcHRpb25zIH0gfSwga2V5KSB7XG4gICAgICAgIGxldCBub3JtYWxpemVkUHJvcHM7XG4gICAgICAgIHJldHVybiAoISFhY2Nlc3NDYWNoZVtrZXldIHx8XG4gICAgICAgICAgICAoZGF0YSAhPT0gRU1QVFlfT0JKICYmIGhhc093bihkYXRhLCBrZXkpKSB8fFxuICAgICAgICAgICAgaGFzU2V0dXBCaW5kaW5nKHNldHVwU3RhdGUsIGtleSkgfHxcbiAgICAgICAgICAgICgobm9ybWFsaXplZFByb3BzID0gcHJvcHNPcHRpb25zWzBdKSAmJiBoYXNPd24obm9ybWFsaXplZFByb3BzLCBrZXkpKSB8fFxuICAgICAgICAgICAgaGFzT3duKGN0eCwga2V5KSB8fFxuICAgICAgICAgICAgaGFzT3duKHB1YmxpY1Byb3BlcnRpZXNNYXAsIGtleSkgfHxcbiAgICAgICAgICAgIGhhc093bihhcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLCBrZXkpKTtcbiAgICB9LFxuICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgICAgIGlmIChkZXNjcmlwdG9yLmdldCAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBpbnZhbGlkYXRlIGtleSBjYWNoZSBvZiBhIGdldHRlciBiYXNlZCBwcm9wZXJ0eSAjNTQxN1xuICAgICAgICAgICAgdGFyZ2V0Ll8uYWNjZXNzQ2FjaGVba2V5XSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaGFzT3duKGRlc2NyaXB0b3IsICd2YWx1ZScpKSB7XG4gICAgICAgICAgICB0aGlzLnNldCh0YXJnZXQsIGtleSwgZGVzY3JpcHRvci52YWx1ZSwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbn07XG5pZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmICFmYWxzZSkge1xuICAgIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycy5vd25LZXlzID0gKHRhcmdldCkgPT4ge1xuICAgICAgICB3YXJuKGBBdm9pZCBhcHAgbG9naWMgdGhhdCByZWxpZXMgb24gZW51bWVyYXRpbmcga2V5cyBvbiBhIGNvbXBvbmVudCBpbnN0YW5jZS4gYCArXG4gICAgICAgICAgICBgVGhlIGtleXMgd2lsbCBiZSBlbXB0eSBpbiBwcm9kdWN0aW9uIG1vZGUgdG8gYXZvaWQgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQuYCk7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXModGFyZ2V0KTtcbiAgICB9O1xufVxuY29uc3QgUnVudGltZUNvbXBpbGVkUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzID0gLyojX19QVVJFX18qLyBleHRlbmQoe30sIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycywge1xuICAgIGdldCh0YXJnZXQsIGtleSkge1xuICAgICAgICAvLyBmYXN0IHBhdGggZm9yIHVuc2NvcGFibGVzIHdoZW4gdXNpbmcgYHdpdGhgIGJsb2NrXG4gICAgICAgIGlmIChrZXkgPT09IFN5bWJvbC51bnNjb3BhYmxlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMuZ2V0KHRhcmdldCwga2V5LCB0YXJnZXQpO1xuICAgIH0sXG4gICAgaGFzKF8sIGtleSkge1xuICAgICAgICBjb25zdCBoYXMgPSBrZXlbMF0gIT09ICdfJyAmJiAhaXNHbG9iYWxseVdoaXRlbGlzdGVkKGtleSk7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIWhhcyAmJiBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMuaGFzKF8sIGtleSkpIHtcbiAgICAgICAgICAgIHdhcm4oYFByb3BlcnR5ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gc2hvdWxkIG5vdCBzdGFydCB3aXRoIF8gd2hpY2ggaXMgYSByZXNlcnZlZCBwcmVmaXggZm9yIFZ1ZSBpbnRlcm5hbHMuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhcztcbiAgICB9XG59KTtcbi8vIGRldiBvbmx5XG4vLyBJbiBkZXYgbW9kZSwgdGhlIHByb3h5IHRhcmdldCBleHBvc2VzIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgc2VlbiBvbiBgdGhpc2Bcbi8vIGZvciBlYXNpZXIgY29uc29sZSBpbnNwZWN0aW9uLiBJbiBwcm9kIG1vZGUgaXQgd2lsbCBiZSBhbiBlbXB0eSBvYmplY3Qgc29cbi8vIHRoZXNlIHByb3BlcnRpZXMgZGVmaW5pdGlvbnMgY2FuIGJlIHNraXBwZWQuXG5mdW5jdGlvbiBjcmVhdGVEZXZSZW5kZXJDb250ZXh0KGluc3RhbmNlKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0ge307XG4gICAgLy8gZXhwb3NlIGludGVybmFsIGluc3RhbmNlIGZvciBwcm94eSBoYW5kbGVyc1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGBfYCwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBnZXQ6ICgpID0+IGluc3RhbmNlXG4gICAgfSk7XG4gICAgLy8gZXhwb3NlIHB1YmxpYyBwcm9wZXJ0aWVzXG4gICAgT2JqZWN0LmtleXMocHVibGljUHJvcGVydGllc01hcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiAoKSA9PiBwdWJsaWNQcm9wZXJ0aWVzTWFwW2tleV0oaW5zdGFuY2UpLFxuICAgICAgICAgICAgLy8gaW50ZXJjZXB0ZWQgYnkgdGhlIHByb3h5IHNvIG5vIG5lZWQgZm9yIGltcGxlbWVudGF0aW9uLFxuICAgICAgICAgICAgLy8gYnV0IG5lZWRlZCB0byBwcmV2ZW50IHNldCBlcnJvcnNcbiAgICAgICAgICAgIHNldDogTk9PUFxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuLy8gZGV2IG9ubHlcbmZ1bmN0aW9uIGV4cG9zZVByb3BzT25SZW5kZXJDb250ZXh0KGluc3RhbmNlKSB7XG4gICAgY29uc3QgeyBjdHgsIHByb3BzT3B0aW9uczogW3Byb3BzT3B0aW9uc10gfSA9IGluc3RhbmNlO1xuICAgIGlmIChwcm9wc09wdGlvbnMpIHtcbiAgICAgICAgT2JqZWN0LmtleXMocHJvcHNPcHRpb25zKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IGluc3RhbmNlLnByb3BzW2tleV0sXG4gICAgICAgICAgICAgICAgc2V0OiBOT09QXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8gZGV2IG9ubHlcbmZ1bmN0aW9uIGV4cG9zZVNldHVwU3RhdGVPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpIHtcbiAgICBjb25zdCB7IGN0eCwgc2V0dXBTdGF0ZSB9ID0gaW5zdGFuY2U7XG4gICAgT2JqZWN0LmtleXModG9SYXcoc2V0dXBTdGF0ZSkpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKCFzZXR1cFN0YXRlLl9faXNTY3JpcHRTZXR1cCkge1xuICAgICAgICAgICAgaWYgKGlzUmVzZXJ2ZWRQcmVmaXgoa2V5WzBdKSkge1xuICAgICAgICAgICAgICAgIHdhcm4oYHNldHVwKCkgcmV0dXJuIHByb3BlcnR5ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gc2hvdWxkIG5vdCBzdGFydCB3aXRoIFwiJFwiIG9yIFwiX1wiIGAgK1xuICAgICAgICAgICAgICAgICAgICBgd2hpY2ggYXJlIHJlc2VydmVkIHByZWZpeGVzIGZvciBWdWUgaW50ZXJuYWxzLmApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGdldDogKCkgPT4gc2V0dXBTdGF0ZVtrZXldLFxuICAgICAgICAgICAgICAgIHNldDogTk9PUFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRHVwbGljYXRlQ2hlY2tlcigpIHtcbiAgICBjb25zdCBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgcmV0dXJuICh0eXBlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGNhY2hlW2tleV0pIHtcbiAgICAgICAgICAgIHdhcm4oYCR7dHlwZX0gcHJvcGVydHkgXCIke2tleX1cIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gJHtjYWNoZVtrZXldfS5gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlW2tleV0gPSB0eXBlO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmxldCBzaG91bGRDYWNoZUFjY2VzcyA9IHRydWU7XG5mdW5jdGlvbiBhcHBseU9wdGlvbnMoaW5zdGFuY2UpIHtcbiAgICBjb25zdCBvcHRpb25zID0gcmVzb2x2ZU1lcmdlZE9wdGlvbnMoaW5zdGFuY2UpO1xuICAgIGNvbnN0IHB1YmxpY1RoaXMgPSBpbnN0YW5jZS5wcm94eTtcbiAgICBjb25zdCBjdHggPSBpbnN0YW5jZS5jdHg7XG4gICAgLy8gZG8gbm90IGNhY2hlIHByb3BlcnR5IGFjY2VzcyBvbiBwdWJsaWMgcHJveHkgZHVyaW5nIHN0YXRlIGluaXRpYWxpemF0aW9uXG4gICAgc2hvdWxkQ2FjaGVBY2Nlc3MgPSBmYWxzZTtcbiAgICAvLyBjYWxsIGJlZm9yZUNyZWF0ZSBmaXJzdCBiZWZvcmUgYWNjZXNzaW5nIG90aGVyIG9wdGlvbnMgc2luY2VcbiAgICAvLyB0aGUgaG9vayBtYXkgbXV0YXRlIHJlc29sdmVkIG9wdGlvbnMgKCMyNzkxKVxuICAgIGlmIChvcHRpb25zLmJlZm9yZUNyZWF0ZSkge1xuICAgICAgICBjYWxsSG9vayhvcHRpb25zLmJlZm9yZUNyZWF0ZSwgaW5zdGFuY2UsIFwiYmNcIiAvKiBMaWZlY3ljbGVIb29rcy5CRUZPUkVfQ1JFQVRFICovKTtcbiAgICB9XG4gICAgY29uc3QgeyBcbiAgICAvLyBzdGF0ZVxuICAgIGRhdGE6IGRhdGFPcHRpb25zLCBjb21wdXRlZDogY29tcHV0ZWRPcHRpb25zLCBtZXRob2RzLCB3YXRjaDogd2F0Y2hPcHRpb25zLCBwcm92aWRlOiBwcm92aWRlT3B0aW9ucywgaW5qZWN0OiBpbmplY3RPcHRpb25zLCBcbiAgICAvLyBsaWZlY3ljbGVcbiAgICBjcmVhdGVkLCBiZWZvcmVNb3VudCwgbW91bnRlZCwgYmVmb3JlVXBkYXRlLCB1cGRhdGVkLCBhY3RpdmF0ZWQsIGRlYWN0aXZhdGVkLCBiZWZvcmVEZXN0cm95LCBiZWZvcmVVbm1vdW50LCBkZXN0cm95ZWQsIHVubW91bnRlZCwgcmVuZGVyLCByZW5kZXJUcmFja2VkLCByZW5kZXJUcmlnZ2VyZWQsIGVycm9yQ2FwdHVyZWQsIHNlcnZlclByZWZldGNoLCBcbiAgICAvLyBwdWJsaWMgQVBJXG4gICAgZXhwb3NlLCBpbmhlcml0QXR0cnMsIFxuICAgIC8vIGFzc2V0c1xuICAgIGNvbXBvbmVudHMsIGRpcmVjdGl2ZXMsIGZpbHRlcnMgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzID0gKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gY3JlYXRlRHVwbGljYXRlQ2hlY2tlcigpIDogbnVsbDtcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgIGNvbnN0IFtwcm9wc09wdGlvbnNdID0gaW5zdGFuY2UucHJvcHNPcHRpb25zO1xuICAgICAgICBpZiAocHJvcHNPcHRpb25zKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wc09wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMoXCJQcm9wc1wiIC8qIE9wdGlvblR5cGVzLlBST1BTICovLCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG9wdGlvbnMgaW5pdGlhbGl6YXRpb24gb3JkZXIgKHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBWdWUgMik6XG4gICAgLy8gLSBwcm9wcyAoYWxyZWFkeSBkb25lIG91dHNpZGUgb2YgdGhpcyBmdW5jdGlvbilcbiAgICAvLyAtIGluamVjdFxuICAgIC8vIC0gbWV0aG9kc1xuICAgIC8vIC0gZGF0YSAoZGVmZXJyZWQgc2luY2UgaXQgcmVsaWVzIG9uIGB0aGlzYCBhY2Nlc3MpXG4gICAgLy8gLSBjb21wdXRlZFxuICAgIC8vIC0gd2F0Y2ggKGRlZmVycmVkIHNpbmNlIGl0IHJlbGllcyBvbiBgdGhpc2AgYWNjZXNzKVxuICAgIGlmIChpbmplY3RPcHRpb25zKSB7XG4gICAgICAgIHJlc29sdmVJbmplY3Rpb25zKGluamVjdE9wdGlvbnMsIGN0eCwgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzLCBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy51bndyYXBJbmplY3RlZFJlZik7XG4gICAgfVxuICAgIGlmIChtZXRob2RzKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1ldGhvZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZEhhbmRsZXIgPSBtZXRob2RzW2tleV07XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihtZXRob2RIYW5kbGVyKSkge1xuICAgICAgICAgICAgICAgIC8vIEluIGRldiBtb2RlLCB3ZSB1c2UgdGhlIGBjcmVhdGVSZW5kZXJDb250ZXh0YCBmdW5jdGlvbiB0byBkZWZpbmVcbiAgICAgICAgICAgICAgICAvLyBtZXRob2RzIHRvIHRoZSBwcm94eSB0YXJnZXQsIGFuZCB0aG9zZSBhcmUgcmVhZC1vbmx5IGJ1dFxuICAgICAgICAgICAgICAgIC8vIHJlY29uZmlndXJhYmxlLCBzbyBpdCBuZWVkcyB0byBiZSByZWRlZmluZWQgaGVyZVxuICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWV0aG9kSGFuZGxlci5iaW5kKHB1YmxpY1RoaXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4W2tleV0gPSBtZXRob2RIYW5kbGVyLmJpbmQocHVibGljVGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKFwiTWV0aG9kc1wiIC8qIE9wdGlvblR5cGVzLk1FVEhPRFMgKi8sIGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgd2FybihgTWV0aG9kIFwiJHtrZXl9XCIgaGFzIHR5cGUgXCIke3R5cGVvZiBtZXRob2RIYW5kbGVyfVwiIGluIHRoZSBjb21wb25lbnQgZGVmaW5pdGlvbi4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBEaWQgeW91IHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gY29ycmVjdGx5P2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChkYXRhT3B0aW9ucykge1xuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmICFpc0Z1bmN0aW9uKGRhdGFPcHRpb25zKSkge1xuICAgICAgICAgICAgd2FybihgVGhlIGRhdGEgb3B0aW9uIG11c3QgYmUgYSBmdW5jdGlvbi4gYCArXG4gICAgICAgICAgICAgICAgYFBsYWluIG9iamVjdCB1c2FnZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSBkYXRhT3B0aW9ucy5jYWxsKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpO1xuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIGlzUHJvbWlzZShkYXRhKSkge1xuICAgICAgICAgICAgd2FybihgZGF0YSgpIHJldHVybmVkIGEgUHJvbWlzZSAtIG5vdGUgZGF0YSgpIGNhbm5vdCBiZSBhc3luYzsgSWYgeW91IGAgK1xuICAgICAgICAgICAgICAgIGBpbnRlbmQgdG8gcGVyZm9ybSBkYXRhIGZldGNoaW5nIGJlZm9yZSBjb21wb25lbnQgcmVuZGVycywgdXNlIGAgK1xuICAgICAgICAgICAgICAgIGBhc3luYyBzZXR1cCgpICsgPFN1c3BlbnNlPi5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgd2FybihgZGF0YSgpIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0LmApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaW5zdGFuY2UuZGF0YSA9IHJlYWN0aXZlKGRhdGEpO1xuICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKFwiRGF0YVwiIC8qIE9wdGlvblR5cGVzLkRBVEEgKi8sIGtleSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cG9zZSBkYXRhIG9uIGN0eCBkdXJpbmcgZGV2XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNSZXNlcnZlZFByZWZpeChrZXlbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IGRhdGFba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IE5PT1BcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHN0YXRlIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlIGF0IHRoaXMgcG9pbnQgLSBzdGFydCBjYWNoaW5nIGFjY2Vzc1xuICAgIHNob3VsZENhY2hlQWNjZXNzID0gdHJ1ZTtcbiAgICBpZiAoY29tcHV0ZWRPcHRpb25zKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNvbXB1dGVkT3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3Qgb3B0ID0gY29tcHV0ZWRPcHRpb25zW2tleV07XG4gICAgICAgICAgICBjb25zdCBnZXQgPSBpc0Z1bmN0aW9uKG9wdClcbiAgICAgICAgICAgICAgICA/IG9wdC5iaW5kKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpXG4gICAgICAgICAgICAgICAgOiBpc0Z1bmN0aW9uKG9wdC5nZXQpXG4gICAgICAgICAgICAgICAgICAgID8gb3B0LmdldC5iaW5kKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpXG4gICAgICAgICAgICAgICAgICAgIDogTk9PUDtcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgZ2V0ID09PSBOT09QKSB7XG4gICAgICAgICAgICAgICAgd2FybihgQ29tcHV0ZWQgcHJvcGVydHkgXCIke2tleX1cIiBoYXMgbm8gZ2V0dGVyLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2V0ID0gIWlzRnVuY3Rpb24ob3B0KSAmJiBpc0Z1bmN0aW9uKG9wdC5zZXQpXG4gICAgICAgICAgICAgICAgPyBvcHQuc2V0LmJpbmQocHVibGljVGhpcylcbiAgICAgICAgICAgICAgICA6IChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKVxuICAgICAgICAgICAgICAgICAgICA/ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4oYFdyaXRlIG9wZXJhdGlvbiBmYWlsZWQ6IGNvbXB1dGVkIHByb3BlcnR5IFwiJHtrZXl9XCIgaXMgcmVhZG9ubHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgOiBOT09QO1xuICAgICAgICAgICAgY29uc3QgYyA9IGNvbXB1dGVkKHtcbiAgICAgICAgICAgICAgICBnZXQsXG4gICAgICAgICAgICAgICAgc2V0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGdldDogKCkgPT4gYy52YWx1ZSxcbiAgICAgICAgICAgICAgICBzZXQ6IHYgPT4gKGMudmFsdWUgPSB2KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKFwiQ29tcHV0ZWRcIiAvKiBPcHRpb25UeXBlcy5DT01QVVRFRCAqLywga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAod2F0Y2hPcHRpb25zKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHdhdGNoT3B0aW9ucykge1xuICAgICAgICAgICAgY3JlYXRlV2F0Y2hlcih3YXRjaE9wdGlvbnNba2V5XSwgY3R4LCBwdWJsaWNUaGlzLCBrZXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwcm92aWRlT3B0aW9ucykge1xuICAgICAgICBjb25zdCBwcm92aWRlcyA9IGlzRnVuY3Rpb24ocHJvdmlkZU9wdGlvbnMpXG4gICAgICAgICAgICA/IHByb3ZpZGVPcHRpb25zLmNhbGwocHVibGljVGhpcylcbiAgICAgICAgICAgIDogcHJvdmlkZU9wdGlvbnM7XG4gICAgICAgIFJlZmxlY3Qub3duS2V5cyhwcm92aWRlcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgcHJvdmlkZShrZXksIHByb3ZpZGVzW2tleV0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGNyZWF0ZWQpIHtcbiAgICAgICAgY2FsbEhvb2soY3JlYXRlZCwgaW5zdGFuY2UsIFwiY1wiIC8qIExpZmVjeWNsZUhvb2tzLkNSRUFURUQgKi8pO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWdpc3RlckxpZmVjeWNsZUhvb2socmVnaXN0ZXIsIGhvb2spIHtcbiAgICAgICAgaWYgKGlzQXJyYXkoaG9vaykpIHtcbiAgICAgICAgICAgIGhvb2suZm9yRWFjaChfaG9vayA9PiByZWdpc3RlcihfaG9vay5iaW5kKHB1YmxpY1RoaXMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaG9vaykge1xuICAgICAgICAgICAgcmVnaXN0ZXIoaG9vay5iaW5kKHB1YmxpY1RoaXMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25CZWZvcmVNb3VudCwgYmVmb3JlTW91bnQpO1xuICAgIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbk1vdW50ZWQsIG1vdW50ZWQpO1xuICAgIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkJlZm9yZVVwZGF0ZSwgYmVmb3JlVXBkYXRlKTtcbiAgICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25VcGRhdGVkLCB1cGRhdGVkKTtcbiAgICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25BY3RpdmF0ZWQsIGFjdGl2YXRlZCk7XG4gICAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uRGVhY3RpdmF0ZWQsIGRlYWN0aXZhdGVkKTtcbiAgICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25FcnJvckNhcHR1cmVkLCBlcnJvckNhcHR1cmVkKTtcbiAgICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25SZW5kZXJUcmFja2VkLCByZW5kZXJUcmFja2VkKTtcbiAgICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25SZW5kZXJUcmlnZ2VyZWQsIHJlbmRlclRyaWdnZXJlZCk7XG4gICAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uQmVmb3JlVW5tb3VudCwgYmVmb3JlVW5tb3VudCk7XG4gICAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uVW5tb3VudGVkLCB1bm1vdW50ZWQpO1xuICAgIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblNlcnZlclByZWZldGNoLCBzZXJ2ZXJQcmVmZXRjaCk7XG4gICAgaWYgKGlzQXJyYXkoZXhwb3NlKSkge1xuICAgICAgICBpZiAoZXhwb3NlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZXhwb3NlZCA9IGluc3RhbmNlLmV4cG9zZWQgfHwgKGluc3RhbmNlLmV4cG9zZWQgPSB7fSk7XG4gICAgICAgICAgICBleHBvc2UuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvc2VkLCBrZXksIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiBwdWJsaWNUaGlzW2tleV0sXG4gICAgICAgICAgICAgICAgICAgIHNldDogdmFsID0+IChwdWJsaWNUaGlzW2tleV0gPSB2YWwpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaW5zdGFuY2UuZXhwb3NlZCkge1xuICAgICAgICAgICAgaW5zdGFuY2UuZXhwb3NlZCA9IHt9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG9wdGlvbnMgdGhhdCBhcmUgaGFuZGxlZCB3aGVuIGNyZWF0aW5nIHRoZSBpbnN0YW5jZSBidXQgYWxzbyBuZWVkIHRvIGJlXG4gICAgLy8gYXBwbGllZCBmcm9tIG1peGluc1xuICAgIGlmIChyZW5kZXIgJiYgaW5zdGFuY2UucmVuZGVyID09PSBOT09QKSB7XG4gICAgICAgIGluc3RhbmNlLnJlbmRlciA9IHJlbmRlcjtcbiAgICB9XG4gICAgaWYgKGluaGVyaXRBdHRycyAhPSBudWxsKSB7XG4gICAgICAgIGluc3RhbmNlLmluaGVyaXRBdHRycyA9IGluaGVyaXRBdHRycztcbiAgICB9XG4gICAgLy8gYXNzZXQgb3B0aW9ucy5cbiAgICBpZiAoY29tcG9uZW50cylcbiAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50cyA9IGNvbXBvbmVudHM7XG4gICAgaWYgKGRpcmVjdGl2ZXMpXG4gICAgICAgIGluc3RhbmNlLmRpcmVjdGl2ZXMgPSBkaXJlY3RpdmVzO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUluamVjdGlvbnMoaW5qZWN0T3B0aW9ucywgY3R4LCBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMgPSBOT09QLCB1bndyYXBSZWYgPSBmYWxzZSkge1xuICAgIGlmIChpc0FycmF5KGluamVjdE9wdGlvbnMpKSB7XG4gICAgICAgIGluamVjdE9wdGlvbnMgPSBub3JtYWxpemVJbmplY3QoaW5qZWN0T3B0aW9ucyk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIGluamVjdE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3B0ID0gaW5qZWN0T3B0aW9uc1trZXldO1xuICAgICAgICBsZXQgaW5qZWN0ZWQ7XG4gICAgICAgIGlmIChpc09iamVjdChvcHQpKSB7XG4gICAgICAgICAgICBpZiAoJ2RlZmF1bHQnIGluIG9wdCkge1xuICAgICAgICAgICAgICAgIGluamVjdGVkID0gaW5qZWN0KG9wdC5mcm9tIHx8IGtleSwgb3B0LmRlZmF1bHQsIHRydWUgLyogdHJlYXQgZGVmYXVsdCBmdW5jdGlvbiBhcyBmYWN0b3J5ICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluamVjdGVkID0gaW5qZWN0KG9wdC5mcm9tIHx8IGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbmplY3RlZCA9IGluamVjdChvcHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1JlZihpbmplY3RlZCkpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gcmVtb3ZlIHRoZSBjaGVjayBpbiAzLjNcbiAgICAgICAgICAgIGlmICh1bndyYXBSZWYpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IGluamVjdGVkLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBzZXQ6IHYgPT4gKGluamVjdGVkLnZhbHVlID0gdilcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FybihgaW5qZWN0ZWQgcHJvcGVydHkgXCIke2tleX1cIiBpcyBhIHJlZiBhbmQgd2lsbCBiZSBhdXRvLXVud3JhcHBlZCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBhbmQgbm8gbG9uZ2VyIG5lZWRzIFxcYC52YWx1ZVxcYCBpbiB0aGUgbmV4dCBtaW5vciByZWxlYXNlLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUbyBvcHQtaW4gdG8gdGhlIG5ldyBiZWhhdmlvciBub3csIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYHNldCBcXGBhcHAuY29uZmlnLnVud3JhcEluamVjdGVkUmVmID0gdHJ1ZVxcYCAodGhpcyBjb25maWcgaXMgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgdGVtcG9yYXJ5IGFuZCB3aWxsIG5vdCBiZSBuZWVkZWQgaW4gdGhlIGZ1dHVyZS4pYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN0eFtrZXldID0gaW5qZWN0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjdHhba2V5XSA9IGluamVjdGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkluamVjdFwiIC8qIE9wdGlvblR5cGVzLklOSkVDVCAqLywga2V5KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNhbGxIb29rKGhvb2ssIGluc3RhbmNlLCB0eXBlKSB7XG4gICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoaXNBcnJheShob29rKVxuICAgICAgICA/IGhvb2subWFwKGggPT4gaC5iaW5kKGluc3RhbmNlLnByb3h5KSlcbiAgICAgICAgOiBob29rLmJpbmQoaW5zdGFuY2UucHJveHkpLCBpbnN0YW5jZSwgdHlwZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVXYXRjaGVyKHJhdywgY3R4LCBwdWJsaWNUaGlzLCBrZXkpIHtcbiAgICBjb25zdCBnZXR0ZXIgPSBrZXkuaW5jbHVkZXMoJy4nKVxuICAgICAgICA/IGNyZWF0ZVBhdGhHZXR0ZXIocHVibGljVGhpcywga2V5KVxuICAgICAgICA6ICgpID0+IHB1YmxpY1RoaXNba2V5XTtcbiAgICBpZiAoaXNTdHJpbmcocmF3KSkge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gY3R4W3Jhd107XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgICAgICAgICB3YXRjaChnZXR0ZXIsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgd2FybihgSW52YWxpZCB3YXRjaCBoYW5kbGVyIHNwZWNpZmllZCBieSBrZXkgXCIke3Jhd31cImAsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzRnVuY3Rpb24ocmF3KSkge1xuICAgICAgICB3YXRjaChnZXR0ZXIsIHJhdy5iaW5kKHB1YmxpY1RoaXMpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3QocmF3KSkge1xuICAgICAgICBpZiAoaXNBcnJheShyYXcpKSB7XG4gICAgICAgICAgICByYXcuZm9yRWFjaChyID0+IGNyZWF0ZVdhdGNoZXIociwgY3R4LCBwdWJsaWNUaGlzLCBrZXkpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBpc0Z1bmN0aW9uKHJhdy5oYW5kbGVyKVxuICAgICAgICAgICAgICAgID8gcmF3LmhhbmRsZXIuYmluZChwdWJsaWNUaGlzKVxuICAgICAgICAgICAgICAgIDogY3R4W3Jhdy5oYW5kbGVyXTtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgICAgICAgICAgICAgd2F0Y2goZ2V0dGVyLCBoYW5kbGVyLCByYXcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgd2FybihgSW52YWxpZCB3YXRjaCBoYW5kbGVyIHNwZWNpZmllZCBieSBrZXkgXCIke3Jhdy5oYW5kbGVyfVwiYCwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgIHdhcm4oYEludmFsaWQgd2F0Y2ggb3B0aW9uOiBcIiR7a2V5fVwiYCwgcmF3KTtcbiAgICB9XG59XG4vKipcbiAqIFJlc29sdmUgbWVyZ2VkIG9wdGlvbnMgYW5kIGNhY2hlIGl0IG9uIHRoZSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGRvbmUgb25seSBvbmNlIHBlci1jb21wb25lbnQgc2luY2UgdGhlIG1lcmdpbmcgZG9lcyBub3QgaW52b2x2ZVxuICogaW5zdGFuY2VzLlxuICovXG5mdW5jdGlvbiByZXNvbHZlTWVyZ2VkT3B0aW9ucyhpbnN0YW5jZSkge1xuICAgIGNvbnN0IGJhc2UgPSBpbnN0YW5jZS50eXBlO1xuICAgIGNvbnN0IHsgbWl4aW5zLCBleHRlbmRzOiBleHRlbmRzT3B0aW9ucyB9ID0gYmFzZTtcbiAgICBjb25zdCB7IG1peGluczogZ2xvYmFsTWl4aW5zLCBvcHRpb25zQ2FjaGU6IGNhY2hlLCBjb25maWc6IHsgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzIH0gfSA9IGluc3RhbmNlLmFwcENvbnRleHQ7XG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGJhc2UpO1xuICAgIGxldCByZXNvbHZlZDtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgIHJlc29sdmVkID0gY2FjaGVkO1xuICAgIH1cbiAgICBlbHNlIGlmICghZ2xvYmFsTWl4aW5zLmxlbmd0aCAmJiAhbWl4aW5zICYmICFleHRlbmRzT3B0aW9ucykge1xuICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IGJhc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc29sdmVkID0ge307XG4gICAgICAgIGlmIChnbG9iYWxNaXhpbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBnbG9iYWxNaXhpbnMuZm9yRWFjaChtID0+IG1lcmdlT3B0aW9ucyhyZXNvbHZlZCwgbSwgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzLCB0cnVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgbWVyZ2VPcHRpb25zKHJlc29sdmVkLCBiYXNlLCBvcHRpb25NZXJnZVN0cmF0ZWdpZXMpO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3QoYmFzZSkpIHtcbiAgICAgICAgY2FjaGUuc2V0KGJhc2UsIHJlc29sdmVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkO1xufVxuZnVuY3Rpb24gbWVyZ2VPcHRpb25zKHRvLCBmcm9tLCBzdHJhdHMsIGFzTWl4aW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IHsgbWl4aW5zLCBleHRlbmRzOiBleHRlbmRzT3B0aW9ucyB9ID0gZnJvbTtcbiAgICBpZiAoZXh0ZW5kc09wdGlvbnMpIHtcbiAgICAgICAgbWVyZ2VPcHRpb25zKHRvLCBleHRlbmRzT3B0aW9ucywgc3RyYXRzLCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKG1peGlucykge1xuICAgICAgICBtaXhpbnMuZm9yRWFjaCgobSkgPT4gbWVyZ2VPcHRpb25zKHRvLCBtLCBzdHJhdHMsIHRydWUpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgICAgICBpZiAoYXNNaXhpbiAmJiBrZXkgPT09ICdleHBvc2UnKSB7XG4gICAgICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiZcbiAgICAgICAgICAgICAgICB3YXJuKGBcImV4cG9zZVwiIG9wdGlvbiBpcyBpZ25vcmVkIHdoZW4gZGVjbGFyZWQgaW4gbWl4aW5zIG9yIGV4dGVuZHMuIGAgK1xuICAgICAgICAgICAgICAgICAgICBgSXQgc2hvdWxkIG9ubHkgYmUgZGVjbGFyZWQgaW4gdGhlIGJhc2UgY29tcG9uZW50IGl0c2VsZi5gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmF0ID0gaW50ZXJuYWxPcHRpb25NZXJnZVN0cmF0c1trZXldIHx8IChzdHJhdHMgJiYgc3RyYXRzW2tleV0pO1xuICAgICAgICAgICAgdG9ba2V5XSA9IHN0cmF0ID8gc3RyYXQodG9ba2V5XSwgZnJvbVtrZXldKSA6IGZyb21ba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG87XG59XG5jb25zdCBpbnRlcm5hbE9wdGlvbk1lcmdlU3RyYXRzID0ge1xuICAgIGRhdGE6IG1lcmdlRGF0YUZuLFxuICAgIHByb3BzOiBtZXJnZU9iamVjdE9wdGlvbnMsXG4gICAgZW1pdHM6IG1lcmdlT2JqZWN0T3B0aW9ucyxcbiAgICAvLyBvYmplY3RzXG4gICAgbWV0aG9kczogbWVyZ2VPYmplY3RPcHRpb25zLFxuICAgIGNvbXB1dGVkOiBtZXJnZU9iamVjdE9wdGlvbnMsXG4gICAgLy8gbGlmZWN5Y2xlXG4gICAgYmVmb3JlQ3JlYXRlOiBtZXJnZUFzQXJyYXksXG4gICAgY3JlYXRlZDogbWVyZ2VBc0FycmF5LFxuICAgIGJlZm9yZU1vdW50OiBtZXJnZUFzQXJyYXksXG4gICAgbW91bnRlZDogbWVyZ2VBc0FycmF5LFxuICAgIGJlZm9yZVVwZGF0ZTogbWVyZ2VBc0FycmF5LFxuICAgIHVwZGF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgICBiZWZvcmVEZXN0cm95OiBtZXJnZUFzQXJyYXksXG4gICAgYmVmb3JlVW5tb3VudDogbWVyZ2VBc0FycmF5LFxuICAgIGRlc3Ryb3llZDogbWVyZ2VBc0FycmF5LFxuICAgIHVubW91bnRlZDogbWVyZ2VBc0FycmF5LFxuICAgIGFjdGl2YXRlZDogbWVyZ2VBc0FycmF5LFxuICAgIGRlYWN0aXZhdGVkOiBtZXJnZUFzQXJyYXksXG4gICAgZXJyb3JDYXB0dXJlZDogbWVyZ2VBc0FycmF5LFxuICAgIHNlcnZlclByZWZldGNoOiBtZXJnZUFzQXJyYXksXG4gICAgLy8gYXNzZXRzXG4gICAgY29tcG9uZW50czogbWVyZ2VPYmplY3RPcHRpb25zLFxuICAgIGRpcmVjdGl2ZXM6IG1lcmdlT2JqZWN0T3B0aW9ucyxcbiAgICAvLyB3YXRjaFxuICAgIHdhdGNoOiBtZXJnZVdhdGNoT3B0aW9ucyxcbiAgICAvLyBwcm92aWRlIC8gaW5qZWN0XG4gICAgcHJvdmlkZTogbWVyZ2VEYXRhRm4sXG4gICAgaW5qZWN0OiBtZXJnZUluamVjdFxufTtcbmZ1bmN0aW9uIG1lcmdlRGF0YUZuKHRvLCBmcm9tKSB7XG4gICAgaWYgKCFmcm9tKSB7XG4gICAgICAgIHJldHVybiB0bztcbiAgICB9XG4gICAgaWYgKCF0bykge1xuICAgICAgICByZXR1cm4gZnJvbTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlZERhdGFGbigpIHtcbiAgICAgICAgcmV0dXJuIChleHRlbmQpKGlzRnVuY3Rpb24odG8pID8gdG8uY2FsbCh0aGlzLCB0aGlzKSA6IHRvLCBpc0Z1bmN0aW9uKGZyb20pID8gZnJvbS5jYWxsKHRoaXMsIHRoaXMpIDogZnJvbSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG1lcmdlSW5qZWN0KHRvLCBmcm9tKSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0T3B0aW9ucyhub3JtYWxpemVJbmplY3QodG8pLCBub3JtYWxpemVJbmplY3QoZnJvbSkpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplSW5qZWN0KHJhdykge1xuICAgIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICAgICAgY29uc3QgcmVzID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXNbcmF3W2ldXSA9IHJhd1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICByZXR1cm4gcmF3O1xufVxuZnVuY3Rpb24gbWVyZ2VBc0FycmF5KHRvLCBmcm9tKSB7XG4gICAgcmV0dXJuIHRvID8gWy4uLm5ldyBTZXQoW10uY29uY2F0KHRvLCBmcm9tKSldIDogZnJvbTtcbn1cbmZ1bmN0aW9uIG1lcmdlT2JqZWN0T3B0aW9ucyh0bywgZnJvbSkge1xuICAgIHJldHVybiB0byA/IGV4dGVuZChleHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSwgdG8pLCBmcm9tKSA6IGZyb207XG59XG5mdW5jdGlvbiBtZXJnZVdhdGNoT3B0aW9ucyh0bywgZnJvbSkge1xuICAgIGlmICghdG8pXG4gICAgICAgIHJldHVybiBmcm9tO1xuICAgIGlmICghZnJvbSlcbiAgICAgICAgcmV0dXJuIHRvO1xuICAgIGNvbnN0IG1lcmdlZCA9IGV4dGVuZChPYmplY3QuY3JlYXRlKG51bGwpLCB0byk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgICAgICBtZXJnZWRba2V5XSA9IG1lcmdlQXNBcnJheSh0b1trZXldLCBmcm9tW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VkO1xufVxuXG5mdW5jdGlvbiBpbml0UHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBpc1N0YXRlZnVsLCAvLyByZXN1bHQgb2YgYml0d2lzZSBmbGFnIGNvbXBhcmlzb25cbmlzU1NSID0gZmFsc2UpIHtcbiAgICBjb25zdCBwcm9wcyA9IHt9O1xuICAgIGNvbnN0IGF0dHJzID0ge307XG4gICAgZGVmKGF0dHJzLCBJbnRlcm5hbE9iamVjdEtleSwgMSk7XG4gICAgaW5zdGFuY2UucHJvcHNEZWZhdWx0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgc2V0RnVsbFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgcHJvcHMsIGF0dHJzKTtcbiAgICAvLyBlbnN1cmUgYWxsIGRlY2xhcmVkIHByb3Aga2V5cyBhcmUgcHJlc2VudFxuICAgIGZvciAoY29uc3Qga2V5IGluIGluc3RhbmNlLnByb3BzT3B0aW9uc1swXSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gcHJvcHMpKSB7XG4gICAgICAgICAgICBwcm9wc1trZXldID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHZhbGlkYXRpb25cbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgIHZhbGlkYXRlUHJvcHMocmF3UHJvcHMgfHwge30sIHByb3BzLCBpbnN0YW5jZSk7XG4gICAgfVxuICAgIGlmIChpc1N0YXRlZnVsKSB7XG4gICAgICAgIC8vIHN0YXRlZnVsXG4gICAgICAgIGluc3RhbmNlLnByb3BzID0gaXNTU1IgPyBwcm9wcyA6IHNoYWxsb3dSZWFjdGl2ZShwcm9wcyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIWluc3RhbmNlLnR5cGUucHJvcHMpIHtcbiAgICAgICAgICAgIC8vIGZ1bmN0aW9uYWwgdy8gb3B0aW9uYWwgcHJvcHMsIHByb3BzID09PSBhdHRyc1xuICAgICAgICAgICAgaW5zdGFuY2UucHJvcHMgPSBhdHRycztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGZ1bmN0aW9uYWwgdy8gZGVjbGFyZWQgcHJvcHNcbiAgICAgICAgICAgIGluc3RhbmNlLnByb3BzID0gcHJvcHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5zdGFuY2UuYXR0cnMgPSBhdHRycztcbn1cbmZ1bmN0aW9uIGlzSW5IbXJDb250ZXh0KGluc3RhbmNlKSB7XG4gICAgd2hpbGUgKGluc3RhbmNlKSB7XG4gICAgICAgIGlmIChpbnN0YW5jZS50eXBlLl9faG1ySWQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5wYXJlbnQ7XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCByYXdQcmV2UHJvcHMsIG9wdGltaXplZCkge1xuICAgIGNvbnN0IHsgcHJvcHMsIGF0dHJzLCB2bm9kZTogeyBwYXRjaEZsYWcgfSB9ID0gaW5zdGFuY2U7XG4gICAgY29uc3QgcmF3Q3VycmVudFByb3BzID0gdG9SYXcocHJvcHMpO1xuICAgIGNvbnN0IFtvcHRpb25zXSA9IGluc3RhbmNlLnByb3BzT3B0aW9ucztcbiAgICBsZXQgaGFzQXR0cnNDaGFuZ2VkID0gZmFsc2U7XG4gICAgaWYgKFxuICAgIC8vIGFsd2F5cyBmb3JjZSBmdWxsIGRpZmYgaW4gZGV2XG4gICAgLy8gLSAjMTk0MiBpZiBobXIgaXMgZW5hYmxlZCB3aXRoIHNmYyBjb21wb25lbnRcbiAgICAvLyAtIHZpdGUjODcyIG5vbi1zZmMgY29tcG9uZW50IHVzZWQgYnkgc2ZjIGNvbXBvbmVudFxuICAgICEoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIGlzSW5IbXJDb250ZXh0KGluc3RhbmNlKSkgJiZcbiAgICAgICAgKG9wdGltaXplZCB8fCBwYXRjaEZsYWcgPiAwKSAmJlxuICAgICAgICAhKHBhdGNoRmxhZyAmIDE2IC8qIFBhdGNoRmxhZ3MuRlVMTF9QUk9QUyAqLykpIHtcbiAgICAgICAgaWYgKHBhdGNoRmxhZyAmIDggLyogUGF0Y2hGbGFncy5QUk9QUyAqLykge1xuICAgICAgICAgICAgLy8gQ29tcGlsZXItZ2VuZXJhdGVkIHByb3BzICYgbm8ga2V5cyBjaGFuZ2UsIGp1c3Qgc2V0IHRoZSB1cGRhdGVkXG4gICAgICAgICAgICAvLyB0aGUgcHJvcHMuXG4gICAgICAgICAgICBjb25zdCBwcm9wc1RvVXBkYXRlID0gaW5zdGFuY2Uudm5vZGUuZHluYW1pY1Byb3BzO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wc1RvVXBkYXRlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IHByb3BzVG9VcGRhdGVbaV07XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBpZiB0aGUgcHJvcCBrZXkgaXMgYSBkZWNsYXJlZCBlbWl0IGV2ZW50IGxpc3RlbmVyXG4gICAgICAgICAgICAgICAgaWYgKGlzRW1pdExpc3RlbmVyKGluc3RhbmNlLmVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gUFJPUFMgZmxhZyBndWFyYW50ZWVzIHJhd1Byb3BzIHRvIGJlIG5vbi1udWxsXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByYXdQcm9wc1trZXldO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGF0dHIgLyBwcm9wcyBzZXBhcmF0aW9uIHdhcyBkb25lIG9uIGluaXQgYW5kIHdpbGwgYmUgY29uc2lzdGVudFxuICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIGNvZGUgcGF0aCwgc28ganVzdCBjaGVjayBpZiBhdHRycyBoYXZlIGl0LlxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3duKGF0dHJzLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQXR0cnNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVsaXplZEtleSA9IGNhbWVsaXplKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wc1tjYW1lbGl6ZWRLZXldID0gcmVzb2x2ZVByb3BWYWx1ZShvcHRpb25zLCByYXdDdXJyZW50UHJvcHMsIGNhbWVsaXplZEtleSwgdmFsdWUsIGluc3RhbmNlLCBmYWxzZSAvKiBpc0Fic2VudCAqLyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gYXR0cnNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzQXR0cnNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gZnVsbCBwcm9wcyB1cGRhdGUuXG4gICAgICAgIGlmIChzZXRGdWxsUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBwcm9wcywgYXR0cnMpKSB7XG4gICAgICAgICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGluIGNhc2Ugb2YgZHluYW1pYyBwcm9wcywgY2hlY2sgaWYgd2UgbmVlZCB0byBkZWxldGUga2V5cyBmcm9tXG4gICAgICAgIC8vIHRoZSBwcm9wcyBvYmplY3RcbiAgICAgICAgbGV0IGtlYmFiS2V5O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByYXdDdXJyZW50UHJvcHMpIHtcbiAgICAgICAgICAgIGlmICghcmF3UHJvcHMgfHxcbiAgICAgICAgICAgICAgICAvLyBmb3IgY2FtZWxDYXNlXG4gICAgICAgICAgICAgICAgKCFoYXNPd24ocmF3UHJvcHMsIGtleSkgJiZcbiAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBwb3NzaWJsZSB0aGUgb3JpZ2luYWwgcHJvcHMgd2FzIHBhc3NlZCBpbiBhcyBrZWJhYi1jYXNlXG4gICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjb252ZXJ0ZWQgdG8gY2FtZWxDYXNlICgjOTU1KVxuICAgICAgICAgICAgICAgICAgICAoKGtlYmFiS2V5ID0gaHlwaGVuYXRlKGtleSkpID09PSBrZXkgfHwgIWhhc093bihyYXdQcm9wcywga2ViYWJLZXkpKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmF3UHJldlByb3BzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgY2FtZWxDYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAocmF3UHJldlByb3BzW2tleV0gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBrZWJhYi1jYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3UHJldlByb3BzW2tlYmFiS2V5XSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNba2V5XSA9IHJlc29sdmVQcm9wVmFsdWUob3B0aW9ucywgcmF3Q3VycmVudFByb3BzLCBrZXksIHVuZGVmaW5lZCwgaW5zdGFuY2UsIHRydWUgLyogaXNBYnNlbnQgKi8pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHJvcHNba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgZnVuY3Rpb25hbCBjb21wb25lbnQgdy9vIHByb3BzIGRlY2xhcmF0aW9uLCBwcm9wcyBhbmRcbiAgICAgICAgLy8gYXR0cnMgcG9pbnQgdG8gdGhlIHNhbWUgb2JqZWN0IHNvIGl0IHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiB1cGRhdGVkLlxuICAgICAgICBpZiAoYXR0cnMgIT09IHJhd0N1cnJlbnRQcm9wcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJhd1Byb3BzIHx8XG4gICAgICAgICAgICAgICAgICAgICghaGFzT3duKHJhd1Byb3BzLCBrZXkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoIWZhbHNlICkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhdHRyc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyB0cmlnZ2VyIHVwZGF0ZXMgZm9yICRhdHRycyBpbiBjYXNlIGl0J3MgdXNlZCBpbiBjb21wb25lbnQgc2xvdHNcbiAgICBpZiAoaGFzQXR0cnNDaGFuZ2VkKSB7XG4gICAgICAgIHRyaWdnZXIoaW5zdGFuY2UsIFwic2V0XCIgLyogVHJpZ2dlck9wVHlwZXMuU0VUICovLCAnJGF0dHJzJyk7XG4gICAgfVxuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgdmFsaWRhdGVQcm9wcyhyYXdQcm9wcyB8fCB7fSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRGdWxsUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBwcm9wcywgYXR0cnMpIHtcbiAgICBjb25zdCBbb3B0aW9ucywgbmVlZENhc3RLZXlzXSA9IGluc3RhbmNlLnByb3BzT3B0aW9ucztcbiAgICBsZXQgaGFzQXR0cnNDaGFuZ2VkID0gZmFsc2U7XG4gICAgbGV0IHJhd0Nhc3RWYWx1ZXM7XG4gICAgaWYgKHJhd1Byb3BzKSB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiByYXdQcm9wcykge1xuICAgICAgICAgICAgLy8ga2V5LCByZWYgYXJlIHJlc2VydmVkIGFuZCBuZXZlciBwYXNzZWQgZG93blxuICAgICAgICAgICAgaWYgKGlzUmVzZXJ2ZWRQcm9wKGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmF3UHJvcHNba2V5XTtcbiAgICAgICAgICAgIC8vIHByb3Agb3B0aW9uIG5hbWVzIGFyZSBjYW1lbGl6ZWQgZHVyaW5nIG5vcm1hbGl6YXRpb24sIHNvIHRvIHN1cHBvcnRcbiAgICAgICAgICAgIC8vIGtlYmFiIC0+IGNhbWVsIGNvbnZlcnNpb24gaGVyZSB3ZSBuZWVkIHRvIGNhbWVsaXplIHRoZSBrZXkuXG4gICAgICAgICAgICBsZXQgY2FtZWxLZXk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBoYXNPd24ob3B0aW9ucywgKGNhbWVsS2V5ID0gY2FtZWxpemUoa2V5KSkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFuZWVkQ2FzdEtleXMgfHwgIW5lZWRDYXN0S2V5cy5pbmNsdWRlcyhjYW1lbEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHNbY2FtZWxLZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAocmF3Q2FzdFZhbHVlcyB8fCAocmF3Q2FzdFZhbHVlcyA9IHt9KSlbY2FtZWxLZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWlzRW1pdExpc3RlbmVyKGluc3RhbmNlLmVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBhdHRycykgfHwgdmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAobmVlZENhc3RLZXlzKSB7XG4gICAgICAgIGNvbnN0IHJhd0N1cnJlbnRQcm9wcyA9IHRvUmF3KHByb3BzKTtcbiAgICAgICAgY29uc3QgY2FzdFZhbHVlcyA9IHJhd0Nhc3RWYWx1ZXMgfHwgRU1QVFlfT0JKO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5lZWRDYXN0S2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gbmVlZENhc3RLZXlzW2ldO1xuICAgICAgICAgICAgcHJvcHNba2V5XSA9IHJlc29sdmVQcm9wVmFsdWUob3B0aW9ucywgcmF3Q3VycmVudFByb3BzLCBrZXksIGNhc3RWYWx1ZXNba2V5XSwgaW5zdGFuY2UsICFoYXNPd24oY2FzdFZhbHVlcywga2V5KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc0F0dHJzQ2hhbmdlZDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVQcm9wVmFsdWUob3B0aW9ucywgcHJvcHMsIGtleSwgdmFsdWUsIGluc3RhbmNlLCBpc0Fic2VudCkge1xuICAgIGNvbnN0IG9wdCA9IG9wdGlvbnNba2V5XTtcbiAgICBpZiAob3B0ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgaGFzRGVmYXVsdCA9IGhhc093bihvcHQsICdkZWZhdWx0Jyk7XG4gICAgICAgIC8vIGRlZmF1bHQgdmFsdWVzXG4gICAgICAgIGlmIChoYXNEZWZhdWx0ICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IG9wdC5kZWZhdWx0O1xuICAgICAgICAgICAgaWYgKG9wdC50eXBlICE9PSBGdW5jdGlvbiAmJiBpc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHByb3BzRGVmYXVsdHMgfSA9IGluc3RhbmNlO1xuICAgICAgICAgICAgICAgIGlmIChrZXkgaW4gcHJvcHNEZWZhdWx0cykge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BzRGVmYXVsdHNba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEN1cnJlbnRJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcHNEZWZhdWx0c1trZXldID0gZGVmYXVsdFZhbHVlLmNhbGwobnVsbCwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICB1bnNldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGJvb2xlYW4gY2FzdGluZ1xuICAgICAgICBpZiAob3B0WzAgLyogQm9vbGVhbkZsYWdzLnNob3VsZENhc3QgKi9dKSB7XG4gICAgICAgICAgICBpZiAoaXNBYnNlbnQgJiYgIWhhc0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3B0WzEgLyogQm9vbGVhbkZsYWdzLnNob3VsZENhc3RUcnVlICovXSAmJlxuICAgICAgICAgICAgICAgICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IGh5cGhlbmF0ZShrZXkpKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBub3JtYWxpemVQcm9wc09wdGlvbnMoY29tcCwgYXBwQ29udGV4dCwgYXNNaXhpbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgY2FjaGUgPSBhcHBDb250ZXh0LnByb3BzQ2FjaGU7XG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGNvbXApO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgY29uc3QgcmF3ID0gY29tcC5wcm9wcztcbiAgICBjb25zdCBub3JtYWxpemVkID0ge307XG4gICAgY29uc3QgbmVlZENhc3RLZXlzID0gW107XG4gICAgLy8gYXBwbHkgbWl4aW4vZXh0ZW5kcyBwcm9wc1xuICAgIGxldCBoYXNFeHRlbmRzID0gZmFsc2U7XG4gICAgaWYgKF9fVlVFX09QVElPTlNfQVBJX18gJiYgIWlzRnVuY3Rpb24oY29tcCkpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5kUHJvcHMgPSAocmF3KSA9PiB7XG4gICAgICAgICAgICBoYXNFeHRlbmRzID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IFtwcm9wcywga2V5c10gPSBub3JtYWxpemVQcm9wc09wdGlvbnMocmF3LCBhcHBDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIGV4dGVuZChub3JtYWxpemVkLCBwcm9wcyk7XG4gICAgICAgICAgICBpZiAoa2V5cylcbiAgICAgICAgICAgICAgICBuZWVkQ2FzdEtleXMucHVzaCguLi5rZXlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFhc01peGluICYmIGFwcENvbnRleHQubWl4aW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgYXBwQ29udGV4dC5taXhpbnMuZm9yRWFjaChleHRlbmRQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXAuZXh0ZW5kcykge1xuICAgICAgICAgICAgZXh0ZW5kUHJvcHMoY29tcC5leHRlbmRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcC5taXhpbnMpIHtcbiAgICAgICAgICAgIGNvbXAubWl4aW5zLmZvckVhY2goZXh0ZW5kUHJvcHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghcmF3ICYmICFoYXNFeHRlbmRzKSB7XG4gICAgICAgIGlmIChpc09iamVjdChjb21wKSkge1xuICAgICAgICAgICAgY2FjaGUuc2V0KGNvbXAsIEVNUFRZX0FSUik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEVNUFRZX0FSUjtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkocmF3KSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhdy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhaXNTdHJpbmcocmF3W2ldKSkge1xuICAgICAgICAgICAgICAgIHdhcm4oYHByb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC5gLCByYXdbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEtleSA9IGNhbWVsaXplKHJhd1tpXSk7XG4gICAgICAgICAgICBpZiAodmFsaWRhdGVQcm9wTmFtZShub3JtYWxpemVkS2V5KSkge1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZEtleV0gPSBFTVBUWV9PQko7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAocmF3KSB7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIWlzT2JqZWN0KHJhdykpIHtcbiAgICAgICAgICAgIHdhcm4oYGludmFsaWQgcHJvcHMgb3B0aW9uc2AsIHJhdyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmF3KSB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gY2FtZWxpemUoa2V5KTtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0ZVByb3BOYW1lKG5vcm1hbGl6ZWRLZXkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0ID0gcmF3W2tleV07XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcCA9IChub3JtYWxpemVkW25vcm1hbGl6ZWRLZXldID1cbiAgICAgICAgICAgICAgICAgICAgaXNBcnJheShvcHQpIHx8IGlzRnVuY3Rpb24ob3B0KSA/IHsgdHlwZTogb3B0IH0gOiBPYmplY3QuYXNzaWduKHt9LCBvcHQpKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sZWFuSW5kZXggPSBnZXRUeXBlSW5kZXgoQm9vbGVhbiwgcHJvcC50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nSW5kZXggPSBnZXRUeXBlSW5kZXgoU3RyaW5nLCBwcm9wLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBwcm9wWzAgLyogQm9vbGVhbkZsYWdzLnNob3VsZENhc3QgKi9dID0gYm9vbGVhbkluZGV4ID4gLTE7XG4gICAgICAgICAgICAgICAgICAgIHByb3BbMSAvKiBCb29sZWFuRmxhZ3Muc2hvdWxkQ2FzdFRydWUgKi9dID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0luZGV4IDwgMCB8fCBib29sZWFuSW5kZXggPCBzdHJpbmdJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHByb3AgbmVlZHMgYm9vbGVhbiBjYXN0aW5nIG9yIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvb2xlYW5JbmRleCA+IC0xIHx8IGhhc093bihwcm9wLCAnZGVmYXVsdCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZWVkQ2FzdEtleXMucHVzaChub3JtYWxpemVkS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXMgPSBbbm9ybWFsaXplZCwgbmVlZENhc3RLZXlzXTtcbiAgICBpZiAoaXNPYmplY3QoY29tcCkpIHtcbiAgICAgICAgY2FjaGUuc2V0KGNvbXAsIHJlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BOYW1lKGtleSkge1xuICAgIGlmIChrZXlbMF0gIT09ICckJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgIHdhcm4oYEludmFsaWQgcHJvcCBuYW1lOiBcIiR7a2V5fVwiIGlzIGEgcmVzZXJ2ZWQgcHJvcGVydHkuYCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIHVzZSBmdW5jdGlvbiBzdHJpbmcgbmFtZSB0byBjaGVjayB0eXBlIGNvbnN0cnVjdG9yc1xuLy8gc28gdGhhdCBpdCB3b3JrcyBhY3Jvc3Mgdm1zIC8gaWZyYW1lcy5cbmZ1bmN0aW9uIGdldFR5cGUoY3Rvcikge1xuICAgIGNvbnN0IG1hdGNoID0gY3RvciAmJiBjdG9yLnRvU3RyaW5nKCkubWF0Y2goL15cXHMqKGZ1bmN0aW9ufGNsYXNzKSAoXFx3KykvKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsyXSA6IGN0b3IgPT09IG51bGwgPyAnbnVsbCcgOiAnJztcbn1cbmZ1bmN0aW9uIGlzU2FtZVR5cGUoYSwgYikge1xuICAgIHJldHVybiBnZXRUeXBlKGEpID09PSBnZXRUeXBlKGIpO1xufVxuZnVuY3Rpb24gZ2V0VHlwZUluZGV4KHR5cGUsIGV4cGVjdGVkVHlwZXMpIHtcbiAgICBpZiAoaXNBcnJheShleHBlY3RlZFR5cGVzKSkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWRUeXBlcy5maW5kSW5kZXgodCA9PiBpc1NhbWVUeXBlKHQsIHR5cGUpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNGdW5jdGlvbihleHBlY3RlZFR5cGVzKSkge1xuICAgICAgICByZXR1cm4gaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzLCB0eXBlKSA/IDAgOiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuLyoqXG4gKiBkZXYgb25seVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BzKHJhd1Byb3BzLCBwcm9wcywgaW5zdGFuY2UpIHtcbiAgICBjb25zdCByZXNvbHZlZFZhbHVlcyA9IHRvUmF3KHByb3BzKTtcbiAgICBjb25zdCBvcHRpb25zID0gaW5zdGFuY2UucHJvcHNPcHRpb25zWzBdO1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IG9wdCA9IG9wdGlvbnNba2V5XTtcbiAgICAgICAgaWYgKG9wdCA9PSBudWxsKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIHZhbGlkYXRlUHJvcChrZXksIHJlc29sdmVkVmFsdWVzW2tleV0sIG9wdCwgIWhhc093bihyYXdQcm9wcywga2V5KSAmJiAhaGFzT3duKHJhd1Byb3BzLCBoeXBoZW5hdGUoa2V5KSkpO1xuICAgIH1cbn1cbi8qKlxuICogZGV2IG9ubHlcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQcm9wKG5hbWUsIHZhbHVlLCBwcm9wLCBpc0Fic2VudCkge1xuICAgIGNvbnN0IHsgdHlwZSwgcmVxdWlyZWQsIHZhbGlkYXRvciB9ID0gcHJvcDtcbiAgICAvLyByZXF1aXJlZCFcbiAgICBpZiAocmVxdWlyZWQgJiYgaXNBYnNlbnQpIHtcbiAgICAgICAgd2FybignTWlzc2luZyByZXF1aXJlZCBwcm9wOiBcIicgKyBuYW1lICsgJ1wiJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gbWlzc2luZyBidXQgb3B0aW9uYWxcbiAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcHJvcC5yZXF1aXJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIHR5cGUgY2hlY2tcbiAgICBpZiAodHlwZSAhPSBudWxsICYmIHR5cGUgIT09IHRydWUpIHtcbiAgICAgICAgbGV0IGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgdHlwZXMgPSBpc0FycmF5KHR5cGUpID8gdHlwZSA6IFt0eXBlXTtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRUeXBlcyA9IFtdO1xuICAgICAgICAvLyB2YWx1ZSBpcyB2YWxpZCBhcyBsb25nIGFzIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzIG1hdGNoXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoICYmICFpc1ZhbGlkOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsaWQsIGV4cGVjdGVkVHlwZSB9ID0gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZXNbaV0pO1xuICAgICAgICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGV4cGVjdGVkVHlwZSB8fCAnJyk7XG4gICAgICAgICAgICBpc1ZhbGlkID0gdmFsaWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgICB3YXJuKGdldEludmFsaWRUeXBlTWVzc2FnZShuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRUeXBlcykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGN1c3RvbSB2YWxpZGF0b3JcbiAgICBpZiAodmFsaWRhdG9yICYmICF2YWxpZGF0b3IodmFsdWUpKSB7XG4gICAgICAgIHdhcm4oJ0ludmFsaWQgcHJvcDogY3VzdG9tIHZhbGlkYXRvciBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCInICsgbmFtZSArICdcIi4nKTtcbiAgICB9XG59XG5jb25zdCBpc1NpbXBsZVR5cGUgPSAvKiNfX1BVUkVfXyovIG1ha2VNYXAoJ1N0cmluZyxOdW1iZXIsQm9vbGVhbixGdW5jdGlvbixTeW1ib2wsQmlnSW50Jyk7XG4vKipcbiAqIGRldiBvbmx5XG4gKi9cbmZ1bmN0aW9uIGFzc2VydFR5cGUodmFsdWUsIHR5cGUpIHtcbiAgICBsZXQgdmFsaWQ7XG4gICAgY29uc3QgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZSh0eXBlKTtcbiAgICBpZiAoaXNTaW1wbGVUeXBlKGV4cGVjdGVkVHlwZSkpIHtcbiAgICAgICAgY29uc3QgdCA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgICAgdmFsaWQgPSB0ID09PSBleHBlY3RlZFR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gZm9yIHByaW1pdGl2ZSB3cmFwcGVyIG9iamVjdHNcbiAgICAgICAgaWYgKCF2YWxpZCAmJiB0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnT2JqZWN0Jykge1xuICAgICAgICB2YWxpZCA9IGlzT2JqZWN0KHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnQXJyYXknKSB7XG4gICAgICAgIHZhbGlkID0gaXNBcnJheSh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ251bGwnKSB7XG4gICAgICAgIHZhbGlkID0gdmFsdWUgPT09IG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgdHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWQsXG4gICAgICAgIGV4cGVjdGVkVHlwZVxuICAgIH07XG59XG4vKipcbiAqIGRldiBvbmx5XG4gKi9cbmZ1bmN0aW9uIGdldEludmFsaWRUeXBlTWVzc2FnZShuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRUeXBlcykge1xuICAgIGxldCBtZXNzYWdlID0gYEludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCIke25hbWV9XCIuYCArXG4gICAgICAgIGAgRXhwZWN0ZWQgJHtleHBlY3RlZFR5cGVzLm1hcChjYXBpdGFsaXplKS5qb2luKCcgfCAnKX1gO1xuICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IGV4cGVjdGVkVHlwZXNbMF07XG4gICAgY29uc3QgcmVjZWl2ZWRUeXBlID0gdG9SYXdUeXBlKHZhbHVlKTtcbiAgICBjb25zdCBleHBlY3RlZFZhbHVlID0gc3R5bGVWYWx1ZSh2YWx1ZSwgZXhwZWN0ZWRUeXBlKTtcbiAgICBjb25zdCByZWNlaXZlZFZhbHVlID0gc3R5bGVWYWx1ZSh2YWx1ZSwgcmVjZWl2ZWRUeXBlKTtcbiAgICAvLyBjaGVjayBpZiB3ZSBuZWVkIHRvIHNwZWNpZnkgZXhwZWN0ZWQgdmFsdWVcbiAgICBpZiAoZXhwZWN0ZWRUeXBlcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgaXNFeHBsaWNhYmxlKGV4cGVjdGVkVHlwZSkgJiZcbiAgICAgICAgIWlzQm9vbGVhbihleHBlY3RlZFR5cGUsIHJlY2VpdmVkVHlwZSkpIHtcbiAgICAgICAgbWVzc2FnZSArPSBgIHdpdGggdmFsdWUgJHtleHBlY3RlZFZhbHVlfWA7XG4gICAgfVxuICAgIG1lc3NhZ2UgKz0gYCwgZ290ICR7cmVjZWl2ZWRUeXBlfSBgO1xuICAgIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gc3BlY2lmeSByZWNlaXZlZCB2YWx1ZVxuICAgIGlmIChpc0V4cGxpY2FibGUocmVjZWl2ZWRUeXBlKSkge1xuICAgICAgICBtZXNzYWdlICs9IGB3aXRoIHZhbHVlICR7cmVjZWl2ZWRWYWx1ZX0uYDtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG59XG4vKipcbiAqIGRldiBvbmx5XG4gKi9cbmZ1bmN0aW9uIHN0eWxlVmFsdWUodmFsdWUsIHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PT0gJ1N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlID09PSAnTnVtYmVyJykge1xuICAgICAgICByZXR1cm4gYCR7TnVtYmVyKHZhbHVlKX1gO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gICAgfVxufVxuLyoqXG4gKiBkZXYgb25seVxuICovXG5mdW5jdGlvbiBpc0V4cGxpY2FibGUodHlwZSkge1xuICAgIGNvbnN0IGV4cGxpY2l0VHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddO1xuICAgIHJldHVybiBleHBsaWNpdFR5cGVzLnNvbWUoZWxlbSA9PiB0eXBlLnRvTG93ZXJDYXNlKCkgPT09IGVsZW0pO1xufVxuLyoqXG4gKiBkZXYgb25seVxuICovXG5mdW5jdGlvbiBpc0Jvb2xlYW4oLi4uYXJncykge1xuICAgIHJldHVybiBhcmdzLnNvbWUoZWxlbSA9PiBlbGVtLnRvTG93ZXJDYXNlKCkgPT09ICdib29sZWFuJyk7XG59XG5cbmNvbnN0IGlzSW50ZXJuYWxLZXkgPSAoa2V5KSA9PiBrZXlbMF0gPT09ICdfJyB8fCBrZXkgPT09ICckc3RhYmxlJztcbmNvbnN0IG5vcm1hbGl6ZVNsb3RWYWx1ZSA9ICh2YWx1ZSkgPT4gaXNBcnJheSh2YWx1ZSlcbiAgICA/IHZhbHVlLm1hcChub3JtYWxpemVWTm9kZSlcbiAgICA6IFtub3JtYWxpemVWTm9kZSh2YWx1ZSldO1xuY29uc3Qgbm9ybWFsaXplU2xvdCA9IChrZXksIHJhd1Nsb3QsIGN0eCkgPT4ge1xuICAgIGlmIChyYXdTbG90Ll9uKSB7XG4gICAgICAgIC8vIGFscmVhZHkgbm9ybWFsaXplZCAtICM1MzUzXG4gICAgICAgIHJldHVybiByYXdTbG90O1xuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkID0gd2l0aEN0eCgoLi4uYXJncykgPT4ge1xuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIGN1cnJlbnRJbnN0YW5jZSkge1xuICAgICAgICAgICAgd2FybihgU2xvdCBcIiR7a2V5fVwiIGludm9rZWQgb3V0c2lkZSBvZiB0aGUgcmVuZGVyIGZ1bmN0aW9uOiBgICtcbiAgICAgICAgICAgICAgICBgdGhpcyB3aWxsIG5vdCB0cmFjayBkZXBlbmRlbmNpZXMgdXNlZCBpbiB0aGUgc2xvdC4gYCArXG4gICAgICAgICAgICAgICAgYEludm9rZSB0aGUgc2xvdCBmdW5jdGlvbiBpbnNpZGUgdGhlIHJlbmRlciBmdW5jdGlvbiBpbnN0ZWFkLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub3JtYWxpemVTbG90VmFsdWUocmF3U2xvdCguLi5hcmdzKSk7XG4gICAgfSwgY3R4KTtcbiAgICBub3JtYWxpemVkLl9jID0gZmFsc2U7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59O1xuY29uc3Qgbm9ybWFsaXplT2JqZWN0U2xvdHMgPSAocmF3U2xvdHMsIHNsb3RzLCBpbnN0YW5jZSkgPT4ge1xuICAgIGNvbnN0IGN0eCA9IHJhd1Nsb3RzLl9jdHg7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcmF3U2xvdHMpIHtcbiAgICAgICAgaWYgKGlzSW50ZXJuYWxLZXkoa2V5KSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJhd1Nsb3RzW2tleV07XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICAgICAgc2xvdHNba2V5XSA9IG5vcm1hbGl6ZVNsb3Qoa2V5LCB2YWx1ZSwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmXG4gICAgICAgICAgICAgICAgIShmYWxzZSApKSB7XG4gICAgICAgICAgICAgICAgd2FybihgTm9uLWZ1bmN0aW9uIHZhbHVlIGVuY291bnRlcmVkIGZvciBzbG90IFwiJHtrZXl9XCIuIGAgK1xuICAgICAgICAgICAgICAgICAgICBgUHJlZmVyIGZ1bmN0aW9uIHNsb3RzIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplU2xvdFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIHNsb3RzW2tleV0gPSAoKSA9PiBub3JtYWxpemVkO1xuICAgICAgICB9XG4gICAgfVxufTtcbmNvbnN0IG5vcm1hbGl6ZVZOb2RlU2xvdHMgPSAoaW5zdGFuY2UsIGNoaWxkcmVuKSA9PiB7XG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJlxuICAgICAgICAhaXNLZWVwQWxpdmUoaW5zdGFuY2Uudm5vZGUpICYmXG4gICAgICAgICEoZmFsc2UgKSkge1xuICAgICAgICB3YXJuKGBOb24tZnVuY3Rpb24gdmFsdWUgZW5jb3VudGVyZWQgZm9yIGRlZmF1bHQgc2xvdC4gYCArXG4gICAgICAgICAgICBgUHJlZmVyIGZ1bmN0aW9uIHNsb3RzIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuYCk7XG4gICAgfVxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVTbG90VmFsdWUoY2hpbGRyZW4pO1xuICAgIGluc3RhbmNlLnNsb3RzLmRlZmF1bHQgPSAoKSA9PiBub3JtYWxpemVkO1xufTtcbmNvbnN0IGluaXRTbG90cyA9IChpbnN0YW5jZSwgY2hpbGRyZW4pID0+IHtcbiAgICBpZiAoaW5zdGFuY2Uudm5vZGUuc2hhcGVGbGFnICYgMzIgLyogU2hhcGVGbGFncy5TTE9UU19DSElMRFJFTiAqLykge1xuICAgICAgICBjb25zdCB0eXBlID0gY2hpbGRyZW4uXztcbiAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgIC8vIHVzZXJzIGNhbiBnZXQgdGhlIHNoYWxsb3cgcmVhZG9ubHkgdmVyc2lvbiBvZiB0aGUgc2xvdHMgb2JqZWN0IHRocm91Z2ggYHRoaXMuJHNsb3RzYCxcbiAgICAgICAgICAgIC8vIHdlIHNob3VsZCBhdm9pZCB0aGUgcHJveHkgb2JqZWN0IHBvbGx1dGluZyB0aGUgc2xvdHMgb2YgdGhlIGludGVybmFsIGluc3RhbmNlXG4gICAgICAgICAgICBpbnN0YW5jZS5zbG90cyA9IHRvUmF3KGNoaWxkcmVuKTtcbiAgICAgICAgICAgIC8vIG1ha2UgY29tcGlsZXIgbWFya2VyIG5vbi1lbnVtZXJhYmxlXG4gICAgICAgICAgICBkZWYoY2hpbGRyZW4sICdfJywgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub3JtYWxpemVPYmplY3RTbG90cyhjaGlsZHJlbiwgKGluc3RhbmNlLnNsb3RzID0ge30pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaW5zdGFuY2Uuc2xvdHMgPSB7fTtcbiAgICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBub3JtYWxpemVWTm9kZVNsb3RzKGluc3RhbmNlLCBjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVmKGluc3RhbmNlLnNsb3RzLCBJbnRlcm5hbE9iamVjdEtleSwgMSk7XG59O1xuY29uc3QgdXBkYXRlU2xvdHMgPSAoaW5zdGFuY2UsIGNoaWxkcmVuLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCB7IHZub2RlLCBzbG90cyB9ID0gaW5zdGFuY2U7XG4gICAgbGV0IG5lZWREZWxldGlvbkNoZWNrID0gdHJ1ZTtcbiAgICBsZXQgZGVsZXRpb25Db21wYXJpc29uVGFyZ2V0ID0gRU1QVFlfT0JKO1xuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAzMiAvKiBTaGFwZUZsYWdzLlNMT1RTX0NISUxEUkVOICovKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBjaGlsZHJlbi5fO1xuICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgLy8gY29tcGlsZWQgc2xvdHMuXG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIGlzSG1yVXBkYXRpbmcpIHtcbiAgICAgICAgICAgICAgICAvLyBQYXJlbnQgd2FzIEhNUiB1cGRhdGVkIHNvIHNsb3QgY29udGVudCBtYXkgaGF2ZSBjaGFuZ2VkLlxuICAgICAgICAgICAgICAgIC8vIGZvcmNlIHVwZGF0ZSBzbG90cyBhbmQgbWFyayBpbnN0YW5jZSBmb3IgaG1yIGFzIHdlbGxcbiAgICAgICAgICAgICAgICBleHRlbmQoc2xvdHMsIGNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGltaXplZCAmJiB0eXBlID09PSAxIC8qIFNsb3RGbGFncy5TVEFCTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAvLyBjb21waWxlZCBBTkQgc3RhYmxlLlxuICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gdXBkYXRlLCBhbmQgc2tpcCBzdGFsZSBzbG90cyByZW1vdmFsLlxuICAgICAgICAgICAgICAgIG5lZWREZWxldGlvbkNoZWNrID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjb21waWxlZCBidXQgZHluYW1pYyAodi1pZi92LWZvciBvbiBzbG90cykgLSB1cGRhdGUgc2xvdHMsIGJ1dCBza2lwXG4gICAgICAgICAgICAgICAgLy8gbm9ybWFsaXphdGlvbi5cbiAgICAgICAgICAgICAgICBleHRlbmQoc2xvdHMsIGNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICAvLyAjMjg5M1xuICAgICAgICAgICAgICAgIC8vIHdoZW4gcmVuZGVyaW5nIHRoZSBvcHRpbWl6ZWQgc2xvdHMgYnkgbWFudWFsbHkgd3JpdHRlbiByZW5kZXIgZnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBkZWxldGUgdGhlIGBzbG90cy5fYCBmbGFnIGlmIG5lY2Vzc2FyeSB0byBtYWtlIHN1YnNlcXVlbnQgdXBkYXRlcyByZWxpYWJsZSxcbiAgICAgICAgICAgICAgICAvLyBpLmUuIGxldCB0aGUgYHJlbmRlclNsb3RgIGNyZWF0ZSB0aGUgYmFpbGVkIEZyYWdtZW50XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpbWl6ZWQgJiYgdHlwZSA9PT0gMSAvKiBTbG90RmxhZ3MuU1RBQkxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzbG90cy5fO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5lZWREZWxldGlvbkNoZWNrID0gIWNoaWxkcmVuLiRzdGFibGU7XG4gICAgICAgICAgICBub3JtYWxpemVPYmplY3RTbG90cyhjaGlsZHJlbiwgc2xvdHMpO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0aW9uQ29tcGFyaXNvblRhcmdldCA9IGNoaWxkcmVuO1xuICAgIH1cbiAgICBlbHNlIGlmIChjaGlsZHJlbikge1xuICAgICAgICAvLyBub24gc2xvdCBvYmplY3QgY2hpbGRyZW4gKGRpcmVjdCB2YWx1ZSkgcGFzc2VkIHRvIGEgY29tcG9uZW50XG4gICAgICAgIG5vcm1hbGl6ZVZOb2RlU2xvdHMoaW5zdGFuY2UsIGNoaWxkcmVuKTtcbiAgICAgICAgZGVsZXRpb25Db21wYXJpc29uVGFyZ2V0ID0geyBkZWZhdWx0OiAxIH07XG4gICAgfVxuICAgIC8vIGRlbGV0ZSBzdGFsZSBzbG90c1xuICAgIGlmIChuZWVkRGVsZXRpb25DaGVjaykge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzbG90cykge1xuICAgICAgICAgICAgaWYgKCFpc0ludGVybmFsS2V5KGtleSkgJiYgIShrZXkgaW4gZGVsZXRpb25Db21wYXJpc29uVGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBzbG90c1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuZnVuY3Rpb24gY3JlYXRlQXBwQ29udGV4dCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBhcHA6IG51bGwsXG4gICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgaXNOYXRpdmVUYWc6IE5PLFxuICAgICAgICAgICAgcGVyZm9ybWFuY2U6IGZhbHNlLFxuICAgICAgICAgICAgZ2xvYmFsUHJvcGVydGllczoge30sXG4gICAgICAgICAgICBvcHRpb25NZXJnZVN0cmF0ZWdpZXM6IHt9LFxuICAgICAgICAgICAgZXJyb3JIYW5kbGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB3YXJuSGFuZGxlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zOiB7fVxuICAgICAgICB9LFxuICAgICAgICBtaXhpbnM6IFtdLFxuICAgICAgICBjb21wb25lbnRzOiB7fSxcbiAgICAgICAgZGlyZWN0aXZlczoge30sXG4gICAgICAgIHByb3ZpZGVzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICBvcHRpb25zQ2FjaGU6IG5ldyBXZWFrTWFwKCksXG4gICAgICAgIHByb3BzQ2FjaGU6IG5ldyBXZWFrTWFwKCksXG4gICAgICAgIGVtaXRzQ2FjaGU6IG5ldyBXZWFrTWFwKClcbiAgICB9O1xufVxubGV0IHVpZCQxID0gMDtcbmZ1bmN0aW9uIGNyZWF0ZUFwcEFQSShyZW5kZXIsIGh5ZHJhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlQXBwKHJvb3RDb21wb25lbnQsIHJvb3RQcm9wcyA9IG51bGwpIHtcbiAgICAgICAgaWYgKCFpc0Z1bmN0aW9uKHJvb3RDb21wb25lbnQpKSB7XG4gICAgICAgICAgICByb290Q29tcG9uZW50ID0gT2JqZWN0LmFzc2lnbih7fSwgcm9vdENvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvb3RQcm9wcyAhPSBudWxsICYmICFpc09iamVjdChyb290UHJvcHMpKSB7XG4gICAgICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgd2Fybihgcm9vdCBwcm9wcyBwYXNzZWQgdG8gYXBwLm1vdW50KCkgbXVzdCBiZSBhbiBvYmplY3QuYCk7XG4gICAgICAgICAgICByb290UHJvcHMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjcmVhdGVBcHBDb250ZXh0KCk7XG4gICAgICAgIGNvbnN0IGluc3RhbGxlZFBsdWdpbnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGxldCBpc01vdW50ZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgYXBwID0gKGNvbnRleHQuYXBwID0ge1xuICAgICAgICAgICAgX3VpZDogdWlkJDErKyxcbiAgICAgICAgICAgIF9jb21wb25lbnQ6IHJvb3RDb21wb25lbnQsXG4gICAgICAgICAgICBfcHJvcHM6IHJvb3RQcm9wcyxcbiAgICAgICAgICAgIF9jb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBfY29udGV4dDogY29udGV4dCxcbiAgICAgICAgICAgIF9pbnN0YW5jZTogbnVsbCxcbiAgICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgICBnZXQgY29uZmlnKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmNvbmZpZztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQgY29uZmlnKHYpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm4oYGFwcC5jb25maWcgY2Fubm90IGJlIHJlcGxhY2VkLiBNb2RpZnkgaW5kaXZpZHVhbCBvcHRpb25zIGluc3RlYWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVzZShwbHVnaW4sIC4uLm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFsbGVkUGx1Z2lucy5oYXMocGx1Z2luKSkge1xuICAgICAgICAgICAgICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgd2FybihgUGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0YXJnZXQgYXBwLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwbHVnaW4gJiYgaXNGdW5jdGlvbihwbHVnaW4uaW5zdGFsbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkUGx1Z2lucy5hZGQocGx1Z2luKTtcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmluc3RhbGwoYXBwLCAuLi5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNGdW5jdGlvbihwbHVnaW4pKSB7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZFBsdWdpbnMuYWRkKHBsdWdpbik7XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbihhcHAsIC4uLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FybihgQSBwbHVnaW4gbXVzdCBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCBhbiBcImluc3RhbGxcIiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBmdW5jdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtaXhpbihtaXhpbikge1xuICAgICAgICAgICAgICAgIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGV4dC5taXhpbnMuaW5jbHVkZXMobWl4aW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm1peGlucy5wdXNoKG1peGluKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4oJ01peGluIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0YXJnZXQgYXBwJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1peGluLm5hbWUgPyBgOiAke21peGluLm5hbWV9YCA6ICcnKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm4oJ01peGlucyBhcmUgb25seSBhdmFpbGFibGUgaW4gYnVpbGRzIHN1cHBvcnRpbmcgT3B0aW9ucyBBUEknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wb25lbnQobmFtZSwgY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSwgY29udGV4dC5jb25maWcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jb21wb25lbnRzW25hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIGNvbnRleHQuY29tcG9uZW50c1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICB3YXJuKGBDb21wb25lbnQgXCIke25hbWV9XCIgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGluIHRhcmdldCBhcHAuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRleHQuY29tcG9uZW50c1tuYW1lXSA9IGNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpcmVjdGl2ZShuYW1lLCBkaXJlY3RpdmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlRGlyZWN0aXZlTmFtZShuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFkaXJlY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlyZWN0aXZlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiBjb250ZXh0LmRpcmVjdGl2ZXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgd2FybihgRGlyZWN0aXZlIFwiJHtuYW1lfVwiIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBpbiB0YXJnZXQgYXBwLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZXh0LmRpcmVjdGl2ZXNbbmFtZV0gPSBkaXJlY3RpdmU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudChyb290Q29udGFpbmVyLCBpc0h5ZHJhdGUsIGlzU1ZHKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc01vdW50ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gIzU1NzFcbiAgICAgICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiByb290Q29udGFpbmVyLl9fdnVlX2FwcF9fKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXJuKGBUaGVyZSBpcyBhbHJlYWR5IGFuIGFwcCBpbnN0YW5jZSBtb3VudGVkIG9uIHRoZSBob3N0IGNvbnRhaW5lci5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgIElmIHlvdSB3YW50IHRvIG1vdW50IGFub3RoZXIgYXBwIG9uIHRoZSBzYW1lIGhvc3QgY29udGFpbmVyLGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAgeW91IG5lZWQgdG8gdW5tb3VudCB0aGUgcHJldmlvdXMgYXBwIGJ5IGNhbGxpbmcgXFxgYXBwLnVubW91bnQoKVxcYCBmaXJzdC5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKHJvb3RDb21wb25lbnQsIHJvb3RQcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIGFwcCBjb250ZXh0IG9uIHRoZSByb290IFZOb2RlLlxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgYmUgc2V0IG9uIHRoZSByb290IGluc3RhbmNlIG9uIGluaXRpYWwgbW91bnQuXG4gICAgICAgICAgICAgICAgICAgIHZub2RlLmFwcENvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAvLyBITVIgcm9vdCByZWxvYWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyKGNsb25lVk5vZGUodm5vZGUpLCByb290Q29udGFpbmVyLCBpc1NWRyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0h5ZHJhdGUgJiYgaHlkcmF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHlkcmF0ZSh2bm9kZSwgcm9vdENvbnRhaW5lcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXIodm5vZGUsIHJvb3RDb250YWluZXIsIGlzU1ZHKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpc01vdW50ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhcHAuX2NvbnRhaW5lciA9IHJvb3RDb250YWluZXI7XG4gICAgICAgICAgICAgICAgICAgIHJvb3RDb250YWluZXIuX192dWVfYXBwX18gPSBhcHA7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHAuX2luc3RhbmNlID0gdm5vZGUuY29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZGV2dG9vbHNJbml0QXBwKGFwcCwgdmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEV4cG9zZVByb3h5KHZub2RlLmNvbXBvbmVudCkgfHwgdm5vZGUuY29tcG9uZW50LnByb3h5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FybihgQXBwIGhhcyBhbHJlYWR5IGJlZW4gbW91bnRlZC5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBJZiB5b3Ugd2FudCB0byByZW1vdW50IHRoZSBzYW1lIGFwcCwgbW92ZSB5b3VyIGFwcCBjcmVhdGlvbiBsb2dpYyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBpbnRvIGEgZmFjdG9yeSBmdW5jdGlvbiBhbmQgY3JlYXRlIGZyZXNoIGFwcCBpbnN0YW5jZXMgZm9yIGVhY2ggYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgbW91bnQgLSBlLmcuIFxcYGNvbnN0IGNyZWF0ZU15QXBwID0gKCkgPT4gY3JlYXRlQXBwKEFwcClcXGBgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdW5tb3VudCgpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNNb3VudGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcihudWxsLCBhcHAuX2NvbnRhaW5lcik7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHAuX2luc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldnRvb2xzVW5tb3VudEFwcChhcHApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhcHAuX2NvbnRhaW5lci5fX3Z1ZV9hcHBfXztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm4oYENhbm5vdCB1bm1vdW50IGFuIGFwcCB0aGF0IGlzIG5vdCBtb3VudGVkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm92aWRlKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIGtleSBpbiBjb250ZXh0LnByb3ZpZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm4oYEFwcCBhbHJlYWR5IHByb3ZpZGVzIHByb3BlcnR5IHdpdGgga2V5IFwiJHtTdHJpbmcoa2V5KX1cIi4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgSXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXcgdmFsdWUuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRleHQucHJvdmlkZXNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBhcHA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXBwO1xuICAgIH07XG59XG5cbi8qKlxuICogRnVuY3Rpb24gZm9yIGhhbmRsaW5nIGEgdGVtcGxhdGUgcmVmXG4gKi9cbmZ1bmN0aW9uIHNldFJlZihyYXdSZWYsIG9sZFJhd1JlZiwgcGFyZW50U3VzcGVuc2UsIHZub2RlLCBpc1VubW91bnQgPSBmYWxzZSkge1xuICAgIGlmIChpc0FycmF5KHJhd1JlZikpIHtcbiAgICAgICAgcmF3UmVmLmZvckVhY2goKHIsIGkpID0+IHNldFJlZihyLCBvbGRSYXdSZWYgJiYgKGlzQXJyYXkob2xkUmF3UmVmKSA/IG9sZFJhd1JlZltpXSA6IG9sZFJhd1JlZiksIHBhcmVudFN1c3BlbnNlLCB2bm9kZSwgaXNVbm1vdW50KSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzQXN5bmNXcmFwcGVyKHZub2RlKSAmJiAhaXNVbm1vdW50KSB7XG4gICAgICAgIC8vIHdoZW4gbW91bnRpbmcgYXN5bmMgY29tcG9uZW50cywgbm90aGluZyBuZWVkcyB0byBiZSBkb25lLFxuICAgICAgICAvLyBiZWNhdXNlIHRoZSB0ZW1wbGF0ZSByZWYgaXMgZm9yd2FyZGVkIHRvIGlubmVyIGNvbXBvbmVudFxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlZlZhbHVlID0gdm5vZGUuc2hhcGVGbGFnICYgNCAvKiBTaGFwZUZsYWdzLlNUQVRFRlVMX0NPTVBPTkVOVCAqL1xuICAgICAgICA/IGdldEV4cG9zZVByb3h5KHZub2RlLmNvbXBvbmVudCkgfHwgdm5vZGUuY29tcG9uZW50LnByb3h5XG4gICAgICAgIDogdm5vZGUuZWw7XG4gICAgY29uc3QgdmFsdWUgPSBpc1VubW91bnQgPyBudWxsIDogcmVmVmFsdWU7XG4gICAgY29uc3QgeyBpOiBvd25lciwgcjogcmVmIH0gPSByYXdSZWY7XG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhb3duZXIpIHtcbiAgICAgICAgd2FybihgTWlzc2luZyByZWYgb3duZXIgY29udGV4dC4gcmVmIGNhbm5vdCBiZSB1c2VkIG9uIGhvaXN0ZWQgdm5vZGVzLiBgICtcbiAgICAgICAgICAgIGBBIHZub2RlIHdpdGggcmVmIG11c3QgYmUgY3JlYXRlZCBpbnNpZGUgdGhlIHJlbmRlciBmdW5jdGlvbi5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvbGRSZWYgPSBvbGRSYXdSZWYgJiYgb2xkUmF3UmVmLnI7XG4gICAgY29uc3QgcmVmcyA9IG93bmVyLnJlZnMgPT09IEVNUFRZX09CSiA/IChvd25lci5yZWZzID0ge30pIDogb3duZXIucmVmcztcbiAgICBjb25zdCBzZXR1cFN0YXRlID0gb3duZXIuc2V0dXBTdGF0ZTtcbiAgICAvLyBkeW5hbWljIHJlZiBjaGFuZ2VkLiB1bnNldCBvbGQgcmVmXG4gICAgaWYgKG9sZFJlZiAhPSBudWxsICYmIG9sZFJlZiAhPT0gcmVmKSB7XG4gICAgICAgIGlmIChpc1N0cmluZyhvbGRSZWYpKSB7XG4gICAgICAgICAgICByZWZzW29sZFJlZl0gPSBudWxsO1xuICAgICAgICAgICAgaWYgKGhhc093bihzZXR1cFN0YXRlLCBvbGRSZWYpKSB7XG4gICAgICAgICAgICAgICAgc2V0dXBTdGF0ZVtvbGRSZWZdID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1JlZihvbGRSZWYpKSB7XG4gICAgICAgICAgICBvbGRSZWYudmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Z1bmN0aW9uKHJlZikpIHtcbiAgICAgICAgY2FsbFdpdGhFcnJvckhhbmRsaW5nKHJlZiwgb3duZXIsIDEyIC8qIEVycm9yQ29kZXMuRlVOQ1RJT05fUkVGICovLCBbdmFsdWUsIHJlZnNdKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IF9pc1N0cmluZyA9IGlzU3RyaW5nKHJlZik7XG4gICAgICAgIGNvbnN0IF9pc1JlZiA9IGlzUmVmKHJlZik7XG4gICAgICAgIGlmIChfaXNTdHJpbmcgfHwgX2lzUmVmKSB7XG4gICAgICAgICAgICBjb25zdCBkb1NldCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmF3UmVmLmYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBfaXNTdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gaGFzT3duKHNldHVwU3RhdGUsIHJlZilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNldHVwU3RhdGVbcmVmXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVmc1tyZWZdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJlZi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVW5tb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNBcnJheShleGlzdGluZykgJiYgcmVtb3ZlKGV4aXN0aW5nLCByZWZWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQXJyYXkoZXhpc3RpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pc1N0cmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZzW3JlZl0gPSBbcmVmVmFsdWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3duKHNldHVwU3RhdGUsIHJlZikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwU3RhdGVbcmVmXSA9IHJlZnNbcmVmXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLnZhbHVlID0gW3JlZlZhbHVlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd1JlZi5rKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmc1tyYXdSZWYua10gPSByZWYudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWV4aXN0aW5nLmluY2x1ZGVzKHJlZlZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnB1c2gocmVmVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9pc1N0cmluZykge1xuICAgICAgICAgICAgICAgICAgICByZWZzW3JlZl0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc093bihzZXR1cFN0YXRlLCByZWYpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR1cFN0YXRlW3JlZl0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChfaXNSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYXdSZWYuaylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnNbcmF3UmVmLmtdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICB3YXJuKCdJbnZhbGlkIHRlbXBsYXRlIHJlZiB0eXBlOicsIHJlZiwgYCgke3R5cGVvZiByZWZ9KWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBkb1NldC5pZCA9IC0xO1xuICAgICAgICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChkb1NldCwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZG9TZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgIHdhcm4oJ0ludmFsaWQgdGVtcGxhdGUgcmVmIHR5cGU6JywgcmVmLCBgKCR7dHlwZW9mIHJlZn0pYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmxldCBoYXNNaXNtYXRjaCA9IGZhbHNlO1xuY29uc3QgaXNTVkdDb250YWluZXIgPSAoY29udGFpbmVyKSA9PiAvc3ZnLy50ZXN0KGNvbnRhaW5lci5uYW1lc3BhY2VVUkkpICYmIGNvbnRhaW5lci50YWdOYW1lICE9PSAnZm9yZWlnbk9iamVjdCc7XG5jb25zdCBpc0NvbW1lbnQgPSAobm9kZSkgPT4gbm9kZS5ub2RlVHlwZSA9PT0gOCAvKiBET01Ob2RlVHlwZXMuQ09NTUVOVCAqLztcbi8vIE5vdGU6IGh5ZHJhdGlvbiBpcyBET00tc3BlY2lmaWNcbi8vIEJ1dCB3ZSBoYXZlIHRvIHBsYWNlIGl0IGluIGNvcmUgZHVlIHRvIHRpZ2h0IGNvdXBsaW5nIHdpdGggY29yZSAtIHNwbGl0dGluZ1xuLy8gaXQgb3V0IGNyZWF0ZXMgYSB0b24gb2YgdW5uZWNlc3NhcnkgY29tcGxleGl0eS5cbi8vIEh5ZHJhdGlvbiBhbHNvIGRlcGVuZHMgb24gc29tZSByZW5kZXJlciBpbnRlcm5hbCBsb2dpYyB3aGljaCBuZWVkcyB0byBiZVxuLy8gcGFzc2VkIGluIHZpYSBhcmd1bWVudHMuXG5mdW5jdGlvbiBjcmVhdGVIeWRyYXRpb25GdW5jdGlvbnMocmVuZGVyZXJJbnRlcm5hbHMpIHtcbiAgICBjb25zdCB7IG10OiBtb3VudENvbXBvbmVudCwgcDogcGF0Y2gsIG86IHsgcGF0Y2hQcm9wLCBjcmVhdGVUZXh0LCBuZXh0U2libGluZywgcGFyZW50Tm9kZSwgcmVtb3ZlLCBpbnNlcnQsIGNyZWF0ZUNvbW1lbnQgfSB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gICAgY29uc3QgaHlkcmF0ZSA9ICh2bm9kZSwgY29udGFpbmVyKSA9PiB7XG4gICAgICAgIGlmICghY29udGFpbmVyLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICAgICAgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmXG4gICAgICAgICAgICAgICAgd2FybihgQXR0ZW1wdGluZyB0byBoeWRyYXRlIGV4aXN0aW5nIG1hcmt1cCBidXQgY29udGFpbmVyIGlzIGVtcHR5LiBgICtcbiAgICAgICAgICAgICAgICAgICAgYFBlcmZvcm1pbmcgZnVsbCBtb3VudCBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgcGF0Y2gobnVsbCwgdm5vZGUsIGNvbnRhaW5lcik7XG4gICAgICAgICAgICBmbHVzaFBvc3RGbHVzaENicygpO1xuICAgICAgICAgICAgY29udGFpbmVyLl92bm9kZSA9IHZub2RlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGhhc01pc21hdGNoID0gZmFsc2U7XG4gICAgICAgIGh5ZHJhdGVOb2RlKGNvbnRhaW5lci5maXJzdENoaWxkLCB2bm9kZSwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIGZsdXNoUG9zdEZsdXNoQ2JzKCk7XG4gICAgICAgIGNvbnRhaW5lci5fdm5vZGUgPSB2bm9kZTtcbiAgICAgICAgaWYgKGhhc01pc21hdGNoICYmICFmYWxzZSkge1xuICAgICAgICAgICAgLy8gdGhpcyBlcnJvciBzaG91bGQgc2hvdyB1cCBpbiBwcm9kdWN0aW9uXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBIeWRyYXRpb24gY29tcGxldGVkIGJ1dCBjb250YWlucyBtaXNtYXRjaGVzLmApO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBoeWRyYXRlTm9kZSA9IChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQgPSBmYWxzZSkgPT4ge1xuICAgICAgICBjb25zdCBpc0ZyYWdtZW50U3RhcnQgPSBpc0NvbW1lbnQobm9kZSkgJiYgbm9kZS5kYXRhID09PSAnWyc7XG4gICAgICAgIGNvbnN0IG9uTWlzbWF0Y2ggPSAoKSA9PiBoYW5kbGVNaXNtYXRjaChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBpc0ZyYWdtZW50U3RhcnQpO1xuICAgICAgICBjb25zdCB7IHR5cGUsIHJlZiwgc2hhcGVGbGFnLCBwYXRjaEZsYWcgfSA9IHZub2RlO1xuICAgICAgICBsZXQgZG9tVHlwZSA9IG5vZGUubm9kZVR5cGU7XG4gICAgICAgIHZub2RlLmVsID0gbm9kZTtcbiAgICAgICAgaWYgKHBhdGNoRmxhZyA9PT0gLTIgLyogUGF0Y2hGbGFncy5CQUlMICovKSB7XG4gICAgICAgICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHZub2RlLmR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5leHROb2RlID0gbnVsbDtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFRleHQ6XG4gICAgICAgICAgICAgICAgaWYgKGRvbVR5cGUgIT09IDMgLyogRE9NTm9kZVR5cGVzLlRFWFQgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gIzU3MjggZW1wdHkgdGV4dCBub2RlIGluc2lkZSBhIHNsb3QgY2FuIGNhdXNlIGh5ZHJhdGlvbiBmYWlsdXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHNlcnZlciByZW5kZXJlZCBIVE1MIHdvbid0IGNvbnRhaW4gYSB0ZXh0IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZub2RlLmNoaWxkcmVuID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0KCh2bm9kZS5lbCA9IGNyZWF0ZVRleHQoJycpKSwgcGFyZW50Tm9kZShub2RlKSwgbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0Tm9kZSA9IG5vZGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0Tm9kZSA9IG9uTWlzbWF0Y2goKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZGF0YSAhPT0gdm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc01pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4oYEh5ZHJhdGlvbiB0ZXh0IG1pc21hdGNoOmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXFxuLSBDbGllbnQ6ICR7SlNPTi5zdHJpbmdpZnkobm9kZS5kYXRhKX1gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFxcbi0gU2VydmVyOiAke0pTT04uc3RyaW5naWZ5KHZub2RlLmNoaWxkcmVuKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGF0YSA9IHZub2RlLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDb21tZW50OlxuICAgICAgICAgICAgICAgIGlmIChkb21UeXBlICE9PSA4IC8qIERPTU5vZGVUeXBlcy5DT01NRU5UICovIHx8IGlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0Tm9kZSA9IG9uTWlzbWF0Y2goKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTdGF0aWM6XG4gICAgICAgICAgICAgICAgaWYgKGlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbnRpcmUgdGVtcGxhdGUgaXMgc3RhdGljIGJ1dCBTU1JlZCBhcyBhIGZyYWdtZW50XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgZG9tVHlwZSA9IG5vZGUubm9kZVR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkb21UeXBlID09PSAxIC8qIERPTU5vZGVUeXBlcy5FTEVNRU5UICovIHx8IGRvbVR5cGUgPT09IDMgLyogRE9NTm9kZVR5cGVzLlRFWFQgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGFuY2hvciwgYWRvcHQgY29udGVudFxuICAgICAgICAgICAgICAgICAgICBuZXh0Tm9kZSA9IG5vZGU7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzdGF0aWMgdm5vZGUgaGFzIGl0cyBjb250ZW50IHN0cmlwcGVkIGR1cmluZyBidWlsZCxcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRvcHQgaXQgZnJvbSB0aGUgc2VydmVyLXJlbmRlcmVkIEhUTUwuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRUb0Fkb3B0Q29udGVudCA9ICF2bm9kZS5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdm5vZGUuc3RhdGljQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRUb0Fkb3B0Q29udGVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bm9kZS5jaGlsZHJlbiArPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Tm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBET01Ob2RlVHlwZXMuRUxFTUVOVCAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXh0Tm9kZS5vdXRlckhUTUxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV4dE5vZGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSB2bm9kZS5zdGF0aWNDb3VudCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bm9kZS5hbmNob3IgPSBuZXh0Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobmV4dE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0ZyYWdtZW50U3RhcnQgPyBuZXh0U2libGluZyhuZXh0Tm9kZSkgOiBuZXh0Tm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9uTWlzbWF0Y2goKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgICAgICAgICAgIGlmICghaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dE5vZGUgPSBoeWRyYXRlRnJhZ21lbnQobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChzaGFwZUZsYWcgJiAxIC8qIFNoYXBlRmxhZ3MuRUxFTUVOVCAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9tVHlwZSAhPT0gMSAvKiBET01Ob2RlVHlwZXMuRUxFTUVOVCAqLyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdm5vZGUudHlwZS50b0xvd2VyQ2FzZSgpICE9PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0Tm9kZSA9IG9uTWlzbWF0Y2goKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHROb2RlID0gaHlkcmF0ZUVsZW1lbnQobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzaGFwZUZsYWcgJiA2IC8qIFNoYXBlRmxhZ3MuQ09NUE9ORU5UICovKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gc2V0dGluZyB1cCB0aGUgcmVuZGVyIGVmZmVjdCwgaWYgdGhlIGluaXRpYWwgdm5vZGUgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAvLyBoYXMgLmVsIHNldCwgdGhlIGNvbXBvbmVudCB3aWxsIHBlcmZvcm0gaHlkcmF0aW9uIGluc3RlYWQgb2YgbW91bnRcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gaXRzIHN1Yi10cmVlLlxuICAgICAgICAgICAgICAgICAgICB2bm9kZS5zbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHBhcmVudE5vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIG1vdW50Q29tcG9uZW50KHZub2RlLCBjb250YWluZXIsIG51bGwsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHQ29udGFpbmVyKGNvbnRhaW5lciksIG9wdGltaXplZCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCBtYXkgYmUgYXN5bmMsIHNvIGluIHRoZSBjYXNlIG9mIGZyYWdtZW50cyB3ZSBjYW5ub3QgcmVseVxuICAgICAgICAgICAgICAgICAgICAvLyBvbiBjb21wb25lbnQncyByZW5kZXJlZCBvdXRwdXQgdG8gZGV0ZXJtaW5lIHRoZSBlbmQgb2YgdGhlIGZyYWdtZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQsIHdlIGRvIGEgbG9va2FoZWFkIHRvIGZpbmQgdGhlIGVuZCBhbmNob3Igbm9kZS5cbiAgICAgICAgICAgICAgICAgICAgbmV4dE5vZGUgPSBpc0ZyYWdtZW50U3RhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbG9jYXRlQ2xvc2luZ0FzeW5jQW5jaG9yKG5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyAjNDI5MyB0ZWxlcG9ydCBhcyBjb21wb25lbnQgcm9vdFxuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dE5vZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tbWVudChuZXh0Tm9kZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHROb2RlLmRhdGEgPT09ICd0ZWxlcG9ydCBlbmQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5leHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyAjMzc4N1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBjb21wb25lbnQgaXMgYXN5bmMsIGl0IG1heSBnZXQgbW92ZWQgLyB1bm1vdW50ZWQgYmVmb3JlIGl0c1xuICAgICAgICAgICAgICAgICAgICAvLyBpbm5lciBjb21wb25lbnQgaXMgbG9hZGVkLCBzbyB3ZSBuZWVkIHRvIGdpdmUgaXQgYSBwbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICAvLyB2bm9kZSB0aGF0IG1hdGNoZXMgaXRzIGFkb3B0ZWQgRE9NLlxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBc3luY1dyYXBwZXIodm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3ViVHJlZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0ZyYWdtZW50U3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJUcmVlID0gY3JlYXRlVk5vZGUoRnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlRyZWUuYW5jaG9yID0gbmV4dE5vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXh0Tm9kZS5wcmV2aW91c1NpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb250YWluZXIubGFzdENoaWxkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViVHJlZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZVR5cGUgPT09IDMgPyBjcmVhdGVUZXh0Vk5vZGUoJycpIDogY3JlYXRlVk5vZGUoJ2RpdicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3ViVHJlZS5lbCA9IG5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2bm9kZS5jb21wb25lbnQuc3ViVHJlZSA9IHN1YlRyZWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2hhcGVGbGFnICYgNjQgLyogU2hhcGVGbGFncy5URUxFUE9SVCAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9tVHlwZSAhPT0gOCAvKiBET01Ob2RlVHlwZXMuQ09NTUVOVCAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0Tm9kZSA9IHZub2RlLnR5cGUuaHlkcmF0ZShub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzLCBoeWRyYXRlQ2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNoYXBlRmxhZyAmIDEyOCAvKiBTaGFwZUZsYWdzLlNVU1BFTlNFICovKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHROb2RlID0gdm5vZGUudHlwZS5oeWRyYXRlKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWR0NvbnRhaW5lcihwYXJlbnROb2RlKG5vZGUpKSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzLCBoeWRyYXRlTm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICB3YXJuKCdJbnZhbGlkIEhvc3RWTm9kZSB0eXBlOicsIHR5cGUsIGAoJHt0eXBlb2YgdHlwZX0pYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZWYgIT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0UmVmKHJlZiwgbnVsbCwgcGFyZW50U3VzcGVuc2UsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dE5vZGU7XG4gICAgfTtcbiAgICBjb25zdCBoeWRyYXRlRWxlbWVudCA9IChlbCwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgICAgIG9wdGltaXplZCA9IG9wdGltaXplZCB8fCAhIXZub2RlLmR5bmFtaWNDaGlsZHJlbjtcbiAgICAgICAgY29uc3QgeyB0eXBlLCBwcm9wcywgcGF0Y2hGbGFnLCBzaGFwZUZsYWcsIGRpcnMgfSA9IHZub2RlO1xuICAgICAgICAvLyAjNDAwNiBmb3IgZm9ybSBlbGVtZW50cyB3aXRoIG5vbi1zdHJpbmcgdi1tb2RlbCB2YWx1ZSBiaW5kaW5nc1xuICAgICAgICAvLyBlLmcuIDxvcHRpb24gOnZhbHVlPVwib2JqXCI+LCA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgOnRydWUtdmFsdWU9XCIxXCI+XG4gICAgICAgIGNvbnN0IGZvcmNlUGF0Y2hWYWx1ZSA9ICh0eXBlID09PSAnaW5wdXQnICYmIGRpcnMpIHx8IHR5cGUgPT09ICdvcHRpb24nO1xuICAgICAgICAvLyBza2lwIHByb3BzICYgY2hpbGRyZW4gaWYgdGhpcyBpcyBob2lzdGVkIHN0YXRpYyBub2Rlc1xuICAgICAgICAvLyAjNTQwNSBpbiBkZXYsIGFsd2F5cyBoeWRyYXRlIGNoaWxkcmVuIGZvciBITVJcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB8fCBmb3JjZVBhdGNoVmFsdWUgfHwgcGF0Y2hGbGFnICE9PSAtMSAvKiBQYXRjaEZsYWdzLkhPSVNURUQgKi8pIHtcbiAgICAgICAgICAgIGlmIChkaXJzKSB7XG4gICAgICAgICAgICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCAnY3JlYXRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcHJvcHNcbiAgICAgICAgICAgIGlmIChwcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChmb3JjZVBhdGNoVmFsdWUgfHxcbiAgICAgICAgICAgICAgICAgICAgIW9wdGltaXplZCB8fFxuICAgICAgICAgICAgICAgICAgICBwYXRjaEZsYWcgJiAoMTYgLyogUGF0Y2hGbGFncy5GVUxMX1BST1BTICovIHwgMzIgLyogUGF0Y2hGbGFncy5IWURSQVRFX0VWRU5UUyAqLykpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZm9yY2VQYXRjaFZhbHVlICYmIGtleS5lbmRzV2l0aCgndmFsdWUnKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNPbihrZXkpICYmICFpc1Jlc2VydmVkUHJvcChrZXkpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoUHJvcChlbCwga2V5LCBudWxsLCBwcm9wc1trZXldLCBmYWxzZSwgdW5kZWZpbmVkLCBwYXJlbnRDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3BzLm9uQ2xpY2spIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRmFzdCBwYXRoIGZvciBjbGljayBsaXN0ZW5lcnMgKHdoaWNoIGlzIG1vc3Qgb2Z0ZW4pIHRvIGF2b2lkXG4gICAgICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGluZyB0aHJvdWdoIHByb3BzLlxuICAgICAgICAgICAgICAgICAgICBwYXRjaFByb3AoZWwsICdvbkNsaWNrJywgbnVsbCwgcHJvcHMub25DbGljaywgZmFsc2UsIHVuZGVmaW5lZCwgcGFyZW50Q29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB2bm9kZSAvIGRpcmVjdGl2ZSBob29rc1xuICAgICAgICAgICAgbGV0IHZub2RlSG9va3M7XG4gICAgICAgICAgICBpZiAoKHZub2RlSG9va3MgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlQmVmb3JlTW91bnQpKSB7XG4gICAgICAgICAgICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9va3MsIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRpcnMpIHtcbiAgICAgICAgICAgICAgICBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsICdiZWZvcmVNb3VudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh2bm9kZUhvb2tzID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpIHx8IGRpcnMpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZub2RlSG9va3MgJiYgaW52b2tlVk5vZGVIb29rKHZub2RlSG9va3MsIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBkaXJzICYmIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgJ21vdW50ZWQnKTtcbiAgICAgICAgICAgICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjaGlsZHJlblxuICAgICAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2IC8qIFNoYXBlRmxhZ3MuQVJSQVlfQ0hJTERSRU4gKi8gJiZcbiAgICAgICAgICAgICAgICAvLyBza2lwIGlmIGVsZW1lbnQgaGFzIGlubmVySFRNTCAvIHRleHRDb250ZW50XG4gICAgICAgICAgICAgICAgIShwcm9wcyAmJiAocHJvcHMuaW5uZXJIVE1MIHx8IHByb3BzLnRleHRDb250ZW50KSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGh5ZHJhdGVDaGlsZHJlbihlbC5maXJzdENoaWxkLCB2bm9kZSwgZWwsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgICAgICAgICBsZXQgaGFzV2FybmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgd2hpbGUgKG5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzTWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmICFoYXNXYXJuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4oYEh5ZHJhdGlvbiBjaGlsZHJlbiBtaXNtYXRjaCBpbiA8JHt2bm9kZS50eXBlfT46IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBzZXJ2ZXIgcmVuZGVyZWQgZWxlbWVudCBjb250YWlucyBtb3JlIGNoaWxkIG5vZGVzIHRoYW4gY2xpZW50IHZkb20uYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNXYXJuZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBTU1JlZCBET00gY29udGFpbnMgbW9yZSBub2RlcyB0aGFuIGl0IHNob3VsZC4gUmVtb3ZlIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1ciA9IG5leHQ7XG4gICAgICAgICAgICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICByZW1vdmUoY3VyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzaGFwZUZsYWcgJiA4IC8qIFNoYXBlRmxhZ3MuVEVYVF9DSElMRFJFTiAqLykge1xuICAgICAgICAgICAgICAgIGlmIChlbC50ZXh0Q29udGVudCAhPT0gdm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzTWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4oYEh5ZHJhdGlvbiB0ZXh0IGNvbnRlbnQgbWlzbWF0Y2ggaW4gPCR7dm5vZGUudHlwZX0+OlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAtIENsaWVudDogJHtlbC50ZXh0Q29udGVudH1cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLSBTZXJ2ZXI6ICR7dm5vZGUuY2hpbGRyZW59YCk7XG4gICAgICAgICAgICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbC5uZXh0U2libGluZztcbiAgICB9O1xuICAgIGNvbnN0IGh5ZHJhdGVDaGlsZHJlbiA9IChub2RlLCBwYXJlbnRWTm9kZSwgY29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgICAgICBvcHRpbWl6ZWQgPSBvcHRpbWl6ZWQgfHwgISFwYXJlbnRWTm9kZS5keW5hbWljQ2hpbGRyZW47XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcGFyZW50Vk5vZGUuY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IGwgPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgIGxldCBoYXNXYXJuZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZub2RlID0gb3B0aW1pemVkXG4gICAgICAgICAgICAgICAgPyBjaGlsZHJlbltpXVxuICAgICAgICAgICAgICAgIDogKGNoaWxkcmVuW2ldID0gbm9ybWFsaXplVk5vZGUoY2hpbGRyZW5baV0pKTtcbiAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IGh5ZHJhdGVOb2RlKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2bm9kZS50eXBlID09PSBUZXh0ICYmICF2bm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFzTWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIWhhc1dhcm5lZCkge1xuICAgICAgICAgICAgICAgICAgICB3YXJuKGBIeWRyYXRpb24gY2hpbGRyZW4gbWlzbWF0Y2ggaW4gPCR7Y29udGFpbmVyLnRhZ05hbWUudG9Mb3dlckNhc2UoKX0+OiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBzZXJ2ZXIgcmVuZGVyZWQgZWxlbWVudCBjb250YWlucyBmZXdlciBjaGlsZCBub2RlcyB0aGFuIGNsaWVudCB2ZG9tLmApO1xuICAgICAgICAgICAgICAgICAgICBoYXNXYXJuZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB0aGUgU1NSZWQgRE9NIGRpZG4ndCBjb250YWluIGVub3VnaCBub2Rlcy4gTW91bnQgdGhlIG1pc3Npbmcgb25lcy5cbiAgICAgICAgICAgICAgICBwYXRjaChudWxsLCB2bm9kZSwgY29udGFpbmVyLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWR0NvbnRhaW5lcihjb250YWluZXIpLCBzbG90U2NvcGVJZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH07XG4gICAgY29uc3QgaHlkcmF0ZUZyYWdtZW50ID0gKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgICAgICBjb25zdCB7IHNsb3RTY29wZUlkczogZnJhZ21lbnRTbG90U2NvcGVJZHMgfSA9IHZub2RlO1xuICAgICAgICBpZiAoZnJhZ21lbnRTbG90U2NvcGVJZHMpIHtcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyA9IHNsb3RTY29wZUlkc1xuICAgICAgICAgICAgICAgID8gc2xvdFNjb3BlSWRzLmNvbmNhdChmcmFnbWVudFNsb3RTY29wZUlkcylcbiAgICAgICAgICAgICAgICA6IGZyYWdtZW50U2xvdFNjb3BlSWRzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHBhcmVudE5vZGUobm9kZSk7XG4gICAgICAgIGNvbnN0IG5leHQgPSBoeWRyYXRlQ2hpbGRyZW4obmV4dFNpYmxpbmcobm9kZSksIHZub2RlLCBjb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgaWYgKG5leHQgJiYgaXNDb21tZW50KG5leHQpICYmIG5leHQuZGF0YSA9PT0gJ10nKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV4dFNpYmxpbmcoKHZub2RlLmFuY2hvciA9IG5leHQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGZyYWdtZW50IGRpZG4ndCBoeWRyYXRlIHN1Y2Nlc3NmdWxseSwgc2luY2Ugd2UgZGlkbid0IGdldCBhIGVuZCBhbmNob3JcbiAgICAgICAgICAgIC8vIGJhY2suIFRoaXMgc2hvdWxkIGhhdmUgbGVkIHRvIG5vZGUvY2hpbGRyZW4gbWlzbWF0Y2ggd2FybmluZ3MuXG4gICAgICAgICAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAvLyBzaW5jZSB0aGUgYW5jaG9yIGlzIG1pc3NpbmcsIHdlIG5lZWQgdG8gY3JlYXRlIG9uZSBhbmQgaW5zZXJ0IGl0XG4gICAgICAgICAgICBpbnNlcnQoKHZub2RlLmFuY2hvciA9IGNyZWF0ZUNvbW1lbnQoYF1gKSksIGNvbnRhaW5lciwgbmV4dCk7XG4gICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgaGFuZGxlTWlzbWF0Y2ggPSAobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgaXNGcmFnbWVudCkgPT4ge1xuICAgICAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJlxuICAgICAgICAgICAgd2FybihgSHlkcmF0aW9uIG5vZGUgbWlzbWF0Y2g6XFxuLSBDbGllbnQgdm5vZGU6YCwgdm5vZGUudHlwZSwgYFxcbi0gU2VydmVyIHJlbmRlcmVkIERPTTpgLCBub2RlLCBub2RlLm5vZGVUeXBlID09PSAzIC8qIERPTU5vZGVUeXBlcy5URVhUICovXG4gICAgICAgICAgICAgICAgPyBgKHRleHQpYFxuICAgICAgICAgICAgICAgIDogaXNDb21tZW50KG5vZGUpICYmIG5vZGUuZGF0YSA9PT0gJ1snXG4gICAgICAgICAgICAgICAgICAgID8gYChzdGFydCBvZiBmcmFnbWVudClgXG4gICAgICAgICAgICAgICAgICAgIDogYGApO1xuICAgICAgICB2bm9kZS5lbCA9IG51bGw7XG4gICAgICAgIGlmIChpc0ZyYWdtZW50KSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgZXhjZXNzaXZlIGZyYWdtZW50IG5vZGVzXG4gICAgICAgICAgICBjb25zdCBlbmQgPSBsb2NhdGVDbG9zaW5nQXN5bmNBbmNob3Iobm9kZSk7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiBuZXh0ICE9PSBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKG5leHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5leHQgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gcGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgcmVtb3ZlKG5vZGUpO1xuICAgICAgICBwYXRjaChudWxsLCB2bm9kZSwgY29udGFpbmVyLCBuZXh0LCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWR0NvbnRhaW5lcihjb250YWluZXIpLCBzbG90U2NvcGVJZHMpO1xuICAgICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICAgIGNvbnN0IGxvY2F0ZUNsb3NpbmdBc3luY0FuY2hvciA9IChub2RlKSA9PiB7XG4gICAgICAgIGxldCBtYXRjaCA9IDA7XG4gICAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgICAgICBub2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgICBpZiAobm9kZSAmJiBpc0NvbW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5kYXRhID09PSAnWycpXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoKys7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZGF0YSA9PT0gJ10nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2gtLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9O1xuICAgIHJldHVybiBbaHlkcmF0ZSwgaHlkcmF0ZU5vZGVdO1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgKi9cbmxldCBzdXBwb3J0ZWQ7XG5sZXQgcGVyZjtcbmZ1bmN0aW9uIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgdHlwZSkge1xuICAgIGlmIChpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy5wZXJmb3JtYW5jZSAmJiBpc1N1cHBvcnRlZCgpKSB7XG4gICAgICAgIHBlcmYubWFyayhgdnVlLSR7dHlwZX0tJHtpbnN0YW5jZS51aWR9YCk7XG4gICAgfVxuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgIGRldnRvb2xzUGVyZlN0YXJ0KGluc3RhbmNlLCB0eXBlLCBpc1N1cHBvcnRlZCgpID8gcGVyZi5ub3coKSA6IERhdGUubm93KCkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVuZE1lYXN1cmUoaW5zdGFuY2UsIHR5cGUpIHtcbiAgICBpZiAoaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcucGVyZm9ybWFuY2UgJiYgaXNTdXBwb3J0ZWQoKSkge1xuICAgICAgICBjb25zdCBzdGFydFRhZyA9IGB2dWUtJHt0eXBlfS0ke2luc3RhbmNlLnVpZH1gO1xuICAgICAgICBjb25zdCBlbmRUYWcgPSBzdGFydFRhZyArIGA6ZW5kYDtcbiAgICAgICAgcGVyZi5tYXJrKGVuZFRhZyk7XG4gICAgICAgIHBlcmYubWVhc3VyZShgPCR7Zm9ybWF0Q29tcG9uZW50TmFtZShpbnN0YW5jZSwgaW5zdGFuY2UudHlwZSl9PiAke3R5cGV9YCwgc3RhcnRUYWcsIGVuZFRhZyk7XG4gICAgICAgIHBlcmYuY2xlYXJNYXJrcyhzdGFydFRhZyk7XG4gICAgICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpO1xuICAgIH1cbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICBkZXZ0b29sc1BlcmZFbmQoaW5zdGFuY2UsIHR5cGUsIGlzU3VwcG9ydGVkKCkgPyBwZXJmLm5vdygpIDogRGF0ZS5ub3coKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNTdXBwb3J0ZWQoKSB7XG4gICAgaWYgKHN1cHBvcnRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBzdXBwb3J0ZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucGVyZm9ybWFuY2UpIHtcbiAgICAgICAgc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgcGVyZiA9IHdpbmRvdy5wZXJmb3JtYW5jZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN1cHBvcnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc3VwcG9ydGVkO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgb25seSBjYWxsZWQgaW4gZXNtLWJ1bmRsZXIgYnVpbGRzLlxuICogSXQgaXMgY2FsbGVkIHdoZW4gYSByZW5kZXJlciBpcyBjcmVhdGVkLCBpbiBgYmFzZUNyZWF0ZVJlbmRlcmVyYCBzbyB0aGF0XG4gKiBpbXBvcnRpbmcgcnVudGltZS1jb3JlIGlzIHNpZGUtZWZmZWN0cyBmcmVlLlxuICpcbiAqIGlzdGFuYnVsLWlnbm9yZS1uZXh0XG4gKi9cbmZ1bmN0aW9uIGluaXRGZWF0dXJlRmxhZ3MoKSB7XG4gICAgY29uc3QgbmVlZFdhcm4gPSBbXTtcbiAgICBpZiAodHlwZW9mIF9fVlVFX09QVElPTlNfQVBJX18gIT09ICdib29sZWFuJykge1xuICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgbmVlZFdhcm4ucHVzaChgX19WVUVfT1BUSU9OU19BUElfX2ApO1xuICAgICAgICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfT1BUSU9OU19BUElfXyA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgX19WVUVfUFJPRF9ERVZUT09MU19fICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIG5lZWRXYXJuLnB1c2goYF9fVlVFX1BST0RfREVWVE9PTFNfX2ApO1xuICAgICAgICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfUFJPRF9ERVZUT09MU19fID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgbmVlZFdhcm4ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG11bHRpID0gbmVlZFdhcm4ubGVuZ3RoID4gMTtcbiAgICAgICAgY29uc29sZS53YXJuKGBGZWF0dXJlIGZsYWcke211bHRpID8gYHNgIDogYGB9ICR7bmVlZFdhcm4uam9pbignLCAnKX0gJHttdWx0aSA/IGBhcmVgIDogYGlzYH0gbm90IGV4cGxpY2l0bHkgZGVmaW5lZC4gWW91IGFyZSBydW5uaW5nIHRoZSBlc20tYnVuZGxlciBidWlsZCBvZiBWdWUsIGAgK1xuICAgICAgICAgICAgYHdoaWNoIGV4cGVjdHMgdGhlc2UgY29tcGlsZS10aW1lIGZlYXR1cmUgZmxhZ3MgdG8gYmUgZ2xvYmFsbHkgaW5qZWN0ZWQgYCArXG4gICAgICAgICAgICBgdmlhIHRoZSBidW5kbGVyIGNvbmZpZyBpbiBvcmRlciB0byBnZXQgYmV0dGVyIHRyZWUtc2hha2luZyBpbiB0aGUgYCArXG4gICAgICAgICAgICBgcHJvZHVjdGlvbiBidW5kbGUuXFxuXFxuYCArXG4gICAgICAgICAgICBgRm9yIG1vcmUgZGV0YWlscywgc2VlIGh0dHBzOi8vbGluay52dWVqcy5vcmcvZmVhdHVyZS1mbGFncy5gKTtcbiAgICB9XG59XG5cbmNvbnN0IHF1ZXVlUG9zdFJlbmRlckVmZmVjdCA9IHF1ZXVlRWZmZWN0V2l0aFN1c3BlbnNlXG4gICAgO1xuLyoqXG4gKiBUaGUgY3JlYXRlUmVuZGVyZXIgZnVuY3Rpb24gYWNjZXB0cyB0d28gZ2VuZXJpYyBhcmd1bWVudHM6XG4gKiBIb3N0Tm9kZSBhbmQgSG9zdEVsZW1lbnQsIGNvcnJlc3BvbmRpbmcgdG8gTm9kZSBhbmQgRWxlbWVudCB0eXBlcyBpbiB0aGVcbiAqIGhvc3QgZW52aXJvbm1lbnQuIEZvciBleGFtcGxlLCBmb3IgcnVudGltZS1kb20sIEhvc3ROb2RlIHdvdWxkIGJlIHRoZSBET01cbiAqIGBOb2RlYCBpbnRlcmZhY2UgYW5kIEhvc3RFbGVtZW50IHdvdWxkIGJlIHRoZSBET00gYEVsZW1lbnRgIGludGVyZmFjZS5cbiAqXG4gKiBDdXN0b20gcmVuZGVyZXJzIGNhbiBwYXNzIGluIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyB0eXBlcyBsaWtlIHRoaXM6XG4gKlxuICogYGBgIGpzXG4gKiBjb25zdCB7IHJlbmRlciwgY3JlYXRlQXBwIH0gPSBjcmVhdGVSZW5kZXJlcjxOb2RlLCBFbGVtZW50Pih7XG4gKiAgIHBhdGNoUHJvcCxcbiAqICAgLi4ubm9kZU9wc1xuICogfSlcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBjcmVhdGVSZW5kZXJlcihvcHRpb25zKSB7XG4gICAgcmV0dXJuIGJhc2VDcmVhdGVSZW5kZXJlcihvcHRpb25zKTtcbn1cbi8vIFNlcGFyYXRlIEFQSSBmb3IgY3JlYXRpbmcgaHlkcmF0aW9uLWVuYWJsZWQgcmVuZGVyZXIuXG4vLyBIeWRyYXRpb24gbG9naWMgaXMgb25seSB1c2VkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBtYWtpbmcgaXRcbi8vIHRyZWUtc2hha2FibGUuXG5mdW5jdGlvbiBjcmVhdGVIeWRyYXRpb25SZW5kZXJlcihvcHRpb25zKSB7XG4gICAgcmV0dXJuIGJhc2VDcmVhdGVSZW5kZXJlcihvcHRpb25zLCBjcmVhdGVIeWRyYXRpb25GdW5jdGlvbnMpO1xufVxuLy8gaW1wbGVtZW50YXRpb25cbmZ1bmN0aW9uIGJhc2VDcmVhdGVSZW5kZXJlcihvcHRpb25zLCBjcmVhdGVIeWRyYXRpb25GbnMpIHtcbiAgICAvLyBjb21waWxlLXRpbWUgZmVhdHVyZSBmbGFncyBjaGVja1xuICAgIHtcbiAgICAgICAgaW5pdEZlYXR1cmVGbGFncygpO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBnZXRHbG9iYWxUaGlzKCk7XG4gICAgdGFyZ2V0Ll9fVlVFX18gPSB0cnVlO1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgIHNldERldnRvb2xzSG9vayh0YXJnZXQuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXywgdGFyZ2V0KTtcbiAgICB9XG4gICAgY29uc3QgeyBpbnNlcnQ6IGhvc3RJbnNlcnQsIHJlbW92ZTogaG9zdFJlbW92ZSwgcGF0Y2hQcm9wOiBob3N0UGF0Y2hQcm9wLCBjcmVhdGVFbGVtZW50OiBob3N0Q3JlYXRlRWxlbWVudCwgY3JlYXRlVGV4dDogaG9zdENyZWF0ZVRleHQsIGNyZWF0ZUNvbW1lbnQ6IGhvc3RDcmVhdGVDb21tZW50LCBzZXRUZXh0OiBob3N0U2V0VGV4dCwgc2V0RWxlbWVudFRleHQ6IGhvc3RTZXRFbGVtZW50VGV4dCwgcGFyZW50Tm9kZTogaG9zdFBhcmVudE5vZGUsIG5leHRTaWJsaW5nOiBob3N0TmV4dFNpYmxpbmcsIHNldFNjb3BlSWQ6IGhvc3RTZXRTY29wZUlkID0gTk9PUCwgaW5zZXJ0U3RhdGljQ29udGVudDogaG9zdEluc2VydFN0YXRpY0NvbnRlbnQgfSA9IG9wdGlvbnM7XG4gICAgLy8gTm90ZTogZnVuY3Rpb25zIGluc2lkZSB0aGlzIGNsb3N1cmUgc2hvdWxkIHVzZSBgY29uc3QgeHh4ID0gKCkgPT4ge31gXG4gICAgLy8gc3R5bGUgaW4gb3JkZXIgdG8gcHJldmVudCBiZWluZyBpbmxpbmVkIGJ5IG1pbmlmaWVycy5cbiAgICBjb25zdCBwYXRjaCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yID0gbnVsbCwgcGFyZW50Q29tcG9uZW50ID0gbnVsbCwgcGFyZW50U3VzcGVuc2UgPSBudWxsLCBpc1NWRyA9IGZhbHNlLCBzbG90U2NvcGVJZHMgPSBudWxsLCBvcHRpbWl6ZWQgPSAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgaXNIbXJVcGRhdGluZyA/IGZhbHNlIDogISFuMi5keW5hbWljQ2hpbGRyZW4pID0+IHtcbiAgICAgICAgaWYgKG4xID09PSBuMikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHBhdGNoaW5nICYgbm90IHNhbWUgdHlwZSwgdW5tb3VudCBvbGQgdHJlZVxuICAgICAgICBpZiAobjEgJiYgIWlzU2FtZVZOb2RlVHlwZShuMSwgbjIpKSB7XG4gICAgICAgICAgICBhbmNob3IgPSBnZXROZXh0SG9zdE5vZGUobjEpO1xuICAgICAgICAgICAgdW5tb3VudChuMSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgICAgICBuMSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4yLnBhdGNoRmxhZyA9PT0gLTIgLyogUGF0Y2hGbGFncy5CQUlMICovKSB7XG4gICAgICAgICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIG4yLmR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0eXBlLCByZWYsIHNoYXBlRmxhZyB9ID0gbjI7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBUZXh0OlxuICAgICAgICAgICAgICAgIHByb2Nlc3NUZXh0KG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDb21tZW50OlxuICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tZW50Tm9kZShuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3RhdGljOlxuICAgICAgICAgICAgICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdW50U3RhdGljTm9kZShuMiwgY29udGFpbmVyLCBhbmNob3IsIGlzU1ZHKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGljTm9kZShuMSwgbjIsIGNvbnRhaW5lciwgaXNTVkcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0ZyYWdtZW50KG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChzaGFwZUZsYWcgJiAxIC8qIFNoYXBlRmxhZ3MuRUxFTUVOVCAqLykge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRWxlbWVudChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzaGFwZUZsYWcgJiA2IC8qIFNoYXBlRmxhZ3MuQ09NUE9ORU5UICovKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnQobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2hhcGVGbGFnICYgNjQgLyogU2hhcGVGbGFncy5URUxFUE9SVCAqLykge1xuICAgICAgICAgICAgICAgICAgICB0eXBlLnByb2Nlc3MobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCBpbnRlcm5hbHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzaGFwZUZsYWcgJiAxMjggLyogU2hhcGVGbGFncy5TVVNQRU5TRSAqLykge1xuICAgICAgICAgICAgICAgICAgICB0eXBlLnByb2Nlc3MobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCBpbnRlcm5hbHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FybignSW52YWxpZCBWTm9kZSB0eXBlOicsIHR5cGUsIGAoJHt0eXBlb2YgdHlwZX0pYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHNldCByZWZcbiAgICAgICAgaWYgKHJlZiAhPSBudWxsICYmIHBhcmVudENvbXBvbmVudCkge1xuICAgICAgICAgICAgc2V0UmVmKHJlZiwgbjEgJiYgbjEucmVmLCBwYXJlbnRTdXNwZW5zZSwgbjIgfHwgbjEsICFuMik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHByb2Nlc3NUZXh0ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpID0+IHtcbiAgICAgICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgICAgICAgIGhvc3RJbnNlcnQoKG4yLmVsID0gaG9zdENyZWF0ZVRleHQobjIuY2hpbGRyZW4pKSwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZWwgPSAobjIuZWwgPSBuMS5lbCk7XG4gICAgICAgICAgICBpZiAobjIuY2hpbGRyZW4gIT09IG4xLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgaG9zdFNldFRleHQoZWwsIG4yLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgcHJvY2Vzc0NvbW1lbnROb2RlID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpID0+IHtcbiAgICAgICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgICAgICAgIGhvc3RJbnNlcnQoKG4yLmVsID0gaG9zdENyZWF0ZUNvbW1lbnQobjIuY2hpbGRyZW4gfHwgJycpKSwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gdGhlcmUncyBubyBzdXBwb3J0IGZvciBkeW5hbWljIGNvbW1lbnRzXG4gICAgICAgICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBtb3VudFN0YXRpY05vZGUgPSAobjIsIGNvbnRhaW5lciwgYW5jaG9yLCBpc1NWRykgPT4ge1xuICAgICAgICBbbjIuZWwsIG4yLmFuY2hvcl0gPSBob3N0SW5zZXJ0U3RhdGljQ29udGVudChuMi5jaGlsZHJlbiwgY29udGFpbmVyLCBhbmNob3IsIGlzU1ZHLCBuMi5lbCwgbjIuYW5jaG9yKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERldiAvIEhNUiBvbmx5XG4gICAgICovXG4gICAgY29uc3QgcGF0Y2hTdGF0aWNOb2RlID0gKG4xLCBuMiwgY29udGFpbmVyLCBpc1NWRykgPT4ge1xuICAgICAgICAvLyBzdGF0aWMgbm9kZXMgYXJlIG9ubHkgcGF0Y2hlZCBkdXJpbmcgZGV2IGZvciBITVJcbiAgICAgICAgaWYgKG4yLmNoaWxkcmVuICE9PSBuMS5jaGlsZHJlbikge1xuICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gaG9zdE5leHRTaWJsaW5nKG4xLmFuY2hvcik7XG4gICAgICAgICAgICAvLyByZW1vdmUgZXhpc3RpbmdcbiAgICAgICAgICAgIHJlbW92ZVN0YXRpY05vZGUobjEpO1xuICAgICAgICAgICAgW24yLmVsLCBuMi5hbmNob3JdID0gaG9zdEluc2VydFN0YXRpY0NvbnRlbnQobjIuY2hpbGRyZW4sIGNvbnRhaW5lciwgYW5jaG9yLCBpc1NWRyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgICAgICAgbjIuYW5jaG9yID0gbjEuYW5jaG9yO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBtb3ZlU3RhdGljTm9kZSA9ICh7IGVsLCBhbmNob3IgfSwgY29udGFpbmVyLCBuZXh0U2libGluZykgPT4ge1xuICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgd2hpbGUgKGVsICYmIGVsICE9PSBhbmNob3IpIHtcbiAgICAgICAgICAgIG5leHQgPSBob3N0TmV4dFNpYmxpbmcoZWwpO1xuICAgICAgICAgICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBuZXh0U2libGluZyk7XG4gICAgICAgICAgICBlbCA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgaG9zdEluc2VydChhbmNob3IsIGNvbnRhaW5lciwgbmV4dFNpYmxpbmcpO1xuICAgIH07XG4gICAgY29uc3QgcmVtb3ZlU3RhdGljTm9kZSA9ICh7IGVsLCBhbmNob3IgfSkgPT4ge1xuICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgd2hpbGUgKGVsICYmIGVsICE9PSBhbmNob3IpIHtcbiAgICAgICAgICAgIG5leHQgPSBob3N0TmV4dFNpYmxpbmcoZWwpO1xuICAgICAgICAgICAgaG9zdFJlbW92ZShlbCk7XG4gICAgICAgICAgICBlbCA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgaG9zdFJlbW92ZShhbmNob3IpO1xuICAgIH07XG4gICAgY29uc3QgcHJvY2Vzc0VsZW1lbnQgPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgICAgIGlzU1ZHID0gaXNTVkcgfHwgbjIudHlwZSA9PT0gJ3N2Zyc7XG4gICAgICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICAgICAgICBtb3VudEVsZW1lbnQobjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGF0Y2hFbGVtZW50KG4xLCBuMiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgbW91bnRFbGVtZW50ID0gKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgICAgIGxldCBlbDtcbiAgICAgICAgbGV0IHZub2RlSG9vaztcbiAgICAgICAgY29uc3QgeyB0eXBlLCBwcm9wcywgc2hhcGVGbGFnLCB0cmFuc2l0aW9uLCBkaXJzIH0gPSB2bm9kZTtcbiAgICAgICAgZWwgPSB2bm9kZS5lbCA9IGhvc3RDcmVhdGVFbGVtZW50KHZub2RlLnR5cGUsIGlzU1ZHLCBwcm9wcyAmJiBwcm9wcy5pcywgcHJvcHMpO1xuICAgICAgICAvLyBtb3VudCBjaGlsZHJlbiBmaXJzdCwgc2luY2Ugc29tZSBwcm9wcyBtYXkgcmVseSBvbiBjaGlsZCBjb250ZW50XG4gICAgICAgIC8vIGJlaW5nIGFscmVhZHkgcmVuZGVyZWQsIGUuZy4gYDxzZWxlY3QgdmFsdWU+YFxuICAgICAgICBpZiAoc2hhcGVGbGFnICYgOCAvKiBTaGFwZUZsYWdzLlRFWFRfQ0hJTERSRU4gKi8pIHtcbiAgICAgICAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChlbCwgdm5vZGUuY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNoYXBlRmxhZyAmIDE2IC8qIFNoYXBlRmxhZ3MuQVJSQVlfQ0hJTERSRU4gKi8pIHtcbiAgICAgICAgICAgIG1vdW50Q2hpbGRyZW4odm5vZGUuY2hpbGRyZW4sIGVsLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRyAmJiB0eXBlICE9PSAnZm9yZWlnbk9iamVjdCcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlycykge1xuICAgICAgICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCAnY3JlYXRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNjb3BlSWRcbiAgICAgICAgc2V0U2NvcGVJZChlbCwgdm5vZGUsIHZub2RlLnNjb3BlSWQsIHNsb3RTY29wZUlkcywgcGFyZW50Q29tcG9uZW50KTtcbiAgICAgICAgLy8gcHJvcHNcbiAgICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICd2YWx1ZScgJiYgIWlzUmVzZXJ2ZWRQcm9wKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdFBhdGNoUHJvcChlbCwga2V5LCBudWxsLCBwcm9wc1trZXldLCBpc1NWRywgdm5vZGUuY2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHVubW91bnRDaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBTcGVjaWFsIGNhc2UgZm9yIHNldHRpbmcgdmFsdWUgb24gRE9NIGVsZW1lbnRzOlxuICAgICAgICAgICAgICogLSBpdCBjYW4gYmUgb3JkZXItc2Vuc2l0aXZlIChlLmcuIHNob3VsZCBiZSBzZXQgKmFmdGVyKiBtaW4vbWF4LCAjMjMyNSwgIzQwMjQpXG4gICAgICAgICAgICAgKiAtIGl0IG5lZWRzIHRvIGJlIGZvcmNlZCAoIzE0NzEpXG4gICAgICAgICAgICAgKiAjMjM1MyBwcm9wb3NlcyBhZGRpbmcgYW5vdGhlciByZW5kZXJlciBvcHRpb24gdG8gY29uZmlndXJlIHRoaXMsIGJ1dFxuICAgICAgICAgICAgICogdGhlIHByb3BlcnRpZXMgYWZmZWN0cyBhcmUgc28gZmluaXRlIGl0IGlzIHdvcnRoIHNwZWNpYWwgY2FzaW5nIGl0XG4gICAgICAgICAgICAgKiBoZXJlIHRvIHJlZHVjZSB0aGUgY29tcGxleGl0eS4gKFNwZWNpYWwgY2FzaW5nIGl0IGFsc28gc2hvdWxkIG5vdFxuICAgICAgICAgICAgICogYWZmZWN0IG5vbi1ET00gcmVuZGVyZXJzKVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAoJ3ZhbHVlJyBpbiBwcm9wcykge1xuICAgICAgICAgICAgICAgIGhvc3RQYXRjaFByb3AoZWwsICd2YWx1ZScsIG51bGwsIHByb3BzLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodm5vZGVIb29rID0gcHJvcHMub25Wbm9kZUJlZm9yZU1vdW50KSkge1xuICAgICAgICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICdfX3Zub2RlJywge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2bm9kZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICdfX3Z1ZVBhcmVudENvbXBvbmVudCcsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlycykge1xuICAgICAgICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCAnYmVmb3JlTW91bnQnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAjMTU4MyBGb3IgaW5zaWRlIHN1c3BlbnNlICsgc3VzcGVuc2Ugbm90IHJlc29sdmVkIGNhc2UsIGVudGVyIGhvb2sgc2hvdWxkIGNhbGwgd2hlbiBzdXNwZW5zZSByZXNvbHZlZFxuICAgICAgICAvLyAjMTY4OSBGb3IgaW5zaWRlIHN1c3BlbnNlICsgc3VzcGVuc2UgcmVzb2x2ZWQgY2FzZSwganVzdCBjYWxsIGl0XG4gICAgICAgIGNvbnN0IG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzID0gKCFwYXJlbnRTdXNwZW5zZSB8fCAocGFyZW50U3VzcGVuc2UgJiYgIXBhcmVudFN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpKSAmJlxuICAgICAgICAgICAgdHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgIXRyYW5zaXRpb24ucGVyc2lzdGVkO1xuICAgICAgICBpZiAobmVlZENhbGxUcmFuc2l0aW9uSG9va3MpIHtcbiAgICAgICAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoZWwpO1xuICAgICAgICB9XG4gICAgICAgIGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgaWYgKCh2bm9kZUhvb2sgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlTW91bnRlZCkgfHxcbiAgICAgICAgICAgIG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzIHx8XG4gICAgICAgICAgICBkaXJzKSB7XG4gICAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHZub2RlSG9vayAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgICAgICAgICAgICBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyAmJiB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICAgICAgICAgICAgICBkaXJzICYmIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgJ21vdW50ZWQnKTtcbiAgICAgICAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgc2V0U2NvcGVJZCA9IChlbCwgdm5vZGUsIHNjb3BlSWQsIHNsb3RTY29wZUlkcywgcGFyZW50Q29tcG9uZW50KSA9PiB7XG4gICAgICAgIGlmIChzY29wZUlkKSB7XG4gICAgICAgICAgICBob3N0U2V0U2NvcGVJZChlbCwgc2NvcGVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNsb3RTY29wZUlkcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbG90U2NvcGVJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBob3N0U2V0U2NvcGVJZChlbCwgc2xvdFNjb3BlSWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Q29tcG9uZW50KSB7XG4gICAgICAgICAgICBsZXQgc3ViVHJlZSA9IHBhcmVudENvbXBvbmVudC5zdWJUcmVlO1xuICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJlxuICAgICAgICAgICAgICAgIHN1YlRyZWUucGF0Y2hGbGFnID4gMCAmJlxuICAgICAgICAgICAgICAgIHN1YlRyZWUucGF0Y2hGbGFnICYgMjA0OCAvKiBQYXRjaEZsYWdzLkRFVl9ST09UX0ZSQUdNRU5UICovKSB7XG4gICAgICAgICAgICAgICAgc3ViVHJlZSA9XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclNpbmdsZVJvb3Qoc3ViVHJlZS5jaGlsZHJlbikgfHwgc3ViVHJlZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2bm9kZSA9PT0gc3ViVHJlZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFZOb2RlID0gcGFyZW50Q29tcG9uZW50LnZub2RlO1xuICAgICAgICAgICAgICAgIHNldFNjb3BlSWQoZWwsIHBhcmVudFZOb2RlLCBwYXJlbnRWTm9kZS5zY29wZUlkLCBwYXJlbnRWTm9kZS5zbG90U2NvcGVJZHMsIHBhcmVudENvbXBvbmVudC5wYXJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBtb3VudENoaWxkcmVuID0gKGNoaWxkcmVuLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCBzdGFydCA9IDApID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gKGNoaWxkcmVuW2ldID0gb3B0aW1pemVkXG4gICAgICAgICAgICAgICAgPyBjbG9uZUlmTW91bnRlZChjaGlsZHJlbltpXSlcbiAgICAgICAgICAgICAgICA6IG5vcm1hbGl6ZVZOb2RlKGNoaWxkcmVuW2ldKSk7XG4gICAgICAgICAgICBwYXRjaChudWxsLCBjaGlsZCwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHBhdGNoRWxlbWVudCA9IChuMSwgbjIsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IChuMi5lbCA9IG4xLmVsKTtcbiAgICAgICAgbGV0IHsgcGF0Y2hGbGFnLCBkeW5hbWljQ2hpbGRyZW4sIGRpcnMgfSA9IG4yO1xuICAgICAgICAvLyAjMTQyNiB0YWtlIHRoZSBvbGQgdm5vZGUncyBwYXRjaCBmbGFnIGludG8gYWNjb3VudCBzaW5jZSB1c2VyIG1heSBjbG9uZSBhXG4gICAgICAgIC8vIGNvbXBpbGVyLWdlbmVyYXRlZCB2bm9kZSwgd2hpY2ggZGUtb3B0cyB0byBGVUxMX1BST1BTXG4gICAgICAgIHBhdGNoRmxhZyB8PSBuMS5wYXRjaEZsYWcgJiAxNiAvKiBQYXRjaEZsYWdzLkZVTExfUFJPUFMgKi87XG4gICAgICAgIGNvbnN0IG9sZFByb3BzID0gbjEucHJvcHMgfHwgRU1QVFlfT0JKO1xuICAgICAgICBjb25zdCBuZXdQcm9wcyA9IG4yLnByb3BzIHx8IEVNUFRZX09CSjtcbiAgICAgICAgbGV0IHZub2RlSG9vaztcbiAgICAgICAgLy8gZGlzYWJsZSByZWN1cnNlIGluIGJlZm9yZVVwZGF0ZSBob29rc1xuICAgICAgICBwYXJlbnRDb21wb25lbnQgJiYgdG9nZ2xlUmVjdXJzZShwYXJlbnRDb21wb25lbnQsIGZhbHNlKTtcbiAgICAgICAgaWYgKCh2bm9kZUhvb2sgPSBuZXdQcm9wcy5vblZub2RlQmVmb3JlVXBkYXRlKSkge1xuICAgICAgICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCBuMiwgbjEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXJzKSB7XG4gICAgICAgICAgICBpbnZva2VEaXJlY3RpdmVIb29rKG4yLCBuMSwgcGFyZW50Q29tcG9uZW50LCAnYmVmb3JlVXBkYXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50Q29tcG9uZW50ICYmIHRvZ2dsZVJlY3Vyc2UocGFyZW50Q29tcG9uZW50LCB0cnVlKTtcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgICAgICAgICAvLyBITVIgdXBkYXRlZCwgZm9yY2UgZnVsbCBkaWZmXG4gICAgICAgICAgICBwYXRjaEZsYWcgPSAwO1xuICAgICAgICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICAgICAgICBkeW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFyZUNoaWxkcmVuU1ZHID0gaXNTVkcgJiYgbjIudHlwZSAhPT0gJ2ZvcmVpZ25PYmplY3QnO1xuICAgICAgICBpZiAoZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgICAgICAgICBwYXRjaEJsb2NrQ2hpbGRyZW4objEuZHluYW1pY0NoaWxkcmVuLCBkeW5hbWljQ2hpbGRyZW4sIGVsLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBhcmVDaGlsZHJlblNWRywgc2xvdFNjb3BlSWRzKTtcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgcGFyZW50Q29tcG9uZW50ICYmIHBhcmVudENvbXBvbmVudC50eXBlLl9faG1ySWQpIHtcbiAgICAgICAgICAgICAgICB0cmF2ZXJzZVN0YXRpY0NoaWxkcmVuKG4xLCBuMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIW9wdGltaXplZCkge1xuICAgICAgICAgICAgLy8gZnVsbCBkaWZmXG4gICAgICAgICAgICBwYXRjaENoaWxkcmVuKG4xLCBuMiwgZWwsIG51bGwsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGFyZUNoaWxkcmVuU1ZHLCBzbG90U2NvcGVJZHMsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0Y2hGbGFnID4gMCkge1xuICAgICAgICAgICAgLy8gdGhlIHByZXNlbmNlIG9mIGEgcGF0Y2hGbGFnIG1lYW5zIHRoaXMgZWxlbWVudCdzIHJlbmRlciBjb2RlIHdhc1xuICAgICAgICAgICAgLy8gZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBhbmQgY2FuIHRha2UgdGhlIGZhc3QgcGF0aC5cbiAgICAgICAgICAgIC8vIGluIHRoaXMgcGF0aCBvbGQgbm9kZSBhbmQgbmV3IG5vZGUgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgc2FtZSBzaGFwZVxuICAgICAgICAgICAgLy8gKGkuZS4gYXQgdGhlIGV4YWN0IHNhbWUgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSB0ZW1wbGF0ZSlcbiAgICAgICAgICAgIGlmIChwYXRjaEZsYWcgJiAxNiAvKiBQYXRjaEZsYWdzLkZVTExfUFJPUFMgKi8pIHtcbiAgICAgICAgICAgICAgICAvLyBlbGVtZW50IHByb3BzIGNvbnRhaW4gZHluYW1pYyBrZXlzLCBmdWxsIGRpZmYgbmVlZGVkXG4gICAgICAgICAgICAgICAgcGF0Y2hQcm9wcyhlbCwgbjIsIG9sZFByb3BzLCBuZXdQcm9wcywgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2xhc3NcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGZsYWcgaXMgbWF0Y2hlZCB3aGVuIHRoZSBlbGVtZW50IGhhcyBkeW5hbWljIGNsYXNzIGJpbmRpbmdzLlxuICAgICAgICAgICAgICAgIGlmIChwYXRjaEZsYWcgJiAyIC8qIFBhdGNoRmxhZ3MuQ0xBU1MgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFByb3BzLmNsYXNzICE9PSBuZXdQcm9wcy5jbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaG9zdFBhdGNoUHJvcChlbCwgJ2NsYXNzJywgbnVsbCwgbmV3UHJvcHMuY2xhc3MsIGlzU1ZHKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBzdHlsZVxuICAgICAgICAgICAgICAgIC8vIHRoaXMgZmxhZyBpcyBtYXRjaGVkIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGR5bmFtaWMgc3R5bGUgYmluZGluZ3NcbiAgICAgICAgICAgICAgICBpZiAocGF0Y2hGbGFnICYgNCAvKiBQYXRjaEZsYWdzLlNUWUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RQYXRjaFByb3AoZWwsICdzdHlsZScsIG9sZFByb3BzLnN0eWxlLCBuZXdQcm9wcy5zdHlsZSwgaXNTVkcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBwcm9wc1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgZmxhZyBpcyBtYXRjaGVkIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGR5bmFtaWMgcHJvcC9hdHRyIGJpbmRpbmdzXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIgdGhhbiBjbGFzcyBhbmQgc3R5bGUuIFRoZSBrZXlzIG9mIGR5bmFtaWMgcHJvcC9hdHRycyBhcmUgc2F2ZWQgZm9yXG4gICAgICAgICAgICAgICAgLy8gZmFzdGVyIGl0ZXJhdGlvbi5cbiAgICAgICAgICAgICAgICAvLyBOb3RlIGR5bmFtaWMga2V5cyBsaWtlIDpbZm9vXT1cImJhclwiIHdpbGwgY2F1c2UgdGhpcyBvcHRpbWl6YXRpb24gdG9cbiAgICAgICAgICAgICAgICAvLyBiYWlsIG91dCBhbmQgZ28gdGhyb3VnaCBhIGZ1bGwgZGlmZiBiZWNhdXNlIHdlIG5lZWQgdG8gdW5zZXQgdGhlIG9sZCBrZXlcbiAgICAgICAgICAgICAgICBpZiAocGF0Y2hGbGFnICYgOCAvKiBQYXRjaEZsYWdzLlBST1BTICovKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBmbGFnIGlzIHByZXNlbnQgdGhlbiBkeW5hbWljUHJvcHMgbXVzdCBiZSBub24tbnVsbFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wc1RvVXBkYXRlID0gbjIuZHluYW1pY1Byb3BzO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzVG9VcGRhdGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHByb3BzVG9VcGRhdGVbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gb2xkUHJvcHNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBuZXdQcm9wc1trZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIzE0NzEgZm9yY2UgcGF0Y2ggdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSBwcmV2IHx8IGtleSA9PT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIGtleSwgcHJldiwgbmV4dCwgaXNTVkcsIG4xLmNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB1bm1vdW50Q2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGV4dFxuICAgICAgICAgICAgLy8gVGhpcyBmbGFnIGlzIG1hdGNoZWQgd2hlbiB0aGUgZWxlbWVudCBoYXMgb25seSBkeW5hbWljIHRleHQgY2hpbGRyZW4uXG4gICAgICAgICAgICBpZiAocGF0Y2hGbGFnICYgMSAvKiBQYXRjaEZsYWdzLlRFWFQgKi8pIHtcbiAgICAgICAgICAgICAgICBpZiAobjEuY2hpbGRyZW4gIT09IG4yLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChlbCwgbjIuY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghb3B0aW1pemVkICYmIGR5bmFtaWNDaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyB1bm9wdGltaXplZCwgZnVsbCBkaWZmXG4gICAgICAgICAgICBwYXRjaFByb3BzKGVsLCBuMiwgb2xkUHJvcHMsIG5ld1Byb3BzLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh2bm9kZUhvb2sgPSBuZXdQcm9wcy5vblZub2RlVXBkYXRlZCkgfHwgZGlycykge1xuICAgICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB2bm9kZUhvb2sgJiYgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCBuMiwgbjEpO1xuICAgICAgICAgICAgICAgIGRpcnMgJiYgaW52b2tlRGlyZWN0aXZlSG9vayhuMiwgbjEsIHBhcmVudENvbXBvbmVudCwgJ3VwZGF0ZWQnKTtcbiAgICAgICAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gVGhlIGZhc3QgcGF0aCBmb3IgYmxvY2tzLlxuICAgIGNvbnN0IHBhdGNoQmxvY2tDaGlsZHJlbiA9IChvbGRDaGlsZHJlbiwgbmV3Q2hpbGRyZW4sIGZhbGxiYWNrQ29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzKSA9PiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFZOb2RlID0gb2xkQ2hpbGRyZW5baV07XG4gICAgICAgICAgICBjb25zdCBuZXdWTm9kZSA9IG5ld0NoaWxkcmVuW2ldO1xuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBjb250YWluZXIgKHBhcmVudCBlbGVtZW50KSBmb3IgdGhlIHBhdGNoLlxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gXG4gICAgICAgICAgICAvLyBvbGRWTm9kZSBtYXkgYmUgYW4gZXJyb3JlZCBhc3luYyBzZXR1cCgpIGNvbXBvbmVudCBpbnNpZGUgU3VzcGVuc2VcbiAgICAgICAgICAgIC8vIHdoaWNoIHdpbGwgbm90IGhhdmUgYSBtb3VudGVkIGVsZW1lbnRcbiAgICAgICAgICAgIG9sZFZOb2RlLmVsICYmXG4gICAgICAgICAgICAgICAgLy8gLSBJbiB0aGUgY2FzZSBvZiBhIEZyYWdtZW50LCB3ZSBuZWVkIHRvIHByb3ZpZGUgdGhlIGFjdHVhbCBwYXJlbnRcbiAgICAgICAgICAgICAgICAvLyBvZiB0aGUgRnJhZ21lbnQgaXRzZWxmIHNvIGl0IGNhbiBtb3ZlIGl0cyBjaGlsZHJlbi5cbiAgICAgICAgICAgICAgICAob2xkVk5vZGUudHlwZSA9PT0gRnJhZ21lbnQgfHxcbiAgICAgICAgICAgICAgICAgICAgLy8gLSBJbiB0aGUgY2FzZSBvZiBkaWZmZXJlbnQgbm9kZXMsIHRoZXJlIGlzIGdvaW5nIHRvIGJlIGEgcmVwbGFjZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggYWxzbyByZXF1aXJlcyB0aGUgY29ycmVjdCBwYXJlbnQgY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICFpc1NhbWVWTm9kZVR5cGUob2xkVk5vZGUsIG5ld1ZOb2RlKSB8fFxuICAgICAgICAgICAgICAgICAgICAvLyAtIEluIHRoZSBjYXNlIG9mIGEgY29tcG9uZW50LCBpdCBjb3VsZCBjb250YWluIGFueXRoaW5nLlxuICAgICAgICAgICAgICAgICAgICBvbGRWTm9kZS5zaGFwZUZsYWcgJiAoNiAvKiBTaGFwZUZsYWdzLkNPTVBPTkVOVCAqLyB8IDY0IC8qIFNoYXBlRmxhZ3MuVEVMRVBPUlQgKi8pKVxuICAgICAgICAgICAgICAgID8gaG9zdFBhcmVudE5vZGUob2xkVk5vZGUuZWwpXG4gICAgICAgICAgICAgICAgOiAvLyBJbiBvdGhlciBjYXNlcywgdGhlIHBhcmVudCBjb250YWluZXIgaXMgbm90IGFjdHVhbGx5IHVzZWQgc28gd2VcbiAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBwYXNzIHRoZSBibG9jayBlbGVtZW50IGhlcmUgdG8gYXZvaWQgYSBET00gcGFyZW50Tm9kZSBjYWxsLlxuICAgICAgICAgICAgICAgICAgICBmYWxsYmFja0NvbnRhaW5lcjtcbiAgICAgICAgICAgIHBhdGNoKG9sZFZOb2RlLCBuZXdWTm9kZSwgY29udGFpbmVyLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgcGF0Y2hQcm9wcyA9IChlbCwgdm5vZGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcpID0+IHtcbiAgICAgICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcykge1xuICAgICAgICAgICAgaWYgKG9sZFByb3BzICE9PSBFTVBUWV9PQkopIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvbGRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUmVzZXJ2ZWRQcm9wKGtleSkgJiYgIShrZXkgaW4gbmV3UHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBrZXksIG9sZFByb3BzW2tleV0sIG51bGwsIGlzU1ZHLCB2bm9kZS5jaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdW5tb3VudENoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG5ld1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgLy8gZW1wdHkgc3RyaW5nIGlzIG5vdCB2YWxpZCBwcm9wXG4gICAgICAgICAgICAgICAgaWYgKGlzUmVzZXJ2ZWRQcm9wKGtleSkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBuZXdQcm9wc1trZXldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBvbGRQcm9wc1trZXldO1xuICAgICAgICAgICAgICAgIC8vIGRlZmVyIHBhdGNoaW5nIHZhbHVlXG4gICAgICAgICAgICAgICAgaWYgKG5leHQgIT09IHByZXYgJiYga2V5ICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIGtleSwgcHJldiwgbmV4dCwgaXNTVkcsIHZub2RlLmNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB1bm1vdW50Q2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgndmFsdWUnIGluIG5ld1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgaG9zdFBhdGNoUHJvcChlbCwgJ3ZhbHVlJywgb2xkUHJvcHMudmFsdWUsIG5ld1Byb3BzLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgcHJvY2Vzc0ZyYWdtZW50ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgICAgICBjb25zdCBmcmFnbWVudFN0YXJ0QW5jaG9yID0gKG4yLmVsID0gbjEgPyBuMS5lbCA6IGhvc3RDcmVhdGVUZXh0KCcnKSk7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50RW5kQW5jaG9yID0gKG4yLmFuY2hvciA9IG4xID8gbjEuYW5jaG9yIDogaG9zdENyZWF0ZVRleHQoJycpKTtcbiAgICAgICAgbGV0IHsgcGF0Y2hGbGFnLCBkeW5hbWljQ2hpbGRyZW4sIHNsb3RTY29wZUlkczogZnJhZ21lbnRTbG90U2NvcGVJZHMgfSA9IG4yO1xuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmXG4gICAgICAgICAgICAvLyAjNTUyMyBkZXYgcm9vdCBmcmFnbWVudCBtYXkgaW5oZXJpdCBkaXJlY3RpdmVzXG4gICAgICAgICAgICAoaXNIbXJVcGRhdGluZyB8fCBwYXRjaEZsYWcgJiAyMDQ4IC8qIFBhdGNoRmxhZ3MuREVWX1JPT1RfRlJBR01FTlQgKi8pKSB7XG4gICAgICAgICAgICAvLyBITVIgdXBkYXRlZCAvIERldiByb290IGZyYWdtZW50ICh3LyBjb21tZW50cyksIGZvcmNlIGZ1bGwgZGlmZlxuICAgICAgICAgICAgcGF0Y2hGbGFnID0gMDtcbiAgICAgICAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgICAgICAgZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIGEgc2xvdCBmcmFnbWVudCB3aXRoIDpzbG90dGVkIHNjb3BlIGlkc1xuICAgICAgICBpZiAoZnJhZ21lbnRTbG90U2NvcGVJZHMpIHtcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyA9IHNsb3RTY29wZUlkc1xuICAgICAgICAgICAgICAgID8gc2xvdFNjb3BlSWRzLmNvbmNhdChmcmFnbWVudFNsb3RTY29wZUlkcylcbiAgICAgICAgICAgICAgICA6IGZyYWdtZW50U2xvdFNjb3BlSWRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICAgICAgICBob3N0SW5zZXJ0KGZyYWdtZW50U3RhcnRBbmNob3IsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgICAgIGhvc3RJbnNlcnQoZnJhZ21lbnRFbmRBbmNob3IsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgICAgIC8vIGEgZnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBhcnJheSBjaGlsZHJlblxuICAgICAgICAgICAgLy8gc2luY2UgdGhleSBhcmUgZWl0aGVyIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIsIG9yIGltcGxpY2l0bHkgY3JlYXRlZFxuICAgICAgICAgICAgLy8gZnJvbSBhcnJheXMuXG4gICAgICAgICAgICBtb3VudENoaWxkcmVuKG4yLmNoaWxkcmVuLCBjb250YWluZXIsIGZyYWdtZW50RW5kQW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBhdGNoRmxhZyA+IDAgJiZcbiAgICAgICAgICAgICAgICBwYXRjaEZsYWcgJiA2NCAvKiBQYXRjaEZsYWdzLlNUQUJMRV9GUkFHTUVOVCAqLyAmJlxuICAgICAgICAgICAgICAgIGR5bmFtaWNDaGlsZHJlbiAmJlxuICAgICAgICAgICAgICAgIC8vICMyNzE1IHRoZSBwcmV2aW91cyBmcmFnbWVudCBjb3VsZCd2ZSBiZWVuIGEgQkFJTGVkIG9uZSBhcyBhIHJlc3VsdFxuICAgICAgICAgICAgICAgIC8vIG9mIHJlbmRlclNsb3QoKSB3aXRoIG5vIHZhbGlkIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgbjEuZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgLy8gYSBzdGFibGUgZnJhZ21lbnQgKHRlbXBsYXRlIHJvb3Qgb3IgPHRlbXBsYXRlIHYtZm9yPikgZG9lc24ndCBuZWVkIHRvXG4gICAgICAgICAgICAgICAgLy8gcGF0Y2ggY2hpbGRyZW4gb3JkZXIsIGJ1dCBpdCBtYXkgY29udGFpbiBkeW5hbWljQ2hpbGRyZW4uXG4gICAgICAgICAgICAgICAgcGF0Y2hCbG9ja0NoaWxkcmVuKG4xLmR5bmFtaWNDaGlsZHJlbiwgZHluYW1pY0NoaWxkcmVuLCBjb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMpO1xuICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgcGFyZW50Q29tcG9uZW50ICYmIHBhcmVudENvbXBvbmVudC50eXBlLl9faG1ySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAvLyAjMjA4MCBpZiB0aGUgc3RhYmxlIGZyYWdtZW50IGhhcyBhIGtleSwgaXQncyBhIDx0ZW1wbGF0ZSB2LWZvcj4gdGhhdCBtYXlcbiAgICAgICAgICAgICAgICAvLyAgZ2V0IG1vdmVkIGFyb3VuZC4gTWFrZSBzdXJlIGFsbCByb290IGxldmVsIHZub2RlcyBpbmhlcml0IGVsLlxuICAgICAgICAgICAgICAgIC8vICMyMTM0IG9yIGlmIGl0J3MgYSBjb21wb25lbnQgcm9vdCwgaXQgbWF5IGFsc28gZ2V0IG1vdmVkIGFyb3VuZFxuICAgICAgICAgICAgICAgIC8vIGFzIHRoZSBjb21wb25lbnQgaXMgYmVpbmcgbW92ZWQuXG4gICAgICAgICAgICAgICAgbjIua2V5ICE9IG51bGwgfHxcbiAgICAgICAgICAgICAgICAgICAgKHBhcmVudENvbXBvbmVudCAmJiBuMiA9PT0gcGFyZW50Q29tcG9uZW50LnN1YlRyZWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4objEsIG4yLCB0cnVlIC8qIHNoYWxsb3cgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGtleWVkIC8gdW5rZXllZCwgb3IgbWFudWFsIGZyYWdtZW50cy5cbiAgICAgICAgICAgICAgICAvLyBmb3Iga2V5ZWQgJiB1bmtleWVkLCBzaW5jZSB0aGV5IGFyZSBjb21waWxlciBnZW5lcmF0ZWQgZnJvbSB2LWZvcixcbiAgICAgICAgICAgICAgICAvLyBlYWNoIGNoaWxkIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBibG9jayBzbyB0aGUgZnJhZ21lbnQgd2lsbCBuZXZlclxuICAgICAgICAgICAgICAgIC8vIGhhdmUgZHluYW1pY0NoaWxkcmVuLlxuICAgICAgICAgICAgICAgIHBhdGNoQ2hpbGRyZW4objEsIG4yLCBjb250YWluZXIsIGZyYWdtZW50RW5kQW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBwcm9jZXNzQ29tcG9uZW50ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgICAgICBuMi5zbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHM7XG4gICAgICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobjIuc2hhcGVGbGFnICYgNTEyIC8qIFNoYXBlRmxhZ3MuQ09NUE9ORU5UX0tFUFRfQUxJVkUgKi8pIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRDb21wb25lbnQuY3R4LmFjdGl2YXRlKG4yLCBjb250YWluZXIsIGFuY2hvciwgaXNTVkcsIG9wdGltaXplZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb3VudENvbXBvbmVudChuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBvcHRpbWl6ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdXBkYXRlQ29tcG9uZW50KG4xLCBuMiwgb3B0aW1pemVkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgbW91bnRDb21wb25lbnQgPSAoaW5pdGlhbFZOb2RlLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIG9wdGltaXplZCkgPT4ge1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IChpbml0aWFsVk5vZGUuY29tcG9uZW50ID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoaW5pdGlhbFZOb2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlKSk7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgaW5zdGFuY2UudHlwZS5fX2htcklkKSB7XG4gICAgICAgICAgICByZWdpc3RlckhNUihpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgcHVzaFdhcm5pbmdDb250ZXh0KGluaXRpYWxWTm9kZSk7XG4gICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBtb3VudGApO1xuICAgICAgICB9XG4gICAgICAgIC8vIGluamVjdCByZW5kZXJlciBpbnRlcm5hbHMgZm9yIGtlZXBBbGl2ZVxuICAgICAgICBpZiAoaXNLZWVwQWxpdmUoaW5pdGlhbFZOb2RlKSkge1xuICAgICAgICAgICAgaW5zdGFuY2UuY3R4LnJlbmRlcmVyID0gaW50ZXJuYWxzO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlc29sdmUgcHJvcHMgYW5kIHNsb3RzIGZvciBzZXR1cCBjb250ZXh0XG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBpbml0YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXR1cENvbXBvbmVudChpbnN0YW5jZSk7XG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYGluaXRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBzZXR1cCgpIGlzIGFzeW5jLiBUaGlzIGNvbXBvbmVudCByZWxpZXMgb24gYXN5bmMgbG9naWMgdG8gYmUgcmVzb2x2ZWRcbiAgICAgICAgLy8gYmVmb3JlIHByb2NlZWRpbmdcbiAgICAgICAgaWYgKGluc3RhbmNlLmFzeW5jRGVwKSB7XG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSAmJiBwYXJlbnRTdXNwZW5zZS5yZWdpc3RlckRlcChpbnN0YW5jZSwgc2V0dXBSZW5kZXJFZmZlY3QpO1xuICAgICAgICAgICAgLy8gR2l2ZSBpdCBhIHBsYWNlaG9sZGVyIGlmIHRoaXMgaXMgbm90IGh5ZHJhdGlvblxuICAgICAgICAgICAgLy8gVE9ETyBoYW5kbGUgc2VsZi1kZWZpbmVkIGZhbGxiYWNrXG4gICAgICAgICAgICBpZiAoIWluaXRpYWxWTm9kZS5lbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gKGluc3RhbmNlLnN1YlRyZWUgPSBjcmVhdGVWTm9kZShDb21tZW50KSk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1lbnROb2RlKG51bGwsIHBsYWNlaG9sZGVyLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0dXBSZW5kZXJFZmZlY3QoaW5zdGFuY2UsIGluaXRpYWxWTm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgb3B0aW1pemVkKTtcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBtb3VudGApO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCB1cGRhdGVDb21wb25lbnQgPSAobjEsIG4yLCBvcHRpbWl6ZWQpID0+IHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSAobjIuY29tcG9uZW50ID0gbjEuY29tcG9uZW50KTtcbiAgICAgICAgaWYgKHNob3VsZFVwZGF0ZUNvbXBvbmVudChuMSwgbjIsIG9wdGltaXplZCkpIHtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZS5hc3luY0RlcCAmJlxuICAgICAgICAgICAgICAgICFpbnN0YW5jZS5hc3luY1Jlc29sdmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gYXN5bmMgJiBzdGlsbCBwZW5kaW5nIC0ganVzdCB1cGRhdGUgcHJvcHMgYW5kIHNsb3RzXG4gICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIGNvbXBvbmVudCdzIHJlYWN0aXZlIGVmZmVjdCBmb3IgcmVuZGVyIGlzbid0IHNldC11cCB5ZXRcbiAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hXYXJuaW5nQ29udGV4dChuMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudFByZVJlbmRlcihpbnN0YW5jZSwgbjIsIG9wdGltaXplZCk7XG4gICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBub3JtYWwgdXBkYXRlXG4gICAgICAgICAgICAgICAgaW5zdGFuY2UubmV4dCA9IG4yO1xuICAgICAgICAgICAgICAgIC8vIGluIGNhc2UgdGhlIGNoaWxkIGNvbXBvbmVudCBpcyBhbHNvIHF1ZXVlZCwgcmVtb3ZlIGl0IHRvIGF2b2lkXG4gICAgICAgICAgICAgICAgLy8gZG91YmxlIHVwZGF0aW5nIHRoZSBzYW1lIGNoaWxkIGNvbXBvbmVudCBpbiB0aGUgc2FtZSBmbHVzaC5cbiAgICAgICAgICAgICAgICBpbnZhbGlkYXRlSm9iKGluc3RhbmNlLnVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgLy8gaW5zdGFuY2UudXBkYXRlIGlzIHRoZSByZWFjdGl2ZSBlZmZlY3QuXG4gICAgICAgICAgICAgICAgaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBubyB1cGRhdGUgbmVlZGVkLiBqdXN0IGNvcHkgb3ZlciBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgICAgICAgaW5zdGFuY2Uudm5vZGUgPSBuMjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgc2V0dXBSZW5kZXJFZmZlY3QgPSAoaW5zdGFuY2UsIGluaXRpYWxWTm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgb3B0aW1pemVkKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFVwZGF0ZUZuID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFpbnN0YW5jZS5pc01vdW50ZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgdm5vZGVIb29rO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZWwsIHByb3BzIH0gPSBpbml0aWFsVk5vZGU7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBibSwgbSwgcGFyZW50IH0gPSBpbnN0YW5jZTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0FzeW5jV3JhcHBlclZOb2RlID0gaXNBc3luY1dyYXBwZXIoaW5pdGlhbFZOb2RlKTtcbiAgICAgICAgICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgLy8gYmVmb3JlTW91bnQgaG9va1xuICAgICAgICAgICAgICAgIGlmIChibSkge1xuICAgICAgICAgICAgICAgICAgICBpbnZva2VBcnJheUZucyhibSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG9uVm5vZGVCZWZvcmVNb3VudFxuICAgICAgICAgICAgICAgIGlmICghaXNBc3luY1dyYXBwZXJWTm9kZSAmJlxuICAgICAgICAgICAgICAgICAgICAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZUJlZm9yZU1vdW50KSkge1xuICAgICAgICAgICAgICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnQsIGluaXRpYWxWTm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChlbCAmJiBoeWRyYXRlTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB2bm9kZSBoYXMgYWRvcHRlZCBob3N0IG5vZGUgLSBwZXJmb3JtIGh5ZHJhdGlvbiBpbnN0ZWFkIG9mIG1vdW50LlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoeWRyYXRlU3ViVHJlZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLnN1YlRyZWUgPSByZW5kZXJDb21wb25lbnRSb290KGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgaHlkcmF0ZWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaHlkcmF0ZU5vZGUoZWwsIGluc3RhbmNlLnN1YlRyZWUsIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYGh5ZHJhdGVgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXN5bmNXcmFwcGVyVk5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxWTm9kZS50eXBlLl9fYXN5bmNMb2FkZXIoKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZTogd2UgYXJlIG1vdmluZyB0aGUgcmVuZGVyIGNhbGwgaW50byBhbiBhc3luYyBjYWxsYmFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIG1lYW5zIGl0IHdvbid0IHRyYWNrIGRlcGVuZGVuY2llcyAtIGJ1dCBpdCdzIG9rIGJlY2F1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgc2VydmVyLXJlbmRlcmVkIGFzeW5jIHdyYXBwZXIgaXMgYWxyZWFkeSBpbiByZXNvbHZlZCBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGl0IHdpbGwgbmV2ZXIgbmVlZCB0byBjaGFuZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiAhaW5zdGFuY2UuaXNVbm1vdW50ZWQgJiYgaHlkcmF0ZVN1YlRyZWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoeWRyYXRlU3ViVHJlZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJUcmVlID0gKGluc3RhbmNlLnN1YlRyZWUgPSByZW5kZXJDb21wb25lbnRSb290KGluc3RhbmNlKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBwYXRjaGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBhdGNoKG51bGwsIHN1YlRyZWUsIGNvbnRhaW5lciwgYW5jaG9yLCBpbnN0YW5jZSwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZOb2RlLmVsID0gc3ViVHJlZS5lbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gbW91bnRlZCBob29rXG4gICAgICAgICAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KG0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gb25Wbm9kZU1vdW50ZWRcbiAgICAgICAgICAgICAgICBpZiAoIWlzQXN5bmNXcmFwcGVyVk5vZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgKHZub2RlSG9vayA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVNb3VudGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRJbml0aWFsVk5vZGUgPSBpbml0aWFsVk5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnQsIHNjb3BlZEluaXRpYWxWTm9kZSksIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gYWN0aXZhdGVkIGhvb2sgZm9yIGtlZXAtYWxpdmUgcm9vdHMuXG4gICAgICAgICAgICAgICAgLy8gIzE3NDIgYWN0aXZhdGVkIGhvb2sgbXVzdCBiZSBhY2Nlc3NlZCBhZnRlciBmaXJzdCByZW5kZXJcbiAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgaG9vayBtYXkgYmUgaW5qZWN0ZWQgYnkgYSBjaGlsZCBrZWVwLWFsaXZlXG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWxWTm9kZS5zaGFwZUZsYWcgJiAyNTYgLyogU2hhcGVGbGFncy5DT01QT05FTlRfU0hPVUxEX0tFRVBfQUxJVkUgKi8gfHxcbiAgICAgICAgICAgICAgICAgICAgKHBhcmVudCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNBc3luY1dyYXBwZXIocGFyZW50LnZub2RlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LnZub2RlLnNoYXBlRmxhZyAmIDI1NiAvKiBTaGFwZUZsYWdzLkNPTVBPTkVOVF9TSE9VTERfS0VFUF9BTElWRSAqLykpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuYSAmJiBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoaW5zdGFuY2UuYSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnN0YW5jZS5pc01vdW50ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgICAgICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAjMjQ1ODogZGVmZXJlbmNlIG1vdW50LW9ubHkgb2JqZWN0IHBhcmFtZXRlcnMgdG8gcHJldmVudCBtZW1sZWFrc1xuICAgICAgICAgICAgICAgIGluaXRpYWxWTm9kZSA9IGNvbnRhaW5lciA9IGFuY2hvciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGVDb21wb25lbnRcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRyaWdnZXJlZCBieSBtdXRhdGlvbiBvZiBjb21wb25lbnQncyBvd24gc3RhdGUgKG5leHQ6IG51bGwpXG4gICAgICAgICAgICAgICAgLy8gT1IgcGFyZW50IGNhbGxpbmcgcHJvY2Vzc0NvbXBvbmVudCAobmV4dDogVk5vZGUpXG4gICAgICAgICAgICAgICAgbGV0IHsgbmV4dCwgYnUsIHUsIHBhcmVudCwgdm5vZGUgfSA9IGluc3RhbmNlO1xuICAgICAgICAgICAgICAgIGxldCBvcmlnaW5OZXh0ID0gbmV4dDtcbiAgICAgICAgICAgICAgICBsZXQgdm5vZGVIb29rO1xuICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaFdhcm5pbmdDb250ZXh0KG5leHQgfHwgaW5zdGFuY2Uudm5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBEaXNhbGxvdyBjb21wb25lbnQgZWZmZWN0IHJlY3Vyc2lvbiBkdXJpbmcgcHJlLWxpZmVjeWNsZSBob29rcy5cbiAgICAgICAgICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5lbCA9IHZub2RlLmVsO1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb21wb25lbnRQcmVSZW5kZXIoaW5zdGFuY2UsIG5leHQsIG9wdGltaXplZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gdm5vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGJlZm9yZVVwZGF0ZSBob29rXG4gICAgICAgICAgICAgICAgaWYgKGJ1KSB7XG4gICAgICAgICAgICAgICAgICAgIGludm9rZUFycmF5Rm5zKGJ1KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gb25Wbm9kZUJlZm9yZVVwZGF0ZVxuICAgICAgICAgICAgICAgIGlmICgodm5vZGVIb29rID0gbmV4dC5wcm9wcyAmJiBuZXh0LnByb3BzLm9uVm5vZGVCZWZvcmVVcGRhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgbmV4dCwgdm5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAvLyByZW5kZXJcbiAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0VHJlZSA9IHJlbmRlckNvbXBvbmVudFJvb3QoaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2VHJlZSA9IGluc3RhbmNlLnN1YlRyZWU7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2Uuc3ViVHJlZSA9IG5leHRUcmVlO1xuICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgcGF0Y2hgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGF0Y2gocHJldlRyZWUsIG5leHRUcmVlLCBcbiAgICAgICAgICAgICAgICAvLyBwYXJlbnQgbWF5IGhhdmUgY2hhbmdlZCBpZiBpdCdzIGluIGEgdGVsZXBvcnRcbiAgICAgICAgICAgICAgICBob3N0UGFyZW50Tm9kZShwcmV2VHJlZS5lbCksIFxuICAgICAgICAgICAgICAgIC8vIGFuY2hvciBtYXkgaGF2ZSBjaGFuZ2VkIGlmIGl0J3MgaW4gYSBmcmFnbWVudFxuICAgICAgICAgICAgICAgIGdldE5leHRIb3N0Tm9kZShwcmV2VHJlZSksIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcpO1xuICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5leHQuZWwgPSBuZXh0VHJlZS5lbDtcbiAgICAgICAgICAgICAgICBpZiAob3JpZ2luTmV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZWxmLXRyaWdnZXJlZCB1cGRhdGUuIEluIGNhc2Ugb2YgSE9DLCB1cGRhdGUgcGFyZW50IGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAvLyB2bm9kZSBlbC4gSE9DIGlzIGluZGljYXRlZCBieSBwYXJlbnQgaW5zdGFuY2UncyBzdWJUcmVlIHBvaW50aW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIGNoaWxkIGNvbXBvbmVudCdzIHZub2RlXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUhPQ0hvc3RFbChpbnN0YW5jZSwgbmV4dFRyZWUuZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB1cGRhdGVkIGhvb2tcbiAgICAgICAgICAgICAgICBpZiAodSkge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QodSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBvblZub2RlVXBkYXRlZFxuICAgICAgICAgICAgICAgIGlmICgodm5vZGVIb29rID0gbmV4dC5wcm9wcyAmJiBuZXh0LnByb3BzLm9uVm5vZGVVcGRhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4gaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50LCBuZXh0LCB2bm9kZSksIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgICAgICAgICAgICAgZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkKGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gY3JlYXRlIHJlYWN0aXZlIGVmZmVjdCBmb3IgcmVuZGVyaW5nXG4gICAgICAgIGNvbnN0IGVmZmVjdCA9IChpbnN0YW5jZS5lZmZlY3QgPSBuZXcgUmVhY3RpdmVFZmZlY3QoY29tcG9uZW50VXBkYXRlRm4sICgpID0+IHF1ZXVlSm9iKHVwZGF0ZSksIGluc3RhbmNlLnNjb3BlIC8vIHRyYWNrIGl0IGluIGNvbXBvbmVudCdzIGVmZmVjdCBzY29wZVxuICAgICAgICApKTtcbiAgICAgICAgY29uc3QgdXBkYXRlID0gKGluc3RhbmNlLnVwZGF0ZSA9ICgpID0+IGVmZmVjdC5ydW4oKSk7XG4gICAgICAgIHVwZGF0ZS5pZCA9IGluc3RhbmNlLnVpZDtcbiAgICAgICAgLy8gYWxsb3dSZWN1cnNlXG4gICAgICAgIC8vICMxODAxLCAjMjA0MyBjb21wb25lbnQgcmVuZGVyIGVmZmVjdHMgc2hvdWxkIGFsbG93IHJlY3Vyc2l2ZSB1cGRhdGVzXG4gICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIHRydWUpO1xuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICBlZmZlY3Qub25UcmFjayA9IGluc3RhbmNlLnJ0Y1xuICAgICAgICAgICAgICAgID8gZSA9PiBpbnZva2VBcnJheUZucyhpbnN0YW5jZS5ydGMsIGUpXG4gICAgICAgICAgICAgICAgOiB2b2lkIDA7XG4gICAgICAgICAgICBlZmZlY3Qub25UcmlnZ2VyID0gaW5zdGFuY2UucnRnXG4gICAgICAgICAgICAgICAgPyBlID0+IGludm9rZUFycmF5Rm5zKGluc3RhbmNlLnJ0ZywgZSlcbiAgICAgICAgICAgICAgICA6IHZvaWQgMDtcbiAgICAgICAgICAgIHVwZGF0ZS5vd25lckluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKCk7XG4gICAgfTtcbiAgICBjb25zdCB1cGRhdGVDb21wb25lbnRQcmVSZW5kZXIgPSAoaW5zdGFuY2UsIG5leHRWTm9kZSwgb3B0aW1pemVkKSA9PiB7XG4gICAgICAgIG5leHRWTm9kZS5jb21wb25lbnQgPSBpbnN0YW5jZTtcbiAgICAgICAgY29uc3QgcHJldlByb3BzID0gaW5zdGFuY2Uudm5vZGUucHJvcHM7XG4gICAgICAgIGluc3RhbmNlLnZub2RlID0gbmV4dFZOb2RlO1xuICAgICAgICBpbnN0YW5jZS5uZXh0ID0gbnVsbDtcbiAgICAgICAgdXBkYXRlUHJvcHMoaW5zdGFuY2UsIG5leHRWTm9kZS5wcm9wcywgcHJldlByb3BzLCBvcHRpbWl6ZWQpO1xuICAgICAgICB1cGRhdGVTbG90cyhpbnN0YW5jZSwgbmV4dFZOb2RlLmNoaWxkcmVuLCBvcHRpbWl6ZWQpO1xuICAgICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICAgIC8vIHByb3BzIHVwZGF0ZSBtYXkgaGF2ZSB0cmlnZ2VyZWQgcHJlLWZsdXNoIHdhdGNoZXJzLlxuICAgICAgICAvLyBmbHVzaCB0aGVtIGJlZm9yZSB0aGUgcmVuZGVyIHVwZGF0ZS5cbiAgICAgICAgZmx1c2hQcmVGbHVzaENicygpO1xuICAgICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgfTtcbiAgICBjb25zdCBwYXRjaENoaWxkcmVuID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCA9IGZhbHNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGMxID0gbjEgJiYgbjEuY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IHByZXZTaGFwZUZsYWcgPSBuMSA/IG4xLnNoYXBlRmxhZyA6IDA7XG4gICAgICAgIGNvbnN0IGMyID0gbjIuY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IHsgcGF0Y2hGbGFnLCBzaGFwZUZsYWcgfSA9IG4yO1xuICAgICAgICAvLyBmYXN0IHBhdGhcbiAgICAgICAgaWYgKHBhdGNoRmxhZyA+IDApIHtcbiAgICAgICAgICAgIGlmIChwYXRjaEZsYWcgJiAxMjggLyogUGF0Y2hGbGFncy5LRVlFRF9GUkFHTUVOVCAqLykge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY291bGQgYmUgZWl0aGVyIGZ1bGx5LWtleWVkIG9yIG1peGVkIChzb21lIGtleWVkIHNvbWUgbm90KVxuICAgICAgICAgICAgICAgIC8vIHByZXNlbmNlIG9mIHBhdGNoRmxhZyBtZWFucyBjaGlsZHJlbiBhcmUgZ3VhcmFudGVlZCB0byBiZSBhcnJheXNcbiAgICAgICAgICAgICAgICBwYXRjaEtleWVkQ2hpbGRyZW4oYzEsIGMyLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYXRjaEZsYWcgJiAyNTYgLyogUGF0Y2hGbGFncy5VTktFWUVEX0ZSQUdNRU5UICovKSB7XG4gICAgICAgICAgICAgICAgLy8gdW5rZXllZFxuICAgICAgICAgICAgICAgIHBhdGNoVW5rZXllZENoaWxkcmVuKGMxLCBjMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNoaWxkcmVuIGhhcyAzIHBvc3NpYmlsaXRpZXM6IHRleHQsIGFycmF5IG9yIG5vIGNoaWxkcmVuLlxuICAgICAgICBpZiAoc2hhcGVGbGFnICYgOCAvKiBTaGFwZUZsYWdzLlRFWFRfQ0hJTERSRU4gKi8pIHtcbiAgICAgICAgICAgIC8vIHRleHQgY2hpbGRyZW4gZmFzdCBwYXRoXG4gICAgICAgICAgICBpZiAocHJldlNoYXBlRmxhZyAmIDE2IC8qIFNoYXBlRmxhZ3MuQVJSQVlfQ0hJTERSRU4gKi8pIHtcbiAgICAgICAgICAgICAgICB1bm1vdW50Q2hpbGRyZW4oYzEsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMyICE9PSBjMSkge1xuICAgICAgICAgICAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChjb250YWluZXIsIGMyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwcmV2U2hhcGVGbGFnICYgMTYgLyogU2hhcGVGbGFncy5BUlJBWV9DSElMRFJFTiAqLykge1xuICAgICAgICAgICAgICAgIC8vIHByZXYgY2hpbGRyZW4gd2FzIGFycmF5XG4gICAgICAgICAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2IC8qIFNoYXBlRmxhZ3MuQVJSQVlfQ0hJTERSRU4gKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdHdvIGFycmF5cywgY2Fubm90IGFzc3VtZSBhbnl0aGluZywgZG8gZnVsbCBkaWZmXG4gICAgICAgICAgICAgICAgICAgIHBhdGNoS2V5ZWRDaGlsZHJlbihjMSwgYzIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm8gbmV3IGNoaWxkcmVuLCBqdXN0IHVubW91bnQgb2xkXG4gICAgICAgICAgICAgICAgICAgIHVubW91bnRDaGlsZHJlbihjMSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldiBjaGlsZHJlbiB3YXMgdGV4dCBPUiBudWxsXG4gICAgICAgICAgICAgICAgLy8gbmV3IGNoaWxkcmVuIGlzIGFycmF5IE9SIG51bGxcbiAgICAgICAgICAgICAgICBpZiAocHJldlNoYXBlRmxhZyAmIDggLyogU2hhcGVGbGFncy5URVhUX0NISUxEUkVOICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChjb250YWluZXIsICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gbW91bnQgbmV3IGlmIGFycmF5XG4gICAgICAgICAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2IC8qIFNoYXBlRmxhZ3MuQVJSQVlfQ0hJTERSRU4gKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgbW91bnRDaGlsZHJlbihjMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBwYXRjaFVua2V5ZWRDaGlsZHJlbiA9IChjMSwgYzIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICAgICAgYzEgPSBjMSB8fCBFTVBUWV9BUlI7XG4gICAgICAgIGMyID0gYzIgfHwgRU1QVFlfQVJSO1xuICAgICAgICBjb25zdCBvbGRMZW5ndGggPSBjMS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG5ld0xlbmd0aCA9IGMyLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY29tbW9uTGVuZ3RoID0gTWF0aC5taW4ob2xkTGVuZ3RoLCBuZXdMZW5ndGgpO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbW1vbkxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0Q2hpbGQgPSAoYzJbaV0gPSBvcHRpbWl6ZWRcbiAgICAgICAgICAgICAgICA/IGNsb25lSWZNb3VudGVkKGMyW2ldKVxuICAgICAgICAgICAgICAgIDogbm9ybWFsaXplVk5vZGUoYzJbaV0pKTtcbiAgICAgICAgICAgIHBhdGNoKGMxW2ldLCBuZXh0Q2hpbGQsIGNvbnRhaW5lciwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2xkTGVuZ3RoID4gbmV3TGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgb2xkXG4gICAgICAgICAgICB1bm1vdW50Q2hpbGRyZW4oYzEsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUsIGZhbHNlLCBjb21tb25MZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gbW91bnQgbmV3XG4gICAgICAgICAgICBtb3VudENoaWxkcmVuKGMyLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCBjb21tb25MZW5ndGgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBjYW4gYmUgYWxsLWtleWVkIG9yIG1peGVkXG4gICAgY29uc3QgcGF0Y2hLZXllZENoaWxkcmVuID0gKGMxLCBjMiwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGNvbnN0IGwyID0gYzIubGVuZ3RoO1xuICAgICAgICBsZXQgZTEgPSBjMS5sZW5ndGggLSAxOyAvLyBwcmV2IGVuZGluZyBpbmRleFxuICAgICAgICBsZXQgZTIgPSBsMiAtIDE7IC8vIG5leHQgZW5kaW5nIGluZGV4XG4gICAgICAgIC8vIDEuIHN5bmMgZnJvbSBzdGFydFxuICAgICAgICAvLyAoYSBiKSBjXG4gICAgICAgIC8vIChhIGIpIGQgZVxuICAgICAgICB3aGlsZSAoaSA8PSBlMSAmJiBpIDw9IGUyKSB7XG4gICAgICAgICAgICBjb25zdCBuMSA9IGMxW2ldO1xuICAgICAgICAgICAgY29uc3QgbjIgPSAoYzJbaV0gPSBvcHRpbWl6ZWRcbiAgICAgICAgICAgICAgICA/IGNsb25lSWZNb3VudGVkKGMyW2ldKVxuICAgICAgICAgICAgICAgIDogbm9ybWFsaXplVk5vZGUoYzJbaV0pKTtcbiAgICAgICAgICAgIGlmIChpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoKG4xLCBuMiwgY29udGFpbmVyLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMi4gc3luYyBmcm9tIGVuZFxuICAgICAgICAvLyBhIChiIGMpXG4gICAgICAgIC8vIGQgZSAoYiBjKVxuICAgICAgICB3aGlsZSAoaSA8PSBlMSAmJiBpIDw9IGUyKSB7XG4gICAgICAgICAgICBjb25zdCBuMSA9IGMxW2UxXTtcbiAgICAgICAgICAgIGNvbnN0IG4yID0gKGMyW2UyXSA9IG9wdGltaXplZFxuICAgICAgICAgICAgICAgID8gY2xvbmVJZk1vdW50ZWQoYzJbZTJdKVxuICAgICAgICAgICAgICAgIDogbm9ybWFsaXplVk5vZGUoYzJbZTJdKSk7XG4gICAgICAgICAgICBpZiAoaXNTYW1lVk5vZGVUeXBlKG4xLCBuMikpIHtcbiAgICAgICAgICAgICAgICBwYXRjaChuMSwgbjIsIGNvbnRhaW5lciwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZTEtLTtcbiAgICAgICAgICAgIGUyLS07XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4gY29tbW9uIHNlcXVlbmNlICsgbW91bnRcbiAgICAgICAgLy8gKGEgYilcbiAgICAgICAgLy8gKGEgYikgY1xuICAgICAgICAvLyBpID0gMiwgZTEgPSAxLCBlMiA9IDJcbiAgICAgICAgLy8gKGEgYilcbiAgICAgICAgLy8gYyAoYSBiKVxuICAgICAgICAvLyBpID0gMCwgZTEgPSAtMSwgZTIgPSAwXG4gICAgICAgIGlmIChpID4gZTEpIHtcbiAgICAgICAgICAgIGlmIChpIDw9IGUyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFBvcyA9IGUyICsgMTtcbiAgICAgICAgICAgICAgICBjb25zdCBhbmNob3IgPSBuZXh0UG9zIDwgbDIgPyBjMltuZXh0UG9zXS5lbCA6IHBhcmVudEFuY2hvcjtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaSA8PSBlMikge1xuICAgICAgICAgICAgICAgICAgICBwYXRjaChudWxsLCAoYzJbaV0gPSBvcHRpbWl6ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gY2xvbmVJZk1vdW50ZWQoYzJbaV0pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5vcm1hbGl6ZVZOb2RlKGMyW2ldKSksIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDQuIGNvbW1vbiBzZXF1ZW5jZSArIHVubW91bnRcbiAgICAgICAgLy8gKGEgYikgY1xuICAgICAgICAvLyAoYSBiKVxuICAgICAgICAvLyBpID0gMiwgZTEgPSAyLCBlMiA9IDFcbiAgICAgICAgLy8gYSAoYiBjKVxuICAgICAgICAvLyAoYiBjKVxuICAgICAgICAvLyBpID0gMCwgZTEgPSAwLCBlMiA9IC0xXG4gICAgICAgIGVsc2UgaWYgKGkgPiBlMikge1xuICAgICAgICAgICAgd2hpbGUgKGkgPD0gZTEpIHtcbiAgICAgICAgICAgICAgICB1bm1vdW50KGMxW2ldLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gNS4gdW5rbm93biBzZXF1ZW5jZVxuICAgICAgICAvLyBbaSAuLi4gZTEgKyAxXTogYSBiIFtjIGQgZV0gZiBnXG4gICAgICAgIC8vIFtpIC4uLiBlMiArIDFdOiBhIGIgW2UgZCBjIGhdIGYgZ1xuICAgICAgICAvLyBpID0gMiwgZTEgPSA0LCBlMiA9IDVcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzMSA9IGk7IC8vIHByZXYgc3RhcnRpbmcgaW5kZXhcbiAgICAgICAgICAgIGNvbnN0IHMyID0gaTsgLy8gbmV4dCBzdGFydGluZyBpbmRleFxuICAgICAgICAgICAgLy8gNS4xIGJ1aWxkIGtleTppbmRleCBtYXAgZm9yIG5ld0NoaWxkcmVuXG4gICAgICAgICAgICBjb25zdCBrZXlUb05ld0luZGV4TWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgZm9yIChpID0gczI7IGkgPD0gZTI7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRDaGlsZCA9IChjMltpXSA9IG9wdGltaXplZFxuICAgICAgICAgICAgICAgICAgICA/IGNsb25lSWZNb3VudGVkKGMyW2ldKVxuICAgICAgICAgICAgICAgICAgICA6IG5vcm1hbGl6ZVZOb2RlKGMyW2ldKSk7XG4gICAgICAgICAgICAgICAgaWYgKG5leHRDaGlsZC5rZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIGtleVRvTmV3SW5kZXhNYXAuaGFzKG5leHRDaGlsZC5rZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXJuKGBEdXBsaWNhdGUga2V5cyBmb3VuZCBkdXJpbmcgdXBkYXRlOmAsIEpTT04uc3RyaW5naWZ5KG5leHRDaGlsZC5rZXkpLCBgTWFrZSBzdXJlIGtleXMgYXJlIHVuaXF1ZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBrZXlUb05ld0luZGV4TWFwLnNldChuZXh0Q2hpbGQua2V5LCBpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyA1LjIgbG9vcCB0aHJvdWdoIG9sZCBjaGlsZHJlbiBsZWZ0IHRvIGJlIHBhdGNoZWQgYW5kIHRyeSB0byBwYXRjaFxuICAgICAgICAgICAgLy8gbWF0Y2hpbmcgbm9kZXMgJiByZW1vdmUgbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIHByZXNlbnRcbiAgICAgICAgICAgIGxldCBqO1xuICAgICAgICAgICAgbGV0IHBhdGNoZWQgPSAwO1xuICAgICAgICAgICAgY29uc3QgdG9CZVBhdGNoZWQgPSBlMiAtIHMyICsgMTtcbiAgICAgICAgICAgIGxldCBtb3ZlZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gdXNlZCB0byB0cmFjayB3aGV0aGVyIGFueSBub2RlIGhhcyBtb3ZlZFxuICAgICAgICAgICAgbGV0IG1heE5ld0luZGV4U29GYXIgPSAwO1xuICAgICAgICAgICAgLy8gd29ya3MgYXMgTWFwPG5ld0luZGV4LCBvbGRJbmRleD5cbiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBvbGRJbmRleCBpcyBvZmZzZXQgYnkgKzFcbiAgICAgICAgICAgIC8vIGFuZCBvbGRJbmRleCA9IDAgaXMgYSBzcGVjaWFsIHZhbHVlIGluZGljYXRpbmcgdGhlIG5ldyBub2RlIGhhc1xuICAgICAgICAgICAgLy8gbm8gY29ycmVzcG9uZGluZyBvbGQgbm9kZS5cbiAgICAgICAgICAgIC8vIHVzZWQgZm9yIGRldGVybWluaW5nIGxvbmdlc3Qgc3RhYmxlIHN1YnNlcXVlbmNlXG4gICAgICAgICAgICBjb25zdCBuZXdJbmRleFRvT2xkSW5kZXhNYXAgPSBuZXcgQXJyYXkodG9CZVBhdGNoZWQpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvQmVQYXRjaGVkOyBpKyspXG4gICAgICAgICAgICAgICAgbmV3SW5kZXhUb09sZEluZGV4TWFwW2ldID0gMDtcbiAgICAgICAgICAgIGZvciAoaSA9IHMxOyBpIDw9IGUxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2Q2hpbGQgPSBjMVtpXTtcbiAgICAgICAgICAgICAgICBpZiAocGF0Y2hlZCA+PSB0b0JlUGF0Y2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBhbGwgbmV3IGNoaWxkcmVuIGhhdmUgYmVlbiBwYXRjaGVkIHNvIHRoaXMgY2FuIG9ubHkgYmUgYSByZW1vdmFsXG4gICAgICAgICAgICAgICAgICAgIHVubW91bnQocHJldkNoaWxkLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBuZXdJbmRleDtcbiAgICAgICAgICAgICAgICBpZiAocHJldkNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0luZGV4ID0ga2V5VG9OZXdJbmRleE1hcC5nZXQocHJldkNoaWxkLmtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBrZXktbGVzcyBub2RlLCB0cnkgdG8gbG9jYXRlIGEga2V5LWxlc3Mgbm9kZSBvZiB0aGUgc2FtZSB0eXBlXG4gICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IHMyOyBqIDw9IGUyOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdJbmRleFRvT2xkSW5kZXhNYXBbaiAtIHMyXSA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2FtZVZOb2RlVHlwZShwcmV2Q2hpbGQsIGMyW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0luZGV4ID0gajtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV3SW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB1bm1vdW50KHByZXZDaGlsZCwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXdJbmRleFRvT2xkSW5kZXhNYXBbbmV3SW5kZXggLSBzMl0gPSBpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0luZGV4ID49IG1heE5ld0luZGV4U29GYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heE5ld0luZGV4U29GYXIgPSBuZXdJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXRjaChwcmV2Q2hpbGQsIGMyW25ld0luZGV4XSwgY29udGFpbmVyLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpO1xuICAgICAgICAgICAgICAgICAgICBwYXRjaGVkKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gNS4zIG1vdmUgYW5kIG1vdW50XG4gICAgICAgICAgICAvLyBnZW5lcmF0ZSBsb25nZXN0IHN0YWJsZSBzdWJzZXF1ZW5jZSBvbmx5IHdoZW4gbm9kZXMgaGF2ZSBtb3ZlZFxuICAgICAgICAgICAgY29uc3QgaW5jcmVhc2luZ05ld0luZGV4U2VxdWVuY2UgPSBtb3ZlZFxuICAgICAgICAgICAgICAgID8gZ2V0U2VxdWVuY2UobmV3SW5kZXhUb09sZEluZGV4TWFwKVxuICAgICAgICAgICAgICAgIDogRU1QVFlfQVJSO1xuICAgICAgICAgICAgaiA9IGluY3JlYXNpbmdOZXdJbmRleFNlcXVlbmNlLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAvLyBsb29waW5nIGJhY2t3YXJkcyBzbyB0aGF0IHdlIGNhbiB1c2UgbGFzdCBwYXRjaGVkIG5vZGUgYXMgYW5jaG9yXG4gICAgICAgICAgICBmb3IgKGkgPSB0b0JlUGF0Y2hlZCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gczIgKyBpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRDaGlsZCA9IGMyW25leHRJbmRleF07XG4gICAgICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gbmV4dEluZGV4ICsgMSA8IGwyID8gYzJbbmV4dEluZGV4ICsgMV0uZWwgOiBwYXJlbnRBbmNob3I7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0luZGV4VG9PbGRJbmRleE1hcFtpXSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBtb3VudCBuZXdcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2gobnVsbCwgbmV4dENoaWxkLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobW92ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSBpZjpcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gc3RhYmxlIHN1YnNlcXVlbmNlIChlLmcuIGEgcmV2ZXJzZSlcbiAgICAgICAgICAgICAgICAgICAgLy8gT1IgY3VycmVudCBub2RlIGlzIG5vdCBhbW9uZyB0aGUgc3RhYmxlIHNlcXVlbmNlXG4gICAgICAgICAgICAgICAgICAgIGlmIChqIDwgMCB8fCBpICE9PSBpbmNyZWFzaW5nTmV3SW5kZXhTZXF1ZW5jZVtqXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZShuZXh0Q2hpbGQsIGNvbnRhaW5lciwgYW5jaG9yLCAyIC8qIE1vdmVUeXBlLlJFT1JERVIgKi8pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBtb3ZlID0gKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUsIHBhcmVudFN1c3BlbnNlID0gbnVsbCkgPT4ge1xuICAgICAgICBjb25zdCB7IGVsLCB0eXBlLCB0cmFuc2l0aW9uLCBjaGlsZHJlbiwgc2hhcGVGbGFnIH0gPSB2bm9kZTtcbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDYgLyogU2hhcGVGbGFncy5DT01QT05FTlQgKi8pIHtcbiAgICAgICAgICAgIG1vdmUodm5vZGUuY29tcG9uZW50LnN1YlRyZWUsIGNvbnRhaW5lciwgYW5jaG9yLCBtb3ZlVHlwZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDEyOCAvKiBTaGFwZUZsYWdzLlNVU1BFTlNFICovKSB7XG4gICAgICAgICAgICB2bm9kZS5zdXNwZW5zZS5tb3ZlKGNvbnRhaW5lciwgYW5jaG9yLCBtb3ZlVHlwZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDY0IC8qIFNoYXBlRmxhZ3MuVEVMRVBPUlQgKi8pIHtcbiAgICAgICAgICAgIHR5cGUubW92ZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIGludGVybmFscyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IEZyYWdtZW50KSB7XG4gICAgICAgICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbW92ZShjaGlsZHJlbltpXSwgY29udGFpbmVyLCBhbmNob3IsIG1vdmVUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhvc3RJbnNlcnQodm5vZGUuYW5jaG9yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IFN0YXRpYykge1xuICAgICAgICAgICAgbW92ZVN0YXRpY05vZGUodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBzaW5nbGUgbm9kZXNcbiAgICAgICAgY29uc3QgbmVlZFRyYW5zaXRpb24gPSBtb3ZlVHlwZSAhPT0gMiAvKiBNb3ZlVHlwZS5SRU9SREVSICovICYmXG4gICAgICAgICAgICBzaGFwZUZsYWcgJiAxIC8qIFNoYXBlRmxhZ3MuRUxFTUVOVCAqLyAmJlxuICAgICAgICAgICAgdHJhbnNpdGlvbjtcbiAgICAgICAgaWYgKG5lZWRUcmFuc2l0aW9uKSB7XG4gICAgICAgICAgICBpZiAobW92ZVR5cGUgPT09IDAgLyogTW92ZVR5cGUuRU5URVIgKi8pIHtcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICAgICAgICAgICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHRyYW5zaXRpb24uZW50ZXIoZWwpLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGxlYXZlLCBkZWxheUxlYXZlLCBhZnRlckxlYXZlIH0gPSB0cmFuc2l0aW9uO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZSA9ICgpID0+IGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJmb3JtTGVhdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxlYXZlKGVsLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyTGVhdmUgJiYgYWZ0ZXJMZWF2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChkZWxheUxlYXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGF5TGVhdmUoZWwsIHJlbW92ZSwgcGVyZm9ybUxlYXZlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBlcmZvcm1MZWF2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgdW5tb3VudCA9ICh2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUgPSBmYWxzZSwgb3B0aW1pemVkID0gZmFsc2UpID0+IHtcbiAgICAgICAgY29uc3QgeyB0eXBlLCBwcm9wcywgcmVmLCBjaGlsZHJlbiwgZHluYW1pY0NoaWxkcmVuLCBzaGFwZUZsYWcsIHBhdGNoRmxhZywgZGlycyB9ID0gdm5vZGU7XG4gICAgICAgIC8vIHVuc2V0IHJlZlxuICAgICAgICBpZiAocmVmICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNldFJlZihyZWYsIG51bGwsIHBhcmVudFN1c3BlbnNlLCB2bm9kZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDI1NiAvKiBTaGFwZUZsYWdzLkNPTVBPTkVOVF9TSE9VTERfS0VFUF9BTElWRSAqLykge1xuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LmN0eC5kZWFjdGl2YXRlKHZub2RlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzaG91bGRJbnZva2VEaXJzID0gc2hhcGVGbGFnICYgMSAvKiBTaGFwZUZsYWdzLkVMRU1FTlQgKi8gJiYgZGlycztcbiAgICAgICAgY29uc3Qgc2hvdWxkSW52b2tlVm5vZGVIb29rID0gIWlzQXN5bmNXcmFwcGVyKHZub2RlKTtcbiAgICAgICAgbGV0IHZub2RlSG9vaztcbiAgICAgICAgaWYgKHNob3VsZEludm9rZVZub2RlSG9vayAmJlxuICAgICAgICAgICAgKHZub2RlSG9vayA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVCZWZvcmVVbm1vdW50KSkge1xuICAgICAgICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDYgLyogU2hhcGVGbGFncy5DT01QT05FTlQgKi8pIHtcbiAgICAgICAgICAgIHVubW91bnRDb21wb25lbnQodm5vZGUuY29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDEyOCAvKiBTaGFwZUZsYWdzLlNVU1BFTlNFICovKSB7XG4gICAgICAgICAgICAgICAgdm5vZGUuc3VzcGVuc2UudW5tb3VudChwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaG91bGRJbnZva2VEaXJzKSB7XG4gICAgICAgICAgICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCAnYmVmb3JlVW5tb3VudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDY0IC8qIFNoYXBlRmxhZ3MuVEVMRVBPUlQgKi8pIHtcbiAgICAgICAgICAgICAgICB2bm9kZS50eXBlLnJlbW92ZSh2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgb3B0aW1pemVkLCBpbnRlcm5hbHMsIGRvUmVtb3ZlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGR5bmFtaWNDaGlsZHJlbiAmJlxuICAgICAgICAgICAgICAgIC8vICMxMTUzOiBmYXN0IHBhdGggc2hvdWxkIG5vdCBiZSB0YWtlbiBmb3Igbm9uLXN0YWJsZSAodi1mb3IpIGZyYWdtZW50c1xuICAgICAgICAgICAgICAgICh0eXBlICE9PSBGcmFnbWVudCB8fFxuICAgICAgICAgICAgICAgICAgICAocGF0Y2hGbGFnID4gMCAmJiBwYXRjaEZsYWcgJiA2NCAvKiBQYXRjaEZsYWdzLlNUQUJMRV9GUkFHTUVOVCAqLykpKSB7XG4gICAgICAgICAgICAgICAgLy8gZmFzdCBwYXRoIGZvciBibG9jayBub2Rlczogb25seSBuZWVkIHRvIHVubW91bnQgZHluYW1pYyBjaGlsZHJlbi5cbiAgICAgICAgICAgICAgICB1bm1vdW50Q2hpbGRyZW4oZHluYW1pY0NoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgodHlwZSA9PT0gRnJhZ21lbnQgJiZcbiAgICAgICAgICAgICAgICBwYXRjaEZsYWcgJlxuICAgICAgICAgICAgICAgICAgICAoMTI4IC8qIFBhdGNoRmxhZ3MuS0VZRURfRlJBR01FTlQgKi8gfCAyNTYgLyogUGF0Y2hGbGFncy5VTktFWUVEX0ZSQUdNRU5UICovKSkgfHxcbiAgICAgICAgICAgICAgICAoIW9wdGltaXplZCAmJiBzaGFwZUZsYWcgJiAxNiAvKiBTaGFwZUZsYWdzLkFSUkFZX0NISUxEUkVOICovKSkge1xuICAgICAgICAgICAgICAgIHVubW91bnRDaGlsZHJlbihjaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZG9SZW1vdmUpIHtcbiAgICAgICAgICAgICAgICByZW1vdmUodm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICgoc2hvdWxkSW52b2tlVm5vZGVIb29rICYmXG4gICAgICAgICAgICAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZVVubW91bnRlZCkpIHx8XG4gICAgICAgICAgICBzaG91bGRJbnZva2VEaXJzKSB7XG4gICAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHZub2RlSG9vayAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgICAgICAgICAgICBzaG91bGRJbnZva2VEaXJzICYmXG4gICAgICAgICAgICAgICAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgJ3VubW91bnRlZCcpO1xuICAgICAgICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCByZW1vdmUgPSB2bm9kZSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdHlwZSwgZWwsIGFuY2hvciwgdHJhbnNpdGlvbiB9ID0gdm5vZGU7XG4gICAgICAgIGlmICh0eXBlID09PSBGcmFnbWVudCkge1xuICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJlxuICAgICAgICAgICAgICAgIHZub2RlLnBhdGNoRmxhZyA+IDAgJiZcbiAgICAgICAgICAgICAgICB2bm9kZS5wYXRjaEZsYWcgJiAyMDQ4IC8qIFBhdGNoRmxhZ3MuREVWX1JPT1RfRlJBR01FTlQgKi8gJiZcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uICYmXG4gICAgICAgICAgICAgICAgIXRyYW5zaXRpb24ucGVyc2lzdGVkKSB7XG4gICAgICAgICAgICAgICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC50eXBlID09PSBDb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBob3N0UmVtb3ZlKGNoaWxkLmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlbW92ZUZyYWdtZW50KGVsLCBhbmNob3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBTdGF0aWMpIHtcbiAgICAgICAgICAgIHJlbW92ZVN0YXRpY05vZGUodm5vZGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBlcmZvcm1SZW1vdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBob3N0UmVtb3ZlKGVsKTtcbiAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLnBlcnNpc3RlZCAmJiB0cmFuc2l0aW9uLmFmdGVyTGVhdmUpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLmFmdGVyTGVhdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEgLyogU2hhcGVGbGFncy5FTEVNRU5UICovICYmXG4gICAgICAgICAgICB0cmFuc2l0aW9uICYmXG4gICAgICAgICAgICAhdHJhbnNpdGlvbi5wZXJzaXN0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbGVhdmUsIGRlbGF5TGVhdmUgfSA9IHRyYW5zaXRpb247XG4gICAgICAgICAgICBjb25zdCBwZXJmb3JtTGVhdmUgPSAoKSA9PiBsZWF2ZShlbCwgcGVyZm9ybVJlbW92ZSk7XG4gICAgICAgICAgICBpZiAoZGVsYXlMZWF2ZSkge1xuICAgICAgICAgICAgICAgIGRlbGF5TGVhdmUodm5vZGUuZWwsIHBlcmZvcm1SZW1vdmUsIHBlcmZvcm1MZWF2ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZXJmb3JtTGVhdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBlcmZvcm1SZW1vdmUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgcmVtb3ZlRnJhZ21lbnQgPSAoY3VyLCBlbmQpID0+IHtcbiAgICAgICAgLy8gRm9yIGZyYWdtZW50cywgZGlyZWN0bHkgcmVtb3ZlIGFsbCBjb250YWluZWQgRE9NIG5vZGVzLlxuICAgICAgICAvLyAoZnJhZ21lbnQgY2hpbGQgbm9kZXMgY2Fubm90IGhhdmUgdHJhbnNpdGlvbilcbiAgICAgICAgbGV0IG5leHQ7XG4gICAgICAgIHdoaWxlIChjdXIgIT09IGVuZCkge1xuICAgICAgICAgICAgbmV4dCA9IGhvc3ROZXh0U2libGluZyhjdXIpO1xuICAgICAgICAgICAgaG9zdFJlbW92ZShjdXIpO1xuICAgICAgICAgICAgY3VyID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBob3N0UmVtb3ZlKGVuZCk7XG4gICAgfTtcbiAgICBjb25zdCB1bm1vdW50Q29tcG9uZW50ID0gKGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpID0+IHtcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiBpbnN0YW5jZS50eXBlLl9faG1ySWQpIHtcbiAgICAgICAgICAgIHVucmVnaXN0ZXJITVIoaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgYnVtLCBzY29wZSwgdXBkYXRlLCBzdWJUcmVlLCB1bSB9ID0gaW5zdGFuY2U7XG4gICAgICAgIC8vIGJlZm9yZVVubW91bnQgaG9va1xuICAgICAgICBpZiAoYnVtKSB7XG4gICAgICAgICAgICBpbnZva2VBcnJheUZucyhidW0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHN0b3AgZWZmZWN0cyBpbiBjb21wb25lbnQgc2NvcGVcbiAgICAgICAgc2NvcGUuc3RvcCgpO1xuICAgICAgICAvLyB1cGRhdGUgbWF5IGJlIG51bGwgaWYgYSBjb21wb25lbnQgaXMgdW5tb3VudGVkIGJlZm9yZSBpdHMgYXN5bmNcbiAgICAgICAgLy8gc2V0dXAgaGFzIHJlc29sdmVkLlxuICAgICAgICBpZiAodXBkYXRlKSB7XG4gICAgICAgICAgICAvLyBzbyB0aGF0IHNjaGVkdWxlciB3aWxsIG5vIGxvbmdlciBpbnZva2UgaXRcbiAgICAgICAgICAgIHVwZGF0ZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHVubW91bnQoc3ViVHJlZSwgaW5zdGFuY2UsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdW5tb3VudGVkIGhvb2tcbiAgICAgICAgaWYgKHVtKSB7XG4gICAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QodW0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgaW5zdGFuY2UuaXNVbm1vdW50ZWQgPSB0cnVlO1xuICAgICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICAgIC8vIEEgY29tcG9uZW50IHdpdGggYXN5bmMgZGVwIGluc2lkZSBhIHBlbmRpbmcgc3VzcGVuc2UgaXMgdW5tb3VudGVkIGJlZm9yZVxuICAgICAgICAvLyBpdHMgYXN5bmMgZGVwIHJlc29sdmVzLiBUaGlzIHNob3VsZCByZW1vdmUgdGhlIGRlcCBmcm9tIHRoZSBzdXNwZW5zZSwgYW5kXG4gICAgICAgIC8vIGNhdXNlIHRoZSBzdXNwZW5zZSB0byByZXNvbHZlIGltbWVkaWF0ZWx5IGlmIHRoYXQgd2FzIHRoZSBsYXN0IGRlcC5cbiAgICAgICAgaWYgKHBhcmVudFN1c3BlbnNlICYmXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nQnJhbmNoICYmXG4gICAgICAgICAgICAhcGFyZW50U3VzcGVuc2UuaXNVbm1vdW50ZWQgJiZcbiAgICAgICAgICAgIGluc3RhbmNlLmFzeW5jRGVwICYmXG4gICAgICAgICAgICAhaW5zdGFuY2UuYXN5bmNSZXNvbHZlZCAmJlxuICAgICAgICAgICAgaW5zdGFuY2Uuc3VzcGVuc2VJZCA9PT0gcGFyZW50U3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZS5kZXBzLS07XG4gICAgICAgICAgICBpZiAocGFyZW50U3VzcGVuc2UuZGVwcyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICAgICAgZGV2dG9vbHNDb21wb25lbnRSZW1vdmVkKGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgdW5tb3VudENoaWxkcmVuID0gKGNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSA9IGZhbHNlLCBvcHRpbWl6ZWQgPSBmYWxzZSwgc3RhcnQgPSAwKSA9PiB7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB1bm1vdW50KGNoaWxkcmVuW2ldLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSwgb3B0aW1pemVkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgZ2V0TmV4dEhvc3ROb2RlID0gdm5vZGUgPT4ge1xuICAgICAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgNiAvKiBTaGFwZUZsYWdzLkNPTVBPTkVOVCAqLykge1xuICAgICAgICAgICAgcmV0dXJuIGdldE5leHRIb3N0Tm9kZSh2bm9kZS5jb21wb25lbnQuc3ViVHJlZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEyOCAvKiBTaGFwZUZsYWdzLlNVU1BFTlNFICovKSB7XG4gICAgICAgICAgICByZXR1cm4gdm5vZGUuc3VzcGVuc2UubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBob3N0TmV4dFNpYmxpbmcoKHZub2RlLmFuY2hvciB8fCB2bm9kZS5lbCkpO1xuICAgIH07XG4gICAgY29uc3QgcmVuZGVyID0gKHZub2RlLCBjb250YWluZXIsIGlzU1ZHKSA9PiB7XG4gICAgICAgIGlmICh2bm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyLl92bm9kZSkge1xuICAgICAgICAgICAgICAgIHVubW91bnQoY29udGFpbmVyLl92bm9kZSwgbnVsbCwgbnVsbCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwYXRjaChjb250YWluZXIuX3Zub2RlIHx8IG51bGwsIHZub2RlLCBjb250YWluZXIsIG51bGwsIG51bGwsIG51bGwsIGlzU1ZHKTtcbiAgICAgICAgfVxuICAgICAgICBmbHVzaFByZUZsdXNoQ2JzKCk7XG4gICAgICAgIGZsdXNoUG9zdEZsdXNoQ2JzKCk7XG4gICAgICAgIGNvbnRhaW5lci5fdm5vZGUgPSB2bm9kZTtcbiAgICB9O1xuICAgIGNvbnN0IGludGVybmFscyA9IHtcbiAgICAgICAgcDogcGF0Y2gsXG4gICAgICAgIHVtOiB1bm1vdW50LFxuICAgICAgICBtOiBtb3ZlLFxuICAgICAgICByOiByZW1vdmUsXG4gICAgICAgIG10OiBtb3VudENvbXBvbmVudCxcbiAgICAgICAgbWM6IG1vdW50Q2hpbGRyZW4sXG4gICAgICAgIHBjOiBwYXRjaENoaWxkcmVuLFxuICAgICAgICBwYmM6IHBhdGNoQmxvY2tDaGlsZHJlbixcbiAgICAgICAgbjogZ2V0TmV4dEhvc3ROb2RlLFxuICAgICAgICBvOiBvcHRpb25zXG4gICAgfTtcbiAgICBsZXQgaHlkcmF0ZTtcbiAgICBsZXQgaHlkcmF0ZU5vZGU7XG4gICAgaWYgKGNyZWF0ZUh5ZHJhdGlvbkZucykge1xuICAgICAgICBbaHlkcmF0ZSwgaHlkcmF0ZU5vZGVdID0gY3JlYXRlSHlkcmF0aW9uRm5zKGludGVybmFscyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJlbmRlcixcbiAgICAgICAgaHlkcmF0ZSxcbiAgICAgICAgY3JlYXRlQXBwOiBjcmVhdGVBcHBBUEkocmVuZGVyLCBoeWRyYXRlKVxuICAgIH07XG59XG5mdW5jdGlvbiB0b2dnbGVSZWN1cnNlKHsgZWZmZWN0LCB1cGRhdGUgfSwgYWxsb3dlZCkge1xuICAgIGVmZmVjdC5hbGxvd1JlY3Vyc2UgPSB1cGRhdGUuYWxsb3dSZWN1cnNlID0gYWxsb3dlZDtcbn1cbi8qKlxuICogIzExNTZcbiAqIFdoZW4gYSBjb21wb25lbnQgaXMgSE1SLWVuYWJsZWQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHN0YXRpYyBub2Rlc1xuICogaW5zaWRlIGEgYmxvY2sgYWxzbyBpbmhlcml0IHRoZSBET00gZWxlbWVudCBmcm9tIHRoZSBwcmV2aW91cyB0cmVlIHNvIHRoYXRcbiAqIEhNUiB1cGRhdGVzICh3aGljaCBhcmUgZnVsbCB1cGRhdGVzKSBjYW4gcmV0cmlldmUgdGhlIGVsZW1lbnQgZm9yIHBhdGNoaW5nLlxuICpcbiAqICMyMDgwXG4gKiBJbnNpZGUga2V5ZWQgYHRlbXBsYXRlYCBmcmFnbWVudCBzdGF0aWMgY2hpbGRyZW4sIGlmIGEgZnJhZ21lbnQgaXMgbW92ZWQsXG4gKiB0aGUgY2hpbGRyZW4gd2lsbCBhbHdheXMgYmUgbW92ZWQuIFRoZXJlZm9yZSwgaW4gb3JkZXIgdG8gZW5zdXJlIGNvcnJlY3QgbW92ZVxuICogcG9zaXRpb24sIGVsIHNob3VsZCBiZSBpbmhlcml0ZWQgZnJvbSBwcmV2aW91cyBub2Rlcy5cbiAqL1xuZnVuY3Rpb24gdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIsIHNoYWxsb3cgPSBmYWxzZSkge1xuICAgIGNvbnN0IGNoMSA9IG4xLmNoaWxkcmVuO1xuICAgIGNvbnN0IGNoMiA9IG4yLmNoaWxkcmVuO1xuICAgIGlmIChpc0FycmF5KGNoMSkgJiYgaXNBcnJheShjaDIpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2gxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIG9ubHkgY2FsbGVkIGluIHRoZSBvcHRpbWl6ZWQgcGF0aCBzbyBhcnJheSBjaGlsZHJlbiBhcmVcbiAgICAgICAgICAgIC8vIGd1YXJhbnRlZWQgdG8gYmUgdm5vZGVzXG4gICAgICAgICAgICBjb25zdCBjMSA9IGNoMVtpXTtcbiAgICAgICAgICAgIGxldCBjMiA9IGNoMltpXTtcbiAgICAgICAgICAgIGlmIChjMi5zaGFwZUZsYWcgJiAxIC8qIFNoYXBlRmxhZ3MuRUxFTUVOVCAqLyAmJiAhYzIuZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMyLnBhdGNoRmxhZyA8PSAwIHx8IGMyLnBhdGNoRmxhZyA9PT0gMzIgLyogUGF0Y2hGbGFncy5IWURSQVRFX0VWRU5UUyAqLykge1xuICAgICAgICAgICAgICAgICAgICBjMiA9IGNoMltpXSA9IGNsb25lSWZNb3VudGVkKGNoMltpXSk7XG4gICAgICAgICAgICAgICAgICAgIGMyLmVsID0gYzEuZWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc2hhbGxvdylcbiAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihjMSwgYzIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gIzY4NTIgYWxzbyBpbmhlcml0IGZvciB0ZXh0IG5vZGVzXG4gICAgICAgICAgICBpZiAoYzIudHlwZSA9PT0gVGV4dCkge1xuICAgICAgICAgICAgICAgIGMyLmVsID0gYzEuZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhbHNvIGluaGVyaXQgZm9yIGNvbW1lbnQgbm9kZXMsIGJ1dCBub3QgcGxhY2Vob2xkZXJzIChlLmcuIHYtaWYgd2hpY2hcbiAgICAgICAgICAgIC8vIHdvdWxkIGhhdmUgcmVjZWl2ZWQgLmVsIGR1cmluZyBibG9jayBwYXRjaClcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgYzIudHlwZSA9PT0gQ29tbWVudCAmJiAhYzIuZWwpIHtcbiAgICAgICAgICAgICAgICBjMi5lbCA9IGMxLmVsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTG9uZ2VzdF9pbmNyZWFzaW5nX3N1YnNlcXVlbmNlXG5mdW5jdGlvbiBnZXRTZXF1ZW5jZShhcnIpIHtcbiAgICBjb25zdCBwID0gYXJyLnNsaWNlKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gWzBdO1xuICAgIGxldCBpLCBqLCB1LCB2LCBjO1xuICAgIGNvbnN0IGxlbiA9IGFyci5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGFyckkgPSBhcnJbaV07XG4gICAgICAgIGlmIChhcnJJICE9PSAwKSB7XG4gICAgICAgICAgICBqID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGlmIChhcnJbal0gPCBhcnJJKSB7XG4gICAgICAgICAgICAgICAgcFtpXSA9IGo7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1ID0gMDtcbiAgICAgICAgICAgIHYgPSByZXN1bHQubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIHdoaWxlICh1IDwgdikge1xuICAgICAgICAgICAgICAgIGMgPSAodSArIHYpID4+IDE7XG4gICAgICAgICAgICAgICAgaWYgKGFycltyZXN1bHRbY11dIDwgYXJySSkge1xuICAgICAgICAgICAgICAgICAgICB1ID0gYyArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2ID0gYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJySSA8IGFycltyZXN1bHRbdV1dKSB7XG4gICAgICAgICAgICAgICAgaWYgKHUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHBbaV0gPSByZXN1bHRbdSAtIDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHRbdV0gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHUgPSByZXN1bHQubGVuZ3RoO1xuICAgIHYgPSByZXN1bHRbdSAtIDFdO1xuICAgIHdoaWxlICh1LS0gPiAwKSB7XG4gICAgICAgIHJlc3VsdFt1XSA9IHY7XG4gICAgICAgIHYgPSBwW3ZdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5jb25zdCBpc1RlbGVwb3J0ID0gKHR5cGUpID0+IHR5cGUuX19pc1RlbGVwb3J0O1xuY29uc3QgaXNUZWxlcG9ydERpc2FibGVkID0gKHByb3BzKSA9PiBwcm9wcyAmJiAocHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMuZGlzYWJsZWQgPT09ICcnKTtcbmNvbnN0IGlzVGFyZ2V0U1ZHID0gKHRhcmdldCkgPT4gdHlwZW9mIFNWR0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ7XG5jb25zdCByZXNvbHZlVGFyZ2V0ID0gKHByb3BzLCBzZWxlY3QpID0+IHtcbiAgICBjb25zdCB0YXJnZXRTZWxlY3RvciA9IHByb3BzICYmIHByb3BzLnRvO1xuICAgIGlmIChpc1N0cmluZyh0YXJnZXRTZWxlY3RvcikpIHtcbiAgICAgICAgaWYgKCFzZWxlY3QpIHtcbiAgICAgICAgICAgIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJlxuICAgICAgICAgICAgICAgIHdhcm4oYEN1cnJlbnQgcmVuZGVyZXIgZG9lcyBub3Qgc3VwcG9ydCBzdHJpbmcgdGFyZ2V0IGZvciBUZWxlcG9ydHMuIGAgK1xuICAgICAgICAgICAgICAgICAgICBgKG1pc3NpbmcgcXVlcnlTZWxlY3RvciByZW5kZXJlciBvcHRpb24pYCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHNlbGVjdCh0YXJnZXRTZWxlY3Rvcik7XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJlxuICAgICAgICAgICAgICAgICAgICB3YXJuKGBGYWlsZWQgdG8gbG9jYXRlIFRlbGVwb3J0IHRhcmdldCB3aXRoIHNlbGVjdG9yIFwiJHt0YXJnZXRTZWxlY3Rvcn1cIi4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgTm90ZSB0aGUgdGFyZ2V0IGVsZW1lbnQgbXVzdCBleGlzdCBiZWZvcmUgdGhlIGNvbXBvbmVudCBpcyBtb3VudGVkIC0gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgaS5lLiB0aGUgdGFyZ2V0IGNhbm5vdCBiZSByZW5kZXJlZCBieSB0aGUgY29tcG9uZW50IGl0c2VsZiwgYW5kIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGlkZWFsbHkgc2hvdWxkIGJlIG91dHNpZGUgb2YgdGhlIGVudGlyZSBWdWUgY29tcG9uZW50IHRyZWUuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmICF0YXJnZXRTZWxlY3RvciAmJiAhaXNUZWxlcG9ydERpc2FibGVkKHByb3BzKSkge1xuICAgICAgICAgICAgd2FybihgSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQ6ICR7dGFyZ2V0U2VsZWN0b3J9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldFNlbGVjdG9yO1xuICAgIH1cbn07XG5jb25zdCBUZWxlcG9ydEltcGwgPSB7XG4gICAgX19pc1RlbGVwb3J0OiB0cnVlLFxuICAgIHByb2Nlc3MobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCBpbnRlcm5hbHMpIHtcbiAgICAgICAgY29uc3QgeyBtYzogbW91bnRDaGlsZHJlbiwgcGM6IHBhdGNoQ2hpbGRyZW4sIHBiYzogcGF0Y2hCbG9ja0NoaWxkcmVuLCBvOiB7IGluc2VydCwgcXVlcnlTZWxlY3RvciwgY3JlYXRlVGV4dCwgY3JlYXRlQ29tbWVudCB9IH0gPSBpbnRlcm5hbHM7XG4gICAgICAgIGNvbnN0IGRpc2FibGVkID0gaXNUZWxlcG9ydERpc2FibGVkKG4yLnByb3BzKTtcbiAgICAgICAgbGV0IHsgc2hhcGVGbGFnLCBjaGlsZHJlbiwgZHluYW1pY0NoaWxkcmVuIH0gPSBuMjtcbiAgICAgICAgLy8gIzMzMDJcbiAgICAgICAgLy8gSE1SIHVwZGF0ZWQsIGZvcmNlIGZ1bGwgZGlmZlxuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIGlzSG1yVXBkYXRpbmcpIHtcbiAgICAgICAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgICAgICAgZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gaW5zZXJ0IGFuY2hvcnMgaW4gdGhlIG1haW4gdmlld1xuICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSAobjIuZWwgPSAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJylcbiAgICAgICAgICAgICAgICA/IGNyZWF0ZUNvbW1lbnQoJ3RlbGVwb3J0IHN0YXJ0JylcbiAgICAgICAgICAgICAgICA6IGNyZWF0ZVRleHQoJycpKTtcbiAgICAgICAgICAgIGNvbnN0IG1haW5BbmNob3IgPSAobjIuYW5jaG9yID0gKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpXG4gICAgICAgICAgICAgICAgPyBjcmVhdGVDb21tZW50KCd0ZWxlcG9ydCBlbmQnKVxuICAgICAgICAgICAgICAgIDogY3JlYXRlVGV4dCgnJykpO1xuICAgICAgICAgICAgaW5zZXJ0KHBsYWNlaG9sZGVyLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgICAgICBpbnNlcnQobWFpbkFuY2hvciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gKG4yLnRhcmdldCA9IHJlc29sdmVUYXJnZXQobjIucHJvcHMsIHF1ZXJ5U2VsZWN0b3IpKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldEFuY2hvciA9IChuMi50YXJnZXRBbmNob3IgPSBjcmVhdGVUZXh0KCcnKSk7XG4gICAgICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgaW5zZXJ0KHRhcmdldEFuY2hvciwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAvLyAjMjY1MiB3ZSBjb3VsZCBiZSB0ZWxlcG9ydGluZyBmcm9tIGEgbm9uLVNWRyB0cmVlIGludG8gYW4gU1ZHIHRyZWVcbiAgICAgICAgICAgICAgICBpc1NWRyA9IGlzU1ZHIHx8IGlzVGFyZ2V0U1ZHKHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgd2FybignSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQgb24gbW91bnQ6JywgdGFyZ2V0LCBgKCR7dHlwZW9mIHRhcmdldH0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtb3VudCA9IChjb250YWluZXIsIGFuY2hvcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFRlbGVwb3J0ICphbHdheXMqIGhhcyBBcnJheSBjaGlsZHJlbi4gVGhpcyBpcyBlbmZvcmNlZCBpbiBib3RoIHRoZVxuICAgICAgICAgICAgICAgIC8vIGNvbXBpbGVyIGFuZCB2bm9kZSBjaGlsZHJlbiBub3JtYWxpemF0aW9uLlxuICAgICAgICAgICAgICAgIGlmIChzaGFwZUZsYWcgJiAxNiAvKiBTaGFwZUZsYWdzLkFSUkFZX0NISUxEUkVOICovKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdW50Q2hpbGRyZW4oY2hpbGRyZW4sIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBtb3VudChjb250YWluZXIsIG1haW5BbmNob3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgbW91bnQodGFyZ2V0LCB0YXJnZXRBbmNob3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gdXBkYXRlIGNvbnRlbnRcbiAgICAgICAgICAgIG4yLmVsID0gbjEuZWw7XG4gICAgICAgICAgICBjb25zdCBtYWluQW5jaG9yID0gKG4yLmFuY2hvciA9IG4xLmFuY2hvcik7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSAobjIudGFyZ2V0ID0gbjEudGFyZ2V0KTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldEFuY2hvciA9IChuMi50YXJnZXRBbmNob3IgPSBuMS50YXJnZXRBbmNob3IpO1xuICAgICAgICAgICAgY29uc3Qgd2FzRGlzYWJsZWQgPSBpc1RlbGVwb3J0RGlzYWJsZWQobjEucHJvcHMpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudENvbnRhaW5lciA9IHdhc0Rpc2FibGVkID8gY29udGFpbmVyIDogdGFyZ2V0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEFuY2hvciA9IHdhc0Rpc2FibGVkID8gbWFpbkFuY2hvciA6IHRhcmdldEFuY2hvcjtcbiAgICAgICAgICAgIGlzU1ZHID0gaXNTVkcgfHwgaXNUYXJnZXRTVkcodGFyZ2V0KTtcbiAgICAgICAgICAgIGlmIChkeW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAvLyBmYXN0IHBhdGggd2hlbiB0aGUgdGVsZXBvcnQgaGFwcGVucyB0byBiZSBhIGJsb2NrIHJvb3RcbiAgICAgICAgICAgICAgICBwYXRjaEJsb2NrQ2hpbGRyZW4objEuZHluYW1pY0NoaWxkcmVuLCBkeW5hbWljQ2hpbGRyZW4sIGN1cnJlbnRDb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMpO1xuICAgICAgICAgICAgICAgIC8vIGV2ZW4gaW4gYmxvY2sgdHJlZSBtb2RlIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGFsbCByb290LWxldmVsIG5vZGVzXG4gICAgICAgICAgICAgICAgLy8gaW4gdGhlIHRlbGVwb3J0IGluaGVyaXQgcHJldmlvdXMgRE9NIHJlZmVyZW5jZXMgc28gdGhhdCB0aGV5IGNhblxuICAgICAgICAgICAgICAgIC8vIGJlIG1vdmVkIGluIGZ1dHVyZSBwYXRjaGVzLlxuICAgICAgICAgICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4objEsIG4yLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFvcHRpbWl6ZWQpIHtcbiAgICAgICAgICAgICAgICBwYXRjaENoaWxkcmVuKG4xLCBuMiwgY3VycmVudENvbnRhaW5lciwgY3VycmVudEFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3YXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbmFibGVkIC0+IGRpc2FibGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgaW50byBtYWluIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBtb3ZlVGVsZXBvcnQobjIsIGNvbnRhaW5lciwgbWFpbkFuY2hvciwgaW50ZXJuYWxzLCAxIC8qIFRlbGVwb3J0TW92ZVR5cGVzLlRPR0dMRSAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoYW5nZWRcbiAgICAgICAgICAgICAgICBpZiAoKG4yLnByb3BzICYmIG4yLnByb3BzLnRvKSAhPT0gKG4xLnByb3BzICYmIG4xLnByb3BzLnRvKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGFyZ2V0ID0gKG4yLnRhcmdldCA9IHJlc29sdmVUYXJnZXQobjIucHJvcHMsIHF1ZXJ5U2VsZWN0b3IpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVUZWxlcG9ydChuMiwgbmV4dFRhcmdldCwgbnVsbCwgaW50ZXJuYWxzLCAwIC8qIFRlbGVwb3J0TW92ZVR5cGVzLlRBUkdFVF9DSEFOR0UgKi8pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2FybignSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQgb24gdXBkYXRlOicsIHRhcmdldCwgYCgke3R5cGVvZiB0YXJnZXR9KWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdhc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGVkIC0+IGVuYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSBpbnRvIHRlbGVwb3J0IHRhcmdldFxuICAgICAgICAgICAgICAgICAgICBtb3ZlVGVsZXBvcnQobjIsIHRhcmdldCwgdGFyZ2V0QW5jaG9yLCBpbnRlcm5hbHMsIDEgLyogVGVsZXBvcnRNb3ZlVHlwZXMuVE9HR0xFICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlQ3NzVmFycyhuMik7XG4gICAgfSxcbiAgICByZW1vdmUodm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG9wdGltaXplZCwgeyB1bTogdW5tb3VudCwgbzogeyByZW1vdmU6IGhvc3RSZW1vdmUgfSB9LCBkb1JlbW92ZSkge1xuICAgICAgICBjb25zdCB7IHNoYXBlRmxhZywgY2hpbGRyZW4sIGFuY2hvciwgdGFyZ2V0QW5jaG9yLCB0YXJnZXQsIHByb3BzIH0gPSB2bm9kZTtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgaG9zdFJlbW92ZSh0YXJnZXRBbmNob3IpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFuIHVubW91bnRlZCB0ZWxlcG9ydCBzaG91bGQgYWx3YXlzIHJlbW92ZSBpdHMgY2hpbGRyZW4gaWYgbm90IGRpc2FibGVkXG4gICAgICAgIGlmIChkb1JlbW92ZSB8fCAhaXNUZWxlcG9ydERpc2FibGVkKHByb3BzKSkge1xuICAgICAgICAgICAgaG9zdFJlbW92ZShhbmNob3IpO1xuICAgICAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2IC8qIFNoYXBlRmxhZ3MuQVJSQVlfQ0hJTERSRU4gKi8pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgICAgIHVubW91bnQoY2hpbGQsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUsICEhY2hpbGQuZHluYW1pY0NoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1vdmU6IG1vdmVUZWxlcG9ydCxcbiAgICBoeWRyYXRlOiBoeWRyYXRlVGVsZXBvcnRcbn07XG5mdW5jdGlvbiBtb3ZlVGVsZXBvcnQodm5vZGUsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yLCB7IG86IHsgaW5zZXJ0IH0sIG06IG1vdmUgfSwgbW92ZVR5cGUgPSAyIC8qIFRlbGVwb3J0TW92ZVR5cGVzLlJFT1JERVIgKi8pIHtcbiAgICAvLyBtb3ZlIHRhcmdldCBhbmNob3IgaWYgdGhpcyBpcyBhIHRhcmdldCBjaGFuZ2UuXG4gICAgaWYgKG1vdmVUeXBlID09PSAwIC8qIFRlbGVwb3J0TW92ZVR5cGVzLlRBUkdFVF9DSEFOR0UgKi8pIHtcbiAgICAgICAgaW5zZXJ0KHZub2RlLnRhcmdldEFuY2hvciwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IpO1xuICAgIH1cbiAgICBjb25zdCB7IGVsLCBhbmNob3IsIHNoYXBlRmxhZywgY2hpbGRyZW4sIHByb3BzIH0gPSB2bm9kZTtcbiAgICBjb25zdCBpc1Jlb3JkZXIgPSBtb3ZlVHlwZSA9PT0gMiAvKiBUZWxlcG9ydE1vdmVUeXBlcy5SRU9SREVSICovO1xuICAgIC8vIG1vdmUgbWFpbiB2aWV3IGFuY2hvciBpZiB0aGlzIGlzIGEgcmUtb3JkZXIuXG4gICAgaWYgKGlzUmVvcmRlcikge1xuICAgICAgICBpbnNlcnQoZWwsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yKTtcbiAgICB9XG4gICAgLy8gaWYgdGhpcyBpcyBhIHJlLW9yZGVyIGFuZCB0ZWxlcG9ydCBpcyBlbmFibGVkIChjb250ZW50IGlzIGluIHRhcmdldClcbiAgICAvLyBkbyBub3QgbW92ZSBjaGlsZHJlbi4gU28gdGhlIG9wcG9zaXRlIGlzOiBvbmx5IG1vdmUgY2hpbGRyZW4gaWYgdGhpc1xuICAgIC8vIGlzIG5vdCBhIHJlb3JkZXIsIG9yIHRoZSB0ZWxlcG9ydCBpcyBkaXNhYmxlZFxuICAgIGlmICghaXNSZW9yZGVyIHx8IGlzVGVsZXBvcnREaXNhYmxlZChwcm9wcykpIHtcbiAgICAgICAgLy8gVGVsZXBvcnQgaGFzIGVpdGhlciBBcnJheSBjaGlsZHJlbiBvciBubyBjaGlsZHJlbi5cbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2IC8qIFNoYXBlRmxhZ3MuQVJSQVlfQ0hJTERSRU4gKi8pIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBtb3ZlKGNoaWxkcmVuW2ldLCBjb250YWluZXIsIHBhcmVudEFuY2hvciwgMiAvKiBNb3ZlVHlwZS5SRU9SREVSICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBtb3ZlIG1haW4gdmlldyBhbmNob3IgaWYgdGhpcyBpcyBhIHJlLW9yZGVyLlxuICAgIGlmIChpc1Jlb3JkZXIpIHtcbiAgICAgICAgaW5zZXJ0KGFuY2hvciwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGh5ZHJhdGVUZWxlcG9ydChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHsgbzogeyBuZXh0U2libGluZywgcGFyZW50Tm9kZSwgcXVlcnlTZWxlY3RvciB9IH0sIGh5ZHJhdGVDaGlsZHJlbikge1xuICAgIGNvbnN0IHRhcmdldCA9ICh2bm9kZS50YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHZub2RlLnByb3BzLCBxdWVyeVNlbGVjdG9yKSk7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgICAvLyBpZiBtdWx0aXBsZSB0ZWxlcG9ydHMgcmVuZGVyZWQgdG8gdGhlIHNhbWUgdGFyZ2V0IGVsZW1lbnQsIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gcGljayB1cCBmcm9tIHdoZXJlIHRoZSBsYXN0IHRlbGVwb3J0IGZpbmlzaGVkIGluc3RlYWQgb2YgdGhlIGZpcnN0IG5vZGVcbiAgICAgICAgY29uc3QgdGFyZ2V0Tm9kZSA9IHRhcmdldC5fbHBhIHx8IHRhcmdldC5maXJzdENoaWxkO1xuICAgICAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMTYgLyogU2hhcGVGbGFncy5BUlJBWV9DSElMRFJFTiAqLykge1xuICAgICAgICAgICAgaWYgKGlzVGVsZXBvcnREaXNhYmxlZCh2bm9kZS5wcm9wcykpIHtcbiAgICAgICAgICAgICAgICB2bm9kZS5hbmNob3IgPSBoeWRyYXRlQ2hpbGRyZW4obmV4dFNpYmxpbmcobm9kZSksIHZub2RlLCBwYXJlbnROb2RlKG5vZGUpLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCk7XG4gICAgICAgICAgICAgICAgdm5vZGUudGFyZ2V0QW5jaG9yID0gdGFyZ2V0Tm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZub2RlLmFuY2hvciA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICAgICAgICAgIC8vIGxvb2thaGVhZCB1bnRpbCB3ZSBmaW5kIHRoZSB0YXJnZXQgYW5jaG9yXG4gICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IHJlbHkgb24gcmV0dXJuIHZhbHVlIG9mIGh5ZHJhdGVDaGlsZHJlbigpIGJlY2F1c2UgdGhlcmVcbiAgICAgICAgICAgICAgICAvLyBjb3VsZCBiZSBuZXN0ZWQgdGVsZXBvcnRzXG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldEFuY2hvciA9IHRhcmdldE5vZGU7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRhcmdldEFuY2hvcikge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRBbmNob3IgPSBuZXh0U2libGluZyh0YXJnZXRBbmNob3IpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0QW5jaG9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRBbmNob3Iubm9kZVR5cGUgPT09IDggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEFuY2hvci5kYXRhID09PSAndGVsZXBvcnQgYW5jaG9yJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdm5vZGUudGFyZ2V0QW5jaG9yID0gdGFyZ2V0QW5jaG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Ll9scGEgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZub2RlLnRhcmdldEFuY2hvciAmJiBuZXh0U2libGluZyh2bm9kZS50YXJnZXRBbmNob3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaHlkcmF0ZUNoaWxkcmVuKHRhcmdldE5vZGUsIHZub2RlLCB0YXJnZXQsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVDc3NWYXJzKHZub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZub2RlLmFuY2hvciAmJiBuZXh0U2libGluZyh2bm9kZS5hbmNob3IpO1xufVxuLy8gRm9yY2UtY2FzdGVkIHB1YmxpYyB0eXBpbmcgZm9yIGggYW5kIFRTWCBwcm9wcyBpbmZlcmVuY2VcbmNvbnN0IFRlbGVwb3J0ID0gVGVsZXBvcnRJbXBsO1xuZnVuY3Rpb24gdXBkYXRlQ3NzVmFycyh2bm9kZSkge1xuICAgIC8vIHByZXNlbmNlIG9mIC51dCBtZXRob2QgaW5kaWNhdGVzIG93bmVyIGNvbXBvbmVudCB1c2VzIGNzcyB2YXJzLlxuICAgIC8vIGNvZGUgcGF0aCBoZXJlIGNhbiBhc3N1bWUgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgICBjb25zdCBjdHggPSB2bm9kZS5jdHg7XG4gICAgaWYgKGN0eCAmJiBjdHgudXQpIHtcbiAgICAgICAgbGV0IG5vZGUgPSB2bm9kZS5jaGlsZHJlblswXS5lbDtcbiAgICAgICAgd2hpbGUgKG5vZGUgIT09IHZub2RlLnRhcmdldEFuY2hvcikge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpXG4gICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtdi1vd25lcicsIGN0eC51aWQpO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnV0KCk7XG4gICAgfVxufVxuXG5jb25zdCBGcmFnbWVudCA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyAnRnJhZ21lbnQnIDogdW5kZWZpbmVkKTtcbmNvbnN0IFRleHQgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gJ1RleHQnIDogdW5kZWZpbmVkKTtcbmNvbnN0IENvbW1lbnQgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gJ0NvbW1lbnQnIDogdW5kZWZpbmVkKTtcbmNvbnN0IFN0YXRpYyA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyAnU3RhdGljJyA6IHVuZGVmaW5lZCk7XG4vLyBTaW5jZSB2LWlmIGFuZCB2LWZvciBhcmUgdGhlIHR3byBwb3NzaWJsZSB3YXlzIG5vZGUgc3RydWN0dXJlIGNhbiBkeW5hbWljYWxseVxuLy8gY2hhbmdlLCBvbmNlIHdlIGNvbnNpZGVyIHYtaWYgYnJhbmNoZXMgYW5kIGVhY2ggdi1mb3IgZnJhZ21lbnQgYSBibG9jaywgd2Vcbi8vIGNhbiBkaXZpZGUgYSB0ZW1wbGF0ZSBpbnRvIG5lc3RlZCBibG9ja3MsIGFuZCB3aXRoaW4gZWFjaCBibG9jayB0aGUgbm9kZVxuLy8gc3RydWN0dXJlIHdvdWxkIGJlIHN0YWJsZS4gVGhpcyBhbGxvd3MgdXMgdG8gc2tpcCBtb3N0IGNoaWxkcmVuIGRpZmZpbmdcbi8vIGFuZCBvbmx5IHdvcnJ5IGFib3V0IHRoZSBkeW5hbWljIG5vZGVzIChpbmRpY2F0ZWQgYnkgcGF0Y2ggZmxhZ3MpLlxuY29uc3QgYmxvY2tTdGFjayA9IFtdO1xubGV0IGN1cnJlbnRCbG9jayA9IG51bGw7XG4vKipcbiAqIE9wZW4gYSBibG9jay5cbiAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGBjcmVhdGVCbG9ja2AuIEl0IGNhbm5vdCBiZSBwYXJ0IG9mIGBjcmVhdGVCbG9ja2BcbiAqIGJlY2F1c2UgdGhlIGNoaWxkcmVuIG9mIHRoZSBibG9jayBhcmUgZXZhbHVhdGVkIGJlZm9yZSBgY3JlYXRlQmxvY2tgIGl0c2VsZlxuICogaXMgY2FsbGVkLiBUaGUgZ2VuZXJhdGVkIGNvZGUgdHlwaWNhbGx5IGxvb2tzIGxpa2UgdGhpczpcbiAqXG4gKiBgYGBqc1xuICogZnVuY3Rpb24gcmVuZGVyKCkge1xuICogICByZXR1cm4gKG9wZW5CbG9jaygpLGNyZWF0ZUJsb2NrKCdkaXYnLCBudWxsLCBbLi4uXSkpXG4gKiB9XG4gKiBgYGBcbiAqIGRpc2FibGVUcmFja2luZyBpcyB0cnVlIHdoZW4gY3JlYXRpbmcgYSB2LWZvciBmcmFnbWVudCBibG9jaywgc2luY2UgYSB2LWZvclxuICogZnJhZ21lbnQgYWx3YXlzIGRpZmZzIGl0cyBjaGlsZHJlbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBvcGVuQmxvY2soZGlzYWJsZVRyYWNraW5nID0gZmFsc2UpIHtcbiAgICBibG9ja1N0YWNrLnB1c2goKGN1cnJlbnRCbG9jayA9IGRpc2FibGVUcmFja2luZyA/IG51bGwgOiBbXSkpO1xufVxuZnVuY3Rpb24gY2xvc2VCbG9jaygpIHtcbiAgICBibG9ja1N0YWNrLnBvcCgpO1xuICAgIGN1cnJlbnRCbG9jayA9IGJsb2NrU3RhY2tbYmxvY2tTdGFjay5sZW5ndGggLSAxXSB8fCBudWxsO1xufVxuLy8gV2hldGhlciB3ZSBzaG91bGQgYmUgdHJhY2tpbmcgZHluYW1pYyBjaGlsZCBub2RlcyBpbnNpZGUgYSBibG9jay5cbi8vIE9ubHkgdHJhY2tzIHdoZW4gdGhpcyB2YWx1ZSBpcyA+IDBcbi8vIFdlIGFyZSBub3QgdXNpbmcgYSBzaW1wbGUgYm9vbGVhbiBiZWNhdXNlIHRoaXMgdmFsdWUgbWF5IG5lZWQgdG8gYmVcbi8vIGluY3JlbWVudGVkL2RlY3JlbWVudGVkIGJ5IG5lc3RlZCB1c2FnZSBvZiB2LW9uY2UgKHNlZSBiZWxvdylcbmxldCBpc0Jsb2NrVHJlZUVuYWJsZWQgPSAxO1xuLyoqXG4gKiBCbG9jayB0cmFja2luZyBzb21ldGltZXMgbmVlZHMgdG8gYmUgZGlzYWJsZWQsIGZvciBleGFtcGxlIGR1cmluZyB0aGVcbiAqIGNyZWF0aW9uIG9mIGEgdHJlZSB0aGF0IG5lZWRzIHRvIGJlIGNhY2hlZCBieSB2LW9uY2UuIFRoZSBjb21waWxlciBnZW5lcmF0ZXNcbiAqIGNvZGUgbGlrZSB0aGlzOlxuICpcbiAqIGBgYCBqc1xuICogX2NhY2hlWzFdIHx8IChcbiAqICAgc2V0QmxvY2tUcmFja2luZygtMSksXG4gKiAgIF9jYWNoZVsxXSA9IGNyZWF0ZVZOb2RlKC4uLiksXG4gKiAgIHNldEJsb2NrVHJhY2tpbmcoMSksXG4gKiAgIF9jYWNoZVsxXVxuICogKVxuICogYGBgXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0QmxvY2tUcmFja2luZyh2YWx1ZSkge1xuICAgIGlzQmxvY2tUcmVlRW5hYmxlZCArPSB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNldHVwQmxvY2sodm5vZGUpIHtcbiAgICAvLyBzYXZlIGN1cnJlbnQgYmxvY2sgY2hpbGRyZW4gb24gdGhlIGJsb2NrIHZub2RlXG4gICAgdm5vZGUuZHluYW1pY0NoaWxkcmVuID1cbiAgICAgICAgaXNCbG9ja1RyZWVFbmFibGVkID4gMCA/IGN1cnJlbnRCbG9jayB8fCBFTVBUWV9BUlIgOiBudWxsO1xuICAgIC8vIGNsb3NlIGJsb2NrXG4gICAgY2xvc2VCbG9jaygpO1xuICAgIC8vIGEgYmxvY2sgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIHBhdGNoZWQsIHNvIHRyYWNrIGl0IGFzIGEgY2hpbGQgb2YgaXRzXG4gICAgLy8gcGFyZW50IGJsb2NrXG4gICAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgY3VycmVudEJsb2NrKSB7XG4gICAgICAgIGN1cnJlbnRCbG9jay5wdXNoKHZub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZub2RlO1xufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50QmxvY2sodHlwZSwgcHJvcHMsIGNoaWxkcmVuLCBwYXRjaEZsYWcsIGR5bmFtaWNQcm9wcywgc2hhcGVGbGFnKSB7XG4gICAgcmV0dXJuIHNldHVwQmxvY2soY3JlYXRlQmFzZVZOb2RlKHR5cGUsIHByb3BzLCBjaGlsZHJlbiwgcGF0Y2hGbGFnLCBkeW5hbWljUHJvcHMsIHNoYXBlRmxhZywgdHJ1ZSAvKiBpc0Jsb2NrICovKSk7XG59XG4vKipcbiAqIENyZWF0ZSBhIGJsb2NrIHJvb3Qgdm5vZGUuIFRha2VzIHRoZSBzYW1lIGV4YWN0IGFyZ3VtZW50cyBhcyBgY3JlYXRlVk5vZGVgLlxuICogQSBibG9jayByb290IGtlZXBzIHRyYWNrIG9mIGR5bmFtaWMgbm9kZXMgd2l0aGluIHRoZSBibG9jayBpbiB0aGVcbiAqIGBkeW5hbWljQ2hpbGRyZW5gIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJsb2NrKHR5cGUsIHByb3BzLCBjaGlsZHJlbiwgcGF0Y2hGbGFnLCBkeW5hbWljUHJvcHMpIHtcbiAgICByZXR1cm4gc2V0dXBCbG9jayhjcmVhdGVWTm9kZSh0eXBlLCBwcm9wcywgY2hpbGRyZW4sIHBhdGNoRmxhZywgZHluYW1pY1Byb3BzLCB0cnVlIC8qIGlzQmxvY2s6IHByZXZlbnQgYSBibG9jayBmcm9tIHRyYWNraW5nIGl0c2VsZiAqLykpO1xufVxuZnVuY3Rpb24gaXNWTm9kZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA/IHZhbHVlLl9fdl9pc1ZOb2RlID09PSB0cnVlIDogZmFsc2U7XG59XG5mdW5jdGlvbiBpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSB7XG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJlxuICAgICAgICBuMi5zaGFwZUZsYWcgJiA2IC8qIFNoYXBlRmxhZ3MuQ09NUE9ORU5UICovICYmXG4gICAgICAgIGhtckRpcnR5Q29tcG9uZW50cy5oYXMobjIudHlwZSkpIHtcbiAgICAgICAgLy8gIzcwNDIsIGVuc3VyZSB0aGUgdm5vZGUgYmVpbmcgdW5tb3VudGVkIGR1cmluZyBITVJcbiAgICAgICAgLy8gYml0d2lzZSBvcGVyYXRpb25zIHRvIHJlbW92ZSBrZWVwIGFsaXZlIGZsYWdzXG4gICAgICAgIG4xLnNoYXBlRmxhZyAmPSB+MjU2IC8qIFNoYXBlRmxhZ3MuQ09NUE9ORU5UX1NIT1VMRF9LRUVQX0FMSVZFICovO1xuICAgICAgICBuMi5zaGFwZUZsYWcgJj0gfjUxMiAvKiBTaGFwZUZsYWdzLkNPTVBPTkVOVF9LRVBUX0FMSVZFICovO1xuICAgICAgICAvLyBITVIgb25seTogaWYgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBob3QtdXBkYXRlZCwgZm9yY2UgYSByZWxvYWQuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG4xLnR5cGUgPT09IG4yLnR5cGUgJiYgbjEua2V5ID09PSBuMi5rZXk7XG59XG5sZXQgdm5vZGVBcmdzVHJhbnNmb3JtZXI7XG4vKipcbiAqIEludGVybmFsIEFQSSBmb3IgcmVnaXN0ZXJpbmcgYW4gYXJndW1lbnRzIHRyYW5zZm9ybSBmb3IgY3JlYXRlVk5vZGVcbiAqIHVzZWQgZm9yIGNyZWF0aW5nIHN0dWJzIGluIHRoZSB0ZXN0LXV0aWxzXG4gKiBJdCBpcyAqaW50ZXJuYWwqIGJ1dCBuZWVkcyB0byBiZSBleHBvc2VkIGZvciB0ZXN0LXV0aWxzIHRvIHBpY2sgdXAgcHJvcGVyXG4gKiB0eXBpbmdzXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybVZOb2RlQXJncyh0cmFuc2Zvcm1lcikge1xuICAgIHZub2RlQXJnc1RyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7XG59XG5jb25zdCBjcmVhdGVWTm9kZVdpdGhBcmdzVHJhbnNmb3JtID0gKC4uLmFyZ3MpID0+IHtcbiAgICByZXR1cm4gX2NyZWF0ZVZOb2RlKC4uLih2bm9kZUFyZ3NUcmFuc2Zvcm1lclxuICAgICAgICA/IHZub2RlQXJnc1RyYW5zZm9ybWVyKGFyZ3MsIGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSlcbiAgICAgICAgOiBhcmdzKSk7XG59O1xuY29uc3QgSW50ZXJuYWxPYmplY3RLZXkgPSBgX192SW50ZXJuYWxgO1xuY29uc3Qgbm9ybWFsaXplS2V5ID0gKHsga2V5IH0pID0+IGtleSAhPSBudWxsID8ga2V5IDogbnVsbDtcbmNvbnN0IG5vcm1hbGl6ZVJlZiA9ICh7IHJlZiwgcmVmX2tleSwgcmVmX2ZvciB9KSA9PiB7XG4gICAgcmV0dXJuIChyZWYgIT0gbnVsbFxuICAgICAgICA/IGlzU3RyaW5nKHJlZikgfHwgaXNSZWYocmVmKSB8fCBpc0Z1bmN0aW9uKHJlZilcbiAgICAgICAgICAgID8geyBpOiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UsIHI6IHJlZiwgazogcmVmX2tleSwgZjogISFyZWZfZm9yIH1cbiAgICAgICAgICAgIDogcmVmXG4gICAgICAgIDogbnVsbCk7XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZVZOb2RlKHR5cGUsIHByb3BzID0gbnVsbCwgY2hpbGRyZW4gPSBudWxsLCBwYXRjaEZsYWcgPSAwLCBkeW5hbWljUHJvcHMgPSBudWxsLCBzaGFwZUZsYWcgPSB0eXBlID09PSBGcmFnbWVudCA/IDAgOiAxIC8qIFNoYXBlRmxhZ3MuRUxFTUVOVCAqLywgaXNCbG9ja05vZGUgPSBmYWxzZSwgbmVlZEZ1bGxDaGlsZHJlbk5vcm1hbGl6YXRpb24gPSBmYWxzZSkge1xuICAgIGNvbnN0IHZub2RlID0ge1xuICAgICAgICBfX3ZfaXNWTm9kZTogdHJ1ZSxcbiAgICAgICAgX192X3NraXA6IHRydWUsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHByb3BzLFxuICAgICAgICBrZXk6IHByb3BzICYmIG5vcm1hbGl6ZUtleShwcm9wcyksXG4gICAgICAgIHJlZjogcHJvcHMgJiYgbm9ybWFsaXplUmVmKHByb3BzKSxcbiAgICAgICAgc2NvcGVJZDogY3VycmVudFNjb3BlSWQsXG4gICAgICAgIHNsb3RTY29wZUlkczogbnVsbCxcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIGNvbXBvbmVudDogbnVsbCxcbiAgICAgICAgc3VzcGVuc2U6IG51bGwsXG4gICAgICAgIHNzQ29udGVudDogbnVsbCxcbiAgICAgICAgc3NGYWxsYmFjazogbnVsbCxcbiAgICAgICAgZGlyczogbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbjogbnVsbCxcbiAgICAgICAgZWw6IG51bGwsXG4gICAgICAgIGFuY2hvcjogbnVsbCxcbiAgICAgICAgdGFyZ2V0OiBudWxsLFxuICAgICAgICB0YXJnZXRBbmNob3I6IG51bGwsXG4gICAgICAgIHN0YXRpY0NvdW50OiAwLFxuICAgICAgICBzaGFwZUZsYWcsXG4gICAgICAgIHBhdGNoRmxhZyxcbiAgICAgICAgZHluYW1pY1Byb3BzLFxuICAgICAgICBkeW5hbWljQ2hpbGRyZW46IG51bGwsXG4gICAgICAgIGFwcENvbnRleHQ6IG51bGwsXG4gICAgICAgIGN0eDogY3VycmVudFJlbmRlcmluZ0luc3RhbmNlXG4gICAgfTtcbiAgICBpZiAobmVlZEZ1bGxDaGlsZHJlbk5vcm1hbGl6YXRpb24pIHtcbiAgICAgICAgbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIGNoaWxkcmVuKTtcbiAgICAgICAgLy8gbm9ybWFsaXplIHN1c3BlbnNlIGNoaWxkcmVuXG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxMjggLyogU2hhcGVGbGFncy5TVVNQRU5TRSAqLykge1xuICAgICAgICAgICAgdHlwZS5ub3JtYWxpemUodm5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgIC8vIGNvbXBpbGVkIGVsZW1lbnQgdm5vZGUgLSBpZiBjaGlsZHJlbiBpcyBwYXNzZWQsIG9ubHkgcG9zc2libGUgdHlwZXMgYXJlXG4gICAgICAgIC8vIHN0cmluZyBvciBBcnJheS5cbiAgICAgICAgdm5vZGUuc2hhcGVGbGFnIHw9IGlzU3RyaW5nKGNoaWxkcmVuKVxuICAgICAgICAgICAgPyA4IC8qIFNoYXBlRmxhZ3MuVEVYVF9DSElMRFJFTiAqL1xuICAgICAgICAgICAgOiAxNiAvKiBTaGFwZUZsYWdzLkFSUkFZX0NISUxEUkVOICovO1xuICAgIH1cbiAgICAvLyB2YWxpZGF0ZSBrZXlcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIHZub2RlLmtleSAhPT0gdm5vZGUua2V5KSB7XG4gICAgICAgIHdhcm4oYFZOb2RlIGNyZWF0ZWQgd2l0aCBpbnZhbGlkIGtleSAoTmFOKS4gVk5vZGUgdHlwZTpgLCB2bm9kZS50eXBlKTtcbiAgICB9XG4gICAgLy8gdHJhY2sgdm5vZGUgZm9yIGJsb2NrIHRyZWVcbiAgICBpZiAoaXNCbG9ja1RyZWVFbmFibGVkID4gMCAmJlxuICAgICAgICAvLyBhdm9pZCBhIGJsb2NrIG5vZGUgZnJvbSB0cmFja2luZyBpdHNlbGZcbiAgICAgICAgIWlzQmxvY2tOb2RlICYmXG4gICAgICAgIC8vIGhhcyBjdXJyZW50IHBhcmVudCBibG9ja1xuICAgICAgICBjdXJyZW50QmxvY2sgJiZcbiAgICAgICAgLy8gcHJlc2VuY2Ugb2YgYSBwYXRjaCBmbGFnIGluZGljYXRlcyB0aGlzIG5vZGUgbmVlZHMgcGF0Y2hpbmcgb24gdXBkYXRlcy5cbiAgICAgICAgLy8gY29tcG9uZW50IG5vZGVzIGFsc28gc2hvdWxkIGFsd2F5cyBiZSBwYXRjaGVkLCBiZWNhdXNlIGV2ZW4gaWYgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCBkb2Vzbid0IG5lZWQgdG8gdXBkYXRlLCBpdCBuZWVkcyB0byBwZXJzaXN0IHRoZSBpbnN0YW5jZSBvbiB0b1xuICAgICAgICAvLyB0aGUgbmV4dCB2bm9kZSBzbyB0aGF0IGl0IGNhbiBiZSBwcm9wZXJseSB1bm1vdW50ZWQgbGF0ZXIuXG4gICAgICAgICh2bm9kZS5wYXRjaEZsYWcgPiAwIHx8IHNoYXBlRmxhZyAmIDYgLyogU2hhcGVGbGFncy5DT01QT05FTlQgKi8pICYmXG4gICAgICAgIC8vIHRoZSBFVkVOVFMgZmxhZyBpcyBvbmx5IGZvciBoeWRyYXRpb24gYW5kIGlmIGl0IGlzIHRoZSBvbmx5IGZsYWcsIHRoZVxuICAgICAgICAvLyB2bm9kZSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgZHluYW1pYyBkdWUgdG8gaGFuZGxlciBjYWNoaW5nLlxuICAgICAgICB2bm9kZS5wYXRjaEZsYWcgIT09IDMyIC8qIFBhdGNoRmxhZ3MuSFlEUkFURV9FVkVOVFMgKi8pIHtcbiAgICAgICAgY3VycmVudEJsb2NrLnB1c2godm5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gdm5vZGU7XG59XG5jb25zdCBjcmVhdGVWTm9kZSA9ICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBjcmVhdGVWTm9kZVdpdGhBcmdzVHJhbnNmb3JtIDogX2NyZWF0ZVZOb2RlKTtcbmZ1bmN0aW9uIF9jcmVhdGVWTm9kZSh0eXBlLCBwcm9wcyA9IG51bGwsIGNoaWxkcmVuID0gbnVsbCwgcGF0Y2hGbGFnID0gMCwgZHluYW1pY1Byb3BzID0gbnVsbCwgaXNCbG9ja05vZGUgPSBmYWxzZSkge1xuICAgIGlmICghdHlwZSB8fCB0eXBlID09PSBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UKSB7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIXR5cGUpIHtcbiAgICAgICAgICAgIHdhcm4oYEludmFsaWQgdm5vZGUgdHlwZSB3aGVuIGNyZWF0aW5nIHZub2RlOiAke3R5cGV9LmApO1xuICAgICAgICB9XG4gICAgICAgIHR5cGUgPSBDb21tZW50O1xuICAgIH1cbiAgICBpZiAoaXNWTm9kZSh0eXBlKSkge1xuICAgICAgICAvLyBjcmVhdGVWTm9kZSByZWNlaXZpbmcgYW4gZXhpc3Rpbmcgdm5vZGUuIFRoaXMgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgICAgIC8vIDxjb21wb25lbnQgOmlzPVwidm5vZGVcIi8+XG4gICAgICAgIC8vICMyMDc4IG1ha2Ugc3VyZSB0byBtZXJnZSByZWZzIGR1cmluZyB0aGUgY2xvbmUgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdFxuICAgICAgICBjb25zdCBjbG9uZWQgPSBjbG9uZVZOb2RlKHR5cGUsIHByb3BzLCB0cnVlIC8qIG1lcmdlUmVmOiB0cnVlICovKTtcbiAgICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBub3JtYWxpemVDaGlsZHJlbihjbG9uZWQsIGNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNCbG9ja1RyZWVFbmFibGVkID4gMCAmJiAhaXNCbG9ja05vZGUgJiYgY3VycmVudEJsb2NrKSB7XG4gICAgICAgICAgICBpZiAoY2xvbmVkLnNoYXBlRmxhZyAmIDYgLyogU2hhcGVGbGFncy5DT01QT05FTlQgKi8pIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2tbY3VycmVudEJsb2NrLmluZGV4T2YodHlwZSldID0gY2xvbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEJsb2NrLnB1c2goY2xvbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjbG9uZWQucGF0Y2hGbGFnIHw9IC0yIC8qIFBhdGNoRmxhZ3MuQkFJTCAqLztcbiAgICAgICAgcmV0dXJuIGNsb25lZDtcbiAgICB9XG4gICAgLy8gY2xhc3MgY29tcG9uZW50IG5vcm1hbGl6YXRpb24uXG4gICAgaWYgKGlzQ2xhc3NDb21wb25lbnQodHlwZSkpIHtcbiAgICAgICAgdHlwZSA9IHR5cGUuX192Y2NPcHRzO1xuICAgIH1cbiAgICAvLyBjbGFzcyAmIHN0eWxlIG5vcm1hbGl6YXRpb24uXG4gICAgaWYgKHByb3BzKSB7XG4gICAgICAgIC8vIGZvciByZWFjdGl2ZSBvciBwcm94eSBvYmplY3RzLCB3ZSBuZWVkIHRvIGNsb25lIGl0IHRvIGVuYWJsZSBtdXRhdGlvbi5cbiAgICAgICAgcHJvcHMgPSBndWFyZFJlYWN0aXZlUHJvcHMocHJvcHMpO1xuICAgICAgICBsZXQgeyBjbGFzczoga2xhc3MsIHN0eWxlIH0gPSBwcm9wcztcbiAgICAgICAgaWYgKGtsYXNzICYmICFpc1N0cmluZyhrbGFzcykpIHtcbiAgICAgICAgICAgIHByb3BzLmNsYXNzID0gbm9ybWFsaXplQ2xhc3Moa2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc09iamVjdChzdHlsZSkpIHtcbiAgICAgICAgICAgIC8vIHJlYWN0aXZlIHN0YXRlIG9iamVjdHMgbmVlZCB0byBiZSBjbG9uZWQgc2luY2UgdGhleSBhcmUgbGlrZWx5IHRvIGJlXG4gICAgICAgICAgICAvLyBtdXRhdGVkXG4gICAgICAgICAgICBpZiAoaXNQcm94eShzdHlsZSkgJiYgIWlzQXJyYXkoc3R5bGUpKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUgPSBleHRlbmQoe30sIHN0eWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb3BzLnN0eWxlID0gbm9ybWFsaXplU3R5bGUoc3R5bGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGVuY29kZSB0aGUgdm5vZGUgdHlwZSBpbmZvcm1hdGlvbiBpbnRvIGEgYml0bWFwXG4gICAgY29uc3Qgc2hhcGVGbGFnID0gaXNTdHJpbmcodHlwZSlcbiAgICAgICAgPyAxIC8qIFNoYXBlRmxhZ3MuRUxFTUVOVCAqL1xuICAgICAgICA6IGlzU3VzcGVuc2UodHlwZSlcbiAgICAgICAgICAgID8gMTI4IC8qIFNoYXBlRmxhZ3MuU1VTUEVOU0UgKi9cbiAgICAgICAgICAgIDogaXNUZWxlcG9ydCh0eXBlKVxuICAgICAgICAgICAgICAgID8gNjQgLyogU2hhcGVGbGFncy5URUxFUE9SVCAqL1xuICAgICAgICAgICAgICAgIDogaXNPYmplY3QodHlwZSlcbiAgICAgICAgICAgICAgICAgICAgPyA0IC8qIFNoYXBlRmxhZ3MuU1RBVEVGVUxfQ09NUE9ORU5UICovXG4gICAgICAgICAgICAgICAgICAgIDogaXNGdW5jdGlvbih0eXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAyIC8qIFNoYXBlRmxhZ3MuRlVOQ1RJT05BTF9DT01QT05FTlQgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIDogMDtcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIHNoYXBlRmxhZyAmIDQgLyogU2hhcGVGbGFncy5TVEFURUZVTF9DT01QT05FTlQgKi8gJiYgaXNQcm94eSh0eXBlKSkge1xuICAgICAgICB0eXBlID0gdG9SYXcodHlwZSk7XG4gICAgICAgIHdhcm4oYFZ1ZSByZWNlaXZlZCBhIENvbXBvbmVudCB3aGljaCB3YXMgbWFkZSBhIHJlYWN0aXZlIG9iamVjdC4gVGhpcyBjYW4gYCArXG4gICAgICAgICAgICBgbGVhZCB0byB1bm5lY2Vzc2FyeSBwZXJmb3JtYW5jZSBvdmVyaGVhZCwgYW5kIHNob3VsZCBiZSBhdm9pZGVkIGJ5IGAgK1xuICAgICAgICAgICAgYG1hcmtpbmcgdGhlIGNvbXBvbmVudCB3aXRoIFxcYG1hcmtSYXdcXGAgb3IgdXNpbmcgXFxgc2hhbGxvd1JlZlxcYCBgICtcbiAgICAgICAgICAgIGBpbnN0ZWFkIG9mIFxcYHJlZlxcYC5gLCBgXFxuQ29tcG9uZW50IHRoYXQgd2FzIG1hZGUgcmVhY3RpdmU6IGAsIHR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQmFzZVZOb2RlKHR5cGUsIHByb3BzLCBjaGlsZHJlbiwgcGF0Y2hGbGFnLCBkeW5hbWljUHJvcHMsIHNoYXBlRmxhZywgaXNCbG9ja05vZGUsIHRydWUpO1xufVxuZnVuY3Rpb24gZ3VhcmRSZWFjdGl2ZVByb3BzKHByb3BzKSB7XG4gICAgaWYgKCFwcm9wcylcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGlzUHJveHkocHJvcHMpIHx8IEludGVybmFsT2JqZWN0S2V5IGluIHByb3BzXG4gICAgICAgID8gZXh0ZW5kKHt9LCBwcm9wcylcbiAgICAgICAgOiBwcm9wcztcbn1cbmZ1bmN0aW9uIGNsb25lVk5vZGUodm5vZGUsIGV4dHJhUHJvcHMsIG1lcmdlUmVmID0gZmFsc2UpIHtcbiAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgTk9UIHVzaW5nIHNwcmVhZCBvciBleHRlbmQgdG8gYXZvaWQgdGhlIHJ1bnRpbWVcbiAgICAvLyBrZXkgZW51bWVyYXRpb24gY29zdC5cbiAgICBjb25zdCB7IHByb3BzLCByZWYsIHBhdGNoRmxhZywgY2hpbGRyZW4gfSA9IHZub2RlO1xuICAgIGNvbnN0IG1lcmdlZFByb3BzID0gZXh0cmFQcm9wcyA/IG1lcmdlUHJvcHMocHJvcHMgfHwge30sIGV4dHJhUHJvcHMpIDogcHJvcHM7XG4gICAgY29uc3QgY2xvbmVkID0ge1xuICAgICAgICBfX3ZfaXNWTm9kZTogdHJ1ZSxcbiAgICAgICAgX192X3NraXA6IHRydWUsXG4gICAgICAgIHR5cGU6IHZub2RlLnR5cGUsXG4gICAgICAgIHByb3BzOiBtZXJnZWRQcm9wcyxcbiAgICAgICAga2V5OiBtZXJnZWRQcm9wcyAmJiBub3JtYWxpemVLZXkobWVyZ2VkUHJvcHMpLFxuICAgICAgICByZWY6IGV4dHJhUHJvcHMgJiYgZXh0cmFQcm9wcy5yZWZcbiAgICAgICAgICAgID8gLy8gIzIwNzggaW4gdGhlIGNhc2Ugb2YgPGNvbXBvbmVudCA6aXM9XCJ2bm9kZVwiIHJlZj1cImV4dHJhXCIvPlxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2bm9kZSBpdHNlbGYgYWxyZWFkeSBoYXMgYSByZWYsIGNsb25lVk5vZGUgd2lsbCBuZWVkIHRvIG1lcmdlXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJlZnMgc28gdGhlIHNpbmdsZSB2bm9kZSBjYW4gYmUgc2V0IG9uIG11bHRpcGxlIHJlZnNcbiAgICAgICAgICAgICAgICBtZXJnZVJlZiAmJiByZWZcbiAgICAgICAgICAgICAgICAgICAgPyBpc0FycmF5KHJlZilcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcmVmLmNvbmNhdChub3JtYWxpemVSZWYoZXh0cmFQcm9wcykpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFtyZWYsIG5vcm1hbGl6ZVJlZihleHRyYVByb3BzKV1cbiAgICAgICAgICAgICAgICAgICAgOiBub3JtYWxpemVSZWYoZXh0cmFQcm9wcylcbiAgICAgICAgICAgIDogcmVmLFxuICAgICAgICBzY29wZUlkOiB2bm9kZS5zY29wZUlkLFxuICAgICAgICBzbG90U2NvcGVJZHM6IHZub2RlLnNsb3RTY29wZUlkcyxcbiAgICAgICAgY2hpbGRyZW46IChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiBwYXRjaEZsYWcgPT09IC0xIC8qIFBhdGNoRmxhZ3MuSE9JU1RFRCAqLyAmJiBpc0FycmF5KGNoaWxkcmVuKVxuICAgICAgICAgICAgPyBjaGlsZHJlbi5tYXAoZGVlcENsb25lVk5vZGUpXG4gICAgICAgICAgICA6IGNoaWxkcmVuLFxuICAgICAgICB0YXJnZXQ6IHZub2RlLnRhcmdldCxcbiAgICAgICAgdGFyZ2V0QW5jaG9yOiB2bm9kZS50YXJnZXRBbmNob3IsXG4gICAgICAgIHN0YXRpY0NvdW50OiB2bm9kZS5zdGF0aWNDb3VudCxcbiAgICAgICAgc2hhcGVGbGFnOiB2bm9kZS5zaGFwZUZsYWcsXG4gICAgICAgIC8vIGlmIHRoZSB2bm9kZSBpcyBjbG9uZWQgd2l0aCBleHRyYSBwcm9wcywgd2UgY2FuIG5vIGxvbmdlciBhc3N1bWUgaXRzXG4gICAgICAgIC8vIGV4aXN0aW5nIHBhdGNoIGZsYWcgdG8gYmUgcmVsaWFibGUgYW5kIG5lZWQgdG8gYWRkIHRoZSBGVUxMX1BST1BTIGZsYWcuXG4gICAgICAgIC8vIG5vdGU6IHByZXNlcnZlIGZsYWcgZm9yIGZyYWdtZW50cyBzaW5jZSB0aGV5IHVzZSB0aGUgZmxhZyBmb3IgY2hpbGRyZW5cbiAgICAgICAgLy8gZmFzdCBwYXRocyBvbmx5LlxuICAgICAgICBwYXRjaEZsYWc6IGV4dHJhUHJvcHMgJiYgdm5vZGUudHlwZSAhPT0gRnJhZ21lbnRcbiAgICAgICAgICAgID8gcGF0Y2hGbGFnID09PSAtMSAvLyBob2lzdGVkIG5vZGVcbiAgICAgICAgICAgICAgICA/IDE2IC8qIFBhdGNoRmxhZ3MuRlVMTF9QUk9QUyAqL1xuICAgICAgICAgICAgICAgIDogcGF0Y2hGbGFnIHwgMTYgLyogUGF0Y2hGbGFncy5GVUxMX1BST1BTICovXG4gICAgICAgICAgICA6IHBhdGNoRmxhZyxcbiAgICAgICAgZHluYW1pY1Byb3BzOiB2bm9kZS5keW5hbWljUHJvcHMsXG4gICAgICAgIGR5bmFtaWNDaGlsZHJlbjogdm5vZGUuZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICBhcHBDb250ZXh0OiB2bm9kZS5hcHBDb250ZXh0LFxuICAgICAgICBkaXJzOiB2bm9kZS5kaXJzLFxuICAgICAgICB0cmFuc2l0aW9uOiB2bm9kZS50cmFuc2l0aW9uLFxuICAgICAgICAvLyBUaGVzZSBzaG91bGQgdGVjaG5pY2FsbHkgb25seSBiZSBub24tbnVsbCBvbiBtb3VudGVkIFZOb2Rlcy4gSG93ZXZlcixcbiAgICAgICAgLy8gdGhleSAqc2hvdWxkKiBiZSBjb3BpZWQgZm9yIGtlcHQtYWxpdmUgdm5vZGVzLiBTbyB3ZSBqdXN0IGFsd2F5cyBjb3B5XG4gICAgICAgIC8vIHRoZW0gc2luY2UgdGhlbSBiZWluZyBub24tbnVsbCBkdXJpbmcgYSBtb3VudCBkb2Vzbid0IGFmZmVjdCB0aGUgbG9naWMgYXNcbiAgICAgICAgLy8gdGhleSB3aWxsIHNpbXBseSBiZSBvdmVyd3JpdHRlbi5cbiAgICAgICAgY29tcG9uZW50OiB2bm9kZS5jb21wb25lbnQsXG4gICAgICAgIHN1c3BlbnNlOiB2bm9kZS5zdXNwZW5zZSxcbiAgICAgICAgc3NDb250ZW50OiB2bm9kZS5zc0NvbnRlbnQgJiYgY2xvbmVWTm9kZSh2bm9kZS5zc0NvbnRlbnQpLFxuICAgICAgICBzc0ZhbGxiYWNrOiB2bm9kZS5zc0ZhbGxiYWNrICYmIGNsb25lVk5vZGUodm5vZGUuc3NGYWxsYmFjayksXG4gICAgICAgIGVsOiB2bm9kZS5lbCxcbiAgICAgICAgYW5jaG9yOiB2bm9kZS5hbmNob3IsXG4gICAgICAgIGN0eDogdm5vZGUuY3R4LFxuICAgICAgICBjZTogdm5vZGUuY2VcbiAgICB9O1xuICAgIHJldHVybiBjbG9uZWQ7XG59XG4vKipcbiAqIERldiBvbmx5LCBmb3IgSE1SIG9mIGhvaXN0ZWQgdm5vZGVzIHJldXNlZCBpbiB2LWZvclxuICogaHR0cHM6Ly9naXRodWIuY29tL3ZpdGVqcy92aXRlL2lzc3Vlcy8yMDIyXG4gKi9cbmZ1bmN0aW9uIGRlZXBDbG9uZVZOb2RlKHZub2RlKSB7XG4gICAgY29uc3QgY2xvbmVkID0gY2xvbmVWTm9kZSh2bm9kZSk7XG4gICAgaWYgKGlzQXJyYXkodm5vZGUuY2hpbGRyZW4pKSB7XG4gICAgICAgIGNsb25lZC5jaGlsZHJlbiA9IHZub2RlLmNoaWxkcmVuLm1hcChkZWVwQ2xvbmVWTm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBjbG9uZWQ7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRleHRWTm9kZSh0ZXh0ID0gJyAnLCBmbGFnID0gMCkge1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShUZXh0LCBudWxsLCB0ZXh0LCBmbGFnKTtcbn1cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3RhdGljVk5vZGUoY29udGVudCwgbnVtYmVyT2ZOb2Rlcykge1xuICAgIC8vIEEgc3RhdGljIHZub2RlIGNhbiBjb250YWluIG11bHRpcGxlIHN0cmluZ2lmaWVkIGVsZW1lbnRzLCBhbmQgdGhlIG51bWJlclxuICAgIC8vIG9mIGVsZW1lbnRzIGlzIG5lY2Vzc2FyeSBmb3IgaHlkcmF0aW9uLlxuICAgIGNvbnN0IHZub2RlID0gY3JlYXRlVk5vZGUoU3RhdGljLCBudWxsLCBjb250ZW50KTtcbiAgICB2bm9kZS5zdGF0aWNDb3VudCA9IG51bWJlck9mTm9kZXM7XG4gICAgcmV0dXJuIHZub2RlO1xufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjcmVhdGVDb21tZW50Vk5vZGUodGV4dCA9ICcnLCBcbi8vIHdoZW4gdXNlZCBhcyB0aGUgdi1lbHNlIGJyYW5jaCwgdGhlIGNvbW1lbnQgbm9kZSBtdXN0IGJlIGNyZWF0ZWQgYXMgYVxuLy8gYmxvY2sgdG8gZW5zdXJlIGNvcnJlY3QgdXBkYXRlcy5cbmFzQmxvY2sgPSBmYWxzZSkge1xuICAgIHJldHVybiBhc0Jsb2NrXG4gICAgICAgID8gKG9wZW5CbG9jaygpLCBjcmVhdGVCbG9jayhDb21tZW50LCBudWxsLCB0ZXh0KSlcbiAgICAgICAgOiBjcmVhdGVWTm9kZShDb21tZW50LCBudWxsLCB0ZXh0KTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZOb2RlKGNoaWxkKSB7XG4gICAgaWYgKGNoaWxkID09IG51bGwgfHwgdHlwZW9mIGNoaWxkID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgLy8gZW1wdHkgcGxhY2Vob2xkZXJcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKENvbW1lbnQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0FycmF5KGNoaWxkKSkge1xuICAgICAgICAvLyBmcmFnbWVudFxuICAgICAgICByZXR1cm4gY3JlYXRlVk5vZGUoRnJhZ21lbnQsIG51bGwsIFxuICAgICAgICAvLyAjMzY2NiwgYXZvaWQgcmVmZXJlbmNlIHBvbGx1dGlvbiB3aGVuIHJldXNpbmcgdm5vZGVcbiAgICAgICAgY2hpbGQuc2xpY2UoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gYWxyZWFkeSB2bm9kZSwgdGhpcyBzaG91bGQgYmUgdGhlIG1vc3QgY29tbW9uIHNpbmNlIGNvbXBpbGVkIHRlbXBsYXRlc1xuICAgICAgICAvLyBhbHdheXMgcHJvZHVjZSBhbGwtdm5vZGUgY2hpbGRyZW4gYXJyYXlzXG4gICAgICAgIHJldHVybiBjbG9uZUlmTW91bnRlZChjaGlsZCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBzdHJpbmdzIGFuZCBudW1iZXJzXG4gICAgICAgIHJldHVybiBjcmVhdGVWTm9kZShUZXh0LCBudWxsLCBTdHJpbmcoY2hpbGQpKTtcbiAgICB9XG59XG4vLyBvcHRpbWl6ZWQgbm9ybWFsaXphdGlvbiBmb3IgdGVtcGxhdGUtY29tcGlsZWQgcmVuZGVyIGZuc1xuZnVuY3Rpb24gY2xvbmVJZk1vdW50ZWQoY2hpbGQpIHtcbiAgICByZXR1cm4gKGNoaWxkLmVsID09PSBudWxsICYmIGNoaWxkLnBhdGNoRmxhZyAhPT0gLTEgLyogUGF0Y2hGbGFncy5IT0lTVEVEICovKSB8fFxuICAgICAgICBjaGlsZC5tZW1vXG4gICAgICAgID8gY2hpbGRcbiAgICAgICAgOiBjbG9uZVZOb2RlKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbikge1xuICAgIGxldCB0eXBlID0gMDtcbiAgICBjb25zdCB7IHNoYXBlRmxhZyB9ID0gdm5vZGU7XG4gICAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICAgICAgY2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICB0eXBlID0gMTYgLyogU2hhcGVGbGFncy5BUlJBWV9DSElMRFJFTiAqLztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoc2hhcGVGbGFnICYgKDEgLyogU2hhcGVGbGFncy5FTEVNRU5UICovIHwgNjQgLyogU2hhcGVGbGFncy5URUxFUE9SVCAqLykpIHtcbiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBzbG90IHRvIHBsYWluIGNoaWxkcmVuIGZvciBwbGFpbiBlbGVtZW50IGFuZCBUZWxlcG9ydFxuICAgICAgICAgICAgY29uc3Qgc2xvdCA9IGNoaWxkcmVuLmRlZmF1bHQ7XG4gICAgICAgICAgICBpZiAoc2xvdCkge1xuICAgICAgICAgICAgICAgIC8vIF9jIG1hcmtlciBpcyBhZGRlZCBieSB3aXRoQ3R4KCkgaW5kaWNhdGluZyB0aGlzIGlzIGEgY29tcGlsZWQgc2xvdFxuICAgICAgICAgICAgICAgIHNsb3QuX2MgJiYgKHNsb3QuX2QgPSBmYWxzZSk7XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIHNsb3QoKSk7XG4gICAgICAgICAgICAgICAgc2xvdC5fYyAmJiAoc2xvdC5fZCA9IHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdHlwZSA9IDMyIC8qIFNoYXBlRmxhZ3MuU0xPVFNfQ0hJTERSRU4gKi87XG4gICAgICAgICAgICBjb25zdCBzbG90RmxhZyA9IGNoaWxkcmVuLl87XG4gICAgICAgICAgICBpZiAoIXNsb3RGbGFnICYmICEoSW50ZXJuYWxPYmplY3RLZXkgaW4gY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4uX2N0eCA9IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNsb3RGbGFnID09PSAzIC8qIFNsb3RGbGFncy5GT1JXQVJERUQgKi8gJiYgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgLy8gYSBjaGlsZCBjb21wb25lbnQgcmVjZWl2ZXMgZm9yd2FyZGVkIHNsb3RzIGZyb20gdGhlIHBhcmVudC5cbiAgICAgICAgICAgICAgICAvLyBpdHMgc2xvdCB0eXBlIGlzIGRldGVybWluZWQgYnkgaXRzIHBhcmVudCdzIHNsb3QgdHlwZS5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLnNsb3RzLl8gPT09IDEgLyogU2xvdEZsYWdzLlNUQUJMRSAqLykge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5fID0gMSAvKiBTbG90RmxhZ3MuU1RBQkxFICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4uXyA9IDIgLyogU2xvdEZsYWdzLkRZTkFNSUMgKi87XG4gICAgICAgICAgICAgICAgICAgIHZub2RlLnBhdGNoRmxhZyB8PSAxMDI0IC8qIFBhdGNoRmxhZ3MuRFlOQU1JQ19TTE9UUyAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNGdW5jdGlvbihjaGlsZHJlbikpIHtcbiAgICAgICAgY2hpbGRyZW4gPSB7IGRlZmF1bHQ6IGNoaWxkcmVuLCBfY3R4OiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgfTtcbiAgICAgICAgdHlwZSA9IDMyIC8qIFNoYXBlRmxhZ3MuU0xPVFNfQ0hJTERSRU4gKi87XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjaGlsZHJlbiA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgICAgIC8vIGZvcmNlIHRlbGVwb3J0IGNoaWxkcmVuIHRvIGFycmF5IHNvIGl0IGNhbiBiZSBtb3ZlZCBhcm91bmRcbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDY0IC8qIFNoYXBlRmxhZ3MuVEVMRVBPUlQgKi8pIHtcbiAgICAgICAgICAgIHR5cGUgPSAxNiAvKiBTaGFwZUZsYWdzLkFSUkFZX0NISUxEUkVOICovO1xuICAgICAgICAgICAgY2hpbGRyZW4gPSBbY3JlYXRlVGV4dFZOb2RlKGNoaWxkcmVuKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0eXBlID0gOCAvKiBTaGFwZUZsYWdzLlRFWFRfQ0hJTERSRU4gKi87XG4gICAgICAgIH1cbiAgICB9XG4gICAgdm5vZGUuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICB2bm9kZS5zaGFwZUZsYWcgfD0gdHlwZTtcbn1cbmZ1bmN0aW9uIG1lcmdlUHJvcHMoLi4uYXJncykge1xuICAgIGNvbnN0IHJldCA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB0b01lcmdlID0gYXJnc1tpXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdG9NZXJnZSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgICAgIGlmIChyZXQuY2xhc3MgIT09IHRvTWVyZ2UuY2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0LmNsYXNzID0gbm9ybWFsaXplQ2xhc3MoW3JldC5jbGFzcywgdG9NZXJnZS5jbGFzc10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gJ3N0eWxlJykge1xuICAgICAgICAgICAgICAgIHJldC5zdHlsZSA9IG5vcm1hbGl6ZVN0eWxlKFtyZXQuc3R5bGUsIHRvTWVyZ2Uuc3R5bGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzT24oa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gcmV0W2tleV07XG4gICAgICAgICAgICAgICAgY29uc3QgaW5jb21pbmcgPSB0b01lcmdlW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGluY29taW5nICYmXG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nICE9PSBpbmNvbWluZyAmJlxuICAgICAgICAgICAgICAgICAgICAhKGlzQXJyYXkoZXhpc3RpbmcpICYmIGV4aXN0aW5nLmluY2x1ZGVzKGluY29taW5nKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0W2tleV0gPSBleGlzdGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBbXS5jb25jYXQoZXhpc3RpbmcsIGluY29taW5nKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpbmNvbWluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChrZXkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmV0W2tleV0gPSB0b01lcmdlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbmZ1bmN0aW9uIGludm9rZVZOb2RlSG9vayhob29rLCBpbnN0YW5jZSwgdm5vZGUsIHByZXZWTm9kZSA9IG51bGwpIHtcbiAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhob29rLCBpbnN0YW5jZSwgNyAvKiBFcnJvckNvZGVzLlZOT0RFX0hPT0sgKi8sIFtcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIHByZXZWTm9kZVxuICAgIF0pO1xufVxuXG5jb25zdCBlbXB0eUFwcENvbnRleHQgPSBjcmVhdGVBcHBDb250ZXh0KCk7XG5sZXQgdWlkID0gMDtcbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHZub2RlLCBwYXJlbnQsIHN1c3BlbnNlKSB7XG4gICAgY29uc3QgdHlwZSA9IHZub2RlLnR5cGU7XG4gICAgLy8gaW5oZXJpdCBwYXJlbnQgYXBwIGNvbnRleHQgLSBvciAtIGlmIHJvb3QsIGFkb3B0IGZyb20gcm9vdCB2bm9kZVxuICAgIGNvbnN0IGFwcENvbnRleHQgPSAocGFyZW50ID8gcGFyZW50LmFwcENvbnRleHQgOiB2bm9kZS5hcHBDb250ZXh0KSB8fCBlbXB0eUFwcENvbnRleHQ7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB7XG4gICAgICAgIHVpZDogdWlkKyssXG4gICAgICAgIHZub2RlLFxuICAgICAgICB0eXBlLFxuICAgICAgICBwYXJlbnQsXG4gICAgICAgIGFwcENvbnRleHQsXG4gICAgICAgIHJvb3Q6IG51bGwsXG4gICAgICAgIG5leHQ6IG51bGwsXG4gICAgICAgIHN1YlRyZWU6IG51bGwsXG4gICAgICAgIGVmZmVjdDogbnVsbCxcbiAgICAgICAgdXBkYXRlOiBudWxsLFxuICAgICAgICBzY29wZTogbmV3IEVmZmVjdFNjb3BlKHRydWUgLyogZGV0YWNoZWQgKi8pLFxuICAgICAgICByZW5kZXI6IG51bGwsXG4gICAgICAgIHByb3h5OiBudWxsLFxuICAgICAgICBleHBvc2VkOiBudWxsLFxuICAgICAgICBleHBvc2VQcm94eTogbnVsbCxcbiAgICAgICAgd2l0aFByb3h5OiBudWxsLFxuICAgICAgICBwcm92aWRlczogcGFyZW50ID8gcGFyZW50LnByb3ZpZGVzIDogT2JqZWN0LmNyZWF0ZShhcHBDb250ZXh0LnByb3ZpZGVzKSxcbiAgICAgICAgYWNjZXNzQ2FjaGU6IG51bGwsXG4gICAgICAgIHJlbmRlckNhY2hlOiBbXSxcbiAgICAgICAgLy8gbG9jYWwgcmVzb2x2ZWQgYXNzZXRzXG4gICAgICAgIGNvbXBvbmVudHM6IG51bGwsXG4gICAgICAgIGRpcmVjdGl2ZXM6IG51bGwsXG4gICAgICAgIC8vIHJlc29sdmVkIHByb3BzIGFuZCBlbWl0cyBvcHRpb25zXG4gICAgICAgIHByb3BzT3B0aW9uczogbm9ybWFsaXplUHJvcHNPcHRpb25zKHR5cGUsIGFwcENvbnRleHQpLFxuICAgICAgICBlbWl0c09wdGlvbnM6IG5vcm1hbGl6ZUVtaXRzT3B0aW9ucyh0eXBlLCBhcHBDb250ZXh0KSxcbiAgICAgICAgLy8gZW1pdFxuICAgICAgICBlbWl0OiBudWxsLFxuICAgICAgICBlbWl0dGVkOiBudWxsLFxuICAgICAgICAvLyBwcm9wcyBkZWZhdWx0IHZhbHVlXG4gICAgICAgIHByb3BzRGVmYXVsdHM6IEVNUFRZX09CSixcbiAgICAgICAgLy8gaW5oZXJpdEF0dHJzXG4gICAgICAgIGluaGVyaXRBdHRyczogdHlwZS5pbmhlcml0QXR0cnMsXG4gICAgICAgIC8vIHN0YXRlXG4gICAgICAgIGN0eDogRU1QVFlfT0JKLFxuICAgICAgICBkYXRhOiBFTVBUWV9PQkosXG4gICAgICAgIHByb3BzOiBFTVBUWV9PQkosXG4gICAgICAgIGF0dHJzOiBFTVBUWV9PQkosXG4gICAgICAgIHNsb3RzOiBFTVBUWV9PQkosXG4gICAgICAgIHJlZnM6IEVNUFRZX09CSixcbiAgICAgICAgc2V0dXBTdGF0ZTogRU1QVFlfT0JKLFxuICAgICAgICBzZXR1cENvbnRleHQ6IG51bGwsXG4gICAgICAgIC8vIHN1c3BlbnNlIHJlbGF0ZWRcbiAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgIHN1c3BlbnNlSWQ6IHN1c3BlbnNlID8gc3VzcGVuc2UucGVuZGluZ0lkIDogMCxcbiAgICAgICAgYXN5bmNEZXA6IG51bGwsXG4gICAgICAgIGFzeW5jUmVzb2x2ZWQ6IGZhbHNlLFxuICAgICAgICAvLyBsaWZlY3ljbGUgaG9va3NcbiAgICAgICAgLy8gbm90IHVzaW5nIGVudW1zIGhlcmUgYmVjYXVzZSBpdCByZXN1bHRzIGluIGNvbXB1dGVkIHByb3BlcnRpZXNcbiAgICAgICAgaXNNb3VudGVkOiBmYWxzZSxcbiAgICAgICAgaXNVbm1vdW50ZWQ6IGZhbHNlLFxuICAgICAgICBpc0RlYWN0aXZhdGVkOiBmYWxzZSxcbiAgICAgICAgYmM6IG51bGwsXG4gICAgICAgIGM6IG51bGwsXG4gICAgICAgIGJtOiBudWxsLFxuICAgICAgICBtOiBudWxsLFxuICAgICAgICBidTogbnVsbCxcbiAgICAgICAgdTogbnVsbCxcbiAgICAgICAgdW06IG51bGwsXG4gICAgICAgIGJ1bTogbnVsbCxcbiAgICAgICAgZGE6IG51bGwsXG4gICAgICAgIGE6IG51bGwsXG4gICAgICAgIHJ0ZzogbnVsbCxcbiAgICAgICAgcnRjOiBudWxsLFxuICAgICAgICBlYzogbnVsbCxcbiAgICAgICAgc3A6IG51bGxcbiAgICB9O1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgaW5zdGFuY2UuY3R4ID0gY3JlYXRlRGV2UmVuZGVyQ29udGV4dChpbnN0YW5jZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpbnN0YW5jZS5jdHggPSB7IF86IGluc3RhbmNlIH07XG4gICAgfVxuICAgIGluc3RhbmNlLnJvb3QgPSBwYXJlbnQgPyBwYXJlbnQucm9vdCA6IGluc3RhbmNlO1xuICAgIGluc3RhbmNlLmVtaXQgPSBlbWl0LmJpbmQobnVsbCwgaW5zdGFuY2UpO1xuICAgIC8vIGFwcGx5IGN1c3RvbSBlbGVtZW50IHNwZWNpYWwgaGFuZGxpbmdcbiAgICBpZiAodm5vZGUuY2UpIHtcbiAgICAgICAgdm5vZGUuY2UoaW5zdGFuY2UpO1xuICAgIH1cbiAgICByZXR1cm4gaW5zdGFuY2U7XG59XG5sZXQgY3VycmVudEluc3RhbmNlID0gbnVsbDtcbmNvbnN0IGdldEN1cnJlbnRJbnN0YW5jZSA9ICgpID0+IGN1cnJlbnRJbnN0YW5jZSB8fCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U7XG5jb25zdCBzZXRDdXJyZW50SW5zdGFuY2UgPSAoaW5zdGFuY2UpID0+IHtcbiAgICBjdXJyZW50SW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICBpbnN0YW5jZS5zY29wZS5vbigpO1xufTtcbmNvbnN0IHVuc2V0Q3VycmVudEluc3RhbmNlID0gKCkgPT4ge1xuICAgIGN1cnJlbnRJbnN0YW5jZSAmJiBjdXJyZW50SW5zdGFuY2Uuc2NvcGUub2ZmKCk7XG4gICAgY3VycmVudEluc3RhbmNlID0gbnVsbDtcbn07XG5jb25zdCBpc0J1aWx0SW5UYWcgPSAvKiNfX1BVUkVfXyovIG1ha2VNYXAoJ3Nsb3QsY29tcG9uZW50Jyk7XG5mdW5jdGlvbiB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSwgY29uZmlnKSB7XG4gICAgY29uc3QgYXBwSXNOYXRpdmVUYWcgPSBjb25maWcuaXNOYXRpdmVUYWcgfHwgTk87XG4gICAgaWYgKGlzQnVpbHRJblRhZyhuYW1lKSB8fCBhcHBJc05hdGl2ZVRhZyhuYW1lKSkge1xuICAgICAgICB3YXJuKCdEbyBub3QgdXNlIGJ1aWx0LWluIG9yIHJlc2VydmVkIEhUTUwgZWxlbWVudHMgYXMgY29tcG9uZW50IGlkOiAnICsgbmFtZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNTdGF0ZWZ1bENvbXBvbmVudChpbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnN0YW5jZS52bm9kZS5zaGFwZUZsYWcgJiA0IC8qIFNoYXBlRmxhZ3MuU1RBVEVGVUxfQ09NUE9ORU5UICovO1xufVxubGV0IGlzSW5TU1JDb21wb25lbnRTZXR1cCA9IGZhbHNlO1xuZnVuY3Rpb24gc2V0dXBDb21wb25lbnQoaW5zdGFuY2UsIGlzU1NSID0gZmFsc2UpIHtcbiAgICBpc0luU1NSQ29tcG9uZW50U2V0dXAgPSBpc1NTUjtcbiAgICBjb25zdCB7IHByb3BzLCBjaGlsZHJlbiB9ID0gaW5zdGFuY2Uudm5vZGU7XG4gICAgY29uc3QgaXNTdGF0ZWZ1bCA9IGlzU3RhdGVmdWxDb21wb25lbnQoaW5zdGFuY2UpO1xuICAgIGluaXRQcm9wcyhpbnN0YW5jZSwgcHJvcHMsIGlzU3RhdGVmdWwsIGlzU1NSKTtcbiAgICBpbml0U2xvdHMoaW5zdGFuY2UsIGNoaWxkcmVuKTtcbiAgICBjb25zdCBzZXR1cFJlc3VsdCA9IGlzU3RhdGVmdWxcbiAgICAgICAgPyBzZXR1cFN0YXRlZnVsQ29tcG9uZW50KGluc3RhbmNlLCBpc1NTUilcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaXNJblNTUkNvbXBvbmVudFNldHVwID0gZmFsc2U7XG4gICAgcmV0dXJuIHNldHVwUmVzdWx0O1xufVxuZnVuY3Rpb24gc2V0dXBTdGF0ZWZ1bENvbXBvbmVudChpbnN0YW5jZSwgaXNTU1IpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgQ29tcG9uZW50ID0gaW5zdGFuY2UudHlwZTtcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgIGlmIChDb21wb25lbnQubmFtZSkge1xuICAgICAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKENvbXBvbmVudC5uYW1lLCBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKENvbXBvbmVudC5jb21wb25lbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKENvbXBvbmVudC5jb21wb25lbnRzKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZXNbaV0sIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29tcG9uZW50LmRpcmVjdGl2ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoQ29tcG9uZW50LmRpcmVjdGl2ZXMpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRlRGlyZWN0aXZlTmFtZShuYW1lc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKENvbXBvbmVudC5jb21waWxlck9wdGlvbnMgJiYgaXNSdW50aW1lT25seSgpKSB7XG4gICAgICAgICAgICB3YXJuKGBcImNvbXBpbGVyT3B0aW9uc1wiIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gdXNpbmcgYSBidWlsZCBvZiBWdWUgdGhhdCBgICtcbiAgICAgICAgICAgICAgICBgaW5jbHVkZXMgdGhlIHJ1bnRpbWUgY29tcGlsZXIuIFNpbmNlIHlvdSBhcmUgdXNpbmcgYSBydW50aW1lLW9ubHkgYCArXG4gICAgICAgICAgICAgICAgYGJ1aWxkLCB0aGUgb3B0aW9ucyBzaG91bGQgYmUgcGFzc2VkIHZpYSB5b3VyIGJ1aWxkIHRvb2wgY29uZmlnIGluc3RlYWQuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gMC4gY3JlYXRlIHJlbmRlciBwcm94eSBwcm9wZXJ0eSBhY2Nlc3MgY2FjaGVcbiAgICBpbnN0YW5jZS5hY2Nlc3NDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgLy8gMS4gY3JlYXRlIHB1YmxpYyBpbnN0YW5jZSAvIHJlbmRlciBwcm94eVxuICAgIC8vIGFsc28gbWFyayBpdCByYXcgc28gaXQncyBuZXZlciBvYnNlcnZlZFxuICAgIGluc3RhbmNlLnByb3h5ID0gbWFya1JhdyhuZXcgUHJveHkoaW5zdGFuY2UuY3R4LCBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMpKTtcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgIGV4cG9zZVByb3BzT25SZW5kZXJDb250ZXh0KGluc3RhbmNlKTtcbiAgICB9XG4gICAgLy8gMi4gY2FsbCBzZXR1cCgpXG4gICAgY29uc3QgeyBzZXR1cCB9ID0gQ29tcG9uZW50O1xuICAgIGlmIChzZXR1cCkge1xuICAgICAgICBjb25zdCBzZXR1cENvbnRleHQgPSAoaW5zdGFuY2Uuc2V0dXBDb250ZXh0ID1cbiAgICAgICAgICAgIHNldHVwLmxlbmd0aCA+IDEgPyBjcmVhdGVTZXR1cENvbnRleHQoaW5zdGFuY2UpIDogbnVsbCk7XG4gICAgICAgIHNldEN1cnJlbnRJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICAgICAgY29uc3Qgc2V0dXBSZXN1bHQgPSBjYWxsV2l0aEVycm9ySGFuZGxpbmcoc2V0dXAsIGluc3RhbmNlLCAwIC8qIEVycm9yQ29kZXMuU0VUVVBfRlVOQ1RJT04gKi8sIFsocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBzaGFsbG93UmVhZG9ubHkoaW5zdGFuY2UucHJvcHMpIDogaW5zdGFuY2UucHJvcHMsIHNldHVwQ29udGV4dF0pO1xuICAgICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgICAgIHVuc2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgICAgIGlmIChpc1Byb21pc2Uoc2V0dXBSZXN1bHQpKSB7XG4gICAgICAgICAgICBzZXR1cFJlc3VsdC50aGVuKHVuc2V0Q3VycmVudEluc3RhbmNlLCB1bnNldEN1cnJlbnRJbnN0YW5jZSk7XG4gICAgICAgICAgICBpZiAoaXNTU1IpIHtcbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIHByb21pc2Ugc28gc2VydmVyLXJlbmRlcmVyIGNhbiB3YWl0IG9uIGl0XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldHVwUmVzdWx0XG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXNvbHZlZFJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZXR1cFJlc3VsdChpbnN0YW5jZSwgcmVzb2x2ZWRSZXN1bHQsIGlzU1NSKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGUsIGluc3RhbmNlLCAwIC8qIEVycm9yQ29kZXMuU0VUVVBfRlVOQ1RJT04gKi8pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYXN5bmMgc2V0dXAgcmV0dXJuZWQgUHJvbWlzZS5cbiAgICAgICAgICAgICAgICAvLyBiYWlsIGhlcmUgYW5kIHdhaXQgZm9yIHJlLWVudHJ5LlxuICAgICAgICAgICAgICAgIGluc3RhbmNlLmFzeW5jRGVwID0gc2V0dXBSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhaW5zdGFuY2Uuc3VzcGVuc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IChfYSA9IENvbXBvbmVudC5uYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnQW5vbnltb3VzJztcbiAgICAgICAgICAgICAgICAgICAgd2FybihgQ29tcG9uZW50IDwke25hbWV9Pjogc2V0dXAgZnVuY3Rpb24gcmV0dXJuZWQgYSBwcm9taXNlLCBidXQgbm8gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgPFN1c3BlbnNlPiBib3VuZGFyeSB3YXMgZm91bmQgaW4gdGhlIHBhcmVudCBjb21wb25lbnQgdHJlZS4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgQSBjb21wb25lbnQgd2l0aCBhc3luYyBzZXR1cCgpIG11c3QgYmUgbmVzdGVkIGluIGEgPFN1c3BlbnNlPiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBpbiBvcmRlciB0byBiZSByZW5kZXJlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVTZXR1cFJlc3VsdChpbnN0YW5jZSwgc2V0dXBSZXN1bHQsIGlzU1NSKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZmluaXNoQ29tcG9uZW50U2V0dXAoaW5zdGFuY2UsIGlzU1NSKTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYW5kbGVTZXR1cFJlc3VsdChpbnN0YW5jZSwgc2V0dXBSZXN1bHQsIGlzU1NSKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oc2V0dXBSZXN1bHQpKSB7XG4gICAgICAgIC8vIHNldHVwIHJldHVybmVkIGFuIGlubGluZSByZW5kZXIgZnVuY3Rpb25cbiAgICAgICAgaWYgKGluc3RhbmNlLnR5cGUuX19zc3JJbmxpbmVSZW5kZXIpIHtcbiAgICAgICAgICAgIC8vIHdoZW4gdGhlIGZ1bmN0aW9uJ3MgbmFtZSBpcyBgc3NyUmVuZGVyYCAoY29tcGlsZWQgYnkgU0ZDIGlubGluZSBtb2RlKSxcbiAgICAgICAgICAgIC8vIHNldCBpdCBhcyBzc3JSZW5kZXIgaW5zdGVhZC5cbiAgICAgICAgICAgIGluc3RhbmNlLnNzclJlbmRlciA9IHNldHVwUmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaW5zdGFuY2UucmVuZGVyID0gc2V0dXBSZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3Qoc2V0dXBSZXN1bHQpKSB7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgaXNWTm9kZShzZXR1cFJlc3VsdCkpIHtcbiAgICAgICAgICAgIHdhcm4oYHNldHVwKCkgc2hvdWxkIG5vdCByZXR1cm4gVk5vZGVzIGRpcmVjdGx5IC0gYCArXG4gICAgICAgICAgICAgICAgYHJldHVybiBhIHJlbmRlciBmdW5jdGlvbiBpbnN0ZWFkLmApO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldHVwIHJldHVybmVkIGJpbmRpbmdzLlxuICAgICAgICAvLyBhc3N1bWluZyBhIHJlbmRlciBmdW5jdGlvbiBjb21waWxlZCBmcm9tIHRlbXBsYXRlIGlzIHByZXNlbnQuXG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5kZXZ0b29sc1Jhd1NldHVwU3RhdGUgPSBzZXR1cFJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZS5zZXR1cFN0YXRlID0gcHJveHlSZWZzKHNldHVwUmVzdWx0KTtcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgZXhwb3NlU2V0dXBTdGF0ZU9uUmVuZGVyQ29udGV4dChpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIHNldHVwUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgd2Fybihgc2V0dXAoKSBzaG91bGQgcmV0dXJuIGFuIG9iamVjdC4gUmVjZWl2ZWQ6ICR7c2V0dXBSZXN1bHQgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2Ygc2V0dXBSZXN1bHR9YCk7XG4gICAgfVxuICAgIGZpbmlzaENvbXBvbmVudFNldHVwKGluc3RhbmNlLCBpc1NTUik7XG59XG5sZXQgY29tcGlsZTtcbmxldCBpbnN0YWxsV2l0aFByb3h5O1xuLyoqXG4gKiBGb3IgcnVudGltZS1kb20gdG8gcmVnaXN0ZXIgdGhlIGNvbXBpbGVyLlxuICogTm90ZSB0aGUgZXhwb3J0ZWQgbWV0aG9kIHVzZXMgYW55IHRvIGF2b2lkIGQudHMgcmVseWluZyBvbiB0aGUgY29tcGlsZXIgdHlwZXMuXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyUnVudGltZUNvbXBpbGVyKF9jb21waWxlKSB7XG4gICAgY29tcGlsZSA9IF9jb21waWxlO1xuICAgIGluc3RhbGxXaXRoUHJveHkgPSBpID0+IHtcbiAgICAgICAgaWYgKGkucmVuZGVyLl9yYykge1xuICAgICAgICAgICAgaS53aXRoUHJveHkgPSBuZXcgUHJveHkoaS5jdHgsIFJ1bnRpbWVDb21waWxlZFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuLy8gZGV2IG9ubHlcbmNvbnN0IGlzUnVudGltZU9ubHkgPSAoKSA9PiAhY29tcGlsZTtcbmZ1bmN0aW9uIGZpbmlzaENvbXBvbmVudFNldHVwKGluc3RhbmNlLCBpc1NTUiwgc2tpcE9wdGlvbnMpIHtcbiAgICBjb25zdCBDb21wb25lbnQgPSBpbnN0YW5jZS50eXBlO1xuICAgIC8vIHRlbXBsYXRlIC8gcmVuZGVyIGZ1bmN0aW9uIG5vcm1hbGl6YXRpb25cbiAgICAvLyBjb3VsZCBiZSBhbHJlYWR5IHNldCB3aGVuIHJldHVybmVkIGZyb20gc2V0dXAoKVxuICAgIGlmICghaW5zdGFuY2UucmVuZGVyKSB7XG4gICAgICAgIC8vIG9ubHkgZG8gb24tdGhlLWZseSBjb21waWxlIGlmIG5vdCBpbiBTU1IgLSBTU1Igb24tdGhlLWZseSBjb21waWxhdGlvblxuICAgICAgICAvLyBpcyBkb25lIGJ5IHNlcnZlci1yZW5kZXJlclxuICAgICAgICBpZiAoIWlzU1NSICYmIGNvbXBpbGUgJiYgIUNvbXBvbmVudC5yZW5kZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gQ29tcG9uZW50LnRlbXBsYXRlIHx8XG4gICAgICAgICAgICAgICAgcmVzb2x2ZU1lcmdlZE9wdGlvbnMoaW5zdGFuY2UpLnRlbXBsYXRlO1xuICAgICAgICAgICAgaWYgKHRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBjb21waWxlYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgaXNDdXN0b21FbGVtZW50LCBjb21waWxlck9wdGlvbnMgfSA9IGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGVsaW1pdGVycywgY29tcGlsZXJPcHRpb25zOiBjb21wb25lbnRDb21waWxlck9wdGlvbnMgfSA9IENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBmaW5hbENvbXBpbGVyT3B0aW9ucyA9IGV4dGVuZChleHRlbmQoe1xuICAgICAgICAgICAgICAgICAgICBpc0N1c3RvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGRlbGltaXRlcnNcbiAgICAgICAgICAgICAgICB9LCBjb21waWxlck9wdGlvbnMpLCBjb21wb25lbnRDb21waWxlck9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIENvbXBvbmVudC5yZW5kZXIgPSBjb21waWxlKHRlbXBsYXRlLCBmaW5hbENvbXBpbGVyT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgY29tcGlsZWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZS5yZW5kZXIgPSAoQ29tcG9uZW50LnJlbmRlciB8fCBOT09QKTtcbiAgICAgICAgLy8gZm9yIHJ1bnRpbWUtY29tcGlsZWQgcmVuZGVyIGZ1bmN0aW9ucyB1c2luZyBgd2l0aGAgYmxvY2tzLCB0aGUgcmVuZGVyXG4gICAgICAgIC8vIHByb3h5IHVzZWQgbmVlZHMgYSBkaWZmZXJlbnQgYGhhc2AgaGFuZGxlciB3aGljaCBpcyBtb3JlIHBlcmZvcm1hbnQgYW5kXG4gICAgICAgIC8vIGFsc28gb25seSBhbGxvd3MgYSB3aGl0ZWxpc3Qgb2YgZ2xvYmFscyB0byBmYWxsdGhyb3VnaC5cbiAgICAgICAgaWYgKGluc3RhbGxXaXRoUHJveHkpIHtcbiAgICAgICAgICAgIGluc3RhbGxXaXRoUHJveHkoaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHN1cHBvcnQgZm9yIDIueCBvcHRpb25zXG4gICAgaWYgKF9fVlVFX09QVElPTlNfQVBJX18gJiYgIShmYWxzZSApKSB7XG4gICAgICAgIHNldEN1cnJlbnRJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICAgICAgYXBwbHlPcHRpb25zKGluc3RhbmNlKTtcbiAgICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgICAgICB1bnNldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgIH1cbiAgICAvLyB3YXJuIG1pc3NpbmcgdGVtcGxhdGUvcmVuZGVyXG4gICAgLy8gdGhlIHJ1bnRpbWUgY29tcGlsYXRpb24gb2YgdGVtcGxhdGUgaW4gU1NSIGlzIGRvbmUgYnkgc2VydmVyLXJlbmRlclxuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIUNvbXBvbmVudC5yZW5kZXIgJiYgaW5zdGFuY2UucmVuZGVyID09PSBOT09QICYmICFpc1NTUikge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKCFjb21waWxlICYmIENvbXBvbmVudC50ZW1wbGF0ZSkge1xuICAgICAgICAgICAgd2FybihgQ29tcG9uZW50IHByb3ZpZGVkIHRlbXBsYXRlIG9wdGlvbiBidXQgYCArXG4gICAgICAgICAgICAgICAgYHJ1bnRpbWUgY29tcGlsYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJ1aWxkIG9mIFZ1ZS5gICtcbiAgICAgICAgICAgICAgICAoYCBDb25maWd1cmUgeW91ciBidW5kbGVyIHRvIGFsaWFzIFwidnVlXCIgdG8gXCJ2dWUvZGlzdC92dWUuZXNtLWJ1bmRsZXIuanNcIi5gXG4gICAgICAgICAgICAgICAgICAgICkgLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2FybihgQ29tcG9uZW50IGlzIG1pc3NpbmcgdGVtcGxhdGUgb3IgcmVuZGVyIGZ1bmN0aW9uLmApO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlQXR0cnNQcm94eShpbnN0YW5jZSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoaW5zdGFuY2UuYXR0cnMsIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGdldCh0YXJnZXQsIGtleSkge1xuICAgICAgICAgICAgICAgIG1hcmtBdHRyc0FjY2Vzc2VkKCk7XG4gICAgICAgICAgICAgICAgdHJhY2soaW5zdGFuY2UsIFwiZ2V0XCIgLyogVHJhY2tPcFR5cGVzLkdFVCAqLywgJyRhdHRycycpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQoKSB7XG4gICAgICAgICAgICAgICAgd2Fybihgc2V0dXBDb250ZXh0LmF0dHJzIGlzIHJlYWRvbmx5LmApO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWxldGVQcm9wZXJ0eSgpIHtcbiAgICAgICAgICAgICAgICB3YXJuKGBzZXR1cENvbnRleHQuYXR0cnMgaXMgcmVhZG9ubHkuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgICAgICAgICAgICAgdHJhY2soaW5zdGFuY2UsIFwiZ2V0XCIgLyogVHJhY2tPcFR5cGVzLkdFVCAqLywgJyRhdHRycycpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVTZXR1cENvbnRleHQoaW5zdGFuY2UpIHtcbiAgICBjb25zdCBleHBvc2UgPSBleHBvc2VkID0+IHtcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlLmV4cG9zZWQpIHtcbiAgICAgICAgICAgICAgICB3YXJuKGBleHBvc2UoKSBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgc2V0dXAoKS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHBvc2VkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhwb3NlZFR5cGUgPSB0eXBlb2YgZXhwb3NlZDtcbiAgICAgICAgICAgICAgICBpZiAoZXhwb3NlZFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KGV4cG9zZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBvc2VkVHlwZSA9ICdhcnJheSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNSZWYoZXhwb3NlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9zZWRUeXBlID0gJ3JlZic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGV4cG9zZWRUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICB3YXJuKGBleHBvc2UoKSBzaG91bGQgYmUgcGFzc2VkIGEgcGxhaW4gb2JqZWN0LCByZWNlaXZlZCAke2V4cG9zZWRUeXBlfS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2UuZXhwb3NlZCA9IGV4cG9zZWQgfHwge307XG4gICAgfTtcbiAgICBsZXQgYXR0cnM7XG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAvLyBXZSB1c2UgZ2V0dGVycyBpbiBkZXYgaW4gY2FzZSBsaWJzIGxpa2UgdGVzdC11dGlscyBvdmVyd3JpdGUgaW5zdGFuY2VcbiAgICAgICAgLy8gcHJvcGVydGllcyAob3ZlcndyaXRlcyBzaG91bGQgbm90IGJlIGRvbmUgaW4gcHJvZClcbiAgICAgICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgZ2V0IGF0dHJzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhdHRycyB8fCAoYXR0cnMgPSBjcmVhdGVBdHRyc1Byb3h5KGluc3RhbmNlKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IHNsb3RzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzaGFsbG93UmVhZG9ubHkoaW5zdGFuY2Uuc2xvdHMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBlbWl0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoZXZlbnQsIC4uLmFyZ3MpID0+IGluc3RhbmNlLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cG9zZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnZXQgYXR0cnMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJzIHx8IChhdHRycyA9IGNyZWF0ZUF0dHJzUHJveHkoaW5zdGFuY2UpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzbG90czogaW5zdGFuY2Uuc2xvdHMsXG4gICAgICAgICAgICBlbWl0OiBpbnN0YW5jZS5lbWl0LFxuICAgICAgICAgICAgZXhwb3NlXG4gICAgICAgIH07XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0RXhwb3NlUHJveHkoaW5zdGFuY2UpIHtcbiAgICBpZiAoaW5zdGFuY2UuZXhwb3NlZCkge1xuICAgICAgICByZXR1cm4gKGluc3RhbmNlLmV4cG9zZVByb3h5IHx8XG4gICAgICAgICAgICAoaW5zdGFuY2UuZXhwb3NlUHJveHkgPSBuZXcgUHJveHkocHJveHlSZWZzKG1hcmtSYXcoaW5zdGFuY2UuZXhwb3NlZCkpLCB7XG4gICAgICAgICAgICAgICAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5IGluIHB1YmxpY1Byb3BlcnRpZXNNYXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwdWJsaWNQcm9wZXJ0aWVzTWFwW2tleV0oaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoYXModGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleSBpbiB0YXJnZXQgfHwga2V5IGluIHB1YmxpY1Byb3BlcnRpZXNNYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpKTtcbiAgICB9XG59XG5jb25zdCBjbGFzc2lmeVJFID0gLyg/Ol58Wy1fXSkoXFx3KS9nO1xuY29uc3QgY2xhc3NpZnkgPSAoc3RyKSA9PiBzdHIucmVwbGFjZShjbGFzc2lmeVJFLCBjID0+IGMudG9VcHBlckNhc2UoKSkucmVwbGFjZSgvWy1fXS9nLCAnJyk7XG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCwgaW5jbHVkZUluZmVycmVkID0gdHJ1ZSkge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKENvbXBvbmVudClcbiAgICAgICAgPyBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWVcbiAgICAgICAgOiBDb21wb25lbnQubmFtZSB8fCAoaW5jbHVkZUluZmVycmVkICYmIENvbXBvbmVudC5fX25hbWUpO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGZvcm1hdENvbXBvbmVudE5hbWUoaW5zdGFuY2UsIENvbXBvbmVudCwgaXNSb290ID0gZmFsc2UpIHtcbiAgICBsZXQgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KTtcbiAgICBpZiAoIW5hbWUgJiYgQ29tcG9uZW50Ll9fZmlsZSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IENvbXBvbmVudC5fX2ZpbGUubWF0Y2goLyhbXi9cXFxcXSspXFwuXFx3KyQvKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBuYW1lID0gbWF0Y2hbMV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFuYW1lICYmIGluc3RhbmNlICYmIGluc3RhbmNlLnBhcmVudCkge1xuICAgICAgICAvLyB0cnkgdG8gaW5mZXIgdGhlIG5hbWUgYmFzZWQgb24gcmV2ZXJzZSByZXNvbHV0aW9uXG4gICAgICAgIGNvbnN0IGluZmVyRnJvbVJlZ2lzdHJ5ID0gKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByZWdpc3RyeSkge1xuICAgICAgICAgICAgICAgIGlmIChyZWdpc3RyeVtrZXldID09PSBDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIG5hbWUgPVxuICAgICAgICAgICAgaW5mZXJGcm9tUmVnaXN0cnkoaW5zdGFuY2UuY29tcG9uZW50cyB8fFxuICAgICAgICAgICAgICAgIGluc3RhbmNlLnBhcmVudC50eXBlLmNvbXBvbmVudHMpIHx8IGluZmVyRnJvbVJlZ2lzdHJ5KGluc3RhbmNlLmFwcENvbnRleHQuY29tcG9uZW50cyk7XG4gICAgfVxuICAgIHJldHVybiBuYW1lID8gY2xhc3NpZnkobmFtZSkgOiBpc1Jvb3QgPyBgQXBwYCA6IGBBbm9ueW1vdXNgO1xufVxuZnVuY3Rpb24gaXNDbGFzc0NvbXBvbmVudCh2YWx1ZSkge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKHZhbHVlKSAmJiAnX192Y2NPcHRzJyBpbiB2YWx1ZTtcbn1cblxuY29uc3QgY29tcHV0ZWQgPSAoKGdldHRlck9yT3B0aW9ucywgZGVidWdPcHRpb25zKSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBjb21wdXRlZCQxKGdldHRlck9yT3B0aW9ucywgZGVidWdPcHRpb25zLCBpc0luU1NSQ29tcG9uZW50U2V0dXApO1xufSk7XG5cbi8vIGRldiBvbmx5XG5jb25zdCB3YXJuUnVudGltZVVzYWdlID0gKG1ldGhvZCkgPT4gd2FybihgJHttZXRob2R9KCkgaXMgYSBjb21waWxlci1oaW50IGhlbHBlciB0aGF0IGlzIG9ubHkgdXNhYmxlIGluc2lkZSBgICtcbiAgICBgPHNjcmlwdCBzZXR1cD4gb2YgYSBzaW5nbGUgZmlsZSBjb21wb25lbnQuIEl0cyBhcmd1bWVudHMgc2hvdWxkIGJlIGAgK1xuICAgIGBjb21waWxlZCBhd2F5IGFuZCBwYXNzaW5nIGl0IGF0IHJ1bnRpbWUgaGFzIG5vIGVmZmVjdC5gKTtcbi8vIGltcGxlbWVudGF0aW9uXG5mdW5jdGlvbiBkZWZpbmVQcm9wcygpIHtcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZVByb3BzYCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLy8gaW1wbGVtZW50YXRpb25cbmZ1bmN0aW9uIGRlZmluZUVtaXRzKCkge1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lRW1pdHNgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIFZ1ZSBgPHNjcmlwdCBzZXR1cD5gIGNvbXBpbGVyIG1hY3JvIGZvciBkZWNsYXJpbmcgYSBjb21wb25lbnQncyBleHBvc2VkXG4gKiBpbnN0YW5jZSBwcm9wZXJ0aWVzIHdoZW4gaXQgaXMgYWNjZXNzZWQgYnkgYSBwYXJlbnQgY29tcG9uZW50IHZpYSB0ZW1wbGF0ZVxuICogcmVmcy5cbiAqXG4gKiBgPHNjcmlwdCBzZXR1cD5gIGNvbXBvbmVudHMgYXJlIGNsb3NlZCBieSBkZWZhdWx0IC0gaS5lLiB2YXJpYWJsZXMgaW5zaWRlXG4gKiB0aGUgYDxzY3JpcHQgc2V0dXA+YCBzY29wZSBpcyBub3QgZXhwb3NlZCB0byBwYXJlbnQgdW5sZXNzIGV4cGxpY2l0bHkgZXhwb3NlZFxuICogdmlhIGBkZWZpbmVFeHBvc2VgLlxuICpcbiAqIFRoaXMgaXMgb25seSB1c2FibGUgaW5zaWRlIGA8c2NyaXB0IHNldHVwPmAsIGlzIGNvbXBpbGVkIGF3YXkgaW4gdGhlXG4gKiBvdXRwdXQgYW5kIHNob3VsZCAqKm5vdCoqIGJlIGFjdHVhbGx5IGNhbGxlZCBhdCBydW50aW1lLlxuICovXG5mdW5jdGlvbiBkZWZpbmVFeHBvc2UoZXhwb3NlZCkge1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lRXhwb3NlYCk7XG4gICAgfVxufVxuLyoqXG4gKiBWdWUgYDxzY3JpcHQgc2V0dXA+YCBjb21waWxlciBtYWNybyBmb3IgcHJvdmlkaW5nIHByb3BzIGRlZmF1bHQgdmFsdWVzIHdoZW5cbiAqIHVzaW5nIHR5cGUtYmFzZWQgYGRlZmluZVByb3BzYCBkZWNsYXJhdGlvbi5cbiAqXG4gKiBFeGFtcGxlIHVzYWdlOlxuICogYGBgdHNcbiAqIHdpdGhEZWZhdWx0cyhkZWZpbmVQcm9wczx7XG4gKiAgIHNpemU/OiBudW1iZXJcbiAqICAgbGFiZWxzPzogc3RyaW5nW11cbiAqIH0+KCksIHtcbiAqICAgc2l6ZTogMyxcbiAqICAgbGFiZWxzOiAoKSA9PiBbJ2RlZmF1bHQgbGFiZWwnXVxuICogfSlcbiAqIGBgYFxuICpcbiAqIFRoaXMgaXMgb25seSB1c2FibGUgaW5zaWRlIGA8c2NyaXB0IHNldHVwPmAsIGlzIGNvbXBpbGVkIGF3YXkgaW4gdGhlIG91dHB1dFxuICogYW5kIHNob3VsZCAqKm5vdCoqIGJlIGFjdHVhbGx5IGNhbGxlZCBhdCBydW50aW1lLlxuICovXG5mdW5jdGlvbiB3aXRoRGVmYXVsdHMocHJvcHMsIGRlZmF1bHRzKSB7XG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICB3YXJuUnVudGltZVVzYWdlKGB3aXRoRGVmYXVsdHNgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiB1c2VTbG90cygpIHtcbiAgICByZXR1cm4gZ2V0Q29udGV4dCgpLnNsb3RzO1xufVxuZnVuY3Rpb24gdXNlQXR0cnMoKSB7XG4gICAgcmV0dXJuIGdldENvbnRleHQoKS5hdHRycztcbn1cbmZ1bmN0aW9uIGdldENvbnRleHQoKSB7XG4gICAgY29uc3QgaSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIWkpIHtcbiAgICAgICAgd2FybihgdXNlQ29udGV4dCgpIGNhbGxlZCB3aXRob3V0IGFjdGl2ZSBpbnN0YW5jZS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGkuc2V0dXBDb250ZXh0IHx8IChpLnNldHVwQ29udGV4dCA9IGNyZWF0ZVNldHVwQ29udGV4dChpKSk7XG59XG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciBtZXJnaW5nIGRlZmF1bHQgZGVjbGFyYXRpb25zLiBJbXBvcnRlZCBieSBjb21waWxlZCBjb2RlXG4gKiBvbmx5LlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIG1lcmdlRGVmYXVsdHMocmF3LCBkZWZhdWx0cykge1xuICAgIGNvbnN0IHByb3BzID0gaXNBcnJheShyYXcpXG4gICAgICAgID8gcmF3LnJlZHVjZSgobm9ybWFsaXplZCwgcCkgPT4gKChub3JtYWxpemVkW3BdID0ge30pLCBub3JtYWxpemVkKSwge30pXG4gICAgICAgIDogcmF3O1xuICAgIGZvciAoY29uc3Qga2V5IGluIGRlZmF1bHRzKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IHByb3BzW2tleV07XG4gICAgICAgIGlmIChvcHQpIHtcbiAgICAgICAgICAgIGlmIChpc0FycmF5KG9wdCkgfHwgaXNGdW5jdGlvbihvcHQpKSB7XG4gICAgICAgICAgICAgICAgcHJvcHNba2V5XSA9IHsgdHlwZTogb3B0LCBkZWZhdWx0OiBkZWZhdWx0c1trZXldIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcHQuZGVmYXVsdCA9IGRlZmF1bHRzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0ID09PSBudWxsKSB7XG4gICAgICAgICAgICBwcm9wc1trZXldID0geyBkZWZhdWx0OiBkZWZhdWx0c1trZXldIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgICB3YXJuKGBwcm9wcyBkZWZhdWx0IGtleSBcIiR7a2V5fVwiIGhhcyBubyBjb3JyZXNwb25kaW5nIGRlY2xhcmF0aW9uLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wcztcbn1cbi8qKlxuICogVXNlZCB0byBjcmVhdGUgYSBwcm94eSBmb3IgdGhlIHJlc3QgZWxlbWVudCB3aGVuIGRlc3RydWN0dXJpbmcgcHJvcHMgd2l0aFxuICogZGVmaW5lUHJvcHMoKS5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBjcmVhdGVQcm9wc1Jlc3RQcm94eShwcm9wcywgZXhjbHVkZWRLZXlzKSB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgaWYgKCFleGNsdWRlZEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwga2V5LCB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHByb3BzW2tleV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG4vKipcbiAqIGA8c2NyaXB0IHNldHVwPmAgaGVscGVyIGZvciBwZXJzaXN0aW5nIHRoZSBjdXJyZW50IGluc3RhbmNlIGNvbnRleHQgb3ZlclxuICogYXN5bmMvYXdhaXQgZmxvd3MuXG4gKlxuICogYEB2dWUvY29tcGlsZXItc2ZjYCBjb252ZXJ0cyB0aGUgZm9sbG93aW5nOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCB4ID0gYXdhaXQgZm9vKClcbiAqIGBgYFxuICpcbiAqIGludG86XG4gKlxuICogYGBgdHNcbiAqIGxldCBfX3RlbXAsIF9fcmVzdG9yZVxuICogY29uc3QgeCA9ICgoW19fdGVtcCwgX19yZXN0b3JlXSA9IHdpdGhBc3luY0NvbnRleHQoKCkgPT4gZm9vKCkpKSxfX3RlbXA9YXdhaXQgX190ZW1wLF9fcmVzdG9yZSgpLF9fdGVtcClcbiAqIGBgYFxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHdpdGhBc3luY0NvbnRleHQoZ2V0QXdhaXRhYmxlKSB7XG4gICAgY29uc3QgY3R4ID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhY3R4KSB7XG4gICAgICAgIHdhcm4oYHdpdGhBc3luY0NvbnRleHQgY2FsbGVkIHdpdGhvdXQgYWN0aXZlIGN1cnJlbnQgaW5zdGFuY2UuIGAgK1xuICAgICAgICAgICAgYFRoaXMgaXMgbGlrZWx5IGEgYnVnLmApO1xuICAgIH1cbiAgICBsZXQgYXdhaXRhYmxlID0gZ2V0QXdhaXRhYmxlKCk7XG4gICAgdW5zZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBpZiAoaXNQcm9taXNlKGF3YWl0YWJsZSkpIHtcbiAgICAgICAgYXdhaXRhYmxlID0gYXdhaXRhYmxlLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgc2V0Q3VycmVudEluc3RhbmNlKGN0eCk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIFthd2FpdGFibGUsICgpID0+IHNldEN1cnJlbnRJbnN0YW5jZShjdHgpXTtcbn1cblxuLy8gQWN0dWFsIGltcGxlbWVudGF0aW9uXG5mdW5jdGlvbiBoKHR5cGUsIHByb3BzT3JDaGlsZHJlbiwgY2hpbGRyZW4pIHtcbiAgICBjb25zdCBsID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBpZiAobCA9PT0gMikge1xuICAgICAgICBpZiAoaXNPYmplY3QocHJvcHNPckNoaWxkcmVuKSAmJiAhaXNBcnJheShwcm9wc09yQ2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAvLyBzaW5nbGUgdm5vZGUgd2l0aG91dCBwcm9wc1xuICAgICAgICAgICAgaWYgKGlzVk5vZGUocHJvcHNPckNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBudWxsLCBbcHJvcHNPckNoaWxkcmVuXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBwcm9wcyB3aXRob3V0IGNoaWxkcmVuXG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgcHJvcHNPckNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIG9taXQgcHJvcHNcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBudWxsLCBwcm9wc09yQ2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAobCA+IDMpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsID09PSAzICYmIGlzVk5vZGUoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICBjaGlsZHJlbiA9IFtjaGlsZHJlbl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKHR5cGUsIHByb3BzT3JDaGlsZHJlbiwgY2hpbGRyZW4pO1xuICAgIH1cbn1cblxuY29uc3Qgc3NyQ29udGV4dEtleSA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBgc3NyQ29udGV4dGAgOiBgYCk7XG5jb25zdCB1c2VTU1JDb250ZXh0ID0gKCkgPT4ge1xuICAgIHtcbiAgICAgICAgY29uc3QgY3R4ID0gaW5qZWN0KHNzckNvbnRleHRLZXkpO1xuICAgICAgICBpZiAoIWN0eCkge1xuICAgICAgICAgICAgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmXG4gICAgICAgICAgICAgICAgd2FybihgU2VydmVyIHJlbmRlcmluZyBjb250ZXh0IG5vdCBwcm92aWRlZC4gTWFrZSBzdXJlIHRvIG9ubHkgY2FsbCBgICtcbiAgICAgICAgICAgICAgICAgICAgYHVzZVNTUkNvbnRleHQoKSBjb25kaXRpb25hbGx5IGluIHRoZSBzZXJ2ZXIgYnVpbGQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN0eDtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBpc1NoYWxsb3codmFsdWUpIHtcbiAgICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWVbXCJfX3ZfaXNTaGFsbG93XCIgLyogUmVhY3RpdmVGbGFncy5JU19TSEFMTE9XICovXSk7XG59XG5cbmZ1bmN0aW9uIGluaXRDdXN0b21Gb3JtYXR0ZXIoKSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzICovXG4gICAgaWYgKCEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2dWVTdHlsZSA9IHsgc3R5bGU6ICdjb2xvcjojM2JhNzc2JyB9O1xuICAgIGNvbnN0IG51bWJlclN0eWxlID0geyBzdHlsZTogJ2NvbG9yOiMwYjFiYzknIH07XG4gICAgY29uc3Qgc3RyaW5nU3R5bGUgPSB7IHN0eWxlOiAnY29sb3I6I2I2MmUyNCcgfTtcbiAgICBjb25zdCBrZXl3b3JkU3R5bGUgPSB7IHN0eWxlOiAnY29sb3I6IzlkMjg4YycgfTtcbiAgICAvLyBjdXN0b20gZm9ybWF0dGVyIGZvciBDaHJvbWVcbiAgICAvLyBodHRwczovL3d3dy5tYXR0emV1bmVydC5jb20vMjAxNi8wMi8xOS9jdXN0b20tY2hyb21lLWRldnRvb2xzLW9iamVjdC1mb3JtYXR0ZXJzLmh0bWxcbiAgICBjb25zdCBmb3JtYXR0ZXIgPSB7XG4gICAgICAgIGhlYWRlcihvYmopIHtcbiAgICAgICAgICAgIC8vIFRPRE8gYWxzbyBmb3JtYXQgQ29tcG9uZW50UHVibGljSW5zdGFuY2UgJiBjdHguc2xvdHMvYXR0cnMgaW4gc2V0dXBcbiAgICAgICAgICAgIGlmICghaXNPYmplY3Qob2JqKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9iai5fX2lzVnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnZGl2JywgdnVlU3R5bGUsIGBWdWVJbnN0YW5jZWBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNSZWYob2JqKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICdkaXYnLFxuICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgWydzcGFuJywgdnVlU3R5bGUsIGdlblJlZkZsYWcob2JqKV0sXG4gICAgICAgICAgICAgICAgICAgICc8JyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0VmFsdWUob2JqLnZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgYD5gXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzUmVhY3RpdmUob2JqKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICdkaXYnLFxuICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgWydzcGFuJywgdnVlU3R5bGUsIGlzU2hhbGxvdyhvYmopID8gJ1NoYWxsb3dSZWFjdGl2ZScgOiAnUmVhY3RpdmUnXSxcbiAgICAgICAgICAgICAgICAgICAgJzwnLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRWYWx1ZShvYmopLFxuICAgICAgICAgICAgICAgICAgICBgPiR7aXNSZWFkb25seShvYmopID8gYCAocmVhZG9ubHkpYCA6IGBgfWBcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNSZWFkb25seShvYmopKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICBbJ3NwYW4nLCB2dWVTdHlsZSwgaXNTaGFsbG93KG9iaikgPyAnU2hhbGxvd1JlYWRvbmx5JyA6ICdSZWFkb25seSddLFxuICAgICAgICAgICAgICAgICAgICAnPCcsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdFZhbHVlKG9iaiksXG4gICAgICAgICAgICAgICAgICAgICc+J1xuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzQm9keShvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9faXNWdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGJvZHkob2JqKSB7XG4gICAgICAgICAgICBpZiAob2JqICYmIG9iai5fX2lzVnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICAuLi5mb3JtYXRJbnN0YW5jZShvYmouJClcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBmdW5jdGlvbiBmb3JtYXRJbnN0YW5jZShpbnN0YW5jZSkge1xuICAgICAgICBjb25zdCBibG9ja3MgPSBbXTtcbiAgICAgICAgaWYgKGluc3RhbmNlLnR5cGUucHJvcHMgJiYgaW5zdGFuY2UucHJvcHMpIHtcbiAgICAgICAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soJ3Byb3BzJywgdG9SYXcoaW5zdGFuY2UucHJvcHMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluc3RhbmNlLnNldHVwU3RhdGUgIT09IEVNUFRZX09CSikge1xuICAgICAgICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jaygnc2V0dXAnLCBpbnN0YW5jZS5zZXR1cFN0YXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluc3RhbmNlLmRhdGEgIT09IEVNUFRZX09CSikge1xuICAgICAgICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jaygnZGF0YScsIHRvUmF3KGluc3RhbmNlLmRhdGEpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcHV0ZWQgPSBleHRyYWN0S2V5cyhpbnN0YW5jZSwgJ2NvbXB1dGVkJyk7XG4gICAgICAgIGlmIChjb21wdXRlZCkge1xuICAgICAgICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jaygnY29tcHV0ZWQnLCBjb21wdXRlZCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluamVjdGVkID0gZXh0cmFjdEtleXMoaW5zdGFuY2UsICdpbmplY3QnKTtcbiAgICAgICAgaWYgKGluamVjdGVkKSB7XG4gICAgICAgICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKCdpbmplY3RlZCcsIGluamVjdGVkKSk7XG4gICAgICAgIH1cbiAgICAgICAgYmxvY2tzLnB1c2goW1xuICAgICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAnc3BhbicsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZToga2V5d29yZFN0eWxlLnN0eWxlICsgJztvcGFjaXR5OjAuNjYnXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAnJCAoaW50ZXJuYWwpOiAnXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgWydvYmplY3QnLCB7IG9iamVjdDogaW5zdGFuY2UgfV1cbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiBibG9ja3M7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlQmxvY2sodHlwZSwgdGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldCA9IGV4dGVuZCh7fSwgdGFyZ2V0KTtcbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyh0YXJnZXQpLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFsnc3BhbicsIHt9XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgICB7IHN0eWxlOiAnbGluZS1oZWlnaHQ6MS4yNWVtO21hcmdpbi1ib3R0b206MC42ZW0nIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZTogJ2NvbG9yOiM0NzY1ODInXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0eXBlXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICdkaXYnLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICdwYWRkaW5nLWxlZnQ6MS4yNWVtJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLi4uT2JqZWN0LmtleXModGFyZ2V0KS5tYXAoa2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdkaXYnLFxuICAgICAgICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ3NwYW4nLCBrZXl3b3JkU3R5bGUsIGtleSArICc6ICddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0VmFsdWUodGFyZ2V0W2tleV0sIGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdXG4gICAgICAgIF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZvcm1hdFZhbHVlKHYsIGFzUmF3ID0gdHJ1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gWydzcGFuJywgbnVtYmVyU3R5bGUsIHZdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIFsnc3BhbicsIHN0cmluZ1N0eWxlLCBKU09OLnN0cmluZ2lmeSh2KV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHYgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIFsnc3BhbicsIGtleXdvcmRTdHlsZSwgdl07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNPYmplY3QodikpIHtcbiAgICAgICAgICAgIHJldHVybiBbJ29iamVjdCcsIHsgb2JqZWN0OiBhc1JhdyA/IHRvUmF3KHYpIDogdiB9XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbJ3NwYW4nLCBzdHJpbmdTdHlsZSwgU3RyaW5nKHYpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBleHRyYWN0S2V5cyhpbnN0YW5jZSwgdHlwZSkge1xuICAgICAgICBjb25zdCBDb21wID0gaW5zdGFuY2UudHlwZTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oQ29tcCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleHRyYWN0ZWQgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gaW5zdGFuY2UuY3R4KSB7XG4gICAgICAgICAgICBpZiAoaXNLZXlPZlR5cGUoQ29tcCwga2V5LCB0eXBlKSkge1xuICAgICAgICAgICAgICAgIGV4dHJhY3RlZFtrZXldID0gaW5zdGFuY2UuY3R4W2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4dHJhY3RlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNLZXlPZlR5cGUoQ29tcCwga2V5LCB0eXBlKSB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSBDb21wW3R5cGVdO1xuICAgICAgICBpZiAoKGlzQXJyYXkob3B0cykgJiYgb3B0cy5pbmNsdWRlcyhrZXkpKSB8fFxuICAgICAgICAgICAgKGlzT2JqZWN0KG9wdHMpICYmIGtleSBpbiBvcHRzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKENvbXAuZXh0ZW5kcyAmJiBpc0tleU9mVHlwZShDb21wLmV4dGVuZHMsIGtleSwgdHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChDb21wLm1peGlucyAmJiBDb21wLm1peGlucy5zb21lKG0gPT4gaXNLZXlPZlR5cGUobSwga2V5LCB0eXBlKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdlblJlZkZsYWcodikge1xuICAgICAgICBpZiAoaXNTaGFsbG93KHYpKSB7XG4gICAgICAgICAgICByZXR1cm4gYFNoYWxsb3dSZWZgO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2LmVmZmVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGBDb21wdXRlZFJlZmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBSZWZgO1xuICAgIH1cbiAgICBpZiAod2luZG93LmRldnRvb2xzRm9ybWF0dGVycykge1xuICAgICAgICB3aW5kb3cuZGV2dG9vbHNGb3JtYXR0ZXJzLnB1c2goZm9ybWF0dGVyKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kZXZ0b29sc0Zvcm1hdHRlcnMgPSBbZm9ybWF0dGVyXTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHdpdGhNZW1vKG1lbW8sIHJlbmRlciwgY2FjaGUsIGluZGV4KSB7XG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGVbaW5kZXhdO1xuICAgIGlmIChjYWNoZWQgJiYgaXNNZW1vU2FtZShjYWNoZWQsIG1lbW8pKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJldCA9IHJlbmRlcigpO1xuICAgIC8vIHNoYWxsb3cgY2xvbmVcbiAgICByZXQubWVtbyA9IG1lbW8uc2xpY2UoKTtcbiAgICByZXR1cm4gKGNhY2hlW2luZGV4XSA9IHJldCk7XG59XG5mdW5jdGlvbiBpc01lbW9TYW1lKGNhY2hlZCwgbWVtbykge1xuICAgIGNvbnN0IHByZXYgPSBjYWNoZWQubWVtbztcbiAgICBpZiAocHJldi5sZW5ndGggIT0gbWVtby5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXYubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGhhc0NoYW5nZWQocHJldltpXSwgbWVtb1tpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBtYWtlIHN1cmUgdG8gbGV0IHBhcmVudCBibG9jayB0cmFjayBpdCB3aGVuIHJldHVybmluZyBjYWNoZWRcbiAgICBpZiAoaXNCbG9ja1RyZWVFbmFibGVkID4gMCAmJiBjdXJyZW50QmxvY2spIHtcbiAgICAgICAgY3VycmVudEJsb2NrLnB1c2goY2FjaGVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8vIENvcmUgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgdmVyc2lvbiA9IFwiMy4yLjQ3XCI7XG5jb25zdCBfc3NyVXRpbHMgPSB7XG4gICAgY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UsXG4gICAgc2V0dXBDb21wb25lbnQsXG4gICAgcmVuZGVyQ29tcG9uZW50Um9vdCxcbiAgICBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UsXG4gICAgaXNWTm9kZSxcbiAgICBub3JtYWxpemVWTm9kZVxufTtcbi8qKlxuICogU1NSIHV0aWxzIGZvciBcXEB2dWUvc2VydmVyLXJlbmRlcmVyLiBPbmx5IGV4cG9zZWQgaW4gc3NyLXBvc3NpYmxlIGJ1aWxkcy5cbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBzc3JVdGlscyA9IChfc3NyVXRpbHMgKTtcbi8qKlxuICogQGludGVybmFsIG9ubHkgZXhwb3NlZCBpbiBjb21wYXQgYnVpbGRzXG4gKi9cbmNvbnN0IHJlc29sdmVGaWx0ZXIgPSBudWxsO1xuLyoqXG4gKiBAaW50ZXJuYWwgb25seSBleHBvc2VkIGluIGNvbXBhdCBidWlsZHMuXG4gKi9cbmNvbnN0IGNvbXBhdFV0aWxzID0gKG51bGwpO1xuXG5leHBvcnQgeyBCYXNlVHJhbnNpdGlvbiwgQ29tbWVudCwgRnJhZ21lbnQsIEtlZXBBbGl2ZSwgU3RhdGljLCBTdXNwZW5zZSwgVGVsZXBvcnQsIFRleHQsIGFzc2VydE51bWJlciwgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcsIGNhbGxXaXRoRXJyb3JIYW5kbGluZywgY2xvbmVWTm9kZSwgY29tcGF0VXRpbHMsIGNvbXB1dGVkLCBjcmVhdGVCbG9jaywgY3JlYXRlQ29tbWVudFZOb2RlLCBjcmVhdGVFbGVtZW50QmxvY2ssIGNyZWF0ZUJhc2VWTm9kZSBhcyBjcmVhdGVFbGVtZW50Vk5vZGUsIGNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyLCBjcmVhdGVQcm9wc1Jlc3RQcm94eSwgY3JlYXRlUmVuZGVyZXIsIGNyZWF0ZVNsb3RzLCBjcmVhdGVTdGF0aWNWTm9kZSwgY3JlYXRlVGV4dFZOb2RlLCBjcmVhdGVWTm9kZSwgZGVmaW5lQXN5bmNDb21wb25lbnQsIGRlZmluZUNvbXBvbmVudCwgZGVmaW5lRW1pdHMsIGRlZmluZUV4cG9zZSwgZGVmaW5lUHJvcHMsIGRldnRvb2xzLCBnZXRDdXJyZW50SW5zdGFuY2UsIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbiwgZ3VhcmRSZWFjdGl2ZVByb3BzLCBoLCBoYW5kbGVFcnJvciwgaW5pdEN1c3RvbUZvcm1hdHRlciwgaW5qZWN0LCBpc01lbW9TYW1lLCBpc1J1bnRpbWVPbmx5LCBpc1ZOb2RlLCBtZXJnZURlZmF1bHRzLCBtZXJnZVByb3BzLCBuZXh0VGljaywgb25BY3RpdmF0ZWQsIG9uQmVmb3JlTW91bnQsIG9uQmVmb3JlVW5tb3VudCwgb25CZWZvcmVVcGRhdGUsIG9uRGVhY3RpdmF0ZWQsIG9uRXJyb3JDYXB0dXJlZCwgb25Nb3VudGVkLCBvblJlbmRlclRyYWNrZWQsIG9uUmVuZGVyVHJpZ2dlcmVkLCBvblNlcnZlclByZWZldGNoLCBvblVubW91bnRlZCwgb25VcGRhdGVkLCBvcGVuQmxvY2ssIHBvcFNjb3BlSWQsIHByb3ZpZGUsIHB1c2hTY29wZUlkLCBxdWV1ZVBvc3RGbHVzaENiLCByZWdpc3RlclJ1bnRpbWVDb21waWxlciwgcmVuZGVyTGlzdCwgcmVuZGVyU2xvdCwgcmVzb2x2ZUNvbXBvbmVudCwgcmVzb2x2ZURpcmVjdGl2ZSwgcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQsIHJlc29sdmVGaWx0ZXIsIHJlc29sdmVUcmFuc2l0aW9uSG9va3MsIHNldEJsb2NrVHJhY2tpbmcsIHNldERldnRvb2xzSG9vaywgc2V0VHJhbnNpdGlvbkhvb2tzLCBzc3JDb250ZXh0S2V5LCBzc3JVdGlscywgdG9IYW5kbGVycywgdHJhbnNmb3JtVk5vZGVBcmdzLCB1c2VBdHRycywgdXNlU1NSQ29udGV4dCwgdXNlU2xvdHMsIHVzZVRyYW5zaXRpb25TdGF0ZSwgdmVyc2lvbiwgd2Fybiwgd2F0Y2gsIHdhdGNoRWZmZWN0LCB3YXRjaFBvc3RFZmZlY3QsIHdhdGNoU3luY0VmZmVjdCwgd2l0aEFzeW5jQ29udGV4dCwgd2l0aEN0eCwgd2l0aERlZmF1bHRzLCB3aXRoRGlyZWN0aXZlcywgd2l0aE1lbW8sIHdpdGhTY29wZUlkIH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js\n");

/***/ }),

/***/ "./node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js":
/*!***********************************************************************!*\
  !*** ./node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js ***!
  \***********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"BaseTransition\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.BaseTransition),\n/* harmony export */   \"Comment\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Comment),\n/* harmony export */   \"EffectScope\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.EffectScope),\n/* harmony export */   \"Fragment\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Fragment),\n/* harmony export */   \"KeepAlive\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.KeepAlive),\n/* harmony export */   \"ReactiveEffect\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ReactiveEffect),\n/* harmony export */   \"Static\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Static),\n/* harmony export */   \"Suspense\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Suspense),\n/* harmony export */   \"Teleport\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Teleport),\n/* harmony export */   \"Text\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Text),\n/* harmony export */   \"Transition\": () => (/* binding */ Transition),\n/* harmony export */   \"TransitionGroup\": () => (/* binding */ TransitionGroup),\n/* harmony export */   \"VueElement\": () => (/* binding */ VueElement),\n/* harmony export */   \"assertNumber\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.assertNumber),\n/* harmony export */   \"callWithAsyncErrorHandling\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.callWithAsyncErrorHandling),\n/* harmony export */   \"callWithErrorHandling\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.callWithErrorHandling),\n/* harmony export */   \"camelize\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.camelize),\n/* harmony export */   \"capitalize\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.capitalize),\n/* harmony export */   \"cloneVNode\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.cloneVNode),\n/* harmony export */   \"compatUtils\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.compatUtils),\n/* harmony export */   \"computed\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.computed),\n/* harmony export */   \"createApp\": () => (/* binding */ createApp),\n/* harmony export */   \"createBlock\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createBlock),\n/* harmony export */   \"createCommentVNode\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode),\n/* harmony export */   \"createElementBlock\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createElementBlock),\n/* harmony export */   \"createElementVNode\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createElementVNode),\n/* harmony export */   \"createHydrationRenderer\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createHydrationRenderer),\n/* harmony export */   \"createPropsRestProxy\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createPropsRestProxy),\n/* harmony export */   \"createRenderer\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createRenderer),\n/* harmony export */   \"createSSRApp\": () => (/* binding */ createSSRApp),\n/* harmony export */   \"createSlots\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createSlots),\n/* harmony export */   \"createStaticVNode\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createStaticVNode),\n/* harmony export */   \"createTextVNode\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createTextVNode),\n/* harmony export */   \"createVNode\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createVNode),\n/* harmony export */   \"customRef\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.customRef),\n/* harmony export */   \"defineAsyncComponent\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineAsyncComponent),\n/* harmony export */   \"defineComponent\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineComponent),\n/* harmony export */   \"defineCustomElement\": () => (/* binding */ defineCustomElement),\n/* harmony export */   \"defineEmits\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineEmits),\n/* harmony export */   \"defineExpose\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineExpose),\n/* harmony export */   \"defineProps\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineProps),\n/* harmony export */   \"defineSSRCustomElement\": () => (/* binding */ defineSSRCustomElement),\n/* harmony export */   \"devtools\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.devtools),\n/* harmony export */   \"effect\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.effect),\n/* harmony export */   \"effectScope\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.effectScope),\n/* harmony export */   \"getCurrentInstance\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance),\n/* harmony export */   \"getCurrentScope\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentScope),\n/* harmony export */   \"getTransitionRawChildren\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getTransitionRawChildren),\n/* harmony export */   \"guardReactiveProps\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.guardReactiveProps),\n/* harmony export */   \"h\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.h),\n/* harmony export */   \"handleError\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.handleError),\n/* harmony export */   \"hydrate\": () => (/* binding */ hydrate),\n/* harmony export */   \"initCustomFormatter\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.initCustomFormatter),\n/* harmony export */   \"initDirectivesForSSR\": () => (/* binding */ initDirectivesForSSR),\n/* harmony export */   \"inject\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.inject),\n/* harmony export */   \"isMemoSame\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isMemoSame),\n/* harmony export */   \"isProxy\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isProxy),\n/* harmony export */   \"isReactive\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isReactive),\n/* harmony export */   \"isReadonly\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isReadonly),\n/* harmony export */   \"isRef\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isRef),\n/* harmony export */   \"isRuntimeOnly\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isRuntimeOnly),\n/* harmony export */   \"isShallow\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isShallow),\n/* harmony export */   \"isVNode\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isVNode),\n/* harmony export */   \"markRaw\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.markRaw),\n/* harmony export */   \"mergeDefaults\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.mergeDefaults),\n/* harmony export */   \"mergeProps\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.mergeProps),\n/* harmony export */   \"nextTick\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.nextTick),\n/* harmony export */   \"normalizeClass\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.normalizeClass),\n/* harmony export */   \"normalizeProps\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.normalizeProps),\n/* harmony export */   \"normalizeStyle\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle),\n/* harmony export */   \"onActivated\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onActivated),\n/* harmony export */   \"onBeforeMount\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onBeforeMount),\n/* harmony export */   \"onBeforeUnmount\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onBeforeUnmount),\n/* harmony export */   \"onBeforeUpdate\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onBeforeUpdate),\n/* harmony export */   \"onDeactivated\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onDeactivated),\n/* harmony export */   \"onErrorCaptured\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onErrorCaptured),\n/* harmony export */   \"onMounted\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onMounted),\n/* harmony export */   \"onRenderTracked\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onRenderTracked),\n/* harmony export */   \"onRenderTriggered\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onRenderTriggered),\n/* harmony export */   \"onScopeDispose\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onScopeDispose),\n/* harmony export */   \"onServerPrefetch\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onServerPrefetch),\n/* harmony export */   \"onUnmounted\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onUnmounted),\n/* harmony export */   \"onUpdated\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onUpdated),\n/* harmony export */   \"openBlock\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.openBlock),\n/* harmony export */   \"popScopeId\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.popScopeId),\n/* harmony export */   \"provide\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.provide),\n/* harmony export */   \"proxyRefs\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.proxyRefs),\n/* harmony export */   \"pushScopeId\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.pushScopeId),\n/* harmony export */   \"queuePostFlushCb\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.queuePostFlushCb),\n/* harmony export */   \"reactive\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.reactive),\n/* harmony export */   \"readonly\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.readonly),\n/* harmony export */   \"ref\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ref),\n/* harmony export */   \"registerRuntimeCompiler\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.registerRuntimeCompiler),\n/* harmony export */   \"render\": () => (/* binding */ render),\n/* harmony export */   \"renderList\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.renderList),\n/* harmony export */   \"renderSlot\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.renderSlot),\n/* harmony export */   \"resolveComponent\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveComponent),\n/* harmony export */   \"resolveDirective\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveDirective),\n/* harmony export */   \"resolveDynamicComponent\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent),\n/* harmony export */   \"resolveFilter\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveFilter),\n/* harmony export */   \"resolveTransitionHooks\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveTransitionHooks),\n/* harmony export */   \"setBlockTracking\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setBlockTracking),\n/* harmony export */   \"setDevtoolsHook\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setDevtoolsHook),\n/* harmony export */   \"setTransitionHooks\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setTransitionHooks),\n/* harmony export */   \"shallowReactive\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.shallowReactive),\n/* harmony export */   \"shallowReadonly\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly),\n/* harmony export */   \"shallowRef\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.shallowRef),\n/* harmony export */   \"ssrContextKey\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ssrContextKey),\n/* harmony export */   \"ssrUtils\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ssrUtils),\n/* harmony export */   \"stop\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.stop),\n/* harmony export */   \"toDisplayString\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toDisplayString),\n/* harmony export */   \"toHandlerKey\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toHandlerKey),\n/* harmony export */   \"toHandlers\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toHandlers),\n/* harmony export */   \"toRaw\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toRaw),\n/* harmony export */   \"toRef\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toRef),\n/* harmony export */   \"toRefs\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toRefs),\n/* harmony export */   \"transformVNodeArgs\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.transformVNodeArgs),\n/* harmony export */   \"triggerRef\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.triggerRef),\n/* harmony export */   \"unref\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.unref),\n/* harmony export */   \"useAttrs\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useAttrs),\n/* harmony export */   \"useCssModule\": () => (/* binding */ useCssModule),\n/* harmony export */   \"useCssVars\": () => (/* binding */ useCssVars),\n/* harmony export */   \"useSSRContext\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useSSRContext),\n/* harmony export */   \"useSlots\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useSlots),\n/* harmony export */   \"useTransitionState\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useTransitionState),\n/* harmony export */   \"vModelCheckbox\": () => (/* binding */ vModelCheckbox),\n/* harmony export */   \"vModelDynamic\": () => (/* binding */ vModelDynamic),\n/* harmony export */   \"vModelRadio\": () => (/* binding */ vModelRadio),\n/* harmony export */   \"vModelSelect\": () => (/* binding */ vModelSelect),\n/* harmony export */   \"vModelText\": () => (/* binding */ vModelText),\n/* harmony export */   \"vShow\": () => (/* binding */ vShow),\n/* harmony export */   \"version\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.version),\n/* harmony export */   \"warn\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn),\n/* harmony export */   \"watch\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watch),\n/* harmony export */   \"watchEffect\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watchEffect),\n/* harmony export */   \"watchPostEffect\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watchPostEffect),\n/* harmony export */   \"watchSyncEffect\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watchSyncEffect),\n/* harmony export */   \"withAsyncContext\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withAsyncContext),\n/* harmony export */   \"withCtx\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withCtx),\n/* harmony export */   \"withDefaults\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withDefaults),\n/* harmony export */   \"withDirectives\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withDirectives),\n/* harmony export */   \"withKeys\": () => (/* binding */ withKeys),\n/* harmony export */   \"withMemo\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withMemo),\n/* harmony export */   \"withModifiers\": () => (/* binding */ withModifiers),\n/* harmony export */   \"withScopeId\": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withScopeId)\n/* harmony export */ });\n/* harmony import */ var _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/runtime-core */ \"./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js\");\n/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/shared */ \"./node_modules/@vue/shared/dist/shared.esm-bundler.js\");\n/* harmony import */ var _vue_runtime_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @vue/runtime-core */ \"./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js\");\n\n\n\n\nconst svgNS = 'http://www.w3.org/2000/svg';\nconst doc = (typeof document !== 'undefined' ? document : null);\nconst templateContainer = doc && /*#__PURE__*/ doc.createElement('template');\nconst nodeOps = {\n    insert: (child, parent, anchor) => {\n        parent.insertBefore(child, anchor || null);\n    },\n    remove: child => {\n        const parent = child.parentNode;\n        if (parent) {\n            parent.removeChild(child);\n        }\n    },\n    createElement: (tag, isSVG, is, props) => {\n        const el = isSVG\n            ? doc.createElementNS(svgNS, tag)\n            : doc.createElement(tag, is ? { is } : undefined);\n        if (tag === 'select' && props && props.multiple != null) {\n            el.setAttribute('multiple', props.multiple);\n        }\n        return el;\n    },\n    createText: text => doc.createTextNode(text),\n    createComment: text => doc.createComment(text),\n    setText: (node, text) => {\n        node.nodeValue = text;\n    },\n    setElementText: (el, text) => {\n        el.textContent = text;\n    },\n    parentNode: node => node.parentNode,\n    nextSibling: node => node.nextSibling,\n    querySelector: selector => doc.querySelector(selector),\n    setScopeId(el, id) {\n        el.setAttribute(id, '');\n    },\n    // __UNSAFE__\n    // Reason: innerHTML.\n    // Static content here can only come from compiled templates.\n    // As long as the user only uses trusted templates, this is safe.\n    insertStaticContent(content, parent, anchor, isSVG, start, end) {\n        // <parent> before | first ... last | anchor </parent>\n        const before = anchor ? anchor.previousSibling : parent.lastChild;\n        // #5308 can only take cached path if:\n        // - has a single root node\n        // - nextSibling info is still available\n        if (start && (start === end || start.nextSibling)) {\n            // cached\n            while (true) {\n                parent.insertBefore(start.cloneNode(true), anchor);\n                if (start === end || !(start = start.nextSibling))\n                    break;\n            }\n        }\n        else {\n            // fresh insert\n            templateContainer.innerHTML = isSVG ? `<svg>${content}</svg>` : content;\n            const template = templateContainer.content;\n            if (isSVG) {\n                // remove outer svg wrapper\n                const wrapper = template.firstChild;\n                while (wrapper.firstChild) {\n                    template.appendChild(wrapper.firstChild);\n                }\n                template.removeChild(wrapper);\n            }\n            parent.insertBefore(template, anchor);\n        }\n        return [\n            // first\n            before ? before.nextSibling : parent.firstChild,\n            // last\n            anchor ? anchor.previousSibling : parent.lastChild\n        ];\n    }\n};\n\n// compiler should normalize class + :class bindings on the same element\n// into a single binding ['staticClass', dynamic]\nfunction patchClass(el, value, isSVG) {\n    // directly setting className should be faster than setAttribute in theory\n    // if this is an element during a transition, take the temporary transition\n    // classes into account.\n    const transitionClasses = el._vtc;\n    if (transitionClasses) {\n        value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(' ');\n    }\n    if (value == null) {\n        el.removeAttribute('class');\n    }\n    else if (isSVG) {\n        el.setAttribute('class', value);\n    }\n    else {\n        el.className = value;\n    }\n}\n\nfunction patchStyle(el, prev, next) {\n    const style = el.style;\n    const isCssString = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(next);\n    if (next && !isCssString) {\n        if (prev && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(prev)) {\n            for (const key in prev) {\n                if (next[key] == null) {\n                    setStyle(style, key, '');\n                }\n            }\n        }\n        for (const key in next) {\n            setStyle(style, key, next[key]);\n        }\n    }\n    else {\n        const currentDisplay = style.display;\n        if (isCssString) {\n            if (prev !== next) {\n                style.cssText = next;\n            }\n        }\n        else if (prev) {\n            el.removeAttribute('style');\n        }\n        // indicates that the `display` of the element is controlled by `v-show`,\n        // so we always keep the current `display` value regardless of the `style`\n        // value, thus handing over control to `v-show`.\n        if ('_vod' in el) {\n            style.display = currentDisplay;\n        }\n    }\n}\nconst semicolonRE = /[^\\\\];\\s*$/;\nconst importantRE = /\\s*!important$/;\nfunction setStyle(style, name, val) {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(val)) {\n        val.forEach(v => setStyle(style, name, v));\n    }\n    else {\n        if (val == null)\n            val = '';\n        if ((true)) {\n            if (semicolonRE.test(val)) {\n                (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`Unexpected semicolon at the end of '${name}' style value: '${val}'`);\n            }\n        }\n        if (name.startsWith('--')) {\n            // custom property definition\n            style.setProperty(name, val);\n        }\n        else {\n            const prefixed = autoPrefix(style, name);\n            if (importantRE.test(val)) {\n                // !important\n                style.setProperty((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(prefixed), val.replace(importantRE, ''), 'important');\n            }\n            else {\n                style[prefixed] = val;\n            }\n        }\n    }\n}\nconst prefixes = ['Webkit', 'Moz', 'ms'];\nconst prefixCache = {};\nfunction autoPrefix(style, rawName) {\n    const cached = prefixCache[rawName];\n    if (cached) {\n        return cached;\n    }\n    let name = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(rawName);\n    if (name !== 'filter' && name in style) {\n        return (prefixCache[rawName] = name);\n    }\n    name = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize)(name);\n    for (let i = 0; i < prefixes.length; i++) {\n        const prefixed = prefixes[i] + name;\n        if (prefixed in style) {\n            return (prefixCache[rawName] = prefixed);\n        }\n    }\n    return rawName;\n}\n\nconst xlinkNS = 'http://www.w3.org/1999/xlink';\nfunction patchAttr(el, key, value, isSVG, instance) {\n    if (isSVG && key.startsWith('xlink:')) {\n        if (value == null) {\n            el.removeAttributeNS(xlinkNS, key.slice(6, key.length));\n        }\n        else {\n            el.setAttributeNS(xlinkNS, key, value);\n        }\n    }\n    else {\n        // note we are only checking boolean attributes that don't have a\n        // corresponding dom prop of the same name here.\n        const isBoolean = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSpecialBooleanAttr)(key);\n        if (value == null || (isBoolean && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.includeBooleanAttr)(value))) {\n            el.removeAttribute(key);\n        }\n        else {\n            el.setAttribute(key, isBoolean ? '' : value);\n        }\n    }\n}\n\n// __UNSAFE__\n// functions. The user is responsible for using them with only trusted content.\nfunction patchDOMProp(el, key, value, \n// the following args are passed only due to potential innerHTML/textContent\n// overriding existing VNodes, in which case the old tree must be properly\n// unmounted.\nprevChildren, parentComponent, parentSuspense, unmountChildren) {\n    if (key === 'innerHTML' || key === 'textContent') {\n        if (prevChildren) {\n            unmountChildren(prevChildren, parentComponent, parentSuspense);\n        }\n        el[key] = value == null ? '' : value;\n        return;\n    }\n    if (key === 'value' &&\n        el.tagName !== 'PROGRESS' &&\n        // custom elements may use _value internally\n        !el.tagName.includes('-')) {\n        // store value as _value as well since\n        // non-string values will be stringified.\n        el._value = value;\n        const newValue = value == null ? '' : value;\n        if (el.value !== newValue ||\n            // #4956: always set for OPTION elements because its value falls back to\n            // textContent if no value attribute is present. And setting .value for\n            // OPTION has no side effect\n            el.tagName === 'OPTION') {\n            el.value = newValue;\n        }\n        if (value == null) {\n            el.removeAttribute(key);\n        }\n        return;\n    }\n    let needRemove = false;\n    if (value === '' || value == null) {\n        const type = typeof el[key];\n        if (type === 'boolean') {\n            // e.g. <select multiple> compiles to { multiple: '' }\n            value = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.includeBooleanAttr)(value);\n        }\n        else if (value == null && type === 'string') {\n            // e.g. <div :id=\"null\">\n            value = '';\n            needRemove = true;\n        }\n        else if (type === 'number') {\n            // e.g. <img :width=\"null\">\n            value = 0;\n            needRemove = true;\n        }\n    }\n    // some properties perform value validation and throw,\n    // some properties has getter, no setter, will error in 'use strict'\n    // eg. <select :type=\"null\"></select> <select :willValidate=\"null\"></select>\n    try {\n        el[key] = value;\n    }\n    catch (e) {\n        // do not warn if value is auto-coerced from nullish values\n        if (( true) && !needRemove) {\n            (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`Failed setting prop \"${key}\" on <${el.tagName.toLowerCase()}>: ` +\n                `value ${value} is invalid.`, e);\n        }\n    }\n    needRemove && el.removeAttribute(key);\n}\n\nfunction addEventListener(el, event, handler, options) {\n    el.addEventListener(event, handler, options);\n}\nfunction removeEventListener(el, event, handler, options) {\n    el.removeEventListener(event, handler, options);\n}\nfunction patchEvent(el, rawName, prevValue, nextValue, instance = null) {\n    // vei = vue event invokers\n    const invokers = el._vei || (el._vei = {});\n    const existingInvoker = invokers[rawName];\n    if (nextValue && existingInvoker) {\n        // patch\n        existingInvoker.value = nextValue;\n    }\n    else {\n        const [name, options] = parseName(rawName);\n        if (nextValue) {\n            // add\n            const invoker = (invokers[rawName] = createInvoker(nextValue, instance));\n            addEventListener(el, name, invoker, options);\n        }\n        else if (existingInvoker) {\n            // remove\n            removeEventListener(el, name, existingInvoker, options);\n            invokers[rawName] = undefined;\n        }\n    }\n}\nconst optionsModifierRE = /(?:Once|Passive|Capture)$/;\nfunction parseName(name) {\n    let options;\n    if (optionsModifierRE.test(name)) {\n        options = {};\n        let m;\n        while ((m = name.match(optionsModifierRE))) {\n            name = name.slice(0, name.length - m[0].length);\n            options[m[0].toLowerCase()] = true;\n        }\n    }\n    const event = name[2] === ':' ? name.slice(3) : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(name.slice(2));\n    return [event, options];\n}\n// To avoid the overhead of repeatedly calling Date.now(), we cache\n// and use the same timestamp for all event listeners attached in the same tick.\nlet cachedNow = 0;\nconst p = /*#__PURE__*/ Promise.resolve();\nconst getNow = () => cachedNow || (p.then(() => (cachedNow = 0)), (cachedNow = Date.now()));\nfunction createInvoker(initialValue, instance) {\n    const invoker = (e) => {\n        // async edge case vuejs/vue#6566\n        // inner click event triggers patch, event handler\n        // attached to outer element during patch, and triggered again. This\n        // happens because browsers fire microtask ticks between event propagation.\n        // this no longer happens for templates in Vue 3, but could still be\n        // theoretically possible for hand-written render functions.\n        // the solution: we save the timestamp when a handler is attached,\n        // and also attach the timestamp to any event that was handled by vue\n        // for the first time (to avoid inconsistent event timestamp implementations\n        // or events fired from iframes, e.g. #2513)\n        // The handler would only fire if the event passed to it was fired\n        // AFTER it was attached.\n        if (!e._vts) {\n            e._vts = Date.now();\n        }\n        else if (e._vts <= invoker.attached) {\n            return;\n        }\n        (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.callWithAsyncErrorHandling)(patchStopImmediatePropagation(e, invoker.value), instance, 5 /* ErrorCodes.NATIVE_EVENT_HANDLER */, [e]);\n    };\n    invoker.value = initialValue;\n    invoker.attached = getNow();\n    return invoker;\n}\nfunction patchStopImmediatePropagation(e, value) {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) {\n        const originalStop = e.stopImmediatePropagation;\n        e.stopImmediatePropagation = () => {\n            originalStop.call(e);\n            e._stopped = true;\n        };\n        return value.map(fn => (e) => !e._stopped && fn && fn(e));\n    }\n    else {\n        return value;\n    }\n}\n\nconst nativeOnRE = /^on[a-z]/;\nconst patchProp = (el, key, prevValue, nextValue, isSVG = false, prevChildren, parentComponent, parentSuspense, unmountChildren) => {\n    if (key === 'class') {\n        patchClass(el, nextValue, isSVG);\n    }\n    else if (key === 'style') {\n        patchStyle(el, prevValue, nextValue);\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) {\n        // ignore v-model listeners\n        if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isModelListener)(key)) {\n            patchEvent(el, key, prevValue, nextValue, parentComponent);\n        }\n    }\n    else if (key[0] === '.'\n        ? ((key = key.slice(1)), true)\n        : key[0] === '^'\n            ? ((key = key.slice(1)), false)\n            : shouldSetAsProp(el, key, nextValue, isSVG)) {\n        patchDOMProp(el, key, nextValue, prevChildren, parentComponent, parentSuspense, unmountChildren);\n    }\n    else {\n        // special case for <input v-model type=\"checkbox\"> with\n        // :true-value & :false-value\n        // store value as dom properties since non-string values will be\n        // stringified.\n        if (key === 'true-value') {\n            el._trueValue = nextValue;\n        }\n        else if (key === 'false-value') {\n            el._falseValue = nextValue;\n        }\n        patchAttr(el, key, nextValue, isSVG);\n    }\n};\nfunction shouldSetAsProp(el, key, value, isSVG) {\n    if (isSVG) {\n        // most keys must be set as attribute on svg elements to work\n        // ...except innerHTML & textContent\n        if (key === 'innerHTML' || key === 'textContent') {\n            return true;\n        }\n        // or native onclick with function values\n        if (key in el && nativeOnRE.test(key) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value)) {\n            return true;\n        }\n        return false;\n    }\n    // these are enumerated attrs, however their corresponding DOM properties\n    // are actually booleans - this leads to setting it with a string \"false\"\n    // value leading it to be coerced to `true`, so we need to always treat\n    // them as attributes.\n    // Note that `contentEditable` doesn't have this problem: its DOM\n    // property is also enumerated string values.\n    if (key === 'spellcheck' || key === 'draggable' || key === 'translate') {\n        return false;\n    }\n    // #1787, #2840 form property on form elements is readonly and must be set as\n    // attribute.\n    if (key === 'form') {\n        return false;\n    }\n    // #1526 <input list> must be set as attribute\n    if (key === 'list' && el.tagName === 'INPUT') {\n        return false;\n    }\n    // #2766 <textarea type> must be set as attribute\n    if (key === 'type' && el.tagName === 'TEXTAREA') {\n        return false;\n    }\n    // native onclick with string value, must be set as attribute\n    if (nativeOnRE.test(key) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(value)) {\n        return false;\n    }\n    return key in el;\n}\n\nfunction defineCustomElement(options, hydrate) {\n    const Comp = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineComponent)(options);\n    class VueCustomElement extends VueElement {\n        constructor(initialProps) {\n            super(Comp, initialProps, hydrate);\n        }\n    }\n    VueCustomElement.def = Comp;\n    return VueCustomElement;\n}\nconst defineSSRCustomElement = ((options) => {\n    // @ts-ignore\n    return defineCustomElement(options, hydrate);\n});\nconst BaseClass = (typeof HTMLElement !== 'undefined' ? HTMLElement : class {\n});\nclass VueElement extends BaseClass {\n    constructor(_def, _props = {}, hydrate) {\n        super();\n        this._def = _def;\n        this._props = _props;\n        /**\n         * @internal\n         */\n        this._instance = null;\n        this._connected = false;\n        this._resolved = false;\n        this._numberProps = null;\n        if (this.shadowRoot && hydrate) {\n            hydrate(this._createVNode(), this.shadowRoot);\n        }\n        else {\n            if (( true) && this.shadowRoot) {\n                (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`Custom element has pre-rendered declarative shadow root but is not ` +\n                    `defined as hydratable. Use \\`defineSSRCustomElement\\`.`);\n            }\n            this.attachShadow({ mode: 'open' });\n            if (!this._def.__asyncLoader) {\n                // for sync component defs we can immediately resolve props\n                this._resolveProps(this._def);\n            }\n        }\n    }\n    connectedCallback() {\n        this._connected = true;\n        if (!this._instance) {\n            if (this._resolved) {\n                this._update();\n            }\n            else {\n                this._resolveDef();\n            }\n        }\n    }\n    disconnectedCallback() {\n        this._connected = false;\n        (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.nextTick)(() => {\n            if (!this._connected) {\n                render(null, this.shadowRoot);\n                this._instance = null;\n            }\n        });\n    }\n    /**\n     * resolve inner component definition (handle possible async component)\n     */\n    _resolveDef() {\n        this._resolved = true;\n        // set initial attrs\n        for (let i = 0; i < this.attributes.length; i++) {\n            this._setAttr(this.attributes[i].name);\n        }\n        // watch future attr changes\n        new MutationObserver(mutations => {\n            for (const m of mutations) {\n                this._setAttr(m.attributeName);\n            }\n        }).observe(this, { attributes: true });\n        const resolve = (def, isAsync = false) => {\n            const { props, styles } = def;\n            // cast Number-type props set before resolve\n            let numberProps;\n            if (props && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(props)) {\n                for (const key in props) {\n                    const opt = props[key];\n                    if (opt === Number || (opt && opt.type === Number)) {\n                        if (key in this._props) {\n                            this._props[key] = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(this._props[key]);\n                        }\n                        (numberProps || (numberProps = Object.create(null)))[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key)] = true;\n                    }\n                }\n            }\n            this._numberProps = numberProps;\n            if (isAsync) {\n                // defining getter/setters on prototype\n                // for sync defs, this already happened in the constructor\n                this._resolveProps(def);\n            }\n            // apply CSS\n            this._applyStyles(styles);\n            // initial render\n            this._update();\n        };\n        const asyncDef = this._def.__asyncLoader;\n        if (asyncDef) {\n            asyncDef().then(def => resolve(def, true));\n        }\n        else {\n            resolve(this._def);\n        }\n    }\n    _resolveProps(def) {\n        const { props } = def;\n        const declaredPropKeys = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(props) ? props : Object.keys(props || {});\n        // check if there are props set pre-upgrade or connect\n        for (const key of Object.keys(this)) {\n            if (key[0] !== '_' && declaredPropKeys.includes(key)) {\n                this._setProp(key, this[key], true, false);\n            }\n        }\n        // defining getter/setters on prototype\n        for (const key of declaredPropKeys.map(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)) {\n            Object.defineProperty(this, key, {\n                get() {\n                    return this._getProp(key);\n                },\n                set(val) {\n                    this._setProp(key, val);\n                }\n            });\n        }\n    }\n    _setAttr(key) {\n        let value = this.getAttribute(key);\n        const camelKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key);\n        if (this._numberProps && this._numberProps[camelKey]) {\n            value = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(value);\n        }\n        this._setProp(camelKey, value, false);\n    }\n    /**\n     * @internal\n     */\n    _getProp(key) {\n        return this._props[key];\n    }\n    /**\n     * @internal\n     */\n    _setProp(key, val, shouldReflect = true, shouldUpdate = true) {\n        if (val !== this._props[key]) {\n            this._props[key] = val;\n            if (shouldUpdate && this._instance) {\n                this._update();\n            }\n            // reflect\n            if (shouldReflect) {\n                if (val === true) {\n                    this.setAttribute((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key), '');\n                }\n                else if (typeof val === 'string' || typeof val === 'number') {\n                    this.setAttribute((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key), val + '');\n                }\n                else if (!val) {\n                    this.removeAttribute((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key));\n                }\n            }\n        }\n    }\n    _update() {\n        render(this._createVNode(), this.shadowRoot);\n    }\n    _createVNode() {\n        const vnode = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createVNode)(this._def, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, this._props));\n        if (!this._instance) {\n            vnode.ce = instance => {\n                this._instance = instance;\n                instance.isCE = true;\n                // HMR\n                if ((true)) {\n                    instance.ceReload = newStyles => {\n                        // always reset styles\n                        if (this._styles) {\n                            this._styles.forEach(s => this.shadowRoot.removeChild(s));\n                            this._styles.length = 0;\n                        }\n                        this._applyStyles(newStyles);\n                        this._instance = null;\n                        this._update();\n                    };\n                }\n                const dispatch = (event, args) => {\n                    this.dispatchEvent(new CustomEvent(event, {\n                        detail: args\n                    }));\n                };\n                // intercept emit\n                instance.emit = (event, ...args) => {\n                    // dispatch both the raw and hyphenated versions of an event\n                    // to match Vue behavior\n                    dispatch(event, args);\n                    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(event) !== event) {\n                        dispatch((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(event), args);\n                    }\n                };\n                // locate nearest Vue custom element parent for provide/inject\n                let parent = this;\n                while ((parent =\n                    parent && (parent.parentNode || parent.host))) {\n                    if (parent instanceof VueElement) {\n                        instance.parent = parent._instance;\n                        instance.provides = parent._instance.provides;\n                        break;\n                    }\n                }\n            };\n        }\n        return vnode;\n    }\n    _applyStyles(styles) {\n        if (styles) {\n            styles.forEach(css => {\n                const s = document.createElement('style');\n                s.textContent = css;\n                this.shadowRoot.appendChild(s);\n                // record for HMR\n                if ((true)) {\n                    (this._styles || (this._styles = [])).push(s);\n                }\n            });\n        }\n    }\n}\n\nfunction useCssModule(name = '$style') {\n    /* istanbul ignore else */\n    {\n        const instance = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)();\n        if (!instance) {\n            ( true) && (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`useCssModule must be called inside setup()`);\n            return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;\n        }\n        const modules = instance.type.__cssModules;\n        if (!modules) {\n            ( true) && (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`Current instance does not have CSS modules injected.`);\n            return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;\n        }\n        const mod = modules[name];\n        if (!mod) {\n            ( true) &&\n                (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`Current instance does not have CSS module named \"${name}\".`);\n            return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;\n        }\n        return mod;\n    }\n}\n\n/**\n * Runtime helper for SFC's CSS variable injection feature.\n * @private\n */\nfunction useCssVars(getter) {\n    const instance = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)();\n    /* istanbul ignore next */\n    if (!instance) {\n        ( true) &&\n            (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`useCssVars is called without current active component instance.`);\n        return;\n    }\n    const updateTeleports = (instance.ut = (vars = getter(instance.proxy)) => {\n        Array.from(document.querySelectorAll(`[data-v-owner=\"${instance.uid}\"]`)).forEach(node => setVarsOnNode(node, vars));\n    });\n    const setVars = () => {\n        const vars = getter(instance.proxy);\n        setVarsOnVNode(instance.subTree, vars);\n        updateTeleports(vars);\n    };\n    (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watchPostEffect)(setVars);\n    (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onMounted)(() => {\n        const ob = new MutationObserver(setVars);\n        ob.observe(instance.subTree.el.parentNode, { childList: true });\n        (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onUnmounted)(() => ob.disconnect());\n    });\n}\nfunction setVarsOnVNode(vnode, vars) {\n    if (vnode.shapeFlag & 128 /* ShapeFlags.SUSPENSE */) {\n        const suspense = vnode.suspense;\n        vnode = suspense.activeBranch;\n        if (suspense.pendingBranch && !suspense.isHydrating) {\n            suspense.effects.push(() => {\n                setVarsOnVNode(suspense.activeBranch, vars);\n            });\n        }\n    }\n    // drill down HOCs until it's a non-component vnode\n    while (vnode.component) {\n        vnode = vnode.component.subTree;\n    }\n    if (vnode.shapeFlag & 1 /* ShapeFlags.ELEMENT */ && vnode.el) {\n        setVarsOnNode(vnode.el, vars);\n    }\n    else if (vnode.type === _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Fragment) {\n        vnode.children.forEach(c => setVarsOnVNode(c, vars));\n    }\n    else if (vnode.type === _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Static) {\n        let { el, anchor } = vnode;\n        while (el) {\n            setVarsOnNode(el, vars);\n            if (el === anchor)\n                break;\n            el = el.nextSibling;\n        }\n    }\n}\nfunction setVarsOnNode(el, vars) {\n    if (el.nodeType === 1) {\n        const style = el.style;\n        for (const key in vars) {\n            style.setProperty(`--${key}`, vars[key]);\n        }\n    }\n}\n\nconst TRANSITION = 'transition';\nconst ANIMATION = 'animation';\n// DOM Transition is a higher-order-component based on the platform-agnostic\n// base Transition component, with DOM-specific logic.\nconst Transition = (props, { slots }) => (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.h)(_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.BaseTransition, resolveTransitionProps(props), slots);\nTransition.displayName = 'Transition';\nconst DOMTransitionPropsValidators = {\n    name: String,\n    type: String,\n    css: {\n        type: Boolean,\n        default: true\n    },\n    duration: [String, Number, Object],\n    enterFromClass: String,\n    enterActiveClass: String,\n    enterToClass: String,\n    appearFromClass: String,\n    appearActiveClass: String,\n    appearToClass: String,\n    leaveFromClass: String,\n    leaveActiveClass: String,\n    leaveToClass: String\n};\nconst TransitionPropsValidators = (Transition.props =\n    /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.BaseTransition.props, DOMTransitionPropsValidators));\n/**\n * #3227 Incoming hooks may be merged into arrays when wrapping Transition\n * with custom HOCs.\n */\nconst callHook = (hook, args = []) => {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(hook)) {\n        hook.forEach(h => h(...args));\n    }\n    else if (hook) {\n        hook(...args);\n    }\n};\n/**\n * Check if a hook expects a callback (2nd arg), which means the user\n * intends to explicitly control the end of the transition.\n */\nconst hasExplicitCallback = (hook) => {\n    return hook\n        ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(hook)\n            ? hook.some(h => h.length > 1)\n            : hook.length > 1\n        : false;\n};\nfunction resolveTransitionProps(rawProps) {\n    const baseProps = {};\n    for (const key in rawProps) {\n        if (!(key in DOMTransitionPropsValidators)) {\n            baseProps[key] = rawProps[key];\n        }\n    }\n    if (rawProps.css === false) {\n        return baseProps;\n    }\n    const { name = 'v', type, duration, enterFromClass = `${name}-enter-from`, enterActiveClass = `${name}-enter-active`, enterToClass = `${name}-enter-to`, appearFromClass = enterFromClass, appearActiveClass = enterActiveClass, appearToClass = enterToClass, leaveFromClass = `${name}-leave-from`, leaveActiveClass = `${name}-leave-active`, leaveToClass = `${name}-leave-to` } = rawProps;\n    const durations = normalizeDuration(duration);\n    const enterDuration = durations && durations[0];\n    const leaveDuration = durations && durations[1];\n    const { onBeforeEnter, onEnter, onEnterCancelled, onLeave, onLeaveCancelled, onBeforeAppear = onBeforeEnter, onAppear = onEnter, onAppearCancelled = onEnterCancelled } = baseProps;\n    const finishEnter = (el, isAppear, done) => {\n        removeTransitionClass(el, isAppear ? appearToClass : enterToClass);\n        removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass);\n        done && done();\n    };\n    const finishLeave = (el, done) => {\n        el._isLeaving = false;\n        removeTransitionClass(el, leaveFromClass);\n        removeTransitionClass(el, leaveToClass);\n        removeTransitionClass(el, leaveActiveClass);\n        done && done();\n    };\n    const makeEnterHook = (isAppear) => {\n        return (el, done) => {\n            const hook = isAppear ? onAppear : onEnter;\n            const resolve = () => finishEnter(el, isAppear, done);\n            callHook(hook, [el, resolve]);\n            nextFrame(() => {\n                removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass);\n                addTransitionClass(el, isAppear ? appearToClass : enterToClass);\n                if (!hasExplicitCallback(hook)) {\n                    whenTransitionEnds(el, type, enterDuration, resolve);\n                }\n            });\n        };\n    };\n    return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(baseProps, {\n        onBeforeEnter(el) {\n            callHook(onBeforeEnter, [el]);\n            addTransitionClass(el, enterFromClass);\n            addTransitionClass(el, enterActiveClass);\n        },\n        onBeforeAppear(el) {\n            callHook(onBeforeAppear, [el]);\n            addTransitionClass(el, appearFromClass);\n            addTransitionClass(el, appearActiveClass);\n        },\n        onEnter: makeEnterHook(false),\n        onAppear: makeEnterHook(true),\n        onLeave(el, done) {\n            el._isLeaving = true;\n            const resolve = () => finishLeave(el, done);\n            addTransitionClass(el, leaveFromClass);\n            // force reflow so *-leave-from classes immediately take effect (#2593)\n            forceReflow();\n            addTransitionClass(el, leaveActiveClass);\n            nextFrame(() => {\n                if (!el._isLeaving) {\n                    // cancelled\n                    return;\n                }\n                removeTransitionClass(el, leaveFromClass);\n                addTransitionClass(el, leaveToClass);\n                if (!hasExplicitCallback(onLeave)) {\n                    whenTransitionEnds(el, type, leaveDuration, resolve);\n                }\n            });\n            callHook(onLeave, [el, resolve]);\n        },\n        onEnterCancelled(el) {\n            finishEnter(el, false);\n            callHook(onEnterCancelled, [el]);\n        },\n        onAppearCancelled(el) {\n            finishEnter(el, true);\n            callHook(onAppearCancelled, [el]);\n        },\n        onLeaveCancelled(el) {\n            finishLeave(el);\n            callHook(onLeaveCancelled, [el]);\n        }\n    });\n}\nfunction normalizeDuration(duration) {\n    if (duration == null) {\n        return null;\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(duration)) {\n        return [NumberOf(duration.enter), NumberOf(duration.leave)];\n    }\n    else {\n        const n = NumberOf(duration);\n        return [n, n];\n    }\n}\nfunction NumberOf(val) {\n    const res = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(val);\n    if ((true)) {\n        (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.assertNumber)(res, '<transition> explicit duration');\n    }\n    return res;\n}\nfunction addTransitionClass(el, cls) {\n    cls.split(/\\s+/).forEach(c => c && el.classList.add(c));\n    (el._vtc ||\n        (el._vtc = new Set())).add(cls);\n}\nfunction removeTransitionClass(el, cls) {\n    cls.split(/\\s+/).forEach(c => c && el.classList.remove(c));\n    const { _vtc } = el;\n    if (_vtc) {\n        _vtc.delete(cls);\n        if (!_vtc.size) {\n            el._vtc = undefined;\n        }\n    }\n}\nfunction nextFrame(cb) {\n    requestAnimationFrame(() => {\n        requestAnimationFrame(cb);\n    });\n}\nlet endId = 0;\nfunction whenTransitionEnds(el, expectedType, explicitTimeout, resolve) {\n    const id = (el._endId = ++endId);\n    const resolveIfNotStale = () => {\n        if (id === el._endId) {\n            resolve();\n        }\n    };\n    if (explicitTimeout) {\n        return setTimeout(resolveIfNotStale, explicitTimeout);\n    }\n    const { type, timeout, propCount } = getTransitionInfo(el, expectedType);\n    if (!type) {\n        return resolve();\n    }\n    const endEvent = type + 'end';\n    let ended = 0;\n    const end = () => {\n        el.removeEventListener(endEvent, onEnd);\n        resolveIfNotStale();\n    };\n    const onEnd = (e) => {\n        if (e.target === el && ++ended >= propCount) {\n            end();\n        }\n    };\n    setTimeout(() => {\n        if (ended < propCount) {\n            end();\n        }\n    }, timeout + 1);\n    el.addEventListener(endEvent, onEnd);\n}\nfunction getTransitionInfo(el, expectedType) {\n    const styles = window.getComputedStyle(el);\n    // JSDOM may return undefined for transition properties\n    const getStyleProperties = (key) => (styles[key] || '').split(', ');\n    const transitionDelays = getStyleProperties(`${TRANSITION}Delay`);\n    const transitionDurations = getStyleProperties(`${TRANSITION}Duration`);\n    const transitionTimeout = getTimeout(transitionDelays, transitionDurations);\n    const animationDelays = getStyleProperties(`${ANIMATION}Delay`);\n    const animationDurations = getStyleProperties(`${ANIMATION}Duration`);\n    const animationTimeout = getTimeout(animationDelays, animationDurations);\n    let type = null;\n    let timeout = 0;\n    let propCount = 0;\n    /* istanbul ignore if */\n    if (expectedType === TRANSITION) {\n        if (transitionTimeout > 0) {\n            type = TRANSITION;\n            timeout = transitionTimeout;\n            propCount = transitionDurations.length;\n        }\n    }\n    else if (expectedType === ANIMATION) {\n        if (animationTimeout > 0) {\n            type = ANIMATION;\n            timeout = animationTimeout;\n            propCount = animationDurations.length;\n        }\n    }\n    else {\n        timeout = Math.max(transitionTimeout, animationTimeout);\n        type =\n            timeout > 0\n                ? transitionTimeout > animationTimeout\n                    ? TRANSITION\n                    : ANIMATION\n                : null;\n        propCount = type\n            ? type === TRANSITION\n                ? transitionDurations.length\n                : animationDurations.length\n            : 0;\n    }\n    const hasTransform = type === TRANSITION &&\n        /\\b(transform|all)(,|$)/.test(getStyleProperties(`${TRANSITION}Property`).toString());\n    return {\n        type,\n        timeout,\n        propCount,\n        hasTransform\n    };\n}\nfunction getTimeout(delays, durations) {\n    while (delays.length < durations.length) {\n        delays = delays.concat(delays);\n    }\n    return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i])));\n}\n// Old versions of Chromium (below 61.0.3163.100) formats floating pointer\n// numbers in a locale-dependent way, using a comma instead of a dot.\n// If comma is not replaced with a dot, the input will be rounded down\n// (i.e. acting as a floor function) causing unexpected behaviors\nfunction toMs(s) {\n    return Number(s.slice(0, -1).replace(',', '.')) * 1000;\n}\n// synchronously force layout to put elements into a certain state\nfunction forceReflow() {\n    return document.body.offsetHeight;\n}\n\nconst positionMap = new WeakMap();\nconst newPositionMap = new WeakMap();\nconst TransitionGroupImpl = {\n    name: 'TransitionGroup',\n    props: /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, TransitionPropsValidators, {\n        tag: String,\n        moveClass: String\n    }),\n    setup(props, { slots }) {\n        const instance = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)();\n        const state = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useTransitionState)();\n        let prevChildren;\n        let children;\n        (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onUpdated)(() => {\n            // children is guaranteed to exist after initial render\n            if (!prevChildren.length) {\n                return;\n            }\n            const moveClass = props.moveClass || `${props.name || 'v'}-move`;\n            if (!hasCSSTransform(prevChildren[0].el, instance.vnode.el, moveClass)) {\n                return;\n            }\n            // we divide the work into three loops to avoid mixing DOM reads and writes\n            // in each iteration - which helps prevent layout thrashing.\n            prevChildren.forEach(callPendingCbs);\n            prevChildren.forEach(recordPosition);\n            const movedChildren = prevChildren.filter(applyTranslation);\n            // force reflow to put everything in position\n            forceReflow();\n            movedChildren.forEach(c => {\n                const el = c.el;\n                const style = el.style;\n                addTransitionClass(el, moveClass);\n                style.transform = style.webkitTransform = style.transitionDuration = '';\n                const cb = (el._moveCb = (e) => {\n                    if (e && e.target !== el) {\n                        return;\n                    }\n                    if (!e || /transform$/.test(e.propertyName)) {\n                        el.removeEventListener('transitionend', cb);\n                        el._moveCb = null;\n                        removeTransitionClass(el, moveClass);\n                    }\n                });\n                el.addEventListener('transitionend', cb);\n            });\n        });\n        return () => {\n            const rawProps = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_2__.toRaw)(props);\n            const cssTransitionProps = resolveTransitionProps(rawProps);\n            let tag = rawProps.tag || _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Fragment;\n            prevChildren = children;\n            children = slots.default ? (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getTransitionRawChildren)(slots.default()) : [];\n            for (let i = 0; i < children.length; i++) {\n                const child = children[i];\n                if (child.key != null) {\n                    (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setTransitionHooks)(child, (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveTransitionHooks)(child, cssTransitionProps, state, instance));\n                }\n                else if ((true)) {\n                    (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`<TransitionGroup> children must be keyed.`);\n                }\n            }\n            if (prevChildren) {\n                for (let i = 0; i < prevChildren.length; i++) {\n                    const child = prevChildren[i];\n                    (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setTransitionHooks)(child, (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveTransitionHooks)(child, cssTransitionProps, state, instance));\n                    positionMap.set(child, child.el.getBoundingClientRect());\n                }\n            }\n            return (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createVNode)(tag, null, children);\n        };\n    }\n};\n/**\n * TransitionGroup does not support \"mode\" so we need to remove it from the\n * props declarations, but direct delete operation is considered a side effect\n * and will make the entire transition feature non-tree-shakeable, so we do it\n * in a function and mark the function's invocation as pure.\n */\nconst removeMode = (props) => delete props.mode;\n/*#__PURE__*/ removeMode(TransitionGroupImpl.props);\nconst TransitionGroup = TransitionGroupImpl;\nfunction callPendingCbs(c) {\n    const el = c.el;\n    if (el._moveCb) {\n        el._moveCb();\n    }\n    if (el._enterCb) {\n        el._enterCb();\n    }\n}\nfunction recordPosition(c) {\n    newPositionMap.set(c, c.el.getBoundingClientRect());\n}\nfunction applyTranslation(c) {\n    const oldPos = positionMap.get(c);\n    const newPos = newPositionMap.get(c);\n    const dx = oldPos.left - newPos.left;\n    const dy = oldPos.top - newPos.top;\n    if (dx || dy) {\n        const s = c.el.style;\n        s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`;\n        s.transitionDuration = '0s';\n        return c;\n    }\n}\nfunction hasCSSTransform(el, root, moveClass) {\n    // Detect whether an element with the move class applied has\n    // CSS transitions. Since the element may be inside an entering\n    // transition at this very moment, we make a clone of it and remove\n    // all other transition classes applied to ensure only the move class\n    // is applied.\n    const clone = el.cloneNode();\n    if (el._vtc) {\n        el._vtc.forEach(cls => {\n            cls.split(/\\s+/).forEach(c => c && clone.classList.remove(c));\n        });\n    }\n    moveClass.split(/\\s+/).forEach(c => c && clone.classList.add(c));\n    clone.style.display = 'none';\n    const container = (root.nodeType === 1 ? root : root.parentNode);\n    container.appendChild(clone);\n    const { hasTransform } = getTransitionInfo(clone);\n    container.removeChild(clone);\n    return hasTransform;\n}\n\nconst getModelAssigner = (vnode) => {\n    const fn = vnode.props['onUpdate:modelValue'] ||\n        (false );\n    return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(fn) ? value => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(fn, value) : fn;\n};\nfunction onCompositionStart(e) {\n    e.target.composing = true;\n}\nfunction onCompositionEnd(e) {\n    const target = e.target;\n    if (target.composing) {\n        target.composing = false;\n        target.dispatchEvent(new Event('input'));\n    }\n}\n// We are exporting the v-model runtime directly as vnode hooks so that it can\n// be tree-shaken in case v-model is never used.\nconst vModelText = {\n    created(el, { modifiers: { lazy, trim, number } }, vnode) {\n        el._assign = getModelAssigner(vnode);\n        const castToNumber = number || (vnode.props && vnode.props.type === 'number');\n        addEventListener(el, lazy ? 'change' : 'input', e => {\n            if (e.target.composing)\n                return;\n            let domValue = el.value;\n            if (trim) {\n                domValue = domValue.trim();\n            }\n            if (castToNumber) {\n                domValue = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseToNumber)(domValue);\n            }\n            el._assign(domValue);\n        });\n        if (trim) {\n            addEventListener(el, 'change', () => {\n                el.value = el.value.trim();\n            });\n        }\n        if (!lazy) {\n            addEventListener(el, 'compositionstart', onCompositionStart);\n            addEventListener(el, 'compositionend', onCompositionEnd);\n            // Safari < 10.2 & UIWebView doesn't fire compositionend when\n            // switching focus before confirming composition choice\n            // this also fixes the issue where some browsers e.g. iOS Chrome\n            // fires \"change\" instead of \"input\" on autocomplete.\n            addEventListener(el, 'change', onCompositionEnd);\n        }\n    },\n    // set value on mounted so it's after min/max for type=\"range\"\n    mounted(el, { value }) {\n        el.value = value == null ? '' : value;\n    },\n    beforeUpdate(el, { value, modifiers: { lazy, trim, number } }, vnode) {\n        el._assign = getModelAssigner(vnode);\n        // avoid clearing unresolved text. #2302\n        if (el.composing)\n            return;\n        if (document.activeElement === el && el.type !== 'range') {\n            if (lazy) {\n                return;\n            }\n            if (trim && el.value.trim() === value) {\n                return;\n            }\n            if ((number || el.type === 'number') &&\n                (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseToNumber)(el.value) === value) {\n                return;\n            }\n        }\n        const newValue = value == null ? '' : value;\n        if (el.value !== newValue) {\n            el.value = newValue;\n        }\n    }\n};\nconst vModelCheckbox = {\n    // #4096 array checkboxes need to be deep traversed\n    deep: true,\n    created(el, _, vnode) {\n        el._assign = getModelAssigner(vnode);\n        addEventListener(el, 'change', () => {\n            const modelValue = el._modelValue;\n            const elementValue = getValue(el);\n            const checked = el.checked;\n            const assign = el._assign;\n            if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(modelValue)) {\n                const index = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseIndexOf)(modelValue, elementValue);\n                const found = index !== -1;\n                if (checked && !found) {\n                    assign(modelValue.concat(elementValue));\n                }\n                else if (!checked && found) {\n                    const filtered = [...modelValue];\n                    filtered.splice(index, 1);\n                    assign(filtered);\n                }\n            }\n            else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(modelValue)) {\n                const cloned = new Set(modelValue);\n                if (checked) {\n                    cloned.add(elementValue);\n                }\n                else {\n                    cloned.delete(elementValue);\n                }\n                assign(cloned);\n            }\n            else {\n                assign(getCheckboxValue(el, checked));\n            }\n        });\n    },\n    // set initial checked on mount to wait for true-value/false-value\n    mounted: setChecked,\n    beforeUpdate(el, binding, vnode) {\n        el._assign = getModelAssigner(vnode);\n        setChecked(el, binding, vnode);\n    }\n};\nfunction setChecked(el, { value, oldValue }, vnode) {\n    el._modelValue = value;\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) {\n        el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseIndexOf)(value, vnode.props.value) > -1;\n    }\n    else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value)) {\n        el.checked = value.has(vnode.props.value);\n    }\n    else if (value !== oldValue) {\n        el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(value, getCheckboxValue(el, true));\n    }\n}\nconst vModelRadio = {\n    created(el, { value }, vnode) {\n        el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(value, vnode.props.value);\n        el._assign = getModelAssigner(vnode);\n        addEventListener(el, 'change', () => {\n            el._assign(getValue(el));\n        });\n    },\n    beforeUpdate(el, { value, oldValue }, vnode) {\n        el._assign = getModelAssigner(vnode);\n        if (value !== oldValue) {\n            el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(value, vnode.props.value);\n        }\n    }\n};\nconst vModelSelect = {\n    // <select multiple> value need to be deep traversed\n    deep: true,\n    created(el, { value, modifiers: { number } }, vnode) {\n        const isSetModel = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value);\n        addEventListener(el, 'change', () => {\n            const selectedVal = Array.prototype.filter\n                .call(el.options, (o) => o.selected)\n                .map((o) => number ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseToNumber)(getValue(o)) : getValue(o));\n            el._assign(el.multiple\n                ? isSetModel\n                    ? new Set(selectedVal)\n                    : selectedVal\n                : selectedVal[0]);\n        });\n        el._assign = getModelAssigner(vnode);\n    },\n    // set value in mounted & updated because <select> relies on its children\n    // <option>s.\n    mounted(el, { value }) {\n        setSelected(el, value);\n    },\n    beforeUpdate(el, _binding, vnode) {\n        el._assign = getModelAssigner(vnode);\n    },\n    updated(el, { value }) {\n        setSelected(el, value);\n    }\n};\nfunction setSelected(el, value) {\n    const isMultiple = el.multiple;\n    if (isMultiple && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value)) {\n        ( true) &&\n            (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`<select multiple v-model> expects an Array or Set value for its binding, ` +\n                `but got ${Object.prototype.toString.call(value).slice(8, -1)}.`);\n        return;\n    }\n    for (let i = 0, l = el.options.length; i < l; i++) {\n        const option = el.options[i];\n        const optionValue = getValue(option);\n        if (isMultiple) {\n            if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) {\n                option.selected = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseIndexOf)(value, optionValue) > -1;\n            }\n            else {\n                option.selected = value.has(optionValue);\n            }\n        }\n        else {\n            if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(getValue(option), value)) {\n                if (el.selectedIndex !== i)\n                    el.selectedIndex = i;\n                return;\n            }\n        }\n    }\n    if (!isMultiple && el.selectedIndex !== -1) {\n        el.selectedIndex = -1;\n    }\n}\n// retrieve raw value set via :value bindings\nfunction getValue(el) {\n    return '_value' in el ? el._value : el.value;\n}\n// retrieve raw value for true-value and false-value set via :true-value or :false-value bindings\nfunction getCheckboxValue(el, checked) {\n    const key = checked ? '_trueValue' : '_falseValue';\n    return key in el ? el[key] : checked;\n}\nconst vModelDynamic = {\n    created(el, binding, vnode) {\n        callModelHook(el, binding, vnode, null, 'created');\n    },\n    mounted(el, binding, vnode) {\n        callModelHook(el, binding, vnode, null, 'mounted');\n    },\n    beforeUpdate(el, binding, vnode, prevVNode) {\n        callModelHook(el, binding, vnode, prevVNode, 'beforeUpdate');\n    },\n    updated(el, binding, vnode, prevVNode) {\n        callModelHook(el, binding, vnode, prevVNode, 'updated');\n    }\n};\nfunction resolveDynamicModel(tagName, type) {\n    switch (tagName) {\n        case 'SELECT':\n            return vModelSelect;\n        case 'TEXTAREA':\n            return vModelText;\n        default:\n            switch (type) {\n                case 'checkbox':\n                    return vModelCheckbox;\n                case 'radio':\n                    return vModelRadio;\n                default:\n                    return vModelText;\n            }\n    }\n}\nfunction callModelHook(el, binding, vnode, prevVNode, hook) {\n    const modelToUse = resolveDynamicModel(el.tagName, vnode.props && vnode.props.type);\n    const fn = modelToUse[hook];\n    fn && fn(el, binding, vnode, prevVNode);\n}\n// SSR vnode transforms, only used when user includes client-oriented render\n// function in SSR\nfunction initVModelForSSR() {\n    vModelText.getSSRProps = ({ value }) => ({ value });\n    vModelRadio.getSSRProps = ({ value }, vnode) => {\n        if (vnode.props && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(vnode.props.value, value)) {\n            return { checked: true };\n        }\n    };\n    vModelCheckbox.getSSRProps = ({ value }, vnode) => {\n        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) {\n            if (vnode.props && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseIndexOf)(value, vnode.props.value) > -1) {\n                return { checked: true };\n            }\n        }\n        else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value)) {\n            if (vnode.props && value.has(vnode.props.value)) {\n                return { checked: true };\n            }\n        }\n        else if (value) {\n            return { checked: true };\n        }\n    };\n    vModelDynamic.getSSRProps = (binding, vnode) => {\n        if (typeof vnode.type !== 'string') {\n            return;\n        }\n        const modelToUse = resolveDynamicModel(\n        // resolveDynamicModel expects an uppercase tag name, but vnode.type is lowercase\n        vnode.type.toUpperCase(), vnode.props && vnode.props.type);\n        if (modelToUse.getSSRProps) {\n            return modelToUse.getSSRProps(binding, vnode);\n        }\n    };\n}\n\nconst systemModifiers = ['ctrl', 'shift', 'alt', 'meta'];\nconst modifierGuards = {\n    stop: e => e.stopPropagation(),\n    prevent: e => e.preventDefault(),\n    self: e => e.target !== e.currentTarget,\n    ctrl: e => !e.ctrlKey,\n    shift: e => !e.shiftKey,\n    alt: e => !e.altKey,\n    meta: e => !e.metaKey,\n    left: e => 'button' in e && e.button !== 0,\n    middle: e => 'button' in e && e.button !== 1,\n    right: e => 'button' in e && e.button !== 2,\n    exact: (e, modifiers) => systemModifiers.some(m => e[`${m}Key`] && !modifiers.includes(m))\n};\n/**\n * @private\n */\nconst withModifiers = (fn, modifiers) => {\n    return (event, ...args) => {\n        for (let i = 0; i < modifiers.length; i++) {\n            const guard = modifierGuards[modifiers[i]];\n            if (guard && guard(event, modifiers))\n                return;\n        }\n        return fn(event, ...args);\n    };\n};\n// Kept for 2.x compat.\n// Note: IE11 compat for `spacebar` and `del` is removed for now.\nconst keyNames = {\n    esc: 'escape',\n    space: ' ',\n    up: 'arrow-up',\n    left: 'arrow-left',\n    right: 'arrow-right',\n    down: 'arrow-down',\n    delete: 'backspace'\n};\n/**\n * @private\n */\nconst withKeys = (fn, modifiers) => {\n    return (event) => {\n        if (!('key' in event)) {\n            return;\n        }\n        const eventKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(event.key);\n        if (modifiers.some(k => k === eventKey || keyNames[k] === eventKey)) {\n            return fn(event);\n        }\n    };\n};\n\nconst vShow = {\n    beforeMount(el, { value }, { transition }) {\n        el._vod = el.style.display === 'none' ? '' : el.style.display;\n        if (transition && value) {\n            transition.beforeEnter(el);\n        }\n        else {\n            setDisplay(el, value);\n        }\n    },\n    mounted(el, { value }, { transition }) {\n        if (transition && value) {\n            transition.enter(el);\n        }\n    },\n    updated(el, { value, oldValue }, { transition }) {\n        if (!value === !oldValue)\n            return;\n        if (transition) {\n            if (value) {\n                transition.beforeEnter(el);\n                setDisplay(el, true);\n                transition.enter(el);\n            }\n            else {\n                transition.leave(el, () => {\n                    setDisplay(el, false);\n                });\n            }\n        }\n        else {\n            setDisplay(el, value);\n        }\n    },\n    beforeUnmount(el, { value }) {\n        setDisplay(el, value);\n    }\n};\nfunction setDisplay(el, value) {\n    el.style.display = value ? el._vod : 'none';\n}\n// SSR vnode transforms, only used when user includes client-oriented render\n// function in SSR\nfunction initVShowForSSR() {\n    vShow.getSSRProps = ({ value }) => {\n        if (!value) {\n            return { style: { display: 'none' } };\n        }\n    };\n}\n\nconst rendererOptions = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({ patchProp }, nodeOps);\n// lazy create the renderer - this makes core renderer logic tree-shakable\n// in case the user only imports reactivity utilities from Vue.\nlet renderer;\nlet enabledHydration = false;\nfunction ensureRenderer() {\n    return (renderer ||\n        (renderer = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createRenderer)(rendererOptions)));\n}\nfunction ensureHydrationRenderer() {\n    renderer = enabledHydration\n        ? renderer\n        : (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createHydrationRenderer)(rendererOptions);\n    enabledHydration = true;\n    return renderer;\n}\n// use explicit type casts here to avoid import() calls in rolled-up d.ts\nconst render = ((...args) => {\n    ensureRenderer().render(...args);\n});\nconst hydrate = ((...args) => {\n    ensureHydrationRenderer().hydrate(...args);\n});\nconst createApp = ((...args) => {\n    const app = ensureRenderer().createApp(...args);\n    if ((true)) {\n        injectNativeTagCheck(app);\n        injectCompilerOptionsCheck(app);\n    }\n    const { mount } = app;\n    app.mount = (containerOrSelector) => {\n        const container = normalizeContainer(containerOrSelector);\n        if (!container)\n            return;\n        const component = app._component;\n        if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(component) && !component.render && !component.template) {\n            // __UNSAFE__\n            // Reason: potential execution of JS expressions in in-DOM template.\n            // The user must make sure the in-DOM template is trusted. If it's\n            // rendered by the server, the template should not contain any user data.\n            component.template = container.innerHTML;\n        }\n        // clear content before mounting\n        container.innerHTML = '';\n        const proxy = mount(container, false, container instanceof SVGElement);\n        if (container instanceof Element) {\n            container.removeAttribute('v-cloak');\n            container.setAttribute('data-v-app', '');\n        }\n        return proxy;\n    };\n    return app;\n});\nconst createSSRApp = ((...args) => {\n    const app = ensureHydrationRenderer().createApp(...args);\n    if ((true)) {\n        injectNativeTagCheck(app);\n        injectCompilerOptionsCheck(app);\n    }\n    const { mount } = app;\n    app.mount = (containerOrSelector) => {\n        const container = normalizeContainer(containerOrSelector);\n        if (container) {\n            return mount(container, true, container instanceof SVGElement);\n        }\n    };\n    return app;\n});\nfunction injectNativeTagCheck(app) {\n    // Inject `isNativeTag`\n    // this is used for component name validation (dev only)\n    Object.defineProperty(app.config, 'isNativeTag', {\n        value: (tag) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isHTMLTag)(tag) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSVGTag)(tag),\n        writable: false\n    });\n}\n// dev only\nfunction injectCompilerOptionsCheck(app) {\n    if ((0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isRuntimeOnly)()) {\n        const isCustomElement = app.config.isCustomElement;\n        Object.defineProperty(app.config, 'isCustomElement', {\n            get() {\n                return isCustomElement;\n            },\n            set() {\n                (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`The \\`isCustomElement\\` config option is deprecated. Use ` +\n                    `\\`compilerOptions.isCustomElement\\` instead.`);\n            }\n        });\n        const compilerOptions = app.config.compilerOptions;\n        const msg = `The \\`compilerOptions\\` config option is only respected when using ` +\n            `a build of Vue.js that includes the runtime compiler (aka \"full build\"). ` +\n            `Since you are using the runtime-only build, \\`compilerOptions\\` ` +\n            `must be passed to \\`@vue/compiler-dom\\` in the build setup instead.\\n` +\n            `- For vue-loader: pass it via vue-loader's \\`compilerOptions\\` loader option.\\n` +\n            `- For vue-cli: see https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-loader\\n` +\n            `- For vite: pass it via @vitejs/plugin-vue options. See https://github.com/vitejs/vite/tree/main/packages/plugin-vue#example-for-passing-options-to-vuecompiler-dom`;\n        Object.defineProperty(app.config, 'compilerOptions', {\n            get() {\n                (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(msg);\n                return compilerOptions;\n            },\n            set() {\n                (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(msg);\n            }\n        });\n    }\n}\nfunction normalizeContainer(container) {\n    if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(container)) {\n        const res = document.querySelector(container);\n        if (( true) && !res) {\n            (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`Failed to mount app: mount target selector \"${container}\" returned null.`);\n        }\n        return res;\n    }\n    if (( true) &&\n        window.ShadowRoot &&\n        container instanceof window.ShadowRoot &&\n        container.mode === 'closed') {\n        (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`mounting on a ShadowRoot with \\`{mode: \"closed\"}\\` may lead to unpredictable bugs`);\n    }\n    return container;\n}\nlet ssrDirectiveInitialized = false;\n/**\n * @internal\n */\nconst initDirectivesForSSR = () => {\n        if (!ssrDirectiveInitialized) {\n            ssrDirectiveInitialized = true;\n            initVModelForSSR();\n            initVShowForSSR();\n        }\n    }\n    ;\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHZ1ZS9ydW50aW1lLWRvbS9kaXN0L3J1bnRpbWUtZG9tLmVzbS1idW5kbGVyLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBMlk7QUFDelc7QUFDc1E7O0FBRXhTO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxLQUFLO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBELFFBQVE7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCLHFEQUFRO0FBQ2hDO0FBQ0EscUJBQXFCLHFEQUFRO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBRWdTIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B2dWUvcnVudGltZS1kb20vZGlzdC9ydW50aW1lLWRvbS5lc20tYnVuZGxlci5qcz8yNzI1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdhcm4sIGNhbWVsaXplLCBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZywgZGVmaW5lQ29tcG9uZW50LCBuZXh0VGljaywgY3JlYXRlVk5vZGUsIGdldEN1cnJlbnRJbnN0YW5jZSwgd2F0Y2hQb3N0RWZmZWN0LCBvbk1vdW50ZWQsIG9uVW5tb3VudGVkLCBGcmFnbWVudCwgU3RhdGljLCBoLCBCYXNlVHJhbnNpdGlvbiwgYXNzZXJ0TnVtYmVyLCB1c2VUcmFuc2l0aW9uU3RhdGUsIG9uVXBkYXRlZCwgdG9SYXcsIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbiwgc2V0VHJhbnNpdGlvbkhvb2tzLCByZXNvbHZlVHJhbnNpdGlvbkhvb2tzLCBpc1J1bnRpbWVPbmx5LCBjcmVhdGVSZW5kZXJlciwgY3JlYXRlSHlkcmF0aW9uUmVuZGVyZXIgfSBmcm9tICdAdnVlL3J1bnRpbWUtY29yZSc7XG5leHBvcnQgKiBmcm9tICdAdnVlL3J1bnRpbWUtY29yZSc7XG5pbXBvcnQgeyBpc1N0cmluZywgaXNBcnJheSwgaHlwaGVuYXRlLCBjYXBpdGFsaXplLCBpc1NwZWNpYWxCb29sZWFuQXR0ciwgaW5jbHVkZUJvb2xlYW5BdHRyLCBpc09uLCBpc01vZGVsTGlzdGVuZXIsIGlzRnVuY3Rpb24sIGNhbWVsaXplIGFzIGNhbWVsaXplJDEsIHRvTnVtYmVyLCBleHRlbmQsIEVNUFRZX09CSiwgaXNPYmplY3QsIGxvb3NlVG9OdW1iZXIsIGxvb3NlSW5kZXhPZiwgaXNTZXQsIGxvb3NlRXF1YWwsIGludm9rZUFycmF5Rm5zLCBpc0hUTUxUYWcsIGlzU1ZHVGFnIH0gZnJvbSAnQHZ1ZS9zaGFyZWQnO1xuXG5jb25zdCBzdmdOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG5jb25zdCBkb2MgPSAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDogbnVsbCk7XG5jb25zdCB0ZW1wbGF0ZUNvbnRhaW5lciA9IGRvYyAmJiAvKiNfX1BVUkVfXyovIGRvYy5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuY29uc3Qgbm9kZU9wcyA9IHtcbiAgICBpbnNlcnQ6IChjaGlsZCwgcGFyZW50LCBhbmNob3IpID0+IHtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgYW5jaG9yIHx8IG51bGwpO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBjaGlsZCA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGNoaWxkLnBhcmVudE5vZGU7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChjaGlsZCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGNyZWF0ZUVsZW1lbnQ6ICh0YWcsIGlzU1ZHLCBpcywgcHJvcHMpID0+IHtcbiAgICAgICAgY29uc3QgZWwgPSBpc1NWR1xuICAgICAgICAgICAgPyBkb2MuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCB0YWcpXG4gICAgICAgICAgICA6IGRvYy5jcmVhdGVFbGVtZW50KHRhZywgaXMgPyB7IGlzIH0gOiB1bmRlZmluZWQpO1xuICAgICAgICBpZiAodGFnID09PSAnc2VsZWN0JyAmJiBwcm9wcyAmJiBwcm9wcy5tdWx0aXBsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ211bHRpcGxlJywgcHJvcHMubXVsdGlwbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbDtcbiAgICB9LFxuICAgIGNyZWF0ZVRleHQ6IHRleHQgPT4gZG9jLmNyZWF0ZVRleHROb2RlKHRleHQpLFxuICAgIGNyZWF0ZUNvbW1lbnQ6IHRleHQgPT4gZG9jLmNyZWF0ZUNvbW1lbnQodGV4dCksXG4gICAgc2V0VGV4dDogKG5vZGUsIHRleHQpID0+IHtcbiAgICAgICAgbm9kZS5ub2RlVmFsdWUgPSB0ZXh0O1xuICAgIH0sXG4gICAgc2V0RWxlbWVudFRleHQ6IChlbCwgdGV4dCkgPT4ge1xuICAgICAgICBlbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgfSxcbiAgICBwYXJlbnROb2RlOiBub2RlID0+IG5vZGUucGFyZW50Tm9kZSxcbiAgICBuZXh0U2libGluZzogbm9kZSA9PiBub2RlLm5leHRTaWJsaW5nLFxuICAgIHF1ZXJ5U2VsZWN0b3I6IHNlbGVjdG9yID0+IGRvYy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSxcbiAgICBzZXRTY29wZUlkKGVsLCBpZCkge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoaWQsICcnKTtcbiAgICB9LFxuICAgIC8vIF9fVU5TQUZFX19cbiAgICAvLyBSZWFzb246IGlubmVySFRNTC5cbiAgICAvLyBTdGF0aWMgY29udGVudCBoZXJlIGNhbiBvbmx5IGNvbWUgZnJvbSBjb21waWxlZCB0ZW1wbGF0ZXMuXG4gICAgLy8gQXMgbG9uZyBhcyB0aGUgdXNlciBvbmx5IHVzZXMgdHJ1c3RlZCB0ZW1wbGF0ZXMsIHRoaXMgaXMgc2FmZS5cbiAgICBpbnNlcnRTdGF0aWNDb250ZW50KGNvbnRlbnQsIHBhcmVudCwgYW5jaG9yLCBpc1NWRywgc3RhcnQsIGVuZCkge1xuICAgICAgICAvLyA8cGFyZW50PiBiZWZvcmUgfCBmaXJzdCAuLi4gbGFzdCB8IGFuY2hvciA8L3BhcmVudD5cbiAgICAgICAgY29uc3QgYmVmb3JlID0gYW5jaG9yID8gYW5jaG9yLnByZXZpb3VzU2libGluZyA6IHBhcmVudC5sYXN0Q2hpbGQ7XG4gICAgICAgIC8vICM1MzA4IGNhbiBvbmx5IHRha2UgY2FjaGVkIHBhdGggaWY6XG4gICAgICAgIC8vIC0gaGFzIGEgc2luZ2xlIHJvb3Qgbm9kZVxuICAgICAgICAvLyAtIG5leHRTaWJsaW5nIGluZm8gaXMgc3RpbGwgYXZhaWxhYmxlXG4gICAgICAgIGlmIChzdGFydCAmJiAoc3RhcnQgPT09IGVuZCB8fCBzdGFydC5uZXh0U2libGluZykpIHtcbiAgICAgICAgICAgIC8vIGNhY2hlZFxuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHN0YXJ0LmNsb25lTm9kZSh0cnVlKSwgYW5jaG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCB8fCAhKHN0YXJ0ID0gc3RhcnQubmV4dFNpYmxpbmcpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGZyZXNoIGluc2VydFxuICAgICAgICAgICAgdGVtcGxhdGVDb250YWluZXIuaW5uZXJIVE1MID0gaXNTVkcgPyBgPHN2Zz4ke2NvbnRlbnR9PC9zdmc+YCA6IGNvbnRlbnQ7XG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRlbXBsYXRlQ29udGFpbmVyLmNvbnRlbnQ7XG4gICAgICAgICAgICBpZiAoaXNTVkcpIHtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgb3V0ZXIgc3ZnIHdyYXBwZXJcbiAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVyID0gdGVtcGxhdGUuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB3aGlsZSAod3JhcHBlci5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLmFwcGVuZENoaWxkKHdyYXBwZXIuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZUNoaWxkKHdyYXBwZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0ZW1wbGF0ZSwgYW5jaG9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLy8gZmlyc3RcbiAgICAgICAgICAgIGJlZm9yZSA/IGJlZm9yZS5uZXh0U2libGluZyA6IHBhcmVudC5maXJzdENoaWxkLFxuICAgICAgICAgICAgLy8gbGFzdFxuICAgICAgICAgICAgYW5jaG9yID8gYW5jaG9yLnByZXZpb3VzU2libGluZyA6IHBhcmVudC5sYXN0Q2hpbGRcbiAgICAgICAgXTtcbiAgICB9XG59O1xuXG4vLyBjb21waWxlciBzaG91bGQgbm9ybWFsaXplIGNsYXNzICsgOmNsYXNzIGJpbmRpbmdzIG9uIHRoZSBzYW1lIGVsZW1lbnRcbi8vIGludG8gYSBzaW5nbGUgYmluZGluZyBbJ3N0YXRpY0NsYXNzJywgZHluYW1pY11cbmZ1bmN0aW9uIHBhdGNoQ2xhc3MoZWwsIHZhbHVlLCBpc1NWRykge1xuICAgIC8vIGRpcmVjdGx5IHNldHRpbmcgY2xhc3NOYW1lIHNob3VsZCBiZSBmYXN0ZXIgdGhhbiBzZXRBdHRyaWJ1dGUgaW4gdGhlb3J5XG4gICAgLy8gaWYgdGhpcyBpcyBhbiBlbGVtZW50IGR1cmluZyBhIHRyYW5zaXRpb24sIHRha2UgdGhlIHRlbXBvcmFyeSB0cmFuc2l0aW9uXG4gICAgLy8gY2xhc3NlcyBpbnRvIGFjY291bnQuXG4gICAgY29uc3QgdHJhbnNpdGlvbkNsYXNzZXMgPSBlbC5fdnRjO1xuICAgIGlmICh0cmFuc2l0aW9uQ2xhc3Nlcykge1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA/IFt2YWx1ZSwgLi4udHJhbnNpdGlvbkNsYXNzZXNdIDogWy4uLnRyYW5zaXRpb25DbGFzc2VzXSkuam9pbignICcpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzU1ZHKSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCB2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBlbC5jbGFzc05hbWUgPSB2YWx1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBhdGNoU3R5bGUoZWwsIHByZXYsIG5leHQpIHtcbiAgICBjb25zdCBzdHlsZSA9IGVsLnN0eWxlO1xuICAgIGNvbnN0IGlzQ3NzU3RyaW5nID0gaXNTdHJpbmcobmV4dCk7XG4gICAgaWYgKG5leHQgJiYgIWlzQ3NzU3RyaW5nKSB7XG4gICAgICAgIGlmIChwcmV2ICYmICFpc1N0cmluZyhwcmV2KSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJldikge1xuICAgICAgICAgICAgICAgIGlmIChuZXh0W2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRTdHlsZShzdHlsZSwga2V5LCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG5leHQpIHtcbiAgICAgICAgICAgIHNldFN0eWxlKHN0eWxlLCBrZXksIG5leHRba2V5XSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnREaXNwbGF5ID0gc3R5bGUuZGlzcGxheTtcbiAgICAgICAgaWYgKGlzQ3NzU3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAocHJldiAhPT0gbmV4dCkge1xuICAgICAgICAgICAgICAgIHN0eWxlLmNzc1RleHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHByZXYpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbmRpY2F0ZXMgdGhhdCB0aGUgYGRpc3BsYXlgIG9mIHRoZSBlbGVtZW50IGlzIGNvbnRyb2xsZWQgYnkgYHYtc2hvd2AsXG4gICAgICAgIC8vIHNvIHdlIGFsd2F5cyBrZWVwIHRoZSBjdXJyZW50IGBkaXNwbGF5YCB2YWx1ZSByZWdhcmRsZXNzIG9mIHRoZSBgc3R5bGVgXG4gICAgICAgIC8vIHZhbHVlLCB0aHVzIGhhbmRpbmcgb3ZlciBjb250cm9sIHRvIGB2LXNob3dgLlxuICAgICAgICBpZiAoJ192b2QnIGluIGVsKSB7XG4gICAgICAgICAgICBzdHlsZS5kaXNwbGF5ID0gY3VycmVudERpc3BsYXk7XG4gICAgICAgIH1cbiAgICB9XG59XG5jb25zdCBzZW1pY29sb25SRSA9IC9bXlxcXFxdO1xccyokLztcbmNvbnN0IGltcG9ydGFudFJFID0gL1xccyohaW1wb3J0YW50JC87XG5mdW5jdGlvbiBzZXRTdHlsZShzdHlsZSwgbmFtZSwgdmFsKSB7XG4gICAgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgICB2YWwuZm9yRWFjaCh2ID0+IHNldFN0eWxlKHN0eWxlLCBuYW1lLCB2KSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAodmFsID09IG51bGwpXG4gICAgICAgICAgICB2YWwgPSAnJztcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgaWYgKHNlbWljb2xvblJFLnRlc3QodmFsKSkge1xuICAgICAgICAgICAgICAgIHdhcm4oYFVuZXhwZWN0ZWQgc2VtaWNvbG9uIGF0IHRoZSBlbmQgb2YgJyR7bmFtZX0nIHN0eWxlIHZhbHVlOiAnJHt2YWx9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgICAgICAgIC8vIGN1c3RvbSBwcm9wZXJ0eSBkZWZpbml0aW9uXG4gICAgICAgICAgICBzdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ZWQgPSBhdXRvUHJlZml4KHN0eWxlLCBuYW1lKTtcbiAgICAgICAgICAgIGlmIChpbXBvcnRhbnRSRS50ZXN0KHZhbCkpIHtcbiAgICAgICAgICAgICAgICAvLyAhaW1wb3J0YW50XG4gICAgICAgICAgICAgICAgc3R5bGUuc2V0UHJvcGVydHkoaHlwaGVuYXRlKHByZWZpeGVkKSwgdmFsLnJlcGxhY2UoaW1wb3J0YW50UkUsICcnKSwgJ2ltcG9ydGFudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3R5bGVbcHJlZml4ZWRdID0gdmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuY29uc3QgcHJlZml4ZXMgPSBbJ1dlYmtpdCcsICdNb3onLCAnbXMnXTtcbmNvbnN0IHByZWZpeENhY2hlID0ge307XG5mdW5jdGlvbiBhdXRvUHJlZml4KHN0eWxlLCByYXdOYW1lKSB7XG4gICAgY29uc3QgY2FjaGVkID0gcHJlZml4Q2FjaGVbcmF3TmFtZV07XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgICBsZXQgbmFtZSA9IGNhbWVsaXplKHJhd05hbWUpO1xuICAgIGlmIChuYW1lICE9PSAnZmlsdGVyJyAmJiBuYW1lIGluIHN0eWxlKSB7XG4gICAgICAgIHJldHVybiAocHJlZml4Q2FjaGVbcmF3TmFtZV0gPSBuYW1lKTtcbiAgICB9XG4gICAgbmFtZSA9IGNhcGl0YWxpemUobmFtZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwcmVmaXhlZCA9IHByZWZpeGVzW2ldICsgbmFtZTtcbiAgICAgICAgaWYgKHByZWZpeGVkIGluIHN0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gKHByZWZpeENhY2hlW3Jhd05hbWVdID0gcHJlZml4ZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByYXdOYW1lO1xufVxuXG5jb25zdCB4bGlua05TID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnO1xuZnVuY3Rpb24gcGF0Y2hBdHRyKGVsLCBrZXksIHZhbHVlLCBpc1NWRywgaW5zdGFuY2UpIHtcbiAgICBpZiAoaXNTVkcgJiYga2V5LnN0YXJ0c1dpdGgoJ3hsaW5rOicpKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGVOUyh4bGlua05TLCBrZXkuc2xpY2UoNiwga2V5Lmxlbmd0aCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlTlMoeGxpbmtOUywga2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIG5vdGUgd2UgYXJlIG9ubHkgY2hlY2tpbmcgYm9vbGVhbiBhdHRyaWJ1dGVzIHRoYXQgZG9uJ3QgaGF2ZSBhXG4gICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgZG9tIHByb3Agb2YgdGhlIHNhbWUgbmFtZSBoZXJlLlxuICAgICAgICBjb25zdCBpc0Jvb2xlYW4gPSBpc1NwZWNpYWxCb29sZWFuQXR0cihrZXkpO1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCAoaXNCb29sZWFuICYmICFpbmNsdWRlQm9vbGVhbkF0dHIodmFsdWUpKSkge1xuICAgICAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCBpc0Jvb2xlYW4gPyAnJyA6IHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gX19VTlNBRkVfX1xuLy8gZnVuY3Rpb25zLiBUaGUgdXNlciBpcyByZXNwb25zaWJsZSBmb3IgdXNpbmcgdGhlbSB3aXRoIG9ubHkgdHJ1c3RlZCBjb250ZW50LlxuZnVuY3Rpb24gcGF0Y2hET01Qcm9wKGVsLCBrZXksIHZhbHVlLCBcbi8vIHRoZSBmb2xsb3dpbmcgYXJncyBhcmUgcGFzc2VkIG9ubHkgZHVlIHRvIHBvdGVudGlhbCBpbm5lckhUTUwvdGV4dENvbnRlbnRcbi8vIG92ZXJyaWRpbmcgZXhpc3RpbmcgVk5vZGVzLCBpbiB3aGljaCBjYXNlIHRoZSBvbGQgdHJlZSBtdXN0IGJlIHByb3Blcmx5XG4vLyB1bm1vdW50ZWQuXG5wcmV2Q2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHVubW91bnRDaGlsZHJlbikge1xuICAgIGlmIChrZXkgPT09ICdpbm5lckhUTUwnIHx8IGtleSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgICBpZiAocHJldkNoaWxkcmVuKSB7XG4gICAgICAgICAgICB1bm1vdW50Q2hpbGRyZW4ocHJldkNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbFtrZXldID0gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gJ3ZhbHVlJyAmJlxuICAgICAgICBlbC50YWdOYW1lICE9PSAnUFJPR1JFU1MnICYmXG4gICAgICAgIC8vIGN1c3RvbSBlbGVtZW50cyBtYXkgdXNlIF92YWx1ZSBpbnRlcm5hbGx5XG4gICAgICAgICFlbC50YWdOYW1lLmluY2x1ZGVzKCctJykpIHtcbiAgICAgICAgLy8gc3RvcmUgdmFsdWUgYXMgX3ZhbHVlIGFzIHdlbGwgc2luY2VcbiAgICAgICAgLy8gbm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBzdHJpbmdpZmllZC5cbiAgICAgICAgZWwuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7XG4gICAgICAgIGlmIChlbC52YWx1ZSAhPT0gbmV3VmFsdWUgfHxcbiAgICAgICAgICAgIC8vICM0OTU2OiBhbHdheXMgc2V0IGZvciBPUFRJT04gZWxlbWVudHMgYmVjYXVzZSBpdHMgdmFsdWUgZmFsbHMgYmFjayB0b1xuICAgICAgICAgICAgLy8gdGV4dENvbnRlbnQgaWYgbm8gdmFsdWUgYXR0cmlidXRlIGlzIHByZXNlbnQuIEFuZCBzZXR0aW5nIC52YWx1ZSBmb3JcbiAgICAgICAgICAgIC8vIE9QVElPTiBoYXMgbm8gc2lkZSBlZmZlY3RcbiAgICAgICAgICAgIGVsLnRhZ05hbWUgPT09ICdPUFRJT04nKSB7XG4gICAgICAgICAgICBlbC52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBuZWVkUmVtb3ZlID0gZmFsc2U7XG4gICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgZWxba2V5XTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgLy8gZS5nLiA8c2VsZWN0IG11bHRpcGxlPiBjb21waWxlcyB0byB7IG11bHRpcGxlOiAnJyB9XG4gICAgICAgICAgICB2YWx1ZSA9IGluY2x1ZGVCb29sZWFuQXR0cih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gbnVsbCAmJiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgLy8gZS5nLiA8ZGl2IDppZD1cIm51bGxcIj5cbiAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgICAgICBuZWVkUmVtb3ZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgLy8gZS5nLiA8aW1nIDp3aWR0aD1cIm51bGxcIj5cbiAgICAgICAgICAgIHZhbHVlID0gMDtcbiAgICAgICAgICAgIG5lZWRSZW1vdmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHNvbWUgcHJvcGVydGllcyBwZXJmb3JtIHZhbHVlIHZhbGlkYXRpb24gYW5kIHRocm93LFxuICAgIC8vIHNvbWUgcHJvcGVydGllcyBoYXMgZ2V0dGVyLCBubyBzZXR0ZXIsIHdpbGwgZXJyb3IgaW4gJ3VzZSBzdHJpY3QnXG4gICAgLy8gZWcuIDxzZWxlY3QgOnR5cGU9XCJudWxsXCI+PC9zZWxlY3Q+IDxzZWxlY3QgOndpbGxWYWxpZGF0ZT1cIm51bGxcIj48L3NlbGVjdD5cbiAgICB0cnkge1xuICAgICAgICBlbFtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGRvIG5vdCB3YXJuIGlmIHZhbHVlIGlzIGF1dG8tY29lcmNlZCBmcm9tIG51bGxpc2ggdmFsdWVzXG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIW5lZWRSZW1vdmUpIHtcbiAgICAgICAgICAgIHdhcm4oYEZhaWxlZCBzZXR0aW5nIHByb3AgXCIke2tleX1cIiBvbiA8JHtlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCl9PjogYCArXG4gICAgICAgICAgICAgICAgYHZhbHVlICR7dmFsdWV9IGlzIGludmFsaWQuYCwgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmVlZFJlbW92ZSAmJiBlbC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbCwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIoZWwsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBwYXRjaEV2ZW50KGVsLCByYXdOYW1lLCBwcmV2VmFsdWUsIG5leHRWYWx1ZSwgaW5zdGFuY2UgPSBudWxsKSB7XG4gICAgLy8gdmVpID0gdnVlIGV2ZW50IGludm9rZXJzXG4gICAgY29uc3QgaW52b2tlcnMgPSBlbC5fdmVpIHx8IChlbC5fdmVpID0ge30pO1xuICAgIGNvbnN0IGV4aXN0aW5nSW52b2tlciA9IGludm9rZXJzW3Jhd05hbWVdO1xuICAgIGlmIChuZXh0VmFsdWUgJiYgZXhpc3RpbmdJbnZva2VyKSB7XG4gICAgICAgIC8vIHBhdGNoXG4gICAgICAgIGV4aXN0aW5nSW52b2tlci52YWx1ZSA9IG5leHRWYWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IFtuYW1lLCBvcHRpb25zXSA9IHBhcnNlTmFtZShyYXdOYW1lKTtcbiAgICAgICAgaWYgKG5leHRWYWx1ZSkge1xuICAgICAgICAgICAgLy8gYWRkXG4gICAgICAgICAgICBjb25zdCBpbnZva2VyID0gKGludm9rZXJzW3Jhd05hbWVdID0gY3JlYXRlSW52b2tlcihuZXh0VmFsdWUsIGluc3RhbmNlKSk7XG4gICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBuYW1lLCBpbnZva2VyLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleGlzdGluZ0ludm9rZXIpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZVxuICAgICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihlbCwgbmFtZSwgZXhpc3RpbmdJbnZva2VyLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGludm9rZXJzW3Jhd05hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxufVxuY29uc3Qgb3B0aW9uc01vZGlmaWVyUkUgPSAvKD86T25jZXxQYXNzaXZlfENhcHR1cmUpJC87XG5mdW5jdGlvbiBwYXJzZU5hbWUobmFtZSkge1xuICAgIGxldCBvcHRpb25zO1xuICAgIGlmIChvcHRpb25zTW9kaWZpZXJSRS50ZXN0KG5hbWUpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgbGV0IG07XG4gICAgICAgIHdoaWxlICgobSA9IG5hbWUubWF0Y2gob3B0aW9uc01vZGlmaWVyUkUpKSkge1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sZW5ndGggLSBtWzBdLmxlbmd0aCk7XG4gICAgICAgICAgICBvcHRpb25zW21bMF0udG9Mb3dlckNhc2UoKV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50ID0gbmFtZVsyXSA9PT0gJzonID8gbmFtZS5zbGljZSgzKSA6IGh5cGhlbmF0ZShuYW1lLnNsaWNlKDIpKTtcbiAgICByZXR1cm4gW2V2ZW50LCBvcHRpb25zXTtcbn1cbi8vIFRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiByZXBlYXRlZGx5IGNhbGxpbmcgRGF0ZS5ub3coKSwgd2UgY2FjaGVcbi8vIGFuZCB1c2UgdGhlIHNhbWUgdGltZXN0YW1wIGZvciBhbGwgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIGluIHRoZSBzYW1lIHRpY2suXG5sZXQgY2FjaGVkTm93ID0gMDtcbmNvbnN0IHAgPSAvKiNfX1BVUkVfXyovIFByb21pc2UucmVzb2x2ZSgpO1xuY29uc3QgZ2V0Tm93ID0gKCkgPT4gY2FjaGVkTm93IHx8IChwLnRoZW4oKCkgPT4gKGNhY2hlZE5vdyA9IDApKSwgKGNhY2hlZE5vdyA9IERhdGUubm93KCkpKTtcbmZ1bmN0aW9uIGNyZWF0ZUludm9rZXIoaW5pdGlhbFZhbHVlLCBpbnN0YW5jZSkge1xuICAgIGNvbnN0IGludm9rZXIgPSAoZSkgPT4ge1xuICAgICAgICAvLyBhc3luYyBlZGdlIGNhc2UgdnVlanMvdnVlIzY1NjZcbiAgICAgICAgLy8gaW5uZXIgY2xpY2sgZXZlbnQgdHJpZ2dlcnMgcGF0Y2gsIGV2ZW50IGhhbmRsZXJcbiAgICAgICAgLy8gYXR0YWNoZWQgdG8gb3V0ZXIgZWxlbWVudCBkdXJpbmcgcGF0Y2gsIGFuZCB0cmlnZ2VyZWQgYWdhaW4uIFRoaXNcbiAgICAgICAgLy8gaGFwcGVucyBiZWNhdXNlIGJyb3dzZXJzIGZpcmUgbWljcm90YXNrIHRpY2tzIGJldHdlZW4gZXZlbnQgcHJvcGFnYXRpb24uXG4gICAgICAgIC8vIHRoaXMgbm8gbG9uZ2VyIGhhcHBlbnMgZm9yIHRlbXBsYXRlcyBpbiBWdWUgMywgYnV0IGNvdWxkIHN0aWxsIGJlXG4gICAgICAgIC8vIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgZm9yIGhhbmQtd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zLlxuICAgICAgICAvLyB0aGUgc29sdXRpb246IHdlIHNhdmUgdGhlIHRpbWVzdGFtcCB3aGVuIGEgaGFuZGxlciBpcyBhdHRhY2hlZCxcbiAgICAgICAgLy8gYW5kIGFsc28gYXR0YWNoIHRoZSB0aW1lc3RhbXAgdG8gYW55IGV2ZW50IHRoYXQgd2FzIGhhbmRsZWQgYnkgdnVlXG4gICAgICAgIC8vIGZvciB0aGUgZmlyc3QgdGltZSAodG8gYXZvaWQgaW5jb25zaXN0ZW50IGV2ZW50IHRpbWVzdGFtcCBpbXBsZW1lbnRhdGlvbnNcbiAgICAgICAgLy8gb3IgZXZlbnRzIGZpcmVkIGZyb20gaWZyYW1lcywgZS5nLiAjMjUxMylcbiAgICAgICAgLy8gVGhlIGhhbmRsZXIgd291bGQgb25seSBmaXJlIGlmIHRoZSBldmVudCBwYXNzZWQgdG8gaXQgd2FzIGZpcmVkXG4gICAgICAgIC8vIEFGVEVSIGl0IHdhcyBhdHRhY2hlZC5cbiAgICAgICAgaWYgKCFlLl92dHMpIHtcbiAgICAgICAgICAgIGUuX3Z0cyA9IERhdGUubm93KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZS5fdnRzIDw9IGludm9rZXIuYXR0YWNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhwYXRjaFN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbihlLCBpbnZva2VyLnZhbHVlKSwgaW5zdGFuY2UsIDUgLyogRXJyb3JDb2Rlcy5OQVRJVkVfRVZFTlRfSEFORExFUiAqLywgW2VdKTtcbiAgICB9O1xuICAgIGludm9rZXIudmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgaW52b2tlci5hdHRhY2hlZCA9IGdldE5vdygpO1xuICAgIHJldHVybiBpbnZva2VyO1xufVxuZnVuY3Rpb24gcGF0Y2hTdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oZSwgdmFsdWUpIHtcbiAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxTdG9wID0gZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb247XG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgb3JpZ2luYWxTdG9wLmNhbGwoZSk7XG4gICAgICAgICAgICBlLl9zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcChmbiA9PiAoZSkgPT4gIWUuX3N0b3BwZWQgJiYgZm4gJiYgZm4oZSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cblxuY29uc3QgbmF0aXZlT25SRSA9IC9eb25bYS16XS87XG5jb25zdCBwYXRjaFByb3AgPSAoZWwsIGtleSwgcHJldlZhbHVlLCBuZXh0VmFsdWUsIGlzU1ZHID0gZmFsc2UsIHByZXZDaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdW5tb3VudENoaWxkcmVuKSA9PiB7XG4gICAgaWYgKGtleSA9PT0gJ2NsYXNzJykge1xuICAgICAgICBwYXRjaENsYXNzKGVsLCBuZXh0VmFsdWUsIGlzU1ZHKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoa2V5ID09PSAnc3R5bGUnKSB7XG4gICAgICAgIHBhdGNoU3R5bGUoZWwsIHByZXZWYWx1ZSwgbmV4dFZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPbihrZXkpKSB7XG4gICAgICAgIC8vIGlnbm9yZSB2LW1vZGVsIGxpc3RlbmVyc1xuICAgICAgICBpZiAoIWlzTW9kZWxMaXN0ZW5lcihrZXkpKSB7XG4gICAgICAgICAgICBwYXRjaEV2ZW50KGVsLCBrZXksIHByZXZWYWx1ZSwgbmV4dFZhbHVlLCBwYXJlbnRDb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGtleVswXSA9PT0gJy4nXG4gICAgICAgID8gKChrZXkgPSBrZXkuc2xpY2UoMSkpLCB0cnVlKVxuICAgICAgICA6IGtleVswXSA9PT0gJ14nXG4gICAgICAgICAgICA/ICgoa2V5ID0ga2V5LnNsaWNlKDEpKSwgZmFsc2UpXG4gICAgICAgICAgICA6IHNob3VsZFNldEFzUHJvcChlbCwga2V5LCBuZXh0VmFsdWUsIGlzU1ZHKSkge1xuICAgICAgICBwYXRjaERPTVByb3AoZWwsIGtleSwgbmV4dFZhbHVlLCBwcmV2Q2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHVubW91bnRDaGlsZHJlbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIDxpbnB1dCB2LW1vZGVsIHR5cGU9XCJjaGVja2JveFwiPiB3aXRoXG4gICAgICAgIC8vIDp0cnVlLXZhbHVlICYgOmZhbHNlLXZhbHVlXG4gICAgICAgIC8vIHN0b3JlIHZhbHVlIGFzIGRvbSBwcm9wZXJ0aWVzIHNpbmNlIG5vbi1zdHJpbmcgdmFsdWVzIHdpbGwgYmVcbiAgICAgICAgLy8gc3RyaW5naWZpZWQuXG4gICAgICAgIGlmIChrZXkgPT09ICd0cnVlLXZhbHVlJykge1xuICAgICAgICAgICAgZWwuX3RydWVWYWx1ZSA9IG5leHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09ICdmYWxzZS12YWx1ZScpIHtcbiAgICAgICAgICAgIGVsLl9mYWxzZVZhbHVlID0gbmV4dFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHBhdGNoQXR0cihlbCwga2V5LCBuZXh0VmFsdWUsIGlzU1ZHKTtcbiAgICB9XG59O1xuZnVuY3Rpb24gc2hvdWxkU2V0QXNQcm9wKGVsLCBrZXksIHZhbHVlLCBpc1NWRykge1xuICAgIGlmIChpc1NWRykge1xuICAgICAgICAvLyBtb3N0IGtleXMgbXVzdCBiZSBzZXQgYXMgYXR0cmlidXRlIG9uIHN2ZyBlbGVtZW50cyB0byB3b3JrXG4gICAgICAgIC8vIC4uLmV4Y2VwdCBpbm5lckhUTUwgJiB0ZXh0Q29udGVudFxuICAgICAgICBpZiAoa2V5ID09PSAnaW5uZXJIVE1MJyB8fCBrZXkgPT09ICd0ZXh0Q29udGVudCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIG9yIG5hdGl2ZSBvbmNsaWNrIHdpdGggZnVuY3Rpb24gdmFsdWVzXG4gICAgICAgIGlmIChrZXkgaW4gZWwgJiYgbmF0aXZlT25SRS50ZXN0KGtleSkgJiYgaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gdGhlc2UgYXJlIGVudW1lcmF0ZWQgYXR0cnMsIGhvd2V2ZXIgdGhlaXIgY29ycmVzcG9uZGluZyBET00gcHJvcGVydGllc1xuICAgIC8vIGFyZSBhY3R1YWxseSBib29sZWFucyAtIHRoaXMgbGVhZHMgdG8gc2V0dGluZyBpdCB3aXRoIGEgc3RyaW5nIFwiZmFsc2VcIlxuICAgIC8vIHZhbHVlIGxlYWRpbmcgaXQgdG8gYmUgY29lcmNlZCB0byBgdHJ1ZWAsIHNvIHdlIG5lZWQgdG8gYWx3YXlzIHRyZWF0XG4gICAgLy8gdGhlbSBhcyBhdHRyaWJ1dGVzLlxuICAgIC8vIE5vdGUgdGhhdCBgY29udGVudEVkaXRhYmxlYCBkb2Vzbid0IGhhdmUgdGhpcyBwcm9ibGVtOiBpdHMgRE9NXG4gICAgLy8gcHJvcGVydHkgaXMgYWxzbyBlbnVtZXJhdGVkIHN0cmluZyB2YWx1ZXMuXG4gICAgaWYgKGtleSA9PT0gJ3NwZWxsY2hlY2snIHx8IGtleSA9PT0gJ2RyYWdnYWJsZScgfHwga2V5ID09PSAndHJhbnNsYXRlJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vICMxNzg3LCAjMjg0MCBmb3JtIHByb3BlcnR5IG9uIGZvcm0gZWxlbWVudHMgaXMgcmVhZG9ubHkgYW5kIG11c3QgYmUgc2V0IGFzXG4gICAgLy8gYXR0cmlidXRlLlxuICAgIGlmIChrZXkgPT09ICdmb3JtJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vICMxNTI2IDxpbnB1dCBsaXN0PiBtdXN0IGJlIHNldCBhcyBhdHRyaWJ1dGVcbiAgICBpZiAoa2V5ID09PSAnbGlzdCcgJiYgZWwudGFnTmFtZSA9PT0gJ0lOUFVUJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vICMyNzY2IDx0ZXh0YXJlYSB0eXBlPiBtdXN0IGJlIHNldCBhcyBhdHRyaWJ1dGVcbiAgICBpZiAoa2V5ID09PSAndHlwZScgJiYgZWwudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIG5hdGl2ZSBvbmNsaWNrIHdpdGggc3RyaW5nIHZhbHVlLCBtdXN0IGJlIHNldCBhcyBhdHRyaWJ1dGVcbiAgICBpZiAobmF0aXZlT25SRS50ZXN0KGtleSkgJiYgaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGtleSBpbiBlbDtcbn1cblxuZnVuY3Rpb24gZGVmaW5lQ3VzdG9tRWxlbWVudChvcHRpb25zLCBoeWRyYXRlKSB7XG4gICAgY29uc3QgQ29tcCA9IGRlZmluZUNvbXBvbmVudChvcHRpb25zKTtcbiAgICBjbGFzcyBWdWVDdXN0b21FbGVtZW50IGV4dGVuZHMgVnVlRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKGluaXRpYWxQcm9wcykge1xuICAgICAgICAgICAgc3VwZXIoQ29tcCwgaW5pdGlhbFByb3BzLCBoeWRyYXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBWdWVDdXN0b21FbGVtZW50LmRlZiA9IENvbXA7XG4gICAgcmV0dXJuIFZ1ZUN1c3RvbUVsZW1lbnQ7XG59XG5jb25zdCBkZWZpbmVTU1JDdXN0b21FbGVtZW50ID0gKChvcHRpb25zKSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBkZWZpbmVDdXN0b21FbGVtZW50KG9wdGlvbnMsIGh5ZHJhdGUpO1xufSk7XG5jb25zdCBCYXNlQ2xhc3MgPSAodHlwZW9mIEhUTUxFbGVtZW50ICE9PSAndW5kZWZpbmVkJyA/IEhUTUxFbGVtZW50IDogY2xhc3Mge1xufSk7XG5jbGFzcyBWdWVFbGVtZW50IGV4dGVuZHMgQmFzZUNsYXNzIHtcbiAgICBjb25zdHJ1Y3RvcihfZGVmLCBfcHJvcHMgPSB7fSwgaHlkcmF0ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9kZWYgPSBfZGVmO1xuICAgICAgICB0aGlzLl9wcm9wcyA9IF9wcm9wcztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbnVtYmVyUHJvcHMgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5zaGFkb3dSb290ICYmIGh5ZHJhdGUpIHtcbiAgICAgICAgICAgIGh5ZHJhdGUodGhpcy5fY3JlYXRlVk5vZGUoKSwgdGhpcy5zaGFkb3dSb290KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgdGhpcy5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICAgICAgd2FybihgQ3VzdG9tIGVsZW1lbnQgaGFzIHByZS1yZW5kZXJlZCBkZWNsYXJhdGl2ZSBzaGFkb3cgcm9vdCBidXQgaXMgbm90IGAgK1xuICAgICAgICAgICAgICAgICAgICBgZGVmaW5lZCBhcyBoeWRyYXRhYmxlLiBVc2UgXFxgZGVmaW5lU1NSQ3VzdG9tRWxlbWVudFxcYC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9kZWYuX19hc3luY0xvYWRlcikge1xuICAgICAgICAgICAgICAgIC8vIGZvciBzeW5jIGNvbXBvbmVudCBkZWZzIHdlIGNhbiBpbW1lZGlhdGVseSByZXNvbHZlIHByb3BzXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZVByb3BzKHRoaXMuX2RlZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXNvbHZlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZURlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICByZW5kZXIobnVsbCwgdGhpcy5zaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiByZXNvbHZlIGlubmVyIGNvbXBvbmVudCBkZWZpbml0aW9uIChoYW5kbGUgcG9zc2libGUgYXN5bmMgY29tcG9uZW50KVxuICAgICAqL1xuICAgIF9yZXNvbHZlRGVmKCkge1xuICAgICAgICB0aGlzLl9yZXNvbHZlZCA9IHRydWU7XG4gICAgICAgIC8vIHNldCBpbml0aWFsIGF0dHJzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRBdHRyKHRoaXMuYXR0cmlidXRlc1tpXS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB3YXRjaCBmdXR1cmUgYXR0ciBjaGFuZ2VzXG4gICAgICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG0gb2YgbXV0YXRpb25zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0QXR0cihtLmF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5vYnNlcnZlKHRoaXMsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZSA9IChkZWYsIGlzQXN5bmMgPSBmYWxzZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBwcm9wcywgc3R5bGVzIH0gPSBkZWY7XG4gICAgICAgICAgICAvLyBjYXN0IE51bWJlci10eXBlIHByb3BzIHNldCBiZWZvcmUgcmVzb2x2ZVxuICAgICAgICAgICAgbGV0IG51bWJlclByb3BzO1xuICAgICAgICAgICAgaWYgKHByb3BzICYmICFpc0FycmF5KHByb3BzKSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdCA9IHByb3BzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHQgPT09IE51bWJlciB8fCAob3B0ICYmIG9wdC50eXBlID09PSBOdW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5IGluIHRoaXMuX3Byb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvcHNba2V5XSA9IHRvTnVtYmVyKHRoaXMuX3Byb3BzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKG51bWJlclByb3BzIHx8IChudW1iZXJQcm9wcyA9IE9iamVjdC5jcmVhdGUobnVsbCkpKVtjYW1lbGl6ZSQxKGtleSldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX251bWJlclByb3BzID0gbnVtYmVyUHJvcHM7XG4gICAgICAgICAgICBpZiAoaXNBc3luYykge1xuICAgICAgICAgICAgICAgIC8vIGRlZmluaW5nIGdldHRlci9zZXR0ZXJzIG9uIHByb3RvdHlwZVxuICAgICAgICAgICAgICAgIC8vIGZvciBzeW5jIGRlZnMsIHRoaXMgYWxyZWFkeSBoYXBwZW5lZCBpbiB0aGUgY29uc3RydWN0b3JcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNvbHZlUHJvcHMoZGVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFwcGx5IENTU1xuICAgICAgICAgICAgdGhpcy5fYXBwbHlTdHlsZXMoc3R5bGVzKTtcbiAgICAgICAgICAgIC8vIGluaXRpYWwgcmVuZGVyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYXN5bmNEZWYgPSB0aGlzLl9kZWYuX19hc3luY0xvYWRlcjtcbiAgICAgICAgaWYgKGFzeW5jRGVmKSB7XG4gICAgICAgICAgICBhc3luY0RlZigpLnRoZW4oZGVmID0+IHJlc29sdmUoZGVmLCB0cnVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKHRoaXMuX2RlZik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3Jlc29sdmVQcm9wcyhkZWYpIHtcbiAgICAgICAgY29uc3QgeyBwcm9wcyB9ID0gZGVmO1xuICAgICAgICBjb25zdCBkZWNsYXJlZFByb3BLZXlzID0gaXNBcnJheShwcm9wcykgPyBwcm9wcyA6IE9iamVjdC5rZXlzKHByb3BzIHx8IHt9KTtcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgYXJlIHByb3BzIHNldCBwcmUtdXBncmFkZSBvciBjb25uZWN0XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMpKSB7XG4gICAgICAgICAgICBpZiAoa2V5WzBdICE9PSAnXycgJiYgZGVjbGFyZWRQcm9wS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0UHJvcChrZXksIHRoaXNba2V5XSwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGRlZmluaW5nIGdldHRlci9zZXR0ZXJzIG9uIHByb3RvdHlwZVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBkZWNsYXJlZFByb3BLZXlzLm1hcChjYW1lbGl6ZSQxKSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGtleSwge1xuICAgICAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByb3Aoa2V5KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldCh2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0UHJvcChrZXksIHZhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3NldEF0dHIoa2V5KSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKGtleSk7XG4gICAgICAgIGNvbnN0IGNhbWVsS2V5ID0gY2FtZWxpemUkMShrZXkpO1xuICAgICAgICBpZiAodGhpcy5fbnVtYmVyUHJvcHMgJiYgdGhpcy5fbnVtYmVyUHJvcHNbY2FtZWxLZXldKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZXRQcm9wKGNhbWVsS2V5LCB2YWx1ZSwgZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfZ2V0UHJvcChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BzW2tleV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9zZXRQcm9wKGtleSwgdmFsLCBzaG91bGRSZWZsZWN0ID0gdHJ1ZSwgc2hvdWxkVXBkYXRlID0gdHJ1ZSkge1xuICAgICAgICBpZiAodmFsICE9PSB0aGlzLl9wcm9wc1trZXldKSB7XG4gICAgICAgICAgICB0aGlzLl9wcm9wc1trZXldID0gdmFsO1xuICAgICAgICAgICAgaWYgKHNob3VsZFVwZGF0ZSAmJiB0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmVmbGVjdFxuICAgICAgICAgICAgaWYgKHNob3VsZFJlZmxlY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKGh5cGhlbmF0ZShrZXkpLCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKGh5cGhlbmF0ZShrZXkpLCB2YWwgKyAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoaHlwaGVuYXRlKGtleSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBfdXBkYXRlKCkge1xuICAgICAgICByZW5kZXIodGhpcy5fY3JlYXRlVk5vZGUoKSwgdGhpcy5zaGFkb3dSb290KTtcbiAgICB9XG4gICAgX2NyZWF0ZVZOb2RlKCkge1xuICAgICAgICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKHRoaXMuX2RlZiwgZXh0ZW5kKHt9LCB0aGlzLl9wcm9wcykpO1xuICAgICAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICB2bm9kZS5jZSA9IGluc3RhbmNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICAgICAgICAgIGluc3RhbmNlLmlzQ0UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIEhNUlxuICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY2VSZWxvYWQgPSBuZXdTdHlsZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIHJlc2V0IHN0eWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0eWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0eWxlcy5mb3JFYWNoKHMgPT4gdGhpcy5zaGFkb3dSb290LnJlbW92ZUNoaWxkKHMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdHlsZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5U3R5bGVzKG5ld1N0eWxlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzcGF0Y2ggPSAoZXZlbnQsIGFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChldmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIC8vIGludGVyY2VwdCBlbWl0XG4gICAgICAgICAgICAgICAgaW5zdGFuY2UuZW1pdCA9IChldmVudCwgLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBib3RoIHRoZSByYXcgYW5kIGh5cGhlbmF0ZWQgdmVyc2lvbnMgb2YgYW4gZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gdG8gbWF0Y2ggVnVlIGJlaGF2aW9yXG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGV2ZW50LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh5cGhlbmF0ZShldmVudCkgIT09IGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChoeXBoZW5hdGUoZXZlbnQpLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gbG9jYXRlIG5lYXJlc3QgVnVlIGN1c3RvbSBlbGVtZW50IHBhcmVudCBmb3IgcHJvdmlkZS9pbmplY3RcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcztcbiAgICAgICAgICAgICAgICB3aGlsZSAoKHBhcmVudCA9XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCAmJiAocGFyZW50LnBhcmVudE5vZGUgfHwgcGFyZW50Lmhvc3QpKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVnVlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UucGFyZW50ID0gcGFyZW50Ll9pbnN0YW5jZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLnByb3ZpZGVzID0gcGFyZW50Ll9pbnN0YW5jZS5wcm92aWRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdm5vZGU7XG4gICAgfVxuICAgIF9hcHBseVN0eWxlcyhzdHlsZXMpIHtcbiAgICAgICAgaWYgKHN0eWxlcykge1xuICAgICAgICAgICAgc3R5bGVzLmZvckVhY2goY3NzID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICBzLnRleHRDb250ZW50ID0gY3NzO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZChzKTtcbiAgICAgICAgICAgICAgICAvLyByZWNvcmQgZm9yIEhNUlxuICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3N0eWxlcyB8fCAodGhpcy5fc3R5bGVzID0gW10pKS5wdXNoKHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1c2VDc3NNb2R1bGUobmFtZSA9ICckc3R5bGUnKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiB3YXJuKGB1c2VDc3NNb2R1bGUgbXVzdCBiZSBjYWxsZWQgaW5zaWRlIHNldHVwKClgKTtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWV9PQko7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9kdWxlcyA9IGluc3RhbmNlLnR5cGUuX19jc3NNb2R1bGVzO1xuICAgICAgICBpZiAoIW1vZHVsZXMpIHtcbiAgICAgICAgICAgIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiB3YXJuKGBDdXJyZW50IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgQ1NTIG1vZHVsZXMgaW5qZWN0ZWQuYCk7XG4gICAgICAgICAgICByZXR1cm4gRU1QVFlfT0JKO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vZCA9IG1vZHVsZXNbbmFtZV07XG4gICAgICAgIGlmICghbW9kKSB7XG4gICAgICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiZcbiAgICAgICAgICAgICAgICB3YXJuKGBDdXJyZW50IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgQ1NTIG1vZHVsZSBuYW1lZCBcIiR7bmFtZX1cIi5gKTtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWV9PQko7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZDtcbiAgICB9XG59XG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIFNGQydzIENTUyB2YXJpYWJsZSBpbmplY3Rpb24gZmVhdHVyZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHVzZUNzc1ZhcnMoZ2V0dGVyKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmXG4gICAgICAgICAgICB3YXJuKGB1c2VDc3NWYXJzIGlzIGNhbGxlZCB3aXRob3V0IGN1cnJlbnQgYWN0aXZlIGNvbXBvbmVudCBpbnN0YW5jZS5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVUZWxlcG9ydHMgPSAoaW5zdGFuY2UudXQgPSAodmFycyA9IGdldHRlcihpbnN0YW5jZS5wcm94eSkpID0+IHtcbiAgICAgICAgQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbZGF0YS12LW93bmVyPVwiJHtpbnN0YW5jZS51aWR9XCJdYCkpLmZvckVhY2gobm9kZSA9PiBzZXRWYXJzT25Ob2RlKG5vZGUsIHZhcnMpKTtcbiAgICB9KTtcbiAgICBjb25zdCBzZXRWYXJzID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB2YXJzID0gZ2V0dGVyKGluc3RhbmNlLnByb3h5KTtcbiAgICAgICAgc2V0VmFyc09uVk5vZGUoaW5zdGFuY2Uuc3ViVHJlZSwgdmFycyk7XG4gICAgICAgIHVwZGF0ZVRlbGVwb3J0cyh2YXJzKTtcbiAgICB9O1xuICAgIHdhdGNoUG9zdEVmZmVjdChzZXRWYXJzKTtcbiAgICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBvYiA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHNldFZhcnMpO1xuICAgICAgICBvYi5vYnNlcnZlKGluc3RhbmNlLnN1YlRyZWUuZWwucGFyZW50Tm9kZSwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gICAgICAgIG9uVW5tb3VudGVkKCgpID0+IG9iLmRpc2Nvbm5lY3QoKSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBzZXRWYXJzT25WTm9kZSh2bm9kZSwgdmFycykge1xuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxMjggLyogU2hhcGVGbGFncy5TVVNQRU5TRSAqLykge1xuICAgICAgICBjb25zdCBzdXNwZW5zZSA9IHZub2RlLnN1c3BlbnNlO1xuICAgICAgICB2bm9kZSA9IHN1c3BlbnNlLmFjdGl2ZUJyYW5jaDtcbiAgICAgICAgaWYgKHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggJiYgIXN1c3BlbnNlLmlzSHlkcmF0aW5nKSB7XG4gICAgICAgICAgICBzdXNwZW5zZS5lZmZlY3RzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldFZhcnNPblZOb2RlKHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCwgdmFycyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBkcmlsbCBkb3duIEhPQ3MgdW50aWwgaXQncyBhIG5vbi1jb21wb25lbnQgdm5vZGVcbiAgICB3aGlsZSAodm5vZGUuY29tcG9uZW50KSB7XG4gICAgICAgIHZub2RlID0gdm5vZGUuY29tcG9uZW50LnN1YlRyZWU7XG4gICAgfVxuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxIC8qIFNoYXBlRmxhZ3MuRUxFTUVOVCAqLyAmJiB2bm9kZS5lbCkge1xuICAgICAgICBzZXRWYXJzT25Ob2RlKHZub2RlLmVsLCB2YXJzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodm5vZGUudHlwZSA9PT0gRnJhZ21lbnQpIHtcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaChjID0+IHNldFZhcnNPblZOb2RlKGMsIHZhcnMpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodm5vZGUudHlwZSA9PT0gU3RhdGljKSB7XG4gICAgICAgIGxldCB7IGVsLCBhbmNob3IgfSA9IHZub2RlO1xuICAgICAgICB3aGlsZSAoZWwpIHtcbiAgICAgICAgICAgIHNldFZhcnNPbk5vZGUoZWwsIHZhcnMpO1xuICAgICAgICAgICAgaWYgKGVsID09PSBhbmNob3IpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBlbCA9IGVsLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0VmFyc09uTm9kZShlbCwgdmFycykge1xuICAgIGlmIChlbC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IGVsLnN0eWxlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzKSB7XG4gICAgICAgICAgICBzdHlsZS5zZXRQcm9wZXJ0eShgLS0ke2tleX1gLCB2YXJzW2tleV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBUUkFOU0lUSU9OID0gJ3RyYW5zaXRpb24nO1xuY29uc3QgQU5JTUFUSU9OID0gJ2FuaW1hdGlvbic7XG4vLyBET00gVHJhbnNpdGlvbiBpcyBhIGhpZ2hlci1vcmRlci1jb21wb25lbnQgYmFzZWQgb24gdGhlIHBsYXRmb3JtLWFnbm9zdGljXG4vLyBiYXNlIFRyYW5zaXRpb24gY29tcG9uZW50LCB3aXRoIERPTS1zcGVjaWZpYyBsb2dpYy5cbmNvbnN0IFRyYW5zaXRpb24gPSAocHJvcHMsIHsgc2xvdHMgfSkgPT4gaChCYXNlVHJhbnNpdGlvbiwgcmVzb2x2ZVRyYW5zaXRpb25Qcm9wcyhwcm9wcyksIHNsb3RzKTtcblRyYW5zaXRpb24uZGlzcGxheU5hbWUgPSAnVHJhbnNpdGlvbic7XG5jb25zdCBET01UcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0ge1xuICAgIG5hbWU6IFN0cmluZyxcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgY3NzOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGR1cmF0aW9uOiBbU3RyaW5nLCBOdW1iZXIsIE9iamVjdF0sXG4gICAgZW50ZXJGcm9tQ2xhc3M6IFN0cmluZyxcbiAgICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsXG4gICAgZW50ZXJUb0NsYXNzOiBTdHJpbmcsXG4gICAgYXBwZWFyRnJvbUNsYXNzOiBTdHJpbmcsXG4gICAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsXG4gICAgbGVhdmVGcm9tQ2xhc3M6IFN0cmluZyxcbiAgICBsZWF2ZUFjdGl2ZUNsYXNzOiBTdHJpbmcsXG4gICAgbGVhdmVUb0NsYXNzOiBTdHJpbmdcbn07XG5jb25zdCBUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0gKFRyYW5zaXRpb24ucHJvcHMgPVxuICAgIC8qI19fUFVSRV9fKi8gZXh0ZW5kKHt9LCBCYXNlVHJhbnNpdGlvbi5wcm9wcywgRE9NVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycykpO1xuLyoqXG4gKiAjMzIyNyBJbmNvbWluZyBob29rcyBtYXkgYmUgbWVyZ2VkIGludG8gYXJyYXlzIHdoZW4gd3JhcHBpbmcgVHJhbnNpdGlvblxuICogd2l0aCBjdXN0b20gSE9Dcy5cbiAqL1xuY29uc3QgY2FsbEhvb2sgPSAoaG9vaywgYXJncyA9IFtdKSA9PiB7XG4gICAgaWYgKGlzQXJyYXkoaG9vaykpIHtcbiAgICAgICAgaG9vay5mb3JFYWNoKGggPT4gaCguLi5hcmdzKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGhvb2spIHtcbiAgICAgICAgaG9vayguLi5hcmdzKTtcbiAgICB9XG59O1xuLyoqXG4gKiBDaGVjayBpZiBhIGhvb2sgZXhwZWN0cyBhIGNhbGxiYWNrICgybmQgYXJnKSwgd2hpY2ggbWVhbnMgdGhlIHVzZXJcbiAqIGludGVuZHMgdG8gZXhwbGljaXRseSBjb250cm9sIHRoZSBlbmQgb2YgdGhlIHRyYW5zaXRpb24uXG4gKi9cbmNvbnN0IGhhc0V4cGxpY2l0Q2FsbGJhY2sgPSAoaG9vaykgPT4ge1xuICAgIHJldHVybiBob29rXG4gICAgICAgID8gaXNBcnJheShob29rKVxuICAgICAgICAgICAgPyBob29rLnNvbWUoaCA9PiBoLmxlbmd0aCA+IDEpXG4gICAgICAgICAgICA6IGhvb2subGVuZ3RoID4gMVxuICAgICAgICA6IGZhbHNlO1xufTtcbmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uUHJvcHMocmF3UHJvcHMpIHtcbiAgICBjb25zdCBiYXNlUHJvcHMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiByYXdQcm9wcykge1xuICAgICAgICBpZiAoIShrZXkgaW4gRE9NVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycykpIHtcbiAgICAgICAgICAgIGJhc2VQcm9wc1trZXldID0gcmF3UHJvcHNba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocmF3UHJvcHMuY3NzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gYmFzZVByb3BzO1xuICAgIH1cbiAgICBjb25zdCB7IG5hbWUgPSAndicsIHR5cGUsIGR1cmF0aW9uLCBlbnRlckZyb21DbGFzcyA9IGAke25hbWV9LWVudGVyLWZyb21gLCBlbnRlckFjdGl2ZUNsYXNzID0gYCR7bmFtZX0tZW50ZXItYWN0aXZlYCwgZW50ZXJUb0NsYXNzID0gYCR7bmFtZX0tZW50ZXItdG9gLCBhcHBlYXJGcm9tQ2xhc3MgPSBlbnRlckZyb21DbGFzcywgYXBwZWFyQWN0aXZlQ2xhc3MgPSBlbnRlckFjdGl2ZUNsYXNzLCBhcHBlYXJUb0NsYXNzID0gZW50ZXJUb0NsYXNzLCBsZWF2ZUZyb21DbGFzcyA9IGAke25hbWV9LWxlYXZlLWZyb21gLCBsZWF2ZUFjdGl2ZUNsYXNzID0gYCR7bmFtZX0tbGVhdmUtYWN0aXZlYCwgbGVhdmVUb0NsYXNzID0gYCR7bmFtZX0tbGVhdmUtdG9gIH0gPSByYXdQcm9wcztcbiAgICBjb25zdCBkdXJhdGlvbnMgPSBub3JtYWxpemVEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgY29uc3QgZW50ZXJEdXJhdGlvbiA9IGR1cmF0aW9ucyAmJiBkdXJhdGlvbnNbMF07XG4gICAgY29uc3QgbGVhdmVEdXJhdGlvbiA9IGR1cmF0aW9ucyAmJiBkdXJhdGlvbnNbMV07XG4gICAgY29uc3QgeyBvbkJlZm9yZUVudGVyLCBvbkVudGVyLCBvbkVudGVyQ2FuY2VsbGVkLCBvbkxlYXZlLCBvbkxlYXZlQ2FuY2VsbGVkLCBvbkJlZm9yZUFwcGVhciA9IG9uQmVmb3JlRW50ZXIsIG9uQXBwZWFyID0gb25FbnRlciwgb25BcHBlYXJDYW5jZWxsZWQgPSBvbkVudGVyQ2FuY2VsbGVkIH0gPSBiYXNlUHJvcHM7XG4gICAgY29uc3QgZmluaXNoRW50ZXIgPSAoZWwsIGlzQXBwZWFyLCBkb25lKSA9PiB7XG4gICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJUb0NsYXNzIDogZW50ZXJUb0NsYXNzKTtcbiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBpc0FwcGVhciA/IGFwcGVhckFjdGl2ZUNsYXNzIDogZW50ZXJBY3RpdmVDbGFzcyk7XG4gICAgICAgIGRvbmUgJiYgZG9uZSgpO1xuICAgIH07XG4gICAgY29uc3QgZmluaXNoTGVhdmUgPSAoZWwsIGRvbmUpID0+IHtcbiAgICAgICAgZWwuX2lzTGVhdmluZyA9IGZhbHNlO1xuICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlRnJvbUNsYXNzKTtcbiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZVRvQ2xhc3MpO1xuICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgICAgICBkb25lICYmIGRvbmUoKTtcbiAgICB9O1xuICAgIGNvbnN0IG1ha2VFbnRlckhvb2sgPSAoaXNBcHBlYXIpID0+IHtcbiAgICAgICAgcmV0dXJuIChlbCwgZG9uZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaG9vayA9IGlzQXBwZWFyID8gb25BcHBlYXIgOiBvbkVudGVyO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZSA9ICgpID0+IGZpbmlzaEVudGVyKGVsLCBpc0FwcGVhciwgZG9uZSk7XG4gICAgICAgICAgICBjYWxsSG9vayhob29rLCBbZWwsIHJlc29sdmVdKTtcbiAgICAgICAgICAgIG5leHRGcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBpc0FwcGVhciA/IGFwcGVhckZyb21DbGFzcyA6IGVudGVyRnJvbUNsYXNzKTtcbiAgICAgICAgICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGlzQXBwZWFyID8gYXBwZWFyVG9DbGFzcyA6IGVudGVyVG9DbGFzcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNFeHBsaWNpdENhbGxiYWNrKGhvb2spKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoZW5UcmFuc2l0aW9uRW5kcyhlbCwgdHlwZSwgZW50ZXJEdXJhdGlvbiwgcmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICByZXR1cm4gZXh0ZW5kKGJhc2VQcm9wcywge1xuICAgICAgICBvbkJlZm9yZUVudGVyKGVsKSB7XG4gICAgICAgICAgICBjYWxsSG9vayhvbkJlZm9yZUVudGVyLCBbZWxdKTtcbiAgICAgICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgZW50ZXJGcm9tQ2xhc3MpO1xuICAgICAgICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBlbnRlckFjdGl2ZUNsYXNzKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25CZWZvcmVBcHBlYXIoZWwpIHtcbiAgICAgICAgICAgIGNhbGxIb29rKG9uQmVmb3JlQXBwZWFyLCBbZWxdKTtcbiAgICAgICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgYXBwZWFyRnJvbUNsYXNzKTtcbiAgICAgICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgYXBwZWFyQWN0aXZlQ2xhc3MpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVudGVyOiBtYWtlRW50ZXJIb29rKGZhbHNlKSxcbiAgICAgICAgb25BcHBlYXI6IG1ha2VFbnRlckhvb2sodHJ1ZSksXG4gICAgICAgIG9uTGVhdmUoZWwsIGRvbmUpIHtcbiAgICAgICAgICAgIGVsLl9pc0xlYXZpbmcgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZSA9ICgpID0+IGZpbmlzaExlYXZlKGVsLCBkb25lKTtcbiAgICAgICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgICAgICAgICAgLy8gZm9yY2UgcmVmbG93IHNvICotbGVhdmUtZnJvbSBjbGFzc2VzIGltbWVkaWF0ZWx5IHRha2UgZWZmZWN0ICgjMjU5MylcbiAgICAgICAgICAgIGZvcmNlUmVmbG93KCk7XG4gICAgICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgICAgICAgICAgbmV4dEZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVsLl9pc0xlYXZpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FuY2VsbGVkXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUZyb21DbGFzcyk7XG4gICAgICAgICAgICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZVRvQ2xhc3MpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzRXhwbGljaXRDYWxsYmFjayhvbkxlYXZlKSkge1xuICAgICAgICAgICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGxlYXZlRHVyYXRpb24sIHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2FsbEhvb2sob25MZWF2ZSwgW2VsLCByZXNvbHZlXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRW50ZXJDYW5jZWxsZWQoZWwpIHtcbiAgICAgICAgICAgIGZpbmlzaEVudGVyKGVsLCBmYWxzZSk7XG4gICAgICAgICAgICBjYWxsSG9vayhvbkVudGVyQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25BcHBlYXJDYW5jZWxsZWQoZWwpIHtcbiAgICAgICAgICAgIGZpbmlzaEVudGVyKGVsLCB0cnVlKTtcbiAgICAgICAgICAgIGNhbGxIb29rKG9uQXBwZWFyQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25MZWF2ZUNhbmNlbGxlZChlbCkge1xuICAgICAgICAgICAgZmluaXNoTGVhdmUoZWwpO1xuICAgICAgICAgICAgY2FsbEhvb2sob25MZWF2ZUNhbmNlbGxlZCwgW2VsXSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUR1cmF0aW9uKGR1cmF0aW9uKSB7XG4gICAgaWYgKGR1cmF0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzT2JqZWN0KGR1cmF0aW9uKSkge1xuICAgICAgICByZXR1cm4gW051bWJlck9mKGR1cmF0aW9uLmVudGVyKSwgTnVtYmVyT2YoZHVyYXRpb24ubGVhdmUpXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IG4gPSBOdW1iZXJPZihkdXJhdGlvbik7XG4gICAgICAgIHJldHVybiBbbiwgbl07XG4gICAgfVxufVxuZnVuY3Rpb24gTnVtYmVyT2YodmFsKSB7XG4gICAgY29uc3QgcmVzID0gdG9OdW1iZXIodmFsKTtcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgIGFzc2VydE51bWJlcihyZXMsICc8dHJhbnNpdGlvbj4gZXhwbGljaXQgZHVyYXRpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgY2xzKSB7XG4gICAgY2xzLnNwbGl0KC9cXHMrLykuZm9yRWFjaChjID0+IGMgJiYgZWwuY2xhc3NMaXN0LmFkZChjKSk7XG4gICAgKGVsLl92dGMgfHxcbiAgICAgICAgKGVsLl92dGMgPSBuZXcgU2V0KCkpKS5hZGQoY2xzKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgY2xzKSB7XG4gICAgY2xzLnNwbGl0KC9cXHMrLykuZm9yRWFjaChjID0+IGMgJiYgZWwuY2xhc3NMaXN0LnJlbW92ZShjKSk7XG4gICAgY29uc3QgeyBfdnRjIH0gPSBlbDtcbiAgICBpZiAoX3Z0Yykge1xuICAgICAgICBfdnRjLmRlbGV0ZShjbHMpO1xuICAgICAgICBpZiAoIV92dGMuc2l6ZSkge1xuICAgICAgICAgICAgZWwuX3Z0YyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIG5leHRGcmFtZShjYikge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShjYik7XG4gICAgfSk7XG59XG5sZXQgZW5kSWQgPSAwO1xuZnVuY3Rpb24gd2hlblRyYW5zaXRpb25FbmRzKGVsLCBleHBlY3RlZFR5cGUsIGV4cGxpY2l0VGltZW91dCwgcmVzb2x2ZSkge1xuICAgIGNvbnN0IGlkID0gKGVsLl9lbmRJZCA9ICsrZW5kSWQpO1xuICAgIGNvbnN0IHJlc29sdmVJZk5vdFN0YWxlID0gKCkgPT4ge1xuICAgICAgICBpZiAoaWQgPT09IGVsLl9lbmRJZCkge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAoZXhwbGljaXRUaW1lb3V0KSB7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KHJlc29sdmVJZk5vdFN0YWxlLCBleHBsaWNpdFRpbWVvdXQpO1xuICAgIH1cbiAgICBjb25zdCB7IHR5cGUsIHRpbWVvdXQsIHByb3BDb3VudCB9ID0gZ2V0VHJhbnNpdGlvbkluZm8oZWwsIGV4cGVjdGVkVHlwZSk7XG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgfVxuICAgIGNvbnN0IGVuZEV2ZW50ID0gdHlwZSArICdlbmQnO1xuICAgIGxldCBlbmRlZCA9IDA7XG4gICAgY29uc3QgZW5kID0gKCkgPT4ge1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGVuZEV2ZW50LCBvbkVuZCk7XG4gICAgICAgIHJlc29sdmVJZk5vdFN0YWxlKCk7XG4gICAgfTtcbiAgICBjb25zdCBvbkVuZCA9IChlKSA9PiB7XG4gICAgICAgIGlmIChlLnRhcmdldCA9PT0gZWwgJiYgKytlbmRlZCA+PSBwcm9wQ291bnQpIHtcbiAgICAgICAgICAgIGVuZCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKGVuZGVkIDwgcHJvcENvdW50KSB7XG4gICAgICAgICAgICBlbmQoKTtcbiAgICAgICAgfVxuICAgIH0sIHRpbWVvdXQgKyAxKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKGVuZEV2ZW50LCBvbkVuZCk7XG59XG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uSW5mbyhlbCwgZXhwZWN0ZWRUeXBlKSB7XG4gICAgY29uc3Qgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xuICAgIC8vIEpTRE9NIG1heSByZXR1cm4gdW5kZWZpbmVkIGZvciB0cmFuc2l0aW9uIHByb3BlcnRpZXNcbiAgICBjb25zdCBnZXRTdHlsZVByb3BlcnRpZXMgPSAoa2V5KSA9PiAoc3R5bGVzW2tleV0gfHwgJycpLnNwbGl0KCcsICcpO1xuICAgIGNvbnN0IHRyYW5zaXRpb25EZWxheXMgPSBnZXRTdHlsZVByb3BlcnRpZXMoYCR7VFJBTlNJVElPTn1EZWxheWApO1xuICAgIGNvbnN0IHRyYW5zaXRpb25EdXJhdGlvbnMgPSBnZXRTdHlsZVByb3BlcnRpZXMoYCR7VFJBTlNJVElPTn1EdXJhdGlvbmApO1xuICAgIGNvbnN0IHRyYW5zaXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dCh0cmFuc2l0aW9uRGVsYXlzLCB0cmFuc2l0aW9uRHVyYXRpb25zKTtcbiAgICBjb25zdCBhbmltYXRpb25EZWxheXMgPSBnZXRTdHlsZVByb3BlcnRpZXMoYCR7QU5JTUFUSU9OfURlbGF5YCk7XG4gICAgY29uc3QgYW5pbWF0aW9uRHVyYXRpb25zID0gZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke0FOSU1BVElPTn1EdXJhdGlvbmApO1xuICAgIGNvbnN0IGFuaW1hdGlvblRpbWVvdXQgPSBnZXRUaW1lb3V0KGFuaW1hdGlvbkRlbGF5cywgYW5pbWF0aW9uRHVyYXRpb25zKTtcbiAgICBsZXQgdHlwZSA9IG51bGw7XG4gICAgbGV0IHRpbWVvdXQgPSAwO1xuICAgIGxldCBwcm9wQ291bnQgPSAwO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChleHBlY3RlZFR5cGUgPT09IFRSQU5TSVRJT04pIHtcbiAgICAgICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkge1xuICAgICAgICAgICAgdHlwZSA9IFRSQU5TSVRJT047XG4gICAgICAgICAgICB0aW1lb3V0ID0gdHJhbnNpdGlvblRpbWVvdXQ7XG4gICAgICAgICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IEFOSU1BVElPTikge1xuICAgICAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHtcbiAgICAgICAgICAgIHR5cGUgPSBBTklNQVRJT047XG4gICAgICAgICAgICB0aW1lb3V0ID0gYW5pbWF0aW9uVGltZW91dDtcbiAgICAgICAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7XG4gICAgICAgIHR5cGUgPVxuICAgICAgICAgICAgdGltZW91dCA+IDBcbiAgICAgICAgICAgICAgICA/IHRyYW5zaXRpb25UaW1lb3V0ID4gYW5pbWF0aW9uVGltZW91dFxuICAgICAgICAgICAgICAgICAgICA/IFRSQU5TSVRJT05cbiAgICAgICAgICAgICAgICAgICAgOiBBTklNQVRJT05cbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIHByb3BDb3VudCA9IHR5cGVcbiAgICAgICAgICAgID8gdHlwZSA9PT0gVFJBTlNJVElPTlxuICAgICAgICAgICAgICAgID8gdHJhbnNpdGlvbkR1cmF0aW9ucy5sZW5ndGhcbiAgICAgICAgICAgICAgICA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGhcbiAgICAgICAgICAgIDogMDtcbiAgICB9XG4gICAgY29uc3QgaGFzVHJhbnNmb3JtID0gdHlwZSA9PT0gVFJBTlNJVElPTiAmJlxuICAgICAgICAvXFxiKHRyYW5zZm9ybXxhbGwpKCx8JCkvLnRlc3QoZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke1RSQU5TSVRJT059UHJvcGVydHlgKS50b1N0cmluZygpKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICB0aW1lb3V0LFxuICAgICAgICBwcm9wQ291bnQsXG4gICAgICAgIGhhc1RyYW5zZm9ybVxuICAgIH07XG59XG5mdW5jdGlvbiBnZXRUaW1lb3V0KGRlbGF5cywgZHVyYXRpb25zKSB7XG4gICAgd2hpbGUgKGRlbGF5cy5sZW5ndGggPCBkdXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGRlbGF5cyA9IGRlbGF5cy5jb25jYXQoZGVsYXlzKTtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWF4KC4uLmR1cmF0aW9ucy5tYXAoKGQsIGkpID0+IHRvTXMoZCkgKyB0b01zKGRlbGF5c1tpXSkpKTtcbn1cbi8vIE9sZCB2ZXJzaW9ucyBvZiBDaHJvbWl1bSAoYmVsb3cgNjEuMC4zMTYzLjEwMCkgZm9ybWF0cyBmbG9hdGluZyBwb2ludGVyXG4vLyBudW1iZXJzIGluIGEgbG9jYWxlLWRlcGVuZGVudCB3YXksIHVzaW5nIGEgY29tbWEgaW5zdGVhZCBvZiBhIGRvdC5cbi8vIElmIGNvbW1hIGlzIG5vdCByZXBsYWNlZCB3aXRoIGEgZG90LCB0aGUgaW5wdXQgd2lsbCBiZSByb3VuZGVkIGRvd25cbi8vIChpLmUuIGFjdGluZyBhcyBhIGZsb29yIGZ1bmN0aW9uKSBjYXVzaW5nIHVuZXhwZWN0ZWQgYmVoYXZpb3JzXG5mdW5jdGlvbiB0b01zKHMpIHtcbiAgICByZXR1cm4gTnVtYmVyKHMuc2xpY2UoMCwgLTEpLnJlcGxhY2UoJywnLCAnLicpKSAqIDEwMDA7XG59XG4vLyBzeW5jaHJvbm91c2x5IGZvcmNlIGxheW91dCB0byBwdXQgZWxlbWVudHMgaW50byBhIGNlcnRhaW4gc3RhdGVcbmZ1bmN0aW9uIGZvcmNlUmVmbG93KCkge1xuICAgIHJldHVybiBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDtcbn1cblxuY29uc3QgcG9zaXRpb25NYXAgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgbmV3UG9zaXRpb25NYXAgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgVHJhbnNpdGlvbkdyb3VwSW1wbCA9IHtcbiAgICBuYW1lOiAnVHJhbnNpdGlvbkdyb3VwJyxcbiAgICBwcm9wczogLyojX19QVVJFX18qLyBleHRlbmQoe30sIFRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMsIHtcbiAgICAgICAgdGFnOiBTdHJpbmcsXG4gICAgICAgIG1vdmVDbGFzczogU3RyaW5nXG4gICAgfSksXG4gICAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHVzZVRyYW5zaXRpb25TdGF0ZSgpO1xuICAgICAgICBsZXQgcHJldkNoaWxkcmVuO1xuICAgICAgICBsZXQgY2hpbGRyZW47XG4gICAgICAgIG9uVXBkYXRlZCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBjaGlsZHJlbiBpcyBndWFyYW50ZWVkIHRvIGV4aXN0IGFmdGVyIGluaXRpYWwgcmVuZGVyXG4gICAgICAgICAgICBpZiAoIXByZXZDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtb3ZlQ2xhc3MgPSBwcm9wcy5tb3ZlQ2xhc3MgfHwgYCR7cHJvcHMubmFtZSB8fCAndid9LW1vdmVgO1xuICAgICAgICAgICAgaWYgKCFoYXNDU1NUcmFuc2Zvcm0ocHJldkNoaWxkcmVuWzBdLmVsLCBpbnN0YW5jZS52bm9kZS5lbCwgbW92ZUNsYXNzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHdlIGRpdmlkZSB0aGUgd29yayBpbnRvIHRocmVlIGxvb3BzIHRvIGF2b2lkIG1peGluZyBET00gcmVhZHMgYW5kIHdyaXRlc1xuICAgICAgICAgICAgLy8gaW4gZWFjaCBpdGVyYXRpb24gLSB3aGljaCBoZWxwcyBwcmV2ZW50IGxheW91dCB0aHJhc2hpbmcuXG4gICAgICAgICAgICBwcmV2Q2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7XG4gICAgICAgICAgICBwcmV2Q2hpbGRyZW4uZm9yRWFjaChyZWNvcmRQb3NpdGlvbik7XG4gICAgICAgICAgICBjb25zdCBtb3ZlZENoaWxkcmVuID0gcHJldkNoaWxkcmVuLmZpbHRlcihhcHBseVRyYW5zbGF0aW9uKTtcbiAgICAgICAgICAgIC8vIGZvcmNlIHJlZmxvdyB0byBwdXQgZXZlcnl0aGluZyBpbiBwb3NpdGlvblxuICAgICAgICAgICAgZm9yY2VSZWZsb3coKTtcbiAgICAgICAgICAgIG1vdmVkQ2hpbGRyZW4uZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGMuZWw7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBlbC5zdHlsZTtcbiAgICAgICAgICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7XG4gICAgICAgICAgICAgICAgc3R5bGUudHJhbnNmb3JtID0gc3R5bGUud2Via2l0VHJhbnNmb3JtID0gc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gJyc7XG4gICAgICAgICAgICAgICAgY29uc3QgY2IgPSAoZWwuX21vdmVDYiA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUudGFyZ2V0ICE9PSBlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZSB8fCAvdHJhbnNmb3JtJC8udGVzdChlLnByb3BlcnR5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBjYik7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5fbW92ZUNiID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBjYik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByYXdQcm9wcyA9IHRvUmF3KHByb3BzKTtcbiAgICAgICAgICAgIGNvbnN0IGNzc1RyYW5zaXRpb25Qcm9wcyA9IHJlc29sdmVUcmFuc2l0aW9uUHJvcHMocmF3UHJvcHMpO1xuICAgICAgICAgICAgbGV0IHRhZyA9IHJhd1Byb3BzLnRhZyB8fCBGcmFnbWVudDtcbiAgICAgICAgICAgIHByZXZDaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICAgICAgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0ID8gZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuKHNsb3RzLmRlZmF1bHQoKSkgOiBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5rZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRUcmFuc2l0aW9uSG9va3MoY2hpbGQsIHJlc29sdmVUcmFuc2l0aW9uSG9va3MoY2hpbGQsIGNzc1RyYW5zaXRpb25Qcm9wcywgc3RhdGUsIGluc3RhbmNlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICB3YXJuKGA8VHJhbnNpdGlvbkdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmV2Q2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IHByZXZDaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKGNoaWxkLCByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKGNoaWxkLCBjc3NUcmFuc2l0aW9uUHJvcHMsIHN0YXRlLCBpbnN0YW5jZSkpO1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQoY2hpbGQsIGNoaWxkLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlVk5vZGUodGFnLCBudWxsLCBjaGlsZHJlbik7XG4gICAgICAgIH07XG4gICAgfVxufTtcbi8qKlxuICogVHJhbnNpdGlvbkdyb3VwIGRvZXMgbm90IHN1cHBvcnQgXCJtb2RlXCIgc28gd2UgbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGVcbiAqIHByb3BzIGRlY2xhcmF0aW9ucywgYnV0IGRpcmVjdCBkZWxldGUgb3BlcmF0aW9uIGlzIGNvbnNpZGVyZWQgYSBzaWRlIGVmZmVjdFxuICogYW5kIHdpbGwgbWFrZSB0aGUgZW50aXJlIHRyYW5zaXRpb24gZmVhdHVyZSBub24tdHJlZS1zaGFrZWFibGUsIHNvIHdlIGRvIGl0XG4gKiBpbiBhIGZ1bmN0aW9uIGFuZCBtYXJrIHRoZSBmdW5jdGlvbidzIGludm9jYXRpb24gYXMgcHVyZS5cbiAqL1xuY29uc3QgcmVtb3ZlTW9kZSA9IChwcm9wcykgPT4gZGVsZXRlIHByb3BzLm1vZGU7XG4vKiNfX1BVUkVfXyovIHJlbW92ZU1vZGUoVHJhbnNpdGlvbkdyb3VwSW1wbC5wcm9wcyk7XG5jb25zdCBUcmFuc2l0aW9uR3JvdXAgPSBUcmFuc2l0aW9uR3JvdXBJbXBsO1xuZnVuY3Rpb24gY2FsbFBlbmRpbmdDYnMoYykge1xuICAgIGNvbnN0IGVsID0gYy5lbDtcbiAgICBpZiAoZWwuX21vdmVDYikge1xuICAgICAgICBlbC5fbW92ZUNiKCk7XG4gICAgfVxuICAgIGlmIChlbC5fZW50ZXJDYikge1xuICAgICAgICBlbC5fZW50ZXJDYigpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlY29yZFBvc2l0aW9uKGMpIHtcbiAgICBuZXdQb3NpdGlvbk1hcC5zZXQoYywgYy5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG59XG5mdW5jdGlvbiBhcHBseVRyYW5zbGF0aW9uKGMpIHtcbiAgICBjb25zdCBvbGRQb3MgPSBwb3NpdGlvbk1hcC5nZXQoYyk7XG4gICAgY29uc3QgbmV3UG9zID0gbmV3UG9zaXRpb25NYXAuZ2V0KGMpO1xuICAgIGNvbnN0IGR4ID0gb2xkUG9zLmxlZnQgLSBuZXdQb3MubGVmdDtcbiAgICBjb25zdCBkeSA9IG9sZFBvcy50b3AgLSBuZXdQb3MudG9wO1xuICAgIGlmIChkeCB8fCBkeSkge1xuICAgICAgICBjb25zdCBzID0gYy5lbC5zdHlsZTtcbiAgICAgICAgcy50cmFuc2Zvcm0gPSBzLndlYmtpdFRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtkeH1weCwke2R5fXB4KWA7XG4gICAgICAgIHMudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBzJztcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFzQ1NTVHJhbnNmb3JtKGVsLCByb290LCBtb3ZlQ2xhc3MpIHtcbiAgICAvLyBEZXRlY3Qgd2hldGhlciBhbiBlbGVtZW50IHdpdGggdGhlIG1vdmUgY2xhc3MgYXBwbGllZCBoYXNcbiAgICAvLyBDU1MgdHJhbnNpdGlvbnMuIFNpbmNlIHRoZSBlbGVtZW50IG1heSBiZSBpbnNpZGUgYW4gZW50ZXJpbmdcbiAgICAvLyB0cmFuc2l0aW9uIGF0IHRoaXMgdmVyeSBtb21lbnQsIHdlIG1ha2UgYSBjbG9uZSBvZiBpdCBhbmQgcmVtb3ZlXG4gICAgLy8gYWxsIG90aGVyIHRyYW5zaXRpb24gY2xhc3NlcyBhcHBsaWVkIHRvIGVuc3VyZSBvbmx5IHRoZSBtb3ZlIGNsYXNzXG4gICAgLy8gaXMgYXBwbGllZC5cbiAgICBjb25zdCBjbG9uZSA9IGVsLmNsb25lTm9kZSgpO1xuICAgIGlmIChlbC5fdnRjKSB7XG4gICAgICAgIGVsLl92dGMuZm9yRWFjaChjbHMgPT4ge1xuICAgICAgICAgICAgY2xzLnNwbGl0KC9cXHMrLykuZm9yRWFjaChjID0+IGMgJiYgY2xvbmUuY2xhc3NMaXN0LnJlbW92ZShjKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtb3ZlQ2xhc3Muc3BsaXQoL1xccysvKS5mb3JFYWNoKGMgPT4gYyAmJiBjbG9uZS5jbGFzc0xpc3QuYWRkKGMpKTtcbiAgICBjbG9uZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IChyb290Lm5vZGVUeXBlID09PSAxID8gcm9vdCA6IHJvb3QucGFyZW50Tm9kZSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNsb25lKTtcbiAgICBjb25zdCB7IGhhc1RyYW5zZm9ybSB9ID0gZ2V0VHJhbnNpdGlvbkluZm8oY2xvbmUpO1xuICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjbG9uZSk7XG4gICAgcmV0dXJuIGhhc1RyYW5zZm9ybTtcbn1cblxuY29uc3QgZ2V0TW9kZWxBc3NpZ25lciA9ICh2bm9kZSkgPT4ge1xuICAgIGNvbnN0IGZuID0gdm5vZGUucHJvcHNbJ29uVXBkYXRlOm1vZGVsVmFsdWUnXSB8fFxuICAgICAgICAoZmFsc2UgKTtcbiAgICByZXR1cm4gaXNBcnJheShmbikgPyB2YWx1ZSA9PiBpbnZva2VBcnJheUZucyhmbiwgdmFsdWUpIDogZm47XG59O1xuZnVuY3Rpb24gb25Db21wb3NpdGlvblN0YXJ0KGUpIHtcbiAgICBlLnRhcmdldC5jb21wb3NpbmcgPSB0cnVlO1xufVxuZnVuY3Rpb24gb25Db21wb3NpdGlvbkVuZChlKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgaWYgKHRhcmdldC5jb21wb3NpbmcpIHtcbiAgICAgICAgdGFyZ2V0LmNvbXBvc2luZyA9IGZhbHNlO1xuICAgICAgICB0YXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JykpO1xuICAgIH1cbn1cbi8vIFdlIGFyZSBleHBvcnRpbmcgdGhlIHYtbW9kZWwgcnVudGltZSBkaXJlY3RseSBhcyB2bm9kZSBob29rcyBzbyB0aGF0IGl0IGNhblxuLy8gYmUgdHJlZS1zaGFrZW4gaW4gY2FzZSB2LW1vZGVsIGlzIG5ldmVyIHVzZWQuXG5jb25zdCB2TW9kZWxUZXh0ID0ge1xuICAgIGNyZWF0ZWQoZWwsIHsgbW9kaWZpZXJzOiB7IGxhenksIHRyaW0sIG51bWJlciB9IH0sIHZub2RlKSB7XG4gICAgICAgIGVsLl9hc3NpZ24gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICAgICAgY29uc3QgY2FzdFRvTnVtYmVyID0gbnVtYmVyIHx8ICh2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy50eXBlID09PSAnbnVtYmVyJyk7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIGxhenkgPyAnY2hhbmdlJyA6ICdpbnB1dCcsIGUgPT4ge1xuICAgICAgICAgICAgaWYgKGUudGFyZ2V0LmNvbXBvc2luZylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgZG9tVmFsdWUgPSBlbC52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0cmltKSB7XG4gICAgICAgICAgICAgICAgZG9tVmFsdWUgPSBkb21WYWx1ZS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FzdFRvTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgZG9tVmFsdWUgPSBsb29zZVRvTnVtYmVyKGRvbVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsLl9hc3NpZ24oZG9tVmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRyaW0pIHtcbiAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsICdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZWwudmFsdWUgPSBlbC52YWx1ZS50cmltKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxhenkpIHtcbiAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsICdjb21wb3NpdGlvbnN0YXJ0Jywgb25Db21wb3NpdGlvblN0YXJ0KTtcbiAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsICdjb21wb3NpdGlvbmVuZCcsIG9uQ29tcG9zaXRpb25FbmQpO1xuICAgICAgICAgICAgLy8gU2FmYXJpIDwgMTAuMiAmIFVJV2ViVmlldyBkb2Vzbid0IGZpcmUgY29tcG9zaXRpb25lbmQgd2hlblxuICAgICAgICAgICAgLy8gc3dpdGNoaW5nIGZvY3VzIGJlZm9yZSBjb25maXJtaW5nIGNvbXBvc2l0aW9uIGNob2ljZVxuICAgICAgICAgICAgLy8gdGhpcyBhbHNvIGZpeGVzIHRoZSBpc3N1ZSB3aGVyZSBzb21lIGJyb3dzZXJzIGUuZy4gaU9TIENocm9tZVxuICAgICAgICAgICAgLy8gZmlyZXMgXCJjaGFuZ2VcIiBpbnN0ZWFkIG9mIFwiaW5wdXRcIiBvbiBhdXRvY29tcGxldGUuXG4gICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCAnY2hhbmdlJywgb25Db21wb3NpdGlvbkVuZCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8vIHNldCB2YWx1ZSBvbiBtb3VudGVkIHNvIGl0J3MgYWZ0ZXIgbWluL21heCBmb3IgdHlwZT1cInJhbmdlXCJcbiAgICBtb3VudGVkKGVsLCB7IHZhbHVlIH0pIHtcbiAgICAgICAgZWwudmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZTtcbiAgICB9LFxuICAgIGJlZm9yZVVwZGF0ZShlbCwgeyB2YWx1ZSwgbW9kaWZpZXJzOiB7IGxhenksIHRyaW0sIG51bWJlciB9IH0sIHZub2RlKSB7XG4gICAgICAgIGVsLl9hc3NpZ24gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICAgICAgLy8gYXZvaWQgY2xlYXJpbmcgdW5yZXNvbHZlZCB0ZXh0LiAjMjMwMlxuICAgICAgICBpZiAoZWwuY29tcG9zaW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZWwgJiYgZWwudHlwZSAhPT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgaWYgKGxhenkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHJpbSAmJiBlbC52YWx1ZS50cmltKCkgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChudW1iZXIgfHwgZWwudHlwZSA9PT0gJ251bWJlcicpICYmXG4gICAgICAgICAgICAgICAgbG9vc2VUb051bWJlcihlbC52YWx1ZSkgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7XG4gICAgICAgIGlmIChlbC52YWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIGVsLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59O1xuY29uc3Qgdk1vZGVsQ2hlY2tib3ggPSB7XG4gICAgLy8gIzQwOTYgYXJyYXkgY2hlY2tib3hlcyBuZWVkIHRvIGJlIGRlZXAgdHJhdmVyc2VkXG4gICAgZGVlcDogdHJ1ZSxcbiAgICBjcmVhdGVkKGVsLCBfLCB2bm9kZSkge1xuICAgICAgICBlbC5fYXNzaWduID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsICdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtb2RlbFZhbHVlID0gZWwuX21vZGVsVmFsdWU7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50VmFsdWUgPSBnZXRWYWx1ZShlbCk7XG4gICAgICAgICAgICBjb25zdCBjaGVja2VkID0gZWwuY2hlY2tlZDtcbiAgICAgICAgICAgIGNvbnN0IGFzc2lnbiA9IGVsLl9hc3NpZ247XG4gICAgICAgICAgICBpZiAoaXNBcnJheShtb2RlbFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gbG9vc2VJbmRleE9mKG1vZGVsVmFsdWUsIGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSBpbmRleCAhPT0gLTE7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrZWQgJiYgIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2lnbihtb2RlbFZhbHVlLmNvbmNhdChlbGVtZW50VmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWNoZWNrZWQgJiYgZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBbLi4ubW9kZWxWYWx1ZV07XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGFzc2lnbihmaWx0ZXJlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNTZXQobW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbG9uZWQgPSBuZXcgU2V0KG1vZGVsVmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb25lZC5hZGQoZWxlbWVudFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb25lZC5kZWxldGUoZWxlbWVudFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXNzaWduKGNsb25lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhc3NpZ24oZ2V0Q2hlY2tib3hWYWx1ZShlbCwgY2hlY2tlZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIC8vIHNldCBpbml0aWFsIGNoZWNrZWQgb24gbW91bnQgdG8gd2FpdCBmb3IgdHJ1ZS12YWx1ZS9mYWxzZS12YWx1ZVxuICAgIG1vdW50ZWQ6IHNldENoZWNrZWQsXG4gICAgYmVmb3JlVXBkYXRlKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICAgICAgICBlbC5fYXNzaWduID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgICAgIHNldENoZWNrZWQoZWwsIGJpbmRpbmcsIHZub2RlKTtcbiAgICB9XG59O1xuZnVuY3Rpb24gc2V0Q2hlY2tlZChlbCwgeyB2YWx1ZSwgb2xkVmFsdWUgfSwgdm5vZGUpIHtcbiAgICBlbC5fbW9kZWxWYWx1ZSA9IHZhbHVlO1xuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBlbC5jaGVja2VkID0gbG9vc2VJbmRleE9mKHZhbHVlLCB2bm9kZS5wcm9wcy52YWx1ZSkgPiAtMTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgICAgIGVsLmNoZWNrZWQgPSB2YWx1ZS5oYXModm5vZGUucHJvcHMudmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZSAhPT0gb2xkVmFsdWUpIHtcbiAgICAgICAgZWwuY2hlY2tlZCA9IGxvb3NlRXF1YWwodmFsdWUsIGdldENoZWNrYm94VmFsdWUoZWwsIHRydWUpKTtcbiAgICB9XG59XG5jb25zdCB2TW9kZWxSYWRpbyA9IHtcbiAgICBjcmVhdGVkKGVsLCB7IHZhbHVlIH0sIHZub2RlKSB7XG4gICAgICAgIGVsLmNoZWNrZWQgPSBsb29zZUVxdWFsKHZhbHVlLCB2bm9kZS5wcm9wcy52YWx1ZSk7XG4gICAgICAgIGVsLl9hc3NpZ24gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGVsLl9hc3NpZ24oZ2V0VmFsdWUoZWwpKTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBiZWZvcmVVcGRhdGUoZWwsIHsgdmFsdWUsIG9sZFZhbHVlIH0sIHZub2RlKSB7XG4gICAgICAgIGVsLl9hc3NpZ24gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBvbGRWYWx1ZSkge1xuICAgICAgICAgICAgZWwuY2hlY2tlZCA9IGxvb3NlRXF1YWwodmFsdWUsIHZub2RlLnByb3BzLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5jb25zdCB2TW9kZWxTZWxlY3QgPSB7XG4gICAgLy8gPHNlbGVjdCBtdWx0aXBsZT4gdmFsdWUgbmVlZCB0byBiZSBkZWVwIHRyYXZlcnNlZFxuICAgIGRlZXA6IHRydWUsXG4gICAgY3JlYXRlZChlbCwgeyB2YWx1ZSwgbW9kaWZpZXJzOiB7IG51bWJlciB9IH0sIHZub2RlKSB7XG4gICAgICAgIGNvbnN0IGlzU2V0TW9kZWwgPSBpc1NldCh2YWx1ZSk7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsICdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFZhbCA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXJcbiAgICAgICAgICAgICAgICAuY2FsbChlbC5vcHRpb25zLCAobykgPT4gby5zZWxlY3RlZClcbiAgICAgICAgICAgICAgICAubWFwKChvKSA9PiBudW1iZXIgPyBsb29zZVRvTnVtYmVyKGdldFZhbHVlKG8pKSA6IGdldFZhbHVlKG8pKTtcbiAgICAgICAgICAgIGVsLl9hc3NpZ24oZWwubXVsdGlwbGVcbiAgICAgICAgICAgICAgICA/IGlzU2V0TW9kZWxcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgU2V0KHNlbGVjdGVkVmFsKVxuICAgICAgICAgICAgICAgICAgICA6IHNlbGVjdGVkVmFsXG4gICAgICAgICAgICAgICAgOiBzZWxlY3RlZFZhbFswXSk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbC5fYXNzaWduID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgfSxcbiAgICAvLyBzZXQgdmFsdWUgaW4gbW91bnRlZCAmIHVwZGF0ZWQgYmVjYXVzZSA8c2VsZWN0PiByZWxpZXMgb24gaXRzIGNoaWxkcmVuXG4gICAgLy8gPG9wdGlvbj5zLlxuICAgIG1vdW50ZWQoZWwsIHsgdmFsdWUgfSkge1xuICAgICAgICBzZXRTZWxlY3RlZChlbCwgdmFsdWUpO1xuICAgIH0sXG4gICAgYmVmb3JlVXBkYXRlKGVsLCBfYmluZGluZywgdm5vZGUpIHtcbiAgICAgICAgZWwuX2Fzc2lnbiA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIH0sXG4gICAgdXBkYXRlZChlbCwgeyB2YWx1ZSB9KSB7XG4gICAgICAgIHNldFNlbGVjdGVkKGVsLCB2YWx1ZSk7XG4gICAgfVxufTtcbmZ1bmN0aW9uIHNldFNlbGVjdGVkKGVsLCB2YWx1ZSkge1xuICAgIGNvbnN0IGlzTXVsdGlwbGUgPSBlbC5tdWx0aXBsZTtcbiAgICBpZiAoaXNNdWx0aXBsZSAmJiAhaXNBcnJheSh2YWx1ZSkgJiYgIWlzU2V0KHZhbHVlKSkge1xuICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiZcbiAgICAgICAgICAgIHdhcm4oYDxzZWxlY3QgbXVsdGlwbGUgdi1tb2RlbD4gZXhwZWN0cyBhbiBBcnJheSBvciBTZXQgdmFsdWUgZm9yIGl0cyBiaW5kaW5nLCBgICtcbiAgICAgICAgICAgICAgICBgYnV0IGdvdCAke09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkuc2xpY2UoOCwgLTEpfS5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IGVsLm9wdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGVsLm9wdGlvbnNbaV07XG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gZ2V0VmFsdWUob3B0aW9uKTtcbiAgICAgICAgaWYgKGlzTXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgb3B0aW9uVmFsdWUpID4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSB2YWx1ZS5oYXMob3B0aW9uVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uKSwgdmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsLnNlbGVjdGVkSW5kZXggIT09IGkpXG4gICAgICAgICAgICAgICAgICAgIGVsLnNlbGVjdGVkSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWlzTXVsdGlwbGUgJiYgZWwuc2VsZWN0ZWRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgZWwuc2VsZWN0ZWRJbmRleCA9IC0xO1xuICAgIH1cbn1cbi8vIHJldHJpZXZlIHJhdyB2YWx1ZSBzZXQgdmlhIDp2YWx1ZSBiaW5kaW5nc1xuZnVuY3Rpb24gZ2V0VmFsdWUoZWwpIHtcbiAgICByZXR1cm4gJ192YWx1ZScgaW4gZWwgPyBlbC5fdmFsdWUgOiBlbC52YWx1ZTtcbn1cbi8vIHJldHJpZXZlIHJhdyB2YWx1ZSBmb3IgdHJ1ZS12YWx1ZSBhbmQgZmFsc2UtdmFsdWUgc2V0IHZpYSA6dHJ1ZS12YWx1ZSBvciA6ZmFsc2UtdmFsdWUgYmluZGluZ3NcbmZ1bmN0aW9uIGdldENoZWNrYm94VmFsdWUoZWwsIGNoZWNrZWQpIHtcbiAgICBjb25zdCBrZXkgPSBjaGVja2VkID8gJ190cnVlVmFsdWUnIDogJ19mYWxzZVZhbHVlJztcbiAgICByZXR1cm4ga2V5IGluIGVsID8gZWxba2V5XSA6IGNoZWNrZWQ7XG59XG5jb25zdCB2TW9kZWxEeW5hbWljID0ge1xuICAgIGNyZWF0ZWQoZWwsIGJpbmRpbmcsIHZub2RlKSB7XG4gICAgICAgIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBudWxsLCAnY3JlYXRlZCcpO1xuICAgIH0sXG4gICAgbW91bnRlZChlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICAgICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIG51bGwsICdtb3VudGVkJyk7XG4gICAgfSxcbiAgICBiZWZvcmVVcGRhdGUoZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUpIHtcbiAgICAgICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSwgJ2JlZm9yZVVwZGF0ZScpO1xuICAgIH0sXG4gICAgdXBkYXRlZChlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSkge1xuICAgICAgICBjYWxsTW9kZWxIb29rKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlLCAndXBkYXRlZCcpO1xuICAgIH1cbn07XG5mdW5jdGlvbiByZXNvbHZlRHluYW1pY01vZGVsKHRhZ05hbWUsIHR5cGUpIHtcbiAgICBzd2l0Y2ggKHRhZ05hbWUpIHtcbiAgICAgICAgY2FzZSAnU0VMRUNUJzpcbiAgICAgICAgICAgIHJldHVybiB2TW9kZWxTZWxlY3Q7XG4gICAgICAgIGNhc2UgJ1RFWFRBUkVBJzpcbiAgICAgICAgICAgIHJldHVybiB2TW9kZWxUZXh0O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdk1vZGVsQ2hlY2tib3g7XG4gICAgICAgICAgICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdk1vZGVsUmFkaW87XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZNb2RlbFRleHQ7XG4gICAgICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSwgaG9vaykge1xuICAgIGNvbnN0IG1vZGVsVG9Vc2UgPSByZXNvbHZlRHluYW1pY01vZGVsKGVsLnRhZ05hbWUsIHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzLnR5cGUpO1xuICAgIGNvbnN0IGZuID0gbW9kZWxUb1VzZVtob29rXTtcbiAgICBmbiAmJiBmbihlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSk7XG59XG4vLyBTU1Igdm5vZGUgdHJhbnNmb3Jtcywgb25seSB1c2VkIHdoZW4gdXNlciBpbmNsdWRlcyBjbGllbnQtb3JpZW50ZWQgcmVuZGVyXG4vLyBmdW5jdGlvbiBpbiBTU1JcbmZ1bmN0aW9uIGluaXRWTW9kZWxGb3JTU1IoKSB7XG4gICAgdk1vZGVsVGV4dC5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0pID0+ICh7IHZhbHVlIH0pO1xuICAgIHZNb2RlbFJhZGlvLmdldFNTUlByb3BzID0gKHsgdmFsdWUgfSwgdm5vZGUpID0+IHtcbiAgICAgICAgaWYgKHZub2RlLnByb3BzICYmIGxvb3NlRXF1YWwodm5vZGUucHJvcHMudmFsdWUsIHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICB2TW9kZWxDaGVja2JveC5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0sIHZub2RlKSA9PiB7XG4gICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHZub2RlLnByb3BzICYmIGxvb3NlSW5kZXhPZih2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBjaGVja2VkOiB0cnVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAodm5vZGUucHJvcHMgJiYgdmFsdWUuaGFzKHZub2RlLnByb3BzLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGNoZWNrZWQ6IHRydWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICB2TW9kZWxEeW5hbWljLmdldFNTUlByb3BzID0gKGJpbmRpbmcsIHZub2RlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygdm5vZGUudHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtb2RlbFRvVXNlID0gcmVzb2x2ZUR5bmFtaWNNb2RlbChcbiAgICAgICAgLy8gcmVzb2x2ZUR5bmFtaWNNb2RlbCBleHBlY3RzIGFuIHVwcGVyY2FzZSB0YWcgbmFtZSwgYnV0IHZub2RlLnR5cGUgaXMgbG93ZXJjYXNlXG4gICAgICAgIHZub2RlLnR5cGUudG9VcHBlckNhc2UoKSwgdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMudHlwZSk7XG4gICAgICAgIGlmIChtb2RlbFRvVXNlLmdldFNTUlByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9kZWxUb1VzZS5nZXRTU1JQcm9wcyhiaW5kaW5nLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5jb25zdCBzeXN0ZW1Nb2RpZmllcnMgPSBbJ2N0cmwnLCAnc2hpZnQnLCAnYWx0JywgJ21ldGEnXTtcbmNvbnN0IG1vZGlmaWVyR3VhcmRzID0ge1xuICAgIHN0b3A6IGUgPT4gZS5zdG9wUHJvcGFnYXRpb24oKSxcbiAgICBwcmV2ZW50OiBlID0+IGUucHJldmVudERlZmF1bHQoKSxcbiAgICBzZWxmOiBlID0+IGUudGFyZ2V0ICE9PSBlLmN1cnJlbnRUYXJnZXQsXG4gICAgY3RybDogZSA9PiAhZS5jdHJsS2V5LFxuICAgIHNoaWZ0OiBlID0+ICFlLnNoaWZ0S2V5LFxuICAgIGFsdDogZSA9PiAhZS5hbHRLZXksXG4gICAgbWV0YTogZSA9PiAhZS5tZXRhS2V5LFxuICAgIGxlZnQ6IGUgPT4gJ2J1dHRvbicgaW4gZSAmJiBlLmJ1dHRvbiAhPT0gMCxcbiAgICBtaWRkbGU6IGUgPT4gJ2J1dHRvbicgaW4gZSAmJiBlLmJ1dHRvbiAhPT0gMSxcbiAgICByaWdodDogZSA9PiAnYnV0dG9uJyBpbiBlICYmIGUuYnV0dG9uICE9PSAyLFxuICAgIGV4YWN0OiAoZSwgbW9kaWZpZXJzKSA9PiBzeXN0ZW1Nb2RpZmllcnMuc29tZShtID0+IGVbYCR7bX1LZXlgXSAmJiAhbW9kaWZpZXJzLmluY2x1ZGVzKG0pKVxufTtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgd2l0aE1vZGlmaWVycyA9IChmbiwgbW9kaWZpZXJzKSA9PiB7XG4gICAgcmV0dXJuIChldmVudCwgLi4uYXJncykgPT4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vZGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZ3VhcmQgPSBtb2RpZmllckd1YXJkc1ttb2RpZmllcnNbaV1dO1xuICAgICAgICAgICAgaWYgKGd1YXJkICYmIGd1YXJkKGV2ZW50LCBtb2RpZmllcnMpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4oZXZlbnQsIC4uLmFyZ3MpO1xuICAgIH07XG59O1xuLy8gS2VwdCBmb3IgMi54IGNvbXBhdC5cbi8vIE5vdGU6IElFMTEgY29tcGF0IGZvciBgc3BhY2ViYXJgIGFuZCBgZGVsYCBpcyByZW1vdmVkIGZvciBub3cuXG5jb25zdCBrZXlOYW1lcyA9IHtcbiAgICBlc2M6ICdlc2NhcGUnLFxuICAgIHNwYWNlOiAnICcsXG4gICAgdXA6ICdhcnJvdy11cCcsXG4gICAgbGVmdDogJ2Fycm93LWxlZnQnLFxuICAgIHJpZ2h0OiAnYXJyb3ctcmlnaHQnLFxuICAgIGRvd246ICdhcnJvdy1kb3duJyxcbiAgICBkZWxldGU6ICdiYWNrc3BhY2UnXG59O1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCB3aXRoS2V5cyA9IChmbiwgbW9kaWZpZXJzKSA9PiB7XG4gICAgcmV0dXJuIChldmVudCkgPT4ge1xuICAgICAgICBpZiAoISgna2V5JyBpbiBldmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudEtleSA9IGh5cGhlbmF0ZShldmVudC5rZXkpO1xuICAgICAgICBpZiAobW9kaWZpZXJzLnNvbWUoayA9PiBrID09PSBldmVudEtleSB8fCBrZXlOYW1lc1trXSA9PT0gZXZlbnRLZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4oZXZlbnQpO1xuICAgICAgICB9XG4gICAgfTtcbn07XG5cbmNvbnN0IHZTaG93ID0ge1xuICAgIGJlZm9yZU1vdW50KGVsLCB7IHZhbHVlIH0sIHsgdHJhbnNpdGlvbiB9KSB7XG4gICAgICAgIGVsLl92b2QgPSBlbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnJyA6IGVsLnN0eWxlLmRpc3BsYXk7XG4gICAgICAgIGlmICh0cmFuc2l0aW9uICYmIHZhbHVlKSB7XG4gICAgICAgICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldERpc3BsYXkoZWwsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbW91bnRlZChlbCwgeyB2YWx1ZSB9LCB7IHRyYW5zaXRpb24gfSkge1xuICAgICAgICBpZiAodHJhbnNpdGlvbiAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHVwZGF0ZWQoZWwsIHsgdmFsdWUsIG9sZFZhbHVlIH0sIHsgdHJhbnNpdGlvbiB9KSB7XG4gICAgICAgIGlmICghdmFsdWUgPT09ICFvbGRWYWx1ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoZWwpO1xuICAgICAgICAgICAgICAgIHNldERpc3BsYXkoZWwsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRyYW5zaXRpb24uZW50ZXIoZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbi5sZWF2ZShlbCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5KGVsLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXREaXNwbGF5KGVsLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGJlZm9yZVVubW91bnQoZWwsIHsgdmFsdWUgfSkge1xuICAgICAgICBzZXREaXNwbGF5KGVsLCB2YWx1ZSk7XG4gICAgfVxufTtcbmZ1bmN0aW9uIHNldERpc3BsYXkoZWwsIHZhbHVlKSB7XG4gICAgZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gZWwuX3ZvZCA6ICdub25lJztcbn1cbi8vIFNTUiB2bm9kZSB0cmFuc2Zvcm1zLCBvbmx5IHVzZWQgd2hlbiB1c2VyIGluY2x1ZGVzIGNsaWVudC1vcmllbnRlZCByZW5kZXJcbi8vIGZ1bmN0aW9uIGluIFNTUlxuZnVuY3Rpb24gaW5pdFZTaG93Rm9yU1NSKCkge1xuICAgIHZTaG93LmdldFNTUlByb3BzID0gKHsgdmFsdWUgfSkgPT4ge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdHlsZTogeyBkaXNwbGF5OiAnbm9uZScgfSB9O1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuY29uc3QgcmVuZGVyZXJPcHRpb25zID0gLyojX19QVVJFX18qLyBleHRlbmQoeyBwYXRjaFByb3AgfSwgbm9kZU9wcyk7XG4vLyBsYXp5IGNyZWF0ZSB0aGUgcmVuZGVyZXIgLSB0aGlzIG1ha2VzIGNvcmUgcmVuZGVyZXIgbG9naWMgdHJlZS1zaGFrYWJsZVxuLy8gaW4gY2FzZSB0aGUgdXNlciBvbmx5IGltcG9ydHMgcmVhY3Rpdml0eSB1dGlsaXRpZXMgZnJvbSBWdWUuXG5sZXQgcmVuZGVyZXI7XG5sZXQgZW5hYmxlZEh5ZHJhdGlvbiA9IGZhbHNlO1xuZnVuY3Rpb24gZW5zdXJlUmVuZGVyZXIoKSB7XG4gICAgcmV0dXJuIChyZW5kZXJlciB8fFxuICAgICAgICAocmVuZGVyZXIgPSBjcmVhdGVSZW5kZXJlcihyZW5kZXJlck9wdGlvbnMpKSk7XG59XG5mdW5jdGlvbiBlbnN1cmVIeWRyYXRpb25SZW5kZXJlcigpIHtcbiAgICByZW5kZXJlciA9IGVuYWJsZWRIeWRyYXRpb25cbiAgICAgICAgPyByZW5kZXJlclxuICAgICAgICA6IGNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyKHJlbmRlcmVyT3B0aW9ucyk7XG4gICAgZW5hYmxlZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgcmV0dXJuIHJlbmRlcmVyO1xufVxuLy8gdXNlIGV4cGxpY2l0IHR5cGUgY2FzdHMgaGVyZSB0byBhdm9pZCBpbXBvcnQoKSBjYWxscyBpbiByb2xsZWQtdXAgZC50c1xuY29uc3QgcmVuZGVyID0gKCguLi5hcmdzKSA9PiB7XG4gICAgZW5zdXJlUmVuZGVyZXIoKS5yZW5kZXIoLi4uYXJncyk7XG59KTtcbmNvbnN0IGh5ZHJhdGUgPSAoKC4uLmFyZ3MpID0+IHtcbiAgICBlbnN1cmVIeWRyYXRpb25SZW5kZXJlcigpLmh5ZHJhdGUoLi4uYXJncyk7XG59KTtcbmNvbnN0IGNyZWF0ZUFwcCA9ICgoLi4uYXJncykgPT4ge1xuICAgIGNvbnN0IGFwcCA9IGVuc3VyZVJlbmRlcmVyKCkuY3JlYXRlQXBwKC4uLmFyZ3MpO1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgaW5qZWN0TmF0aXZlVGFnQ2hlY2soYXBwKTtcbiAgICAgICAgaW5qZWN0Q29tcGlsZXJPcHRpb25zQ2hlY2soYXBwKTtcbiAgICB9XG4gICAgY29uc3QgeyBtb3VudCB9ID0gYXBwO1xuICAgIGFwcC5tb3VudCA9IChjb250YWluZXJPclNlbGVjdG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IG5vcm1hbGl6ZUNvbnRhaW5lcihjb250YWluZXJPclNlbGVjdG9yKTtcbiAgICAgICAgaWYgKCFjb250YWluZXIpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGFwcC5fY29tcG9uZW50O1xuICAgICAgICBpZiAoIWlzRnVuY3Rpb24oY29tcG9uZW50KSAmJiAhY29tcG9uZW50LnJlbmRlciAmJiAhY29tcG9uZW50LnRlbXBsYXRlKSB7XG4gICAgICAgICAgICAvLyBfX1VOU0FGRV9fXG4gICAgICAgICAgICAvLyBSZWFzb246IHBvdGVudGlhbCBleGVjdXRpb24gb2YgSlMgZXhwcmVzc2lvbnMgaW4gaW4tRE9NIHRlbXBsYXRlLlxuICAgICAgICAgICAgLy8gVGhlIHVzZXIgbXVzdCBtYWtlIHN1cmUgdGhlIGluLURPTSB0ZW1wbGF0ZSBpcyB0cnVzdGVkLiBJZiBpdCdzXG4gICAgICAgICAgICAvLyByZW5kZXJlZCBieSB0aGUgc2VydmVyLCB0aGUgdGVtcGxhdGUgc2hvdWxkIG5vdCBjb250YWluIGFueSB1c2VyIGRhdGEuXG4gICAgICAgICAgICBjb21wb25lbnQudGVtcGxhdGUgPSBjb250YWluZXIuaW5uZXJIVE1MO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNsZWFyIGNvbnRlbnQgYmVmb3JlIG1vdW50aW5nXG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgY29uc3QgcHJveHkgPSBtb3VudChjb250YWluZXIsIGZhbHNlLCBjb250YWluZXIgaW5zdGFuY2VvZiBTVkdFbGVtZW50KTtcbiAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVBdHRyaWJ1dGUoJ3YtY2xvYWsnKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2RhdGEtdi1hcHAnLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3h5O1xuICAgIH07XG4gICAgcmV0dXJuIGFwcDtcbn0pO1xuY29uc3QgY3JlYXRlU1NSQXBwID0gKCguLi5hcmdzKSA9PiB7XG4gICAgY29uc3QgYXBwID0gZW5zdXJlSHlkcmF0aW9uUmVuZGVyZXIoKS5jcmVhdGVBcHAoLi4uYXJncyk7XG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICBpbmplY3ROYXRpdmVUYWdDaGVjayhhcHApO1xuICAgICAgICBpbmplY3RDb21waWxlck9wdGlvbnNDaGVjayhhcHApO1xuICAgIH1cbiAgICBjb25zdCB7IG1vdW50IH0gPSBhcHA7XG4gICAgYXBwLm1vdW50ID0gKGNvbnRhaW5lck9yU2VsZWN0b3IpID0+IHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gbm9ybWFsaXplQ29udGFpbmVyKGNvbnRhaW5lck9yU2VsZWN0b3IpO1xuICAgICAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbW91bnQoY29udGFpbmVyLCB0cnVlLCBjb250YWluZXIgaW5zdGFuY2VvZiBTVkdFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFwcDtcbn0pO1xuZnVuY3Rpb24gaW5qZWN0TmF0aXZlVGFnQ2hlY2soYXBwKSB7XG4gICAgLy8gSW5qZWN0IGBpc05hdGl2ZVRhZ2BcbiAgICAvLyB0aGlzIGlzIHVzZWQgZm9yIGNvbXBvbmVudCBuYW1lIHZhbGlkYXRpb24gKGRldiBvbmx5KVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcHAuY29uZmlnLCAnaXNOYXRpdmVUYWcnLCB7XG4gICAgICAgIHZhbHVlOiAodGFnKSA9PiBpc0hUTUxUYWcodGFnKSB8fCBpc1NWR1RhZyh0YWcpLFxuICAgICAgICB3cml0YWJsZTogZmFsc2VcbiAgICB9KTtcbn1cbi8vIGRldiBvbmx5XG5mdW5jdGlvbiBpbmplY3RDb21waWxlck9wdGlvbnNDaGVjayhhcHApIHtcbiAgICBpZiAoaXNSdW50aW1lT25seSgpKSB7XG4gICAgICAgIGNvbnN0IGlzQ3VzdG9tRWxlbWVudCA9IGFwcC5jb25maWcuaXNDdXN0b21FbGVtZW50O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwLmNvbmZpZywgJ2lzQ3VzdG9tRWxlbWVudCcsIHtcbiAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNDdXN0b21FbGVtZW50O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldCgpIHtcbiAgICAgICAgICAgICAgICB3YXJuKGBUaGUgXFxgaXNDdXN0b21FbGVtZW50XFxgIGNvbmZpZyBvcHRpb24gaXMgZGVwcmVjYXRlZC4gVXNlIGAgK1xuICAgICAgICAgICAgICAgICAgICBgXFxgY29tcGlsZXJPcHRpb25zLmlzQ3VzdG9tRWxlbWVudFxcYCBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY29tcGlsZXJPcHRpb25zID0gYXBwLmNvbmZpZy5jb21waWxlck9wdGlvbnM7XG4gICAgICAgIGNvbnN0IG1zZyA9IGBUaGUgXFxgY29tcGlsZXJPcHRpb25zXFxgIGNvbmZpZyBvcHRpb24gaXMgb25seSByZXNwZWN0ZWQgd2hlbiB1c2luZyBgICtcbiAgICAgICAgICAgIGBhIGJ1aWxkIG9mIFZ1ZS5qcyB0aGF0IGluY2x1ZGVzIHRoZSBydW50aW1lIGNvbXBpbGVyIChha2EgXCJmdWxsIGJ1aWxkXCIpLiBgICtcbiAgICAgICAgICAgIGBTaW5jZSB5b3UgYXJlIHVzaW5nIHRoZSBydW50aW1lLW9ubHkgYnVpbGQsIFxcYGNvbXBpbGVyT3B0aW9uc1xcYCBgICtcbiAgICAgICAgICAgIGBtdXN0IGJlIHBhc3NlZCB0byBcXGBAdnVlL2NvbXBpbGVyLWRvbVxcYCBpbiB0aGUgYnVpbGQgc2V0dXAgaW5zdGVhZC5cXG5gICtcbiAgICAgICAgICAgIGAtIEZvciB2dWUtbG9hZGVyOiBwYXNzIGl0IHZpYSB2dWUtbG9hZGVyJ3MgXFxgY29tcGlsZXJPcHRpb25zXFxgIGxvYWRlciBvcHRpb24uXFxuYCArXG4gICAgICAgICAgICBgLSBGb3IgdnVlLWNsaTogc2VlIGh0dHBzOi8vY2xpLnZ1ZWpzLm9yZy9ndWlkZS93ZWJwYWNrLmh0bWwjbW9kaWZ5aW5nLW9wdGlvbnMtb2YtYS1sb2FkZXJcXG5gICtcbiAgICAgICAgICAgIGAtIEZvciB2aXRlOiBwYXNzIGl0IHZpYSBAdml0ZWpzL3BsdWdpbi12dWUgb3B0aW9ucy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92aXRlanMvdml0ZS90cmVlL21haW4vcGFja2FnZXMvcGx1Z2luLXZ1ZSNleGFtcGxlLWZvci1wYXNzaW5nLW9wdGlvbnMtdG8tdnVlY29tcGlsZXItZG9tYDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwcC5jb25maWcsICdjb21waWxlck9wdGlvbnMnLCB7XG4gICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgd2Fybihtc2cpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb21waWxlck9wdGlvbnM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0KCkge1xuICAgICAgICAgICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gbm9ybWFsaXplQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICAgIGlmIChpc1N0cmluZyhjb250YWluZXIpKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGFpbmVyKTtcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhcmVzKSB7XG4gICAgICAgICAgICB3YXJuKGBGYWlsZWQgdG8gbW91bnQgYXBwOiBtb3VudCB0YXJnZXQgc2VsZWN0b3IgXCIke2NvbnRhaW5lcn1cIiByZXR1cm5lZCBudWxsLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiZcbiAgICAgICAgd2luZG93LlNoYWRvd1Jvb3QgJiZcbiAgICAgICAgY29udGFpbmVyIGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QgJiZcbiAgICAgICAgY29udGFpbmVyLm1vZGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIHdhcm4oYG1vdW50aW5nIG9uIGEgU2hhZG93Um9vdCB3aXRoIFxcYHttb2RlOiBcImNsb3NlZFwifVxcYCBtYXkgbGVhZCB0byB1bnByZWRpY3RhYmxlIGJ1Z3NgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbn1cbmxldCBzc3JEaXJlY3RpdmVJbml0aWFsaXplZCA9IGZhbHNlO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgaW5pdERpcmVjdGl2ZXNGb3JTU1IgPSAoKSA9PiB7XG4gICAgICAgIGlmICghc3NyRGlyZWN0aXZlSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHNzckRpcmVjdGl2ZUluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGluaXRWTW9kZWxGb3JTU1IoKTtcbiAgICAgICAgICAgIGluaXRWU2hvd0ZvclNTUigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIDtcblxuZXhwb3J0IHsgVHJhbnNpdGlvbiwgVHJhbnNpdGlvbkdyb3VwLCBWdWVFbGVtZW50LCBjcmVhdGVBcHAsIGNyZWF0ZVNTUkFwcCwgZGVmaW5lQ3VzdG9tRWxlbWVudCwgZGVmaW5lU1NSQ3VzdG9tRWxlbWVudCwgaHlkcmF0ZSwgaW5pdERpcmVjdGl2ZXNGb3JTU1IsIHJlbmRlciwgdXNlQ3NzTW9kdWxlLCB1c2VDc3NWYXJzLCB2TW9kZWxDaGVja2JveCwgdk1vZGVsRHluYW1pYywgdk1vZGVsUmFkaW8sIHZNb2RlbFNlbGVjdCwgdk1vZGVsVGV4dCwgdlNob3csIHdpdGhLZXlzLCB3aXRoTW9kaWZpZXJzIH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js\n");

/***/ }),

/***/ "./node_modules/@vue/shared/dist/shared.esm-bundler.js":
/*!*************************************************************!*\
  !*** ./node_modules/@vue/shared/dist/shared.esm-bundler.js ***!
  \*************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"EMPTY_ARR\": () => (/* binding */ EMPTY_ARR),\n/* harmony export */   \"EMPTY_OBJ\": () => (/* binding */ EMPTY_OBJ),\n/* harmony export */   \"NO\": () => (/* binding */ NO),\n/* harmony export */   \"NOOP\": () => (/* binding */ NOOP),\n/* harmony export */   \"PatchFlagNames\": () => (/* binding */ PatchFlagNames),\n/* harmony export */   \"camelize\": () => (/* binding */ camelize),\n/* harmony export */   \"capitalize\": () => (/* binding */ capitalize),\n/* harmony export */   \"def\": () => (/* binding */ def),\n/* harmony export */   \"escapeHtml\": () => (/* binding */ escapeHtml),\n/* harmony export */   \"escapeHtmlComment\": () => (/* binding */ escapeHtmlComment),\n/* harmony export */   \"extend\": () => (/* binding */ extend),\n/* harmony export */   \"genPropsAccessExp\": () => (/* binding */ genPropsAccessExp),\n/* harmony export */   \"generateCodeFrame\": () => (/* binding */ generateCodeFrame),\n/* harmony export */   \"getGlobalThis\": () => (/* binding */ getGlobalThis),\n/* harmony export */   \"hasChanged\": () => (/* binding */ hasChanged),\n/* harmony export */   \"hasOwn\": () => (/* binding */ hasOwn),\n/* harmony export */   \"hyphenate\": () => (/* binding */ hyphenate),\n/* harmony export */   \"includeBooleanAttr\": () => (/* binding */ includeBooleanAttr),\n/* harmony export */   \"invokeArrayFns\": () => (/* binding */ invokeArrayFns),\n/* harmony export */   \"isArray\": () => (/* binding */ isArray),\n/* harmony export */   \"isBooleanAttr\": () => (/* binding */ isBooleanAttr),\n/* harmony export */   \"isBuiltInDirective\": () => (/* binding */ isBuiltInDirective),\n/* harmony export */   \"isDate\": () => (/* binding */ isDate),\n/* harmony export */   \"isFunction\": () => (/* binding */ isFunction),\n/* harmony export */   \"isGloballyWhitelisted\": () => (/* binding */ isGloballyWhitelisted),\n/* harmony export */   \"isHTMLTag\": () => (/* binding */ isHTMLTag),\n/* harmony export */   \"isIntegerKey\": () => (/* binding */ isIntegerKey),\n/* harmony export */   \"isKnownHtmlAttr\": () => (/* binding */ isKnownHtmlAttr),\n/* harmony export */   \"isKnownSvgAttr\": () => (/* binding */ isKnownSvgAttr),\n/* harmony export */   \"isMap\": () => (/* binding */ isMap),\n/* harmony export */   \"isModelListener\": () => (/* binding */ isModelListener),\n/* harmony export */   \"isObject\": () => (/* binding */ isObject),\n/* harmony export */   \"isOn\": () => (/* binding */ isOn),\n/* harmony export */   \"isPlainObject\": () => (/* binding */ isPlainObject),\n/* harmony export */   \"isPromise\": () => (/* binding */ isPromise),\n/* harmony export */   \"isRegExp\": () => (/* binding */ isRegExp),\n/* harmony export */   \"isReservedProp\": () => (/* binding */ isReservedProp),\n/* harmony export */   \"isSSRSafeAttrName\": () => (/* binding */ isSSRSafeAttrName),\n/* harmony export */   \"isSVGTag\": () => (/* binding */ isSVGTag),\n/* harmony export */   \"isSet\": () => (/* binding */ isSet),\n/* harmony export */   \"isSpecialBooleanAttr\": () => (/* binding */ isSpecialBooleanAttr),\n/* harmony export */   \"isString\": () => (/* binding */ isString),\n/* harmony export */   \"isSymbol\": () => (/* binding */ isSymbol),\n/* harmony export */   \"isVoidTag\": () => (/* binding */ isVoidTag),\n/* harmony export */   \"looseEqual\": () => (/* binding */ looseEqual),\n/* harmony export */   \"looseIndexOf\": () => (/* binding */ looseIndexOf),\n/* harmony export */   \"looseToNumber\": () => (/* binding */ looseToNumber),\n/* harmony export */   \"makeMap\": () => (/* binding */ makeMap),\n/* harmony export */   \"normalizeClass\": () => (/* binding */ normalizeClass),\n/* harmony export */   \"normalizeProps\": () => (/* binding */ normalizeProps),\n/* harmony export */   \"normalizeStyle\": () => (/* binding */ normalizeStyle),\n/* harmony export */   \"objectToString\": () => (/* binding */ objectToString),\n/* harmony export */   \"parseStringStyle\": () => (/* binding */ parseStringStyle),\n/* harmony export */   \"propsToAttrMap\": () => (/* binding */ propsToAttrMap),\n/* harmony export */   \"remove\": () => (/* binding */ remove),\n/* harmony export */   \"slotFlagsText\": () => (/* binding */ slotFlagsText),\n/* harmony export */   \"stringifyStyle\": () => (/* binding */ stringifyStyle),\n/* harmony export */   \"toDisplayString\": () => (/* binding */ toDisplayString),\n/* harmony export */   \"toHandlerKey\": () => (/* binding */ toHandlerKey),\n/* harmony export */   \"toNumber\": () => (/* binding */ toNumber),\n/* harmony export */   \"toRawType\": () => (/* binding */ toRawType),\n/* harmony export */   \"toTypeString\": () => (/* binding */ toTypeString)\n/* harmony export */ });\n/**\n * Make a map and return a function for checking if a key\n * is in that map.\n * IMPORTANT: all calls of this function must be prefixed with\n * \\/\\*#\\_\\_PURE\\_\\_\\*\\/\n * So that rollup can tree-shake them if necessary.\n */\nfunction makeMap(str, expectsLowerCase) {\n    const map = Object.create(null);\n    const list = str.split(',');\n    for (let i = 0; i < list.length; i++) {\n        map[list[i]] = true;\n    }\n    return expectsLowerCase ? val => !!map[val.toLowerCase()] : val => !!map[val];\n}\n\n/**\n * dev only flag -> name mapping\n */\nconst PatchFlagNames = {\n    [1 /* PatchFlags.TEXT */]: `TEXT`,\n    [2 /* PatchFlags.CLASS */]: `CLASS`,\n    [4 /* PatchFlags.STYLE */]: `STYLE`,\n    [8 /* PatchFlags.PROPS */]: `PROPS`,\n    [16 /* PatchFlags.FULL_PROPS */]: `FULL_PROPS`,\n    [32 /* PatchFlags.HYDRATE_EVENTS */]: `HYDRATE_EVENTS`,\n    [64 /* PatchFlags.STABLE_FRAGMENT */]: `STABLE_FRAGMENT`,\n    [128 /* PatchFlags.KEYED_FRAGMENT */]: `KEYED_FRAGMENT`,\n    [256 /* PatchFlags.UNKEYED_FRAGMENT */]: `UNKEYED_FRAGMENT`,\n    [512 /* PatchFlags.NEED_PATCH */]: `NEED_PATCH`,\n    [1024 /* PatchFlags.DYNAMIC_SLOTS */]: `DYNAMIC_SLOTS`,\n    [2048 /* PatchFlags.DEV_ROOT_FRAGMENT */]: `DEV_ROOT_FRAGMENT`,\n    [-1 /* PatchFlags.HOISTED */]: `HOISTED`,\n    [-2 /* PatchFlags.BAIL */]: `BAIL`\n};\n\n/**\n * Dev only\n */\nconst slotFlagsText = {\n    [1 /* SlotFlags.STABLE */]: 'STABLE',\n    [2 /* SlotFlags.DYNAMIC */]: 'DYNAMIC',\n    [3 /* SlotFlags.FORWARDED */]: 'FORWARDED'\n};\n\nconst GLOBALS_WHITE_LISTED = 'Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,' +\n    'decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,' +\n    'Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt';\nconst isGloballyWhitelisted = /*#__PURE__*/ makeMap(GLOBALS_WHITE_LISTED);\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n    // Split the content into individual lines but capture the newline sequence\n    // that separated each line. This is important because the actual sequence is\n    // needed to properly take into account the full line length for offset\n    // comparison\n    let lines = source.split(/(\\r?\\n)/);\n    // Separate the lines and newline sequences into separate arrays for easier referencing\n    const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n    lines = lines.filter((_, idx) => idx % 2 === 0);\n    let count = 0;\n    const res = [];\n    for (let i = 0; i < lines.length; i++) {\n        count +=\n            lines[i].length +\n                ((newlineSequences[i] && newlineSequences[i].length) || 0);\n        if (count >= start) {\n            for (let j = i - range; j <= i + range || end > count; j++) {\n                if (j < 0 || j >= lines.length)\n                    continue;\n                const line = j + 1;\n                res.push(`${line}${' '.repeat(Math.max(3 - String(line).length, 0))}|  ${lines[j]}`);\n                const lineLength = lines[j].length;\n                const newLineSeqLength = (newlineSequences[j] && newlineSequences[j].length) || 0;\n                if (j === i) {\n                    // push underline\n                    const pad = start - (count - (lineLength + newLineSeqLength));\n                    const length = Math.max(1, end > count ? lineLength - pad : end - start);\n                    res.push(`   |  ` + ' '.repeat(pad) + '^'.repeat(length));\n                }\n                else if (j > i) {\n                    if (end > count) {\n                        const length = Math.max(Math.min(end - count, lineLength), 1);\n                        res.push(`   |  ` + '^'.repeat(length));\n                    }\n                    count += lineLength + newLineSeqLength;\n                }\n            }\n            break;\n        }\n    }\n    return res.join('\\n');\n}\n\nfunction normalizeStyle(value) {\n    if (isArray(value)) {\n        const res = {};\n        for (let i = 0; i < value.length; i++) {\n            const item = value[i];\n            const normalized = isString(item)\n                ? parseStringStyle(item)\n                : normalizeStyle(item);\n            if (normalized) {\n                for (const key in normalized) {\n                    res[key] = normalized[key];\n                }\n            }\n        }\n        return res;\n    }\n    else if (isString(value)) {\n        return value;\n    }\n    else if (isObject(value)) {\n        return value;\n    }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*.*?\\*\\//gs;\nfunction parseStringStyle(cssText) {\n    const ret = {};\n    cssText\n        .replace(styleCommentRE, '')\n        .split(listDelimiterRE)\n        .forEach(item => {\n        if (item) {\n            const tmp = item.split(propertyDelimiterRE);\n            tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n        }\n    });\n    return ret;\n}\nfunction stringifyStyle(styles) {\n    let ret = '';\n    if (!styles || isString(styles)) {\n        return ret;\n    }\n    for (const key in styles) {\n        const value = styles[key];\n        const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n        if (isString(value) || typeof value === 'number') {\n            // only render valid values\n            ret += `${normalizedKey}:${value};`;\n        }\n    }\n    return ret;\n}\nfunction normalizeClass(value) {\n    let res = '';\n    if (isString(value)) {\n        res = value;\n    }\n    else if (isArray(value)) {\n        for (let i = 0; i < value.length; i++) {\n            const normalized = normalizeClass(value[i]);\n            if (normalized) {\n                res += normalized + ' ';\n            }\n        }\n    }\n    else if (isObject(value)) {\n        for (const name in value) {\n            if (value[name]) {\n                res += name + ' ';\n            }\n        }\n    }\n    return res.trim();\n}\nfunction normalizeProps(props) {\n    if (!props)\n        return null;\n    let { class: klass, style } = props;\n    if (klass && !isString(klass)) {\n        props.class = normalizeClass(klass);\n    }\n    if (style) {\n        props.style = normalizeStyle(style);\n    }\n    return props;\n}\n\n// These tag configs are shared between compiler-dom and runtime-dom, so they\n// https://developer.mozilla.org/en-US/docs/Web/HTML/Element\nconst HTML_TAGS = 'html,body,base,head,link,meta,style,title,address,article,aside,footer,' +\n    'header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,' +\n    'figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,' +\n    'data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,' +\n    'time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,' +\n    'canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,' +\n    'th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,' +\n    'option,output,progress,select,textarea,details,dialog,menu,' +\n    'summary,template,blockquote,iframe,tfoot';\n// https://developer.mozilla.org/en-US/docs/Web/SVG/Element\nconst SVG_TAGS = 'svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,' +\n    'defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,' +\n    'feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,' +\n    'feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,' +\n    'feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,' +\n    'fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,' +\n    'foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,' +\n    'mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,' +\n    'polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,' +\n    'text,textPath,title,tspan,unknown,use,view';\nconst VOID_TAGS = 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr';\n/**\n * Compiler only.\n * Do NOT use in runtime code paths unless behind `(process.env.NODE_ENV !== 'production')` flag.\n */\nconst isHTMLTag = /*#__PURE__*/ makeMap(HTML_TAGS);\n/**\n * Compiler only.\n * Do NOT use in runtime code paths unless behind `(process.env.NODE_ENV !== 'production')` flag.\n */\nconst isSVGTag = /*#__PURE__*/ makeMap(SVG_TAGS);\n/**\n * Compiler only.\n * Do NOT use in runtime code paths unless behind `(process.env.NODE_ENV !== 'production')` flag.\n */\nconst isVoidTag = /*#__PURE__*/ makeMap(VOID_TAGS);\n\n/**\n * On the client we only need to offer special cases for boolean attributes that\n * have different names from their corresponding dom properties:\n * - itemscope -> N/A\n * - allowfullscreen -> allowFullscreen\n * - formnovalidate -> formNoValidate\n * - ismap -> isMap\n * - nomodule -> noModule\n * - novalidate -> noValidate\n * - readonly -> readOnly\n */\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /*#__PURE__*/ makeMap(specialBooleanAttrs);\n/**\n * The full list is needed during SSR to produce the correct initial markup.\n */\nconst isBooleanAttr = /*#__PURE__*/ makeMap(specialBooleanAttrs +\n    `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,` +\n    `loop,open,required,reversed,scoped,seamless,` +\n    `checked,muted,multiple,selected`);\n/**\n * Boolean attributes should be included if the value is truthy or ''.\n * e.g. `<select multiple>` compiles to `{ multiple: '' }`\n */\nfunction includeBooleanAttr(value) {\n    return !!value || value === '';\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n    if (attrValidationCache.hasOwnProperty(name)) {\n        return attrValidationCache[name];\n    }\n    const isUnsafe = unsafeAttrCharRE.test(name);\n    if (isUnsafe) {\n        console.error(`unsafe attribute name: ${name}`);\n    }\n    return (attrValidationCache[name] = !isUnsafe);\n}\nconst propsToAttrMap = {\n    acceptCharset: 'accept-charset',\n    className: 'class',\n    htmlFor: 'for',\n    httpEquiv: 'http-equiv'\n};\n/**\n * Known attributes, this is used for stringification of runtime static nodes\n * so that we don't stringify bindings that cannot be set from HTML.\n * Don't also forget to allow `data-*` and `aria-*`!\n * Generated from https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes\n */\nconst isKnownHtmlAttr = /*#__PURE__*/ makeMap(`accept,accept-charset,accesskey,action,align,allow,alt,async,` +\n    `autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,` +\n    `border,buffered,capture,challenge,charset,checked,cite,class,code,` +\n    `codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,` +\n    `coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,` +\n    `disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,` +\n    `formaction,formenctype,formmethod,formnovalidate,formtarget,headers,` +\n    `height,hidden,high,href,hreflang,http-equiv,icon,id,importance,integrity,` +\n    `ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,` +\n    `manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,` +\n    `open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,` +\n    `referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,` +\n    `selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,` +\n    `start,step,style,summary,tabindex,target,title,translate,type,usemap,` +\n    `value,width,wrap`);\n/**\n * Generated from https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute\n */\nconst isKnownSvgAttr = /*#__PURE__*/ makeMap(`xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,` +\n    `arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,` +\n    `baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,` +\n    `clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,` +\n    `color-interpolation-filters,color-profile,color-rendering,` +\n    `contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,` +\n    `descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,` +\n    `dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,` +\n    `fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,` +\n    `font-family,font-size,font-size-adjust,font-stretch,font-style,` +\n    `font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,` +\n    `glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,` +\n    `gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,` +\n    `horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,` +\n    `k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,` +\n    `lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,` +\n    `marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,` +\n    `mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,` +\n    `name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,` +\n    `overflow,overline-position,overline-thickness,panose-1,paint-order,path,` +\n    `pathLength,patternContentUnits,patternTransform,patternUnits,ping,` +\n    `pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,` +\n    `preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,` +\n    `rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,` +\n    `restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,` +\n    `specularConstant,specularExponent,speed,spreadMethod,startOffset,` +\n    `stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,` +\n    `strikethrough-position,strikethrough-thickness,string,stroke,` +\n    `stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,` +\n    `stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,` +\n    `systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,` +\n    `text-decoration,text-rendering,textLength,to,transform,transform-origin,` +\n    `type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,` +\n    `unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,` +\n    `v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,` +\n    `vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,` +\n    `writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,` +\n    `xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,` +\n    `xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`);\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n    const str = '' + string;\n    const match = escapeRE.exec(str);\n    if (!match) {\n        return str;\n    }\n    let html = '';\n    let escaped;\n    let index;\n    let lastIndex = 0;\n    for (index = match.index; index < str.length; index++) {\n        switch (str.charCodeAt(index)) {\n            case 34: // \"\n                escaped = '&quot;';\n                break;\n            case 38: // &\n                escaped = '&amp;';\n                break;\n            case 39: // '\n                escaped = '&#39;';\n                break;\n            case 60: // <\n                escaped = '&lt;';\n                break;\n            case 62: // >\n                escaped = '&gt;';\n                break;\n            default:\n                continue;\n        }\n        if (lastIndex !== index) {\n            html += str.slice(lastIndex, index);\n        }\n        lastIndex = index + 1;\n        html += escaped;\n    }\n    return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\n// https://www.w3.org/TR/html52/syntax.html#comments\nconst commentStripRE = /^-?>|<!--|-->|--!>|<!-$/g;\nfunction escapeHtmlComment(src) {\n    return src.replace(commentStripRE, '');\n}\n\nfunction looseCompareArrays(a, b) {\n    if (a.length !== b.length)\n        return false;\n    let equal = true;\n    for (let i = 0; equal && i < a.length; i++) {\n        equal = looseEqual(a[i], b[i]);\n    }\n    return equal;\n}\nfunction looseEqual(a, b) {\n    if (a === b)\n        return true;\n    let aValidType = isDate(a);\n    let bValidType = isDate(b);\n    if (aValidType || bValidType) {\n        return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n    }\n    aValidType = isSymbol(a);\n    bValidType = isSymbol(b);\n    if (aValidType || bValidType) {\n        return a === b;\n    }\n    aValidType = isArray(a);\n    bValidType = isArray(b);\n    if (aValidType || bValidType) {\n        return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n    }\n    aValidType = isObject(a);\n    bValidType = isObject(b);\n    if (aValidType || bValidType) {\n        /* istanbul ignore if: this if will probably never be called */\n        if (!aValidType || !bValidType) {\n            return false;\n        }\n        const aKeysCount = Object.keys(a).length;\n        const bKeysCount = Object.keys(b).length;\n        if (aKeysCount !== bKeysCount) {\n            return false;\n        }\n        for (const key in a) {\n            const aHasKey = a.hasOwnProperty(key);\n            const bHasKey = b.hasOwnProperty(key);\n            if ((aHasKey && !bHasKey) ||\n                (!aHasKey && bHasKey) ||\n                !looseEqual(a[key], b[key])) {\n                return false;\n            }\n        }\n    }\n    return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n    return arr.findIndex(item => looseEqual(item, val));\n}\n\n/**\n * For converting {{ interpolation }} values to displayed strings.\n * @private\n */\nconst toDisplayString = (val) => {\n    return isString(val)\n        ? val\n        : val == null\n            ? ''\n            : isArray(val) ||\n                (isObject(val) &&\n                    (val.toString === objectToString || !isFunction(val.toString)))\n                ? JSON.stringify(val, replacer, 2)\n                : String(val);\n};\nconst replacer = (_key, val) => {\n    // can't use isRef here since @vue/shared has no deps\n    if (val && val.__v_isRef) {\n        return replacer(_key, val.value);\n    }\n    else if (isMap(val)) {\n        return {\n            [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val]) => {\n                entries[`${key} =>`] = val;\n                return entries;\n            }, {})\n        };\n    }\n    else if (isSet(val)) {\n        return {\n            [`Set(${val.size})`]: [...val.values()]\n        };\n    }\n    else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n        return String(val);\n    }\n    return val;\n};\n\nconst EMPTY_OBJ = ( true)\n    ? Object.freeze({})\n    : 0;\nconst EMPTY_ARR = ( true) ? Object.freeze([]) : 0;\nconst NOOP = () => { };\n/**\n * Always return false.\n */\nconst NO = () => false;\nconst onRE = /^on[^a-z]/;\nconst isOn = (key) => onRE.test(key);\nconst isModelListener = (key) => key.startsWith('onUpdate:');\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n    const i = arr.indexOf(el);\n    if (i > -1) {\n        arr.splice(i, 1);\n    }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === '[object Map]';\nconst isSet = (val) => toTypeString(val) === '[object Set]';\nconst isDate = (val) => toTypeString(val) === '[object Date]';\nconst isRegExp = (val) => toTypeString(val) === '[object RegExp]';\nconst isFunction = (val) => typeof val === 'function';\nconst isString = (val) => typeof val === 'string';\nconst isSymbol = (val) => typeof val === 'symbol';\nconst isObject = (val) => val !== null && typeof val === 'object';\nconst isPromise = (val) => {\n    return isObject(val) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n    // extract \"RawType\" from strings like \"[object RawType]\"\n    return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === '[object Object]';\nconst isIntegerKey = (key) => isString(key) &&\n    key !== 'NaN' &&\n    key[0] !== '-' &&\n    '' + parseInt(key, 10) === key;\nconst isReservedProp = /*#__PURE__*/ makeMap(\n// the leading comma is intentional so empty string \"\" is also included\n',key,ref,ref_for,ref_key,' +\n    'onVnodeBeforeMount,onVnodeMounted,' +\n    'onVnodeBeforeUpdate,onVnodeUpdated,' +\n    'onVnodeBeforeUnmount,onVnodeUnmounted');\nconst isBuiltInDirective = /*#__PURE__*/ makeMap('bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo');\nconst cacheStringFunction = (fn) => {\n    const cache = Object.create(null);\n    return ((str) => {\n        const hit = cache[str];\n        return hit || (cache[str] = fn(str));\n    });\n};\nconst camelizeRE = /-(\\w)/g;\n/**\n * @private\n */\nconst camelize = cacheStringFunction((str) => {\n    return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''));\n});\nconst hyphenateRE = /\\B([A-Z])/g;\n/**\n * @private\n */\nconst hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, '-$1').toLowerCase());\n/**\n * @private\n */\nconst capitalize = cacheStringFunction((str) => str.charAt(0).toUpperCase() + str.slice(1));\n/**\n * @private\n */\nconst toHandlerKey = cacheStringFunction((str) => str ? `on${capitalize(str)}` : ``);\n// compare whether a value has changed, accounting for NaN.\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, arg) => {\n    for (let i = 0; i < fns.length; i++) {\n        fns[i](arg);\n    }\n};\nconst def = (obj, key, value) => {\n    Object.defineProperty(obj, key, {\n        configurable: true,\n        enumerable: false,\n        value\n    });\n};\n/**\n * \"123-foo\" will be parsed to 123\n * This is used for the .number modifier in v-model\n */\nconst looseToNumber = (val) => {\n    const n = parseFloat(val);\n    return isNaN(n) ? val : n;\n};\n/**\n * Only conerces number-like strings\n * \"123-foo\" will be returned as-is\n */\nconst toNumber = (val) => {\n    const n = isString(val) ? Number(val) : NaN;\n    return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n    return (_globalThis ||\n        (_globalThis =\n            typeof globalThis !== 'undefined'\n                ? globalThis\n                : typeof self !== 'undefined'\n                    ? self\n                    : typeof window !== 'undefined'\n                        ? window\n                        : typeof __webpack_require__.g !== 'undefined'\n                            ? __webpack_require__.g\n                            : {}));\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n    return identRE.test(name)\n        ? `__props.${name}`\n        : `__props[${JSON.stringify(name)}]`;\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHZ1ZS9zaGFyZWQvZGlzdC9zaGFyZWQuZXNtLWJ1bmRsZXIuanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLCtCQUErQjtBQUNuRTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsS0FBSyxFQUFFLGlEQUFpRCxLQUFLLFNBQVM7QUFDbEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjLEdBQUcsT0FBTztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxzQkFBc0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLGNBQWM7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELEtBQUs7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsb0JBQW9CO0FBQ2xEO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixTQUFTO0FBQzdCLDJCQUEyQixLQUFLO0FBQ2hDO0FBQ0EsYUFBYSxJQUFJO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLEtBQXFDO0FBQ3hELHNCQUFzQjtBQUN0QixNQUFNLENBQUU7QUFDUixtQkFBbUIsS0FBcUMsd0JBQXdCLENBQUU7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELGdCQUFnQjtBQUM3RTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHFCQUFNO0FBQ3ZDLDhCQUE4QixxQkFBTTtBQUNwQyxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsS0FBSztBQUMxQixxQkFBcUIscUJBQXFCO0FBQzFDOztBQUV1ekIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHZ1ZS9zaGFyZWQvZGlzdC9zaGFyZWQuZXNtLWJ1bmRsZXIuanM/NjlhNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1ha2UgYSBtYXAgYW5kIHJldHVybiBhIGZ1bmN0aW9uIGZvciBjaGVja2luZyBpZiBhIGtleVxuICogaXMgaW4gdGhhdCBtYXAuXG4gKiBJTVBPUlRBTlQ6IGFsbCBjYWxscyBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgcHJlZml4ZWQgd2l0aFxuICogXFwvXFwqI1xcX1xcX1BVUkVcXF9cXF9cXCpcXC9cbiAqIFNvIHRoYXQgcm9sbHVwIGNhbiB0cmVlLXNoYWtlIHRoZW0gaWYgbmVjZXNzYXJ5LlxuICovXG5mdW5jdGlvbiBtYWtlTWFwKHN0ciwgZXhwZWN0c0xvd2VyQ2FzZSkge1xuICAgIGNvbnN0IG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgY29uc3QgbGlzdCA9IHN0ci5zcGxpdCgnLCcpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBtYXBbbGlzdFtpXV0gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZXhwZWN0c0xvd2VyQ2FzZSA/IHZhbCA9PiAhIW1hcFt2YWwudG9Mb3dlckNhc2UoKV0gOiB2YWwgPT4gISFtYXBbdmFsXTtcbn1cblxuLyoqXG4gKiBkZXYgb25seSBmbGFnIC0+IG5hbWUgbWFwcGluZ1xuICovXG5jb25zdCBQYXRjaEZsYWdOYW1lcyA9IHtcbiAgICBbMSAvKiBQYXRjaEZsYWdzLlRFWFQgKi9dOiBgVEVYVGAsXG4gICAgWzIgLyogUGF0Y2hGbGFncy5DTEFTUyAqL106IGBDTEFTU2AsXG4gICAgWzQgLyogUGF0Y2hGbGFncy5TVFlMRSAqL106IGBTVFlMRWAsXG4gICAgWzggLyogUGF0Y2hGbGFncy5QUk9QUyAqL106IGBQUk9QU2AsXG4gICAgWzE2IC8qIFBhdGNoRmxhZ3MuRlVMTF9QUk9QUyAqL106IGBGVUxMX1BST1BTYCxcbiAgICBbMzIgLyogUGF0Y2hGbGFncy5IWURSQVRFX0VWRU5UUyAqL106IGBIWURSQVRFX0VWRU5UU2AsXG4gICAgWzY0IC8qIFBhdGNoRmxhZ3MuU1RBQkxFX0ZSQUdNRU5UICovXTogYFNUQUJMRV9GUkFHTUVOVGAsXG4gICAgWzEyOCAvKiBQYXRjaEZsYWdzLktFWUVEX0ZSQUdNRU5UICovXTogYEtFWUVEX0ZSQUdNRU5UYCxcbiAgICBbMjU2IC8qIFBhdGNoRmxhZ3MuVU5LRVlFRF9GUkFHTUVOVCAqL106IGBVTktFWUVEX0ZSQUdNRU5UYCxcbiAgICBbNTEyIC8qIFBhdGNoRmxhZ3MuTkVFRF9QQVRDSCAqL106IGBORUVEX1BBVENIYCxcbiAgICBbMTAyNCAvKiBQYXRjaEZsYWdzLkRZTkFNSUNfU0xPVFMgKi9dOiBgRFlOQU1JQ19TTE9UU2AsXG4gICAgWzIwNDggLyogUGF0Y2hGbGFncy5ERVZfUk9PVF9GUkFHTUVOVCAqL106IGBERVZfUk9PVF9GUkFHTUVOVGAsXG4gICAgWy0xIC8qIFBhdGNoRmxhZ3MuSE9JU1RFRCAqL106IGBIT0lTVEVEYCxcbiAgICBbLTIgLyogUGF0Y2hGbGFncy5CQUlMICovXTogYEJBSUxgXG59O1xuXG4vKipcbiAqIERldiBvbmx5XG4gKi9cbmNvbnN0IHNsb3RGbGFnc1RleHQgPSB7XG4gICAgWzEgLyogU2xvdEZsYWdzLlNUQUJMRSAqL106ICdTVEFCTEUnLFxuICAgIFsyIC8qIFNsb3RGbGFncy5EWU5BTUlDICovXTogJ0RZTkFNSUMnLFxuICAgIFszIC8qIFNsb3RGbGFncy5GT1JXQVJERUQgKi9dOiAnRk9SV0FSREVEJ1xufTtcblxuY29uc3QgR0xPQkFMU19XSElURV9MSVNURUQgPSAnSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTixwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSwnICtcbiAgICAnZGVjb2RlVVJJQ29tcG9uZW50LGVuY29kZVVSSSxlbmNvZGVVUklDb21wb25lbnQsTWF0aCxOdW1iZXIsRGF0ZSxBcnJheSwnICtcbiAgICAnT2JqZWN0LEJvb2xlYW4sU3RyaW5nLFJlZ0V4cCxNYXAsU2V0LEpTT04sSW50bCxCaWdJbnQnO1xuY29uc3QgaXNHbG9iYWxseVdoaXRlbGlzdGVkID0gLyojX19QVVJFX18qLyBtYWtlTWFwKEdMT0JBTFNfV0hJVEVfTElTVEVEKTtcblxuY29uc3QgcmFuZ2UgPSAyO1xuZnVuY3Rpb24gZ2VuZXJhdGVDb2RlRnJhbWUoc291cmNlLCBzdGFydCA9IDAsIGVuZCA9IHNvdXJjZS5sZW5ndGgpIHtcbiAgICAvLyBTcGxpdCB0aGUgY29udGVudCBpbnRvIGluZGl2aWR1YWwgbGluZXMgYnV0IGNhcHR1cmUgdGhlIG5ld2xpbmUgc2VxdWVuY2VcbiAgICAvLyB0aGF0IHNlcGFyYXRlZCBlYWNoIGxpbmUuIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgdGhlIGFjdHVhbCBzZXF1ZW5jZSBpc1xuICAgIC8vIG5lZWRlZCB0byBwcm9wZXJseSB0YWtlIGludG8gYWNjb3VudCB0aGUgZnVsbCBsaW5lIGxlbmd0aCBmb3Igb2Zmc2V0XG4gICAgLy8gY29tcGFyaXNvblxuICAgIGxldCBsaW5lcyA9IHNvdXJjZS5zcGxpdCgvKFxccj9cXG4pLyk7XG4gICAgLy8gU2VwYXJhdGUgdGhlIGxpbmVzIGFuZCBuZXdsaW5lIHNlcXVlbmNlcyBpbnRvIHNlcGFyYXRlIGFycmF5cyBmb3IgZWFzaWVyIHJlZmVyZW5jaW5nXG4gICAgY29uc3QgbmV3bGluZVNlcXVlbmNlcyA9IGxpbmVzLmZpbHRlcigoXywgaWR4KSA9PiBpZHggJSAyID09PSAxKTtcbiAgICBsaW5lcyA9IGxpbmVzLmZpbHRlcigoXywgaWR4KSA9PiBpZHggJSAyID09PSAwKTtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGNvbnN0IHJlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY291bnQgKz1cbiAgICAgICAgICAgIGxpbmVzW2ldLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgKChuZXdsaW5lU2VxdWVuY2VzW2ldICYmIG5ld2xpbmVTZXF1ZW5jZXNbaV0ubGVuZ3RoKSB8fCAwKTtcbiAgICAgICAgaWYgKGNvdW50ID49IHN0YXJ0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gaSAtIHJhbmdlOyBqIDw9IGkgKyByYW5nZSB8fCBlbmQgPiBjb3VudDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGogPCAwIHx8IGogPj0gbGluZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lID0gaiArIDE7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goYCR7bGluZX0keycgJy5yZXBlYXQoTWF0aC5tYXgoMyAtIFN0cmluZyhsaW5lKS5sZW5ndGgsIDApKX18ICAke2xpbmVzW2pdfWApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVMZW5ndGggPSBsaW5lc1tqXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3TGluZVNlcUxlbmd0aCA9IChuZXdsaW5lU2VxdWVuY2VzW2pdICYmIG5ld2xpbmVTZXF1ZW5jZXNbal0ubGVuZ3RoKSB8fCAwO1xuICAgICAgICAgICAgICAgIGlmIChqID09PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHB1c2ggdW5kZXJsaW5lXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZCA9IHN0YXJ0IC0gKGNvdW50IC0gKGxpbmVMZW5ndGggKyBuZXdMaW5lU2VxTGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWF4KDEsIGVuZCA+IGNvdW50ID8gbGluZUxlbmd0aCAtIHBhZCA6IGVuZCAtIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goYCAgIHwgIGAgKyAnICcucmVwZWF0KHBhZCkgKyAnXicucmVwZWF0KGxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChqID4gaSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW5kID4gY291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWF4KE1hdGgubWluKGVuZCAtIGNvdW50LCBsaW5lTGVuZ3RoKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMucHVzaChgICAgfCAgYCArICdeJy5yZXBlYXQobGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gbGluZUxlbmd0aCArIG5ld0xpbmVTZXFMZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcy5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3R5bGUodmFsdWUpIHtcbiAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgcmVzID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZVtpXTtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBpc1N0cmluZyhpdGVtKVxuICAgICAgICAgICAgICAgID8gcGFyc2VTdHJpbmdTdHlsZShpdGVtKVxuICAgICAgICAgICAgICAgIDogbm9ybWFsaXplU3R5bGUoaXRlbSk7XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG5vcm1hbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW2tleV0gPSBub3JtYWxpemVkW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuY29uc3QgbGlzdERlbGltaXRlclJFID0gLzsoPyFbXihdKlxcKSkvZztcbmNvbnN0IHByb3BlcnR5RGVsaW1pdGVyUkUgPSAvOihbXl0rKS87XG5jb25zdCBzdHlsZUNvbW1lbnRSRSA9IC9cXC9cXCouKj9cXCpcXC8vZ3M7XG5mdW5jdGlvbiBwYXJzZVN0cmluZ1N0eWxlKGNzc1RleHQpIHtcbiAgICBjb25zdCByZXQgPSB7fTtcbiAgICBjc3NUZXh0XG4gICAgICAgIC5yZXBsYWNlKHN0eWxlQ29tbWVudFJFLCAnJylcbiAgICAgICAgLnNwbGl0KGxpc3REZWxpbWl0ZXJSRSlcbiAgICAgICAgLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICBjb25zdCB0bXAgPSBpdGVtLnNwbGl0KHByb3BlcnR5RGVsaW1pdGVyUkUpO1xuICAgICAgICAgICAgdG1wLmxlbmd0aCA+IDEgJiYgKHJldFt0bXBbMF0udHJpbSgpXSA9IHRtcFsxXS50cmltKCkpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJldDtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeVN0eWxlKHN0eWxlcykge1xuICAgIGxldCByZXQgPSAnJztcbiAgICBpZiAoIXN0eWxlcyB8fCBpc1N0cmluZyhzdHlsZXMpKSB7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIHN0eWxlcykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHN0eWxlc1trZXldO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0ga2V5LnN0YXJ0c1dpdGgoYC0tYCkgPyBrZXkgOiBoeXBoZW5hdGUoa2V5KTtcbiAgICAgICAgaWYgKGlzU3RyaW5nKHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAvLyBvbmx5IHJlbmRlciB2YWxpZCB2YWx1ZXNcbiAgICAgICAgICAgIHJldCArPSBgJHtub3JtYWxpemVkS2V5fToke3ZhbHVlfTtgO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBub3JtYWxpemVDbGFzcyh2YWx1ZSkge1xuICAgIGxldCByZXMgPSAnJztcbiAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgIHJlcyA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplQ2xhc3ModmFsdWVbaV0pO1xuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICByZXMgKz0gbm9ybWFsaXplZCArICcgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXMgKz0gbmFtZSArICcgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzLnRyaW0oKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzKHByb3BzKSB7XG4gICAgaWYgKCFwcm9wcylcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHsgY2xhc3M6IGtsYXNzLCBzdHlsZSB9ID0gcHJvcHM7XG4gICAgaWYgKGtsYXNzICYmICFpc1N0cmluZyhrbGFzcykpIHtcbiAgICAgICAgcHJvcHMuY2xhc3MgPSBub3JtYWxpemVDbGFzcyhrbGFzcyk7XG4gICAgfVxuICAgIGlmIChzdHlsZSkge1xuICAgICAgICBwcm9wcy5zdHlsZSA9IG5vcm1hbGl6ZVN0eWxlKHN0eWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3BzO1xufVxuXG4vLyBUaGVzZSB0YWcgY29uZmlncyBhcmUgc2hhcmVkIGJldHdlZW4gY29tcGlsZXItZG9tIGFuZCBydW50aW1lLWRvbSwgc28gdGhleVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50XG5jb25zdCBIVE1MX1RBR1MgPSAnaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlciwnICtcbiAgICAnaGVhZGVyLGhncm91cCxoMSxoMixoMyxoNCxoNSxoNixuYXYsc2VjdGlvbixkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbiwnICtcbiAgICAnZmlndXJlLHBpY3R1cmUsaHIsaW1nLGxpLG1haW4sb2wscCxwcmUsdWwsYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsJyArXG4gICAgJ2RhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydWJ5LHMsc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLCcgK1xuICAgICd0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbyxlbWJlZCxvYmplY3QscGFyYW0sc291cmNlLCcgK1xuICAgICdjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsJyArXG4gICAgJ3RoLHRyLGJ1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCwnICtcbiAgICAnb3B0aW9uLG91dHB1dCxwcm9ncmVzcyxzZWxlY3QsdGV4dGFyZWEsZGV0YWlscyxkaWFsb2csbWVudSwnICtcbiAgICAnc3VtbWFyeSx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdCc7XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9TVkcvRWxlbWVudFxuY29uc3QgU1ZHX1RBR1MgPSAnc3ZnLGFuaW1hdGUsYW5pbWF0ZU1vdGlvbixhbmltYXRlVHJhbnNmb3JtLGNpcmNsZSxjbGlwUGF0aCxjb2xvci1wcm9maWxlLCcgK1xuICAgICdkZWZzLGRlc2MsZGlzY2FyZCxlbGxpcHNlLGZlQmxlbmQsZmVDb2xvck1hdHJpeCxmZUNvbXBvbmVudFRyYW5zZmVyLCcgK1xuICAgICdmZUNvbXBvc2l0ZSxmZUNvbnZvbHZlTWF0cml4LGZlRGlmZnVzZUxpZ2h0aW5nLGZlRGlzcGxhY2VtZW50TWFwLCcgK1xuICAgICdmZURpc3RhbnRMaWdodCxmZURyb3BTaGFkb3csZmVGbG9vZCxmZUZ1bmNBLGZlRnVuY0IsZmVGdW5jRyxmZUZ1bmNSLCcgK1xuICAgICdmZUdhdXNzaWFuQmx1cixmZUltYWdlLGZlTWVyZ2UsZmVNZXJnZU5vZGUsZmVNb3JwaG9sb2d5LGZlT2Zmc2V0LCcgK1xuICAgICdmZVBvaW50TGlnaHQsZmVTcGVjdWxhckxpZ2h0aW5nLGZlU3BvdExpZ2h0LGZlVGlsZSxmZVR1cmJ1bGVuY2UsZmlsdGVyLCcgK1xuICAgICdmb3JlaWduT2JqZWN0LGcsaGF0Y2gsaGF0Y2hwYXRoLGltYWdlLGxpbmUsbGluZWFyR3JhZGllbnQsbWFya2VyLG1hc2ssJyArXG4gICAgJ21lc2gsbWVzaGdyYWRpZW50LG1lc2hwYXRjaCxtZXNocm93LG1ldGFkYXRhLG1wYXRoLHBhdGgscGF0dGVybiwnICtcbiAgICAncG9seWdvbixwb2x5bGluZSxyYWRpYWxHcmFkaWVudCxyZWN0LHNldCxzb2xpZGNvbG9yLHN0b3Asc3dpdGNoLHN5bWJvbCwnICtcbiAgICAndGV4dCx0ZXh0UGF0aCx0aXRsZSx0c3Bhbix1bmtub3duLHVzZSx2aWV3JztcbmNvbnN0IFZPSURfVEFHUyA9ICdhcmVhLGJhc2UsYnIsY29sLGVtYmVkLGhyLGltZyxpbnB1dCxsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdicic7XG4vKipcbiAqIENvbXBpbGVyIG9ubHkuXG4gKiBEbyBOT1QgdXNlIGluIHJ1bnRpbWUgY29kZSBwYXRocyB1bmxlc3MgYmVoaW5kIGAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJylgIGZsYWcuXG4gKi9cbmNvbnN0IGlzSFRNTFRhZyA9IC8qI19fUFVSRV9fKi8gbWFrZU1hcChIVE1MX1RBR1MpO1xuLyoqXG4gKiBDb21waWxlciBvbmx5LlxuICogRG8gTk9UIHVzZSBpbiBydW50aW1lIGNvZGUgcGF0aHMgdW5sZXNzIGJlaGluZCBgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpYCBmbGFnLlxuICovXG5jb25zdCBpc1NWR1RhZyA9IC8qI19fUFVSRV9fKi8gbWFrZU1hcChTVkdfVEFHUyk7XG4vKipcbiAqIENvbXBpbGVyIG9ubHkuXG4gKiBEbyBOT1QgdXNlIGluIHJ1bnRpbWUgY29kZSBwYXRocyB1bmxlc3MgYmVoaW5kIGAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJylgIGZsYWcuXG4gKi9cbmNvbnN0IGlzVm9pZFRhZyA9IC8qI19fUFVSRV9fKi8gbWFrZU1hcChWT0lEX1RBR1MpO1xuXG4vKipcbiAqIE9uIHRoZSBjbGllbnQgd2Ugb25seSBuZWVkIHRvIG9mZmVyIHNwZWNpYWwgY2FzZXMgZm9yIGJvb2xlYW4gYXR0cmlidXRlcyB0aGF0XG4gKiBoYXZlIGRpZmZlcmVudCBuYW1lcyBmcm9tIHRoZWlyIGNvcnJlc3BvbmRpbmcgZG9tIHByb3BlcnRpZXM6XG4gKiAtIGl0ZW1zY29wZSAtPiBOL0FcbiAqIC0gYWxsb3dmdWxsc2NyZWVuIC0+IGFsbG93RnVsbHNjcmVlblxuICogLSBmb3Jtbm92YWxpZGF0ZSAtPiBmb3JtTm9WYWxpZGF0ZVxuICogLSBpc21hcCAtPiBpc01hcFxuICogLSBub21vZHVsZSAtPiBub01vZHVsZVxuICogLSBub3ZhbGlkYXRlIC0+IG5vVmFsaWRhdGVcbiAqIC0gcmVhZG9ubHkgLT4gcmVhZE9ubHlcbiAqL1xuY29uc3Qgc3BlY2lhbEJvb2xlYW5BdHRycyA9IGBpdGVtc2NvcGUsYWxsb3dmdWxsc2NyZWVuLGZvcm1ub3ZhbGlkYXRlLGlzbWFwLG5vbW9kdWxlLG5vdmFsaWRhdGUscmVhZG9ubHlgO1xuY29uc3QgaXNTcGVjaWFsQm9vbGVhbkF0dHIgPSAvKiNfX1BVUkVfXyovIG1ha2VNYXAoc3BlY2lhbEJvb2xlYW5BdHRycyk7XG4vKipcbiAqIFRoZSBmdWxsIGxpc3QgaXMgbmVlZGVkIGR1cmluZyBTU1IgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBpbml0aWFsIG1hcmt1cC5cbiAqL1xuY29uc3QgaXNCb29sZWFuQXR0ciA9IC8qI19fUFVSRV9fKi8gbWFrZU1hcChzcGVjaWFsQm9vbGVhbkF0dHJzICtcbiAgICBgLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjb250cm9scyxkZWZhdWx0LGRlZmVyLGRpc2FibGVkLGhpZGRlbixgICtcbiAgICBgbG9vcCxvcGVuLHJlcXVpcmVkLHJldmVyc2VkLHNjb3BlZCxzZWFtbGVzcyxgICtcbiAgICBgY2hlY2tlZCxtdXRlZCxtdWx0aXBsZSxzZWxlY3RlZGApO1xuLyoqXG4gKiBCb29sZWFuIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGlmIHRoZSB2YWx1ZSBpcyB0cnV0aHkgb3IgJycuXG4gKiBlLmcuIGA8c2VsZWN0IG11bHRpcGxlPmAgY29tcGlsZXMgdG8gYHsgbXVsdGlwbGU6ICcnIH1gXG4gKi9cbmZ1bmN0aW9uIGluY2x1ZGVCb29sZWFuQXR0cih2YWx1ZSkge1xuICAgIHJldHVybiAhIXZhbHVlIHx8IHZhbHVlID09PSAnJztcbn1cbmNvbnN0IHVuc2FmZUF0dHJDaGFyUkUgPSAvWz4vPVwiJ1xcdTAwMDlcXHUwMDBhXFx1MDAwY1xcdTAwMjBdLztcbmNvbnN0IGF0dHJWYWxpZGF0aW9uQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGlzU1NSU2FmZUF0dHJOYW1lKG5hbWUpIHtcbiAgICBpZiAoYXR0clZhbGlkYXRpb25DYWNoZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICByZXR1cm4gYXR0clZhbGlkYXRpb25DYWNoZVtuYW1lXTtcbiAgICB9XG4gICAgY29uc3QgaXNVbnNhZmUgPSB1bnNhZmVBdHRyQ2hhclJFLnRlc3QobmFtZSk7XG4gICAgaWYgKGlzVW5zYWZlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYHVuc2FmZSBhdHRyaWJ1dGUgbmFtZTogJHtuYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm4gKGF0dHJWYWxpZGF0aW9uQ2FjaGVbbmFtZV0gPSAhaXNVbnNhZmUpO1xufVxuY29uc3QgcHJvcHNUb0F0dHJNYXAgPSB7XG4gICAgYWNjZXB0Q2hhcnNldDogJ2FjY2VwdC1jaGFyc2V0JyxcbiAgICBjbGFzc05hbWU6ICdjbGFzcycsXG4gICAgaHRtbEZvcjogJ2ZvcicsXG4gICAgaHR0cEVxdWl2OiAnaHR0cC1lcXVpdidcbn07XG4vKipcbiAqIEtub3duIGF0dHJpYnV0ZXMsIHRoaXMgaXMgdXNlZCBmb3Igc3RyaW5naWZpY2F0aW9uIG9mIHJ1bnRpbWUgc3RhdGljIG5vZGVzXG4gKiBzbyB0aGF0IHdlIGRvbid0IHN0cmluZ2lmeSBiaW5kaW5ncyB0aGF0IGNhbm5vdCBiZSBzZXQgZnJvbSBIVE1MLlxuICogRG9uJ3QgYWxzbyBmb3JnZXQgdG8gYWxsb3cgYGRhdGEtKmAgYW5kIGBhcmlhLSpgIVxuICogR2VuZXJhdGVkIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9BdHRyaWJ1dGVzXG4gKi9cbmNvbnN0IGlzS25vd25IdG1sQXR0ciA9IC8qI19fUFVSRV9fKi8gbWFrZU1hcChgYWNjZXB0LGFjY2VwdC1jaGFyc2V0LGFjY2Vzc2tleSxhY3Rpb24sYWxpZ24sYWxsb3csYWx0LGFzeW5jLGAgK1xuICAgIGBhdXRvY2FwaXRhbGl6ZSxhdXRvY29tcGxldGUsYXV0b2ZvY3VzLGF1dG9wbGF5LGJhY2tncm91bmQsYmdjb2xvcixgICtcbiAgICBgYm9yZGVyLGJ1ZmZlcmVkLGNhcHR1cmUsY2hhbGxlbmdlLGNoYXJzZXQsY2hlY2tlZCxjaXRlLGNsYXNzLGNvZGUsYCArXG4gICAgYGNvZGViYXNlLGNvbG9yLGNvbHMsY29sc3Bhbixjb250ZW50LGNvbnRlbnRlZGl0YWJsZSxjb250ZXh0bWVudSxjb250cm9scyxgICtcbiAgICBgY29vcmRzLGNyb3Nzb3JpZ2luLGNzcCxkYXRhLGRhdGV0aW1lLGRlY29kaW5nLGRlZmF1bHQsZGVmZXIsZGlyLGRpcm5hbWUsYCArXG4gICAgYGRpc2FibGVkLGRvd25sb2FkLGRyYWdnYWJsZSxkcm9wem9uZSxlbmN0eXBlLGVudGVya2V5aGludCxmb3IsZm9ybSxgICtcbiAgICBgZm9ybWFjdGlvbixmb3JtZW5jdHlwZSxmb3JtbWV0aG9kLGZvcm1ub3ZhbGlkYXRlLGZvcm10YXJnZXQsaGVhZGVycyxgICtcbiAgICBgaGVpZ2h0LGhpZGRlbixoaWdoLGhyZWYsaHJlZmxhbmcsaHR0cC1lcXVpdixpY29uLGlkLGltcG9ydGFuY2UsaW50ZWdyaXR5LGAgK1xuICAgIGBpc21hcCxpdGVtcHJvcCxrZXl0eXBlLGtpbmQsbGFiZWwsbGFuZyxsYW5ndWFnZSxsb2FkaW5nLGxpc3QsbG9vcCxsb3csYCArXG4gICAgYG1hbmlmZXN0LG1heCxtYXhsZW5ndGgsbWlubGVuZ3RoLG1lZGlhLG1pbixtdWx0aXBsZSxtdXRlZCxuYW1lLG5vdmFsaWRhdGUsYCArXG4gICAgYG9wZW4sb3B0aW11bSxwYXR0ZXJuLHBpbmcscGxhY2Vob2xkZXIscG9zdGVyLHByZWxvYWQscmFkaW9ncm91cCxyZWFkb25seSxgICtcbiAgICBgcmVmZXJyZXJwb2xpY3kscmVsLHJlcXVpcmVkLHJldmVyc2VkLHJvd3Mscm93c3BhbixzYW5kYm94LHNjb3BlLHNjb3BlZCxgICtcbiAgICBgc2VsZWN0ZWQsc2hhcGUsc2l6ZSxzaXplcyxzbG90LHNwYW4sc3BlbGxjaGVjayxzcmMsc3JjZG9jLHNyY2xhbmcsc3Jjc2V0LGAgK1xuICAgIGBzdGFydCxzdGVwLHN0eWxlLHN1bW1hcnksdGFiaW5kZXgsdGFyZ2V0LHRpdGxlLHRyYW5zbGF0ZSx0eXBlLHVzZW1hcCxgICtcbiAgICBgdmFsdWUsd2lkdGgsd3JhcGApO1xuLyoqXG4gKiBHZW5lcmF0ZWQgZnJvbSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9TVkcvQXR0cmlidXRlXG4gKi9cbmNvbnN0IGlzS25vd25TdmdBdHRyID0gLyojX19QVVJFX18qLyBtYWtlTWFwKGB4bWxucyxhY2NlbnQtaGVpZ2h0LGFjY3VtdWxhdGUsYWRkaXRpdmUsYWxpZ25tZW50LWJhc2VsaW5lLGFscGhhYmV0aWMsYW1wbGl0dWRlLGAgK1xuICAgIGBhcmFiaWMtZm9ybSxhc2NlbnQsYXR0cmlidXRlTmFtZSxhdHRyaWJ1dGVUeXBlLGF6aW11dGgsYmFzZUZyZXF1ZW5jeSxgICtcbiAgICBgYmFzZWxpbmUtc2hpZnQsYmFzZVByb2ZpbGUsYmJveCxiZWdpbixiaWFzLGJ5LGNhbGNNb2RlLGNhcC1oZWlnaHQsY2xhc3MsYCArXG4gICAgYGNsaXAsY2xpcFBhdGhVbml0cyxjbGlwLXBhdGgsY2xpcC1ydWxlLGNvbG9yLGNvbG9yLWludGVycG9sYXRpb24sYCArXG4gICAgYGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyxjb2xvci1wcm9maWxlLGNvbG9yLXJlbmRlcmluZyxgICtcbiAgICBgY29udGVudFNjcmlwdFR5cGUsY29udGVudFN0eWxlVHlwZSxjcm9zc29yaWdpbixjdXJzb3IsY3gsY3ksZCxkZWNlbGVyYXRlLGAgK1xuICAgIGBkZXNjZW50LGRpZmZ1c2VDb25zdGFudCxkaXJlY3Rpb24sZGlzcGxheSxkaXZpc29yLGRvbWluYW50LWJhc2VsaW5lLGR1cixkeCxgICtcbiAgICBgZHksZWRnZU1vZGUsZWxldmF0aW9uLGVuYWJsZS1iYWNrZ3JvdW5kLGVuZCxleHBvbmVudCxmaWxsLGZpbGwtb3BhY2l0eSxgICtcbiAgICBgZmlsbC1ydWxlLGZpbHRlcixmaWx0ZXJSZXMsZmlsdGVyVW5pdHMsZmxvb2QtY29sb3IsZmxvb2Qtb3BhY2l0eSxgICtcbiAgICBgZm9udC1mYW1pbHksZm9udC1zaXplLGZvbnQtc2l6ZS1hZGp1c3QsZm9udC1zdHJldGNoLGZvbnQtc3R5bGUsYCArXG4gICAgYGZvbnQtdmFyaWFudCxmb250LXdlaWdodCxmb3JtYXQsZnJvbSxmcixmeCxmeSxnMSxnMixnbHlwaC1uYW1lLGAgK1xuICAgIGBnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsLGdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsLGdseXBoUmVmLGAgK1xuICAgIGBncmFkaWVudFRyYW5zZm9ybSxncmFkaWVudFVuaXRzLGhhbmdpbmcsaGVpZ2h0LGhyZWYsaHJlZmxhbmcsaG9yaXotYWR2LXgsYCArXG4gICAgYGhvcml6LW9yaWdpbi14LGlkLGlkZW9ncmFwaGljLGltYWdlLXJlbmRlcmluZyxpbixpbjIsaW50ZXJjZXB0LGssazEsazIsazMsYCArXG4gICAgYGs0LGtlcm5lbE1hdHJpeCxrZXJuZWxVbml0TGVuZ3RoLGtlcm5pbmcsa2V5UG9pbnRzLGtleVNwbGluZXMsa2V5VGltZXMsYCArXG4gICAgYGxhbmcsbGVuZ3RoQWRqdXN0LGxldHRlci1zcGFjaW5nLGxpZ2h0aW5nLWNvbG9yLGxpbWl0aW5nQ29uZUFuZ2xlLGxvY2FsLGAgK1xuICAgIGBtYXJrZXItZW5kLG1hcmtlci1taWQsbWFya2VyLXN0YXJ0LG1hcmtlckhlaWdodCxtYXJrZXJVbml0cyxtYXJrZXJXaWR0aCxgICtcbiAgICBgbWFzayxtYXNrQ29udGVudFVuaXRzLG1hc2tVbml0cyxtYXRoZW1hdGljYWwsbWF4LG1lZGlhLG1ldGhvZCxtaW4sbW9kZSxgICtcbiAgICBgbmFtZSxudW1PY3RhdmVzLG9mZnNldCxvcGFjaXR5LG9wZXJhdG9yLG9yZGVyLG9yaWVudCxvcmllbnRhdGlvbixvcmlnaW4sYCArXG4gICAgYG92ZXJmbG93LG92ZXJsaW5lLXBvc2l0aW9uLG92ZXJsaW5lLXRoaWNrbmVzcyxwYW5vc2UtMSxwYWludC1vcmRlcixwYXRoLGAgK1xuICAgIGBwYXRoTGVuZ3RoLHBhdHRlcm5Db250ZW50VW5pdHMscGF0dGVyblRyYW5zZm9ybSxwYXR0ZXJuVW5pdHMscGluZyxgICtcbiAgICBgcG9pbnRlci1ldmVudHMscG9pbnRzLHBvaW50c0F0WCxwb2ludHNBdFkscG9pbnRzQXRaLHByZXNlcnZlQWxwaGEsYCArXG4gICAgYHByZXNlcnZlQXNwZWN0UmF0aW8scHJpbWl0aXZlVW5pdHMscixyYWRpdXMscmVmZXJyZXJQb2xpY3kscmVmWCxyZWZZLHJlbCxgICtcbiAgICBgcmVuZGVyaW5nLWludGVudCxyZXBlYXRDb3VudCxyZXBlYXREdXIscmVxdWlyZWRFeHRlbnNpb25zLHJlcXVpcmVkRmVhdHVyZXMsYCArXG4gICAgYHJlc3RhcnQscmVzdWx0LHJvdGF0ZSxyeCxyeSxzY2FsZSxzZWVkLHNoYXBlLXJlbmRlcmluZyxzbG9wZSxzcGFjaW5nLGAgK1xuICAgIGBzcGVjdWxhckNvbnN0YW50LHNwZWN1bGFyRXhwb25lbnQsc3BlZWQsc3ByZWFkTWV0aG9kLHN0YXJ0T2Zmc2V0LGAgK1xuICAgIGBzdGREZXZpYXRpb24sc3RlbWgsc3RlbXYsc3RpdGNoVGlsZXMsc3RvcC1jb2xvcixzdG9wLW9wYWNpdHksYCArXG4gICAgYHN0cmlrZXRocm91Z2gtcG9zaXRpb24sc3RyaWtldGhyb3VnaC10aGlja25lc3Msc3RyaW5nLHN0cm9rZSxgICtcbiAgICBgc3Ryb2tlLWRhc2hhcnJheSxzdHJva2UtZGFzaG9mZnNldCxzdHJva2UtbGluZWNhcCxzdHJva2UtbGluZWpvaW4sYCArXG4gICAgYHN0cm9rZS1taXRlcmxpbWl0LHN0cm9rZS1vcGFjaXR5LHN0cm9rZS13aWR0aCxzdHlsZSxzdXJmYWNlU2NhbGUsYCArXG4gICAgYHN5c3RlbUxhbmd1YWdlLHRhYmluZGV4LHRhYmxlVmFsdWVzLHRhcmdldCx0YXJnZXRYLHRhcmdldFksdGV4dC1hbmNob3IsYCArXG4gICAgYHRleHQtZGVjb3JhdGlvbix0ZXh0LXJlbmRlcmluZyx0ZXh0TGVuZ3RoLHRvLHRyYW5zZm9ybSx0cmFuc2Zvcm0tb3JpZ2luLGAgK1xuICAgIGB0eXBlLHUxLHUyLHVuZGVybGluZS1wb3NpdGlvbix1bmRlcmxpbmUtdGhpY2tuZXNzLHVuaWNvZGUsdW5pY29kZS1iaWRpLGAgK1xuICAgIGB1bmljb2RlLXJhbmdlLHVuaXRzLXBlci1lbSx2LWFscGhhYmV0aWMsdi1oYW5naW5nLHYtaWRlb2dyYXBoaWMsYCArXG4gICAgYHYtbWF0aGVtYXRpY2FsLHZhbHVlcyx2ZWN0b3ItZWZmZWN0LHZlcnNpb24sdmVydC1hZHYteSx2ZXJ0LW9yaWdpbi14LGAgK1xuICAgIGB2ZXJ0LW9yaWdpbi15LHZpZXdCb3gsdmlld1RhcmdldCx2aXNpYmlsaXR5LHdpZHRoLHdpZHRocyx3b3JkLXNwYWNpbmcsYCArXG4gICAgYHdyaXRpbmctbW9kZSx4LHgtaGVpZ2h0LHgxLHgyLHhDaGFubmVsU2VsZWN0b3IseGxpbms6YWN0dWF0ZSx4bGluazphcmNyb2xlLGAgK1xuICAgIGB4bGluazpocmVmLHhsaW5rOnJvbGUseGxpbms6c2hvdyx4bGluazp0aXRsZSx4bGluazp0eXBlLHhtbDpiYXNlLHhtbDpsYW5nLGAgK1xuICAgIGB4bWw6c3BhY2UseSx5MSx5Mix5Q2hhbm5lbFNlbGVjdG9yLHosem9vbUFuZFBhbmApO1xuXG5jb25zdCBlc2NhcGVSRSA9IC9bXCInJjw+XS87XG5mdW5jdGlvbiBlc2NhcGVIdG1sKHN0cmluZykge1xuICAgIGNvbnN0IHN0ciA9ICcnICsgc3RyaW5nO1xuICAgIGNvbnN0IG1hdGNoID0gZXNjYXBlUkUuZXhlYyhzdHIpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbGV0IGh0bWwgPSAnJztcbiAgICBsZXQgZXNjYXBlZDtcbiAgICBsZXQgaW5kZXg7XG4gICAgbGV0IGxhc3RJbmRleCA9IDA7XG4gICAgZm9yIChpbmRleCA9IG1hdGNoLmluZGV4OyBpbmRleCA8IHN0ci5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgc3dpdGNoIChzdHIuY2hhckNvZGVBdChpbmRleCkpIHtcbiAgICAgICAgICAgIGNhc2UgMzQ6IC8vIFwiXG4gICAgICAgICAgICAgICAgZXNjYXBlZCA9ICcmcXVvdDsnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzODogLy8gJlxuICAgICAgICAgICAgICAgIGVzY2FwZWQgPSAnJmFtcDsnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOTogLy8gJ1xuICAgICAgICAgICAgICAgIGVzY2FwZWQgPSAnJiMzOTsnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA2MDogLy8gPFxuICAgICAgICAgICAgICAgIGVzY2FwZWQgPSAnJmx0Oyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDYyOiAvLyA+XG4gICAgICAgICAgICAgICAgZXNjYXBlZCA9ICcmZ3Q7JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3RJbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgICAgICAgIGh0bWwgKz0gc3RyLnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgICAgaHRtbCArPSBlc2NhcGVkO1xuICAgIH1cbiAgICByZXR1cm4gbGFzdEluZGV4ICE9PSBpbmRleCA/IGh0bWwgKyBzdHIuc2xpY2UobGFzdEluZGV4LCBpbmRleCkgOiBodG1sO1xufVxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1Mi9zeW50YXguaHRtbCNjb21tZW50c1xuY29uc3QgY29tbWVudFN0cmlwUkUgPSAvXi0/Pnw8IS0tfC0tPnwtLSE+fDwhLSQvZztcbmZ1bmN0aW9uIGVzY2FwZUh0bWxDb21tZW50KHNyYykge1xuICAgIHJldHVybiBzcmMucmVwbGFjZShjb21tZW50U3RyaXBSRSwgJycpO1xufVxuXG5mdW5jdGlvbiBsb29zZUNvbXBhcmVBcnJheXMoYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgZXF1YWwgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSAwOyBlcXVhbCAmJiBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICBlcXVhbCA9IGxvb3NlRXF1YWwoYVtpXSwgYltpXSk7XG4gICAgfVxuICAgIHJldHVybiBlcXVhbDtcbn1cbmZ1bmN0aW9uIGxvb3NlRXF1YWwoYSwgYikge1xuICAgIGlmIChhID09PSBiKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgYVZhbGlkVHlwZSA9IGlzRGF0ZShhKTtcbiAgICBsZXQgYlZhbGlkVHlwZSA9IGlzRGF0ZShiKTtcbiAgICBpZiAoYVZhbGlkVHlwZSB8fCBiVmFsaWRUeXBlKSB7XG4gICAgICAgIHJldHVybiBhVmFsaWRUeXBlICYmIGJWYWxpZFR5cGUgPyBhLmdldFRpbWUoKSA9PT0gYi5nZXRUaW1lKCkgOiBmYWxzZTtcbiAgICB9XG4gICAgYVZhbGlkVHlwZSA9IGlzU3ltYm9sKGEpO1xuICAgIGJWYWxpZFR5cGUgPSBpc1N5bWJvbChiKTtcbiAgICBpZiAoYVZhbGlkVHlwZSB8fCBiVmFsaWRUeXBlKSB7XG4gICAgICAgIHJldHVybiBhID09PSBiO1xuICAgIH1cbiAgICBhVmFsaWRUeXBlID0gaXNBcnJheShhKTtcbiAgICBiVmFsaWRUeXBlID0gaXNBcnJheShiKTtcbiAgICBpZiAoYVZhbGlkVHlwZSB8fCBiVmFsaWRUeXBlKSB7XG4gICAgICAgIHJldHVybiBhVmFsaWRUeXBlICYmIGJWYWxpZFR5cGUgPyBsb29zZUNvbXBhcmVBcnJheXMoYSwgYikgOiBmYWxzZTtcbiAgICB9XG4gICAgYVZhbGlkVHlwZSA9IGlzT2JqZWN0KGEpO1xuICAgIGJWYWxpZFR5cGUgPSBpc09iamVjdChiKTtcbiAgICBpZiAoYVZhbGlkVHlwZSB8fCBiVmFsaWRUeXBlKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZjogdGhpcyBpZiB3aWxsIHByb2JhYmx5IG5ldmVyIGJlIGNhbGxlZCAqL1xuICAgICAgICBpZiAoIWFWYWxpZFR5cGUgfHwgIWJWYWxpZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhS2V5c0NvdW50ID0gT2JqZWN0LmtleXMoYSkubGVuZ3RoO1xuICAgICAgICBjb25zdCBiS2V5c0NvdW50ID0gT2JqZWN0LmtleXMoYikubGVuZ3RoO1xuICAgICAgICBpZiAoYUtleXNDb3VudCAhPT0gYktleXNDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGFIYXNLZXkgPSBhLmhhc093blByb3BlcnR5KGtleSk7XG4gICAgICAgICAgICBjb25zdCBiSGFzS2V5ID0gYi5oYXNPd25Qcm9wZXJ0eShrZXkpO1xuICAgICAgICAgICAgaWYgKChhSGFzS2V5ICYmICFiSGFzS2V5KSB8fFxuICAgICAgICAgICAgICAgICghYUhhc0tleSAmJiBiSGFzS2V5KSB8fFxuICAgICAgICAgICAgICAgICFsb29zZUVxdWFsKGFba2V5XSwgYltrZXldKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKGEpID09PSBTdHJpbmcoYik7XG59XG5mdW5jdGlvbiBsb29zZUluZGV4T2YoYXJyLCB2YWwpIHtcbiAgICByZXR1cm4gYXJyLmZpbmRJbmRleChpdGVtID0+IGxvb3NlRXF1YWwoaXRlbSwgdmFsKSk7XG59XG5cbi8qKlxuICogRm9yIGNvbnZlcnRpbmcge3sgaW50ZXJwb2xhdGlvbiB9fSB2YWx1ZXMgdG8gZGlzcGxheWVkIHN0cmluZ3MuXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCB0b0Rpc3BsYXlTdHJpbmcgPSAodmFsKSA9PiB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKHZhbClcbiAgICAgICAgPyB2YWxcbiAgICAgICAgOiB2YWwgPT0gbnVsbFxuICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgOiBpc0FycmF5KHZhbCkgfHxcbiAgICAgICAgICAgICAgICAoaXNPYmplY3QodmFsKSAmJlxuICAgICAgICAgICAgICAgICAgICAodmFsLnRvU3RyaW5nID09PSBvYmplY3RUb1N0cmluZyB8fCAhaXNGdW5jdGlvbih2YWwudG9TdHJpbmcpKSlcbiAgICAgICAgICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbCwgcmVwbGFjZXIsIDIpXG4gICAgICAgICAgICAgICAgOiBTdHJpbmcodmFsKTtcbn07XG5jb25zdCByZXBsYWNlciA9IChfa2V5LCB2YWwpID0+IHtcbiAgICAvLyBjYW4ndCB1c2UgaXNSZWYgaGVyZSBzaW5jZSBAdnVlL3NoYXJlZCBoYXMgbm8gZGVwc1xuICAgIGlmICh2YWwgJiYgdmFsLl9fdl9pc1JlZikge1xuICAgICAgICByZXR1cm4gcmVwbGFjZXIoX2tleSwgdmFsLnZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNNYXAodmFsKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgW2BNYXAoJHt2YWwuc2l6ZX0pYF06IFsuLi52YWwuZW50cmllcygpXS5yZWR1Y2UoKGVudHJpZXMsIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBlbnRyaWVzW2Ake2tleX0gPT5gXSA9IHZhbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cmllcztcbiAgICAgICAgICAgIH0sIHt9KVxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1NldCh2YWwpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBbYFNldCgke3ZhbC5zaXplfSlgXTogWy4uLnZhbC52YWx1ZXMoKV1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3QodmFsKSAmJiAhaXNBcnJheSh2YWwpICYmICFpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xufTtcblxuY29uc3QgRU1QVFlfT0JKID0gKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpXG4gICAgPyBPYmplY3QuZnJlZXplKHt9KVxuICAgIDoge307XG5jb25zdCBFTVBUWV9BUlIgPSAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyBPYmplY3QuZnJlZXplKFtdKSA6IFtdO1xuY29uc3QgTk9PUCA9ICgpID0+IHsgfTtcbi8qKlxuICogQWx3YXlzIHJldHVybiBmYWxzZS5cbiAqL1xuY29uc3QgTk8gPSAoKSA9PiBmYWxzZTtcbmNvbnN0IG9uUkUgPSAvXm9uW15hLXpdLztcbmNvbnN0IGlzT24gPSAoa2V5KSA9PiBvblJFLnRlc3Qoa2V5KTtcbmNvbnN0IGlzTW9kZWxMaXN0ZW5lciA9IChrZXkpID0+IGtleS5zdGFydHNXaXRoKCdvblVwZGF0ZTonKTtcbmNvbnN0IGV4dGVuZCA9IE9iamVjdC5hc3NpZ247XG5jb25zdCByZW1vdmUgPSAoYXJyLCBlbCkgPT4ge1xuICAgIGNvbnN0IGkgPSBhcnIuaW5kZXhPZihlbCk7XG4gICAgaWYgKGkgPiAtMSkge1xuICAgICAgICBhcnIuc3BsaWNlKGksIDEpO1xuICAgIH1cbn07XG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5jb25zdCBoYXNPd24gPSAodmFsLCBrZXkpID0+IGhhc093blByb3BlcnR5LmNhbGwodmFsLCBrZXkpO1xuY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5jb25zdCBpc01hcCA9ICh2YWwpID0+IHRvVHlwZVN0cmluZyh2YWwpID09PSAnW29iamVjdCBNYXBdJztcbmNvbnN0IGlzU2V0ID0gKHZhbCkgPT4gdG9UeXBlU3RyaW5nKHZhbCkgPT09ICdbb2JqZWN0IFNldF0nO1xuY29uc3QgaXNEYXRlID0gKHZhbCkgPT4gdG9UeXBlU3RyaW5nKHZhbCkgPT09ICdbb2JqZWN0IERhdGVdJztcbmNvbnN0IGlzUmVnRXhwID0gKHZhbCkgPT4gdG9UeXBlU3RyaW5nKHZhbCkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xuY29uc3QgaXNGdW5jdGlvbiA9ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbic7XG5jb25zdCBpc1N0cmluZyA9ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnO1xuY29uc3QgaXNTeW1ib2wgPSAodmFsKSA9PiB0eXBlb2YgdmFsID09PSAnc3ltYm9sJztcbmNvbnN0IGlzT2JqZWN0ID0gKHZhbCkgPT4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnO1xuY29uc3QgaXNQcm9taXNlID0gKHZhbCkgPT4ge1xuICAgIHJldHVybiBpc09iamVjdCh2YWwpICYmIGlzRnVuY3Rpb24odmFsLnRoZW4pICYmIGlzRnVuY3Rpb24odmFsLmNhdGNoKTtcbn07XG5jb25zdCBvYmplY3RUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5jb25zdCB0b1R5cGVTdHJpbmcgPSAodmFsdWUpID0+IG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuY29uc3QgdG9SYXdUeXBlID0gKHZhbHVlKSA9PiB7XG4gICAgLy8gZXh0cmFjdCBcIlJhd1R5cGVcIiBmcm9tIHN0cmluZ3MgbGlrZSBcIltvYmplY3QgUmF3VHlwZV1cIlxuICAgIHJldHVybiB0b1R5cGVTdHJpbmcodmFsdWUpLnNsaWNlKDgsIC0xKTtcbn07XG5jb25zdCBpc1BsYWluT2JqZWN0ID0gKHZhbCkgPT4gdG9UeXBlU3RyaW5nKHZhbCkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xuY29uc3QgaXNJbnRlZ2VyS2V5ID0gKGtleSkgPT4gaXNTdHJpbmcoa2V5KSAmJlxuICAgIGtleSAhPT0gJ05hTicgJiZcbiAgICBrZXlbMF0gIT09ICctJyAmJlxuICAgICcnICsgcGFyc2VJbnQoa2V5LCAxMCkgPT09IGtleTtcbmNvbnN0IGlzUmVzZXJ2ZWRQcm9wID0gLyojX19QVVJFX18qLyBtYWtlTWFwKFxuLy8gdGhlIGxlYWRpbmcgY29tbWEgaXMgaW50ZW50aW9uYWwgc28gZW1wdHkgc3RyaW5nIFwiXCIgaXMgYWxzbyBpbmNsdWRlZFxuJyxrZXkscmVmLHJlZl9mb3IscmVmX2tleSwnICtcbiAgICAnb25Wbm9kZUJlZm9yZU1vdW50LG9uVm5vZGVNb3VudGVkLCcgK1xuICAgICdvblZub2RlQmVmb3JlVXBkYXRlLG9uVm5vZGVVcGRhdGVkLCcgK1xuICAgICdvblZub2RlQmVmb3JlVW5tb3VudCxvblZub2RlVW5tb3VudGVkJyk7XG5jb25zdCBpc0J1aWx0SW5EaXJlY3RpdmUgPSAvKiNfX1BVUkVfXyovIG1ha2VNYXAoJ2JpbmQsY2xvYWssZWxzZS1pZixlbHNlLGZvcixodG1sLGlmLG1vZGVsLG9uLG9uY2UscHJlLHNob3csc2xvdCx0ZXh0LG1lbW8nKTtcbmNvbnN0IGNhY2hlU3RyaW5nRnVuY3Rpb24gPSAoZm4pID0+IHtcbiAgICBjb25zdCBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgcmV0dXJuICgoc3RyKSA9PiB7XG4gICAgICAgIGNvbnN0IGhpdCA9IGNhY2hlW3N0cl07XG4gICAgICAgIHJldHVybiBoaXQgfHwgKGNhY2hlW3N0cl0gPSBmbihzdHIpKTtcbiAgICB9KTtcbn07XG5jb25zdCBjYW1lbGl6ZVJFID0gLy0oXFx3KS9nO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBjYW1lbGl6ZSA9IGNhY2hlU3RyaW5nRnVuY3Rpb24oKHN0cikgPT4ge1xuICAgIHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCAoXywgYykgPT4gKGMgPyBjLnRvVXBwZXJDYXNlKCkgOiAnJykpO1xufSk7XG5jb25zdCBoeXBoZW5hdGVSRSA9IC9cXEIoW0EtWl0pL2c7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGh5cGhlbmF0ZSA9IGNhY2hlU3RyaW5nRnVuY3Rpb24oKHN0cikgPT4gc3RyLnJlcGxhY2UoaHlwaGVuYXRlUkUsICctJDEnKS50b0xvd2VyQ2FzZSgpKTtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgY2FwaXRhbGl6ZSA9IGNhY2hlU3RyaW5nRnVuY3Rpb24oKHN0cikgPT4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpKTtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgdG9IYW5kbGVyS2V5ID0gY2FjaGVTdHJpbmdGdW5jdGlvbigoc3RyKSA9PiBzdHIgPyBgb24ke2NhcGl0YWxpemUoc3RyKX1gIDogYGApO1xuLy8gY29tcGFyZSB3aGV0aGVyIGEgdmFsdWUgaGFzIGNoYW5nZWQsIGFjY291bnRpbmcgZm9yIE5hTi5cbmNvbnN0IGhhc0NoYW5nZWQgPSAodmFsdWUsIG9sZFZhbHVlKSA9PiAhT2JqZWN0LmlzKHZhbHVlLCBvbGRWYWx1ZSk7XG5jb25zdCBpbnZva2VBcnJheUZucyA9IChmbnMsIGFyZykgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZuc1tpXShhcmcpO1xuICAgIH1cbn07XG5jb25zdCBkZWYgPSAob2JqLCBrZXksIHZhbHVlKSA9PiB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlXG4gICAgfSk7XG59O1xuLyoqXG4gKiBcIjEyMy1mb29cIiB3aWxsIGJlIHBhcnNlZCB0byAxMjNcbiAqIFRoaXMgaXMgdXNlZCBmb3IgdGhlIC5udW1iZXIgbW9kaWZpZXIgaW4gdi1tb2RlbFxuICovXG5jb25zdCBsb29zZVRvTnVtYmVyID0gKHZhbCkgPT4ge1xuICAgIGNvbnN0IG4gPSBwYXJzZUZsb2F0KHZhbCk7XG4gICAgcmV0dXJuIGlzTmFOKG4pID8gdmFsIDogbjtcbn07XG4vKipcbiAqIE9ubHkgY29uZXJjZXMgbnVtYmVyLWxpa2Ugc3RyaW5nc1xuICogXCIxMjMtZm9vXCIgd2lsbCBiZSByZXR1cm5lZCBhcy1pc1xuICovXG5jb25zdCB0b051bWJlciA9ICh2YWwpID0+IHtcbiAgICBjb25zdCBuID0gaXNTdHJpbmcodmFsKSA/IE51bWJlcih2YWwpIDogTmFOO1xuICAgIHJldHVybiBpc05hTihuKSA/IHZhbCA6IG47XG59O1xubGV0IF9nbG9iYWxUaGlzO1xuY29uc3QgZ2V0R2xvYmFsVGhpcyA9ICgpID0+IHtcbiAgICByZXR1cm4gKF9nbG9iYWxUaGlzIHx8XG4gICAgICAgIChfZ2xvYmFsVGhpcyA9XG4gICAgICAgICAgICB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IGdsb2JhbFRoaXNcbiAgICAgICAgICAgICAgICA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgICAgICA/IHNlbGZcbiAgICAgICAgICAgICAgICAgICAgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyB3aW5kb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGdsb2JhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pKTtcbn07XG5jb25zdCBpZGVudFJFID0gL15bXyRhLXpBLVpcXHhBMC1cXHVGRkZGXVtfJGEtekEtWjAtOVxceEEwLVxcdUZGRkZdKiQvO1xuZnVuY3Rpb24gZ2VuUHJvcHNBY2Nlc3NFeHAobmFtZSkge1xuICAgIHJldHVybiBpZGVudFJFLnRlc3QobmFtZSlcbiAgICAgICAgPyBgX19wcm9wcy4ke25hbWV9YFxuICAgICAgICA6IGBfX3Byb3BzWyR7SlNPTi5zdHJpbmdpZnkobmFtZSl9XWA7XG59XG5cbmV4cG9ydCB7IEVNUFRZX0FSUiwgRU1QVFlfT0JKLCBOTywgTk9PUCwgUGF0Y2hGbGFnTmFtZXMsIGNhbWVsaXplLCBjYXBpdGFsaXplLCBkZWYsIGVzY2FwZUh0bWwsIGVzY2FwZUh0bWxDb21tZW50LCBleHRlbmQsIGdlblByb3BzQWNjZXNzRXhwLCBnZW5lcmF0ZUNvZGVGcmFtZSwgZ2V0R2xvYmFsVGhpcywgaGFzQ2hhbmdlZCwgaGFzT3duLCBoeXBoZW5hdGUsIGluY2x1ZGVCb29sZWFuQXR0ciwgaW52b2tlQXJyYXlGbnMsIGlzQXJyYXksIGlzQm9vbGVhbkF0dHIsIGlzQnVpbHRJbkRpcmVjdGl2ZSwgaXNEYXRlLCBpc0Z1bmN0aW9uLCBpc0dsb2JhbGx5V2hpdGVsaXN0ZWQsIGlzSFRNTFRhZywgaXNJbnRlZ2VyS2V5LCBpc0tub3duSHRtbEF0dHIsIGlzS25vd25TdmdBdHRyLCBpc01hcCwgaXNNb2RlbExpc3RlbmVyLCBpc09iamVjdCwgaXNPbiwgaXNQbGFpbk9iamVjdCwgaXNQcm9taXNlLCBpc1JlZ0V4cCwgaXNSZXNlcnZlZFByb3AsIGlzU1NSU2FmZUF0dHJOYW1lLCBpc1NWR1RhZywgaXNTZXQsIGlzU3BlY2lhbEJvb2xlYW5BdHRyLCBpc1N0cmluZywgaXNTeW1ib2wsIGlzVm9pZFRhZywgbG9vc2VFcXVhbCwgbG9vc2VJbmRleE9mLCBsb29zZVRvTnVtYmVyLCBtYWtlTWFwLCBub3JtYWxpemVDbGFzcywgbm9ybWFsaXplUHJvcHMsIG5vcm1hbGl6ZVN0eWxlLCBvYmplY3RUb1N0cmluZywgcGFyc2VTdHJpbmdTdHlsZSwgcHJvcHNUb0F0dHJNYXAsIHJlbW92ZSwgc2xvdEZsYWdzVGV4dCwgc3RyaW5naWZ5U3R5bGUsIHRvRGlzcGxheVN0cmluZywgdG9IYW5kbGVyS2V5LCB0b051bWJlciwgdG9SYXdUeXBlLCB0b1R5cGVTdHJpbmcgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@vue/shared/dist/shared.esm-bundler.js\n");

/***/ }),

/***/ "./node_modules/axios/index.js":
/*!*************************************!*\
  !*** ./node_modules/axios/index.js ***!
  \*************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

eval("module.exports = __webpack_require__(/*! ./lib/axios */ \"./node_modules/axios/lib/axios.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvaW5kZXguanMuanMiLCJtYXBwaW5ncyI6IkFBQUEsNEZBQXVDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2luZGV4LmpzPzUzZTkiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9heGlvcycpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/index.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/adapters/xhr.js":
/*!************************************************!*\
  !*** ./node_modules/axios/lib/adapters/xhr.js ***!
  \************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\nvar settle = __webpack_require__(/*! ./../core/settle */ \"./node_modules/axios/lib/core/settle.js\");\nvar cookies = __webpack_require__(/*! ./../helpers/cookies */ \"./node_modules/axios/lib/helpers/cookies.js\");\nvar buildURL = __webpack_require__(/*! ./../helpers/buildURL */ \"./node_modules/axios/lib/helpers/buildURL.js\");\nvar buildFullPath = __webpack_require__(/*! ../core/buildFullPath */ \"./node_modules/axios/lib/core/buildFullPath.js\");\nvar parseHeaders = __webpack_require__(/*! ./../helpers/parseHeaders */ \"./node_modules/axios/lib/helpers/parseHeaders.js\");\nvar isURLSameOrigin = __webpack_require__(/*! ./../helpers/isURLSameOrigin */ \"./node_modules/axios/lib/helpers/isURLSameOrigin.js\");\nvar createError = __webpack_require__(/*! ../core/createError */ \"./node_modules/axios/lib/core/createError.js\");\nvar defaults = __webpack_require__(/*! ../defaults */ \"./node_modules/axios/lib/defaults.js\");\nvar Cancel = __webpack_require__(/*! ../cancel/Cancel */ \"./node_modules/axios/lib/cancel/Cancel.js\");\n\nmodule.exports = function xhrAdapter(config) {\n  return new Promise(function dispatchXhrRequest(resolve, reject) {\n    var requestData = config.data;\n    var requestHeaders = config.headers;\n    var responseType = config.responseType;\n    var onCanceled;\n    function done() {\n      if (config.cancelToken) {\n        config.cancelToken.unsubscribe(onCanceled);\n      }\n\n      if (config.signal) {\n        config.signal.removeEventListener('abort', onCanceled);\n      }\n    }\n\n    if (utils.isFormData(requestData)) {\n      delete requestHeaders['Content-Type']; // Let the browser set it\n    }\n\n    var request = new XMLHttpRequest();\n\n    // HTTP basic authentication\n    if (config.auth) {\n      var username = config.auth.username || '';\n      var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n      requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n    }\n\n    var fullPath = buildFullPath(config.baseURL, config.url);\n    request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n    // Set the request timeout in MS\n    request.timeout = config.timeout;\n\n    function onloadend() {\n      if (!request) {\n        return;\n      }\n      // Prepare the response\n      var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n      var responseData = !responseType || responseType === 'text' ||  responseType === 'json' ?\n        request.responseText : request.response;\n      var response = {\n        data: responseData,\n        status: request.status,\n        statusText: request.statusText,\n        headers: responseHeaders,\n        config: config,\n        request: request\n      };\n\n      settle(function _resolve(value) {\n        resolve(value);\n        done();\n      }, function _reject(err) {\n        reject(err);\n        done();\n      }, response);\n\n      // Clean up request\n      request = null;\n    }\n\n    if ('onloadend' in request) {\n      // Use onloadend if available\n      request.onloadend = onloadend;\n    } else {\n      // Listen for ready state to emulate onloadend\n      request.onreadystatechange = function handleLoad() {\n        if (!request || request.readyState !== 4) {\n          return;\n        }\n\n        // The request errored out and we didn't get a response, this will be\n        // handled by onerror instead\n        // With one exception: request that using file: protocol, most browsers\n        // will return status as 0 even though it's a successful request\n        if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n          return;\n        }\n        // readystate handler is calling before onerror or ontimeout handlers,\n        // so we should call onloadend on the next 'tick'\n        setTimeout(onloadend);\n      };\n    }\n\n    // Handle browser request cancellation (as opposed to a manual cancellation)\n    request.onabort = function handleAbort() {\n      if (!request) {\n        return;\n      }\n\n      reject(createError('Request aborted', config, 'ECONNABORTED', request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Handle low level network errors\n    request.onerror = function handleError() {\n      // Real errors are hidden from us by the browser\n      // onerror should only fire if it's a network error\n      reject(createError('Network Error', config, null, request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Handle timeout\n    request.ontimeout = function handleTimeout() {\n      var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n      var transitional = config.transitional || defaults.transitional;\n      if (config.timeoutErrorMessage) {\n        timeoutErrorMessage = config.timeoutErrorMessage;\n      }\n      reject(createError(\n        timeoutErrorMessage,\n        config,\n        transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED',\n        request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Add xsrf header\n    // This is only done if running in a standard browser environment.\n    // Specifically not if we're in a web worker, or react-native.\n    if (utils.isStandardBrowserEnv()) {\n      // Add xsrf header\n      var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?\n        cookies.read(config.xsrfCookieName) :\n        undefined;\n\n      if (xsrfValue) {\n        requestHeaders[config.xsrfHeaderName] = xsrfValue;\n      }\n    }\n\n    // Add headers to the request\n    if ('setRequestHeader' in request) {\n      utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n        if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n          // Remove Content-Type if data is undefined\n          delete requestHeaders[key];\n        } else {\n          // Otherwise add header to the request\n          request.setRequestHeader(key, val);\n        }\n      });\n    }\n\n    // Add withCredentials to request if needed\n    if (!utils.isUndefined(config.withCredentials)) {\n      request.withCredentials = !!config.withCredentials;\n    }\n\n    // Add responseType to request if needed\n    if (responseType && responseType !== 'json') {\n      request.responseType = config.responseType;\n    }\n\n    // Handle progress if needed\n    if (typeof config.onDownloadProgress === 'function') {\n      request.addEventListener('progress', config.onDownloadProgress);\n    }\n\n    // Not all browsers support upload events\n    if (typeof config.onUploadProgress === 'function' && request.upload) {\n      request.upload.addEventListener('progress', config.onUploadProgress);\n    }\n\n    if (config.cancelToken || config.signal) {\n      // Handle cancellation\n      // eslint-disable-next-line func-names\n      onCanceled = function(cancel) {\n        if (!request) {\n          return;\n        }\n        reject(!cancel || (cancel && cancel.type) ? new Cancel('canceled') : cancel);\n        request.abort();\n        request = null;\n      };\n\n      config.cancelToken && config.cancelToken.subscribe(onCanceled);\n      if (config.signal) {\n        config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n      }\n    }\n\n    if (!requestData) {\n      requestData = null;\n    }\n\n    // Send the request\n    request.send(requestData);\n  });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixZQUFZLG1CQUFPLENBQUMscURBQVk7QUFDaEMsYUFBYSxtQkFBTyxDQUFDLGlFQUFrQjtBQUN2QyxjQUFjLG1CQUFPLENBQUMseUVBQXNCO0FBQzVDLGVBQWUsbUJBQU8sQ0FBQywyRUFBdUI7QUFDOUMsb0JBQW9CLG1CQUFPLENBQUMsNkVBQXVCO0FBQ25ELG1CQUFtQixtQkFBTyxDQUFDLG1GQUEyQjtBQUN0RCxzQkFBc0IsbUJBQU8sQ0FBQyx5RkFBOEI7QUFDNUQsa0JBQWtCLG1CQUFPLENBQUMseUVBQXFCO0FBQy9DLGVBQWUsbUJBQU8sQ0FBQyx5REFBYTtBQUNwQyxhQUFhLG1CQUFPLENBQUMsbUVBQWtCOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZDQUE2QztBQUM3Qzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSCIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMveGhyLmpzPzFhNWMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgc2V0dGxlID0gcmVxdWlyZSgnLi8uLi9jb3JlL3NldHRsZScpO1xudmFyIGNvb2tpZXMgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvY29va2llcycpO1xudmFyIGJ1aWxkVVJMID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2J1aWxkVVJMJyk7XG52YXIgYnVpbGRGdWxsUGF0aCA9IHJlcXVpcmUoJy4uL2NvcmUvYnVpbGRGdWxsUGF0aCcpO1xudmFyIHBhcnNlSGVhZGVycyA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9wYXJzZUhlYWRlcnMnKTtcbnZhciBpc1VSTFNhbWVPcmlnaW4gPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luJyk7XG52YXIgY3JlYXRlRXJyb3IgPSByZXF1aXJlKCcuLi9jb3JlL2NyZWF0ZUVycm9yJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuLi9kZWZhdWx0cycpO1xudmFyIENhbmNlbCA9IHJlcXVpcmUoJy4uL2NhbmNlbC9DYW5jZWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB4aHJBZGFwdGVyKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciByZXF1ZXN0RGF0YSA9IGNvbmZpZy5kYXRhO1xuICAgIHZhciByZXF1ZXN0SGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzO1xuICAgIHZhciByZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xuICAgIHZhciBvbkNhbmNlbGVkO1xuICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgICAgIGNvbmZpZy5jYW5jZWxUb2tlbi51bnN1YnNjcmliZShvbkNhbmNlbGVkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5zaWduYWwpIHtcbiAgICAgICAgY29uZmlnLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQ2FuY2VsZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1dGlscy5pc0Zvcm1EYXRhKHJlcXVlc3REYXRhKSkge1xuICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzWydDb250ZW50LVR5cGUnXTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH1cblxuICAgIHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAvLyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uXG4gICAgaWYgKGNvbmZpZy5hdXRoKSB7XG4gICAgICB2YXIgdXNlcm5hbWUgPSBjb25maWcuYXV0aC51c2VybmFtZSB8fCAnJztcbiAgICAgIHZhciBwYXNzd29yZCA9IGNvbmZpZy5hdXRoLnBhc3N3b3JkID8gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGNvbmZpZy5hdXRoLnBhc3N3b3JkKSkgOiAnJztcbiAgICAgIHJlcXVlc3RIZWFkZXJzLkF1dGhvcml6YXRpb24gPSAnQmFzaWMgJyArIGJ0b2EodXNlcm5hbWUgKyAnOicgKyBwYXNzd29yZCk7XG4gICAgfVxuXG4gICAgdmFyIGZ1bGxQYXRoID0gYnVpbGRGdWxsUGF0aChjb25maWcuYmFzZVVSTCwgY29uZmlnLnVybCk7XG4gICAgcmVxdWVzdC5vcGVuKGNvbmZpZy5tZXRob2QudG9VcHBlckNhc2UoKSwgYnVpbGRVUkwoZnVsbFBhdGgsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKSwgdHJ1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHJlcXVlc3QgdGltZW91dCBpbiBNU1xuICAgIHJlcXVlc3QudGltZW91dCA9IGNvbmZpZy50aW1lb3V0O1xuXG4gICAgZnVuY3Rpb24gb25sb2FkZW5kKCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG4gICAgICB2YXIgcmVzcG9uc2VIZWFkZXJzID0gJ2dldEFsbFJlc3BvbnNlSGVhZGVycycgaW4gcmVxdWVzdCA/IHBhcnNlSGVhZGVycyhyZXF1ZXN0LmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSA6IG51bGw7XG4gICAgICB2YXIgcmVzcG9uc2VEYXRhID0gIXJlc3BvbnNlVHlwZSB8fCByZXNwb25zZVR5cGUgPT09ICd0ZXh0JyB8fCAgcmVzcG9uc2VUeXBlID09PSAnanNvbicgP1xuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVGV4dCA6IHJlcXVlc3QucmVzcG9uc2U7XG4gICAgICB2YXIgcmVzcG9uc2UgPSB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVxdWVzdC5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIGNvbmZpZzogY29uZmlnLFxuICAgICAgICByZXF1ZXN0OiByZXF1ZXN0XG4gICAgICB9O1xuXG4gICAgICBzZXR0bGUoZnVuY3Rpb24gX3Jlc29sdmUodmFsdWUpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIGZ1bmN0aW9uIF9yZWplY3QoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCByZXNwb25zZSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICgnb25sb2FkZW5kJyBpbiByZXF1ZXN0KSB7XG4gICAgICAvLyBVc2Ugb25sb2FkZW5kIGlmIGF2YWlsYWJsZVxuICAgICAgcmVxdWVzdC5vbmxvYWRlbmQgPSBvbmxvYWRlbmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExpc3RlbiBmb3IgcmVhZHkgc3RhdGUgdG8gZW11bGF0ZSBvbmxvYWRlbmRcbiAgICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlTG9hZCgpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0IHx8IHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSByZXF1ZXN0IGVycm9yZWQgb3V0IGFuZCB3ZSBkaWRuJ3QgZ2V0IGEgcmVzcG9uc2UsIHRoaXMgd2lsbCBiZVxuICAgICAgICAvLyBoYW5kbGVkIGJ5IG9uZXJyb3IgaW5zdGVhZFxuICAgICAgICAvLyBXaXRoIG9uZSBleGNlcHRpb246IHJlcXVlc3QgdGhhdCB1c2luZyBmaWxlOiBwcm90b2NvbCwgbW9zdCBicm93c2Vyc1xuICAgICAgICAvLyB3aWxsIHJldHVybiBzdGF0dXMgYXMgMCBldmVuIHRob3VnaCBpdCdzIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0XG4gICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMCAmJiAhKHJlcXVlc3QucmVzcG9uc2VVUkwgJiYgcmVxdWVzdC5yZXNwb25zZVVSTC5pbmRleE9mKCdmaWxlOicpID09PSAwKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyByZWFkeXN0YXRlIGhhbmRsZXIgaXMgY2FsbGluZyBiZWZvcmUgb25lcnJvciBvciBvbnRpbWVvdXQgaGFuZGxlcnMsXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBjYWxsIG9ubG9hZGVuZCBvbiB0aGUgbmV4dCAndGljaydcbiAgICAgICAgc2V0VGltZW91dChvbmxvYWRlbmQpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYnJvd3NlciByZXF1ZXN0IGNhbmNlbGxhdGlvbiAoYXMgb3Bwb3NlZCB0byBhIG1hbnVhbCBjYW5jZWxsYXRpb24pXG4gICAgcmVxdWVzdC5vbmFib3J0ID0gZnVuY3Rpb24gaGFuZGxlQWJvcnQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZWplY3QoY3JlYXRlRXJyb3IoJ1JlcXVlc3QgYWJvcnRlZCcsIGNvbmZpZywgJ0VDT05OQUJPUlRFRCcsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBsb3cgbGV2ZWwgbmV0d29yayBlcnJvcnNcbiAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcigpIHtcbiAgICAgIC8vIFJlYWwgZXJyb3JzIGFyZSBoaWRkZW4gZnJvbSB1cyBieSB0aGUgYnJvd3NlclxuICAgICAgLy8gb25lcnJvciBzaG91bGQgb25seSBmaXJlIGlmIGl0J3MgYSBuZXR3b3JrIGVycm9yXG4gICAgICByZWplY3QoY3JlYXRlRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBjb25maWcsIG51bGwsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB0aW1lb3V0XG4gICAgcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KCkge1xuICAgICAgdmFyIHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBjb25maWcudGltZW91dCA/ICd0aW1lb3V0IG9mICcgKyBjb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCcgOiAndGltZW91dCBleGNlZWRlZCc7XG4gICAgICB2YXIgdHJhbnNpdGlvbmFsID0gY29uZmlnLnRyYW5zaXRpb25hbCB8fCBkZWZhdWx0cy50cmFuc2l0aW9uYWw7XG4gICAgICBpZiAoY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IGNvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmVqZWN0KGNyZWF0ZUVycm9yKFxuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHRyYW5zaXRpb25hbC5jbGFyaWZ5VGltZW91dEVycm9yID8gJ0VUSU1FRE9VVCcgOiAnRUNPTk5BQk9SVEVEJyxcbiAgICAgICAgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgLy8gVGhpcyBpcyBvbmx5IGRvbmUgaWYgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gICAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cbiAgICBpZiAodXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSkge1xuICAgICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgICB2YXIgeHNyZlZhbHVlID0gKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgfHwgaXNVUkxTYW1lT3JpZ2luKGZ1bGxQYXRoKSkgJiYgY29uZmlnLnhzcmZDb29raWVOYW1lID9cbiAgICAgICAgY29va2llcy5yZWFkKGNvbmZpZy54c3JmQ29va2llTmFtZSkgOlxuICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh4c3JmVmFsdWUpIHtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNbY29uZmlnLnhzcmZIZWFkZXJOYW1lXSA9IHhzcmZWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgaGVhZGVycyB0byB0aGUgcmVxdWVzdFxuICAgIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gcmVxdWVzdCkge1xuICAgICAgdXRpbHMuZm9yRWFjaChyZXF1ZXN0SGVhZGVycywgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3REYXRhID09PSAndW5kZWZpbmVkJyAmJiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpIHtcbiAgICAgICAgICAvLyBSZW1vdmUgQ29udGVudC1UeXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gICAgICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBoZWFkZXIgdG8gdGhlIHJlcXVlc3RcbiAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChjb25maWcud2l0aENyZWRlbnRpYWxzKSkge1xuICAgICAgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSAhIWNvbmZpZy53aXRoQ3JlZGVudGlhbHM7XG4gICAgfVxuXG4gICAgLy8gQWRkIHJlc3BvbnNlVHlwZSB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmIChyZXNwb25zZVR5cGUgJiYgcmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJvZ3Jlc3MgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBjb25maWcub25Eb3dubG9hZFByb2dyZXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgLy8gTm90IGFsbCBicm93c2VycyBzdXBwb3J0IHVwbG9hZCBldmVudHNcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5vblVwbG9hZFByb2dyZXNzID09PSAnZnVuY3Rpb24nICYmIHJlcXVlc3QudXBsb2FkKSB7XG4gICAgICByZXF1ZXN0LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGNvbmZpZy5vblVwbG9hZFByb2dyZXNzKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmNhbmNlbFRva2VuIHx8IGNvbmZpZy5zaWduYWwpIHtcbiAgICAgIC8vIEhhbmRsZSBjYW5jZWxsYXRpb25cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgICBvbkNhbmNlbGVkID0gZnVuY3Rpb24oY2FuY2VsKSB7XG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoIWNhbmNlbCB8fCAoY2FuY2VsICYmIGNhbmNlbC50eXBlKSA/IG5ldyBDYW5jZWwoJ2NhbmNlbGVkJykgOiBjYW5jZWwpO1xuICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfTtcblxuICAgICAgY29uZmlnLmNhbmNlbFRva2VuICYmIGNvbmZpZy5jYW5jZWxUb2tlbi5zdWJzY3JpYmUob25DYW5jZWxlZCk7XG4gICAgICBpZiAoY29uZmlnLnNpZ25hbCkge1xuICAgICAgICBjb25maWcuc2lnbmFsLmFib3J0ZWQgPyBvbkNhbmNlbGVkKCkgOiBjb25maWcuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25DYW5jZWxlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFyZXF1ZXN0RGF0YSkge1xuICAgICAgcmVxdWVzdERhdGEgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFNlbmQgdGhlIHJlcXVlc3RcbiAgICByZXF1ZXN0LnNlbmQocmVxdWVzdERhdGEpO1xuICB9KTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/adapters/xhr.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/axios.js":
/*!*****************************************!*\
  !*** ./node_modules/axios/lib/axios.js ***!
  \*****************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./utils */ \"./node_modules/axios/lib/utils.js\");\nvar bind = __webpack_require__(/*! ./helpers/bind */ \"./node_modules/axios/lib/helpers/bind.js\");\nvar Axios = __webpack_require__(/*! ./core/Axios */ \"./node_modules/axios/lib/core/Axios.js\");\nvar mergeConfig = __webpack_require__(/*! ./core/mergeConfig */ \"./node_modules/axios/lib/core/mergeConfig.js\");\nvar defaults = __webpack_require__(/*! ./defaults */ \"./node_modules/axios/lib/defaults.js\");\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n  var context = new Axios(defaultConfig);\n  var instance = bind(Axios.prototype.request, context);\n\n  // Copy axios.prototype to instance\n  utils.extend(instance, Axios.prototype, context);\n\n  // Copy context to instance\n  utils.extend(instance, context);\n\n  // Factory for creating new instances\n  instance.create = function create(instanceConfig) {\n    return createInstance(mergeConfig(defaultConfig, instanceConfig));\n  };\n\n  return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.Cancel = __webpack_require__(/*! ./cancel/Cancel */ \"./node_modules/axios/lib/cancel/Cancel.js\");\naxios.CancelToken = __webpack_require__(/*! ./cancel/CancelToken */ \"./node_modules/axios/lib/cancel/CancelToken.js\");\naxios.isCancel = __webpack_require__(/*! ./cancel/isCancel */ \"./node_modules/axios/lib/cancel/isCancel.js\");\naxios.VERSION = (__webpack_require__(/*! ./env/data */ \"./node_modules/axios/lib/env/data.js\").version);\n\n// Expose all/spread\naxios.all = function all(promises) {\n  return Promise.all(promises);\n};\naxios.spread = __webpack_require__(/*! ./helpers/spread */ \"./node_modules/axios/lib/helpers/spread.js\");\n\n// Expose isAxiosError\naxios.isAxiosError = __webpack_require__(/*! ./helpers/isAxiosError */ \"./node_modules/axios/lib/helpers/isAxiosError.js\");\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports[\"default\"] = axios;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2F4aW9zLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxrREFBUztBQUM3QixXQUFXLG1CQUFPLENBQUMsZ0VBQWdCO0FBQ25DLFlBQVksbUJBQU8sQ0FBQyw0REFBYztBQUNsQyxrQkFBa0IsbUJBQU8sQ0FBQyx3RUFBb0I7QUFDOUMsZUFBZSxtQkFBTyxDQUFDLHdEQUFZOztBQUVuQztBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGVBQWUsbUJBQU8sQ0FBQyxrRUFBaUI7QUFDeEMsb0JBQW9CLG1CQUFPLENBQUMsNEVBQXNCO0FBQ2xELGlCQUFpQixtQkFBTyxDQUFDLHNFQUFtQjtBQUM1QyxnQkFBZ0IsdUZBQTZCOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsbUJBQU8sQ0FBQyxvRUFBa0I7O0FBRXpDO0FBQ0EscUJBQXFCLG1CQUFPLENBQUMsZ0ZBQXdCOztBQUVyRDs7QUFFQTtBQUNBLHlCQUFzQiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYXhpb3MuanM/ZmFkNiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi9oZWxwZXJzL2JpbmQnKTtcbnZhciBBeGlvcyA9IHJlcXVpcmUoJy4vY29yZS9BeGlvcycpO1xudmFyIG1lcmdlQ29uZmlnID0gcmVxdWlyZSgnLi9jb3JlL21lcmdlQ29uZmlnJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbi8qKlxuICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqIEByZXR1cm4ge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZShkZWZhdWx0Q29uZmlnKSB7XG4gIHZhciBjb250ZXh0ID0gbmV3IEF4aW9zKGRlZmF1bHRDb25maWcpO1xuICB2YXIgaW5zdGFuY2UgPSBiaW5kKEF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0LCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGF4aW9zLnByb3RvdHlwZSB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIEF4aW9zLnByb3RvdHlwZSwgY29udGV4dCk7XG5cbiAgLy8gQ29weSBjb250ZXh0IHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgY29udGV4dCk7XG5cbiAgLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlc1xuICBpbnN0YW5jZS5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaW5zdGFuY2VDb25maWcpIHtcbiAgICByZXR1cm4gY3JlYXRlSW5zdGFuY2UobWVyZ2VDb25maWcoZGVmYXVsdENvbmZpZywgaW5zdGFuY2VDb25maWcpKTtcbiAgfTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbi8vIENyZWF0ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB0byBiZSBleHBvcnRlZFxudmFyIGF4aW9zID0gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdHMpO1xuXG4vLyBFeHBvc2UgQXhpb3MgY2xhc3MgdG8gYWxsb3cgY2xhc3MgaW5oZXJpdGFuY2VcbmF4aW9zLkF4aW9zID0gQXhpb3M7XG5cbi8vIEV4cG9zZSBDYW5jZWwgJiBDYW5jZWxUb2tlblxuYXhpb3MuQ2FuY2VsID0gcmVxdWlyZSgnLi9jYW5jZWwvQ2FuY2VsJyk7XG5heGlvcy5DYW5jZWxUb2tlbiA9IHJlcXVpcmUoJy4vY2FuY2VsL0NhbmNlbFRva2VuJyk7XG5heGlvcy5pc0NhbmNlbCA9IHJlcXVpcmUoJy4vY2FuY2VsL2lzQ2FuY2VsJyk7XG5heGlvcy5WRVJTSU9OID0gcmVxdWlyZSgnLi9lbnYvZGF0YScpLnZlcnNpb247XG5cbi8vIEV4cG9zZSBhbGwvc3ByZWFkXG5heGlvcy5hbGwgPSBmdW5jdGlvbiBhbGwocHJvbWlzZXMpIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn07XG5heGlvcy5zcHJlYWQgPSByZXF1aXJlKCcuL2hlbHBlcnMvc3ByZWFkJyk7XG5cbi8vIEV4cG9zZSBpc0F4aW9zRXJyb3JcbmF4aW9zLmlzQXhpb3NFcnJvciA9IHJlcXVpcmUoJy4vaGVscGVycy9pc0F4aW9zRXJyb3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBheGlvcztcblxuLy8gQWxsb3cgdXNlIG9mIGRlZmF1bHQgaW1wb3J0IHN5bnRheCBpbiBUeXBlU2NyaXB0XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gYXhpb3M7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/axios.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/cancel/Cancel.js":
/*!*************************************************!*\
  !*** ./node_modules/axios/lib/cancel/Cancel.js ***!
  \*************************************************/
/***/ ((module) => {

"use strict";
eval("\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n  this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n  return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWwuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvQ2FuY2VsLmpzP2QyYTIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEEgYENhbmNlbGAgaXMgYW4gb2JqZWN0IHRoYXQgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIGNhbmNlbGVkLlxuICpcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtzdHJpbmc9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBDYW5jZWwobWVzc2FnZSkge1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xufVxuXG5DYW5jZWwucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnQ2FuY2VsJyArICh0aGlzLm1lc3NhZ2UgPyAnOiAnICsgdGhpcy5tZXNzYWdlIDogJycpO1xufTtcblxuQ2FuY2VsLnByb3RvdHlwZS5fX0NBTkNFTF9fID0gdHJ1ZTtcblxubW9kdWxlLmV4cG9ydHMgPSBDYW5jZWw7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/cancel/Cancel.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/cancel/CancelToken.js":
/*!******************************************************!*\
  !*** ./node_modules/axios/lib/cancel/CancelToken.js ***!
  \******************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar Cancel = __webpack_require__(/*! ./Cancel */ \"./node_modules/axios/lib/cancel/Cancel.js\");\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n  if (typeof executor !== 'function') {\n    throw new TypeError('executor must be a function.');\n  }\n\n  var resolvePromise;\n\n  this.promise = new Promise(function promiseExecutor(resolve) {\n    resolvePromise = resolve;\n  });\n\n  var token = this;\n\n  // eslint-disable-next-line func-names\n  this.promise.then(function(cancel) {\n    if (!token._listeners) return;\n\n    var i;\n    var l = token._listeners.length;\n\n    for (i = 0; i < l; i++) {\n      token._listeners[i](cancel);\n    }\n    token._listeners = null;\n  });\n\n  // eslint-disable-next-line func-names\n  this.promise.then = function(onfulfilled) {\n    var _resolve;\n    // eslint-disable-next-line func-names\n    var promise = new Promise(function(resolve) {\n      token.subscribe(resolve);\n      _resolve = resolve;\n    }).then(onfulfilled);\n\n    promise.cancel = function reject() {\n      token.unsubscribe(_resolve);\n    };\n\n    return promise;\n  };\n\n  executor(function cancel(message) {\n    if (token.reason) {\n      // Cancellation has already been requested\n      return;\n    }\n\n    token.reason = new Cancel(message);\n    resolvePromise(token.reason);\n  });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n  if (this.reason) {\n    throw this.reason;\n  }\n};\n\n/**\n * Subscribe to the cancel signal\n */\n\nCancelToken.prototype.subscribe = function subscribe(listener) {\n  if (this.reason) {\n    listener(this.reason);\n    return;\n  }\n\n  if (this._listeners) {\n    this._listeners.push(listener);\n  } else {\n    this._listeners = [listener];\n  }\n};\n\n/**\n * Unsubscribe from the cancel signal\n */\n\nCancelToken.prototype.unsubscribe = function unsubscribe(listener) {\n  if (!this._listeners) {\n    return;\n  }\n  var index = this._listeners.indexOf(listener);\n  if (index !== -1) {\n    this._listeners.splice(index, 1);\n  }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n  var cancel;\n  var token = new CancelToken(function executor(c) {\n    cancel = c;\n  });\n  return {\n    token: token,\n    cancel: cancel\n  };\n};\n\nmodule.exports = CancelToken;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixhQUFhLG1CQUFPLENBQUMsMkRBQVU7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsZ0JBQWdCLE9BQU87QUFDdkI7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcz83MmM4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIENhbmNlbCA9IHJlcXVpcmUoJy4vQ2FuY2VsJyk7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV4ZWN1dG9yIFRoZSBleGVjdXRvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsVG9rZW4oZXhlY3V0b3IpIHtcbiAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIHZhciByZXNvbHZlUHJvbWlzZTtcblxuICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiBwcm9taXNlRXhlY3V0b3IocmVzb2x2ZSkge1xuICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgfSk7XG5cbiAgdmFyIHRva2VuID0gdGhpcztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICB0aGlzLnByb21pc2UudGhlbihmdW5jdGlvbihjYW5jZWwpIHtcbiAgICBpZiAoIXRva2VuLl9saXN0ZW5lcnMpIHJldHVybjtcblxuICAgIHZhciBpO1xuICAgIHZhciBsID0gdG9rZW4uX2xpc3RlbmVycy5sZW5ndGg7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICB0b2tlbi5fbGlzdGVuZXJzW2ldKGNhbmNlbCk7XG4gICAgfVxuICAgIHRva2VuLl9saXN0ZW5lcnMgPSBudWxsO1xuICB9KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICB0aGlzLnByb21pc2UudGhlbiA9IGZ1bmN0aW9uKG9uZnVsZmlsbGVkKSB7XG4gICAgdmFyIF9yZXNvbHZlO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gICAgICB0b2tlbi5zdWJzY3JpYmUocmVzb2x2ZSk7XG4gICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgfSkudGhlbihvbmZ1bGZpbGxlZCk7XG5cbiAgICBwcm9taXNlLmNhbmNlbCA9IGZ1bmN0aW9uIHJlamVjdCgpIHtcbiAgICAgIHRva2VuLnVuc3Vic2NyaWJlKF9yZXNvbHZlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH07XG5cbiAgZXhlY3V0b3IoZnVuY3Rpb24gY2FuY2VsKG1lc3NhZ2UpIHtcbiAgICBpZiAodG9rZW4ucmVhc29uKSB7XG4gICAgICAvLyBDYW5jZWxsYXRpb24gaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0b2tlbi5yZWFzb24gPSBuZXcgQ2FuY2VsKG1lc3NhZ2UpO1xuICAgIHJlc29sdmVQcm9taXNlKHRva2VuLnJlYXNvbik7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKi9cbkNhbmNlbFRva2VuLnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkID0gZnVuY3Rpb24gdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgdGhyb3cgdGhpcy5yZWFzb247XG4gIH1cbn07XG5cbi8qKlxuICogU3Vic2NyaWJlIHRvIHRoZSBjYW5jZWwgc2lnbmFsXG4gKi9cblxuQ2FuY2VsVG9rZW4ucHJvdG90eXBlLnN1YnNjcmliZSA9IGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICBsaXN0ZW5lcih0aGlzLnJlYXNvbik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbbGlzdGVuZXJdO1xuICB9XG59O1xuXG4vKipcbiAqIFVuc3Vic2NyaWJlIGZyb20gdGhlIGNhbmNlbCBzaWduYWxcbiAqL1xuXG5DYW5jZWxUb2tlbi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbiB1bnN1YnNjcmliZShsaXN0ZW5lcikge1xuICBpZiAoIXRoaXMuX2xpc3RlbmVycykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgaW5kZXggPSB0aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbmV3IGBDYW5jZWxUb2tlbmAgYW5kIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsXG4gKiBjYW5jZWxzIHRoZSBgQ2FuY2VsVG9rZW5gLlxuICovXG5DYW5jZWxUb2tlbi5zb3VyY2UgPSBmdW5jdGlvbiBzb3VyY2UoKSB7XG4gIHZhciBjYW5jZWw7XG4gIHZhciB0b2tlbiA9IG5ldyBDYW5jZWxUb2tlbihmdW5jdGlvbiBleGVjdXRvcihjKSB7XG4gICAgY2FuY2VsID0gYztcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgdG9rZW46IHRva2VuLFxuICAgIGNhbmNlbDogY2FuY2VsXG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENhbmNlbFRva2VuO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/cancel/CancelToken.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/cancel/isCancel.js":
/*!***************************************************!*\
  !*** ./node_modules/axios/lib/cancel/isCancel.js ***!
  \***************************************************/
/***/ ((module) => {

"use strict";
eval("\n\nmodule.exports = function isCancel(value) {\n  return !!(value && value.__CANCEL__);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcz9jMTdhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/cancel/isCancel.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/core/Axios.js":
/*!**********************************************!*\
  !*** ./node_modules/axios/lib/core/Axios.js ***!
  \**********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\nvar buildURL = __webpack_require__(/*! ../helpers/buildURL */ \"./node_modules/axios/lib/helpers/buildURL.js\");\nvar InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ \"./node_modules/axios/lib/core/InterceptorManager.js\");\nvar dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ \"./node_modules/axios/lib/core/dispatchRequest.js\");\nvar mergeConfig = __webpack_require__(/*! ./mergeConfig */ \"./node_modules/axios/lib/core/mergeConfig.js\");\nvar validator = __webpack_require__(/*! ../helpers/validator */ \"./node_modules/axios/lib/helpers/validator.js\");\n\nvar validators = validator.validators;\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n  this.defaults = instanceConfig;\n  this.interceptors = {\n    request: new InterceptorManager(),\n    response: new InterceptorManager()\n  };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n  /*eslint no-param-reassign:0*/\n  // Allow for axios('example/url'[, config]) a la fetch API\n  if (typeof config === 'string') {\n    config = arguments[1] || {};\n    config.url = arguments[0];\n  } else {\n    config = config || {};\n  }\n\n  config = mergeConfig(this.defaults, config);\n\n  // Set config.method\n  if (config.method) {\n    config.method = config.method.toLowerCase();\n  } else if (this.defaults.method) {\n    config.method = this.defaults.method.toLowerCase();\n  } else {\n    config.method = 'get';\n  }\n\n  var transitional = config.transitional;\n\n  if (transitional !== undefined) {\n    validator.assertOptions(transitional, {\n      silentJSONParsing: validators.transitional(validators.boolean),\n      forcedJSONParsing: validators.transitional(validators.boolean),\n      clarifyTimeoutError: validators.transitional(validators.boolean)\n    }, false);\n  }\n\n  // filter out skipped interceptors\n  var requestInterceptorChain = [];\n  var synchronousRequestInterceptors = true;\n  this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n    if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n      return;\n    }\n\n    synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n    requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n  });\n\n  var responseInterceptorChain = [];\n  this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n    responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n  });\n\n  var promise;\n\n  if (!synchronousRequestInterceptors) {\n    var chain = [dispatchRequest, undefined];\n\n    Array.prototype.unshift.apply(chain, requestInterceptorChain);\n    chain = chain.concat(responseInterceptorChain);\n\n    promise = Promise.resolve(config);\n    while (chain.length) {\n      promise = promise.then(chain.shift(), chain.shift());\n    }\n\n    return promise;\n  }\n\n\n  var newConfig = config;\n  while (requestInterceptorChain.length) {\n    var onFulfilled = requestInterceptorChain.shift();\n    var onRejected = requestInterceptorChain.shift();\n    try {\n      newConfig = onFulfilled(newConfig);\n    } catch (error) {\n      onRejected(error);\n      break;\n    }\n  }\n\n  try {\n    promise = dispatchRequest(newConfig);\n  } catch (error) {\n    return Promise.reject(error);\n  }\n\n  while (responseInterceptorChain.length) {\n    promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());\n  }\n\n  return promise;\n};\n\nAxios.prototype.getUri = function getUri(config) {\n  config = mergeConfig(this.defaults, config);\n  return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\\?/, '');\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n  /*eslint func-names:0*/\n  Axios.prototype[method] = function(url, config) {\n    return this.request(mergeConfig(config || {}, {\n      method: method,\n      url: url,\n      data: (config || {}).data\n    }));\n  };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n  /*eslint func-names:0*/\n  Axios.prototype[method] = function(url, data, config) {\n    return this.request(mergeConfig(config || {}, {\n      method: method,\n      url: url,\n      data: data\n    }));\n  };\n});\n\nmodule.exports = Axios;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3MuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLHFEQUFZO0FBQ2hDLGVBQWUsbUJBQU8sQ0FBQyx5RUFBcUI7QUFDNUMseUJBQXlCLG1CQUFPLENBQUMsaUZBQXNCO0FBQ3ZELHNCQUFzQixtQkFBTyxDQUFDLDJFQUFtQjtBQUNqRCxrQkFBa0IsbUJBQU8sQ0FBQyxtRUFBZTtBQUN6QyxnQkFBZ0IsbUJBQU8sQ0FBQywyRUFBc0I7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLEtBQUs7QUFDTDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7O0FBRUQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3MuanM/MjlmYiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcbnZhciBidWlsZFVSTCA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvYnVpbGRVUkwnKTtcbnZhciBJbnRlcmNlcHRvck1hbmFnZXIgPSByZXF1aXJlKCcuL0ludGVyY2VwdG9yTWFuYWdlcicpO1xudmFyIGRpc3BhdGNoUmVxdWVzdCA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hSZXF1ZXN0Jyk7XG52YXIgbWVyZ2VDb25maWcgPSByZXF1aXJlKCcuL21lcmdlQ29uZmlnJyk7XG52YXIgdmFsaWRhdG9yID0gcmVxdWlyZSgnLi4vaGVscGVycy92YWxpZGF0b3InKTtcblxudmFyIHZhbGlkYXRvcnMgPSB2YWxpZGF0b3IudmFsaWRhdG9ycztcbi8qKlxuICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlQ29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIEF4aW9zKGluc3RhbmNlQ29uZmlnKSB7XG4gIHRoaXMuZGVmYXVsdHMgPSBpbnN0YW5jZUNvbmZpZztcbiAgdGhpcy5pbnRlcmNlcHRvcnMgPSB7XG4gICAgcmVxdWVzdDogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpLFxuICAgIHJlc3BvbnNlOiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKClcbiAgfTtcbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcgc3BlY2lmaWMgZm9yIHRoaXMgcmVxdWVzdCAobWVyZ2VkIHdpdGggdGhpcy5kZWZhdWx0cylcbiAqL1xuQXhpb3MucHJvdG90eXBlLnJlcXVlc3QgPSBmdW5jdGlvbiByZXF1ZXN0KGNvbmZpZykge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgLy8gQWxsb3cgZm9yIGF4aW9zKCdleGFtcGxlL3VybCdbLCBjb25maWddKSBhIGxhIGZldGNoIEFQSVxuICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25maWcgPSBhcmd1bWVudHNbMV0gfHwge307XG4gICAgY29uZmlnLnVybCA9IGFyZ3VtZW50c1swXTtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcgPSBjb25maWcgfHwge307XG4gIH1cblxuICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuXG4gIC8vIFNldCBjb25maWcubWV0aG9kXG4gIGlmIChjb25maWcubWV0aG9kKSB7XG4gICAgY29uZmlnLm1ldGhvZCA9IGNvbmZpZy5tZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgfSBlbHNlIGlmICh0aGlzLmRlZmF1bHRzLm1ldGhvZCkge1xuICAgIGNvbmZpZy5tZXRob2QgPSB0aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICB9IGVsc2Uge1xuICAgIGNvbmZpZy5tZXRob2QgPSAnZ2V0JztcbiAgfVxuXG4gIHZhciB0cmFuc2l0aW9uYWwgPSBjb25maWcudHJhbnNpdGlvbmFsO1xuXG4gIGlmICh0cmFuc2l0aW9uYWwgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKHRyYW5zaXRpb25hbCwge1xuICAgICAgc2lsZW50SlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICBmb3JjZWRKU09OUGFyc2luZzogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKSxcbiAgICAgIGNsYXJpZnlUaW1lb3V0RXJyb3I6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbilcbiAgICB9LCBmYWxzZSk7XG4gIH1cblxuICAvLyBmaWx0ZXIgb3V0IHNraXBwZWQgaW50ZXJjZXB0b3JzXG4gIHZhciByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICB2YXIgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gdHJ1ZTtcbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBpbnRlcmNlcHRvci5ydW5XaGVuID09PSAnZnVuY3Rpb24nICYmIGludGVyY2VwdG9yLnJ1bldoZW4oY29uZmlnKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgPSBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3Iuc3luY2hyb25vdXM7XG5cbiAgICByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi51bnNoaWZ0KGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICB9KTtcblxuICB2YXIgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluID0gW107XG4gIHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24gcHVzaFJlc3BvbnNlSW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLnB1c2goaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gIH0pO1xuXG4gIHZhciBwcm9taXNlO1xuXG4gIGlmICghc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzKSB7XG4gICAgdmFyIGNoYWluID0gW2Rpc3BhdGNoUmVxdWVzdCwgdW5kZWZpbmVkXTtcblxuICAgIEFycmF5LnByb3RvdHlwZS51bnNoaWZ0LmFwcGx5KGNoYWluLCByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbik7XG4gICAgY2hhaW4gPSBjaGFpbi5jb25jYXQocmVzcG9uc2VJbnRlcmNlcHRvckNoYWluKTtcblxuICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKTtcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoKSB7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGNoYWluLnNoaWZ0KCksIGNoYWluLnNoaWZ0KCkpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cblxuICB2YXIgbmV3Q29uZmlnID0gY29uZmlnO1xuICB3aGlsZSAocmVxdWVzdEludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoKSB7XG4gICAgdmFyIG9uRnVsZmlsbGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4uc2hpZnQoKTtcbiAgICB2YXIgb25SZWplY3RlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLnNoaWZ0KCk7XG4gICAgdHJ5IHtcbiAgICAgIG5ld0NvbmZpZyA9IG9uRnVsZmlsbGVkKG5ld0NvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIG9uUmVqZWN0ZWQoZXJyb3IpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBwcm9taXNlID0gZGlzcGF0Y2hSZXF1ZXN0KG5ld0NvbmZpZyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgfVxuXG4gIHdoaWxlIChyZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoKSB7XG4gICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihyZXNwb25zZUludGVyY2VwdG9yQ2hhaW4uc2hpZnQoKSwgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLnNoaWZ0KCkpO1xuICB9XG5cbiAgcmV0dXJuIHByb21pc2U7XG59O1xuXG5BeGlvcy5wcm90b3R5cGUuZ2V0VXJpID0gZnVuY3Rpb24gZ2V0VXJpKGNvbmZpZykge1xuICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuICByZXR1cm4gYnVpbGRVUkwoY29uZmlnLnVybCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cXD8vLCAnJyk7XG59O1xuXG4vLyBQcm92aWRlIGFsaWFzZXMgZm9yIHN1cHBvcnRlZCByZXF1ZXN0IG1ldGhvZHNcbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucyddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kTm9EYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKHVybCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgdXJsOiB1cmwsXG4gICAgICBkYXRhOiAoY29uZmlnIHx8IHt9KS5kYXRhXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odXJsLCBkYXRhLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG1lcmdlQ29uZmlnKGNvbmZpZyB8fCB7fSwge1xuICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICB1cmw6IHVybCxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBeGlvcztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/Axios.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/core/InterceptorManager.js":
/*!***********************************************************!*\
  !*** ./node_modules/axios/lib/core/InterceptorManager.js ***!
  \***********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\n\nfunction InterceptorManager() {\n  this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected, options) {\n  this.handlers.push({\n    fulfilled: fulfilled,\n    rejected: rejected,\n    synchronous: options ? options.synchronous : false,\n    runWhen: options ? options.runWhen : null\n  });\n  return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n  if (this.handlers[id]) {\n    this.handlers[id] = null;\n  }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n  utils.forEach(this.handlers, function forEachHandler(h) {\n    if (h !== null) {\n      fn(h);\n    }\n  });\n};\n\nmodule.exports = InterceptorManager;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxxREFBWTs7QUFFaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFVBQVU7QUFDckI7QUFDQSxZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyLmpzP2M3OTIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIEludGVyY2VwdG9yTWFuYWdlcigpIHtcbiAgdGhpcy5oYW5kbGVycyA9IFtdO1xufVxuXG4vKipcbiAqIEFkZCBhIG5ldyBpbnRlcmNlcHRvciB0byB0aGUgc3RhY2tcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdWxmaWxsZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgdGhlbmAgZm9yIGEgYFByb21pc2VgXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3RlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGByZWplY3RgIGZvciBhIGBQcm9taXNlYFxuICpcbiAqIEByZXR1cm4ge051bWJlcn0gQW4gSUQgdXNlZCB0byByZW1vdmUgaW50ZXJjZXB0b3IgbGF0ZXJcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiB1c2UoZnVsZmlsbGVkLCByZWplY3RlZCwgb3B0aW9ucykge1xuICB0aGlzLmhhbmRsZXJzLnB1c2goe1xuICAgIGZ1bGZpbGxlZDogZnVsZmlsbGVkLFxuICAgIHJlamVjdGVkOiByZWplY3RlZCxcbiAgICBzeW5jaHJvbm91czogb3B0aW9ucyA/IG9wdGlvbnMuc3luY2hyb25vdXMgOiBmYWxzZSxcbiAgICBydW5XaGVuOiBvcHRpb25zID8gb3B0aW9ucy5ydW5XaGVuIDogbnVsbFxuICB9KTtcbiAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoIC0gMTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFuIGludGVyY2VwdG9yIGZyb20gdGhlIHN0YWNrXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGlkIFRoZSBJRCB0aGF0IHdhcyByZXR1cm5lZCBieSBgdXNlYFxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLmVqZWN0ID0gZnVuY3Rpb24gZWplY3QoaWQpIHtcbiAgaWYgKHRoaXMuaGFuZGxlcnNbaWRdKSB7XG4gICAgdGhpcy5oYW5kbGVyc1tpZF0gPSBudWxsO1xuICB9XG59O1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXG4gKlxuICogVGhpcyBtZXRob2QgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3Igc2tpcHBpbmcgb3ZlciBhbnlcbiAqIGludGVyY2VwdG9ycyB0aGF0IG1heSBoYXZlIGJlY29tZSBgbnVsbGAgY2FsbGluZyBgZWplY3RgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGludGVyY2VwdG9yXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIGZvckVhY2goZm4pIHtcbiAgdXRpbHMuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLCBmdW5jdGlvbiBmb3JFYWNoSGFuZGxlcihoKSB7XG4gICAgaWYgKGggIT09IG51bGwpIHtcbiAgICAgIGZuKGgpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEludGVyY2VwdG9yTWFuYWdlcjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/InterceptorManager.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/core/buildFullPath.js":
/*!******************************************************!*\
  !*** ./node_modules/axios/lib/core/buildFullPath.js ***!
  \******************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar isAbsoluteURL = __webpack_require__(/*! ../helpers/isAbsoluteURL */ \"./node_modules/axios/lib/helpers/isAbsoluteURL.js\");\nvar combineURLs = __webpack_require__(/*! ../helpers/combineURLs */ \"./node_modules/axios/lib/helpers/combineURLs.js\");\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n * @returns {string} The combined full path\n */\nmodule.exports = function buildFullPath(baseURL, requestedURL) {\n  if (baseURL && !isAbsoluteURL(requestedURL)) {\n    return combineURLs(baseURL, requestedURL);\n  }\n  return requestedURL;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvYnVpbGRGdWxsUGF0aC5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixvQkFBb0IsbUJBQU8sQ0FBQyxtRkFBMEI7QUFDdEQsa0JBQWtCLG1CQUFPLENBQUMsK0VBQXdCOztBQUVsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvYnVpbGRGdWxsUGF0aC5qcz9mMDJkIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGlzQWJzb2x1dGVVUkwgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwnKTtcbnZhciBjb21iaW5lVVJMcyA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvY29tYmluZVVSTHMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFVSTCBieSBjb21iaW5pbmcgdGhlIGJhc2VVUkwgd2l0aCB0aGUgcmVxdWVzdGVkVVJMLFxuICogb25seSB3aGVuIHRoZSByZXF1ZXN0ZWRVUkwgaXMgbm90IGFscmVhZHkgYW4gYWJzb2x1dGUgVVJMLlxuICogSWYgdGhlIHJlcXVlc3RVUkwgaXMgYWJzb2x1dGUsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVxdWVzdGVkVVJMIHVudG91Y2hlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZXF1ZXN0ZWRVUkwgQWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGNvbWJpbmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBmdWxsIHBhdGhcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBidWlsZEZ1bGxQYXRoKGJhc2VVUkwsIHJlcXVlc3RlZFVSTCkge1xuICBpZiAoYmFzZVVSTCAmJiAhaXNBYnNvbHV0ZVVSTChyZXF1ZXN0ZWRVUkwpKSB7XG4gICAgcmV0dXJuIGNvbWJpbmVVUkxzKGJhc2VVUkwsIHJlcXVlc3RlZFVSTCk7XG4gIH1cbiAgcmV0dXJuIHJlcXVlc3RlZFVSTDtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/buildFullPath.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/core/createError.js":
/*!****************************************************!*\
  !*** ./node_modules/axios/lib/core/createError.js ***!
  \****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar enhanceError = __webpack_require__(/*! ./enhanceError */ \"./node_modules/axios/lib/core/enhanceError.js\");\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n  var error = new Error(message);\n  return enhanceError(error, config, code, request, response);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvY3JlYXRlRXJyb3IuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsbUJBQW1CLG1CQUFPLENBQUMscUVBQWdCOztBQUUzQztBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2NyZWF0ZUVycm9yLmpzPzc3MGMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW5oYW5jZUVycm9yID0gcmVxdWlyZSgnLi9lbmhhbmNlRXJyb3InKTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIGNvbmZpZywgZXJyb3IgY29kZSwgcmVxdWVzdCBhbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlRXJyb3IobWVzc2FnZSwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBlbmhhbmNlRXJyb3IoZXJyb3IsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/createError.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/core/dispatchRequest.js":
/*!********************************************************!*\
  !*** ./node_modules/axios/lib/core/dispatchRequest.js ***!
  \********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\nvar transformData = __webpack_require__(/*! ./transformData */ \"./node_modules/axios/lib/core/transformData.js\");\nvar isCancel = __webpack_require__(/*! ../cancel/isCancel */ \"./node_modules/axios/lib/cancel/isCancel.js\");\nvar defaults = __webpack_require__(/*! ../defaults */ \"./node_modules/axios/lib/defaults.js\");\nvar Cancel = __webpack_require__(/*! ../cancel/Cancel */ \"./node_modules/axios/lib/cancel/Cancel.js\");\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n  if (config.cancelToken) {\n    config.cancelToken.throwIfRequested();\n  }\n\n  if (config.signal && config.signal.aborted) {\n    throw new Cancel('canceled');\n  }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n  throwIfCancellationRequested(config);\n\n  // Ensure headers exist\n  config.headers = config.headers || {};\n\n  // Transform request data\n  config.data = transformData.call(\n    config,\n    config.data,\n    config.headers,\n    config.transformRequest\n  );\n\n  // Flatten headers\n  config.headers = utils.merge(\n    config.headers.common || {},\n    config.headers[config.method] || {},\n    config.headers\n  );\n\n  utils.forEach(\n    ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n    function cleanHeaderConfig(method) {\n      delete config.headers[method];\n    }\n  );\n\n  var adapter = config.adapter || defaults.adapter;\n\n  return adapter(config).then(function onAdapterResolution(response) {\n    throwIfCancellationRequested(config);\n\n    // Transform response data\n    response.data = transformData.call(\n      config,\n      response.data,\n      response.headers,\n      config.transformResponse\n    );\n\n    return response;\n  }, function onAdapterRejection(reason) {\n    if (!isCancel(reason)) {\n      throwIfCancellationRequested(config);\n\n      // Transform response data\n      if (reason && reason.response) {\n        reason.response.data = transformData.call(\n          config,\n          reason.response.data,\n          reason.response.headers,\n          config.transformResponse\n        );\n      }\n    }\n\n    return Promise.reject(reason);\n  });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZGlzcGF0Y2hSZXF1ZXN0LmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxxREFBWTtBQUNoQyxvQkFBb0IsbUJBQU8sQ0FBQyx1RUFBaUI7QUFDN0MsZUFBZSxtQkFBTyxDQUFDLHVFQUFvQjtBQUMzQyxlQUFlLG1CQUFPLENBQUMseURBQWE7QUFDcEMsYUFBYSxtQkFBTyxDQUFDLG1FQUFrQjs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLHVDQUF1QztBQUN2QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZGlzcGF0Y2hSZXF1ZXN0LmpzPzRkYzkiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgdHJhbnNmb3JtRGF0YSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtRGF0YScpO1xudmFyIGlzQ2FuY2VsID0gcmVxdWlyZSgnLi4vY2FuY2VsL2lzQ2FuY2VsJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuLi9kZWZhdWx0cycpO1xudmFyIENhbmNlbCA9IHJlcXVpcmUoJy4uL2NhbmNlbC9DYW5jZWwnKTtcblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuc2lnbmFsICYmIGNvbmZpZy5zaWduYWwuYWJvcnRlZCkge1xuICAgIHRocm93IG5ldyBDYW5jZWwoJ2NhbmNlbGVkJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgY29uZmlndXJlZCBhZGFwdGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0KGNvbmZpZykge1xuICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgLy8gRW5zdXJlIGhlYWRlcnMgZXhpc3RcbiAgY29uZmlnLmhlYWRlcnMgPSBjb25maWcuaGVhZGVycyB8fCB7fTtcblxuICAvLyBUcmFuc2Zvcm0gcmVxdWVzdCBkYXRhXG4gIGNvbmZpZy5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgIGNvbmZpZyxcbiAgICBjb25maWcuZGF0YSxcbiAgICBjb25maWcuaGVhZGVycyxcbiAgICBjb25maWcudHJhbnNmb3JtUmVxdWVzdFxuICApO1xuXG4gIC8vIEZsYXR0ZW4gaGVhZGVyc1xuICBjb25maWcuaGVhZGVycyA9IHV0aWxzLm1lcmdlKFxuICAgIGNvbmZpZy5oZWFkZXJzLmNvbW1vbiB8fCB7fSxcbiAgICBjb25maWcuaGVhZGVyc1tjb25maWcubWV0aG9kXSB8fCB7fSxcbiAgICBjb25maWcuaGVhZGVyc1xuICApO1xuXG4gIHV0aWxzLmZvckVhY2goXG4gICAgWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnLCAnY29tbW9uJ10sXG4gICAgZnVuY3Rpb24gY2xlYW5IZWFkZXJDb25maWcobWV0aG9kKSB7XG4gICAgICBkZWxldGUgY29uZmlnLmhlYWRlcnNbbWV0aG9kXTtcbiAgICB9XG4gICk7XG5cbiAgdmFyIGFkYXB0ZXIgPSBjb25maWcuYWRhcHRlciB8fCBkZWZhdWx0cy5hZGFwdGVyO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgY29uZmlnLFxuICAgICAgcmVzcG9uc2UuZGF0YSxcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gIH0pO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/dispatchRequest.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/core/enhanceError.js":
/*!*****************************************************!*\
  !*** ./node_modules/axios/lib/core/enhanceError.js ***!
  \*****************************************************/
/***/ ((module) => {

"use strict";
eval("\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n  error.config = config;\n  if (code) {\n    error.code = code;\n  }\n\n  error.request = request;\n  error.response = response;\n  error.isAxiosError = true;\n\n  error.toJSON = function toJSON() {\n    return {\n      // Standard\n      message: this.message,\n      name: this.name,\n      // Microsoft\n      description: this.description,\n      number: this.number,\n      // Mozilla\n      fileName: this.fileName,\n      lineNumber: this.lineNumber,\n      columnNumber: this.columnNumber,\n      stack: this.stack,\n      // Axios\n      config: this.config,\n      code: this.code,\n      status: this.response && this.response.status ? this.response.status : null\n    };\n  };\n  return error;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZW5oYW5jZUVycm9yLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2VuaGFuY2VFcnJvci5qcz8wZGYzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVcGRhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmZpZywgZXJyb3IgY29kZSwgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIFRoZSBlcnJvciB0byB1cGRhdGUuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGVycm9yLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVuaGFuY2VFcnJvcihlcnJvciwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICBlcnJvci5jb25maWcgPSBjb25maWc7XG4gIGlmIChjb2RlKSB7XG4gICAgZXJyb3IuY29kZSA9IGNvZGU7XG4gIH1cblxuICBlcnJvci5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgZXJyb3IucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgZXJyb3IuaXNBeGlvc0Vycm9yID0gdHJ1ZTtcblxuICBlcnJvci50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0YW5kYXJkXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAvLyBNaWNyb3NvZnRcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLFxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlcixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgLy8gQXhpb3NcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBjb2RlOiB0aGlzLmNvZGUsXG4gICAgICBzdGF0dXM6IHRoaXMucmVzcG9uc2UgJiYgdGhpcy5yZXNwb25zZS5zdGF0dXMgPyB0aGlzLnJlc3BvbnNlLnN0YXR1cyA6IG51bGxcbiAgICB9O1xuICB9O1xuICByZXR1cm4gZXJyb3I7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/enhanceError.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/core/mergeConfig.js":
/*!****************************************************!*\
  !*** ./node_modules/axios/lib/core/mergeConfig.js ***!
  \****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ../utils */ \"./node_modules/axios/lib/utils.js\");\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n * @returns {Object} New object resulting from merging config2 to config1\n */\nmodule.exports = function mergeConfig(config1, config2) {\n  // eslint-disable-next-line no-param-reassign\n  config2 = config2 || {};\n  var config = {};\n\n  function getMergedValue(target, source) {\n    if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n      return utils.merge(target, source);\n    } else if (utils.isPlainObject(source)) {\n      return utils.merge({}, source);\n    } else if (utils.isArray(source)) {\n      return source.slice();\n    }\n    return source;\n  }\n\n  // eslint-disable-next-line consistent-return\n  function mergeDeepProperties(prop) {\n    if (!utils.isUndefined(config2[prop])) {\n      return getMergedValue(config1[prop], config2[prop]);\n    } else if (!utils.isUndefined(config1[prop])) {\n      return getMergedValue(undefined, config1[prop]);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function valueFromConfig2(prop) {\n    if (!utils.isUndefined(config2[prop])) {\n      return getMergedValue(undefined, config2[prop]);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function defaultToConfig2(prop) {\n    if (!utils.isUndefined(config2[prop])) {\n      return getMergedValue(undefined, config2[prop]);\n    } else if (!utils.isUndefined(config1[prop])) {\n      return getMergedValue(undefined, config1[prop]);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function mergeDirectKeys(prop) {\n    if (prop in config2) {\n      return getMergedValue(config1[prop], config2[prop]);\n    } else if (prop in config1) {\n      return getMergedValue(undefined, config1[prop]);\n    }\n  }\n\n  var mergeMap = {\n    'url': valueFromConfig2,\n    'method': valueFromConfig2,\n    'data': valueFromConfig2,\n    'baseURL': defaultToConfig2,\n    'transformRequest': defaultToConfig2,\n    'transformResponse': defaultToConfig2,\n    'paramsSerializer': defaultToConfig2,\n    'timeout': defaultToConfig2,\n    'timeoutMessage': defaultToConfig2,\n    'withCredentials': defaultToConfig2,\n    'adapter': defaultToConfig2,\n    'responseType': defaultToConfig2,\n    'xsrfCookieName': defaultToConfig2,\n    'xsrfHeaderName': defaultToConfig2,\n    'onUploadProgress': defaultToConfig2,\n    'onDownloadProgress': defaultToConfig2,\n    'decompress': defaultToConfig2,\n    'maxContentLength': defaultToConfig2,\n    'maxBodyLength': defaultToConfig2,\n    'transport': defaultToConfig2,\n    'httpAgent': defaultToConfig2,\n    'httpsAgent': defaultToConfig2,\n    'cancelToken': defaultToConfig2,\n    'socketPath': defaultToConfig2,\n    'responseEncoding': defaultToConfig2,\n    'validateStatus': mergeDirectKeys\n  };\n\n  utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {\n    var merge = mergeMap[prop] || mergeDeepProperties;\n    var configValue = merge(prop);\n    (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n  });\n\n  return config;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvbWVyZ2VDb25maWcuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLG1EQUFVOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDJCQUEyQjtBQUMzQixNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL21lcmdlQ29uZmlnLmpzP2JkMTMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG4vKipcbiAqIENvbmZpZy1zcGVjaWZpYyBtZXJnZS1mdW5jdGlvbiB3aGljaCBjcmVhdGVzIGEgbmV3IGNvbmZpZy1vYmplY3RcbiAqIGJ5IG1lcmdpbmcgdHdvIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB0b2dldGhlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMVxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzJcbiAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBvYmplY3QgcmVzdWx0aW5nIGZyb20gbWVyZ2luZyBjb25maWcyIHRvIGNvbmZpZzFcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtZXJnZUNvbmZpZyhjb25maWcxLCBjb25maWcyKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBjb25maWcyID0gY29uZmlnMiB8fCB7fTtcbiAgdmFyIGNvbmZpZyA9IHt9O1xuXG4gIGZ1bmN0aW9uIGdldE1lcmdlZFZhbHVlKHRhcmdldCwgc291cmNlKSB7XG4gICAgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3QodGFyZ2V0KSAmJiB1dGlscy5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB1dGlscy5tZXJnZSh0YXJnZXQsIHNvdXJjZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB1dGlscy5tZXJnZSh7fSwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzLmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHNvdXJjZS5zbGljZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIG1lcmdlRGVlcFByb3BlcnRpZXMocHJvcCkge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoY29uZmlnMltwcm9wXSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZShjb25maWcxW3Byb3BdLCBjb25maWcyW3Byb3BdKTtcbiAgICB9IGVsc2UgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChjb25maWcxW3Byb3BdKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgY29uZmlnMVtwcm9wXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIHZhbHVlRnJvbUNvbmZpZzIocHJvcCkge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoY29uZmlnMltwcm9wXSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGNvbmZpZzJbcHJvcF0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBkZWZhdWx0VG9Db25maWcyKHByb3ApIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZzJbcHJvcF0pKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBjb25maWcyW3Byb3BdKTtcbiAgICB9IGVsc2UgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChjb25maWcxW3Byb3BdKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgY29uZmlnMVtwcm9wXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIG1lcmdlRGlyZWN0S2V5cyhwcm9wKSB7XG4gICAgaWYgKHByb3AgaW4gY29uZmlnMikge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKGNvbmZpZzFbcHJvcF0sIGNvbmZpZzJbcHJvcF0pO1xuICAgIH0gZWxzZSBpZiAocHJvcCBpbiBjb25maWcxKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBjb25maWcxW3Byb3BdKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbWVyZ2VNYXAgPSB7XG4gICAgJ3VybCc6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgJ21ldGhvZCc6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgJ2RhdGEnOiB2YWx1ZUZyb21Db25maWcyLFxuICAgICdiYXNlVVJMJzogZGVmYXVsdFRvQ29uZmlnMixcbiAgICAndHJhbnNmb3JtUmVxdWVzdCc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ3RyYW5zZm9ybVJlc3BvbnNlJzogZGVmYXVsdFRvQ29uZmlnMixcbiAgICAncGFyYW1zU2VyaWFsaXplcic6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ3RpbWVvdXQnOiBkZWZhdWx0VG9Db25maWcyLFxuICAgICd0aW1lb3V0TWVzc2FnZSc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ3dpdGhDcmVkZW50aWFscyc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ2FkYXB0ZXInOiBkZWZhdWx0VG9Db25maWcyLFxuICAgICdyZXNwb25zZVR5cGUnOiBkZWZhdWx0VG9Db25maWcyLFxuICAgICd4c3JmQ29va2llTmFtZSc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ3hzcmZIZWFkZXJOYW1lJzogZGVmYXVsdFRvQ29uZmlnMixcbiAgICAnb25VcGxvYWRQcm9ncmVzcyc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ29uRG93bmxvYWRQcm9ncmVzcyc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ2RlY29tcHJlc3MnOiBkZWZhdWx0VG9Db25maWcyLFxuICAgICdtYXhDb250ZW50TGVuZ3RoJzogZGVmYXVsdFRvQ29uZmlnMixcbiAgICAnbWF4Qm9keUxlbmd0aCc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ3RyYW5zcG9ydCc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ2h0dHBBZ2VudCc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ2h0dHBzQWdlbnQnOiBkZWZhdWx0VG9Db25maWcyLFxuICAgICdjYW5jZWxUb2tlbic6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgJ3NvY2tldFBhdGgnOiBkZWZhdWx0VG9Db25maWcyLFxuICAgICdyZXNwb25zZUVuY29kaW5nJzogZGVmYXVsdFRvQ29uZmlnMixcbiAgICAndmFsaWRhdGVTdGF0dXMnOiBtZXJnZURpcmVjdEtleXNcbiAgfTtcblxuICB1dGlscy5mb3JFYWNoKE9iamVjdC5rZXlzKGNvbmZpZzEpLmNvbmNhdChPYmplY3Qua2V5cyhjb25maWcyKSksIGZ1bmN0aW9uIGNvbXB1dGVDb25maWdWYWx1ZShwcm9wKSB7XG4gICAgdmFyIG1lcmdlID0gbWVyZ2VNYXBbcHJvcF0gfHwgbWVyZ2VEZWVwUHJvcGVydGllcztcbiAgICB2YXIgY29uZmlnVmFsdWUgPSBtZXJnZShwcm9wKTtcbiAgICAodXRpbHMuaXNVbmRlZmluZWQoY29uZmlnVmFsdWUpICYmIG1lcmdlICE9PSBtZXJnZURpcmVjdEtleXMpIHx8IChjb25maWdbcHJvcF0gPSBjb25maWdWYWx1ZSk7XG4gIH0pO1xuXG4gIHJldHVybiBjb25maWc7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/mergeConfig.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/core/settle.js":
/*!***********************************************!*\
  !*** ./node_modules/axios/lib/core/settle.js ***!
  \***********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar createError = __webpack_require__(/*! ./createError */ \"./node_modules/axios/lib/core/createError.js\");\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n  var validateStatus = response.config.validateStatus;\n  if (!response.status || !validateStatus || validateStatus(response.status)) {\n    resolve(response);\n  } else {\n    reject(createError(\n      'Request failed with status code ' + response.status,\n      response.config,\n      null,\n      response.request,\n      response\n    ));\n  }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvc2V0dGxlLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLGtCQUFrQixtQkFBTyxDQUFDLG1FQUFlOztBQUV6QztBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9zZXR0bGUuanM/ODc2OCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJy4vY3JlYXRlRXJyb3InKTtcblxuLyoqXG4gKiBSZXNvbHZlIG9yIHJlamVjdCBhIFByb21pc2UgYmFzZWQgb24gcmVzcG9uc2Ugc3RhdHVzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xuICB2YXIgdmFsaWRhdGVTdGF0dXMgPSByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXM7XG4gIGlmICghcmVzcG9uc2Uuc3RhdHVzIHx8ICF2YWxpZGF0ZVN0YXR1cyB8fCB2YWxpZGF0ZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVqZWN0KGNyZWF0ZUVycm9yKFxuICAgICAgJ1JlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHJlc3BvbnNlLmNvbmZpZyxcbiAgICAgIG51bGwsXG4gICAgICByZXNwb25zZS5yZXF1ZXN0LFxuICAgICAgcmVzcG9uc2VcbiAgICApKTtcbiAgfVxufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/settle.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/core/transformData.js":
/*!******************************************************!*\
  !*** ./node_modules/axios/lib/core/transformData.js ***!
  \******************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\nvar defaults = __webpack_require__(/*! ./../defaults */ \"./node_modules/axios/lib/defaults.js\");\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n  var context = this || defaults;\n  /*eslint no-param-reassign:0*/\n  utils.forEach(fns, function transform(fn) {\n    data = fn.call(context, data, headers);\n  });\n\n  return data;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvdHJhbnNmb3JtRGF0YS5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixZQUFZLG1CQUFPLENBQUMscURBQVk7QUFDaEMsZUFBZSxtQkFBTyxDQUFDLDJEQUFlOztBQUV0QztBQUNBO0FBQ0E7QUFDQSxXQUFXLGVBQWU7QUFDMUIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsZ0JBQWdCO0FBQzNCLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvdHJhbnNmb3JtRGF0YS5qcz83NjYyIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi8uLi9kZWZhdWx0cycpO1xuXG4vKipcbiAqIFRyYW5zZm9ybSB0aGUgZGF0YSBmb3IgYSByZXF1ZXN0IG9yIGEgcmVzcG9uc2VcbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IGRhdGEgVGhlIGRhdGEgdG8gYmUgdHJhbnNmb3JtZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGhlYWRlcnMgVGhlIGhlYWRlcnMgZm9yIHRoZSByZXF1ZXN0IG9yIHJlc3BvbnNlXG4gKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufSBmbnMgQSBzaW5nbGUgZnVuY3Rpb24gb3IgQXJyYXkgb2YgZnVuY3Rpb25zXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBkYXRhXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdHJhbnNmb3JtRGF0YShkYXRhLCBoZWFkZXJzLCBmbnMpIHtcbiAgdmFyIGNvbnRleHQgPSB0aGlzIHx8IGRlZmF1bHRzO1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgdXRpbHMuZm9yRWFjaChmbnMsIGZ1bmN0aW9uIHRyYW5zZm9ybShmbikge1xuICAgIGRhdGEgPSBmbi5jYWxsKGNvbnRleHQsIGRhdGEsIGhlYWRlcnMpO1xuICB9KTtcblxuICByZXR1cm4gZGF0YTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/transformData.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/defaults.js":
/*!********************************************!*\
  !*** ./node_modules/axios/lib/defaults.js ***!
  \********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("/* provided dependency */ var process = __webpack_require__(/*! process/browser.js */ \"./node_modules/process/browser.js\");\n\n\nvar utils = __webpack_require__(/*! ./utils */ \"./node_modules/axios/lib/utils.js\");\nvar normalizeHeaderName = __webpack_require__(/*! ./helpers/normalizeHeaderName */ \"./node_modules/axios/lib/helpers/normalizeHeaderName.js\");\nvar enhanceError = __webpack_require__(/*! ./core/enhanceError */ \"./node_modules/axios/lib/core/enhanceError.js\");\n\nvar DEFAULT_CONTENT_TYPE = {\n  'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n  if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n    headers['Content-Type'] = value;\n  }\n}\n\nfunction getDefaultAdapter() {\n  var adapter;\n  if (typeof XMLHttpRequest !== 'undefined') {\n    // For browsers use XHR adapter\n    adapter = __webpack_require__(/*! ./adapters/xhr */ \"./node_modules/axios/lib/adapters/xhr.js\");\n  } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\n    // For node use HTTP adapter\n    adapter = __webpack_require__(/*! ./adapters/http */ \"./node_modules/axios/lib/adapters/xhr.js\");\n  }\n  return adapter;\n}\n\nfunction stringifySafely(rawValue, parser, encoder) {\n  if (utils.isString(rawValue)) {\n    try {\n      (parser || JSON.parse)(rawValue);\n      return utils.trim(rawValue);\n    } catch (e) {\n      if (e.name !== 'SyntaxError') {\n        throw e;\n      }\n    }\n  }\n\n  return (encoder || JSON.stringify)(rawValue);\n}\n\nvar defaults = {\n\n  transitional: {\n    silentJSONParsing: true,\n    forcedJSONParsing: true,\n    clarifyTimeoutError: false\n  },\n\n  adapter: getDefaultAdapter(),\n\n  transformRequest: [function transformRequest(data, headers) {\n    normalizeHeaderName(headers, 'Accept');\n    normalizeHeaderName(headers, 'Content-Type');\n\n    if (utils.isFormData(data) ||\n      utils.isArrayBuffer(data) ||\n      utils.isBuffer(data) ||\n      utils.isStream(data) ||\n      utils.isFile(data) ||\n      utils.isBlob(data)\n    ) {\n      return data;\n    }\n    if (utils.isArrayBufferView(data)) {\n      return data.buffer;\n    }\n    if (utils.isURLSearchParams(data)) {\n      setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n      return data.toString();\n    }\n    if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) {\n      setContentTypeIfUnset(headers, 'application/json');\n      return stringifySafely(data);\n    }\n    return data;\n  }],\n\n  transformResponse: [function transformResponse(data) {\n    var transitional = this.transitional || defaults.transitional;\n    var silentJSONParsing = transitional && transitional.silentJSONParsing;\n    var forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n    var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';\n\n    if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {\n      try {\n        return JSON.parse(data);\n      } catch (e) {\n        if (strictJSONParsing) {\n          if (e.name === 'SyntaxError') {\n            throw enhanceError(e, this, 'E_JSON_PARSE');\n          }\n          throw e;\n        }\n      }\n    }\n\n    return data;\n  }],\n\n  /**\n   * A timeout in milliseconds to abort a request. If set to 0 (default) a\n   * timeout is not created.\n   */\n  timeout: 0,\n\n  xsrfCookieName: 'XSRF-TOKEN',\n  xsrfHeaderName: 'X-XSRF-TOKEN',\n\n  maxContentLength: -1,\n  maxBodyLength: -1,\n\n  validateStatus: function validateStatus(status) {\n    return status >= 200 && status < 300;\n  },\n\n  headers: {\n    common: {\n      'Accept': 'application/json, text/plain, */*'\n    }\n  }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n  defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n  defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzLmpzLmpzIiwibWFwcGluZ3MiOiI7QUFBYTs7QUFFYixZQUFZLG1CQUFPLENBQUMsa0RBQVM7QUFDN0IsMEJBQTBCLG1CQUFPLENBQUMsOEZBQStCO0FBQ2pFLG1CQUFtQixtQkFBTyxDQUFDLDBFQUFxQjs7QUFFaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLG1CQUFPLENBQUMsZ0VBQWdCO0FBQ3RDLElBQUksZ0JBQWdCLE9BQU8sbURBQW1ELE9BQU87QUFDckY7QUFDQSxjQUFjLG1CQUFPLENBQUMsaUVBQWlCO0FBQ3ZDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLENBQUM7O0FBRUQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzLmpzP2UyMjEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgbm9ybWFsaXplSGVhZGVyTmFtZSA9IHJlcXVpcmUoJy4vaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lJyk7XG52YXIgZW5oYW5jZUVycm9yID0gcmVxdWlyZSgnLi9jb3JlL2VuaGFuY2VFcnJvcicpO1xuXG52YXIgREVGQVVMVF9DT05URU5UX1RZUEUgPSB7XG4gICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xufTtcblxuZnVuY3Rpb24gc2V0Q29udGVudFR5cGVJZlVuc2V0KGhlYWRlcnMsIHZhbHVlKSB7XG4gIGlmICghdXRpbHMuaXNVbmRlZmluZWQoaGVhZGVycykgJiYgdXRpbHMuaXNVbmRlZmluZWQoaGVhZGVyc1snQ29udGVudC1UeXBlJ10pKSB7XG4gICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSB2YWx1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0QWRhcHRlcigpIHtcbiAgdmFyIGFkYXB0ZXI7XG4gIGlmICh0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gRm9yIGJyb3dzZXJzIHVzZSBYSFIgYWRhcHRlclxuICAgIGFkYXB0ZXIgPSByZXF1aXJlKCcuL2FkYXB0ZXJzL3hocicpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJykge1xuICAgIC8vIEZvciBub2RlIHVzZSBIVFRQIGFkYXB0ZXJcbiAgICBhZGFwdGVyID0gcmVxdWlyZSgnLi9hZGFwdGVycy9odHRwJyk7XG4gIH1cbiAgcmV0dXJuIGFkYXB0ZXI7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVNhZmVseShyYXdWYWx1ZSwgcGFyc2VyLCBlbmNvZGVyKSB7XG4gIGlmICh1dGlscy5pc1N0cmluZyhyYXdWYWx1ZSkpIHtcbiAgICB0cnkge1xuICAgICAgKHBhcnNlciB8fCBKU09OLnBhcnNlKShyYXdWYWx1ZSk7XG4gICAgICByZXR1cm4gdXRpbHMudHJpbShyYXdWYWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUubmFtZSAhPT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoZW5jb2RlciB8fCBKU09OLnN0cmluZ2lmeSkocmF3VmFsdWUpO1xufVxuXG52YXIgZGVmYXVsdHMgPSB7XG5cbiAgdHJhbnNpdGlvbmFsOiB7XG4gICAgc2lsZW50SlNPTlBhcnNpbmc6IHRydWUsXG4gICAgZm9yY2VkSlNPTlBhcnNpbmc6IHRydWUsXG4gICAgY2xhcmlmeVRpbWVvdXRFcnJvcjogZmFsc2VcbiAgfSxcblxuICBhZGFwdGVyOiBnZXREZWZhdWx0QWRhcHRlcigpLFxuXG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXF1ZXN0KGRhdGEsIGhlYWRlcnMpIHtcbiAgICBub3JtYWxpemVIZWFkZXJOYW1lKGhlYWRlcnMsICdBY2NlcHQnKTtcbiAgICBub3JtYWxpemVIZWFkZXJOYW1lKGhlYWRlcnMsICdDb250ZW50LVR5cGUnKTtcblxuICAgIGlmICh1dGlscy5pc0Zvcm1EYXRhKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0FycmF5QnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0J1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNTdHJlYW0oZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzRmlsZShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCbG9iKGRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXJWaWV3KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhkYXRhKSkge1xuICAgICAgc2V0Q29udGVudFR5cGVJZlVuc2V0KGhlYWRlcnMsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCcpO1xuICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzT2JqZWN0KGRhdGEpIHx8IChoZWFkZXJzICYmIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID09PSAnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgICBzZXRDb250ZW50VHlwZUlmVW5zZXQoaGVhZGVycywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgIHJldHVybiBzdHJpbmdpZnlTYWZlbHkoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICB0cmFuc2Zvcm1SZXNwb25zZTogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlc3BvbnNlKGRhdGEpIHtcbiAgICB2YXIgdHJhbnNpdGlvbmFsID0gdGhpcy50cmFuc2l0aW9uYWwgfHwgZGVmYXVsdHMudHJhbnNpdGlvbmFsO1xuICAgIHZhciBzaWxlbnRKU09OUGFyc2luZyA9IHRyYW5zaXRpb25hbCAmJiB0cmFuc2l0aW9uYWwuc2lsZW50SlNPTlBhcnNpbmc7XG4gICAgdmFyIGZvcmNlZEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5mb3JjZWRKU09OUGFyc2luZztcbiAgICB2YXIgc3RyaWN0SlNPTlBhcnNpbmcgPSAhc2lsZW50SlNPTlBhcnNpbmcgJiYgdGhpcy5yZXNwb25zZVR5cGUgPT09ICdqc29uJztcblxuICAgIGlmIChzdHJpY3RKU09OUGFyc2luZyB8fCAoZm9yY2VkSlNPTlBhcnNpbmcgJiYgdXRpbHMuaXNTdHJpbmcoZGF0YSkgJiYgZGF0YS5sZW5ndGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHN0cmljdEpTT05QYXJzaW5nKSB7XG4gICAgICAgICAgaWYgKGUubmFtZSA9PT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICAgICAgdGhyb3cgZW5oYW5jZUVycm9yKGUsIHRoaXMsICdFX0pTT05fUEFSU0UnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICAvKipcbiAgICogQSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBhYm9ydCBhIHJlcXVlc3QuIElmIHNldCB0byAwIChkZWZhdWx0KSBhXG4gICAqIHRpbWVvdXQgaXMgbm90IGNyZWF0ZWQuXG4gICAqL1xuICB0aW1lb3V0OiAwLFxuXG4gIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG4gIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJyxcblxuICBtYXhDb250ZW50TGVuZ3RoOiAtMSxcbiAgbWF4Qm9keUxlbmd0aDogLTEsXG5cbiAgdmFsaWRhdGVTdGF0dXM6IGZ1bmN0aW9uIHZhbGlkYXRlU3RhdHVzKHN0YXR1cykge1xuICAgIHJldHVybiBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMDtcbiAgfSxcblxuICBoZWFkZXJzOiB7XG4gICAgY29tbW9uOiB7XG4gICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKidcbiAgICB9XG4gIH1cbn07XG5cbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0ge307XG59KTtcblxudXRpbHMuZm9yRWFjaChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2RXaXRoRGF0YShtZXRob2QpIHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0gdXRpbHMubWVyZ2UoREVGQVVMVF9DT05URU5UX1RZUEUpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHM7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/defaults.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/env/data.js":
/*!********************************************!*\
  !*** ./node_modules/axios/lib/env/data.js ***!
  \********************************************/
/***/ ((module) => {

eval("module.exports = {\n  \"version\": \"0.24.0\"\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2Vudi9kYXRhLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvZW52L2RhdGEuanM/MTEwZiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgXCJ2ZXJzaW9uXCI6IFwiMC4yNC4wXCJcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/env/data.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/helpers/bind.js":
/*!************************************************!*\
  !*** ./node_modules/axios/lib/helpers/bind.js ***!
  \************************************************/
/***/ ((module) => {

"use strict";
eval("\n\nmodule.exports = function bind(fn, thisArg) {\n  return function wrap() {\n    var args = new Array(arguments.length);\n    for (var i = 0; i < args.length; i++) {\n      args[i] = arguments[i];\n    }\n    return fn.apply(thisArg, args);\n  };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qcz80YmVhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKGZuLCB0aGlzQXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICB9O1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/bind.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/helpers/buildURL.js":
/*!****************************************************!*\
  !*** ./node_modules/axios/lib/helpers/buildURL.js ***!
  \****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\n\nfunction encode(val) {\n  return encodeURIComponent(val).\n    replace(/%3A/gi, ':').\n    replace(/%24/g, '$').\n    replace(/%2C/gi, ',').\n    replace(/%20/g, '+').\n    replace(/%5B/gi, '[').\n    replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n  /*eslint no-param-reassign:0*/\n  if (!params) {\n    return url;\n  }\n\n  var serializedParams;\n  if (paramsSerializer) {\n    serializedParams = paramsSerializer(params);\n  } else if (utils.isURLSearchParams(params)) {\n    serializedParams = params.toString();\n  } else {\n    var parts = [];\n\n    utils.forEach(params, function serialize(val, key) {\n      if (val === null || typeof val === 'undefined') {\n        return;\n      }\n\n      if (utils.isArray(val)) {\n        key = key + '[]';\n      } else {\n        val = [val];\n      }\n\n      utils.forEach(val, function parseValue(v) {\n        if (utils.isDate(v)) {\n          v = v.toISOString();\n        } else if (utils.isObject(v)) {\n          v = JSON.stringify(v);\n        }\n        parts.push(encode(key) + '=' + encode(v));\n      });\n    });\n\n    serializedParams = parts.join('&');\n  }\n\n  if (serializedParams) {\n    var hashmarkIndex = url.indexOf('#');\n    if (hashmarkIndex !== -1) {\n      url = url.slice(0, hashmarkIndex);\n    }\n\n    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n  }\n\n  return url;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLHFEQUFZOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanM/YzE3OCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gZW5jb2RlKHZhbCkge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbCkuXG4gICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLlxuICAgIHJlcGxhY2UoLyUyNC9nLCAnJCcpLlxuICAgIHJlcGxhY2UoLyUyQy9naSwgJywnKS5cbiAgICByZXBsYWNlKC8lMjAvZywgJysnKS5cbiAgICByZXBsYWNlKC8lNUIvZ2ksICdbJykuXG4gICAgcmVwbGFjZSgvJTVEL2dpLCAnXScpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGJhc2Ugb2YgdGhlIHVybCAoZS5nLiwgaHR0cDovL3d3dy5nb29nbGUuY29tKVxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgdXJsXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIHBhcmFtc1NlcmlhbGl6ZXIpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIHZhciBzZXJpYWxpemVkUGFyYW1zO1xuICBpZiAocGFyYW1zU2VyaWFsaXplcikge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXNTZXJpYWxpemVyKHBhcmFtcyk7XG4gIH0gZWxzZSBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSkge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcGFydHMgPSBbXTtcblxuICAgIHV0aWxzLmZvckVhY2gocGFyYW1zLCBmdW5jdGlvbiBzZXJpYWxpemUodmFsLCBrZXkpIHtcbiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodXRpbHMuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIGtleSA9IGtleSArICdbXSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSBbdmFsXTtcbiAgICAgIH1cblxuICAgICAgdXRpbHMuZm9yRWFjaCh2YWwsIGZ1bmN0aW9uIHBhcnNlVmFsdWUodikge1xuICAgICAgICBpZiAodXRpbHMuaXNEYXRlKHYpKSB7XG4gICAgICAgICAgdiA9IHYudG9JU09TdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIGlmICh1dGlscy5pc09iamVjdCh2KSkge1xuICAgICAgICAgIHYgPSBKU09OLnN0cmluZ2lmeSh2KTtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0cy5wdXNoKGVuY29kZShrZXkpICsgJz0nICsgZW5jb2RlKHYpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcnRzLmpvaW4oJyYnKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgdmFyIGhhc2htYXJrSW5kZXggPSB1cmwuaW5kZXhPZignIycpO1xuICAgIGlmIChoYXNobWFya0luZGV4ICE9PSAtMSkge1xuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2htYXJrSW5kZXgpO1xuICAgIH1cblxuICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgc2VyaWFsaXplZFBhcmFtcztcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/buildURL.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/helpers/combineURLs.js":
/*!*******************************************************!*\
  !*** ./node_modules/axios/lib/helpers/combineURLs.js ***!
  \*******************************************************/
/***/ ((module) => {

"use strict";
eval("\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n  return relativeURL\n    ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n    : baseURL;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tYmluZVVSTHMuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2NvbWJpbmVVUkxzLmpzPzZiYzYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgc3BlY2lmaWVkIFVSTHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVVSTCBUaGUgcmVsYXRpdmUgVVJMXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgVVJMXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVsYXRpdmVVUkwpIHtcbiAgcmV0dXJuIHJlbGF0aXZlVVJMXG4gICAgPyBiYXNlVVJMLnJlcGxhY2UoL1xcLyskLywgJycpICsgJy8nICsgcmVsYXRpdmVVUkwucmVwbGFjZSgvXlxcLysvLCAnJylcbiAgICA6IGJhc2VVUkw7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/combineURLs.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/helpers/cookies.js":
/*!***************************************************!*\
  !*** ./node_modules/axios/lib/helpers/cookies.js ***!
  \***************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\n\nmodule.exports = (\n  utils.isStandardBrowserEnv() ?\n\n  // Standard browser envs support document.cookie\n    (function standardBrowserEnv() {\n      return {\n        write: function write(name, value, expires, path, domain, secure) {\n          var cookie = [];\n          cookie.push(name + '=' + encodeURIComponent(value));\n\n          if (utils.isNumber(expires)) {\n            cookie.push('expires=' + new Date(expires).toGMTString());\n          }\n\n          if (utils.isString(path)) {\n            cookie.push('path=' + path);\n          }\n\n          if (utils.isString(domain)) {\n            cookie.push('domain=' + domain);\n          }\n\n          if (secure === true) {\n            cookie.push('secure');\n          }\n\n          document.cookie = cookie.join('; ');\n        },\n\n        read: function read(name) {\n          var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n          return (match ? decodeURIComponent(match[3]) : null);\n        },\n\n        remove: function remove(name) {\n          this.write(name, '', Date.now() - 86400000);\n        }\n      };\n    })() :\n\n  // Non standard browser env (web workers, react-native) lack needed support.\n    (function nonStandardBrowserEnv() {\n      return {\n        write: function write() {},\n        read: function read() { return null; },\n        remove: function remove() {}\n      };\n    })()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29va2llcy5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixZQUFZLG1CQUFPLENBQUMscURBQVk7O0FBRWhDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwyQ0FBMkM7QUFDM0MsU0FBUzs7QUFFVDtBQUNBLDREQUE0RCx3QkFBd0I7QUFDcEY7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEMsZ0NBQWdDLGNBQWM7QUFDOUM7QUFDQTtBQUNBLEtBQUs7QUFDTCIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb29raWVzLmpzPzFkM2YiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKFxuICB1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgc3VwcG9ydCBkb2N1bWVudC5jb29raWVcbiAgICAoZnVuY3Rpb24gc3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd3JpdGU6IGZ1bmN0aW9uIHdyaXRlKG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSkge1xuICAgICAgICAgIHZhciBjb29raWUgPSBbXTtcbiAgICAgICAgICBjb29raWUucHVzaChuYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XG5cbiAgICAgICAgICBpZiAodXRpbHMuaXNOdW1iZXIoZXhwaXJlcykpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdleHBpcmVzPScgKyBuZXcgRGF0ZShleHBpcmVzKS50b0dNVFN0cmluZygpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodXRpbHMuaXNTdHJpbmcocGF0aCkpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdwYXRoPScgKyBwYXRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodXRpbHMuaXNTdHJpbmcoZG9tYWluKSkge1xuICAgICAgICAgICAgY29va2llLnB1c2goJ2RvbWFpbj0nICsgZG9tYWluKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2VjdXJlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb29raWUucHVzaCgnc2VjdXJlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llLmpvaW4oJzsgJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVhZDogZnVuY3Rpb24gcmVhZChuYW1lKSB7XG4gICAgICAgICAgdmFyIG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoJyhefDtcXFxccyopKCcgKyBuYW1lICsgJyk9KFteO10qKScpKTtcbiAgICAgICAgICByZXR1cm4gKG1hdGNoID8gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzNdKSA6IG51bGwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKG5hbWUpIHtcbiAgICAgICAgICB0aGlzLndyaXRlKG5hbWUsICcnLCBEYXRlLm5vdygpIC0gODY0MDAwMDApO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pKCkgOlxuXG4gIC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudiAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgICAoZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd3JpdGU6IGZ1bmN0aW9uIHdyaXRlKCkge30sXG4gICAgICAgIHJlYWQ6IGZ1bmN0aW9uIHJlYWQoKSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG4gICAgICB9O1xuICAgIH0pKClcbik7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/cookies.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/helpers/isAbsoluteURL.js":
/*!*********************************************************!*\
  !*** ./node_modules/axios/lib/helpers/isAbsoluteURL.js ***!
  \*********************************************************/
/***/ ((module) => {

"use strict";
eval("\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n  // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n  // by any combination of letters, digits, plus, period, or hyphen.\n  return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanM/YTIyNyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZFxcK1xcLVxcLl0qOik/XFwvXFwvL2kudGVzdCh1cmwpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/isAbsoluteURL.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/helpers/isAxiosError.js":
/*!********************************************************!*\
  !*** ./node_modules/axios/lib/helpers/isAxiosError.js ***!
  \********************************************************/
/***/ ((module) => {

"use strict";
eval("\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nmodule.exports = function isAxiosError(payload) {\n  return (typeof payload === 'object') && (payload.isAxiosError === true);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBeGlvc0Vycm9yLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc0F4aW9zRXJyb3IuanM/YmQ5ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGFuIGVycm9yIHRocm93biBieSBBeGlvc1xuICpcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0F4aW9zRXJyb3IocGF5bG9hZCkge1xuICByZXR1cm4gKHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0JykgJiYgKHBheWxvYWQuaXNBeGlvc0Vycm9yID09PSB0cnVlKTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/isAxiosError.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/helpers/isURLSameOrigin.js":
/*!***********************************************************!*\
  !*** ./node_modules/axios/lib/helpers/isURLSameOrigin.js ***!
  \***********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\n\nmodule.exports = (\n  utils.isStandardBrowserEnv() ?\n\n  // Standard browser envs have full support of the APIs needed to test\n  // whether the request URL is of the same origin as current location.\n    (function standardBrowserEnv() {\n      var msie = /(msie|trident)/i.test(navigator.userAgent);\n      var urlParsingNode = document.createElement('a');\n      var originURL;\n\n      /**\n    * Parse a URL to discover it's components\n    *\n    * @param {String} url The URL to be parsed\n    * @returns {Object}\n    */\n      function resolveURL(url) {\n        var href = url;\n\n        if (msie) {\n        // IE needs attribute set twice to normalize properties\n          urlParsingNode.setAttribute('href', href);\n          href = urlParsingNode.href;\n        }\n\n        urlParsingNode.setAttribute('href', href);\n\n        // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n        return {\n          href: urlParsingNode.href,\n          protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n          host: urlParsingNode.host,\n          search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n          hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n          hostname: urlParsingNode.hostname,\n          port: urlParsingNode.port,\n          pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n            urlParsingNode.pathname :\n            '/' + urlParsingNode.pathname\n        };\n      }\n\n      originURL = resolveURL(window.location.href);\n\n      /**\n    * Determine if a URL shares the same origin as the current location\n    *\n    * @param {String} requestURL The URL to test\n    * @returns {boolean} True if URL shares the same origin, otherwise false\n    */\n      return function isURLSameOrigin(requestURL) {\n        var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n        return (parsed.protocol === originURL.protocol &&\n            parsed.host === originURL.host);\n      };\n    })() :\n\n  // Non standard browser envs (web workers, react-native) lack needed support.\n    (function nonStandardBrowserEnv() {\n      return function isURLSameOrigin() {\n        return true;\n      };\n    })()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxxREFBWTs7QUFFaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QixnQkFBZ0IsU0FBUztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luLmpzPzg3OTUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKFxuICB1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgaGF2ZSBmdWxsIHN1cHBvcnQgb2YgdGhlIEFQSXMgbmVlZGVkIHRvIHRlc3RcbiAgLy8gd2hldGhlciB0aGUgcmVxdWVzdCBVUkwgaXMgb2YgdGhlIHNhbWUgb3JpZ2luIGFzIGN1cnJlbnQgbG9jYXRpb24uXG4gICAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICAgIHZhciBtc2llID0gLyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICAgIHZhciB1cmxQYXJzaW5nTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgIHZhciBvcmlnaW5VUkw7XG5cbiAgICAgIC8qKlxuICAgICogUGFyc2UgYSBVUkwgdG8gZGlzY292ZXIgaXQncyBjb21wb25lbnRzXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCBUaGUgVVJMIHRvIGJlIHBhcnNlZFxuICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAqL1xuICAgICAgZnVuY3Rpb24gcmVzb2x2ZVVSTCh1cmwpIHtcbiAgICAgICAgdmFyIGhyZWYgPSB1cmw7XG5cbiAgICAgICAgaWYgKG1zaWUpIHtcbiAgICAgICAgLy8gSUUgbmVlZHMgYXR0cmlidXRlIHNldCB0d2ljZSB0byBub3JtYWxpemUgcHJvcGVydGllc1xuICAgICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuICAgICAgICAgIGhyZWYgPSB1cmxQYXJzaW5nTm9kZS5ocmVmO1xuICAgICAgICB9XG5cbiAgICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG5cbiAgICAgICAgLy8gdXJsUGFyc2luZ05vZGUgcHJvdmlkZXMgdGhlIFVybFV0aWxzIGludGVyZmFjZSAtIGh0dHA6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmx1dGlsc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhyZWY6IHVybFBhcnNpbmdOb2RlLmhyZWYsXG4gICAgICAgICAgcHJvdG9jb2w6IHVybFBhcnNpbmdOb2RlLnByb3RvY29sID8gdXJsUGFyc2luZ05vZGUucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJykgOiAnJyxcbiAgICAgICAgICBob3N0OiB1cmxQYXJzaW5nTm9kZS5ob3N0LFxuICAgICAgICAgIHNlYXJjaDogdXJsUGFyc2luZ05vZGUuc2VhcmNoID8gdXJsUGFyc2luZ05vZGUuc2VhcmNoLnJlcGxhY2UoL15cXD8vLCAnJykgOiAnJyxcbiAgICAgICAgICBoYXNoOiB1cmxQYXJzaW5nTm9kZS5oYXNoID8gdXJsUGFyc2luZ05vZGUuaGFzaC5yZXBsYWNlKC9eIy8sICcnKSA6ICcnLFxuICAgICAgICAgIGhvc3RuYW1lOiB1cmxQYXJzaW5nTm9kZS5ob3N0bmFtZSxcbiAgICAgICAgICBwb3J0OiB1cmxQYXJzaW5nTm9kZS5wb3J0LFxuICAgICAgICAgIHBhdGhuYW1lOiAodXJsUGFyc2luZ05vZGUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycpID9cbiAgICAgICAgICAgIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lIDpcbiAgICAgICAgICAgICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG9yaWdpblVSTCA9IHJlc29sdmVVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuXG4gICAgICAvKipcbiAgICAqIERldGVybWluZSBpZiBhIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luIGFzIHRoZSBjdXJyZW50IGxvY2F0aW9uXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RVUkwgVGhlIFVSTCB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cbiAgICAgIHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4ocmVxdWVzdFVSTCkge1xuICAgICAgICB2YXIgcGFyc2VkID0gKHV0aWxzLmlzU3RyaW5nKHJlcXVlc3RVUkwpKSA/IHJlc29sdmVVUkwocmVxdWVzdFVSTCkgOiByZXF1ZXN0VVJMO1xuICAgICAgICByZXR1cm4gKHBhcnNlZC5wcm90b2NvbCA9PT0gb3JpZ2luVVJMLnByb3RvY29sICYmXG4gICAgICAgICAgICBwYXJzZWQuaG9zdCA9PT0gb3JpZ2luVVJMLmhvc3QpO1xuICAgICAgfTtcbiAgICB9KSgpIDpcblxuICAvLyBOb24gc3RhbmRhcmQgYnJvd3NlciBlbnZzICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICAgIChmdW5jdGlvbiBub25TdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH07XG4gICAgfSkoKVxuKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/isURLSameOrigin.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/helpers/normalizeHeaderName.js":
/*!***************************************************************!*\
  !*** ./node_modules/axios/lib/helpers/normalizeHeaderName.js ***!
  \***************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ../utils */ \"./node_modules/axios/lib/utils.js\");\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n  utils.forEach(headers, function processHeader(value, name) {\n    if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n      headers[normalizedName] = value;\n      delete headers[name];\n    }\n  });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvbm9ybWFsaXplSGVhZGVyTmFtZS5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixZQUFZLG1CQUFPLENBQUMsbURBQVU7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lLmpzPzZiMTUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZUhlYWRlck5hbWUoaGVhZGVycywgbm9ybWFsaXplZE5hbWUpIHtcbiAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLCBmdW5jdGlvbiBwcm9jZXNzSGVhZGVyKHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKG5hbWUgIT09IG5vcm1hbGl6ZWROYW1lICYmIG5hbWUudG9VcHBlckNhc2UoKSA9PT0gbm9ybWFsaXplZE5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgaGVhZGVyc1tub3JtYWxpemVkTmFtZV0gPSB2YWx1ZTtcbiAgICAgIGRlbGV0ZSBoZWFkZXJzW25hbWVdO1xuICAgIH1cbiAgfSk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/normalizeHeaderName.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/helpers/parseHeaders.js":
/*!********************************************************!*\
  !*** ./node_modules/axios/lib/helpers/parseHeaders.js ***!
  \********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n  'age', 'authorization', 'content-length', 'content-type', 'etag',\n  'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n  'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n  'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n  var parsed = {};\n  var key;\n  var val;\n  var i;\n\n  if (!headers) { return parsed; }\n\n  utils.forEach(headers.split('\\n'), function parser(line) {\n    i = line.indexOf(':');\n    key = utils.trim(line.substr(0, i)).toLowerCase();\n    val = utils.trim(line.substr(i + 1));\n\n    if (key) {\n      if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n        return;\n      }\n      if (key === 'set-cookie') {\n        parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n      } else {\n        parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n      }\n    }\n  });\n\n  return parsed;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VIZWFkZXJzLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxxREFBWTs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9wYXJzZUhlYWRlcnMuanM/NTRlOSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuLy8gSGVhZGVycyB3aG9zZSBkdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGJ5IG5vZGVcbi8vIGMuZi4gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX2hlYWRlcnNcbnZhciBpZ25vcmVEdXBsaWNhdGVPZiA9IFtcbiAgJ2FnZScsICdhdXRob3JpemF0aW9uJywgJ2NvbnRlbnQtbGVuZ3RoJywgJ2NvbnRlbnQtdHlwZScsICdldGFnJyxcbiAgJ2V4cGlyZXMnLCAnZnJvbScsICdob3N0JywgJ2lmLW1vZGlmaWVkLXNpbmNlJywgJ2lmLXVubW9kaWZpZWQtc2luY2UnLFxuICAnbGFzdC1tb2RpZmllZCcsICdsb2NhdGlvbicsICdtYXgtZm9yd2FyZHMnLCAncHJveHktYXV0aG9yaXphdGlvbicsXG4gICdyZWZlcmVyJywgJ3JldHJ5LWFmdGVyJywgJ3VzZXItYWdlbnQnXG5dO1xuXG4vKipcbiAqIFBhcnNlIGhlYWRlcnMgaW50byBhbiBvYmplY3RcbiAqXG4gKiBgYGBcbiAqIERhdGU6IFdlZCwgMjcgQXVnIDIwMTQgMDg6NTg6NDkgR01UXG4gKiBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbiAqIENvbm5lY3Rpb246IGtlZXAtYWxpdmVcbiAqIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVycyBIZWFkZXJzIG5lZWRpbmcgdG8gYmUgcGFyc2VkXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhcnNlSGVhZGVycyhoZWFkZXJzKSB7XG4gIHZhciBwYXJzZWQgPSB7fTtcbiAgdmFyIGtleTtcbiAgdmFyIHZhbDtcbiAgdmFyIGk7XG5cbiAgaWYgKCFoZWFkZXJzKSB7IHJldHVybiBwYXJzZWQ7IH1cblxuICB1dGlscy5mb3JFYWNoKGhlYWRlcnMuc3BsaXQoJ1xcbicpLCBmdW5jdGlvbiBwYXJzZXIobGluZSkge1xuICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBrZXkgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKDAsIGkpKS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbCA9IHV0aWxzLnRyaW0obGluZS5zdWJzdHIoaSArIDEpKTtcblxuICAgIGlmIChrZXkpIHtcbiAgICAgIGlmIChwYXJzZWRba2V5XSAmJiBpZ25vcmVEdXBsaWNhdGVPZi5pbmRleE9mKGtleSkgPj0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSAocGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSA6IFtdKS5jb25jYXQoW3ZhbF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/parseHeaders.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/helpers/spread.js":
/*!**************************************************!*\
  !*** ./node_modules/axios/lib/helpers/spread.js ***!
  \**************************************************/
/***/ ((module) => {

"use strict";
eval("\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n *  ```js\n *  function f(x, y, z) {}\n *  var args = [1, 2, 3];\n *  f.apply(null, args);\n *  ```\n *\n * With `spread` this example can be re-written.\n *\n *  ```js\n *  spread(function(x, y, z) {})([1, 2, 3]);\n *  ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n  return function wrap(arr) {\n    return callback.apply(null, arr);\n  };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3ByZWFkLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwcmVhZC5qcz8yNzI5Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGludm9raW5nIGEgZnVuY3Rpb24gYW5kIGV4cGFuZGluZyBhbiBhcnJheSBmb3IgYXJndW1lbnRzLlxuICpcbiAqIENvbW1vbiB1c2UgY2FzZSB3b3VsZCBiZSB0byB1c2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseWAuXG4gKlxuICogIGBgYGpzXG4gKiAgZnVuY3Rpb24gZih4LCB5LCB6KSB7fVxuICogIHZhciBhcmdzID0gWzEsIDIsIDNdO1xuICogIGYuYXBwbHkobnVsbCwgYXJncyk7XG4gKiAgYGBgXG4gKlxuICogV2l0aCBgc3ByZWFkYCB0aGlzIGV4YW1wbGUgY2FuIGJlIHJlLXdyaXR0ZW4uXG4gKlxuICogIGBgYGpzXG4gKiAgc3ByZWFkKGZ1bmN0aW9uKHgsIHksIHopIHt9KShbMSwgMiwgM10pO1xuICogIGBgYFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3ByZWFkKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKGFycikge1xuICAgIHJldHVybiBjYWxsYmFjay5hcHBseShudWxsLCBhcnIpO1xuICB9O1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/spread.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/helpers/validator.js":
/*!*****************************************************!*\
  !*** ./node_modules/axios/lib/helpers/validator.js ***!
  \*****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar VERSION = (__webpack_require__(/*! ../env/data */ \"./node_modules/axios/lib/env/data.js\").version);\n\nvar validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {\n  validators[type] = function validator(thing) {\n    return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n  };\n});\n\nvar deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n  function formatMessage(opt, desc) {\n    return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n  }\n\n  // eslint-disable-next-line func-names\n  return function(value, opt, opts) {\n    if (validator === false) {\n      throw new Error(formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')));\n    }\n\n    if (version && !deprecatedWarnings[opt]) {\n      deprecatedWarnings[opt] = true;\n      // eslint-disable-next-line no-console\n      console.warn(\n        formatMessage(\n          opt,\n          ' has been deprecated since v' + version + ' and will be removed in the near future'\n        )\n      );\n    }\n\n    return validator ? validator(value, opt, opts) : true;\n  };\n};\n\n/**\n * Assert object's properties type\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n  if (typeof options !== 'object') {\n    throw new TypeError('options must be an object');\n  }\n  var keys = Object.keys(options);\n  var i = keys.length;\n  while (i-- > 0) {\n    var opt = keys[i];\n    var validator = schema[opt];\n    if (validator) {\n      var value = options[opt];\n      var result = value === undefined || validator(value, opt, options);\n      if (result !== true) {\n        throw new TypeError('option ' + opt + ' must be ' + result);\n      }\n      continue;\n    }\n    if (allowUnknown !== true) {\n      throw Error('Unknown option ' + opt);\n    }\n  }\n}\n\nmodule.exports = {\n  assertOptions: assertOptions,\n  validators: validators\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdmFsaWRhdG9yLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLGNBQWMsd0ZBQThCOztBQUU1Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdmFsaWRhdG9yLmpzPzAxMzIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2Vudi9kYXRhJykudmVyc2lvbjtcblxudmFyIHZhbGlkYXRvcnMgPSB7fTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcblsnb2JqZWN0JywgJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ2Z1bmN0aW9uJywgJ3N0cmluZycsICdzeW1ib2wnXS5mb3JFYWNoKGZ1bmN0aW9uKHR5cGUsIGkpIHtcbiAgdmFsaWRhdG9yc1t0eXBlXSA9IGZ1bmN0aW9uIHZhbGlkYXRvcih0aGluZykge1xuICAgIHJldHVybiB0eXBlb2YgdGhpbmcgPT09IHR5cGUgfHwgJ2EnICsgKGkgPCAxID8gJ24gJyA6ICcgJykgKyB0eXBlO1xuICB9O1xufSk7XG5cbnZhciBkZXByZWNhdGVkV2FybmluZ3MgPSB7fTtcblxuLyoqXG4gKiBUcmFuc2l0aW9uYWwgb3B0aW9uIHZhbGlkYXRvclxuICogQHBhcmFtIHtmdW5jdGlvbnxib29sZWFuP30gdmFsaWRhdG9yIC0gc2V0IHRvIGZhbHNlIGlmIHRoZSB0cmFuc2l0aW9uYWwgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWRcbiAqIEBwYXJhbSB7c3RyaW5nP30gdmVyc2lvbiAtIGRlcHJlY2F0ZWQgdmVyc2lvbiAvIHJlbW92ZWQgc2luY2UgdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmc/fSBtZXNzYWdlIC0gc29tZSBtZXNzYWdlIHdpdGggYWRkaXRpb25hbCBpbmZvXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259XG4gKi9cbnZhbGlkYXRvcnMudHJhbnNpdGlvbmFsID0gZnVuY3Rpb24gdHJhbnNpdGlvbmFsKHZhbGlkYXRvciwgdmVyc2lvbiwgbWVzc2FnZSkge1xuICBmdW5jdGlvbiBmb3JtYXRNZXNzYWdlKG9wdCwgZGVzYykge1xuICAgIHJldHVybiAnW0F4aW9zIHYnICsgVkVSU0lPTiArICddIFRyYW5zaXRpb25hbCBvcHRpb24gXFwnJyArIG9wdCArICdcXCcnICsgZGVzYyArIChtZXNzYWdlID8gJy4gJyArIG1lc3NhZ2UgOiAnJyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG9wdCwgb3B0cykge1xuICAgIGlmICh2YWxpZGF0b3IgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZm9ybWF0TWVzc2FnZShvcHQsICcgaGFzIGJlZW4gcmVtb3ZlZCcgKyAodmVyc2lvbiA/ICcgaW4gJyArIHZlcnNpb24gOiAnJykpKTtcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbiAmJiAhZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0pIHtcbiAgICAgIGRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdID0gdHJ1ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAgb3B0LFxuICAgICAgICAgICcgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2JyArIHZlcnNpb24gKyAnIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3IgPyB2YWxpZGF0b3IodmFsdWUsIG9wdCwgb3B0cykgOiB0cnVlO1xuICB9O1xufTtcblxuLyoqXG4gKiBBc3NlcnQgb2JqZWN0J3MgcHJvcGVydGllcyB0eXBlXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtvYmplY3R9IHNjaGVtYVxuICogQHBhcmFtIHtib29sZWFuP30gYWxsb3dVbmtub3duXG4gKi9cblxuZnVuY3Rpb24gYXNzZXJ0T3B0aW9ucyhvcHRpb25zLCBzY2hlbWEsIGFsbG93VW5rbm93bikge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgdmFyIG9wdCA9IGtleXNbaV07XG4gICAgdmFyIHZhbGlkYXRvciA9IHNjaGVtYVtvcHRdO1xuICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgIHZhciB2YWx1ZSA9IG9wdGlvbnNbb3B0XTtcbiAgICAgIHZhciByZXN1bHQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRpb25zKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uICcgKyBvcHQgKyAnIG11c3QgYmUgJyArIHJlc3VsdCk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFsbG93VW5rbm93biAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Vua25vd24gb3B0aW9uICcgKyBvcHQpO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYXNzZXJ0T3B0aW9uczogYXNzZXJ0T3B0aW9ucyxcbiAgdmFsaWRhdG9yczogdmFsaWRhdG9yc1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/validator.js\n");

/***/ }),

/***/ "./node_modules/axios/lib/utils.js":
/*!*****************************************!*\
  !*** ./node_modules/axios/lib/utils.js ***!
  \*****************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar bind = __webpack_require__(/*! ./helpers/bind */ \"./node_modules/axios/lib/helpers/bind.js\");\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n  return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n  return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n  return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n    && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n  return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n  return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n  var result;\n  if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n    result = ArrayBuffer.isView(val);\n  } else {\n    result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n  }\n  return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n  return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n  return typeof val === 'number';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n  return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {Object} val The value to test\n * @return {boolean} True if value is a plain Object, otherwise false\n */\nfunction isPlainObject(val) {\n  if (toString.call(val) !== '[object Object]') {\n    return false;\n  }\n\n  var prototype = Object.getPrototypeOf(val);\n  return prototype === null || prototype === Object.prototype;\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n  return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n  return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n  return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n  return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n  return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n  return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n  return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n *  typeof window -> undefined\n *  typeof document -> undefined\n *\n * react-native:\n *  navigator.product -> 'ReactNative'\n * nativescript\n *  navigator.product -> 'NativeScript' or 'NS'\n */\nfunction isStandardBrowserEnv() {\n  if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\n                                           navigator.product === 'NativeScript' ||\n                                           navigator.product === 'NS')) {\n    return false;\n  }\n  return (\n    typeof window !== 'undefined' &&\n    typeof document !== 'undefined'\n  );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n  // Don't bother if no value provided\n  if (obj === null || typeof obj === 'undefined') {\n    return;\n  }\n\n  // Force an array if not already something iterable\n  if (typeof obj !== 'object') {\n    /*eslint no-param-reassign:0*/\n    obj = [obj];\n  }\n\n  if (isArray(obj)) {\n    // Iterate over array values\n    for (var i = 0, l = obj.length; i < l; i++) {\n      fn.call(null, obj[i], i, obj);\n    }\n  } else {\n    // Iterate over object keys\n    for (var key in obj) {\n      if (Object.prototype.hasOwnProperty.call(obj, key)) {\n        fn.call(null, obj[key], key, obj);\n      }\n    }\n  }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n  var result = {};\n  function assignValue(val, key) {\n    if (isPlainObject(result[key]) && isPlainObject(val)) {\n      result[key] = merge(result[key], val);\n    } else if (isPlainObject(val)) {\n      result[key] = merge({}, val);\n    } else if (isArray(val)) {\n      result[key] = val.slice();\n    } else {\n      result[key] = val;\n    }\n  }\n\n  for (var i = 0, l = arguments.length; i < l; i++) {\n    forEach(arguments[i], assignValue);\n  }\n  return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n  forEach(b, function assignValue(val, key) {\n    if (thisArg && typeof val === 'function') {\n      a[key] = bind(val, thisArg);\n    } else {\n      a[key] = val;\n    }\n  });\n  return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n * @return {string} content value without BOM\n */\nfunction stripBOM(content) {\n  if (content.charCodeAt(0) === 0xFEFF) {\n    content = content.slice(1);\n  }\n  return content;\n}\n\nmodule.exports = {\n  isArray: isArray,\n  isArrayBuffer: isArrayBuffer,\n  isBuffer: isBuffer,\n  isFormData: isFormData,\n  isArrayBufferView: isArrayBufferView,\n  isString: isString,\n  isNumber: isNumber,\n  isObject: isObject,\n  isPlainObject: isPlainObject,\n  isUndefined: isUndefined,\n  isDate: isDate,\n  isFile: isFile,\n  isBlob: isBlob,\n  isFunction: isFunction,\n  isStream: isStream,\n  isURLSearchParams: isURLSearchParams,\n  isStandardBrowserEnv: isStandardBrowserEnv,\n  forEach: forEach,\n  merge: merge,\n  extend: extend,\n  trim: trim,\n  stripBOM: stripBOM\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3V0aWxzLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFdBQVcsbUJBQU8sQ0FBQyxnRUFBZ0I7O0FBRW5DOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxTQUFTO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekIsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQ0FBb0MsT0FBTztBQUMzQztBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUyxHQUFHLFNBQVM7QUFDNUMsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTiw0QkFBNEI7QUFDNUIsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0MsT0FBTztBQUMvQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3V0aWxzLmpzP2M5ZWIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJy4vaGVscGVycy9iaW5kJyk7XG5cbi8vIHV0aWxzIGlzIGEgbGlicmFyeSBvZiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgbm9uLXNwZWNpZmljIHRvIGF4aW9zXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXkodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCdWZmZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQnVmZmVyKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwpICYmIHZhbC5jb25zdHJ1Y3RvciAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsLmNvbnN0cnVjdG9yKVxuICAgICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKHZhbCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGb3JtRGF0YVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGb3JtRGF0YSh2YWwpIHtcbiAgcmV0dXJuICh0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnKSAmJiAodmFsIGluc3RhbmNlb2YgRm9ybURhdGEpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJWaWV3KHZhbCkge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpICYmIChBcnJheUJ1ZmZlci5pc1ZpZXcpKSB7XG4gICAgcmVzdWx0ID0gQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gKHZhbCkgJiYgKHZhbC5idWZmZXIpICYmICh2YWwuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJpbmdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmluZywgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBOdW1iZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIE51bWJlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTnVtYmVyKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWwpIHtcbiAgaWYgKHRvU3RyaW5nLmNhbGwodmFsKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbCk7XG4gIHJldHVybiBwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRGF0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRGF0ZSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRmlsZSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRmlsZV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQmxvYiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQmxvYih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQmxvYl0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZ1bmN0aW9uLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmVhbVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyZWFtLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJlYW0odmFsKSB7XG4gIHJldHVybiBpc09iamVjdCh2YWwpICYmIGlzRnVuY3Rpb24odmFsLnBpcGUpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVVJMU2VhcmNoUGFyYW1zKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zO1xufVxuXG4vKipcbiAqIFRyaW0gZXhjZXNzIHdoaXRlc3BhY2Ugb2ZmIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIFN0cmluZyB0byB0cmltXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgU3RyaW5nIGZyZWVkIG9mIGV4Y2VzcyB3aGl0ZXNwYWNlXG4gKi9cbmZ1bmN0aW9uIHRyaW0oc3RyKSB7XG4gIHJldHVybiBzdHIudHJpbSA/IHN0ci50cmltKCkgOiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudFxuICpcbiAqIFRoaXMgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXIsIGFuZCByZWFjdC1uYXRpdmUuXG4gKiBCb3RoIGVudmlyb25tZW50cyBzdXBwb3J0IFhNTEh0dHBSZXF1ZXN0LCBidXQgbm90IGZ1bGx5IHN0YW5kYXJkIGdsb2JhbHMuXG4gKlxuICogd2ViIHdvcmtlcnM6XG4gKiAgdHlwZW9mIHdpbmRvdyAtPiB1bmRlZmluZWRcbiAqICB0eXBlb2YgZG9jdW1lbnQgLT4gdW5kZWZpbmVkXG4gKlxuICogcmVhY3QtbmF0aXZlOlxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdSZWFjdE5hdGl2ZSdcbiAqIG5hdGl2ZXNjcmlwdFxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdOYXRpdmVTY3JpcHQnIG9yICdOUydcbiAqL1xuZnVuY3Rpb24gaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAobmF2aWdhdG9yLnByb2R1Y3QgPT09ICdSZWFjdE5hdGl2ZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ05hdGl2ZVNjcmlwdCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ05TJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdcbiAgKTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0IGludm9raW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiBgb2JqYCBpcyBhbiBBcnJheSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICovXG5mdW5jdGlvbiBmb3JFYWNoKG9iaiwgZm4pIHtcbiAgLy8gRG9uJ3QgYm90aGVyIGlmIG5vIHZhbHVlIHByb3ZpZGVkXG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgb2JqID0gW29ial07XG4gIH1cblxuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpbaV0sIGksIG9iaik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBvYmplY3Qga2V5c1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBY2NlcHRzIHZhcmFyZ3MgZXhwZWN0aW5nIGVhY2ggYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0LCB0aGVuXG4gKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cbiAqXG4gKiBXaGVuIG11bHRpcGxlIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBrZXkgdGhlIGxhdGVyIG9iamVjdCBpblxuICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciByZXN1bHQgPSBtZXJnZSh7Zm9vOiAxMjN9LCB7Zm9vOiA0NTZ9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXN1bHQgb2YgYWxsIG1lcmdlIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoLyogb2JqMSwgb2JqMiwgb2JqMywgLi4uICovKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChyZXN1bHRba2V5XSkgJiYgaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlKHJlc3VsdFtrZXldLCB2YWwpO1xuICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlKHt9LCB2YWwpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWwpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbC5zbGljZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmb3JFYWNoKGFyZ3VtZW50c1tpXSwgYXNzaWduVmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYSBieSBtdXRhYmx5IGFkZGluZyB0byBpdCB0aGUgcHJvcGVydGllcyBvZiBvYmplY3QgYi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge09iamVjdH0gYiBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBUaGUgb2JqZWN0IHRvIGJpbmQgZnVuY3Rpb24gdG9cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHJlc3VsdGluZyB2YWx1ZSBvZiBvYmplY3QgYVxuICovXG5mdW5jdGlvbiBleHRlbmQoYSwgYiwgdGhpc0FyZykge1xuICBmb3JFYWNoKGIsIGZ1bmN0aW9uIGFzc2lnblZhbHVlKHZhbCwga2V5KSB7XG4gICAgaWYgKHRoaXNBcmcgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYVtrZXldID0gYmluZCh2YWwsIHRoaXNBcmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhW2tleV0gPSB2YWw7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGE7XG59XG5cbi8qKlxuICogUmVtb3ZlIGJ5dGUgb3JkZXIgbWFya2VyLiBUaGlzIGNhdGNoZXMgRUYgQkIgQkYgKHRoZSBVVEYtOCBCT00pXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgd2l0aCBCT01cbiAqIEByZXR1cm4ge3N0cmluZ30gY29udGVudCB2YWx1ZSB3aXRob3V0IEJPTVxuICovXG5mdW5jdGlvbiBzdHJpcEJPTShjb250ZW50KSB7XG4gIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICB9XG4gIHJldHVybiBjb250ZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNBcnJheTogaXNBcnJheSxcbiAgaXNBcnJheUJ1ZmZlcjogaXNBcnJheUJ1ZmZlcixcbiAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuICBpc0Zvcm1EYXRhOiBpc0Zvcm1EYXRhLFxuICBpc0FycmF5QnVmZmVyVmlldzogaXNBcnJheUJ1ZmZlclZpZXcsXG4gIGlzU3RyaW5nOiBpc1N0cmluZyxcbiAgaXNOdW1iZXI6IGlzTnVtYmVyLFxuICBpc09iamVjdDogaXNPYmplY3QsXG4gIGlzUGxhaW5PYmplY3Q6IGlzUGxhaW5PYmplY3QsXG4gIGlzVW5kZWZpbmVkOiBpc1VuZGVmaW5lZCxcbiAgaXNEYXRlOiBpc0RhdGUsXG4gIGlzRmlsZTogaXNGaWxlLFxuICBpc0Jsb2I6IGlzQmxvYixcbiAgaXNGdW5jdGlvbjogaXNGdW5jdGlvbixcbiAgaXNTdHJlYW06IGlzU3RyZWFtLFxuICBpc1VSTFNlYXJjaFBhcmFtczogaXNVUkxTZWFyY2hQYXJhbXMsXG4gIGlzU3RhbmRhcmRCcm93c2VyRW52OiBpc1N0YW5kYXJkQnJvd3NlckVudixcbiAgZm9yRWFjaDogZm9yRWFjaCxcbiAgbWVyZ2U6IG1lcmdlLFxuICBleHRlbmQ6IGV4dGVuZCxcbiAgdHJpbTogdHJpbSxcbiAgc3RyaXBCT006IHN0cmlwQk9NXG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/utils.js\n");

/***/ }),

/***/ "./node_modules/babel-helper-vue-jsx-merge-props/index.js":
/*!****************************************************************!*\
  !*** ./node_modules/babel-helper-vue-jsx-merge-props/index.js ***!
  \****************************************************************/
/***/ ((module) => {

eval("var nestRE = /^(attrs|props|on|nativeOn|class|style|hook)$/\n\nmodule.exports = function mergeJSXProps (objs) {\n  return objs.reduce(function (a, b) {\n    var aa, bb, key, nestedKey, temp\n    for (key in b) {\n      aa = a[key]\n      bb = b[key]\n      if (aa && nestRE.test(key)) {\n        // normalize class\n        if (key === 'class') {\n          if (typeof aa === 'string') {\n            temp = aa\n            a[key] = aa = {}\n            aa[temp] = true\n          }\n          if (typeof bb === 'string') {\n            temp = bb\n            b[key] = bb = {}\n            bb[temp] = true\n          }\n        }\n        if (key === 'on' || key === 'nativeOn' || key === 'hook') {\n          // merge functions\n          for (nestedKey in bb) {\n            aa[nestedKey] = mergeFn(aa[nestedKey], bb[nestedKey])\n          }\n        } else if (Array.isArray(aa)) {\n          a[key] = aa.concat(bb)\n        } else if (Array.isArray(bb)) {\n          a[key] = [aa].concat(bb)\n        } else {\n          for (nestedKey in bb) {\n            aa[nestedKey] = bb[nestedKey]\n          }\n        }\n      } else {\n        a[key] = b[key]\n      }\n    }\n    return a\n  }, {})\n}\n\nfunction mergeFn (a, b) {\n  return function () {\n    a && a.apply(this, arguments)\n    b && b.apply(this, arguments)\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtaGVscGVyLXZ1ZS1qc3gtbWVyZ2UtcHJvcHMvaW5kZXguanMuanMiLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLElBQUk7QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFiZWwtaGVscGVyLXZ1ZS1qc3gtbWVyZ2UtcHJvcHMvaW5kZXguanM/Y2JmNSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgbmVzdFJFID0gL14oYXR0cnN8cHJvcHN8b258bmF0aXZlT258Y2xhc3N8c3R5bGV8aG9vaykkL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG1lcmdlSlNYUHJvcHMgKG9ianMpIHtcbiAgcmV0dXJuIG9ianMucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIGFhLCBiYiwga2V5LCBuZXN0ZWRLZXksIHRlbXBcbiAgICBmb3IgKGtleSBpbiBiKSB7XG4gICAgICBhYSA9IGFba2V5XVxuICAgICAgYmIgPSBiW2tleV1cbiAgICAgIGlmIChhYSAmJiBuZXN0UkUudGVzdChrZXkpKSB7XG4gICAgICAgIC8vIG5vcm1hbGl6ZSBjbGFzc1xuICAgICAgICBpZiAoa2V5ID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBhYSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRlbXAgPSBhYVxuICAgICAgICAgICAgYVtrZXldID0gYWEgPSB7fVxuICAgICAgICAgICAgYWFbdGVtcF0gPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgYmIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0ZW1wID0gYmJcbiAgICAgICAgICAgIGJba2V5XSA9IGJiID0ge31cbiAgICAgICAgICAgIGJiW3RlbXBdID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSAnb24nIHx8IGtleSA9PT0gJ25hdGl2ZU9uJyB8fCBrZXkgPT09ICdob29rJykge1xuICAgICAgICAgIC8vIG1lcmdlIGZ1bmN0aW9uc1xuICAgICAgICAgIGZvciAobmVzdGVkS2V5IGluIGJiKSB7XG4gICAgICAgICAgICBhYVtuZXN0ZWRLZXldID0gbWVyZ2VGbihhYVtuZXN0ZWRLZXldLCBiYltuZXN0ZWRLZXldKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFhKSkge1xuICAgICAgICAgIGFba2V5XSA9IGFhLmNvbmNhdChiYilcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGJiKSkge1xuICAgICAgICAgIGFba2V5XSA9IFthYV0uY29uY2F0KGJiKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAobmVzdGVkS2V5IGluIGJiKSB7XG4gICAgICAgICAgICBhYVtuZXN0ZWRLZXldID0gYmJbbmVzdGVkS2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYVtrZXldID0gYltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhXG4gIH0sIHt9KVxufVxuXG5mdW5jdGlvbiBtZXJnZUZuIChhLCBiKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgYSAmJiBhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICBiICYmIGIuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/babel-helper-vue-jsx-merge-props/index.js\n");

/***/ }),

/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/LoadingIcon.vue?vue&type=script&lang=js":
/*!**********************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/LoadingIcon.vue?vue&type=script&lang=js ***!
  \**********************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Font awesome loading spinner icon\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n  name: \"LoadingIcon\",\n  props: {\n    // Animate icon\n    loading: {\n      type: Boolean,\n      required: true,\n      \"default\": false\n    }\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC01LnVzZVswXSEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvaW5kZXguanM/P3J1bGVTZXRbMF0udXNlWzBdIS4vcmVzb3VyY2VzL2pzL2NvcmUvY29tcG9uZW50cy9Mb2FkaW5nSWNvbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUtJO0FBQ0EsaUVBQWU7RUFDWEEsSUFBSSxFQUFFLGFBQWE7RUFDbkJDLEtBQUssRUFBRTtJQUNIO0lBQ0FDLE9BQU8sRUFBRTtNQUNMQyxJQUFJLEVBQUVDLE9BQU87TUFDYkMsUUFBUSxFQUFFLElBQUk7TUFDZCxXQUFTO0lBQ2I7RUFDSjtBQUNKLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL0xvYWRpbmdJY29uLnZ1ZT81MjY3Il0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cbiAgICA8aSB2LWlmPVwibG9hZGluZ1wiIGNsYXNzPVwiZmEgZmEtc3Bpbm5lciBmYS1zcGluXCI+PC9pPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbiAgICAvLyBGb250IGF3ZXNvbWUgbG9hZGluZyBzcGlubmVyIGljb25cbiAgICBleHBvcnQgZGVmYXVsdCB7XG4gICAgICAgIG5hbWU6IFwiTG9hZGluZ0ljb25cIixcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIC8vIEFuaW1hdGUgaWNvblxuICAgICAgICAgICAgbG9hZGluZzoge1xuICAgICAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBzY29wZWQ+XG4gICAgaSB7XG4gICAgICAgIG1hcmdpbjogYXV0byA2cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMWVtO1xuICAgIH1cbjwvc3R5bGU+XG4iXSwibmFtZXMiOlsibmFtZSIsInByb3BzIiwibG9hZGluZyIsInR5cGUiLCJCb29sZWFuIiwicmVxdWlyZWQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/LoadingIcon.vue?vue&type=script&lang=js\n");

/***/ }),

/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/FooterBar.vue?vue&type=script&lang=js":
/*!************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/FooterBar.vue?vue&type=script&lang=js ***!
  \************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n  name: \"FooterBar\"\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC01LnVzZVswXSEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvaW5kZXguanM/P3J1bGVTZXRbMF0udXNlWzBdIS4vcmVzb3VyY2VzL2pzL2NvcmUvY29tcG9uZW50cy9uYXYvRm9vdGVyQmFyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBU0EsaUVBQWU7RUFDWEEsSUFBSSxFQUFFO0FBQ1YsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvbmF2L0Zvb3RlckJhci52dWU/YjMyMCJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XG4gICAgPGZvb3RlciBpZD1cImZvb3RlclwiPlxuICAgICAgICA8cCBjbGFzcz1cInRleHQtbGctcmlnaHRcIj5cbiAgICAgICAgICAgICZjb3B5OyB7eyBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgfX0gLSA8YSBocmVmPVwiaHR0cHM6Ly93d3cuY2FzdHVzLmNvLnVrXCI+Q2FzdHVzPC9hPi5cbiAgICAgICAgPC9wPlxuICAgIDwvZm9vdGVyPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiBcIkZvb3RlckJhclwiXG59XG48L3NjcmlwdD5cblxuPHN0eWxlIHNjb3BlZD5cbiAgICAjZm9vdGVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogI2YzZjVmOTtcbiAgICB9XG5cbiAgICBwIHtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBjb2xvcjogIzc1ODY5NztcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMTJweDtcbiAgICB9XG5cbiAgICBwIGEge1xuICAgICAgICBjb2xvcjogIzAwMDtcbiAgICB9XG5cbjwvc3R5bGU+XG4iXSwibmFtZXMiOlsibmFtZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/FooterBar.vue?vue&type=script&lang=js\n");

/***/ }),

/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/SideBar.vue?vue&type=script&lang=js":
/*!**********************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/SideBar.vue?vue&type=script&lang=js ***!
  \**********************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _routes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/routes */ \"./resources/js/routes.js\");\n/* harmony import */ var _core_mixins_RoutingMixin__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ~/core/mixins/RoutingMixin */ \"./resources/js/core/mixins/RoutingMixin.js\");\n\n\n\n// Sidebar navigation component\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n  name: \"Sidebar\",\n  data: function data() {\n    return {\n      routes: [],\n      expanded: this.$store.getters['sidebar/expanded']\n    };\n  },\n  methods: {\n    // @vuese\n    // Load routes for sidebar and render\n    render: function render() {\n      var routes = _routes__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n      this.routes = (0,_core_mixins_RoutingMixin__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(routes);\n    },\n    onToggleCollapse: function onToggleCollapse(collapsed) {\n      this.$store.commit('sidebar/toggle');\n      return false;\n    },\n    setBodyClass: function setBodyClass(expanded) {\n      if (expanded) {\n        document.getElementById('container').classList.add('mainnav-lg');\n        document.getElementById('container').classList.remove('mainnav-sm');\n      } else {\n        document.getElementById('container').classList.remove('mainnav-lg');\n        document.getElementById('container').classList.add('mainnav-sm');\n      }\n    }\n  },\n  mounted: function mounted() {\n    var _this = this;\n    this.render();\n    this.$store.watch(function (state) {\n      return state.sidebar.expanded;\n    }, function (input) {\n      _this.expanded = input;\n      _this.setBodyClass(input);\n    }, {\n      deep: true\n    });\n    this.setBodyClass(this.expanded);\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC01LnVzZVswXSEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvaW5kZXguanM/P3J1bGVTZXRbMF0udXNlWzBdIS4vcmVzb3VyY2VzL2pzL2NvcmUvY29tcG9uZW50cy9uYXYvU2lkZUJhci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBZWtDO0FBQzZDOztBQUUzRTtBQUNBLGlFQUFlO0VBQ1hFLElBQUksRUFBRSxTQUFTO0VBQ2ZDLElBQUksV0FBQUEsS0FBQSxFQUFHO0lBQ0gsT0FBTztNQUNIQyxNQUFNLEVBQUUsRUFBRTtNQUNWQyxRQUFRLEVBQUUsSUFBSSxDQUFDQyxNQUFNLENBQUNDLE9BQU8sQ0FBQyxrQkFBa0I7SUFDcEQ7RUFDSixDQUFDO0VBQ0RDLE9BQU8sRUFBRTtJQUNMO0lBQ0E7SUFDQUMsTUFBTSxXQUFBQSxPQUFBLEVBQUc7TUFDTCxJQUFJTCxNQUFLLEdBQUlKLCtDQUFNO01BRW5CLElBQUksQ0FBQ0ksTUFBSyxHQUFJSCxxRUFBaUMsQ0FBQ0csTUFBTSxDQUFDO0lBQzNELENBQUM7SUFFRE0sZ0JBQWdCLFdBQUFBLGlCQUFDQyxTQUFTLEVBQUU7TUFDeEIsSUFBSSxDQUFDTCxNQUFNLENBQUNNLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztNQUNwQyxPQUFPLEtBQUs7SUFDaEIsQ0FBQztJQUVEQyxZQUFZLFdBQUFBLGFBQUNSLFFBQVEsRUFBRTtNQUNuQixJQUFJQSxRQUFRLEVBQUU7UUFDVlMsUUFBUSxDQUFDQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUNDLFNBQVMsQ0FBQ0MsR0FBRyxDQUFDLFlBQVksQ0FBQztRQUNoRUgsUUFBUSxDQUFDQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUNDLFNBQVMsQ0FBQ0UsTUFBTSxDQUFDLFlBQVksQ0FBQztNQUN2RSxPQUFPO1FBQ0hKLFFBQVEsQ0FBQ0MsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDQyxTQUFTLENBQUNFLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFDbkVKLFFBQVEsQ0FBQ0MsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDQyxTQUFTLENBQUNDLEdBQUcsQ0FBQyxZQUFZLENBQUM7TUFDcEU7SUFDSjtFQUNKLENBQUM7RUFDREUsT0FBTyxXQUFBQSxRQUFBLEVBQUc7SUFBQSxJQUFBQyxLQUFBO0lBQ04sSUFBSSxDQUFDWCxNQUFNLENBQUMsQ0FBQztJQUViLElBQUksQ0FBQ0gsTUFBTSxDQUFDZSxLQUFLLENBQUMsVUFBU0MsS0FBSyxFQUFFO01BQzlCLE9BQU9BLEtBQUssQ0FBQ0MsT0FBTyxDQUFDbEIsUUFBUTtJQUNqQyxDQUFDLEVBQUUsVUFBQ21CLEtBQUssRUFBSztNQUNWSixLQUFJLENBQUNmLFFBQU8sR0FBSW1CLEtBQUs7TUFDckJKLEtBQUksQ0FBQ1AsWUFBWSxDQUFDVyxLQUFLLENBQUM7SUFDNUIsQ0FBQyxFQUFFO01BQ0NDLElBQUksRUFBRTtJQUNWLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQ1osWUFBWSxDQUFDLElBQUksQ0FBQ1IsUUFBUSxDQUFDO0VBQ3BDO0FBQ0osQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvbmF2L1NpZGVCYXIudnVlPzE4Y2QiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxuICAgIDxzaWRlYmFyLW1lbnVcbiAgICAgICAgOm1lbnU9XCJyb3V0ZXNcIlxuICAgICAgICBAdG9nZ2xlLWNvbGxhcHNlPVwib25Ub2dnbGVDb2xsYXBzZVwiXG4gICAgICAgIDpjb2xsYXBzZWQ9XCIhZXhwYW5kZWRcIlxuICAgICAgICB3aWR0aD1cIjI3MHB4XCJcbiAgICAgICAgd2lkdGgtY29sbGFwc2VkPVwiNTBweFwiXG4gICAgICAgIHRoZW1lPVwiZGVmYXVsdC10aGVtZVwiXG4gICAgICAgIDpzaG93T25lQ2hpbGQ9XCJ0cnVlXCJcbiAgICAgICAgaWQ9XCJzaWRlYmFyXCJcbiAgICAvPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cblxuICAgIGltcG9ydCBSb3V0ZXMgZnJvbSAnfi9yb3V0ZXMnO1xuICAgIGltcG9ydCBjb25zdHJ1Y3RTaWRlYmFyRW50cmllc0Zyb21Sb3V0ZXMgZnJvbSAnfi9jb3JlL21peGlucy9Sb3V0aW5nTWl4aW4nO1xuXG4gICAgLy8gU2lkZWJhciBuYXZpZ2F0aW9uIGNvbXBvbmVudFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcbiAgICAgICAgbmFtZTogXCJTaWRlYmFyXCIsXG4gICAgICAgIGRhdGEoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJvdXRlczogW10sXG4gICAgICAgICAgICAgICAgZXhwYW5kZWQ6IHRoaXMuJHN0b3JlLmdldHRlcnNbJ3NpZGViYXIvZXhwYW5kZWQnXVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAvLyBAdnVlc2VcbiAgICAgICAgICAgIC8vIExvYWQgcm91dGVzIGZvciBzaWRlYmFyIGFuZCByZW5kZXJcbiAgICAgICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm91dGVzID0gUm91dGVzO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXMgPSBjb25zdHJ1Y3RTaWRlYmFyRW50cmllc0Zyb21Sb3V0ZXMocm91dGVzKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9uVG9nZ2xlQ29sbGFwc2UoY29sbGFwc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuY29tbWl0KCdzaWRlYmFyL3RvZ2dsZScpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNldEJvZHlDbGFzcyhleHBhbmRlZCkge1xuICAgICAgICAgICAgICAgIGlmIChleHBhbmRlZCkge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJykuY2xhc3NMaXN0LmFkZCgnbWFpbm5hdi1sZycpO1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJykuY2xhc3NMaXN0LnJlbW92ZSgnbWFpbm5hdi1zbScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKS5jbGFzc0xpc3QucmVtb3ZlKCdtYWlubmF2LWxnJyk7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKS5jbGFzc0xpc3QuYWRkKCdtYWlubmF2LXNtJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTtcblxuICAgICAgICAgICAgdGhpcy4kc3RvcmUud2F0Y2goZnVuY3Rpb24oc3RhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUuc2lkZWJhci5leHBhbmRlZDtcbiAgICAgICAgICAgIH0sIChpbnB1dCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kZWQgPSBpbnB1dDtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEJvZHlDbGFzcyhpbnB1dCk7XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgZGVlcDogdHJ1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0Qm9keUNsYXNzKHRoaXMuZXhwYW5kZWQpO1xuICAgICAgICB9XG4gICAgfVxuPC9zY3JpcHQ+XG5cbjxzdHlsZT5cbi52LXNpZGViYXItbWVudSB7XG4gICAgdG9wOiA0MHB4ICFpbXBvcnRhbnQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDQzLCA1OCwgNzIpO1xuICAgIHotaW5kZXg6IDI7XG59XG5cbi52LXNpZGViYXItbWVudSAudnNtLS1saW5rIHtcbiAgICBmb250LXNpemU6IDEzcHg7XG4gICAgcGFkZGluZzogMnB4IDEwcHg7XG59XG5cbi52LXNpZGViYXItbWVudSAudnNtLS1saW5rLnZzbS0tbGlua19sZXZlbC0xIHtcbiAgICBwYWRkaW5nOiA1cHggN3B4O1xufVxuXG4udi1zaWRlYmFyLW1lbnUgLnZzbS1pdGVtLmZpcnN0LWl0ZW0+LnZzbS1saW5rPi52c20taWNvbiB7XG4gICAgY29sb3I6ICNmZmY7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcbn1cblxuLnZzbS10aXRsZSB7XG4gICAgZm9udC1zaXplOiAxM3B4O1xuICAgIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJywgc2VyaWY7XG4gICAgZm9udC13ZWlnaHQ6IDQwMDtcbn1cblxuLnZzbS0tbGlzdCB7XG4gICAgcGFkZGluZy10b3A6IDEwcHg7XG59XG5cbi52LXNpZGViYXItbWVudSAudnNtLWRyb3Bkb3duPi52c20tbGlzdCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDM3LCA1MCwgNjIpO1xufVxuXG4udi1zaWRlYmFyLW1lbnUgLnZzbS1pdGVtLmZpcnN0LWl0ZW0uYWN0aXZlLWl0ZW0+LnZzbS1saW5rPi52c20taWNvbiwgLnYtc2lkZWJhci1tZW51IC52c20taXRlbS5maXJzdC1pdGVtLnBhcmVudC1hY3RpdmUtaXRlbT4udnNtLWxpbms+LnZzbS1pY29uIHtcbiAgICBjb2xvcjogI2ZmZjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xufVxuXG4udnNtLWxpbms6aG92ZXI+LnZzbS1pY29uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDM2LDQ0LDUzKSAhaW1wb3J0YW50O1xufVxuXG4udi1zaWRlYmFyLW1lbnUgLmNvbGxhcHNlLWJ0biB7XG4gICAgaGVpZ2h0OiAwcHg7XG59XG5cbi52LXNpZGViYXItbWVudSAudnNtLWl0ZW0uYWN0aXZlLWl0ZW0ge1xuICAgIGNvbG9yOiB3aGl0ZTtcbn1cblxuLnYtc2lkZWJhci1tZW51IC52c20taXRlbS5wYXJlbnQtYWN0aXZlLWl0ZW0ge1xuICAgIGNvbG9yOiB3aGl0ZTtcbn1cblxuLnYtc2lkZWJhci1tZW51IC52c20tbGluayB7XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi52LXNpZGViYXItbWVudSAudnNtLWRyb3Bkb3duID4gLnZzbS1saXN0IC52c20tbGluayB7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gICAgbWFyZ2luLWxlZnQ6IDUwcHg7XG59XG5cbiNzaWRlYmFyID4gLmNvbGxhcHNlLWJ0biB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLnYtc2lkZWJhci1tZW51IC52c20tLXRvZ2dsZS1idG4ge1xuICAgIGhlaWdodDogMzVweDtcbn1cbjwvc3R5bGU+XG4iXSwibmFtZXMiOlsiUm91dGVzIiwiY29uc3RydWN0U2lkZWJhckVudHJpZXNGcm9tUm91dGVzIiwibmFtZSIsImRhdGEiLCJyb3V0ZXMiLCJleHBhbmRlZCIsIiRzdG9yZSIsImdldHRlcnMiLCJtZXRob2RzIiwicmVuZGVyIiwib25Ub2dnbGVDb2xsYXBzZSIsImNvbGxhcHNlZCIsImNvbW1pdCIsInNldEJvZHlDbGFzcyIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJjbGFzc0xpc3QiLCJhZGQiLCJyZW1vdmUiLCJtb3VudGVkIiwiX3RoaXMiLCJ3YXRjaCIsInN0YXRlIiwic2lkZWJhciIsImlucHV0IiwiZGVlcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/SideBar.vue?vue&type=script&lang=js\n");

/***/ }),

/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/TopBar.vue?vue&type=script&lang=js":
/*!*********************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/TopBar.vue?vue&type=script&lang=js ***!
  \*********************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\n// Top navigation bar component\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n  name: \"TopBar\",\n  data: function data() {\n    return {\n      menuVisible: false\n    };\n  },\n  methods: {\n    // @vuese\n    // Logout of wave\n    logout: function logout() {\n      var _this = this;\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {\n        return _regeneratorRuntime().wrap(function _callee$(_context) {\n          while (1) switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return _this.$store.dispatch('auth/logout');\n            case 2:\n              localStorage.clear();\n              window.location.href = '/login';\n            case 4:\n            case \"end\":\n              return _context.stop();\n          }\n        }, _callee);\n      }))();\n    },\n    // @vuese\n    // Toggle the sidebar\n    toggle: function toggle(event) {\n      this.$store.commit('sidebar/toggle');\n      return false;\n    }\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC01LnVzZVswXSEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvaW5kZXguanM/P3J1bGVTZXRbMF0udXNlWzBdIS4vcmVzb3VyY2VzL2pzL2NvcmUvY29tcG9uZW50cy9uYXYvVG9wQmFyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQTJESTtBQUNBLGlFQUFlO0VBQ1hBLElBQUksRUFBRSxRQUFRO0VBQ2RDLElBQUksV0FBQUEsS0FBQSxFQUFHO0lBQ0gsT0FBTztNQUNIQyxXQUFXLEVBQUU7SUFDakI7RUFDSixDQUFDO0VBQ0RDLE9BQU8sRUFBRTtJQUNMO0lBQ0E7SUFDTUMsTUFBTSxXQUFBQSxPQUFBLEVBQUc7TUFBQSxJQUFBQyxLQUFBO01BQUEsT0FBQUMsaUJBQUEsZUFBQUMsbUJBQUEsR0FBQUMsSUFBQSxVQUFBQyxRQUFBO1FBQUEsT0FBQUYsbUJBQUEsR0FBQUcsSUFBQSxVQUFBQyxTQUFBQyxRQUFBO1VBQUEsa0JBQUFBLFFBQUEsQ0FBQUMsSUFBQSxHQUFBRCxRQUFBLENBQUFFLElBQUE7WUFBQTtjQUFBRixRQUFBLENBQUFFLElBQUE7Y0FBQSxPQUNMVCxLQUFJLENBQUNVLE1BQU0sQ0FBQ0MsUUFBUSxDQUFDLGFBQWEsQ0FBQztZQUFBO2NBQ3pDQyxZQUFZLENBQUNDLEtBQUssQ0FBQyxDQUFDO2NBQ3BCQyxNQUFNLENBQUNDLFFBQVEsQ0FBQ0MsSUFBRyxHQUFJLFFBQVE7WUFBQTtZQUFBO2NBQUEsT0FBQVQsUUFBQSxDQUFBVSxJQUFBO1VBQUE7UUFBQSxHQUFBYixPQUFBO01BQUE7SUFDbkMsQ0FBQztJQUVEO0lBQ0E7SUFDQWMsTUFBTSxXQUFBQSxPQUFDQyxLQUFLLEVBQUU7TUFDVixJQUFJLENBQUNULE1BQU0sQ0FBQ1UsTUFBTSxDQUFDLGdCQUFnQixDQUFDO01BQ3BDLE9BQU8sS0FBSztJQUNoQjtFQUdKO0FBQ0osQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvbmF2L1RvcEJhci52dWU/MDQwMSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XG4gICAgPGhlYWRlciBpZD1cIm5hdmJhclwiPlxuICAgICAgICA8ZGl2IGlkPVwibmF2YmFyLWNvbnRhaW5lclwiIGNsYXNzPVwiYm94ZWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuYXZiYXItaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cIi9hZG1pbi9cIiBjbGFzcz1cIm5hdmJhci1icmFuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnJhbmQtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmQtdGV4dFwiPkFtYmFzc2Fkb3I8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9pbWFnZXMvc2hpcC5wbmdcIiBjbGFzcz1cInNoaXAtaWNvblwiLz5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hdmJhci1jb250ZW50IGNsZWFyZml4XCI+XG5cbiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2YmFyLXRvcC1saW5rcyBwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwidGdsLW1lbnUtYnRuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIm1haW5uYXYtdG9nZ2xlXCIgQGNsaWNrLnByZXZlbnQ9XCJ0b2dnbGVcIiBpZD1cIm1haW5uYXYtdG9nZ2xlXCIgaHJlZj1cIiNcIiB0aXRsZT1cIkhpZGUgbWVudVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbmF2aWNvbiB0ZXh0LWRhcmtcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImRyb3Bkb3duXCI+PC9saT5cbiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWVnYWRyb3Bkb3duXCI+PC9saT5cbiAgICAgICAgICAgICAgICA8L3VsPlxuXG4gICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdmJhci10b3AtbGlua3MgcHVsbC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICA8bGkgaWQ9XCJkcm9wZG93bi11c2VyXCIgY2xhc3M9XCJkcm9wZG93blwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIlwiIEBjbGljay5wcmV2ZW50PVwibWVudVZpc2libGUgPSAhbWVudVZpc2libGVcIiBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZSB0ZXh0LXJpZ2h0XCIgYXJpYS1leHBhbmRlZD1cInRydWVcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWMtdXNlciBwdWxsLXJpZ2h0XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxpIGNsYXNzPVwicGxpLW1hbGVcIj48L2k+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXJuYW1lIGhpZGRlbi14c1wiPnt7ICRzdG9yZS5nZXR0ZXJzWydhdXRoL2dldFVzZXJOYW1lJ10gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJtZW51VmlzaWJsZVwiIGNsYXNzPVwiZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LW1kIGRyb3Bkb3duLW1lbnUtcmlnaHQgcGFuZWwtZGVmYXVsdFwiIHN0eWxlPVwib3BhY2l0eTogMTsgZGlzcGxheTogYmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFVzZXIgZHJvcGRvd24gbWVudSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJoZWFkLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxhIGhyZWY9XCIjXCI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPGkgY2xhc3M9XCJwbGktbWFsZSBpY29uLWxnIGljb24tZndcIj48L2k+IFByb2ZpbGUtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08L2E+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgQGNsaWNrLnByZXZlbnQ9XCJsb2dvdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBsaS11bmxvY2tcIj48L2k+IExvZ291dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICA8L2Rpdj5cbiAgICA8L2hlYWRlcj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG4gICAgLy8gVG9wIG5hdmlnYXRpb24gYmFyIGNvbXBvbmVudFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcbiAgICAgICAgbmFtZTogXCJUb3BCYXJcIixcbiAgICAgICAgZGF0YSgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWVudVZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAvLyBAdnVlc2VcbiAgICAgICAgICAgIC8vIExvZ291dCBvZiB3YXZlXG4gICAgICAgICAgICBhc3luYyBsb2dvdXQoKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2F1dGgvbG9nb3V0Jyk7XG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2xvZ2luJztcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIEB2dWVzZVxuICAgICAgICAgICAgLy8gVG9nZ2xlIHRoZSBzaWRlYmFyXG4gICAgICAgICAgICB0b2dnbGUoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRzdG9yZS5jb21taXQoJ3NpZGViYXIvdG9nZ2xlJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSxcblxuXG4gICAgICAgIH1cbiAgICB9XG48L3NjcmlwdD5cblxuPHN0eWxlIHNjb3BlZD5cbi5zaGlwLWljb24ge1xuICAgIG1heC13aWR0aDozMHB4O1xuICAgIG1hcmdpbi1sZWZ0OjEwcHg7XG4gICAgbWFyZ2luLXRvcDoxMHB4XG59XG5cbiNuYXZiYXIge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbn1cbjwvc3R5bGU+XG4iXSwibmFtZXMiOlsibmFtZSIsImRhdGEiLCJtZW51VmlzaWJsZSIsIm1ldGhvZHMiLCJsb2dvdXQiLCJfdGhpcyIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsIiRzdG9yZSIsImRpc3BhdGNoIiwibG9jYWxTdG9yYWdlIiwiY2xlYXIiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhyZWYiLCJzdG9wIiwidG9nZ2xlIiwiZXZlbnQiLCJjb21taXQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/TopBar.vue?vue&type=script&lang=js\n");

/***/ }),

/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/routing/RouteTo.vue?vue&type=script&lang=js":
/*!**************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/routing/RouteTo.vue?vue&type=script&lang=js ***!
  \**************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Routing component to simplify <router-link> expressions.\n// Using router-link to get the edit page for user 1 would be: <router-link :to=\"{ name: \"users.edit\", params: { id: 1 }}\"></router-link>\n// With this component you can write: <route-to name=\"users.edit\" id=\"1\"></route-to>\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n  name: \"RouteTo\",\n  props: {\n    // Name of destination route\n    name: {\n      type: String,\n      required: true\n    }\n  },\n  data: function data() {\n    return {\n      routeData: {}\n    };\n  },\n  methods: {\n    // Construct underlying router-link component\n    define: function define() {\n      var obj = {\n        name: this.name,\n        params: {}\n      };\n      if (this.$attrs !== undefined) {\n        for (var attr in this.$attrs) {\n          if (this.$attrs.hasOwnProperty(attr)) {\n            obj.params[attr] = this.$attrs[attr];\n          }\n        }\n      }\n      return this.routeData = obj;\n    }\n  },\n  mounted: function mounted() {\n    this.define();\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC01LnVzZVswXSEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvaW5kZXguanM/P3J1bGVTZXRbMF0udXNlWzBdIS4vcmVzb3VyY2VzL2pzL2NvcmUvY29tcG9uZW50cy9yb3V0aW5nL1JvdXRlVG8udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFPSTtBQUNBO0FBQ0E7QUFDQSxpRUFBZTtFQUNYQSxJQUFJLEVBQUUsU0FBUztFQUNmQyxLQUFLLEVBQUU7SUFDSDtJQUNBRCxJQUFJLEVBQUU7TUFDRkUsSUFBSSxFQUFFQyxNQUFNO01BQ1pDLFFBQVEsRUFBRTtJQUNkO0VBQ0osQ0FBQztFQUNEQyxJQUFJLFdBQUFBLEtBQUEsRUFBRztJQUNILE9BQU87TUFDSEMsU0FBUyxFQUFFLENBQUM7SUFDaEI7RUFDSixDQUFDO0VBQ0RDLE9BQU8sRUFBRTtJQUNMO0lBQ0FDLE1BQU0sV0FBQUEsT0FBQSxFQUFHO01BQ0wsSUFBSUMsR0FBRSxHQUFJO1FBQ05ULElBQUksRUFBRSxJQUFJLENBQUNBLElBQUk7UUFDZlUsTUFBTSxFQUFFLENBQUM7TUFDYixDQUFDO01BRUQsSUFBSSxJQUFJLENBQUNDLE1BQUssS0FBTUMsU0FBUyxFQUFFO1FBQzNCLEtBQUssSUFBSUMsSUFBRyxJQUFLLElBQUksQ0FBQ0YsTUFBTSxFQUFFO1VBQzFCLElBQUksSUFBSSxDQUFDQSxNQUFNLENBQUNHLGNBQWMsQ0FBQ0QsSUFBSSxDQUFDLEVBQUU7WUFDbENKLEdBQUcsQ0FBQ0MsTUFBTSxDQUFDRyxJQUFJLElBQUksSUFBSSxDQUFDRixNQUFNLENBQUNFLElBQUksQ0FBQztVQUN4QztRQUNKO01BQ0o7TUFFQSxPQUFPLElBQUksQ0FBQ1AsU0FBUSxHQUFJRyxHQUFHO0lBQy9CO0VBQ0osQ0FBQztFQUNETSxPQUFPLFdBQUFBLFFBQUEsRUFBRztJQUNOLElBQUksQ0FBQ1AsTUFBTSxDQUFDLENBQUM7RUFDakI7QUFDSixDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvcmUvY29tcG9uZW50cy9yb3V0aW5nL1JvdXRlVG8udnVlPzE1MGMiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxuICAgIDxyb3V0ZXItbGluayA6dG89XCJyb3V0ZURhdGFcIj5cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgIDwvcm91dGVyLWxpbms+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuICAgIC8vIFJvdXRpbmcgY29tcG9uZW50IHRvIHNpbXBsaWZ5IDxyb3V0ZXItbGluaz4gZXhwcmVzc2lvbnMuXG4gICAgLy8gVXNpbmcgcm91dGVyLWxpbmsgdG8gZ2V0IHRoZSBlZGl0IHBhZ2UgZm9yIHVzZXIgMSB3b3VsZCBiZTogPHJvdXRlci1saW5rIDp0bz1cInsgbmFtZTogXCJ1c2Vycy5lZGl0XCIsIHBhcmFtczogeyBpZDogMSB9fVwiPjwvcm91dGVyLWxpbms+XG4gICAgLy8gV2l0aCB0aGlzIGNvbXBvbmVudCB5b3UgY2FuIHdyaXRlOiA8cm91dGUtdG8gbmFtZT1cInVzZXJzLmVkaXRcIiBpZD1cIjFcIj48L3JvdXRlLXRvPlxuICAgIGV4cG9ydCBkZWZhdWx0IHtcbiAgICAgICAgbmFtZTogXCJSb3V0ZVRvXCIsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAvLyBOYW1lIG9mIGRlc3RpbmF0aW9uIHJvdXRlXG4gICAgICAgICAgICBuYW1lOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRhdGEoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJvdXRlRGF0YToge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgLy8gQ29uc3RydWN0IHVuZGVybHlpbmcgcm91dGVyLWxpbmsgY29tcG9uZW50XG4gICAgICAgICAgICBkZWZpbmUoKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHt9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLiRhdHRycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGF0dHIgaW4gdGhpcy4kYXR0cnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiRhdHRycy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5wYXJhbXNbYXR0cl0gPSB0aGlzLiRhdHRyc1thdHRyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJvdXRlRGF0YSA9IG9iajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lKCk7XG4gICAgICAgIH1cbiAgICB9XG48L3NjcmlwdD5cblxuPHN0eWxlIHNjb3BlZD5cblxuPC9zdHlsZT4iXSwibmFtZXMiOlsibmFtZSIsInByb3BzIiwidHlwZSIsIlN0cmluZyIsInJlcXVpcmVkIiwiZGF0YSIsInJvdXRlRGF0YSIsIm1ldGhvZHMiLCJkZWZpbmUiLCJvYmoiLCJwYXJhbXMiLCIkYXR0cnMiLCJ1bmRlZmluZWQiLCJhdHRyIiwiaGFzT3duUHJvcGVydHkiLCJtb3VudGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/routing/RouteTo.vue?vue&type=script&lang=js\n");

/***/ }),

/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/plugins/VueAuth.vue?vue&type=script&lang=js":
/*!**********************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/plugins/VueAuth.vue?vue&type=script&lang=js ***!
  \**********************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n  install: function install(app, store) {\n    var _this = this;\n    this.store = store;\n    app.config.globalProperties.$userHas = function (permission) {\n      return _this.checkPermission(permission);\n    };\n    app.config.globalProperties.$userHasAll = function (permissions) {\n      return permissions.every(function (permission) {\n        return _this.checkPermission(permission);\n      });\n    };\n    app.config.globalProperties.$userHasOne = function (permissions) {\n      return permissions.some(function (permission) {\n        return _this.checkPermission(permission, onSystem);\n      });\n    };\n  },\n  checkPermission: function checkPermission(permission) {\n    return this.store.state.permissions.some(function (userPermission) {\n      if (userPermission.endsWith('.*')) {\n        return permission.startsWith(userPermission.slice(0, -1));\n      }\n      return permission === userPermission;\n    });\n  },\n  data: function data() {\n    return [store];\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC01LnVzZVswXSEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvaW5kZXguanM/P3J1bGVTZXRbMF0udXNlWzBdIS4vcmVzb3VyY2VzL2pzL3BsdWdpbnMvVnVlQXV0aC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUNJLGlFQUFlO0VBQ1hBLE9BQU8sRUFBRSxTQUFBQSxRQUFVQyxHQUFHLEVBQUVDLEtBQUssRUFBRTtJQUFBLElBQUFDLEtBQUE7SUFDM0IsSUFBSSxDQUFDRCxLQUFJLEdBQUlBLEtBQUs7SUFFbEJELEdBQUcsQ0FBQ0csTUFBTSxDQUFDQyxnQkFBZ0IsQ0FBQ0MsUUFBTyxHQUFJLFVBQUNDLFVBQVUsRUFBSztNQUNuRCxPQUFPSixLQUFJLENBQUNLLGVBQWUsQ0FBQ0QsVUFBVSxDQUFDO0lBQzNDLENBQUM7SUFFRE4sR0FBRyxDQUFDRyxNQUFNLENBQUNDLGdCQUFnQixDQUFDSSxXQUFVLEdBQUksVUFBQ0MsV0FBVyxFQUFLO01BQ3ZELE9BQU9BLFdBQVcsQ0FBQ0MsS0FBSyxDQUFDLFVBQUFKLFVBQVMsRUFBSztRQUNuQyxPQUFPSixLQUFJLENBQUNLLGVBQWUsQ0FBQ0QsVUFBVSxDQUFDO01BQzNDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRE4sR0FBRyxDQUFDRyxNQUFNLENBQUNDLGdCQUFnQixDQUFDTyxXQUFVLEdBQUksVUFBQ0YsV0FBVyxFQUFLO01BQ3ZELE9BQU9BLFdBQVcsQ0FBQ0csSUFBSSxDQUFDLFVBQUFOLFVBQVMsRUFBSztRQUNsQyxPQUFPSixLQUFJLENBQUNLLGVBQWUsQ0FBQ0QsVUFBVSxFQUFFTyxRQUFRLENBQUM7TUFDckQsQ0FBQyxDQUFDO0lBQ04sQ0FBQztFQUdMLENBQUM7RUFFRE4sZUFBZSxFQUFFLFNBQUFBLGdCQUFVRCxVQUFVLEVBQUU7SUFDbkMsT0FBTyxJQUFJLENBQUNMLEtBQUssQ0FBQ2EsS0FBSyxDQUFDTCxXQUFXLENBQUNHLElBQUksQ0FBQyxVQUFBRyxjQUFhLEVBQUs7TUFFdkQsSUFBSUEsY0FBYyxDQUFDQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDL0IsT0FBUVYsVUFBVSxDQUFDVyxVQUFVLENBQUNGLGNBQWMsQ0FBQ0csS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQzlEO01BQ0EsT0FBUVosVUFBUyxLQUFNUyxjQUFjO0lBQ3pDLENBQUMsQ0FBQztFQUVOLENBQUM7RUFFREksSUFBSSxFQUFFLFNBQUFBLEtBQUEsRUFBVztJQUNiLE9BQU8sQ0FDSGxCLEtBQUksQ0FDUjtFQUNKO0FBQ0osQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9wbHVnaW5zL1Z1ZUF1dGgudnVlP2ExZDciXSwic291cmNlc0NvbnRlbnQiOlsiPHNjcmlwdD5cbiAgICBleHBvcnQgZGVmYXVsdCB7XG4gICAgICAgIGluc3RhbGw6IGZ1bmN0aW9uIChhcHAsIHN0b3JlKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7XG5cbiAgICAgICAgICAgIGFwcC5jb25maWcuZ2xvYmFsUHJvcGVydGllcy4kdXNlckhhcyA9IChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tQZXJtaXNzaW9uKHBlcm1pc3Npb24pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgYXBwLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLiR1c2VySGFzQWxsID0gKHBlcm1pc3Npb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLmV2ZXJ5KHBlcm1pc3Npb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGVja1Blcm1pc3Npb24ocGVybWlzc2lvbik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBhcHAuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMuJHVzZXJIYXNPbmUgPSAocGVybWlzc2lvbnMpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGVybWlzc2lvbnMuc29tZShwZXJtaXNzaW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tQZXJtaXNzaW9uKHBlcm1pc3Npb24sIG9uU3lzdGVtKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cblxuICAgICAgICB9LFxuXG4gICAgICAgIGNoZWNrUGVybWlzc2lvbjogZnVuY3Rpb24gKHBlcm1pc3Npb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnN0YXRlLnBlcm1pc3Npb25zLnNvbWUodXNlclBlcm1pc3Npb24gPT4ge1xuXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJQZXJtaXNzaW9uLmVuZHNXaXRoKCcuKicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAocGVybWlzc2lvbi5zdGFydHNXaXRoKHVzZXJQZXJtaXNzaW9uLnNsaWNlKDAsIC0xKSkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAocGVybWlzc2lvbiA9PT0gdXNlclBlcm1pc3Npb24pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgc3RvcmVcbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgIH1cbjwvc2NyaXB0PlxuIl0sIm5hbWVzIjpbImluc3RhbGwiLCJhcHAiLCJzdG9yZSIsIl90aGlzIiwiY29uZmlnIiwiZ2xvYmFsUHJvcGVydGllcyIsIiR1c2VySGFzIiwicGVybWlzc2lvbiIsImNoZWNrUGVybWlzc2lvbiIsIiR1c2VySGFzQWxsIiwicGVybWlzc2lvbnMiLCJldmVyeSIsIiR1c2VySGFzT25lIiwic29tZSIsIm9uU3lzdGVtIiwic3RhdGUiLCJ1c2VyUGVybWlzc2lvbiIsImVuZHNXaXRoIiwic3RhcnRzV2l0aCIsInNsaWNlIiwiZGF0YSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/plugins/VueAuth.vue?vue&type=script&lang=js\n");

/***/ }),

/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/LoadingIcon.vue?vue&type=template&id=474d299e&scoped=true":
/*!**************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/LoadingIcon.vue?vue&type=template&id=474d299e&scoped=true ***!
  \**************************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"render\": () => (/* binding */ render)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n\nvar _withScopeId = function _withScopeId(n) {\n  return (0,vue__WEBPACK_IMPORTED_MODULE_0__.pushScopeId)(\"data-v-474d299e\"), n = n(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.popScopeId)(), n;\n};\nvar _hoisted_1 = {\n  key: 0,\n  \"class\": \"fa fa-spinner fa-spin\"\n};\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n  return $props.loading ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"i\", _hoisted_1)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC01LnVzZVswXSEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvdGVtcGxhdGVMb2FkZXIuanM/P3J1bGVTZXRbMV0ucnVsZXNbMl0hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2luZGV4LmpzPz9ydWxlU2V0WzBdLnVzZVswXSEuL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvTG9hZGluZ0ljb24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTQ3NGQyOTllJnNjb3BlZD10cnVlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0VBQ3NCLFNBQU07OztTQUFmQSxNQUFBLENBQUFDLE9BQU8sc0RBQWhCQyx1REFBQSxDQUFvRCxLQUFwREMsVUFBb0QiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL0xvYWRpbmdJY29uLnZ1ZT81MjY3Il0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cbiAgICA8aSB2LWlmPVwibG9hZGluZ1wiIGNsYXNzPVwiZmEgZmEtc3Bpbm5lciBmYS1zcGluXCI+PC9pPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbiAgICAvLyBGb250IGF3ZXNvbWUgbG9hZGluZyBzcGlubmVyIGljb25cbiAgICBleHBvcnQgZGVmYXVsdCB7XG4gICAgICAgIG5hbWU6IFwiTG9hZGluZ0ljb25cIixcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIC8vIEFuaW1hdGUgaWNvblxuICAgICAgICAgICAgbG9hZGluZzoge1xuICAgICAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBzY29wZWQ+XG4gICAgaSB7XG4gICAgICAgIG1hcmdpbjogYXV0byA2cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMWVtO1xuICAgIH1cbjwvc3R5bGU+XG4iXSwibmFtZXMiOlsiJHByb3BzIiwibG9hZGluZyIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJfaG9pc3RlZF8xIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/LoadingIcon.vue?vue&type=template&id=474d299e&scoped=true\n");

/***/ }),

/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/FooterBar.vue?vue&type=template&id=5fdfec95&scoped=true":
/*!****************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/FooterBar.vue?vue&type=template&id=5fdfec95&scoped=true ***!
  \****************************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"render\": () => (/* binding */ render)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n\nvar _withScopeId = function _withScopeId(n) {\n  return (0,vue__WEBPACK_IMPORTED_MODULE_0__.pushScopeId)(\"data-v-5fdfec95\"), n = n(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.popScopeId)(), n;\n};\nvar _hoisted_1 = {\n  id: \"footer\"\n};\nvar _hoisted_2 = {\n  \"class\": \"text-lg-right\"\n};\nvar _hoisted_3 = /*#__PURE__*/_withScopeId(function () {\n  return /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"a\", {\n    href: \"https://www.castus.co.uk\"\n  }, \"Castus\", -1 /* HOISTED */);\n});\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"footer\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"p\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(\" © \" + (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(new Date().getFullYear()) + \" - \", 1 /* TEXT */), _hoisted_3, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(\". \")])]);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC01LnVzZVswXSEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvdGVtcGxhdGVMb2FkZXIuanM/P3J1bGVTZXRbMV0ucnVsZXNbMl0hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2luZGV4LmpzPz9ydWxlU2V0WzBdLnVzZVswXSEuL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvbmF2L0Zvb3RlckJhci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NWZkZmVjOTUmc2NvcGVkPXRydWUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztFQUNZQSxFQUFFLEVBQUM7QUFBUTs7RUFDWixTQUFNO0FBQWU7O3NCQUNvQkMsdURBQUEsQ0FBNkM7SUFBMUNDLElBQUksRUFBQztFQUEwQixHQUFDLFFBQU07QUFBQTs7MkRBRnpGQyx1REFBQSxDQUlTLFVBSlRDLFVBSVMsR0FITEgsdURBQUEsQ0FFSSxLQUZKSSxVQUVJLHdEQUZxQixLQUNkLEdBQUFDLG9EQUFBLEtBQU9DLElBQUksR0FBR0MsV0FBVyxNQUFLLEtBQUcsaUJBQUFDLFVBQTZDLDJEQUN6RiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvbmF2L0Zvb3RlckJhci52dWU/YjMyMCJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XG4gICAgPGZvb3RlciBpZD1cImZvb3RlclwiPlxuICAgICAgICA8cCBjbGFzcz1cInRleHQtbGctcmlnaHRcIj5cbiAgICAgICAgICAgICZjb3B5OyB7eyBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgfX0gLSA8YSBocmVmPVwiaHR0cHM6Ly93d3cuY2FzdHVzLmNvLnVrXCI+Q2FzdHVzPC9hPi5cbiAgICAgICAgPC9wPlxuICAgIDwvZm9vdGVyPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiBcIkZvb3RlckJhclwiXG59XG48L3NjcmlwdD5cblxuPHN0eWxlIHNjb3BlZD5cbiAgICAjZm9vdGVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogI2YzZjVmOTtcbiAgICB9XG5cbiAgICBwIHtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBjb2xvcjogIzc1ODY5NztcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMTJweDtcbiAgICB9XG5cbiAgICBwIGEge1xuICAgICAgICBjb2xvcjogIzAwMDtcbiAgICB9XG5cbjwvc3R5bGU+XG4iXSwibmFtZXMiOlsiaWQiLCJfY3JlYXRlRWxlbWVudFZOb2RlIiwiaHJlZiIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJfaG9pc3RlZF8xIiwiX2hvaXN0ZWRfMiIsIl90b0Rpc3BsYXlTdHJpbmciLCJEYXRlIiwiZ2V0RnVsbFllYXIiLCJfaG9pc3RlZF8zIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/FooterBar.vue?vue&type=template&id=5fdfec95&scoped=true\n");

/***/ }),

/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/SideBar.vue?vue&type=template&id=0aa712ce":
/*!**************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/SideBar.vue?vue&type=template&id=0aa712ce ***!
  \**************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"render\": () => (/* binding */ render)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n  var _component_sidebar_menu = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"sidebar-menu\");\n  return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_sidebar_menu, {\n    menu: $data.routes,\n    onToggleCollapse: $options.onToggleCollapse,\n    collapsed: !$data.expanded,\n    width: \"270px\",\n    \"width-collapsed\": \"50px\",\n    theme: \"default-theme\",\n    showOneChild: true,\n    id: \"sidebar\"\n  }, null, 8 /* PROPS */, [\"menu\", \"onToggleCollapse\", \"collapsed\"]);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC01LnVzZVswXSEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvdGVtcGxhdGVMb2FkZXIuanM/P3J1bGVTZXRbMV0ucnVsZXNbMl0hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2luZGV4LmpzPz9ydWxlU2V0WzBdLnVzZVswXSEuL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvbmF2L1NpZGVCYXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTBhYTcxMmNlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OzJEQUNJQSxnREFBQSxDQVNFQyx1QkFBQTtJQVJHQyxJQUFJLEVBQUVDLEtBQUEsQ0FBQUMsTUFBTTtJQUNaQyxnQkFBZSxFQUFFQyxRQUFBLENBQUFELGdCQUFnQjtJQUNqQ0UsU0FBUyxHQUFHSixLQUFBLENBQUFLLFFBQVE7SUFDckJDLEtBQUssRUFBQyxPQUFPO0lBQ2IsaUJBQWUsRUFBQyxNQUFNO0lBQ3RCQyxLQUFLLEVBQUMsZUFBZTtJQUNwQkMsWUFBWSxFQUFFLElBQUk7SUFDbkJDLEVBQUUsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvbmF2L1NpZGVCYXIudnVlPzE4Y2QiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxuICAgIDxzaWRlYmFyLW1lbnVcbiAgICAgICAgOm1lbnU9XCJyb3V0ZXNcIlxuICAgICAgICBAdG9nZ2xlLWNvbGxhcHNlPVwib25Ub2dnbGVDb2xsYXBzZVwiXG4gICAgICAgIDpjb2xsYXBzZWQ9XCIhZXhwYW5kZWRcIlxuICAgICAgICB3aWR0aD1cIjI3MHB4XCJcbiAgICAgICAgd2lkdGgtY29sbGFwc2VkPVwiNTBweFwiXG4gICAgICAgIHRoZW1lPVwiZGVmYXVsdC10aGVtZVwiXG4gICAgICAgIDpzaG93T25lQ2hpbGQ9XCJ0cnVlXCJcbiAgICAgICAgaWQ9XCJzaWRlYmFyXCJcbiAgICAvPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cblxuICAgIGltcG9ydCBSb3V0ZXMgZnJvbSAnfi9yb3V0ZXMnO1xuICAgIGltcG9ydCBjb25zdHJ1Y3RTaWRlYmFyRW50cmllc0Zyb21Sb3V0ZXMgZnJvbSAnfi9jb3JlL21peGlucy9Sb3V0aW5nTWl4aW4nO1xuXG4gICAgLy8gU2lkZWJhciBuYXZpZ2F0aW9uIGNvbXBvbmVudFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcbiAgICAgICAgbmFtZTogXCJTaWRlYmFyXCIsXG4gICAgICAgIGRhdGEoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJvdXRlczogW10sXG4gICAgICAgICAgICAgICAgZXhwYW5kZWQ6IHRoaXMuJHN0b3JlLmdldHRlcnNbJ3NpZGViYXIvZXhwYW5kZWQnXVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAvLyBAdnVlc2VcbiAgICAgICAgICAgIC8vIExvYWQgcm91dGVzIGZvciBzaWRlYmFyIGFuZCByZW5kZXJcbiAgICAgICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm91dGVzID0gUm91dGVzO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXMgPSBjb25zdHJ1Y3RTaWRlYmFyRW50cmllc0Zyb21Sb3V0ZXMocm91dGVzKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9uVG9nZ2xlQ29sbGFwc2UoY29sbGFwc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuY29tbWl0KCdzaWRlYmFyL3RvZ2dsZScpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNldEJvZHlDbGFzcyhleHBhbmRlZCkge1xuICAgICAgICAgICAgICAgIGlmIChleHBhbmRlZCkge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJykuY2xhc3NMaXN0LmFkZCgnbWFpbm5hdi1sZycpO1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJykuY2xhc3NMaXN0LnJlbW92ZSgnbWFpbm5hdi1zbScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKS5jbGFzc0xpc3QucmVtb3ZlKCdtYWlubmF2LWxnJyk7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKS5jbGFzc0xpc3QuYWRkKCdtYWlubmF2LXNtJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTtcblxuICAgICAgICAgICAgdGhpcy4kc3RvcmUud2F0Y2goZnVuY3Rpb24oc3RhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUuc2lkZWJhci5leHBhbmRlZDtcbiAgICAgICAgICAgIH0sIChpbnB1dCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kZWQgPSBpbnB1dDtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEJvZHlDbGFzcyhpbnB1dCk7XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgZGVlcDogdHJ1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0Qm9keUNsYXNzKHRoaXMuZXhwYW5kZWQpO1xuICAgICAgICB9XG4gICAgfVxuPC9zY3JpcHQ+XG5cbjxzdHlsZT5cbi52LXNpZGViYXItbWVudSB7XG4gICAgdG9wOiA0MHB4ICFpbXBvcnRhbnQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDQzLCA1OCwgNzIpO1xuICAgIHotaW5kZXg6IDI7XG59XG5cbi52LXNpZGViYXItbWVudSAudnNtLS1saW5rIHtcbiAgICBmb250LXNpemU6IDEzcHg7XG4gICAgcGFkZGluZzogMnB4IDEwcHg7XG59XG5cbi52LXNpZGViYXItbWVudSAudnNtLS1saW5rLnZzbS0tbGlua19sZXZlbC0xIHtcbiAgICBwYWRkaW5nOiA1cHggN3B4O1xufVxuXG4udi1zaWRlYmFyLW1lbnUgLnZzbS1pdGVtLmZpcnN0LWl0ZW0+LnZzbS1saW5rPi52c20taWNvbiB7XG4gICAgY29sb3I6ICNmZmY7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcbn1cblxuLnZzbS10aXRsZSB7XG4gICAgZm9udC1zaXplOiAxM3B4O1xuICAgIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJywgc2VyaWY7XG4gICAgZm9udC13ZWlnaHQ6IDQwMDtcbn1cblxuLnZzbS0tbGlzdCB7XG4gICAgcGFkZGluZy10b3A6IDEwcHg7XG59XG5cbi52LXNpZGViYXItbWVudSAudnNtLWRyb3Bkb3duPi52c20tbGlzdCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDM3LCA1MCwgNjIpO1xufVxuXG4udi1zaWRlYmFyLW1lbnUgLnZzbS1pdGVtLmZpcnN0LWl0ZW0uYWN0aXZlLWl0ZW0+LnZzbS1saW5rPi52c20taWNvbiwgLnYtc2lkZWJhci1tZW51IC52c20taXRlbS5maXJzdC1pdGVtLnBhcmVudC1hY3RpdmUtaXRlbT4udnNtLWxpbms+LnZzbS1pY29uIHtcbiAgICBjb2xvcjogI2ZmZjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xufVxuXG4udnNtLWxpbms6aG92ZXI+LnZzbS1pY29uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDM2LDQ0LDUzKSAhaW1wb3J0YW50O1xufVxuXG4udi1zaWRlYmFyLW1lbnUgLmNvbGxhcHNlLWJ0biB7XG4gICAgaGVpZ2h0OiAwcHg7XG59XG5cbi52LXNpZGViYXItbWVudSAudnNtLWl0ZW0uYWN0aXZlLWl0ZW0ge1xuICAgIGNvbG9yOiB3aGl0ZTtcbn1cblxuLnYtc2lkZWJhci1tZW51IC52c20taXRlbS5wYXJlbnQtYWN0aXZlLWl0ZW0ge1xuICAgIGNvbG9yOiB3aGl0ZTtcbn1cblxuLnYtc2lkZWJhci1tZW51IC52c20tbGluayB7XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi52LXNpZGViYXItbWVudSAudnNtLWRyb3Bkb3duID4gLnZzbS1saXN0IC52c20tbGluayB7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gICAgbWFyZ2luLWxlZnQ6IDUwcHg7XG59XG5cbiNzaWRlYmFyID4gLmNvbGxhcHNlLWJ0biB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLnYtc2lkZWJhci1tZW51IC52c20tLXRvZ2dsZS1idG4ge1xuICAgIGhlaWdodDogMzVweDtcbn1cbjwvc3R5bGU+XG4iXSwibmFtZXMiOlsiX2NyZWF0ZUJsb2NrIiwiX2NvbXBvbmVudF9zaWRlYmFyX21lbnUiLCJtZW51IiwiJGRhdGEiLCJyb3V0ZXMiLCJvblRvZ2dsZUNvbGxhcHNlIiwiJG9wdGlvbnMiLCJjb2xsYXBzZWQiLCJleHBhbmRlZCIsIndpZHRoIiwidGhlbWUiLCJzaG93T25lQ2hpbGQiLCJpZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/SideBar.vue?vue&type=template&id=0aa712ce\n");

/***/ }),

/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/TopBar.vue?vue&type=template&id=3e41eeb1&scoped=true":
/*!*************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/TopBar.vue?vue&type=template&id=3e41eeb1&scoped=true ***!
  \*************************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"render\": () => (/* binding */ render)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n\nvar _withScopeId = function _withScopeId(n) {\n  return (0,vue__WEBPACK_IMPORTED_MODULE_0__.pushScopeId)(\"data-v-3e41eeb1\"), n = n(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.popScopeId)(), n;\n};\nvar _hoisted_1 = {\n  id: \"navbar\"\n};\nvar _hoisted_2 = {\n  id: \"navbar-container\",\n  \"class\": \"boxed\"\n};\nvar _hoisted_3 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createStaticVNode)(\"<div class=\\\"navbar-header\\\" data-v-3e41eeb1><a href=\\\"/admin/\\\" class=\\\"navbar-brand\\\" data-v-3e41eeb1><div class=\\\"brand-title\\\" data-v-3e41eeb1><span class=\\\"brand-text\\\" data-v-3e41eeb1>Ambassador</span></div><img src=\\\"/images/ship.png\\\" class=\\\"ship-icon\\\" data-v-3e41eeb1></a></div>\", 1);\nvar _hoisted_4 = {\n  \"class\": \"navbar-content clearfix\"\n};\nvar _hoisted_5 = {\n  \"class\": \"nav navbar-top-links pull-left\"\n};\nvar _hoisted_6 = {\n  \"class\": \"tgl-menu-btn\"\n};\nvar _hoisted_7 = /*#__PURE__*/_withScopeId(function () {\n  return /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"i\", {\n    \"class\": \"fa fa-navicon text-dark\"\n  }, null, -1 /* HOISTED */);\n});\nvar _hoisted_8 = [_hoisted_7];\nvar _hoisted_9 = /*#__PURE__*/_withScopeId(function () {\n  return /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"li\", {\n    \"class\": \"dropdown\"\n  }, null, -1 /* HOISTED */);\n});\nvar _hoisted_10 = /*#__PURE__*/_withScopeId(function () {\n  return /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"li\", {\n    \"class\": \"megadropdown\"\n  }, null, -1 /* HOISTED */);\n});\nvar _hoisted_11 = {\n  \"class\": \"nav navbar-top-links pull-right\"\n};\nvar _hoisted_12 = {\n  id: \"dropdown-user\",\n  \"class\": \"dropdown\"\n};\nvar _hoisted_13 = /*#__PURE__*/_withScopeId(function () {\n  return /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n    \"class\": \"ic-user pull-right\"\n  }, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"i\", {\n    \"class\": \"pli-male\"\n  })], -1 /* HOISTED */);\n});\nvar _hoisted_14 = {\n  \"class\": \"username hidden-xs\"\n};\nvar _hoisted_15 = {\n  key: 0,\n  \"class\": \"dropdown-menu dropdown-menu-md dropdown-menu-right panel-default\",\n  style: {\n    \"opacity\": \"1\",\n    \"display\": \"block\"\n  }\n};\nvar _hoisted_16 = {\n  \"class\": \"head-list\"\n};\nvar _hoisted_17 = /*#__PURE__*/_withScopeId(function () {\n  return /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"li\", null, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"<a href=\\\"#\\\">\"), /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"<i class=\\\"pli-male icon-lg icon-fw\\\"></i> Profile\"), /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"</a>\")], -1 /* HOISTED */);\n});\nvar _hoisted_18 = /*#__PURE__*/_withScopeId(function () {\n  return /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"i\", {\n    \"class\": \"pli-unlock\"\n  }, null, -1 /* HOISTED */);\n});\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"header\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_2, [_hoisted_3, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"ul\", _hoisted_5, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"li\", _hoisted_6, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"a\", {\n    \"class\": \"mainnav-toggle\",\n    onClick: _cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(function () {\n      return $options.toggle && $options.toggle.apply($options, arguments);\n    }, [\"prevent\"])),\n    id: \"mainnav-toggle\",\n    href: \"#\",\n    title: \"Hide menu\"\n  }, _hoisted_8)]), _hoisted_9, _hoisted_10]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"ul\", _hoisted_11, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"li\", _hoisted_12, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"a\", {\n    href: \"\",\n    onClick: _cache[1] || (_cache[1] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(function ($event) {\n      return $data.menuVisible = !$data.menuVisible;\n    }, [\"prevent\"])),\n    \"class\": \"dropdown-toggle text-right\",\n    \"aria-expanded\": \"true\"\n  }, [_hoisted_13, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_14, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.$store.getters['auth/getUserName']), 1 /* TEXT */)]), $data.menuVisible ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_15, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\" User dropdown menu \"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"ul\", _hoisted_16, [_hoisted_17, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"li\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"a\", {\n    href: \"#\",\n    onClick: _cache[2] || (_cache[2] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(function () {\n      return $options.logout && $options.logout.apply($options, arguments);\n    }, [\"prevent\"]))\n  }, [_hoisted_18, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(\" Logout \")])])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)])])])])]);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC01LnVzZVswXSEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvdGVtcGxhdGVMb2FkZXIuanM/P3J1bGVTZXRbMV0ucnVsZXNbMl0hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2luZGV4LmpzPz9ydWxlU2V0WzBdLnVzZVswXSEuL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvbmF2L1RvcEJhci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9M2U0MWVlYjEmc2NvcGVkPXRydWUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztFQUNZQSxFQUFFLEVBQUM7QUFBUTs7RUFDVkEsRUFBRSxFQUFDLGtCQUFrQjtFQUFDLFNBQU07Ozs7RUFVeEIsU0FBTTtBQUF5Qjs7RUFFNUIsU0FBTTtBQUFnQzs7RUFDbEMsU0FBTTtBQUFjOztzQkFFaEJDLHVEQUFBLENBQXVDO0lBQXBDLFNBQU07RUFBeUI7QUFBQTtrQkFBbENDLFVBQXVDOztzQkFHL0NELHVEQUFBLENBQTBCO0lBQXRCLFNBQU07RUFBVTtBQUFBOztzQkFDcEJBLHVEQUFBLENBQThCO0lBQTFCLFNBQU07RUFBYztBQUFBOztFQUd4QixTQUFNO0FBQWlDOztFQUNuQ0QsRUFBRSxFQUFDLGVBQWU7RUFBQyxTQUFNOzs7c0JBRXhDQyx1REFBQSxDQUVPO0lBRkQsU0FBTTtFQUFvQixpQkFDL0JBLHVEQUFBLENBQXdCO0lBQXJCLFNBQU07RUFBVTs7O0VBRUksU0FBTTtBQUFvQjs7O0VBSVgsU0FBTSxrRUFBa0U7RUFBQ0UsS0FBa0MsRUFBbEM7SUFBQTtJQUFBO0VBQUE7OztFQUV6RixTQUFNO0FBQVc7O3NCQUNqQkYsdURBQUEsQ0FJSywwQkFIREcsdURBQUEsa0JBQW1CLGVBQ25CQSx1REFBQSxzREFBdUQsZUFDdkRBLHVEQUFBLFFBQVc7OztzQkFJUEgsdURBQUEsQ0FBMEI7SUFBdkIsU0FBTTtFQUFZO0FBQUE7OzJEQTNDekRJLHVEQUFBLENBc0RTLFVBdERUQyxVQXNEUyxHQXJETEwsdURBQUEsQ0FvRE0sT0FwRE5NLFVBb0RNLEdBbkRGQyxVQU9NLEVBRU5QLHVEQUFBLENBdUNNLE9BdkNOUSxVQXVDTSxHQXJDRlIsdURBQUEsQ0FRSyxNQVJMUyxVQVFLLEdBUERULHVEQUFBLENBSUssTUFKTFUsVUFJSyxHQUhEVix1REFBQSxDQUVJO0lBRkQsU0FBTSxnQkFBZ0I7SUFBRVcsT0FBSyxFQUFBQyxNQUFBLFFBQUFBLE1BQUEsTUFBQUMsa0RBQUE7TUFBQSxPQUFVQyxRQUFBLENBQUFDLE1BQUEsSUFBQUQsUUFBQSxDQUFBQyxNQUFBLENBQUFDLEtBQUEsQ0FBQUYsUUFBQSxFQUFBRyxTQUFBLENBQU07SUFBQTtJQUFFbEIsRUFBRSxFQUFDLGdCQUFnQjtJQUFDbUIsSUFBSSxFQUFDLEdBQUc7SUFBQ0MsS0FBSyxFQUFDO29CQUl6RkMsVUFBMEIsRUFDMUJDLFdBQThCLElBR2xDckIsdURBQUEsQ0EwQkssTUExQkxzQixXQTBCSyxHQXpCRHRCLHVEQUFBLENBd0JLLE1BeEJMdUIsV0F3QkssR0F2QkR2Qix1REFBQSxDQUtJO0lBTERrQixJQUFJLEVBQUMsRUFBRTtJQUFFUCxPQUFLLEVBQUFDLE1BQUEsUUFBQUEsTUFBQSxNQUFBQyxrREFBQSxXQUFBVyxNQUFBO01BQUEsT0FBVUMsS0FBQSxDQUFBQyxXQUFXLElBQUlELEtBQUEsQ0FBQUMsV0FBVztJQUFBO0lBQUUsU0FBTSw0QkFBNEI7SUFBQyxlQUFhLEVBQUM7TUFDdkhDLFdBRU8sRUFDWTNCLHVEQUFBLENBQThFLE9BQTlFNEIsV0FBOEUsRUFBQUMsb0RBQUEsQ0FBM0NDLElBQUEsQ0FBQUMsTUFBTSxDQUFDQyxPQUFPLHdDQUkxQ1AsS0FBQSxDQUFBQyxXQUFXLHNEQUF0QnRCLHVEQUFBLENBY00sT0FkTjZCLFdBY00sR0FiRjlCLHVEQUFBLHdCQUEyQixFQUMzQkgsdURBQUEsQ0FXSyxNQVhMa0MsV0FXSyxHQVZEQyxXQUlLLEVBQ0xuQyx1REFBQSxDQUlLLGFBSERBLHVEQUFBLENBRUk7SUFGRGtCLElBQUksRUFBQyxHQUFHO0lBQUVQLE9BQUssRUFBQUMsTUFBQSxRQUFBQSxNQUFBLE1BQUFDLGtEQUFBO01BQUEsT0FBVUMsUUFBQSxDQUFBc0IsTUFBQSxJQUFBdEIsUUFBQSxDQUFBc0IsTUFBQSxDQUFBcEIsS0FBQSxDQUFBRixRQUFBLEVBQUFHLFNBQUEsQ0FBTTtJQUFBO01BQzlCb0IsV0FBMEIsaUVBQzlCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvcmUvY29tcG9uZW50cy9uYXYvVG9wQmFyLnZ1ZT8wNDAxIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cbiAgICA8aGVhZGVyIGlkPVwibmF2YmFyXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJuYXZiYXItY29udGFpbmVyXCIgY2xhc3M9XCJib3hlZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hdmJhci1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiL2FkbWluL1wiIGNsYXNzPVwibmF2YmFyLWJyYW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJicmFuZC10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZC10ZXh0XCI+QW1iYXNzYWRvcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2ltYWdlcy9zaGlwLnBuZ1wiIGNsYXNzPVwic2hpcC1pY29uXCIvPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2YmFyLWNvbnRlbnQgY2xlYXJmaXhcIj5cblxuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXZiYXItdG9wLWxpbmtzIHB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJ0Z2wtbWVudS1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibWFpbm5hdi10b2dnbGVcIiBAY2xpY2sucHJldmVudD1cInRvZ2dsZVwiIGlkPVwibWFpbm5hdi10b2dnbGVcIiBocmVmPVwiI1wiIHRpdGxlPVwiSGlkZSBtZW51XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1uYXZpY29uIHRleHQtZGFya1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZHJvcGRvd25cIj48L2xpPlxuICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJtZWdhZHJvcGRvd25cIj48L2xpPlxuICAgICAgICAgICAgICAgIDwvdWw+XG5cbiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2YmFyLXRvcC1saW5rcyBwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaSBpZD1cImRyb3Bkb3duLXVzZXJcIiBjbGFzcz1cImRyb3Bkb3duXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiXCIgQGNsaWNrLnByZXZlbnQ9XCJtZW51VmlzaWJsZSA9ICFtZW51VmlzaWJsZVwiIGNsYXNzPVwiZHJvcGRvd24tdG9nZ2xlIHRleHQtcmlnaHRcIiBhcmlhLWV4cGFuZGVkPVwidHJ1ZVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpYy11c2VyIHB1bGwtcmlnaHRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJwbGktbWFsZVwiPjwvaT5cblx0XHRcdFx0XHRcdFx0XHRcdDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlcm5hbWUgaGlkZGVuLXhzXCI+e3sgJHN0b3JlLmdldHRlcnNbJ2F1dGgvZ2V0VXNlck5hbWUnXSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdi1pZj1cIm1lbnVWaXNpYmxlXCIgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRyb3Bkb3duLW1lbnUtbWQgZHJvcGRvd24tbWVudS1yaWdodCBwYW5lbC1kZWZhdWx0XCIgc3R5bGU9XCJvcGFjaXR5OiAxOyBkaXNwbGF5OiBibG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVXNlciBkcm9wZG93biBtZW51IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImhlYWQtbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPGEgaHJlZj1cIiNcIj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08aSBjbGFzcz1cInBsaS1tYWxlIGljb24tbGcgaWNvbi1md1wiPjwvaT4gUHJvZmlsZS0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTwvYT4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBAY2xpY2sucHJldmVudD1cImxvZ291dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGxpLXVubG9ja1wiPjwvaT4gTG9nb3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgIDwvZGl2PlxuICAgIDwvaGVhZGVyPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbiAgICAvLyBUb3AgbmF2aWdhdGlvbiBiYXIgY29tcG9uZW50XG4gICAgZXhwb3J0IGRlZmF1bHQge1xuICAgICAgICBuYW1lOiBcIlRvcEJhclwiLFxuICAgICAgICBkYXRhKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtZW51VmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgIC8vIEB2dWVzZVxuICAgICAgICAgICAgLy8gTG9nb3V0IG9mIHdhdmVcbiAgICAgICAgICAgIGFzeW5jIGxvZ291dCgpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnYXV0aC9sb2dvdXQnKTtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gQHZ1ZXNlXG4gICAgICAgICAgICAvLyBUb2dnbGUgdGhlIHNpZGViYXJcbiAgICAgICAgICAgIHRvZ2dsZShldmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHN0b3JlLmNvbW1pdCgnc2lkZWJhci90b2dnbGUnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9LFxuXG5cbiAgICAgICAgfVxuICAgIH1cbjwvc2NyaXB0PlxuXG48c3R5bGUgc2NvcGVkPlxuLnNoaXAtaWNvbiB7XG4gICAgbWF4LXdpZHRoOjMwcHg7XG4gICAgbWFyZ2luLWxlZnQ6MTBweDtcbiAgICBtYXJnaW4tdG9wOjEwcHhcbn1cblxuI25hdmJhciB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xufVxuPC9zdHlsZT5cbiJdLCJuYW1lcyI6WyJpZCIsIl9jcmVhdGVFbGVtZW50Vk5vZGUiLCJfaG9pc3RlZF83Iiwic3R5bGUiLCJfY3JlYXRlQ29tbWVudFZOb2RlIiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9ob2lzdGVkXzEiLCJfaG9pc3RlZF8yIiwiX2hvaXN0ZWRfMyIsIl9ob2lzdGVkXzQiLCJfaG9pc3RlZF81IiwiX2hvaXN0ZWRfNiIsIm9uQ2xpY2siLCJfY2FjaGUiLCJfd2l0aE1vZGlmaWVycyIsIiRvcHRpb25zIiwidG9nZ2xlIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJocmVmIiwidGl0bGUiLCJfaG9pc3RlZF85IiwiX2hvaXN0ZWRfMTAiLCJfaG9pc3RlZF8xMSIsIl9ob2lzdGVkXzEyIiwiJGV2ZW50IiwiJGRhdGEiLCJtZW51VmlzaWJsZSIsIl9ob2lzdGVkXzEzIiwiX2hvaXN0ZWRfMTQiLCJfdG9EaXNwbGF5U3RyaW5nIiwiX2N0eCIsIiRzdG9yZSIsImdldHRlcnMiLCJfaG9pc3RlZF8xNSIsIl9ob2lzdGVkXzE2IiwiX2hvaXN0ZWRfMTciLCJsb2dvdXQiLCJfaG9pc3RlZF8xOCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/TopBar.vue?vue&type=template&id=3e41eeb1&scoped=true\n");

/***/ }),

/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/routing/RouteTo.vue?vue&type=template&id=203148a4":
/*!******************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/routing/RouteTo.vue?vue&type=template&id=203148a4 ***!
  \******************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"render\": () => (/* binding */ render)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n  var _component_router_link = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"router-link\");\n  return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_router_link, {\n    to: $data.routeData\n  }, {\n    \"default\": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {\n      return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"default\")];\n    }),\n    _: 3 /* FORWARDED */\n  }, 8 /* PROPS */, [\"to\"]);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC01LnVzZVswXSEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvdGVtcGxhdGVMb2FkZXIuanM/P3J1bGVTZXRbMV0ucnVsZXNbMl0hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2luZGV4LmpzPz9ydWxlU2V0WzBdLnVzZVswXSEuL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvcm91dGluZy9Sb3V0ZVRvLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yMDMxNDhhNC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OzsyREFDSUEsZ0RBQUEsQ0FFY0Msc0JBQUE7SUFGQUMsRUFBRSxFQUFFQyxLQUFBLENBQUFDO0VBQVM7NERBQ3ZCO01BQUEsT0FBYSxDQUFiQywrQ0FBQSxDQUFhQyxJQUFBLENBQUFDLE1BQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL3JvdXRpbmcvUm91dGVUby52dWU/MTUwYyJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XG4gICAgPHJvdXRlci1saW5rIDp0bz1cInJvdXRlRGF0YVwiPlxuICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgPC9yb3V0ZXItbGluaz5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG4gICAgLy8gUm91dGluZyBjb21wb25lbnQgdG8gc2ltcGxpZnkgPHJvdXRlci1saW5rPiBleHByZXNzaW9ucy5cbiAgICAvLyBVc2luZyByb3V0ZXItbGluayB0byBnZXQgdGhlIGVkaXQgcGFnZSBmb3IgdXNlciAxIHdvdWxkIGJlOiA8cm91dGVyLWxpbmsgOnRvPVwieyBuYW1lOiBcInVzZXJzLmVkaXRcIiwgcGFyYW1zOiB7IGlkOiAxIH19XCI+PC9yb3V0ZXItbGluaz5cbiAgICAvLyBXaXRoIHRoaXMgY29tcG9uZW50IHlvdSBjYW4gd3JpdGU6IDxyb3V0ZS10byBuYW1lPVwidXNlcnMuZWRpdFwiIGlkPVwiMVwiPjwvcm91dGUtdG8+XG4gICAgZXhwb3J0IGRlZmF1bHQge1xuICAgICAgICBuYW1lOiBcIlJvdXRlVG9cIixcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIC8vIE5hbWUgb2YgZGVzdGluYXRpb24gcm91dGVcbiAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF0YSgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcm91dGVEYXRhOiB7fVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdW5kZXJseWluZyByb3V0ZXItbGluayBjb21wb25lbnRcbiAgICAgICAgICAgIGRlZmluZSgpIHtcbiAgICAgICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczoge31cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJGF0dHJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYXR0ciBpbiB0aGlzLiRhdHRycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJGF0dHJzLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnBhcmFtc1thdHRyXSA9IHRoaXMuJGF0dHJzW2F0dHJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucm91dGVEYXRhID0gb2JqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmUoKTtcbiAgICAgICAgfVxuICAgIH1cbjwvc2NyaXB0PlxuXG48c3R5bGUgc2NvcGVkPlxuXG48L3N0eWxlPiJdLCJuYW1lcyI6WyJfY3JlYXRlQmxvY2siLCJfY29tcG9uZW50X3JvdXRlcl9saW5rIiwidG8iLCIkZGF0YSIsInJvdXRlRGF0YSIsIl9yZW5kZXJTbG90IiwiX2N0eCIsIiRzbG90cyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/routing/RouteTo.vue?vue&type=template&id=203148a4\n");

/***/ }),

/***/ "./resources/js/app.js":
/*!*****************************!*\
  !*** ./resources/js/app.js ***!
  \*****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n/* harmony import */ var _vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vuex */ \"./resources/js/vuex/index.js\");\n/* harmony import */ var _router__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./router */ \"./resources/js/router.js\");\n/* harmony import */ var _axios__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./axios */ \"./resources/js/axios.js\");\n/* harmony import */ var vue_axios__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vue-axios */ \"./node_modules/vue-axios/dist/vue-axios.esm.min.js\");\n/* harmony import */ var _plugins_VueAuth__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ~/plugins/VueAuth */ \"./resources/js/plugins/VueAuth.vue\");\n/* harmony import */ var laravel_echo__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! laravel-echo */ \"./node_modules/laravel-echo/dist/echo.js\");\n/* harmony import */ var vue_nav_tabs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! vue-nav-tabs */ \"./node_modules/vue-nav-tabs/dist/vue-tabs.common.js\");\n/* harmony import */ var _helpers_StringHelper__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ~/helpers/StringHelper */ \"./resources/js/helpers/StringHelper.js\");\n/* harmony import */ var _helpers_ObjectHelper__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ~/helpers/ObjectHelper */ \"./resources/js/helpers/ObjectHelper.js\");\n/* harmony import */ var vue_sidebar_menu__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! vue-sidebar-menu */ \"./node_modules/vue-sidebar-menu/dist/vue-sidebar-menu.esm.js\");\n/* harmony import */ var vue_sidebar_menu_dist_vue_sidebar_menu_css__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! vue-sidebar-menu/dist/vue-sidebar-menu.css */ \"./node_modules/vue-sidebar-menu/dist/vue-sidebar-menu.css\");\n/* harmony import */ var _core_components_nav_TopBar__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ~/core/components/nav/TopBar */ \"./resources/js/core/components/nav/TopBar.vue\");\n/* harmony import */ var _core_components_nav_SideBar__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ~/core/components/nav/SideBar */ \"./resources/js/core/components/nav/SideBar.vue\");\n/* harmony import */ var _core_components_nav_FooterBar__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./core/components/nav/FooterBar */ \"./resources/js/core/components/nav/FooterBar.vue\");\n/* harmony import */ var _core_components_LoadingIcon__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ~/core/components/LoadingIcon */ \"./resources/js/core/components/LoadingIcon.vue\");\n/* harmony import */ var _core_components_routing_RouteTo__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ~/core/components/routing/RouteTo */ \"./resources/js/core/components/routing/RouteTo.vue\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n__webpack_require__(/*! ./validation/emailIsAvailable.js */ \"./resources/js/validation/emailIsAvailable.js\");\n__webpack_require__(/*! ./validation/validPassword.js */ \"./resources/js/validation/validPassword.js\");\nwindow.Pusher = __webpack_require__(/*! pusher-js */ \"./node_modules/pusher-js/dist/web/pusher.js\");\nwindow.Echo = new laravel_echo__WEBPACK_IMPORTED_MODULE_6__[\"default\"]({\n  broadcaster: 'pusher',\n  key: 'dd344615550a47030a9f',\n  cluster: '',\n  wsHost: window.websockets_host,\n  wssPort: window.websockets_port,\n  authEndpoint: \"/api/broadcasting/auth\",\n  auth: {\n    headers: {\n      Authorization: \"Bearer \".concat(_vuex__WEBPACK_IMPORTED_MODULE_1__.store.getters[\"auth/getAccessToken\"])\n    }\n  }\n});\nwindow.Echo[\"private\"]('user.1').listen('.UserNotification', function (e) {\n  console.log(e);\n});\nvar pending = {};\nvar Vue = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createApp)({});\nVue.component('top-bar', _core_components_nav_TopBar__WEBPACK_IMPORTED_MODULE_12__[\"default\"]);\nVue.component('side-bar', _core_components_nav_SideBar__WEBPACK_IMPORTED_MODULE_13__[\"default\"]);\nVue.component('footer-bar', _core_components_nav_FooterBar__WEBPACK_IMPORTED_MODULE_14__[\"default\"]);\nVue.component('route-to', _core_components_routing_RouteTo__WEBPACK_IMPORTED_MODULE_16__[\"default\"]);\nVue.use(vue_sidebar_menu__WEBPACK_IMPORTED_MODULE_10__[\"default\"]);\nVue.use(_router__WEBPACK_IMPORTED_MODULE_2__.router);\nVue.use(_vuex__WEBPACK_IMPORTED_MODULE_1__.store);\nVue.use(vue_axios__WEBPACK_IMPORTED_MODULE_4__[\"default\"], _axios__WEBPACK_IMPORTED_MODULE_3__.axios);\nVue.use(vue_nav_tabs__WEBPACK_IMPORTED_MODULE_7__[\"default\"]);\n_vuex__WEBPACK_IMPORTED_MODULE_1__.store.axios = _axios__WEBPACK_IMPORTED_MODULE_3__.axios;\n_router__WEBPACK_IMPORTED_MODULE_2__.router.app = Vue;\nif (document.getElementById('app') !== null) {\n  Vue.mount('#app');\n}\nif (document.getElementById('legacyHeader') !== null) {\n  Vue.mount('#legacySidebar');\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.createApp)(_core_components_nav_TopBar__WEBPACK_IMPORTED_MODULE_12__[\"default\"]).use(_vuex__WEBPACK_IMPORTED_MODULE_1__.store).mount('#legacyHeader');\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.createApp)(_core_components_nav_FooterBar__WEBPACK_IMPORTED_MODULE_14__[\"default\"]).use(_vuex__WEBPACK_IMPORTED_MODULE_1__.store).mount('#legacyFooter');\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYXBwLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUErQjtBQUNEO0FBQ0k7QUFDSDtBQUNFO0FBRU87QUFDUjtBQUNHO0FBRWU7QUFDQTtBQUVKO0FBQ0s7QUFFRDtBQUNFO0FBQ0k7QUFDQTtBQUNBO0FBR3hEZ0IsbUJBQU8sQ0FBQyx1RkFBa0MsQ0FBQztBQUMzQ0EsbUJBQU8sQ0FBQyxpRkFBK0IsQ0FBQztBQUV4Q0MsTUFBTSxDQUFDQyxNQUFNLEdBQUdGLG1CQUFPLENBQUMsOERBQVcsQ0FBQztBQUVwQ0MsTUFBTSxDQUFDWCxJQUFJLEdBQUcsSUFBSUEsb0RBQUksQ0FBQztFQUNuQmEsV0FBVyxFQUFFLFFBQVE7RUFDckJDLEdBQUcsRUFBRSxzQkFBc0I7RUFDM0JDLE9BQU8sRUFBRSxFQUFFO0VBQ1hDLE1BQU0sRUFBRUwsTUFBTSxDQUFDTSxlQUFlO0VBQzlCQyxPQUFPLEVBQUVQLE1BQU0sQ0FBQ1EsZUFBZTtFQUMvQkMsWUFBWSwwQkFBMEI7RUFDdENDLElBQUksRUFBRTtJQUNGQyxPQUFPLEVBQUU7TUFDTEMsYUFBYSxZQUFBQyxNQUFBLENBQVk3Qix1RUFBb0M7SUFDakU7RUFDSjtBQUNKLENBQUMsQ0FBQztBQUVGZ0IsTUFBTSxDQUFDWCxJQUFJLFdBQVEsQ0FBQyxRQUFRLENBQUMsQ0FDeEIwQixNQUFNLENBQUMsbUJBQW1CLEVBQUUsVUFBQ0MsQ0FBQyxFQUFLO0VBQ2hDQyxPQUFPLENBQUNDLEdBQUcsQ0FBQ0YsQ0FBQyxDQUFDO0FBR2xCLENBQUMsQ0FBQztBQUlOLElBQU1HLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFJbEIsSUFBSUMsR0FBRyxHQUFHckMsOENBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV2QnFDLEdBQUcsQ0FBQ0MsU0FBUyxDQUFDLFNBQVMsRUFBRTNCLG9FQUFNLENBQUM7QUFDaEMwQixHQUFHLENBQUNDLFNBQVMsQ0FBQyxVQUFVLEVBQUUxQixxRUFBTyxDQUFDO0FBQ2xDeUIsR0FBRyxDQUFDQyxTQUFTLENBQUMsWUFBWSxFQUFFekIsdUVBQVMsQ0FBQztBQUN0Q3dCLEdBQUcsQ0FBQ0MsU0FBUyxDQUFDLFVBQVUsRUFBRXZCLHlFQUFPLENBQUM7QUFHbENzQixHQUFHLENBQUNFLEdBQUcsQ0FBQzdCLHlEQUFjLENBQUM7QUFDdkIyQixHQUFHLENBQUNFLEdBQUcsQ0FBQ3JDLDJDQUFNLENBQUM7QUFDZm1DLEdBQUcsQ0FBQ0UsR0FBRyxDQUFDdEMsd0NBQUssQ0FBQztBQUNkb0MsR0FBRyxDQUFDRSxHQUFHLENBQUNuQyxpREFBUSxFQUFFRCx5Q0FBSyxDQUFDO0FBQ3hCa0MsR0FBRyxDQUFDRSxHQUFHLENBQUNoQyxvREFBTyxDQUFDO0FBRWhCTiw4Q0FBVyxHQUFHRSx5Q0FBSztBQUVuQkQsK0NBQVUsR0FBR21DLEdBQUc7QUFFaEIsSUFBSUksUUFBUSxDQUFDQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFO0VBQ3pDTCxHQUFHLENBQUNNLEtBQUssQ0FBQyxNQUFNLENBQUM7QUFDckI7QUFFQSxJQUFJRixRQUFRLENBQUNDLGNBQWMsQ0FBQyxjQUFjLENBQUMsS0FBSyxJQUFJLEVBQUU7RUFDbERMLEdBQUcsQ0FBQ00sS0FBSyxDQUFDLGdCQUFnQixDQUFDO0VBRTNCM0MsOENBQVMsQ0FBQ1csb0VBQU0sQ0FBQyxDQUFDNEIsR0FBRyxDQUFDdEMsd0NBQUssQ0FBQyxDQUFDMEMsS0FBSyxDQUFDLGVBQWUsQ0FBQztFQUNuRDNDLDhDQUFTLENBQUNhLHVFQUFTLENBQUMsQ0FBQzBCLEdBQUcsQ0FBQ3RDLHdDQUFLLENBQUMsQ0FBQzBDLEtBQUssQ0FBQyxlQUFlLENBQUM7QUFDMUQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYXBwLmpzP2NlZDYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQXBwIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHsgc3RvcmUgfSBmcm9tICcuL3Z1ZXgnXG5pbXBvcnQgeyByb3V0ZXIgfSBmcm9tIFwiLi9yb3V0ZXJcIjtcbmltcG9ydCB7IGF4aW9zIH0gZnJvbSBcIi4vYXhpb3NcIlxuaW1wb3J0IFZ1ZUF4aW9zIGZyb20gJ3Z1ZS1heGlvcyc7XG5cbmltcG9ydCBWdWVBdXRoIGZyb20gJ34vcGx1Z2lucy9WdWVBdXRoJztcbmltcG9ydCBFY2hvIGZyb20gJ2xhcmF2ZWwtZWNobyc7XG5pbXBvcnQgVnVlVGFicyBmcm9tICd2dWUtbmF2LXRhYnMnO1xuXG5pbXBvcnQgU3RyaW5nSGVscGVyIGZyb20gJ34vaGVscGVycy9TdHJpbmdIZWxwZXInO1xuaW1wb3J0IE9iamVjdEhlbHBlciBmcm9tICd+L2hlbHBlcnMvT2JqZWN0SGVscGVyJztcblxuaW1wb3J0IFZ1ZVNpZGViYXJNZW51IGZyb20gJ3Z1ZS1zaWRlYmFyLW1lbnUnO1xuaW1wb3J0ICd2dWUtc2lkZWJhci1tZW51L2Rpc3QvdnVlLXNpZGViYXItbWVudS5jc3MnXG5cbmltcG9ydCBUb3BCYXIgZnJvbSBcIn4vY29yZS9jb21wb25lbnRzL25hdi9Ub3BCYXJcIjtcbmltcG9ydCBTaWRlQmFyIGZyb20gXCJ+L2NvcmUvY29tcG9uZW50cy9uYXYvU2lkZUJhclwiO1xuaW1wb3J0IEZvb3RlckJhciBmcm9tIFwiLi9jb3JlL2NvbXBvbmVudHMvbmF2L0Zvb3RlckJhclwiO1xuaW1wb3J0IExvYWRpbmdJY29uIGZyb20gXCJ+L2NvcmUvY29tcG9uZW50cy9Mb2FkaW5nSWNvblwiO1xuaW1wb3J0IFJvdXRlVG8gZnJvbSAnfi9jb3JlL2NvbXBvbmVudHMvcm91dGluZy9Sb3V0ZVRvJztcblxuXG5yZXF1aXJlKCcuL3ZhbGlkYXRpb24vZW1haWxJc0F2YWlsYWJsZS5qcycpO1xucmVxdWlyZSgnLi92YWxpZGF0aW9uL3ZhbGlkUGFzc3dvcmQuanMnKTtcblxud2luZG93LlB1c2hlciA9IHJlcXVpcmUoJ3B1c2hlci1qcycpO1xuXG53aW5kb3cuRWNobyA9IG5ldyBFY2hvKHtcbiAgICBicm9hZGNhc3RlcjogJ3B1c2hlcicsXG4gICAga2V5OiAnZGQzNDQ2MTU1NTBhNDcwMzBhOWYnLFxuICAgIGNsdXN0ZXI6ICcnLFxuICAgIHdzSG9zdDogd2luZG93LndlYnNvY2tldHNfaG9zdCxcbiAgICB3c3NQb3J0OiB3aW5kb3cud2Vic29ja2V0c19wb3J0LFxuICAgIGF1dGhFbmRwb2ludDogYC9hcGkvYnJvYWRjYXN0aW5nL2F1dGhgLFxuICAgIGF1dGg6IHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3N0b3JlLmdldHRlcnNbJ2F1dGgvZ2V0QWNjZXNzVG9rZW4nXX1gXG4gICAgICAgIH1cbiAgICB9XG59KTtcblxud2luZG93LkVjaG8ucHJpdmF0ZSgndXNlci4xJylcbiAgICAubGlzdGVuKCcuVXNlck5vdGlmaWNhdGlvbicsIChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xuXG5cbiAgICB9KTtcblxuXG5cbmNvbnN0IHBlbmRpbmcgPSB7fTtcblxuXG5cbmxldCBWdWUgPSBjcmVhdGVBcHAoe30pO1xuXG5WdWUuY29tcG9uZW50KCd0b3AtYmFyJywgVG9wQmFyKTtcblZ1ZS5jb21wb25lbnQoJ3NpZGUtYmFyJywgU2lkZUJhcik7XG5WdWUuY29tcG9uZW50KCdmb290ZXItYmFyJywgRm9vdGVyQmFyKTtcblZ1ZS5jb21wb25lbnQoJ3JvdXRlLXRvJywgUm91dGVUbyk7XG5cblxuVnVlLnVzZShWdWVTaWRlYmFyTWVudSk7XG5WdWUudXNlKHJvdXRlcik7XG5WdWUudXNlKHN0b3JlKTtcblZ1ZS51c2UoVnVlQXhpb3MsIGF4aW9zKTtcblZ1ZS51c2UoVnVlVGFicyk7XG5cbnN0b3JlLmF4aW9zID0gYXhpb3M7XG5cbnJvdXRlci5hcHAgPSBWdWU7XG5cbmlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBwJykgIT09IG51bGwpIHtcbiAgICBWdWUubW91bnQoJyNhcHAnKTtcbn1cblxuaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsZWdhY3lIZWFkZXInKSAhPT0gbnVsbCkge1xuICAgIFZ1ZS5tb3VudCgnI2xlZ2FjeVNpZGViYXInKTtcblxuICAgIGNyZWF0ZUFwcChUb3BCYXIpLnVzZShzdG9yZSkubW91bnQoJyNsZWdhY3lIZWFkZXInKTtcbiAgICBjcmVhdGVBcHAoRm9vdGVyQmFyKS51c2Uoc3RvcmUpLm1vdW50KCcjbGVnYWN5Rm9vdGVyJyk7XG59XG4iXSwibmFtZXMiOlsiY3JlYXRlQXBwIiwic3RvcmUiLCJyb3V0ZXIiLCJheGlvcyIsIlZ1ZUF4aW9zIiwiVnVlQXV0aCIsIkVjaG8iLCJWdWVUYWJzIiwiU3RyaW5nSGVscGVyIiwiT2JqZWN0SGVscGVyIiwiVnVlU2lkZWJhck1lbnUiLCJUb3BCYXIiLCJTaWRlQmFyIiwiRm9vdGVyQmFyIiwiTG9hZGluZ0ljb24iLCJSb3V0ZVRvIiwicmVxdWlyZSIsIndpbmRvdyIsIlB1c2hlciIsImJyb2FkY2FzdGVyIiwia2V5IiwiY2x1c3RlciIsIndzSG9zdCIsIndlYnNvY2tldHNfaG9zdCIsIndzc1BvcnQiLCJ3ZWJzb2NrZXRzX3BvcnQiLCJhdXRoRW5kcG9pbnQiLCJhdXRoIiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJjb25jYXQiLCJnZXR0ZXJzIiwibGlzdGVuIiwiZSIsImNvbnNvbGUiLCJsb2ciLCJwZW5kaW5nIiwiVnVlIiwiY29tcG9uZW50IiwidXNlIiwiYXBwIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsIm1vdW50Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/app.js\n");

/***/ }),

/***/ "./resources/js/axios.js":
/*!*******************************!*\
  !*** ./resources/js/axios.js ***!
  \*******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"axios\": () => (/* reexport default from dynamic */ axios__WEBPACK_IMPORTED_MODULE_0___default.a)\n/* harmony export */ });\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! axios */ \"./node_modules/axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vuex */ \"./resources/js/vuex/index.js\");\n/* harmony import */ var _helpers_ObjectHelper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ~/helpers/ObjectHelper */ \"./resources/js/helpers/ObjectHelper.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\n\n\n\nvar pending = {};\naxios__WEBPACK_IMPORTED_MODULE_0___default().interceptors.request.use(function (request) {\n  request.headers.common['X-Requested-With'] = 'XMLHttpRequest';\n  request.headers.common['authorization'] = 'Bearer ' + _vuex__WEBPACK_IMPORTED_MODULE_1__.store.getters[\"auth/getAccessToken\"];\n  if (request.url in pending) {\n    var pendingRequest = pending[request.url];\n    if (request.url.includes('filter-search')) {\n      pendingRequest.cancel();\n    } else {\n      if (request.url === pendingRequest.url && _helpers_ObjectHelper__WEBPACK_IMPORTED_MODULE_2__[\"default\"].compareObjects(request.params, pendingRequest.params) && _helpers_ObjectHelper__WEBPACK_IMPORTED_MODULE_2__[\"default\"].compareObjects(request.data, pendingRequest.data) && request.method === pendingRequest.method) {\n        pendingRequest.cancel();\n      }\n    }\n  }\n  var CancelToken = (axios__WEBPACK_IMPORTED_MODULE_0___default().CancelToken);\n  var source = CancelToken.source();\n  request.cancelToken = source.token;\n  request.cancel = source.cancel;\n  pending[request.url] = request;\n  return request;\n});\naxios__WEBPACK_IMPORTED_MODULE_0___default().interceptors.response.use(function (response) {\n  return response;\n}, /*#__PURE__*/function () {\n  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(error) {\n    var response, retryRequest, _response;\n    return _regeneratorRuntime().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          if (!axios__WEBPACK_IMPORTED_MODULE_0___default().isCancel(error)) {\n            _context.next = 2;\n            break;\n          }\n          return _context.abrupt(\"return\", Promise.reject(error));\n        case 2:\n          if (!(error.response && error.response.status == 401 && !error.request.responseURL.includes('oauth/token'))) {\n            _context.next = 19;\n            break;\n          }\n          _context.next = 5;\n          return _vuex__WEBPACK_IMPORTED_MODULE_1__.store.dispatch('auth/tokenIsExpired');\n        case 5:\n          if (!_context.sent) {\n            _context.next = 17;\n            break;\n          }\n          if (!(_vuex__WEBPACK_IMPORTED_MODULE_1__.store.state.auth.hasOwnProperty('token') && _vuex__WEBPACK_IMPORTED_MODULE_1__.store.state.auth.token && _vuex__WEBPACK_IMPORTED_MODULE_1__.store.state.auth.token.constructor === Object && _vuex__WEBPACK_IMPORTED_MODULE_1__.store.state.auth.token.hasOwnProperty('refresh_token') && _vuex__WEBPACK_IMPORTED_MODULE_1__.store.state.auth.token.refresh_token !== null)) {\n            _context.next = 10;\n            break;\n          }\n          _context.next = 9;\n          return _vuex__WEBPACK_IMPORTED_MODULE_1__.store.dispatch('auth/refresh');\n        case 9:\n          response = _context.sent;\n        case 10:\n          _context.next = 12;\n          return _vuex__WEBPACK_IMPORTED_MODULE_1__.store.dispatch('auth/tokenIsExpired');\n        case 12:\n          if (_context.sent) {\n            _context.next = 17;\n            break;\n          }\n          retryRequest = error.request;\n          retryRequest.headers.authorization = 'Bearer ' + _vuex__WEBPACK_IMPORTED_MODULE_1__.store.getters[\"auth/getAccessToken\"];\n          // retry request\n          _response = axios__WEBPACK_IMPORTED_MODULE_0___default()(_objectSpread({}, retryRequest));\n          return _context.abrupt(\"return\", _response);\n        case 17:\n          localStorage.clear();\n          window.location.href = \"/manage\";\n        case 19:\n          return _context.abrupt(\"return\", Promise.reject(error));\n        case 20:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee);\n  }));\n  return function (_x) {\n    return _ref.apply(this, arguments);\n  };\n}());\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFBO0FBQUEsSUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9heGlvcy5qcz8yYjkzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcyBmcm9tICdheGlvcydcbmltcG9ydCB7IHN0b3JlIH0gZnJvbSAnLi92dWV4J1xuaW1wb3J0IE9iamVjdEhlbHBlciBmcm9tIFwifi9oZWxwZXJzL09iamVjdEhlbHBlclwiO1xuXG5jb25zdCBwZW5kaW5nID0ge307XG5cbmF4aW9zLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgIHJlcXVlc3QuaGVhZGVycy5jb21tb25bJ1gtUmVxdWVzdGVkLVdpdGgnXSA9ICdYTUxIdHRwUmVxdWVzdCc7XG4gICAgcmVxdWVzdC5oZWFkZXJzLmNvbW1vblsnYXV0aG9yaXphdGlvbiddID0gJ0JlYXJlciAnICsgc3RvcmUuZ2V0dGVyc1snYXV0aC9nZXRBY2Nlc3NUb2tlbiddO1xuXG4gICAgaWYgKHJlcXVlc3QudXJsIGluIHBlbmRpbmcpIHtcbiAgICAgICAgbGV0IHBlbmRpbmdSZXF1ZXN0ID0gcGVuZGluZ1tyZXF1ZXN0LnVybF07XG4gICAgICAgIGlmIChyZXF1ZXN0LnVybC5pbmNsdWRlcygnZmlsdGVyLXNlYXJjaCcpKSB7XG4gICAgICAgICAgICBwZW5kaW5nUmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnVybCA9PT0gcGVuZGluZ1JlcXVlc3QudXJsICYmXG4gICAgICAgICAgICAgICAgT2JqZWN0SGVscGVyLmNvbXBhcmVPYmplY3RzKHJlcXVlc3QucGFyYW1zLCBwZW5kaW5nUmVxdWVzdC5wYXJhbXMpICYmXG4gICAgICAgICAgICAgICAgT2JqZWN0SGVscGVyLmNvbXBhcmVPYmplY3RzKHJlcXVlc3QuZGF0YSwgcGVuZGluZ1JlcXVlc3QuZGF0YSkgJiZcbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm1ldGhvZCA9PT0gcGVuZGluZ1JlcXVlc3QubWV0aG9kXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nUmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IENhbmNlbFRva2VuID0gYXhpb3MuQ2FuY2VsVG9rZW47XG4gICAgY29uc3Qgc291cmNlID0gQ2FuY2VsVG9rZW4uc291cmNlKCk7XG4gICAgcmVxdWVzdC5jYW5jZWxUb2tlbiA9IHNvdXJjZS50b2tlbjtcbiAgICByZXF1ZXN0LmNhbmNlbCA9IHNvdXJjZS5jYW5jZWw7XG4gICAgcGVuZGluZ1tyZXF1ZXN0LnVybF0gPSByZXF1ZXN0O1xuXG4gICAgcmV0dXJuIHJlcXVlc3Q7XG59KTtcblxuYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG59LCBhc3luYyBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICBpZiAoYXhpb3MuaXNDYW5jZWwoZXJyb3IpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuICAgIGlmIChlcnJvci5yZXNwb25zZSAmJiBlcnJvci5yZXNwb25zZS5zdGF0dXMgPT0gNDAxICYmICFlcnJvci5yZXF1ZXN0LnJlc3BvbnNlVVJMLmluY2x1ZGVzKCdvYXV0aC90b2tlbicpKVxuICAgIHtcbiAgICAgICAgaWYgKGF3YWl0IHN0b3JlLmRpc3BhdGNoKCdhdXRoL3Rva2VuSXNFeHBpcmVkJykpIHtcbiAgICAgICAgICAgIGlmIChzdG9yZS5zdGF0ZS5hdXRoLmhhc093blByb3BlcnR5KCd0b2tlbicpICYmXG4gICAgICAgICAgICAgICAgc3RvcmUuc3RhdGUuYXV0aC50b2tlbiAmJlxuICAgICAgICAgICAgICAgIHN0b3JlLnN0YXRlLmF1dGgudG9rZW4uY29uc3RydWN0b3IgPT09IE9iamVjdCAmJlxuICAgICAgICAgICAgICAgIHN0b3JlLnN0YXRlLmF1dGgudG9rZW4uaGFzT3duUHJvcGVydHkoJ3JlZnJlc2hfdG9rZW4nKSAmJlxuICAgICAgICAgICAgICAgIHN0b3JlLnN0YXRlLmF1dGgudG9rZW4ucmVmcmVzaF90b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHN0b3JlLmRpc3BhdGNoKCdhdXRoL3JlZnJlc2gnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFhd2FpdCBzdG9yZS5kaXNwYXRjaCgnYXV0aC90b2tlbklzRXhwaXJlZCcpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldHJ5UmVxdWVzdCA9IGVycm9yLnJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgcmV0cnlSZXF1ZXN0LmhlYWRlcnMuYXV0aG9yaXphdGlvbiA9ICdCZWFyZXIgJyArIHN0b3JlLmdldHRlcnNbJ2F1dGgvZ2V0QWNjZXNzVG9rZW4nXTtcbiAgICAgICAgICAgICAgICAvLyByZXRyeSByZXF1ZXN0XG4gICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXhpb3Moey4uLnJldHJ5UmVxdWVzdH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvY2FsU3RvcmFnZS5jbGVhcigpO1xuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwiL21hbmFnZVwiO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG59KTtcblxuZXhwb3J0IHtheGlvcyBhcyBheGlvc307XG4iXSwibmFtZXMiOlsiX3JlZ2VuZXJhdG9yUnVudGltZSIsImV4cG9ydHMiLCJPcCIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093biIsImhhc093blByb3BlcnR5IiwiZGVmaW5lUHJvcGVydHkiLCJvYmoiLCJrZXkiLCJkZXNjIiwidmFsdWUiLCIkU3ltYm9sIiwiU3ltYm9sIiwiaXRlcmF0b3JTeW1ib2wiLCJpdGVyYXRvciIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsImRlZmluZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImVyciIsIndyYXAiLCJpbm5lckZuIiwib3V0ZXJGbiIsInNlbGYiLCJ0cnlMb2NzTGlzdCIsInByb3RvR2VuZXJhdG9yIiwiR2VuZXJhdG9yIiwiZ2VuZXJhdG9yIiwiY3JlYXRlIiwiY29udGV4dCIsIkNvbnRleHQiLCJtYWtlSW52b2tlTWV0aG9kIiwidHJ5Q2F0Y2giLCJmbiIsImFyZyIsInR5cGUiLCJjYWxsIiwiQ29udGludWVTZW50aW5lbCIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJJdGVyYXRvclByb3RvdHlwZSIsImdldFByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJOYXRpdmVJdGVyYXRvclByb3RvdHlwZSIsInZhbHVlcyIsIkdwIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiZm9yRWFjaCIsIm1ldGhvZCIsIl9pbnZva2UiLCJBc3luY0l0ZXJhdG9yIiwiUHJvbWlzZUltcGwiLCJpbnZva2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicmVjb3JkIiwicmVzdWx0IiwiX3R5cGVvZiIsIl9fYXdhaXQiLCJ0aGVuIiwidW53cmFwcGVkIiwiZXJyb3IiLCJwcmV2aW91c1Byb21pc2UiLCJjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyIsInN0YXRlIiwiRXJyb3IiLCJkb25lUmVzdWx0IiwiZGVsZWdhdGUiLCJkZWxlZ2F0ZVJlc3VsdCIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsImRvbmUiLCJtZXRob2ROYW1lIiwidW5kZWZpbmVkIiwiVHlwZUVycm9yIiwiaW5mbyIsInJlc3VsdE5hbWUiLCJuZXh0IiwibmV4dExvYyIsInB1c2hUcnlFbnRyeSIsImxvY3MiLCJlbnRyeSIsInRyeUxvYyIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInB1c2giLCJyZXNldFRyeUVudHJ5IiwiY29tcGxldGlvbiIsInJlc2V0IiwiaXRlcmFibGUiLCJpdGVyYXRvck1ldGhvZCIsImlzTmFOIiwibGVuZ3RoIiwiaSIsImRpc3BsYXlOYW1lIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImdlbkZ1biIsImN0b3IiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJtYXJrIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJhd3JhcCIsImFzeW5jIiwiUHJvbWlzZSIsIml0ZXIiLCJrZXlzIiwidmFsIiwib2JqZWN0IiwicmV2ZXJzZSIsInBvcCIsInNraXBUZW1wUmVzZXQiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicm9vdFJlY29yZCIsInJ2YWwiLCJleGNlcHRpb24iLCJoYW5kbGUiLCJsb2MiLCJjYXVnaHQiLCJoYXNDYXRjaCIsImhhc0ZpbmFsbHkiLCJmaW5hbGx5RW50cnkiLCJjb21wbGV0ZSIsImZpbmlzaCIsIl9jYXRjaCIsInRocm93biIsImRlbGVnYXRlWWllbGQiLCJvd25LZXlzIiwiZW51bWVyYWJsZU9ubHkiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJzeW1ib2xzIiwiZmlsdGVyIiwic3ltIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwic291cmNlIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfdG9Qcm9wZXJ0eUtleSIsIl90b1ByaW1pdGl2ZSIsIlN0cmluZyIsImlucHV0IiwiaGludCIsInByaW0iLCJ0b1ByaW1pdGl2ZSIsInJlcyIsIk51bWJlciIsImFzeW5jR2VuZXJhdG9yU3RlcCIsImdlbiIsIl9uZXh0IiwiX3Rocm93IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmdzIiwiYXhpb3MiLCJzdG9yZSIsIk9iamVjdEhlbHBlciIsInBlbmRpbmciLCJpbnRlcmNlcHRvcnMiLCJyZXF1ZXN0IiwidXNlIiwiaGVhZGVycyIsImNvbW1vbiIsImdldHRlcnMiLCJ1cmwiLCJwZW5kaW5nUmVxdWVzdCIsImluY2x1ZGVzIiwiY2FuY2VsIiwiY29tcGFyZU9iamVjdHMiLCJwYXJhbXMiLCJkYXRhIiwiQ2FuY2VsVG9rZW4iLCJjYW5jZWxUb2tlbiIsInRva2VuIiwicmVzcG9uc2UiLCJfcmVmIiwiX2NhbGxlZSIsInJldHJ5UmVxdWVzdCIsIl9yZXNwb25zZSIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJpc0NhbmNlbCIsInN0YXR1cyIsInJlc3BvbnNlVVJMIiwiZGlzcGF0Y2giLCJhdXRoIiwicmVmcmVzaF90b2tlbiIsImF1dGhvcml6YXRpb24iLCJsb2NhbFN0b3JhZ2UiLCJjbGVhciIsIndpbmRvdyIsImxvY2F0aW9uIiwiaHJlZiIsIl94Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/axios.js\n");

/***/ }),

/***/ "./resources/js/core/mixins/RoutingMixin.js":
/*!**************************************************!*\
  !*** ./resources/js/core/mixins/RoutingMixin.js ***!
  \**************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ constructSidebarEntriesFromRoutes)\n/* harmony export */ });\n/* harmony import */ var _vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../vuex */ \"./resources/js/vuex/index.js\");\n\nfunction constructSidebarEntryFromRoute(route) {\n  var currentPath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n  if (route.meta.permissions !== undefined && route.meta.permissions.length !== 0 && !_vuex__WEBPACK_IMPORTED_MODULE_0__.store.getters[\"auth/userHasOnePermission\"](route.meta.permissions)) {\n    return null;\n  }\n  var returnRoute = {\n    title: route.meta.label,\n    attributes: {\n      'data-section': route.meta.label\n    }\n  };\n  if (route.meta.hasOwnProperty('icon')) {\n    returnRoute.icon = route.meta.icon;\n  }\n  if (route.meta.hasOwnProperty('hiddenFromMenu') && route.meta.hiddenFromMenu === true) {\n    return null;\n  }\n  currentPath = currentPath + '/' + route.path;\n  if (route.hasOwnProperty('children') && !route.meta.hasOwnProperty('hideChildren')) {\n    returnRoute.child = [];\n    route.children.forEach(function (childRoute) {\n      var childMenuItem = constructSidebarEntryFromRoute(childRoute, currentPath);\n      if (childMenuItem != null) {\n        returnRoute.child.push(constructSidebarEntryFromRoute(childRoute, currentPath));\n      }\n    });\n  } else if (route.meta.hasOwnProperty('sectionLink')) {\n    returnRoute.href = prepareLink(currentPath + '/' + route.meta.sectionLink);\n  } else {\n    returnRoute.href = prepareLink(currentPath);\n  }\n  return returnRoute;\n}\nfunction constructSidebarEntriesFromRoutes(routes) {\n  var returnRoutes = [];\n  routes.forEach(function (route) {\n    if (route.hasOwnProperty('meta') && !route.meta.hasOwnProperty('hiddenFromMenu')) {\n      var menuItem = constructSidebarEntryFromRoute(route);\n      if (menuItem !== null) {\n        returnRoutes.push(constructSidebarEntryFromRoute(route));\n      }\n    }\n  });\n  return returnRoutes;\n}\nfunction prepareLink(link) {\n  link = link.replace(/\\/$/, '');\n  link = link.replace(/^\\/+/g, '');\n  return '/' + link.replace('//', '/');\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29yZS9taXhpbnMvUm91dGluZ01peGluLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQWtDO0FBRWxDLFNBQVNDLDhCQUE4QkEsQ0FBQ0MsS0FBSyxFQUFvQjtFQUFBLElBQWxCQyxXQUFXLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLEVBQUU7RUFFM0QsSUFBSUYsS0FBSyxDQUFDSyxJQUFJLENBQUNDLFdBQVcsS0FBS0YsU0FBUyxJQUNqQ0osS0FBSyxDQUFDSyxJQUFJLENBQUNDLFdBQVcsQ0FBQ0gsTUFBTSxLQUFLLENBQUMsSUFDbkMsQ0FBRUwsNkVBQTBDLENBQUNFLEtBQUssQ0FBQ0ssSUFBSSxDQUFDQyxXQUFXLENBQUUsRUFDMUU7SUFDRSxPQUFPLElBQUk7RUFDZjtFQUVBLElBQUlFLFdBQVcsR0FBRztJQUNkQyxLQUFLLEVBQUVULEtBQUssQ0FBQ0ssSUFBSSxDQUFDSyxLQUFLO0lBQ3ZCQyxVQUFVLEVBQUU7TUFDUixjQUFjLEVBQUVYLEtBQUssQ0FBQ0ssSUFBSSxDQUFDSztJQUMvQjtFQUNKLENBQUM7RUFHRCxJQUFJVixLQUFLLENBQUNLLElBQUksQ0FBQ08sY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFO0lBQ25DSixXQUFXLENBQUNLLElBQUksR0FBR2IsS0FBSyxDQUFDSyxJQUFJLENBQUNRLElBQUk7RUFDdEM7RUFFQSxJQUFJYixLQUFLLENBQUNLLElBQUksQ0FBQ08sY0FBYyxDQUFDLGdCQUFnQixDQUFDLElBQUlaLEtBQUssQ0FBQ0ssSUFBSSxDQUFDUyxjQUFjLEtBQUssSUFBSSxFQUFFO0lBQ25GLE9BQU8sSUFBSTtFQUNmO0VBRUFiLFdBQVcsR0FBR0EsV0FBVyxHQUFHLEdBQUcsR0FBR0QsS0FBSyxDQUFDZSxJQUFJO0VBRTVDLElBQUlmLEtBQUssQ0FBQ1ksY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUNaLEtBQUssQ0FBQ0ssSUFBSSxDQUFDTyxjQUFjLENBQUMsY0FBYyxDQUFDLEVBQUU7SUFDaEZKLFdBQVcsQ0FBQ1EsS0FBSyxHQUFHLEVBQUU7SUFDdEJoQixLQUFLLENBQUNpQixRQUFRLENBQUNDLE9BQU8sQ0FBQyxVQUFVQyxVQUFVLEVBQUU7TUFDekMsSUFBSUMsYUFBYSxHQUFHckIsOEJBQThCLENBQUNvQixVQUFVLEVBQUVsQixXQUFXLENBQUM7TUFDM0UsSUFBSW1CLGFBQWEsSUFBSSxJQUFJLEVBQUU7UUFDdkJaLFdBQVcsQ0FBQ1EsS0FBSyxDQUFDSyxJQUFJLENBQUN0Qiw4QkFBOEIsQ0FBQ29CLFVBQVUsRUFBRWxCLFdBQVcsQ0FBQyxDQUFDO01BQ25GO0lBQ0osQ0FBQyxDQUFDO0VBQ04sQ0FBQyxNQUFNLElBQUlELEtBQUssQ0FBQ0ssSUFBSSxDQUFDTyxjQUFjLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDakRKLFdBQVcsQ0FBQ2MsSUFBSSxHQUFHQyxXQUFXLENBQUN0QixXQUFXLEdBQUcsR0FBRyxHQUFHRCxLQUFLLENBQUNLLElBQUksQ0FBQ21CLFdBQVcsQ0FBQztFQUM5RSxDQUFDLE1BQU07SUFDSGhCLFdBQVcsQ0FBQ2MsSUFBSSxHQUFHQyxXQUFXLENBQUN0QixXQUFXLENBQUM7RUFDL0M7RUFDQSxPQUFPTyxXQUFXO0FBQ3RCO0FBRWUsU0FBU2lCLGlDQUFpQ0EsQ0FBQ0MsTUFBTSxFQUFFO0VBQzlELElBQUlDLFlBQVksR0FBRyxFQUFFO0VBRXJCRCxNQUFNLENBQUNSLE9BQU8sQ0FBQyxVQUFVbEIsS0FBSyxFQUFFO0lBQzVCLElBQUlBLEtBQUssQ0FBQ1ksY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUNaLEtBQUssQ0FBQ0ssSUFBSSxDQUFDTyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtNQUM5RSxJQUFJZ0IsUUFBUSxHQUFHN0IsOEJBQThCLENBQUNDLEtBQUssQ0FBQztNQUNwRCxJQUFJNEIsUUFBUSxLQUFLLElBQUksRUFBRTtRQUNuQkQsWUFBWSxDQUFDTixJQUFJLENBQUN0Qiw4QkFBOEIsQ0FBQ0MsS0FBSyxDQUFDLENBQUM7TUFDNUQ7SUFDSjtFQUNKLENBQUMsQ0FBQztFQUVGLE9BQU8yQixZQUFZO0FBQ3ZCO0FBRUEsU0FBU0osV0FBV0EsQ0FBQ00sSUFBSSxFQUFFO0VBQ3ZCQSxJQUFJLEdBQUdBLElBQUksQ0FBQ0MsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7RUFDOUJELElBQUksR0FBR0EsSUFBSSxDQUFDQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztFQUNoQyxPQUFPLEdBQUcsR0FBR0QsSUFBSSxDQUFDQyxPQUFPLENBQUMsSUFBSSxFQUFDLEdBQUcsQ0FBQztBQUN2QyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb3JlL21peGlucy9Sb3V0aW5nTWl4aW4uanM/MDk5ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzdG9yZSB9IGZyb20gJy4uLy4uL3Z1ZXgnXG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFNpZGViYXJFbnRyeUZyb21Sb3V0ZShyb3V0ZSwgY3VycmVudFBhdGggPSAnJykge1xuXG4gICAgaWYgKHJvdXRlLm1ldGEucGVybWlzc2lvbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICAmJiByb3V0ZS5tZXRhLnBlcm1pc3Npb25zLmxlbmd0aCAhPT0gMFxuICAgICAgICAmJiAhKHN0b3JlLmdldHRlcnNbJ2F1dGgvdXNlckhhc09uZVBlcm1pc3Npb24nXShyb3V0ZS5tZXRhLnBlcm1pc3Npb25zKSlcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IHJldHVyblJvdXRlID0ge1xuICAgICAgICB0aXRsZTogcm91dGUubWV0YS5sYWJlbCxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgJ2RhdGEtc2VjdGlvbic6IHJvdXRlLm1ldGEubGFiZWxcbiAgICAgICAgfVxuICAgIH07XG5cblxuICAgIGlmIChyb3V0ZS5tZXRhLmhhc093blByb3BlcnR5KCdpY29uJykpIHtcbiAgICAgICAgcmV0dXJuUm91dGUuaWNvbiA9IHJvdXRlLm1ldGEuaWNvbjtcbiAgICB9XG5cbiAgICBpZiAocm91dGUubWV0YS5oYXNPd25Qcm9wZXJ0eSgnaGlkZGVuRnJvbU1lbnUnKSAmJiByb3V0ZS5tZXRhLmhpZGRlbkZyb21NZW51ID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGN1cnJlbnRQYXRoID0gY3VycmVudFBhdGggKyAnLycgKyByb3V0ZS5wYXRoO1xuXG4gICAgaWYgKHJvdXRlLmhhc093blByb3BlcnR5KCdjaGlsZHJlbicpICYmICFyb3V0ZS5tZXRhLmhhc093blByb3BlcnR5KCdoaWRlQ2hpbGRyZW4nKSkge1xuICAgICAgICByZXR1cm5Sb3V0ZS5jaGlsZCA9IFtdO1xuICAgICAgICByb3V0ZS5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZFJvdXRlKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRNZW51SXRlbSA9IGNvbnN0cnVjdFNpZGViYXJFbnRyeUZyb21Sb3V0ZShjaGlsZFJvdXRlLCBjdXJyZW50UGF0aCk7XG4gICAgICAgICAgICBpZiAoY2hpbGRNZW51SXRlbSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuUm91dGUuY2hpbGQucHVzaChjb25zdHJ1Y3RTaWRlYmFyRW50cnlGcm9tUm91dGUoY2hpbGRSb3V0ZSwgY3VycmVudFBhdGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChyb3V0ZS5tZXRhLmhhc093blByb3BlcnR5KCdzZWN0aW9uTGluaycpKSB7XG4gICAgICAgIHJldHVyblJvdXRlLmhyZWYgPSBwcmVwYXJlTGluayhjdXJyZW50UGF0aCArICcvJyArIHJvdXRlLm1ldGEuc2VjdGlvbkxpbmspO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVyblJvdXRlLmhyZWYgPSBwcmVwYXJlTGluayhjdXJyZW50UGF0aCk7XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5Sb3V0ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29uc3RydWN0U2lkZWJhckVudHJpZXNGcm9tUm91dGVzKHJvdXRlcykge1xuICAgIGxldCByZXR1cm5Sb3V0ZXMgPSBbXTtcblxuICAgIHJvdXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChyb3V0ZSkge1xuICAgICAgICBpZiAocm91dGUuaGFzT3duUHJvcGVydHkoJ21ldGEnKSAmJiAhcm91dGUubWV0YS5oYXNPd25Qcm9wZXJ0eSgnaGlkZGVuRnJvbU1lbnUnKSkge1xuICAgICAgICAgICAgbGV0IG1lbnVJdGVtID0gY29uc3RydWN0U2lkZWJhckVudHJ5RnJvbVJvdXRlKHJvdXRlKTtcbiAgICAgICAgICAgIGlmIChtZW51SXRlbSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVyblJvdXRlcy5wdXNoKGNvbnN0cnVjdFNpZGViYXJFbnRyeUZyb21Sb3V0ZShyb3V0ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmV0dXJuUm91dGVzO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlTGluayhsaW5rKSB7XG4gICAgbGluayA9IGxpbmsucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgICBsaW5rID0gbGluay5yZXBsYWNlKC9eXFwvKy9nLCAnJyk7XG4gICAgcmV0dXJuICcvJyArIGxpbmsucmVwbGFjZSgnLy8nLCcvJyk7XG59XG4iXSwibmFtZXMiOlsic3RvcmUiLCJjb25zdHJ1Y3RTaWRlYmFyRW50cnlGcm9tUm91dGUiLCJyb3V0ZSIsImN1cnJlbnRQYXRoIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwibWV0YSIsInBlcm1pc3Npb25zIiwiZ2V0dGVycyIsInJldHVyblJvdXRlIiwidGl0bGUiLCJsYWJlbCIsImF0dHJpYnV0ZXMiLCJoYXNPd25Qcm9wZXJ0eSIsImljb24iLCJoaWRkZW5Gcm9tTWVudSIsInBhdGgiLCJjaGlsZCIsImNoaWxkcmVuIiwiZm9yRWFjaCIsImNoaWxkUm91dGUiLCJjaGlsZE1lbnVJdGVtIiwicHVzaCIsImhyZWYiLCJwcmVwYXJlTGluayIsInNlY3Rpb25MaW5rIiwiY29uc3RydWN0U2lkZWJhckVudHJpZXNGcm9tUm91dGVzIiwicm91dGVzIiwicmV0dXJuUm91dGVzIiwibWVudUl0ZW0iLCJsaW5rIiwicmVwbGFjZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/core/mixins/RoutingMixin.js\n");

/***/ }),

/***/ "./resources/js/domain/Enquiries/vuex/enquiries.js":
/*!*********************************************************!*\
  !*** ./resources/js/domain/Enquiries/vuex/enquiries.js ***!
  \*********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar Enquiries = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nEnquiries.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n  state.endpoints['all'] = '/api/enquiries';\n  state.lastDate = null;\n  state.sort = {};\n  return state;\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Enquiries);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL0VucXVpcmllcy92dWV4L2VucXVpcmllcy5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFvRDtBQUVwRCxJQUFJQyxTQUFTLEdBQUFDLGFBQUEsS0FBT0YsaUVBQVUsQ0FBQztBQUUvQkMsU0FBUyxDQUFDRSxLQUFLLEdBQUcsWUFBWTtFQUMxQixJQUFJQSxLQUFLLEdBQUdILHVFQUFnQixDQUFDLENBQUM7RUFFOUJHLEtBQUssQ0FBQ0MsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLGdCQUFnQjtFQUV6Q0QsS0FBSyxDQUFDRSxRQUFRLEdBQUcsSUFBSTtFQUNyQkYsS0FBSyxDQUFDRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0VBR2YsT0FBT0gsS0FBSztBQUNoQixDQUFDO0FBSUQsaUVBQWVGLFNBQVMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZG9tYWluL0VucXVpcmllcy92dWV4L2VucXVpcmllcy5qcz9hMWU5Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlTW9kdWxlIGZyb20gXCJ+L3Z1ZXgvbW9kdWxlcy9iYXNlLW1vZHVsZVwiO1xuXG5sZXQgRW5xdWlyaWVzID0gey4uLkJhc2VNb2R1bGV9O1xuXG5FbnF1aXJpZXMuc3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHN0YXRlID0gQmFzZU1vZHVsZS5zdGF0ZSgpO1xuXG4gICAgc3RhdGUuZW5kcG9pbnRzWydhbGwnXSA9ICcvYXBpL2VucXVpcmllcyc7XG5cbiAgICBzdGF0ZS5sYXN0RGF0ZSA9IG51bGw7XG4gICAgc3RhdGUuc29ydCA9IHt9O1xuXG5cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgRW5xdWlyaWVzOyJdLCJuYW1lcyI6WyJCYXNlTW9kdWxlIiwiRW5xdWlyaWVzIiwiX29iamVjdFNwcmVhZCIsInN0YXRlIiwiZW5kcG9pbnRzIiwibGFzdERhdGUiLCJzb3J0Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/domain/Enquiries/vuex/enquiries.js\n");

/***/ }),

/***/ "./resources/js/domain/Enquiries/vuex/enquiry_brochure_enquiries.js":
/*!**************************************************************************!*\
  !*** ./resources/js/domain/Enquiries/vuex/enquiry_brochure_enquiries.js ***!
  \**************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar enquiryBrochureEnquiries = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nenquiryBrochureEnquiries.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n  state.lastDate = null;\n  state.sort = {};\n  return state;\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (enquiryBrochureEnquiries);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL0VucXVpcmllcy92dWV4L2VucXVpcnlfYnJvY2h1cmVfZW5xdWlyaWVzLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQW9EO0FBRXBELElBQUlDLHdCQUF3QixHQUFBQyxhQUFBLEtBQU9GLGlFQUFVLENBQUM7QUFFOUNDLHdCQUF3QixDQUFDRSxLQUFLLEdBQUcsWUFBWTtFQUN6QyxJQUFJQSxLQUFLLEdBQUdILHVFQUFnQixDQUFDLENBQUM7RUFFOUJHLEtBQUssQ0FBQ0MsUUFBUSxHQUFHLElBQUk7RUFDckJELEtBQUssQ0FBQ0UsSUFBSSxHQUFHLENBQUMsQ0FBQztFQUVmLE9BQU9GLEtBQUs7QUFDaEIsQ0FBQztBQUVELGlFQUFlRix3QkFBd0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZG9tYWluL0VucXVpcmllcy92dWV4L2VucXVpcnlfYnJvY2h1cmVfZW5xdWlyaWVzLmpzP2Y3YzIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2VNb2R1bGUgZnJvbSBcIn4vdnVleC9tb2R1bGVzL2Jhc2UtbW9kdWxlXCI7XG5cbmxldCBlbnF1aXJ5QnJvY2h1cmVFbnF1aXJpZXMgPSB7Li4uQmFzZU1vZHVsZX07XG5cbmVucXVpcnlCcm9jaHVyZUVucXVpcmllcy5zdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgc3RhdGUgPSBCYXNlTW9kdWxlLnN0YXRlKCk7XG5cbiAgICBzdGF0ZS5sYXN0RGF0ZSA9IG51bGw7XG4gICAgc3RhdGUuc29ydCA9IHt9O1xuXG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZW5xdWlyeUJyb2NodXJlRW5xdWlyaWVzO1xuIl0sIm5hbWVzIjpbIkJhc2VNb2R1bGUiLCJlbnF1aXJ5QnJvY2h1cmVFbnF1aXJpZXMiLCJfb2JqZWN0U3ByZWFkIiwic3RhdGUiLCJsYXN0RGF0ZSIsInNvcnQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/domain/Enquiries/vuex/enquiry_brochure_enquiries.js\n");

/***/ }),

/***/ "./resources/js/domain/Enquiries/vuex/enquiry_brochures.js":
/*!*****************************************************************!*\
  !*** ./resources/js/domain/Enquiries/vuex/enquiry_brochures.js ***!
  \*****************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar enquiryBrochures = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nenquiryBrochures.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n  state.lastDate = null;\n  state.sort = {};\n  return state;\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (enquiryBrochures);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL0VucXVpcmllcy92dWV4L2VucXVpcnlfYnJvY2h1cmVzLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQW9EO0FBRXBELElBQUlDLGdCQUFnQixHQUFBQyxhQUFBLEtBQU9GLGlFQUFVLENBQUM7QUFFdENDLGdCQUFnQixDQUFDRSxLQUFLLEdBQUcsWUFBWTtFQUNqQyxJQUFJQSxLQUFLLEdBQUdILHVFQUFnQixDQUFDLENBQUM7RUFFOUJHLEtBQUssQ0FBQ0MsUUFBUSxHQUFHLElBQUk7RUFDckJELEtBQUssQ0FBQ0UsSUFBSSxHQUFHLENBQUMsQ0FBQztFQUVmLE9BQU9GLEtBQUs7QUFDaEIsQ0FBQztBQUlELGlFQUFlRixnQkFBZ0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZG9tYWluL0VucXVpcmllcy92dWV4L2VucXVpcnlfYnJvY2h1cmVzLmpzP2UxNjEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2VNb2R1bGUgZnJvbSBcIn4vdnVleC9tb2R1bGVzL2Jhc2UtbW9kdWxlXCI7XG5cbmxldCBlbnF1aXJ5QnJvY2h1cmVzID0gey4uLkJhc2VNb2R1bGV9O1xuXG5lbnF1aXJ5QnJvY2h1cmVzLnN0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCBzdGF0ZSA9IEJhc2VNb2R1bGUuc3RhdGUoKTtcblxuICAgIHN0YXRlLmxhc3REYXRlID0gbnVsbDtcbiAgICBzdGF0ZS5zb3J0ID0ge307XG5cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgZW5xdWlyeUJyb2NodXJlcztcbiJdLCJuYW1lcyI6WyJCYXNlTW9kdWxlIiwiZW5xdWlyeUJyb2NodXJlcyIsIl9vYmplY3RTcHJlYWQiLCJzdGF0ZSIsImxhc3REYXRlIiwic29ydCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/domain/Enquiries/vuex/enquiry_brochures.js\n");

/***/ }),

/***/ "./resources/js/domain/ancillaries/vuex/parking-options.js":
/*!*****************************************************************!*\
  !*** ./resources/js/domain/ancillaries/vuex/parking-options.js ***!
  \*****************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar ParkingOptions = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nParkingOptions.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n  state.endpoints['all'] = '/api/parking-options';\n  state.lastDate = null;\n  state.sort = {};\n  return state;\n};\nParkingOptions.actions.updateParkingOptionStatus = /*#__PURE__*/function () {\n  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref, data) {\n    var commit, getters, response;\n    return _regeneratorRuntime().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          commit = _ref.commit, getters = _ref.getters;\n          _context.next = 3;\n          return this.axios.post('/api/parking-options/update-status', data);\n        case 3:\n          response = _context.sent;\n          return _context.abrupt(\"return\", response.data);\n        case 5:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee, this);\n  }));\n  return function (_x, _x2) {\n    return _ref2.apply(this, arguments);\n  };\n}();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ParkingOptions);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL2FuY2lsbGFyaWVzL3Z1ZXgvcGFya2luZy1vcHRpb25zLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7OzsrQ0FDQSxxSkFBQUEsbUJBQUEsWUFBQUEsb0JBQUEsV0FBQUMsT0FBQSxTQUFBQSxPQUFBLE9BQUFDLEVBQUEsR0FBQUMsTUFBQSxDQUFBQyxTQUFBLEVBQUFDLE1BQUEsR0FBQUgsRUFBQSxDQUFBSSxjQUFBLEVBQUFDLGNBQUEsR0FBQUosTUFBQSxDQUFBSSxjQUFBLGNBQUFDLEdBQUEsRUFBQUMsR0FBQSxFQUFBQyxJQUFBLElBQUFGLEdBQUEsQ0FBQUMsR0FBQSxJQUFBQyxJQUFBLENBQUFDLEtBQUEsS0FBQUMsT0FBQSx3QkFBQUMsTUFBQSxHQUFBQSxNQUFBLE9BQUFDLGNBQUEsR0FBQUYsT0FBQSxDQUFBRyxRQUFBLGtCQUFBQyxtQkFBQSxHQUFBSixPQUFBLENBQUFLLGFBQUEsdUJBQUFDLGlCQUFBLEdBQUFOLE9BQUEsQ0FBQU8sV0FBQSw4QkFBQUMsT0FBQVosR0FBQSxFQUFBQyxHQUFBLEVBQUFFLEtBQUEsV0FBQVIsTUFBQSxDQUFBSSxjQUFBLENBQUFDLEdBQUEsRUFBQUMsR0FBQSxJQUFBRSxLQUFBLEVBQUFBLEtBQUEsRUFBQVUsVUFBQSxNQUFBQyxZQUFBLE1BQUFDLFFBQUEsU0FBQWYsR0FBQSxDQUFBQyxHQUFBLFdBQUFXLE1BQUEsbUJBQUFJLEdBQUEsSUFBQUosTUFBQSxZQUFBQSxPQUFBWixHQUFBLEVBQUFDLEdBQUEsRUFBQUUsS0FBQSxXQUFBSCxHQUFBLENBQUFDLEdBQUEsSUFBQUUsS0FBQSxnQkFBQWMsS0FBQUMsT0FBQSxFQUFBQyxPQUFBLEVBQUFDLElBQUEsRUFBQUMsV0FBQSxRQUFBQyxjQUFBLEdBQUFILE9BQUEsSUFBQUEsT0FBQSxDQUFBdkIsU0FBQSxZQUFBMkIsU0FBQSxHQUFBSixPQUFBLEdBQUFJLFNBQUEsRUFBQUMsU0FBQSxHQUFBN0IsTUFBQSxDQUFBOEIsTUFBQSxD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QSxPQUFBK0csUUFBQSxDQUFBNUcsTUFBQSxXQUtMMEcsUUFBUSxDQUFDSCxJQUFJO1FBQUE7UUFBQTtVQUFBLE9BQUFLLFFBQUEsQ0FBQTVELElBQUE7TUFBQTtJQUFBLEdBQUFxRCxPQUFBO0VBQUEsQ0FDdkI7RUFBQSxpQkFBQVUsRUFBQSxFQUFBQyxHQUFBO0lBQUEsT0FBQVosS0FBQSxDQUFBOUIsS0FBQSxPQUFBRCxTQUFBO0VBQUE7QUFBQTtBQUVELGlFQUFleUIsY0FBYyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9kb21haW4vYW5jaWxsYXJpZXMvdnVleC9wYXJraW5nLW9wdGlvbnMuanM/MWY4YyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZU1vZHVsZSBmcm9tIFwifi92dWV4L21vZHVsZXMvYmFzZS1tb2R1bGVcIjtcblxubGV0IFBhcmtpbmdPcHRpb25zID0gey4uLkJhc2VNb2R1bGV9O1xuXG5QYXJraW5nT3B0aW9ucy5zdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgc3RhdGUgPSBCYXNlTW9kdWxlLnN0YXRlKCk7XG5cbiAgICBzdGF0ZS5lbmRwb2ludHNbJ2FsbCddID0gJy9hcGkvcGFya2luZy1vcHRpb25zJztcblxuICAgIHN0YXRlLmxhc3REYXRlID0gbnVsbDtcbiAgICBzdGF0ZS5zb3J0ID0ge307XG5cblxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5cblBhcmtpbmdPcHRpb25zLmFjdGlvbnMudXBkYXRlUGFya2luZ09wdGlvblN0YXR1cyA9IGFzeW5jIGZ1bmN0aW9uKHtjb21taXQsIGdldHRlcnN9LCBkYXRhKSB7XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5heGlvcy5wb3N0KFxuICAgICAgICAnL2FwaS9wYXJraW5nLW9wdGlvbnMvdXBkYXRlLXN0YXR1cycsXG4gICAgICAgIGRhdGFcbiAgICApO1xuICAgIFxuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUGFya2luZ09wdGlvbnM7XG4iXSwibmFtZXMiOlsiX3JlZ2VuZXJhdG9yUnVudGltZSIsImV4cG9ydHMiLCJPcCIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093biIsImhhc093blByb3BlcnR5IiwiZGVmaW5lUHJvcGVydHkiLCJvYmoiLCJrZXkiLCJkZXNjIiwidmFsdWUiLCIkU3ltYm9sIiwiU3ltYm9sIiwiaXRlcmF0b3JTeW1ib2wiLCJpdGVyYXRvciIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsImRlZmluZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImVyciIsIndyYXAiLCJpbm5lckZuIiwib3V0ZXJGbiIsInNlbGYiLCJ0cnlMb2NzTGlzdCIsInByb3RvR2VuZXJhdG9yIiwiR2VuZXJhdG9yIiwiZ2VuZXJhdG9yIiwiY3JlYXRlIiwiY29udGV4dCIsIkNvbnRleHQiLCJtYWtlSW52b2tlTWV0aG9kIiwidHJ5Q2F0Y2giLCJmbiIsImFyZyIsInR5cGUiLCJjYWxsIiwiQ29udGludWVTZW50aW5lbCIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJJdGVyYXRvclByb3RvdHlwZSIsImdldFByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJOYXRpdmVJdGVyYXRvclByb3RvdHlwZSIsInZhbHVlcyIsIkdwIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiZm9yRWFjaCIsIm1ldGhvZCIsIl9pbnZva2UiLCJBc3luY0l0ZXJhdG9yIiwiUHJvbWlzZUltcGwiLCJpbnZva2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicmVjb3JkIiwicmVzdWx0IiwiX3R5cGVvZiIsIl9fYXdhaXQiLCJ0aGVuIiwidW53cmFwcGVkIiwiZXJyb3IiLCJwcmV2aW91c1Byb21pc2UiLCJjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyIsInN0YXRlIiwiRXJyb3IiLCJkb25lUmVzdWx0IiwiZGVsZWdhdGUiLCJkZWxlZ2F0ZVJlc3VsdCIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsImRvbmUiLCJtZXRob2ROYW1lIiwidW5kZWZpbmVkIiwiVHlwZUVycm9yIiwiaW5mbyIsInJlc3VsdE5hbWUiLCJuZXh0IiwibmV4dExvYyIsInB1c2hUcnlFbnRyeSIsImxvY3MiLCJlbnRyeSIsInRyeUxvYyIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInB1c2giLCJyZXNldFRyeUVudHJ5IiwiY29tcGxldGlvbiIsInJlc2V0IiwiaXRlcmFibGUiLCJpdGVyYXRvck1ldGhvZCIsImlzTmFOIiwibGVuZ3RoIiwiaSIsImRpc3BsYXlOYW1lIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImdlbkZ1biIsImN0b3IiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJtYXJrIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJhd3JhcCIsImFzeW5jIiwiUHJvbWlzZSIsIml0ZXIiLCJrZXlzIiwidmFsIiwib2JqZWN0IiwicmV2ZXJzZSIsInBvcCIsInNraXBUZW1wUmVzZXQiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicm9vdFJlY29yZCIsInJ2YWwiLCJleGNlcHRpb24iLCJoYW5kbGUiLCJsb2MiLCJjYXVnaHQiLCJoYXNDYXRjaCIsImhhc0ZpbmFsbHkiLCJmaW5hbGx5RW50cnkiLCJjb21wbGV0ZSIsImZpbmlzaCIsIl9jYXRjaCIsInRocm93biIsImRlbGVnYXRlWWllbGQiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJnZW4iLCJfbmV4dCIsIl90aHJvdyIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJncyIsImFyZ3VtZW50cyIsImFwcGx5Iiwib3duS2V5cyIsImVudW1lcmFibGVPbmx5IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwic3ltYm9scyIsImZpbHRlciIsInN5bSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIl9vYmplY3RTcHJlYWQiLCJ0YXJnZXQiLCJzb3VyY2UiLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl90b1Byb3BlcnR5S2V5IiwiX3RvUHJpbWl0aXZlIiwiU3RyaW5nIiwiaW5wdXQiLCJoaW50IiwicHJpbSIsInRvUHJpbWl0aXZlIiwicmVzIiwiTnVtYmVyIiwiQmFzZU1vZHVsZSIsIlBhcmtpbmdPcHRpb25zIiwiZW5kcG9pbnRzIiwibGFzdERhdGUiLCJzb3J0IiwiYWN0aW9ucyIsInVwZGF0ZVBhcmtpbmdPcHRpb25TdGF0dXMiLCJfcmVmMiIsIl9jYWxsZWUiLCJfcmVmIiwiZGF0YSIsImNvbW1pdCIsImdldHRlcnMiLCJyZXNwb25zZSIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJheGlvcyIsInBvc3QiLCJfeCIsIl94MiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/domain/ancillaries/vuex/parking-options.js\n");

/***/ }),

/***/ "./resources/js/domain/bookings/vuex/booking-cabins.js":
/*!*************************************************************!*\
  !*** ./resources/js/domain/bookings/vuex/booking-cabins.js ***!
  \*************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar BookingCabins = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nBookingCabins.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n\n  //state.endpoints['all'] = '/api/...';\n\n  state.lastDate = null;\n  state.sort = {};\n  return state;\n};\nBookingCabins.actions.changeCabin = /*#__PURE__*/function () {\n  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref, data) {\n    var state, commit, getters, endpoint, response;\n    return _regeneratorRuntime().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          state = _ref.state, commit = _ref.commit, getters = _ref.getters;\n          endpoint = '/api/bookings/' + data.bookingId + '/cabins/' + data.bookedCabinId;\n          _context.next = 4;\n          return this.axios.patch(endpoint, {\n            data: {\n              type: \"booked_cabin\",\n              id: data.bookedCabinId,\n              attributes: {\n                number: data.newCabinNumber\n              }\n            },\n            meta: {\n              keep_charged_grade: data.keep_charged_grade,\n              reason: data.reason,\n              released_cabin_status: data.released_cabin_status,\n              skip_availability_check: data.skip_availability_check\n            }\n          });\n        case 4:\n          response = _context.sent;\n        case 5:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee, this);\n  }));\n  return function (_x, _x2) {\n    return _ref2.apply(this, arguments);\n  };\n}();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BookingCabins);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL2Jvb2tpbmdzL3Z1ZXgvYm9va2luZy1jYWJpbnMuanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OytDQUNBLHFKQUFBQSxtQkFBQSxZQUFBQSxvQkFBQSxXQUFBQyxPQUFBLFNBQUFBLE9BQUEsT0FBQUMsRUFBQSxHQUFBQyxNQUFBLENBQUFDLFNBQUEsRUFBQUMsTUFBQSxHQUFBSCxFQUFBLENBQUFJLGNBQUEsRUFBQUMsY0FBQSxHQUFBSixNQUFBLENBQUFJLGNBQUEsY0FBQUMsR0FBQSxFQUFBQyxHQUFBLEVBQUFDLElBQUEsSUFBQUYsR0FBQSxDQUFBQyxHQUFBLElBQUFDLElBQUEsQ0FBQUMsS0FBQSxLQUFBQyxPQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsY0FBQSxHQUFBRixPQUFBLENBQUFHLFFBQUEsa0JBQUFDLG1CQUFBLEdBQUFKLE9BQUEsQ0FBQUssYUFBQSx1QkFBQUMsaUJBQUEsR0FBQU4sT0FBQSxDQUFBTyxXQUFBLDhCQUFBQyxPQUFBWixHQUFBLEVBQUFDLEdBQUEsRUFBQUUsS0FBQSxXQUFBUixNQUFBLENBQUFJLGNBQUEsQ0FBQUMsR0FBQSxFQUFBQyxHQUFBLElBQUFFLEtBQUEsRUFBQUEsS0FBQSxFQUFBVSxVQUFBLE1BQUFDLFlBQUEsTUFBQUMsUUFBQSxTQUFBZixHQUFBLENBQUFDLEdBQUEsV0FBQVcsTUFBQSxtQkFBQUksR0FBQSxJQUFBSixNQUFBLFlBQUFBLE9BQUFaLEdBQUEsRUFBQUMsR0FBQSxFQUFBRSxLQUFBLFdBQUFILEdBQUEsQ0FBQUMsR0FBQSxJQUFBRSxLQUFBLGdCQUFBYyxLQUFBQyxPQUFBLEVBQUFDLE9BQUEsRUFBQUMsSUFBQSxFQUFBQyxXQUFBLFFBQUFDLGNBQUEsR0FBQUgsT0FBQSxJQUFBQSxPQUFBLENBQUF2QixTQUFBLFlBQUEyQixTQUFBLEdBQUFKLE9BQUEsR0FBQUksU0FBQSxFQUFBQyxTQUFBLEdBQUE3QixNQUFBLENBQUE4QixNQUFBLENBQUFI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QUFLLENBQUNDLEtBQUssQ0FDakNQLFFBQVEsRUFDUjtZQUNJSCxJQUFJLEVBQUU7Y0FDRjVJLElBQUksRUFBRSxjQUFjO2NBQ3BCdUosRUFBRSxFQUFFWCxJQUFJLENBQUNRLGFBQWE7Y0FDdEJJLFVBQVUsRUFBRTtnQkFDUkMsTUFBTSxFQUFFYixJQUFJLENBQUNjO2NBQ2pCO1lBRUosQ0FBQztZQUNEQyxJQUFJLEVBQUU7Y0FDRkMsa0JBQWtCLEVBQUVoQixJQUFJLENBQUNnQixrQkFBa0I7Y0FDM0NDLE1BQU0sRUFBRWpCLElBQUksQ0FBQ2lCLE1BQU07Y0FDbkJDLHFCQUFxQixFQUFFbEIsSUFBSSxDQUFDa0IscUJBQXFCO2NBQ2pEQyx1QkFBdUIsRUFBRW5CLElBQUksQ0FBQ21CO1lBQ2xDO1VBQ0osQ0FDSixDQUFDO1FBQUE7VUFsQkdmLFFBQVEsR0FBQUUsUUFBQSxDQUFBL0csSUFBQTtRQUFBO1FBQUE7VUFBQSxPQUFBK0csUUFBQSxDQUFBNUQsSUFBQTtNQUFBO0lBQUEsR0FBQW9ELE9BQUE7RUFBQSxDQW9CZjtFQUFBLGlCQUFBc0IsRUFBQSxFQUFBQyxHQUFBO0lBQUEsT0FBQXhCLEtBQUEsQ0FBQTdCLEtBQUEsT0FBQUQsU0FBQTtFQUFBO0FBQUE7QUFHRCxpRUFBZXlCLGFBQWEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZG9tYWluL2Jvb2tpbmdzL3Z1ZXgvYm9va2luZy1jYWJpbnMuanM/ZjIzMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZU1vZHVsZSBmcm9tIFwifi92dWV4L21vZHVsZXMvYmFzZS1tb2R1bGVcIjtcblxubGV0IEJvb2tpbmdDYWJpbnMgPSB7Li4uQmFzZU1vZHVsZX07XG5cbkJvb2tpbmdDYWJpbnMuc3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHN0YXRlID0gQmFzZU1vZHVsZS5zdGF0ZSgpO1xuXG5cbiAgICAvL3N0YXRlLmVuZHBvaW50c1snYWxsJ10gPSAnL2FwaS8uLi4nO1xuXG4gICAgc3RhdGUubGFzdERhdGUgPSBudWxsO1xuICAgIHN0YXRlLnNvcnQgPSB7fTtcblxuXG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuQm9va2luZ0NhYmlucy5hY3Rpb25zLmNoYW5nZUNhYmluID0gYXN5bmMgZnVuY3Rpb24oe3N0YXRlLCBjb21taXQsIGdldHRlcnN9LCBkYXRhKSB7XG4gICAgbGV0IGVuZHBvaW50ID0gJy9hcGkvYm9va2luZ3MvJyArIGRhdGEuYm9va2luZ0lkICsgJy9jYWJpbnMvJyArIGRhdGEuYm9va2VkQ2FiaW5JZDtcbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF4aW9zLnBhdGNoKFxuICAgICAgICBlbmRwb2ludCxcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiYm9va2VkX2NhYmluXCIsXG4gICAgICAgICAgICAgICAgaWQ6IGRhdGEuYm9va2VkQ2FiaW5JZCxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICAgIG51bWJlcjogZGF0YS5uZXdDYWJpbk51bWJlclxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICBrZWVwX2NoYXJnZWRfZ3JhZGU6IGRhdGEua2VlcF9jaGFyZ2VkX2dyYWRlLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogZGF0YS5yZWFzb24sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRfY2FiaW5fc3RhdHVzOiBkYXRhLnJlbGVhc2VkX2NhYmluX3N0YXR1cyxcbiAgICAgICAgICAgICAgICBza2lwX2F2YWlsYWJpbGl0eV9jaGVjazogZGF0YS5za2lwX2F2YWlsYWJpbGl0eV9jaGVja1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKTtcblxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IEJvb2tpbmdDYWJpbnM7Il0sIm5hbWVzIjpbIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJleHBvcnRzIiwiT3AiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd24iLCJoYXNPd25Qcm9wZXJ0eSIsImRlZmluZVByb3BlcnR5Iiwib2JqIiwia2V5IiwiZGVzYyIsInZhbHVlIiwiJFN5bWJvbCIsIlN5bWJvbCIsIml0ZXJhdG9yU3ltYm9sIiwiaXRlcmF0b3IiLCJhc3luY0l0ZXJhdG9yU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsInRvU3RyaW5nVGFnU3ltYm9sIiwidG9TdHJpbmdUYWciLCJkZWZpbmUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJlcnIiLCJ3cmFwIiwiaW5uZXJGbiIsIm91dGVyRm4iLCJzZWxmIiwidHJ5TG9jc0xpc3QiLCJwcm90b0dlbmVyYXRvciIsIkdlbmVyYXRvciIsImdlbmVyYXRvciIsImNyZWF0ZSIsImNvbnRleHQiLCJDb250ZXh0IiwibWFrZUludm9rZU1ldGhvZCIsInRyeUNhdGNoIiwiZm4iLCJhcmciLCJ0eXBlIiwiY2FsbCIsIkNvbnRpbnVlU2VudGluZWwiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiSXRlcmF0b3JQcm90b3R5cGUiLCJnZXRQcm90byIsImdldFByb3RvdHlwZU9mIiwiTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUiLCJ2YWx1ZXMiLCJHcCIsImRlZmluZUl0ZXJhdG9yTWV0aG9kcyIsImZvckVhY2giLCJtZXRob2QiLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwiaW52b2tlIiwicmVzb2x2ZSIsInJlamVjdCIsInJlY29yZCIsInJlc3VsdCIsIl90eXBlb2YiLCJfX2F3YWl0IiwidGhlbiIsInVud3JhcHBlZCIsImVycm9yIiwicHJldmlvdXNQcm9taXNlIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJzdGF0ZSIsIkVycm9yIiwiZG9uZVJlc3VsdCIsImRlbGVnYXRlIiwiZGVsZWdhdGVSZXN1bHQiLCJtYXliZUludm9rZURlbGVnYXRlIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJkb25lIiwibWV0aG9kTmFtZSIsInVuZGVmaW5lZCIsIlR5cGVFcnJvciIsImluZm8iLCJyZXN1bHROYW1lIiwibmV4dCIsIm5leHRMb2MiLCJwdXNoVHJ5RW50cnkiLCJsb2NzIiwiZW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsIml0ZXJhYmxlIiwiaXRlcmF0b3JNZXRob2QiLCJpc05hTiIsImxlbmd0aCIsImkiLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJnZW5GdW4iLCJjdG9yIiwiY29uc3RydWN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJpdGVyIiwia2V5cyIsInZhbCIsIm9iamVjdCIsInJldmVyc2UiLCJwb3AiLCJza2lwVGVtcFJlc2V0IiwicHJldiIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJvb3RSZWNvcmQiLCJydmFsIiwiZXhjZXB0aW9uIiwiaGFuZGxlIiwibG9jIiwiY2F1Z2h0IiwiaGFzQ2F0Y2giLCJoYXNGaW5hbGx5IiwiZmluYWxseUVudHJ5IiwiY29tcGxldGUiLCJmaW5pc2giLCJfY2F0Y2giLCJ0aHJvd24iLCJkZWxlZ2F0ZVlpZWxkIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiZ2VuIiwiX25leHQiLCJfdGhyb3ciLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3MiLCJhcmd1bWVudHMiLCJhcHBseSIsIm93bktleXMiLCJlbnVtZXJhYmxlT25seSIsImdldE93blByb3BlcnR5U3ltYm9scyIsInN5bWJvbHMiLCJmaWx0ZXIiLCJzeW0iLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJfb2JqZWN0U3ByZWFkIiwidGFyZ2V0Iiwic291cmNlIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfdG9Qcm9wZXJ0eUtleSIsIl90b1ByaW1pdGl2ZSIsIlN0cmluZyIsImlucHV0IiwiaGludCIsInByaW0iLCJ0b1ByaW1pdGl2ZSIsInJlcyIsIk51bWJlciIsIkJhc2VNb2R1bGUiLCJCb29raW5nQ2FiaW5zIiwibGFzdERhdGUiLCJzb3J0IiwiYWN0aW9ucyIsImNoYW5nZUNhYmluIiwiX3JlZjIiLCJfY2FsbGVlIiwiX3JlZiIsImRhdGEiLCJjb21taXQiLCJnZXR0ZXJzIiwiZW5kcG9pbnQiLCJyZXNwb25zZSIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJib29raW5nSWQiLCJib29rZWRDYWJpbklkIiwiYXhpb3MiLCJwYXRjaCIsImlkIiwiYXR0cmlidXRlcyIsIm51bWJlciIsIm5ld0NhYmluTnVtYmVyIiwibWV0YSIsImtlZXBfY2hhcmdlZF9ncmFkZSIsInJlYXNvbiIsInJlbGVhc2VkX2NhYmluX3N0YXR1cyIsInNraXBfYXZhaWxhYmlsaXR5X2NoZWNrIiwiX3giLCJfeDIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/domain/bookings/vuex/booking-cabins.js\n");

/***/ }),

/***/ "./resources/js/domain/bookings/vuex/bookings.js":
/*!*******************************************************!*\
  !*** ./resources/js/domain/bookings/vuex/bookings.js ***!
  \*******************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar Bookings = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nBookings.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n  state.endpoints['all'] = '/api/bookings';\n  state.lastDate = null;\n  state.sort = {};\n  return state;\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Bookings);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL2Jvb2tpbmdzL3Z1ZXgvYm9va2luZ3MuanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBb0Q7QUFFcEQsSUFBSUMsUUFBUSxHQUFBQyxhQUFBLEtBQU9GLGlFQUFVLENBQUM7QUFFOUJDLFFBQVEsQ0FBQ0UsS0FBSyxHQUFHLFlBQVk7RUFDekIsSUFBSUEsS0FBSyxHQUFHSCx1RUFBZ0IsQ0FBQyxDQUFDO0VBRTlCRyxLQUFLLENBQUNDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxlQUFlO0VBRXhDRCxLQUFLLENBQUNFLFFBQVEsR0FBRyxJQUFJO0VBQ3JCRixLQUFLLENBQUNHLElBQUksR0FBRyxDQUFDLENBQUM7RUFHZixPQUFPSCxLQUFLO0FBQ2hCLENBQUM7QUFJRCxpRUFBZUYsUUFBUSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9kb21haW4vYm9va2luZ3MvdnVleC9ib29raW5ncy5qcz9iZTY4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlTW9kdWxlIGZyb20gXCJ+L3Z1ZXgvbW9kdWxlcy9iYXNlLW1vZHVsZVwiO1xuXG5sZXQgQm9va2luZ3MgPSB7Li4uQmFzZU1vZHVsZX07XG5cbkJvb2tpbmdzLnN0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCBzdGF0ZSA9IEJhc2VNb2R1bGUuc3RhdGUoKTtcblxuICAgIHN0YXRlLmVuZHBvaW50c1snYWxsJ10gPSAnL2FwaS9ib29raW5ncyc7XG5cbiAgICBzdGF0ZS5sYXN0RGF0ZSA9IG51bGw7XG4gICAgc3RhdGUuc29ydCA9IHt9O1xuXG5cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgQm9va2luZ3M7Il0sIm5hbWVzIjpbIkJhc2VNb2R1bGUiLCJCb29raW5ncyIsIl9vYmplY3RTcHJlYWQiLCJzdGF0ZSIsImVuZHBvaW50cyIsImxhc3REYXRlIiwic29ydCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/domain/bookings/vuex/bookings.js\n");

/***/ }),

/***/ "./resources/js/domain/bookings/vuex/passengers.js":
/*!*********************************************************!*\
  !*** ./resources/js/domain/bookings/vuex/passengers.js ***!
  \*********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar Passengers = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nPassengers.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n\n  //state.endpoints['all'] = '/api/...';\n\n  state.lastDate = null;\n  state.sort = {};\n  return state;\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Passengers);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL2Jvb2tpbmdzL3Z1ZXgvcGFzc2VuZ2Vycy5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFvRDtBQUVwRCxJQUFJQyxVQUFVLEdBQUFDLGFBQUEsS0FBT0YsaUVBQVUsQ0FBQztBQUVoQ0MsVUFBVSxDQUFDRSxLQUFLLEdBQUcsWUFBWTtFQUMzQixJQUFJQSxLQUFLLEdBQUdILHVFQUFnQixDQUFDLENBQUM7O0VBRTlCOztFQUVBRyxLQUFLLENBQUNDLFFBQVEsR0FBRyxJQUFJO0VBQ3JCRCxLQUFLLENBQUNFLElBQUksR0FBRyxDQUFDLENBQUM7RUFHZixPQUFPRixLQUFLO0FBQ2hCLENBQUM7QUFHRCxpRUFBZUYsVUFBVSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9kb21haW4vYm9va2luZ3MvdnVleC9wYXNzZW5nZXJzLmpzPzU0MTkiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2VNb2R1bGUgZnJvbSBcIn4vdnVleC9tb2R1bGVzL2Jhc2UtbW9kdWxlXCI7XG5cbmxldCBQYXNzZW5nZXJzID0gey4uLkJhc2VNb2R1bGV9O1xuXG5QYXNzZW5nZXJzLnN0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCBzdGF0ZSA9IEJhc2VNb2R1bGUuc3RhdGUoKTtcblxuICAgIC8vc3RhdGUuZW5kcG9pbnRzWydhbGwnXSA9ICcvYXBpLy4uLic7XG5cbiAgICBzdGF0ZS5sYXN0RGF0ZSA9IG51bGw7XG4gICAgc3RhdGUuc29ydCA9IHt9O1xuXG5cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IFBhc3NlbmdlcnM7Il0sIm5hbWVzIjpbIkJhc2VNb2R1bGUiLCJQYXNzZW5nZXJzIiwiX29iamVjdFNwcmVhZCIsInN0YXRlIiwibGFzdERhdGUiLCJzb3J0Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/domain/bookings/vuex/passengers.js\n");

/***/ }),

/***/ "./resources/js/domain/cruises/vuex/cruise-cabins.js":
/*!***********************************************************!*\
  !*** ./resources/js/domain/cruises/vuex/cruise-cabins.js ***!
  \***********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar CruiseCabins = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nCruiseCabins.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n\n  //state.endpoints['all'] = '/api/....';\n\n  state.lastDate = null;\n  state.sort = {};\n  return state;\n};\nCruiseCabins.actions.getByCruiseId = /*#__PURE__*/function () {\n  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {\n    var commit,\n      dispatch,\n      getters,\n      state,\n      rootGetters,\n      data,\n      _args = arguments;\n    return _regeneratorRuntime().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          commit = _ref.commit, dispatch = _ref.dispatch, getters = _ref.getters, state = _ref.state, rootGetters = _ref.rootGetters;\n          data = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};\n          if (!(data.cruiseId === undefined)) {\n            _context.next = 4;\n            break;\n          }\n          return _context.abrupt(\"return\", false);\n        case 4:\n          data.endpoint = '/api/cruises/' + data.cruiseId + '/cabins';\n          return _context.abrupt(\"return\", dispatch('getAll', data));\n        case 6:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee);\n  }));\n  return function (_x) {\n    return _ref2.apply(this, arguments);\n  };\n}();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CruiseCabins);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL2NydWlzZXMvdnVleC9jcnVpc2UtY2FiaW5zLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7OzsrQ0FDQSxxSkFBQUEsbUJBQUEsWUFBQUEsb0JBQUEsV0FBQUMsT0FBQSxTQUFBQSxPQUFBLE9BQUFDLEVBQUEsR0FBQUMsTUFBQSxDQUFBQyxTQUFBLEVBQUFDLE1BQUEsR0FBQUgsRUFBQSxDQUFBSSxjQUFBLEVBQUFDLGNBQUEsR0FBQUosTUFBQSxDQUFBSSxjQUFBLGNBQUFDLEdBQUEsRUFBQUMsR0FBQSxFQUFBQyxJQUFBLElBQUFGLEdBQUEsQ0FBQUMsR0FBQSxJQUFBQyxJQUFBLENBQUFDLEtBQUEsS0FBQUMsT0FBQSx3QkFBQUMsTUFBQSxHQUFBQSxNQUFBLE9BQUFDLGNBQUEsR0FBQUYsT0FBQSxDQUFBRyxRQUFBLGtCQUFBQyxtQkFBQSxHQUFBSixPQUFBLENBQUFLLGFBQUEsdUJBQUFDLGlCQUFBLEdBQUFOLE9BQUEsQ0FBQU8sV0FBQSw4QkFBQUMsT0FBQVosR0FBQSxFQUFBQyxHQUFBLEVBQUFFLEtBQUEsV0FBQVIsTUFBQSxDQUFBSSxjQUFBLENBQUFDLEdBQUEsRUFBQUMsR0FBQSxJQUFBRSxLQUFBLEVBQUFBLEtBQUEsRUFBQVUsVUFBQSxNQUFBQyxZQUFBLE1BQUFDLFFBQUEsU0FBQWYsR0FBQSxDQUFBQyxHQUFBLFdBQUFXLE1BQUEsbUJBQUFJLEdBQUEsSUFBQUosTUFBQSxZQUFBQSxPQUFBWixHQUFBLEVBQUFDLEdBQUEsRUFBQUUsS0FBQSxXQUFBSCxHQUFBLENBQUFDLEdBQUEsSUFBQUUsS0FBQSxnQkFBQWMsS0FBQUMsT0FBQSxFQUFBQyxPQUFBLEVBQUFDLElBQUEsRUFBQUMsV0FBQSxRQUFBQyxjQUFBLEdBQUFILE9BQUEsSUFBQUEsT0FBQSxDQUFBdkIsU0FBQSxZQUFBMkIsU0FBQSxHQUFBSixPQUFBLEdBQUFJLFNBQUEsRUFBQUMsU0FBQSxHQUFBN0IsTUFBQSxDQUFBOEIsTUFBQSxDQUFBSCxj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bUYsS0FBQSxRQUFBeEcsU0FBQSxHQUFBd0csS0FBQSxNQUFHLENBQUMsQ0FBQztVQUFBLE1BQ3pHRCxJQUFJLENBQUNJLFFBQVEsS0FBSzNHLFNBQVM7WUFBQTBHLFFBQUEsQ0FBQXRHLElBQUE7WUFBQTtVQUFBO1VBQUEsT0FBQXNHLFFBQUEsQ0FBQTdHLE1BQUEsV0FDcEIsS0FBSztRQUFBO1VBR2hCMEcsSUFBSSxDQUFDSyxRQUFRLEdBQUcsZUFBZSxHQUFHTCxJQUFJLENBQUNJLFFBQVEsR0FBRyxTQUFTO1VBQUMsT0FBQUQsUUFBQSxDQUFBN0csTUFBQSxXQUVyRHVHLFFBQVEsQ0FBQyxRQUFRLEVBQUVHLElBQUksQ0FBQztRQUFBO1FBQUE7VUFBQSxPQUFBRyxRQUFBLENBQUE3RCxJQUFBO01BQUE7SUFBQSxHQUFBb0QsT0FBQTtFQUFBLENBQ2xDO0VBQUEsaUJBQUFZLEVBQUE7SUFBQSxPQUFBYixLQUFBLENBQUE3QixLQUFBLE9BQUFELFNBQUE7RUFBQTtBQUFBO0FBR0QsaUVBQWV5QixZQUFZIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2RvbWFpbi9jcnVpc2VzL3Z1ZXgvY3J1aXNlLWNhYmlucy5qcz83MmM1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlTW9kdWxlIGZyb20gXCJ+L3Z1ZXgvbW9kdWxlcy9iYXNlLW1vZHVsZVwiO1xuXG5sZXQgQ3J1aXNlQ2FiaW5zID0gey4uLkJhc2VNb2R1bGV9O1xuXG5DcnVpc2VDYWJpbnMuc3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHN0YXRlID0gQmFzZU1vZHVsZS5zdGF0ZSgpO1xuXG4gICAgLy9zdGF0ZS5lbmRwb2ludHNbJ2FsbCddID0gJy9hcGkvLi4uLic7XG5cbiAgICBzdGF0ZS5sYXN0RGF0ZSA9IG51bGw7XG4gICAgc3RhdGUuc29ydCA9IHt9O1xuXG5cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5DcnVpc2VDYWJpbnMuYWN0aW9ucy5nZXRCeUNydWlzZUlkID0gYXN5bmMgZnVuY3Rpb24gKHsgY29tbWl0LCBkaXNwYXRjaCwgZ2V0dGVycywgc3RhdGUsIHJvb3RHZXR0ZXJzIH0sIGRhdGEgPSB7fSkge1xuICAgIGlmIChkYXRhLmNydWlzZUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGRhdGEuZW5kcG9pbnQgPSAnL2FwaS9jcnVpc2VzLycgKyBkYXRhLmNydWlzZUlkICsgJy9jYWJpbnMnO1xuXG4gICAgcmV0dXJuIGRpc3BhdGNoKCdnZXRBbGwnLCBkYXRhKTtcbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgQ3J1aXNlQ2FiaW5zOyJdLCJuYW1lcyI6WyJfcmVnZW5lcmF0b3JSdW50aW1lIiwiZXhwb3J0cyIsIk9wIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duIiwiaGFzT3duUHJvcGVydHkiLCJkZWZpbmVQcm9wZXJ0eSIsIm9iaiIsImtleSIsImRlc2MiLCJ2YWx1ZSIsIiRTeW1ib2wiLCJTeW1ib2wiLCJpdGVyYXRvclN5bWJvbCIsIml0ZXJhdG9yIiwiYXN5bmNJdGVyYXRvclN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJ0b1N0cmluZ1RhZ1N5bWJvbCIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiZXJyIiwid3JhcCIsImlubmVyRm4iLCJvdXRlckZuIiwic2VsZiIsInRyeUxvY3NMaXN0IiwicHJvdG9HZW5lcmF0b3IiLCJHZW5lcmF0b3IiLCJnZW5lcmF0b3IiLCJjcmVhdGUiLCJjb250ZXh0IiwiQ29udGV4dCIsIm1ha2VJbnZva2VNZXRob2QiLCJ0cnlDYXRjaCIsImZuIiwiYXJnIiwidHlwZSIsImNhbGwiLCJDb250aW51ZVNlbnRpbmVsIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsIkl0ZXJhdG9yUHJvdG90eXBlIiwiZ2V0UHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwidmFsdWVzIiwiR3AiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwibWV0aG9kIiwiX2ludm9rZSIsIkFzeW5jSXRlcmF0b3IiLCJQcm9taXNlSW1wbCIsImludm9rZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZWNvcmQiLCJyZXN1bHQiLCJfdHlwZW9mIiwiX19hd2FpdCIsInRoZW4iLCJ1bndyYXBwZWQiLCJlcnJvciIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwic3RhdGUiLCJFcnJvciIsImRvbmVSZXN1bHQiLCJkZWxlZ2F0ZSIsImRlbGVnYXRlUmVzdWx0IiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwiZG9uZSIsIm1ldGhvZE5hbWUiLCJ1bmRlZmluZWQiLCJUeXBlRXJyb3IiLCJpbmZvIiwicmVzdWx0TmFtZSIsIm5leHQiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwibG9jcyIsImVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicHVzaCIsInJlc2V0VHJ5RW50cnkiLCJjb21wbGV0aW9uIiwicmVzZXQiLCJpdGVyYWJsZSIsIml0ZXJhdG9yTWV0aG9kIiwiaXNOYU4iLCJsZW5ndGgiLCJpIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiZ2VuRnVuIiwiY3RvciIsImNvbnN0cnVjdG9yIiwibmFtZSIsIm1hcmsiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImF3cmFwIiwiYXN5bmMiLCJQcm9taXNlIiwiaXRlciIsImtleXMiLCJ2YWwiLCJvYmplY3QiLCJyZXZlcnNlIiwicG9wIiwic2tpcFRlbXBSZXNldCIsInByZXYiLCJjaGFyQXQiLCJzbGljZSIsInN0b3AiLCJyb290UmVjb3JkIiwicnZhbCIsImV4Y2VwdGlvbiIsImhhbmRsZSIsImxvYyIsImNhdWdodCIsImhhc0NhdGNoIiwiaGFzRmluYWxseSIsImZpbmFsbHlFbnRyeSIsImNvbXBsZXRlIiwiZmluaXNoIiwiX2NhdGNoIiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsImFzeW5jR2VuZXJhdG9yU3RlcCIsImdlbiIsIl9uZXh0IiwiX3Rocm93IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmdzIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJvd25LZXlzIiwiZW51bWVyYWJsZU9ubHkiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJzeW1ib2xzIiwiZmlsdGVyIiwic3ltIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiX29iamVjdFNwcmVhZCIsInRhcmdldCIsInNvdXJjZSIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJvcGVydHlLZXkiLCJfdG9QcmltaXRpdmUiLCJTdHJpbmciLCJpbnB1dCIsImhpbnQiLCJwcmltIiwidG9QcmltaXRpdmUiLCJyZXMiLCJOdW1iZXIiLCJCYXNlTW9kdWxlIiwiQ3J1aXNlQ2FiaW5zIiwibGFzdERhdGUiLCJzb3J0IiwiYWN0aW9ucyIsImdldEJ5Q3J1aXNlSWQiLCJfcmVmMiIsIl9jYWxsZWUiLCJfcmVmIiwiY29tbWl0IiwiZGlzcGF0Y2giLCJnZXR0ZXJzIiwicm9vdEdldHRlcnMiLCJkYXRhIiwiX2FyZ3MiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwiY3J1aXNlSWQiLCJlbmRwb2ludCIsIl94Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/domain/cruises/vuex/cruise-cabins.js\n");

/***/ }),

/***/ "./resources/js/domain/cruises/vuex/cruises.js":
/*!*****************************************************!*\
  !*** ./resources/js/domain/cruises/vuex/cruises.js ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\n/* harmony import */ var _helpers_StringHelper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ~/helpers/StringHelper */ \"./resources/js/helpers/StringHelper.js\");\n/* harmony import */ var _helpers_ObjectHelper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ~/helpers/ObjectHelper */ \"./resources/js/helpers/ObjectHelper.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\n\nvar Cruises = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nCruises.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n  state.endpoints['all'] = '/api/cruises?fieldset=mas';\n  state.endpoints['codeTitles'] = '/api/cruises/codes-titles';\n  state.endpoints['lastSailDate'] = '/api/cruises/last-date';\n  state.allCodes = [];\n  state.lastDate = null;\n  state.sort = {};\n  state.sort.month = {\n    data: {},\n    meta: {}\n  };\n  state.sort.ship = {\n    data: {},\n    meta: {}\n  };\n  state.sort.meta = {\n    data: {},\n    meta: {}\n  };\n\n  // state.moduleBindings = {\n  //     ship: 'ships/set',\n  //     departure_port: 'ports/set',\n  //     arrival_port: 'ports/set',\n  //     cabin_availability_summary: 'cabinAvailabilitySummary/set',\n  //     lead_price: 'leadPrices/set',\n  //     grade_availability_summary: 'gradeAvailabilitySummary/set',\n  //     available_cruise_cabins: 'availableCruiseCabins/set'\n  // };\n\n  return state;\n};\nCruises.getters.cruiseCodes = function (state) {\n  return function () {\n    var filterString = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n    return state.allCodes.filter(function (code) {\n      return _helpers_StringHelper__WEBPACK_IMPORTED_MODULE_1__[\"default\"].contains(code, filterString);\n    });\n  };\n};\nCruises.getters.lastDate = function (state) {\n  return state.lastDate;\n};\nCruises.getters.sortMeta = function (state) {\n  return function (sortType) {\n    return state.sort[sortType].meta;\n  };\n};\nCruises.getters.shipConfiguration = function (state, getters, rootState, rootGetters) {\n  return function (cruiseCode) {\n    if (getters['exists'](cruiseCode)) {\n      return rootGetters['shipConfigurations/get'](getters['get'](cruiseCode).ship_configuration_id);\n    }\n    return null;\n  };\n};\nCruises.getters.ship = function (state, getters, rootState, rootGetters) {\n  return function (cruiseCode) {\n    var shipConfiguration = getters['shipConfiguration'](cruiseCode);\n    if (_helpers_ObjectHelper__WEBPACK_IMPORTED_MODULE_2__[\"default\"].isObject(shipConfiguration)) {\n      return rootGetters['ships/get'](shipConfiguration.ship_code);\n    }\n    return null;\n  };\n};\nCruises.getters.getCruiseIdFromCruiseCode = function (state) {\n  return function (cruiseCode) {\n    for (var cruiseId in state.all) {\n      if (state.all.hasOwnProperty(cruiseId)) {\n        if (state.all[cruiseId].code.toLowerCase() === cruiseCode.toLowerCase()) {\n          return cruiseId;\n        }\n      }\n    }\n    return null;\n  };\n};\nCruises.mutations.setCruiseCodes = function (state, data) {\n  Vue.set(state, 'allCodes', data);\n};\nCruises.mutations.setLastDate = function (state, data) {\n  Vue.set(state, 'lastDate', data);\n};\nCruises.actions.getCruiseCodesWithTitles = /*#__PURE__*/function () {\n  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {\n    var state,\n      commit,\n      getters,\n      refresh,\n      endpoint,\n      response,\n      _args = arguments;\n    return _regeneratorRuntime().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          state = _ref.state, commit = _ref.commit, getters = _ref.getters;\n          refresh = _args.length > 1 && _args[1] !== undefined ? _args[1] : false;\n          if (!(getters['cruiseCodes']().length === 0 || refresh)) {\n            _context.next = 8;\n            break;\n          }\n          endpoint = state.endpoints['codeTitles'];\n          _context.next = 6;\n          return this.axios.get(endpoint);\n        case 6:\n          response = _context.sent;\n          if (response.status === 200) {\n            commit('setCruiseCodes', response.data);\n          }\n        case 8:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee, this);\n  }));\n  return function (_x) {\n    return _ref2.apply(this, arguments);\n  };\n}();\nCruises.actions.getLastCruiseDate = /*#__PURE__*/function () {\n  var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref3) {\n    var commit, getters, lastDate, endpoint, response;\n    return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n      while (1) switch (_context2.prev = _context2.next) {\n        case 0:\n          commit = _ref3.commit, getters = _ref3.getters;\n          lastDate = getters['lastDate'];\n          endpoint = state.endpoints['lastSailDate'];\n          if (lastDate) {\n            _context2.next = 8;\n            break;\n          }\n          _context2.next = 6;\n          return this.axios.get(endpoint);\n        case 6:\n          response = _context2.sent;\n          if (response.status === 200) {\n            commit('setLastDate', response.data);\n          }\n        case 8:\n        case \"end\":\n          return _context2.stop();\n      }\n    }, _callee2, this);\n  }));\n  return function (_x2) {\n    return _ref4.apply(this, arguments);\n  };\n}();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Cruises);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL2NydWlzZXMvdnVleC9jcnVpc2VzLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OytDQUNBLHFKQUFBQSxtQkFBQSxZQUFBQSxvQkFBQSxXQUFBQyxPQUFBLFNBQUFBLE9BQUEsT0FBQUMsRUFBQSxHQUFBQyxNQUFBLENBQUFDLFNBQUEsRUFBQUMsTUFBQSxHQUFBSCxFQUFBLENBQUFJLGNBQUEsRUFBQUMsY0FBQSxHQUFBSixNQUFBLENBQUFJLGNBQUEsY0FBQUMsR0FBQSxFQUFBQyxHQUFBLEVBQUFDLElBQUEsSUFBQUYsR0FBQSxDQUFBQyxHQUFBLElBQUFDLElBQUEsQ0FBQUMsS0FBQSxLQUFBQyxPQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsY0FBQSxHQUFBRixPQUFBLENBQUFHLFFBQUEsa0JBQUFDLG1CQUFBLEdBQUFKLE9BQUEsQ0FBQUssYUFBQSx1QkFBQUMsaUJBQUEsR0FBQU4sT0FBQSxDQUFBTyxXQUFBLDhCQUFBQyxPQUFBWixHQUFBLEVBQUFDLEdBQUEsRUFBQUUsS0FBQSxXQUFBUixNQUFBLENBQUFJLGNBQUEsQ0FBQUMsR0FBQSxFQUFBQyxHQUFBLElBQUFFLEtBQUEsRUFBQUEsS0FBQSxFQUFBVSxVQUFBLE1BQUFDLFlBQUEsTUFBQUMsUUFBQSxTQUFBZixHQUFBLENBQUFDLEdBQUEsV0FBQVcsTUFBQSxtQkFBQUksR0FBQSxJQUFBSixNQUFBLFlBQUFBLE9BQUFaLEdBQUEsRUFBQUMsR0FBQSxFQUFBRSxLQUFBLFdBQUFILEdBQUEsQ0FBQUMsR0FBQSxJQUFBRSxLQUFBLGdCQUFBYyxLQUFBQyxPQUFBLEVBQUFDLE9BQUEsRUFBQUMsSUFBQSxFQUFBQyxXQUFBLFFBQUFDLGNBQUEsR0FBQUgsT0FBQSxJQUFBQSxPQUFBLENBQUF2QixTQUFBLFlBQUEyQixTQUFBLEdBQUFKLE9BQUEsR0FBQUksU0FBQSxFQUFBQyxTQUFBLEdBQUE3QixNQUFBLENBQUE4QixNQUFBLENBQUFILGNBQUEs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Q0FBQXJHLElBQUE7TUFBQTtJQUFBLEdBQUFrRyxRQUFBO0VBQUEsQ0FFUjtFQUFBLGlCQUFBSSxHQUFBO0lBQUEsT0FBQUwsS0FBQSxDQUFBM0UsS0FBQSxPQUFBRCxTQUFBO0VBQUE7QUFBQTtBQUVELGlFQUFlMkIsT0FBTyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9kb21haW4vY3J1aXNlcy92dWV4L2NydWlzZXMuanM/NDgwYiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZU1vZHVsZSBmcm9tIFwifi92dWV4L21vZHVsZXMvYmFzZS1tb2R1bGVcIjtcbmltcG9ydCBTdHJpbmdIZWxwZXIgZnJvbSBcIn4vaGVscGVycy9TdHJpbmdIZWxwZXJcIjtcbmltcG9ydCBPYmplY3RIZWxwZXIgZnJvbSBcIn4vaGVscGVycy9PYmplY3RIZWxwZXJcIjtcblxubGV0IENydWlzZXMgPSB7Li4uQmFzZU1vZHVsZX07XG5cbkNydWlzZXMuc3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHN0YXRlID0gQmFzZU1vZHVsZS5zdGF0ZSgpO1xuXG4gICAgc3RhdGUuZW5kcG9pbnRzWydhbGwnXSA9ICcvYXBpL2NydWlzZXM/ZmllbGRzZXQ9bWFzJztcblxuICAgIHN0YXRlLmVuZHBvaW50c1snY29kZVRpdGxlcyddID0gJy9hcGkvY3J1aXNlcy9jb2Rlcy10aXRsZXMnO1xuICAgIHN0YXRlLmVuZHBvaW50c1snbGFzdFNhaWxEYXRlJ10gPSAnL2FwaS9jcnVpc2VzL2xhc3QtZGF0ZSc7XG4gICAgc3RhdGUuYWxsQ29kZXMgPSBbXTtcblxuICAgIHN0YXRlLmxhc3REYXRlID0gbnVsbDtcbiAgICBzdGF0ZS5zb3J0ID0ge307XG4gICAgc3RhdGUuc29ydC5tb250aCA9IHtcbiAgICAgICAgZGF0YToge30sXG4gICAgICAgIG1ldGE6IHt9XG4gICAgfTtcbiAgICBzdGF0ZS5zb3J0LnNoaXAgPSB7XG4gICAgICAgIGRhdGE6IHt9LFxuICAgICAgICBtZXRhOiB7fVxuICAgIH07XG4gICAgc3RhdGUuc29ydC5tZXRhID0ge1xuICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgbWV0YToge31cbiAgICB9O1xuXG4gICAgLy8gc3RhdGUubW9kdWxlQmluZGluZ3MgPSB7XG4gICAgLy8gICAgIHNoaXA6ICdzaGlwcy9zZXQnLFxuICAgIC8vICAgICBkZXBhcnR1cmVfcG9ydDogJ3BvcnRzL3NldCcsXG4gICAgLy8gICAgIGFycml2YWxfcG9ydDogJ3BvcnRzL3NldCcsXG4gICAgLy8gICAgIGNhYmluX2F2YWlsYWJpbGl0eV9zdW1tYXJ5OiAnY2FiaW5BdmFpbGFiaWxpdHlTdW1tYXJ5L3NldCcsXG4gICAgLy8gICAgIGxlYWRfcHJpY2U6ICdsZWFkUHJpY2VzL3NldCcsXG4gICAgLy8gICAgIGdyYWRlX2F2YWlsYWJpbGl0eV9zdW1tYXJ5OiAnZ3JhZGVBdmFpbGFiaWxpdHlTdW1tYXJ5L3NldCcsXG4gICAgLy8gICAgIGF2YWlsYWJsZV9jcnVpc2VfY2FiaW5zOiAnYXZhaWxhYmxlQ3J1aXNlQ2FiaW5zL3NldCdcbiAgICAvLyB9O1xuXG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuQ3J1aXNlcy5nZXR0ZXJzLmNydWlzZUNvZGVzID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oZmlsdGVyU3RyaW5nID0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3RhdGUuYWxsQ29kZXMuZmlsdGVyKGNvZGUgPT4gU3RyaW5nSGVscGVyLmNvbnRhaW5zKGNvZGUsIGZpbHRlclN0cmluZykpO1xuICAgIH1cbn07XG5cbkNydWlzZXMuZ2V0dGVycy5sYXN0RGF0ZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLmxhc3REYXRlO1xufVxuXG5DcnVpc2VzLmdldHRlcnMuc29ydE1ldGEgPSBzdGF0ZSA9PiBzb3J0VHlwZSA9PiBzdGF0ZS5zb3J0W3NvcnRUeXBlXS5tZXRhO1xuXG5DcnVpc2VzLmdldHRlcnMuc2hpcENvbmZpZ3VyYXRpb24gPSBmdW5jdGlvbihzdGF0ZSwgZ2V0dGVycywgcm9vdFN0YXRlLCByb290R2V0dGVycykge1xuICAgIHJldHVybiBmdW5jdGlvbihjcnVpc2VDb2RlKSB7XG4gICAgICAgIGlmIChnZXR0ZXJzWydleGlzdHMnXShjcnVpc2VDb2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJvb3RHZXR0ZXJzWydzaGlwQ29uZmlndXJhdGlvbnMvZ2V0J10oZ2V0dGVyc1snZ2V0J10oY3J1aXNlQ29kZSkuc2hpcF9jb25maWd1cmF0aW9uX2lkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuQ3J1aXNlcy5nZXR0ZXJzLnNoaXAgPSBmdW5jdGlvbihzdGF0ZSwgZ2V0dGVycywgcm9vdFN0YXRlLCByb290R2V0dGVycykge1xuICAgIHJldHVybiBmdW5jdGlvbihjcnVpc2VDb2RlKSB7XG4gICAgICAgIGxldCBzaGlwQ29uZmlndXJhdGlvbiA9IGdldHRlcnNbJ3NoaXBDb25maWd1cmF0aW9uJ10oY3J1aXNlQ29kZSk7XG5cbiAgICAgICAgaWYgKE9iamVjdEhlbHBlci5pc09iamVjdChzaGlwQ29uZmlndXJhdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiByb290R2V0dGVyc1snc2hpcHMvZ2V0J10oc2hpcENvbmZpZ3VyYXRpb24uc2hpcF9jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuQ3J1aXNlcy5nZXR0ZXJzLmdldENydWlzZUlkRnJvbUNydWlzZUNvZGUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoY3J1aXNlQ29kZSkge1xuICAgICAgICBmb3IgKGxldCBjcnVpc2VJZCBpbiBzdGF0ZS5hbGwpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5hbGwuaGFzT3duUHJvcGVydHkoY3J1aXNlSWQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLmFsbFtjcnVpc2VJZF0uY29kZS50b0xvd2VyQ2FzZSgpID09PSBjcnVpc2VDb2RlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNydWlzZUlkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbkNydWlzZXMubXV0YXRpb25zLnNldENydWlzZUNvZGVzID0gZnVuY3Rpb24oc3RhdGUsIGRhdGEpIHtcbiAgICBWdWUuc2V0KHN0YXRlLCAnYWxsQ29kZXMnLCBkYXRhKTtcbn07XG5cblxuQ3J1aXNlcy5tdXRhdGlvbnMuc2V0TGFzdERhdGUgPSBmdW5jdGlvbihzdGF0ZSwgZGF0YSkge1xuICAgIFZ1ZS5zZXQoc3RhdGUsICdsYXN0RGF0ZScsIGRhdGEpO1xufTtcblxuQ3J1aXNlcy5hY3Rpb25zLmdldENydWlzZUNvZGVzV2l0aFRpdGxlcyA9IGFzeW5jIGZ1bmN0aW9uKHtzdGF0ZSwgY29tbWl0LCBnZXR0ZXJzfSwgcmVmcmVzaCA9IGZhbHNlKSB7XG4gICAgaWYgKGdldHRlcnNbJ2NydWlzZUNvZGVzJ10oKS5sZW5ndGggPT09IDAgfHwgcmVmcmVzaCkge1xuICAgICAgICBsZXQgZW5kcG9pbnQgPSBzdGF0ZS5lbmRwb2ludHNbJ2NvZGVUaXRsZXMnXTtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5heGlvcy5nZXQoZW5kcG9pbnQpO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgY29tbWl0KCdzZXRDcnVpc2VDb2RlcycsIHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuQ3J1aXNlcy5hY3Rpb25zLmdldExhc3RDcnVpc2VEYXRlID0gYXN5bmMgZnVuY3Rpb24oe2NvbW1pdCwgZ2V0dGVyc30pIHtcbiAgICBsZXQgbGFzdERhdGUgPSBnZXR0ZXJzWydsYXN0RGF0ZSddO1xuICAgIGxldCBlbmRwb2ludCA9IHN0YXRlLmVuZHBvaW50c1snbGFzdFNhaWxEYXRlJ107XG5cbiAgICBpZiAoIWxhc3REYXRlKSB7XG4gICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXhpb3MuZ2V0KGVuZHBvaW50KTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIGNvbW1pdCgnc2V0TGFzdERhdGUnLCByZXNwb25zZS5kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IENydWlzZXM7XG4iXSwibmFtZXMiOlsiX3JlZ2VuZXJhdG9yUnVudGltZSIsImV4cG9ydHMiLCJPcCIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093biIsImhhc093blByb3BlcnR5IiwiZGVmaW5lUHJvcGVydHkiLCJvYmoiLCJrZXkiLCJkZXNjIiwidmFsdWUiLCIkU3ltYm9sIiwiU3ltYm9sIiwiaXRlcmF0b3JTeW1ib2wiLCJpdGVyYXRvciIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsImRlZmluZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImVyciIsIndyYXAiLCJpbm5lckZuIiwib3V0ZXJGbiIsInNlbGYiLCJ0cnlMb2NzTGlzdCIsInByb3RvR2VuZXJhdG9yIiwiR2VuZXJhdG9yIiwiZ2VuZXJhdG9yIiwiY3JlYXRlIiwiY29udGV4dCIsIkNvbnRleHQiLCJtYWtlSW52b2tlTWV0aG9kIiwidHJ5Q2F0Y2giLCJmbiIsImFyZyIsInR5cGUiLCJjYWxsIiwiQ29udGludWVTZW50aW5lbCIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJJdGVyYXRvclByb3RvdHlwZSIsImdldFByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJOYXRpdmVJdGVyYXRvclByb3RvdHlwZSIsInZhbHVlcyIsIkdwIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiZm9yRWFjaCIsIm1ldGhvZCIsIl9pbnZva2UiLCJBc3luY0l0ZXJhdG9yIiwiUHJvbWlzZUltcGwiLCJpbnZva2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicmVjb3JkIiwicmVzdWx0IiwiX3R5cGVvZiIsIl9fYXdhaXQiLCJ0aGVuIiwidW53cmFwcGVkIiwiZXJyb3IiLCJwcmV2aW91c1Byb21pc2UiLCJjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyIsInN0YXRlIiwiRXJyb3IiLCJkb25lUmVzdWx0IiwiZGVsZWdhdGUiLCJkZWxlZ2F0ZVJlc3VsdCIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsImRvbmUiLCJtZXRob2ROYW1lIiwidW5kZWZpbmVkIiwiVHlwZUVycm9yIiwiaW5mbyIsInJlc3VsdE5hbWUiLCJuZXh0IiwibmV4dExvYyIsInB1c2hUcnlFbnRyeSIsImxvY3MiLCJlbnRyeSIsInRyeUxvYyIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInB1c2giLCJyZXNldFRyeUVudHJ5IiwiY29tcGxldGlvbiIsInJlc2V0IiwiaXRlcmFibGUiLCJpdGVyYXRvck1ldGhvZCIsImlzTmFOIiwibGVuZ3RoIiwiaSIsImRpc3BsYXlOYW1lIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImdlbkZ1biIsImN0b3IiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJtYXJrIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJhd3JhcCIsImFzeW5jIiwiUHJvbWlzZSIsIml0ZXIiLCJrZXlzIiwidmFsIiwib2JqZWN0IiwicmV2ZXJzZSIsInBvcCIsInNraXBUZW1wUmVzZXQiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicm9vdFJlY29yZCIsInJ2YWwiLCJleGNlcHRpb24iLCJoYW5kbGUiLCJsb2MiLCJjYXVnaHQiLCJoYXNDYXRjaCIsImhhc0ZpbmFsbHkiLCJmaW5hbGx5RW50cnkiLCJjb21wbGV0ZSIsImZpbmlzaCIsIl9jYXRjaCIsInRocm93biIsImRlbGVnYXRlWWllbGQiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJnZW4iLCJfbmV4dCIsIl90aHJvdyIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJncyIsImFyZ3VtZW50cyIsImFwcGx5Iiwib3duS2V5cyIsImVudW1lcmFibGVPbmx5IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwic3ltYm9scyIsImZpbHRlciIsInN5bSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIl9vYmplY3RTcHJlYWQiLCJ0YXJnZXQiLCJzb3VyY2UiLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl90b1Byb3BlcnR5S2V5IiwiX3RvUHJpbWl0aXZlIiwiU3RyaW5nIiwiaW5wdXQiLCJoaW50IiwicHJpbSIsInRvUHJpbWl0aXZlIiwicmVzIiwiTnVtYmVyIiwiQmFzZU1vZHVsZSIsIlN0cmluZ0hlbHBlciIsIk9iamVjdEhlbHBlciIsIkNydWlzZXMiLCJlbmRwb2ludHMiLCJhbGxDb2RlcyIsImxhc3REYXRlIiwic29ydCIsIm1vbnRoIiwiZGF0YSIsIm1ldGEiLCJzaGlwIiwiZ2V0dGVycyIsImNydWlzZUNvZGVzIiwiZmlsdGVyU3RyaW5nIiwiY29kZSIsImNvbnRhaW5zIiwic29ydE1ldGEiLCJzb3J0VHlwZSIsInNoaXBDb25maWd1cmF0aW9uIiwicm9vdFN0YXRlIiwicm9vdEdldHRlcnMiLCJjcnVpc2VDb2RlIiwic2hpcF9jb25maWd1cmF0aW9uX2lkIiwiaXNPYmplY3QiLCJzaGlwX2NvZGUiLCJnZXRDcnVpc2VJZEZyb21DcnVpc2VDb2RlIiwiY3J1aXNlSWQiLCJhbGwiLCJ0b0xvd2VyQ2FzZSIsIm11dGF0aW9ucyIsInNldENydWlzZUNvZGVzIiwiVnVlIiwic2V0Iiwic2V0TGFzdERhdGUiLCJhY3Rpb25zIiwiZ2V0Q3J1aXNlQ29kZXNXaXRoVGl0bGVzIiwiX3JlZjIiLCJfY2FsbGVlIiwiX3JlZiIsImNvbW1pdCIsInJlZnJlc2giLCJlbmRwb2ludCIsInJlc3BvbnNlIiwiX2FyZ3MiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwiYXhpb3MiLCJnZXQiLCJzdGF0dXMiLCJfeCIsImdldExhc3RDcnVpc2VEYXRlIiwiX3JlZjQiLCJfY2FsbGVlMiIsIl9yZWYzIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiX3gyIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/domain/cruises/vuex/cruises.js\n");

/***/ }),

/***/ "./resources/js/domain/enquiry_notes/vuex/enquiry_notes.js":
/*!*****************************************************************!*\
  !*** ./resources/js/domain/enquiry_notes/vuex/enquiry_notes.js ***!
  \*****************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar EnquiryNotes = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nEnquiryNotes.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n  state.lastDate = null;\n  state.sort = {};\n  return state;\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (EnquiryNotes);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL2VucXVpcnlfbm90ZXMvdnVleC9lbnF1aXJ5X25vdGVzLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQW9EO0FBRXBELElBQUlDLFlBQVksR0FBQUMsYUFBQSxLQUFPRixpRUFBVSxDQUFDO0FBRWxDQyxZQUFZLENBQUNFLEtBQUssR0FBRyxZQUFZO0VBQzdCLElBQUlBLEtBQUssR0FBR0gsdUVBQWdCLENBQUMsQ0FBQztFQUU5QkcsS0FBSyxDQUFDQyxRQUFRLEdBQUcsSUFBSTtFQUNyQkQsS0FBSyxDQUFDRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0VBRWYsT0FBT0YsS0FBSztBQUNoQixDQUFDO0FBRUQsaUVBQWVGLFlBQVkiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZG9tYWluL2VucXVpcnlfbm90ZXMvdnVleC9lbnF1aXJ5X25vdGVzLmpzPzcxYTIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2VNb2R1bGUgZnJvbSBcIn4vdnVleC9tb2R1bGVzL2Jhc2UtbW9kdWxlXCI7XG5cbmxldCBFbnF1aXJ5Tm90ZXMgPSB7Li4uQmFzZU1vZHVsZX07XG5cbkVucXVpcnlOb3Rlcy5zdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgc3RhdGUgPSBCYXNlTW9kdWxlLnN0YXRlKCk7XG5cbiAgICBzdGF0ZS5sYXN0RGF0ZSA9IG51bGw7XG4gICAgc3RhdGUuc29ydCA9IHt9O1xuXG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgRW5xdWlyeU5vdGVzO1xuIl0sIm5hbWVzIjpbIkJhc2VNb2R1bGUiLCJFbnF1aXJ5Tm90ZXMiLCJfb2JqZWN0U3ByZWFkIiwic3RhdGUiLCJsYXN0RGF0ZSIsInNvcnQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/domain/enquiry_notes/vuex/enquiry_notes.js\n");

/***/ }),

/***/ "./resources/js/domain/itinerary/vuex/itineraries.js":
/*!***********************************************************!*\
  !*** ./resources/js/domain/itinerary/vuex/itineraries.js ***!
  \***********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar Itineraries = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nItineraries.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n  state.endpoints['all'] = '/api/itinerary-items';\n  state.lastDate = null;\n  state.sort = {};\n  return state;\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Itineraries);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL2l0aW5lcmFyeS92dWV4L2l0aW5lcmFyaWVzLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQW9EO0FBRXBELElBQUlDLFdBQVcsR0FBQUMsYUFBQSxLQUFPRixpRUFBVSxDQUFDO0FBRWpDQyxXQUFXLENBQUNFLEtBQUssR0FBRyxZQUFZO0VBQzVCLElBQUlBLEtBQUssR0FBR0gsdUVBQWdCLENBQUMsQ0FBQztFQUU5QkcsS0FBSyxDQUFDQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsc0JBQXNCO0VBRS9DRCxLQUFLLENBQUNFLFFBQVEsR0FBRyxJQUFJO0VBQ3JCRixLQUFLLENBQUNHLElBQUksR0FBRyxDQUFDLENBQUM7RUFHZixPQUFPSCxLQUFLO0FBQ2hCLENBQUM7QUFFRCxpRUFBZUYsV0FBVyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9kb21haW4vaXRpbmVyYXJ5L3Z1ZXgvaXRpbmVyYXJpZXMuanM/ZmExOCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZU1vZHVsZSBmcm9tIFwifi92dWV4L21vZHVsZXMvYmFzZS1tb2R1bGVcIjtcblxubGV0IEl0aW5lcmFyaWVzID0gey4uLkJhc2VNb2R1bGV9O1xuXG5JdGluZXJhcmllcy5zdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgc3RhdGUgPSBCYXNlTW9kdWxlLnN0YXRlKCk7XG5cbiAgICBzdGF0ZS5lbmRwb2ludHNbJ2FsbCddID0gJy9hcGkvaXRpbmVyYXJ5LWl0ZW1zJztcblxuICAgIHN0YXRlLmxhc3REYXRlID0gbnVsbDtcbiAgICBzdGF0ZS5zb3J0ID0ge307XG5cblxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEl0aW5lcmFyaWVzO1xuIl0sIm5hbWVzIjpbIkJhc2VNb2R1bGUiLCJJdGluZXJhcmllcyIsIl9vYmplY3RTcHJlYWQiLCJzdGF0ZSIsImVuZHBvaW50cyIsImxhc3REYXRlIiwic29ydCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/domain/itinerary/vuex/itineraries.js\n");

/***/ }),

/***/ "./resources/js/domain/logs/vuex/logs.js":
/*!***********************************************!*\
  !*** ./resources/js/domain/logs/vuex/logs.js ***!
  \***********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\n/* harmony import */ var _helpers_StringHelper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ~/helpers/StringHelper */ \"./resources/js/helpers/StringHelper.js\");\n/* harmony import */ var _helpers_ObjectHelper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ~/helpers/ObjectHelper */ \"./resources/js/helpers/ObjectHelper.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\n\nvar Logs = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nLogs.actions.write = /*#__PURE__*/function () {\n  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref, data) {\n    var commit, getters, response;\n    return _regeneratorRuntime().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          commit = _ref.commit, getters = _ref.getters;\n          _context.next = 3;\n          return this.axios.post('/api/logs', {\n            data: {\n              type: \"log\",\n              attributes: {\n                message: data.message\n              }\n            }\n          });\n        case 3:\n          response = _context.sent;\n          if (!(response.status === 200)) {\n            _context.next = 6;\n            break;\n          }\n          return _context.abrupt(\"return\", true);\n        case 6:\n          return _context.abrupt(\"return\", false);\n        case 7:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee, this);\n  }));\n  return function (_x, _x2) {\n    return _ref2.apply(this, arguments);\n  };\n}();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Logs);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL2xvZ3MvdnVleC9sb2dzLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OytDQUNBLHFKQUFBQSxtQkFBQSxZQUFBQSxvQkFBQSxXQUFBQyxPQUFBLFNBQUFBLE9BQUEsT0FBQUMsRUFBQSxHQUFBQyxNQUFBLENBQUFDLFNBQUEsRUFBQUMsTUFBQSxHQUFBSCxFQUFBLENBQUFJLGNBQUEsRUFBQUMsY0FBQSxHQUFBSixNQUFBLENBQUFJLGNBQUEsY0FBQUMsR0FBQSxFQUFBQyxHQUFBLEVBQUFDLElBQUEsSUFBQUYsR0FBQSxDQUFBQyxHQUFBLElBQUFDLElBQUEsQ0FBQUMsS0FBQSxLQUFBQyxPQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsY0FBQSxHQUFBRixPQUFBLENBQUFHLFFBQUEsa0JBQUFDLG1CQUFBLEdBQUFKLE9BQUEsQ0FBQUssYUFBQSx1QkFBQUMsaUJBQUEsR0FBQU4sT0FBQSxDQUFBTyxXQUFBLDhCQUFBQyxPQUFBWixHQUFBLEVBQUFDLEdBQUEsRUFBQUUsS0FBQSxXQUFBUixNQUFBLENBQUFJLGNBQUEsQ0FBQUMsR0FBQSxFQUFBQyxHQUFBLElBQUFFLEtBQUEsRUFBQUEsS0FBQSxFQUFBVSxVQUFBLE1BQUFDLFlBQUEsTUFBQUMsUUFBQSxTQUFBZixHQUFBLENBQUFDLEdBQUEsV0FBQVcsTUFBQSxtQkFBQUksR0FBQSxJQUFBSixNQUFBLFlBQUFBLE9BQUFaLEdBQUEsRUFBQUMsR0FBQSxFQUFBRSxLQUFBLFdBQUFILEdBQUEsQ0FBQUMsR0FBQSxJQUFBRSxLQUFBLGdCQUFBYyxLQUFBQyxPQUFBLEVBQUFDLE9BQUEsRUFBQUMsSUFBQSxFQUFBQyxXQUFBLFFBQUFDLGNBQUEsR0FBQUgsT0FBQSxJQUFBQSxPQUFBLENBQUF2QixTQUFBLFlBQUEyQixTQUFBLEdBQUFKLE9BQUEsR0FBQUksU0FBQSxFQUFBQyxTQUFBLEdBQUE3QixNQUFBLENBQUE4QixNQUFBLENBQUFILGNBQUEsQ0FBQTFC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V0FHUixLQUFLO1FBQUE7UUFBQTtVQUFBLE9BQUEyRyxRQUFBLENBQUEzRCxJQUFBO01BQUE7SUFBQSxHQUFBb0QsT0FBQTtFQUFBLENBQ25CO0VBQUEsaUJBQUFhLEVBQUEsRUFBQUMsR0FBQTtJQUFBLE9BQUFmLEtBQUEsQ0FBQTdCLEtBQUEsT0FBQUQsU0FBQTtFQUFBO0FBQUE7QUFFRCxpRUFBZTJCLElBQUkiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZG9tYWluL2xvZ3MvdnVleC9sb2dzLmpzPzdhYTIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2VNb2R1bGUgZnJvbSBcIn4vdnVleC9tb2R1bGVzL2Jhc2UtbW9kdWxlXCI7XG5pbXBvcnQgU3RyaW5nSGVscGVyIGZyb20gXCJ+L2hlbHBlcnMvU3RyaW5nSGVscGVyXCI7XG5pbXBvcnQgT2JqZWN0SGVscGVyIGZyb20gXCJ+L2hlbHBlcnMvT2JqZWN0SGVscGVyXCI7XG5cbmxldCBMb2dzID0gey4uLkJhc2VNb2R1bGV9O1xuXG5Mb2dzLmFjdGlvbnMud3JpdGUgPSBhc3luYyBmdW5jdGlvbih7Y29tbWl0LCBnZXR0ZXJzfSwgZGF0YSkge1xuXG4gICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXhpb3MucG9zdChcbiAgICAgICAgICAgICcvYXBpL2xvZ3MnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJsb2dcIixcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBMb2dzOyJdLCJuYW1lcyI6WyJfcmVnZW5lcmF0b3JSdW50aW1lIiwiZXhwb3J0cyIsIk9wIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duIiwiaGFzT3duUHJvcGVydHkiLCJkZWZpbmVQcm9wZXJ0eSIsIm9iaiIsImtleSIsImRlc2MiLCJ2YWx1ZSIsIiRTeW1ib2wiLCJTeW1ib2wiLCJpdGVyYXRvclN5bWJvbCIsIml0ZXJhdG9yIiwiYXN5bmNJdGVyYXRvclN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJ0b1N0cmluZ1RhZ1N5bWJvbCIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiZXJyIiwid3JhcCIsImlubmVyRm4iLCJvdXRlckZuIiwic2VsZiIsInRyeUxvY3NMaXN0IiwicHJvdG9HZW5lcmF0b3IiLCJHZW5lcmF0b3IiLCJnZW5lcmF0b3IiLCJjcmVhdGUiLCJjb250ZXh0IiwiQ29udGV4dCIsIm1ha2VJbnZva2VNZXRob2QiLCJ0cnlDYXRjaCIsImZuIiwiYXJnIiwidHlwZSIsImNhbGwiLCJDb250aW51ZVNlbnRpbmVsIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsIkl0ZXJhdG9yUHJvdG90eXBlIiwiZ2V0UHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwidmFsdWVzIiwiR3AiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwibWV0aG9kIiwiX2ludm9rZSIsIkFzeW5jSXRlcmF0b3IiLCJQcm9taXNlSW1wbCIsImludm9rZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZWNvcmQiLCJyZXN1bHQiLCJfdHlwZW9mIiwiX19hd2FpdCIsInRoZW4iLCJ1bndyYXBwZWQiLCJlcnJvciIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwic3RhdGUiLCJFcnJvciIsImRvbmVSZXN1bHQiLCJkZWxlZ2F0ZSIsImRlbGVnYXRlUmVzdWx0IiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwiZG9uZSIsIm1ldGhvZE5hbWUiLCJ1bmRlZmluZWQiLCJUeXBlRXJyb3IiLCJpbmZvIiwicmVzdWx0TmFtZSIsIm5leHQiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwibG9jcyIsImVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicHVzaCIsInJlc2V0VHJ5RW50cnkiLCJjb21wbGV0aW9uIiwicmVzZXQiLCJpdGVyYWJsZSIsIml0ZXJhdG9yTWV0aG9kIiwiaXNOYU4iLCJsZW5ndGgiLCJpIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiZ2VuRnVuIiwiY3RvciIsImNvbnN0cnVjdG9yIiwibmFtZSIsIm1hcmsiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImF3cmFwIiwiYXN5bmMiLCJQcm9taXNlIiwiaXRlciIsImtleXMiLCJ2YWwiLCJvYmplY3QiLCJyZXZlcnNlIiwicG9wIiwic2tpcFRlbXBSZXNldCIsInByZXYiLCJjaGFyQXQiLCJzbGljZSIsInN0b3AiLCJyb290UmVjb3JkIiwicnZhbCIsImV4Y2VwdGlvbiIsImhhbmRsZSIsImxvYyIsImNhdWdodCIsImhhc0NhdGNoIiwiaGFzRmluYWxseSIsImZpbmFsbHlFbnRyeSIsImNvbXBsZXRlIiwiZmluaXNoIiwiX2NhdGNoIiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsImFzeW5jR2VuZXJhdG9yU3RlcCIsImdlbiIsIl9uZXh0IiwiX3Rocm93IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmdzIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJvd25LZXlzIiwiZW51bWVyYWJsZU9ubHkiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJzeW1ib2xzIiwiZmlsdGVyIiwic3ltIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiX29iamVjdFNwcmVhZCIsInRhcmdldCIsInNvdXJjZSIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJvcGVydHlLZXkiLCJfdG9QcmltaXRpdmUiLCJTdHJpbmciLCJpbnB1dCIsImhpbnQiLCJwcmltIiwidG9QcmltaXRpdmUiLCJyZXMiLCJOdW1iZXIiLCJCYXNlTW9kdWxlIiwiU3RyaW5nSGVscGVyIiwiT2JqZWN0SGVscGVyIiwiTG9ncyIsImFjdGlvbnMiLCJ3cml0ZSIsIl9yZWYyIiwiX2NhbGxlZSIsIl9yZWYiLCJkYXRhIiwiY29tbWl0IiwiZ2V0dGVycyIsInJlc3BvbnNlIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsImF4aW9zIiwicG9zdCIsImF0dHJpYnV0ZXMiLCJtZXNzYWdlIiwic3RhdHVzIiwiX3giLCJfeDIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/domain/logs/vuex/logs.js\n");

/***/ }),

/***/ "./resources/js/domain/mas/vuex/customers.js":
/*!***************************************************!*\
  !*** ./resources/js/domain/mas/vuex/customers.js ***!
  \***************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar Customers = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nCustomers.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n  state.endpoints['all'] = '/api/customer/';\n  return state;\n};\nCustomers.actions.searchOption = /*#__PURE__*/function () {\n  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {\n    var commit,\n      dispatch,\n      getters,\n      state,\n      rootGetters,\n      data,\n      _args = arguments;\n    return _regeneratorRuntime().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          commit = _ref.commit, dispatch = _ref.dispatch, getters = _ref.getters, state = _ref.state, rootGetters = _ref.rootGetters;\n          data = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};\n          if (!(!data.name && !data.email && !data.reference)) {\n            _context.next = 4;\n            break;\n          }\n          return _context.abrupt(\"return\", false);\n        case 4:\n          state.endpoints['search'] = '/api/customer/search';\n          return _context.abrupt(\"return\", dispatch('search', {\n            term: data,\n            includes: [],\n            page: data.page,\n            perPage: data.per_page\n          }));\n        case 6:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee);\n  }));\n  return function (_x) {\n    return _ref2.apply(this, arguments);\n  };\n}();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Customers);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL21hcy92dWV4L2N1c3RvbWVycy5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7K0NBQ0EscUpBQUFBLG1CQUFBLFlBQUFBLG9CQUFBLFdBQUFDLE9BQUEsU0FBQUEsT0FBQSxPQUFBQyxFQUFBLEdBQUFDLE1BQUEsQ0FBQUMsU0FBQSxFQUFBQyxNQUFBLEdBQUFILEVBQUEsQ0FBQUksY0FBQSxFQUFBQyxjQUFBLEdBQUFKLE1BQUEsQ0FBQUksY0FBQSxjQUFBQyxHQUFBLEVBQUFDLEdBQUEsRUFBQUMsSUFBQSxJQUFBRixHQUFBLENBQUFDLEdBQUEsSUFBQUMsSUFBQSxDQUFBQyxLQUFBLEtBQUFDLE9BQUEsd0JBQUFDLE1BQUEsR0FBQUEsTUFBQSxPQUFBQyxjQUFBLEdBQUFGLE9BQUEsQ0FBQUcsUUFBQSxrQkFBQUMsbUJBQUEsR0FBQUosT0FBQSxDQUFBSyxhQUFBLHVCQUFBQyxpQkFBQSxHQUFBTixPQUFBLENBQUFPLFdBQUEsOEJBQUFDLE9BQUFaLEdBQUEsRUFBQUMsR0FBQSxFQUFBRSxLQUFBLFdBQUFSLE1BQUEsQ0FBQUksY0FBQSxDQUFBQyxHQUFBLEVBQUFDLEdBQUEsSUFBQUUsS0FBQSxFQUFBQSxLQUFBLEVBQUFVLFVBQUEsTUFBQUMsWUFBQSxNQUFBQyxRQUFBLFNBQUFmLEdBQUEsQ0FBQUMsR0FBQSxXQUFBVyxNQUFBLG1CQUFBSSxHQUFBLElBQUFKLE1BQUEsWUFBQUEsT0FBQVosR0FBQSxFQUFBQyxHQUFBLEVBQUFFLEtBQUEsV0FBQUgsR0FBQSxDQUFBQyxHQUFBLElBQUFFLEtBQUEsZ0JBQUFjLEtBQUFDLE9BQUEsRUFBQUMsT0FBQSxFQUFBQyxJQUFBLEVBQUFDLFdBQUEsUUFBQUMsY0FBQSxHQUFBSCxPQUFBLElBQUFBLE9BQUEsQ0FBQXZCLFNBQUEsWUFBQTJCLFNBQUEsR0FBQUosT0FBQSxHQUFBSSxTQUFBLEVBQUFDLFNBQUEsR0FBQTdCLE1BQUEsQ0FBQThCLE1BQUEsQ0FBQUgsY0FBQSxDQUFB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Q0FBQyxDQUFDO1VBQUEsTUFDckcsQ0FBQ0QsSUFBSSxDQUFDMUUsSUFBSSxJQUFJLENBQUMwRSxJQUFJLENBQUNJLEtBQUssSUFBSSxDQUFDSixJQUFJLENBQUNLLFNBQVM7WUFBQUYsUUFBQSxDQUFBckcsSUFBQTtZQUFBO1VBQUE7VUFBQSxPQUFBcUcsUUFBQSxDQUFBNUcsTUFBQSxXQUNyQyxLQUFLO1FBQUE7VUFFaEJULEtBQUssQ0FBQ3dHLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxzQkFBc0I7VUFBQyxPQUFBYSxRQUFBLENBQUE1RyxNQUFBLFdBRTVDc0csUUFBUSxDQUFDLFFBQVEsRUFBRTtZQUN0QlMsSUFBSSxFQUFFTixJQUFJO1lBQ1ZPLFFBQVEsRUFBRSxFQUFFO1lBQ1pDLElBQUksRUFBRVIsSUFBSSxDQUFDUSxJQUFJO1lBQ2ZDLE9BQU8sRUFBRVQsSUFBSSxDQUFDVTtVQUNsQixDQUFDLENBQUM7UUFBQTtRQUFBO1VBQUEsT0FBQVAsUUFBQSxDQUFBNUQsSUFBQTtNQUFBO0lBQUEsR0FBQW1ELE9BQUE7RUFBQSxDQUNMO0VBQUEsaUJBQUFpQixFQUFBO0lBQUEsT0FBQWxCLEtBQUEsQ0FBQTVCLEtBQUEsT0FBQUQsU0FBQTtFQUFBO0FBQUE7QUFFRCxpRUFBZXlCLFNBQVMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZG9tYWluL21hcy92dWV4L2N1c3RvbWVycy5qcz9iYjZjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlTW9kdWxlIGZyb20gXCJ+L3Z1ZXgvbW9kdWxlcy9iYXNlLW1vZHVsZVwiO1xuXG5sZXQgQ3VzdG9tZXJzID0gey4uLkJhc2VNb2R1bGV9O1xuXG5DdXN0b21lcnMuc3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHN0YXRlID0gQmFzZU1vZHVsZS5zdGF0ZSgpO1xuXG4gICAgc3RhdGUuZW5kcG9pbnRzWydhbGwnXSA9ICcvYXBpL2N1c3RvbWVyLyc7XG5cblxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5cbkN1c3RvbWVycy5hY3Rpb25zLnNlYXJjaE9wdGlvbiA9IGFzeW5jIGZ1bmN0aW9uICh7IGNvbW1pdCwgZGlzcGF0Y2gsIGdldHRlcnMsIHN0YXRlLCByb290R2V0dGVycyB9LCBkYXRhID0ge30pIHtcbiAgICBpZiAoIWRhdGEubmFtZSAmJiAhZGF0YS5lbWFpbCAmJiAhZGF0YS5yZWZlcmVuY2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzdGF0ZS5lbmRwb2ludHNbJ3NlYXJjaCddID0gJy9hcGkvY3VzdG9tZXIvc2VhcmNoJztcblxuICAgIHJldHVybiBkaXNwYXRjaCgnc2VhcmNoJywge1xuICAgICAgICB0ZXJtOiBkYXRhLFxuICAgICAgICBpbmNsdWRlczogW10sXG4gICAgICAgIHBhZ2U6IGRhdGEucGFnZSxcbiAgICAgICAgcGVyUGFnZTogZGF0YS5wZXJfcGFnZSxcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEN1c3RvbWVycztcbiJdLCJuYW1lcyI6WyJfcmVnZW5lcmF0b3JSdW50aW1lIiwiZXhwb3J0cyIsIk9wIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duIiwiaGFzT3duUHJvcGVydHkiLCJkZWZpbmVQcm9wZXJ0eSIsIm9iaiIsImtleSIsImRlc2MiLCJ2YWx1ZSIsIiRTeW1ib2wiLCJTeW1ib2wiLCJpdGVyYXRvclN5bWJvbCIsIml0ZXJhdG9yIiwiYXN5bmNJdGVyYXRvclN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJ0b1N0cmluZ1RhZ1N5bWJvbCIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiZXJyIiwid3JhcCIsImlubmVyRm4iLCJvdXRlckZuIiwic2VsZiIsInRyeUxvY3NMaXN0IiwicHJvdG9HZW5lcmF0b3IiLCJHZW5lcmF0b3IiLCJnZW5lcmF0b3IiLCJjcmVhdGUiLCJjb250ZXh0IiwiQ29udGV4dCIsIm1ha2VJbnZva2VNZXRob2QiLCJ0cnlDYXRjaCIsImZuIiwiYXJnIiwidHlwZSIsImNhbGwiLCJDb250aW51ZVNlbnRpbmVsIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsIkl0ZXJhdG9yUHJvdG90eXBlIiwiZ2V0UHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwidmFsdWVzIiwiR3AiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwibWV0aG9kIiwiX2ludm9rZSIsIkFzeW5jSXRlcmF0b3IiLCJQcm9taXNlSW1wbCIsImludm9rZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZWNvcmQiLCJyZXN1bHQiLCJfdHlwZW9mIiwiX19hd2FpdCIsInRoZW4iLCJ1bndyYXBwZWQiLCJlcnJvciIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwic3RhdGUiLCJFcnJvciIsImRvbmVSZXN1bHQiLCJkZWxlZ2F0ZSIsImRlbGVnYXRlUmVzdWx0IiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwiZG9uZSIsIm1ldGhvZE5hbWUiLCJ1bmRlZmluZWQiLCJUeXBlRXJyb3IiLCJpbmZvIiwicmVzdWx0TmFtZSIsIm5leHQiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwibG9jcyIsImVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicHVzaCIsInJlc2V0VHJ5RW50cnkiLCJjb21wbGV0aW9uIiwicmVzZXQiLCJpdGVyYWJsZSIsIml0ZXJhdG9yTWV0aG9kIiwiaXNOYU4iLCJsZW5ndGgiLCJpIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiZ2VuRnVuIiwiY3RvciIsImNvbnN0cnVjdG9yIiwibmFtZSIsIm1hcmsiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImF3cmFwIiwiYXN5bmMiLCJQcm9taXNlIiwiaXRlciIsImtleXMiLCJ2YWwiLCJvYmplY3QiLCJyZXZlcnNlIiwicG9wIiwic2tpcFRlbXBSZXNldCIsInByZXYiLCJjaGFyQXQiLCJzbGljZSIsInN0b3AiLCJyb290UmVjb3JkIiwicnZhbCIsImV4Y2VwdGlvbiIsImhhbmRsZSIsImxvYyIsImNhdWdodCIsImhhc0NhdGNoIiwiaGFzRmluYWxseSIsImZpbmFsbHlFbnRyeSIsImNvbXBsZXRlIiwiZmluaXNoIiwiX2NhdGNoIiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsImFzeW5jR2VuZXJhdG9yU3RlcCIsImdlbiIsIl9uZXh0IiwiX3Rocm93IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmdzIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJvd25LZXlzIiwiZW51bWVyYWJsZU9ubHkiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJzeW1ib2xzIiwiZmlsdGVyIiwic3ltIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiX29iamVjdFNwcmVhZCIsInRhcmdldCIsInNvdXJjZSIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJvcGVydHlLZXkiLCJfdG9QcmltaXRpdmUiLCJTdHJpbmciLCJpbnB1dCIsImhpbnQiLCJwcmltIiwidG9QcmltaXRpdmUiLCJyZXMiLCJOdW1iZXIiLCJCYXNlTW9kdWxlIiwiQ3VzdG9tZXJzIiwiZW5kcG9pbnRzIiwiYWN0aW9ucyIsInNlYXJjaE9wdGlvbiIsIl9yZWYyIiwiX2NhbGxlZSIsIl9yZWYiLCJjb21taXQiLCJkaXNwYXRjaCIsImdldHRlcnMiLCJyb290R2V0dGVycyIsImRhdGEiLCJfYXJncyIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJlbWFpbCIsInJlZmVyZW5jZSIsInRlcm0iLCJpbmNsdWRlcyIsInBhZ2UiLCJwZXJQYWdlIiwicGVyX3BhZ2UiLCJfeCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/domain/mas/vuex/customers.js\n");

/***/ }),

/***/ "./resources/js/domain/mas/vuex/settings.js":
/*!**************************************************!*\
  !*** ./resources/js/domain/mas/vuex/settings.js ***!
  \**************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\n/* harmony import */ var _customers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./customers */ \"./resources/js/domain/mas/vuex/customers.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\nvar MasSettings = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nMasSettings.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n  state.endpoints['all'] = '/api/mas/settings';\n  return state;\n};\nMasSettings.actions.updateOption = /*#__PURE__*/function () {\n  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {\n    var commit,\n      dispatch,\n      getters,\n      state,\n      rootGetters,\n      data,\n      _args = arguments;\n    return _regeneratorRuntime().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          commit = _ref.commit, dispatch = _ref.dispatch, getters = _ref.getters, state = _ref.state, rootGetters = _ref.rootGetters;\n          data = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};\n          state.endpoints['update'] = '/api/mas/settings/update';\n          return _context.abrupt(\"return\", dispatch('update2', {\n            data: data\n          }));\n        case 4:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee);\n  }));\n  return function (_x) {\n    return _ref2.apply(this, arguments);\n  };\n}();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MasSettings);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL21hcy92dWV4L3NldHRpbmdzLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7K0NBQ0EscUpBQUFBLG1CQUFBLFlBQUFBLG9CQUFBLFdBQUFDLE9BQUEsU0FBQUEsT0FBQSxPQUFBQyxFQUFBLEdBQUFDLE1BQUEsQ0FBQUMsU0FBQSxFQUFBQyxNQUFBLEdBQUFILEVBQUEsQ0FBQUksY0FBQSxFQUFBQyxjQUFBLEdBQUFKLE1BQUEsQ0FBQUksY0FBQSxjQUFBQyxHQUFBLEVBQUFDLEdBQUEsRUFBQUMsSUFBQSxJQUFBRixHQUFBLENBQUFDLEdBQUEsSUFBQUMsSUFBQSxDQUFBQyxLQUFBLEtBQUFDLE9BQUEsd0JBQUFDLE1BQUEsR0FBQUEsTUFBQSxPQUFBQyxjQUFBLEdBQUFGLE9BQUEsQ0FBQUcsUUFBQSxrQkFBQUMsbUJBQUEsR0FBQUosT0FBQSxDQUFBSyxhQUFBLHVCQUFBQyxpQkFBQSxHQUFBTixPQUFBLENBQUFPLFdBQUEsOEJBQUFDLE9BQUFaLEdBQUEsRUFBQUMsR0FBQSxFQUFBRSxLQUFBLFdBQUFSLE1BQUEsQ0FBQUksY0FBQSxDQUFBQyxHQUFBLEVBQUFDLEdBQUEsSUFBQUUsS0FBQSxFQUFBQSxLQUFBLEVBQUFVLFVBQUEsTUFBQUMsWUFBQSxNQUFBQyxRQUFBLFNBQUFmLEdBQUEsQ0FBQUMsR0FBQSxXQUFBVyxNQUFBLG1CQUFBSSxHQUFBLElBQUFKLE1BQUEsWUFBQUEsT0FBQVosR0FBQSxFQUFBQyxHQUFBLEVBQUFFLEtBQUEsV0FBQUgsR0FBQSxDQUFBQyxHQUFBLElBQUFFLEtBQUEsZ0JBQUFjLEtBQUFDLE9BQUEsRUFBQUMsT0FBQSxFQUFBQyxJQUFBLEVBQUFDLFdBQUEsUUFBQUMsY0FBQSxHQUFBSCxPQUFBLElBQUFBLE9BQUEsQ0FBQXZCLFNBQUEsWUFBQTJCLFNBQUEsR0FBQUosT0FBQSxHQUFBSSxTQUFBLEVBQUFDLFNBQUEsR0FBQTdCLE1BQUEsQ0FBQThCLE1BQUEsQ0FBQUgsY0FBQSxDQUFBMUIsU0FBQSxHQUFBOEIsT0FBQSxPQUFBQyxPQUFBLENBQUFOLFdBQUEsZ0JBQUF0QixjQUFBLENBQUF5QixTQUFBLGVBQUFyQixLQUFBLEVBQUF5QixnQkFBQSxDQUFBVixPQUFBLEVBQUFFLElBQUEsRUFBQU0sT0FBQSxNQUFBRixTQUFBLGFBQUFLLFNBQUFDLEVBQUEsRUFBQTlCLEdBQUEsRUFBQStCLEdBQUEsbUJBQUFDLElBQUEsWUFBQUQsR0FBQSxFQUFBRCxFQUFBLENBQUFHLElBQUEsQ0FBQWpDLEdBQUEsRUFBQStCLEdBQUEsY0FBQWYsR0FBQSxhQUFBZ0IsSUFBQSxXQUFBRCxHQUFBLEVBQUFmLEdBQUEsUUFBQXZCLE9BQUEsQ0FBQXdCLElBQUEsR0FBQUEsSUFBQSxNQUFBaUIsZ0JBQUEsZ0JBQUFYLFVBQUEsY0FBQVksa0JBQUEsY0FBQUMsMkJBQUEsU0FBQUMsaUJBQUEsT0FBQXpCLE1BQUEsQ0FBQXlCLGlCQUFBLEVBQUEvQixjQUFBLHFDQUFBZ0MsUUFBQSxHQUFBM0MsTUFBQSxDQUFBNEMsY0FBQSxFQUFBQyx1QkFBQSxHQUFBRixRQUFBLElBQUFBLFFBQUEsQ0FBQUEsUUFBQSxDQUFBRyxNQUFBLFFBQUFELHVCQUFBLElBQUFBLHVCQUFBLEtBQUE5QyxFQUFBLElBQUFHLE1BQUEsQ0FBQW9DLElBQUEsQ0FBQU8sdUJBQUEsRUFBQWxDLGNBQUEsTUFBQStCLGlCQUFBLEdBQUFHLHVCQUFBLE9BQUFFLEVBQUEsR0FBQU4sMEJBQUEsQ0FBQXhDLFNBQUEsR0FBQTJCLFNBQUEsQ0FBQTNCLFNBQUEsR0FBQUQsTUFBQSxDQUFBOEIsTUFBQSxDQUFBWSxpQkFBQSxZQUFBTSxzQkFBQS9DLFNBQUEsZ0NBQUFnRCxPQUFBLFdBQUFDLE1BQUEsSUFBQWpDLE1BQUEsQ0FBQWhCLFNBQUEsRUFBQWlELE1BQUEsWUFBQWQsR0FBQSxnQkFBQWUsT0FBQSxDQUFBRCxNQUFBLEVBQUFkLEdBQUEsc0JBQUFnQixjQUFBdkIsU0FBQSxFQUFBd0IsV0FBQSxhQUFBQyxPQUFBSixNQUFBLEVBQUFkLEdBQUEsRUFBQW1CLE9BQUEsRUFBQUMsTUFBQSxRQUFBQyxNQUFBLEdBQUF2QixRQUFBLENBQUFMLFNBQUEsQ0FBQXFCLE1BQUEsR0FBQXJCLFNBQUEsRUFBQU8sR0FBQSxtQkFBQXFCLE1BQUEsQ0FBQXBCLElBQUEsUUFBQXFCLE1BQUEsR0FBQUQsTUFBQSxDQUFBckIsR0FBQSxFQUFBNUIsS0FBQSxHQUFBa0QsTUFBQSxDQUFBbEQsS0FBQSxTQUFBQSxLQUFBLGdCQUFBbUQsT0FBQSxDQUFBbkQsS0FBQSxLQUFBTixNQUFBLENBQUFvQyxJQUFBLENBQUE5QixLQUFBLGVBQUE2QyxXQUFBLENBQUFFLE9BQUEsQ0FBQS9DLEtBQUEsQ0FBQW9ELE9BQUEsRUFBQUMsSUFBQSxXQUFBckQsS0FBQSxJQUFBOEMsTUFBQSxTQUFBOUMsS0FBQSxFQUFBK0MsT0FBQSxFQUFBQyxNQUFBLGdCQUFBbkMsR0FBQSxJQUFBaUMsTUFBQSxVQUFBakMsR0FBQSxFQUFBa0MsT0FBQSxFQUFBQyxNQUFBLFFBQUFILFdBQUEsQ0FBQUUsT0FBQSxDQUFBL0MsS0FBQSxFQUFBcUQsSUFBQSxXQUFBQyxTQUFBLElBQUFKLE1BQUEsQ0FBQWxELEtBQUEsR0FBQXNELFNBQUEsRUFBQVAsT0FBQSxDQUFBRyxNQUFBLGdCQUFBSyxLQUFBLFdBQUFULE1BQUEsVUFBQVMsS0FBQSxFQUFBUixPQUFBLEVBQUFDLE1BQUEsU0FBQUEsTUFBQSxDQUFBQyxNQUFBLENBQUFyQixHQUFBLFNBQUE0QixlQUFBLEVBQUE1RCxjQUFBLG9CQUFBSSxLQUFBLFdBQUFBLE1BQUEwQyxNQUFBLEVBQUFkLEdBQUEsYUFBQTZCLDJCQUFBLGVBQUFaLFdBQUEsV0FBQUUsT0FBQSxFQUFBQyxNQUFBLElBQUFGLE1BQUEsQ0FBQUosTUFBQSxFQUFBZCxHQUFBLEVBQUFtQixPQUFBLEVBQUFDLE1BQUEsZ0JBQUFRLGVBQUEsR0FBQUEsZUFBQSxHQUFBQSxlQUFBLENBQUFILElBQUEsQ0FBQUksMEJBQUEsRUFBQUEsMEJBQUEsSUFBQUEsMEJBQUEscUJBQUFoQyxpQkFBQVYsT0FBQSxFQUFBRSxJQUFBLEVBQUFNLE9BQUEsUUFBQW1DLEtBQUEsc0NBQUFoQixNQUFBLEVBQUFkLEdBQUEsd0JBQUE4QixLQUFBLFlBQUFDLEtBQUEsc0RBQUFELEtBQUEsb0JBQUFoQixNQUFBLFFBQUFkLEdBQUEsU0FBQWdDLFVBQUEsV0FBQXJDLE9BQUEsQ0FBQW1CLE1BQUEsR0FBQUEsTUFBQSxFQUFBbkIsT0FBQSxDQUFBSyxHQUFBLEdBQUFBLEdBQUEsVUFBQWlDLFFBQUEsR0FBQXRDLE9BQUEsQ0FBQXNDLFFBQUEsTUFBQUEsUUFBQSxRQUFBQyxjQUFBLEdBQUFDLG1CQUFBLENBQUFGLFFBQUEsRUFBQXRDLE9BQUEsT0FBQXVDLGNBQUEsUUFBQUEsY0FBQSxLQUFBL0IsZ0JBQUEsbUJBQUErQixjQUFBLHFCQUFBdkMsT0FBQSxDQUFBbUIsTUFBQSxFQUFBbkIsT0FBQSxDQUFBeUMsSUFBQSxHQUFBekMsT0FBQSxDQUFBMEMsS0FBQSxHQUFBMUMsT0FBQSxDQUFBSyxHQUFBLHNCQUFBTCxPQUFBLENBQUFtQixNQUFBLDZCQUFBZ0IsS0FBQSxRQUFBQSxLQUFBLGdCQUFBbkMsT0FBQSxDQUFBSyxHQUFBLEVBQUFMLE9BQUEsQ0FBQTJDLGlCQUFBLENBQUEzQyxPQUFBLENBQUFLLEdBQUEsdUJBQUFMLE9BQUEsQ0FBQW1CLE1BQUEsSUFBQW5CLE9BQUEsQ0FBQTRDLE1BQUEsV0FBQTVDLE9BQUEsQ0FBQUssR0FBQSxHQUFBOEIsS0FBQSxvQkFBQVQsTUFBQSxHQUFBdkIsUUFBQSxDQUFBWCxPQUFBLEVBQUFFLElBQUEsRUFBQU0sT0FBQSxvQkFBQTBCLE1BQUEsQ0FBQXBCLElBQUEsUUFBQTZCLEtBQUEsR0FBQW5DLE9BQUEsQ0FBQTZDLElBQUEsbUNBQUFuQixNQUFBLENBQUFyQixHQUFBLEtBQUFHLGdCQUFBLHFCQUFBL0IsS0FBQSxFQUFBaUQsTUFBQSxDQUFBckIsR0FBQSxFQUFBd0MsSUFBQSxFQUFBN0MsT0FBQSxDQUFBNkMsSUFBQSxrQkFBQW5CLE1BQUEsQ0FBQXBCLElBQUEsS0FBQTZCLEtBQUEsZ0JBQUFuQyxPQUFBLENBQUFtQixNQUFBLFlBQUFuQixPQUFBLENBQUFLLEdBQUEsR0FBQXFCLE1BQUEsQ0FBQXJCLEdBQUEsbUJBQUFtQyxvQkFBQUYsUUFBQSxFQUFBdEMsT0FBQSxRQUFBOEMsVUFBQSxHQUFBOUMsT0FBQSxDQUFBbUIsTUFBQSxFQUFBQSxNQUFBLEdBQUFtQixRQUFBLENBQUF6RCxRQUFBLENBQUFpRSxVQUFBLE9BQUFDLFNBQUEsS0FBQTVCLE1BQUEsU0FBQW5CLE9BQUEsQ0FBQXNDLFFBQUEscUJBQUFRLFVBQUEsSUFBQVIsUUFBQSxDQUFBekQsUUFBQSxlQUFBbUIsT0FBQSxDQUFBbUIsTUFBQSxhQUFBbkIsT0FBQSxDQUFBSyxHQUFBLEdBQUEwQyxTQUFBLEVBQUFQLG1CQUFBLENBQUFGLFFBQUEsRUFBQXRDLE9BQUEsZUFBQUEsT0FBQSxDQUFBbUIsTUFBQSxrQkFBQTJCLFVBQUEsS0FBQTlDLE9BQUEsQ0FBQW1CLE1BQUEsWUFBQW5CLE9BQUEsQ0FBQUssR0FBQSxPQUFBMkMsU0FBQSx1Q0FBQUYsVUFBQSxpQkFBQXRDLGdCQUFBLE1BQUFrQixNQUFBLEdBQUF2QixRQUFBLENBQUFnQixNQUFBLEVBQUFtQixRQUFBLENBQUF6RCxRQUFBLEVBQUFtQixPQUFBLENBQUFLLEdBQUEsbUJBQUFxQixNQUFBLENBQUFwQixJQUFBLFNBQUFOLE9BQUEsQ0FBQW1CLE1BQUEsWUFBQW5CLE9BQUEsQ0FBQUssR0FBQSxHQUFBcUIsTUFBQSxDQUFBckIsR0FBQSxFQUFBTCxPQUFBLENBQUFzQyxRQUFBLFNBQUE5QixnQkFBQSxNQUFBeUMsSUFBQSxHQUFBdkIsTUFBQSxDQUFBckIsR0FBQSxTQUFBNEMsSUFBQSxHQUFBQSxJQUFBLENBQUFKLElBQUEsSUFBQTdDLE9BQUEsQ0FBQXNDLFFBQUEsQ0FBQVksVUFBQSxJQUFBRCxJQUFBLENBQUF4RSxLQUFBLEVBQUF1QixPQUFBLENBQUFtRCxJQUFBLEdBQUFiLFFBQUEsQ0FBQWMsT0FBQSxlQUFBcEQsT0FBQSxDQUFBbUIsTUFBQSxLQUFBbkIsT0FBQSxDQUFBbUIsTUFBQSxXQUFBbkIsT0FBQSxDQUFBSyxHQUFBLEdBQUEwQyxTQUFBLEdBQUEvQyxPQUFBLENBQUFzQyxRQUFBLFNBQUE5QixnQkFBQSxJQUFBeUMsSUFBQSxJQUFBakQsT0FBQSxDQUFBbUIsTUFBQSxZQUFBbkIsT0FBQSxDQUFBSyxHQUFBLE9BQUEyQyxTQUFBLHNDQUFBaEQsT0FBQSxDQUFBc0MsUUFBQSxTQUFBOUIsZ0JBQUEsY0FBQTZDLGFBQUFDLElBQUEsUUFBQUMsS0FBQSxLQUFBQyxNQUFBLEVBQUFGLElBQUEsWUFBQUEsSUFBQSxLQUFBQyxLQUFBLENBQUFFLFFBQUEsR0FBQUgsSUFBQSxXQUFBQSxJQUFBLEtBQUFDLEtBQUEsQ0FBQUcsVUFBQSxHQUFBSixJQUFBLEtBQUFDLEtBQUEsQ0FBQUksUUFBQSxHQUFBTCxJQUFBLFdBQUFNLFVBQUEsQ0FBQUMsSUFBQSxDQUFBTixLQUFBLGNBQUFPLGNBQUFQLEtBQUEsUUFBQTdCLE1BQUEsR0FBQTZCLEtBQUEsQ0FBQVEsVUFBQSxRQUFBckMsTUFBQSxDQUFBcEIsSUFBQSxvQkFBQW9CLE1BQUEsQ0FBQXJCLEdBQUEsRUFBQWtELEtBQUEsQ0FBQVEsVUFBQSxHQUFBckMsTUFBQSxhQUFBekIsUUFBQU4sV0FBQSxTQUFBaUUsVUFBQSxNQUFBSixNQUFBLGFBQUE3RCxXQUFBLENBQUF1QixPQUFBLENBQUFtQyxZQUFBLGNBQUFXLEtBQUEsaUJBQUFqRCxPQUFBa0QsUUFBQSxRQUFBQSxRQUFBLFFBQUFDLGNBQUEsR0FBQUQsUUFBQSxDQUFBckYsY0FBQSxPQUFBc0YsY0FBQSxTQUFBQSxjQUFBLENBQUEzRCxJQUFBLENBQUEwRCxRQUFBLDRCQUFBQSxRQUFBLENBQUFkLElBQUEsU0FBQWMsUUFBQSxPQUFBRSxLQUFBLENBQUFGLFFBQUEsQ0FBQUcsTUFBQSxTQUFBQyxDQUFBLE9BQUFsQixJQUFBLFlBQUFBLEtBQUEsYUFBQWtCLENBQUEsR0FBQUosUUFBQSxDQUFBRyxNQUFBLE9BQUFqRyxNQUFBLENBQUFvQyxJQUFBLENBQUEwRCxRQUFBLEVBQUFJLENBQUEsVUFBQWxCLElBQUEsQ0FBQTFFLEtBQUEsR0FBQXdGLFFBQUEsQ0FBQUksQ0FBQSxHQUFBbEIsSUFBQSxDQUFBTixJQUFBLE9BQUFNLElBQUEsU0FBQUEsSUFBQSxDQUFBMUUsS0FBQSxHQUFBc0UsU0FBQSxFQUFBSSxJQUFBLENBQUFOLElBQUEsT0FBQU0sSUFBQSxZQUFBQSxJQUFBLENBQUFBLElBQUEsR0FBQUEsSUFBQSxlQUFBQSxJQUFBLEVBQUFkLFVBQUEsZUFBQUEsV0FBQSxhQUFBNUQsS0FBQSxFQUFBc0UsU0FBQSxFQUFBRixJQUFBLGlCQUFBcEMsaUJBQUEsQ0FBQXZDLFNBQUEsR0FBQXdDLDBCQUFBLEVBQUFyQyxjQUFBLENBQUEyQyxFQUFBLG1CQUFBdkMsS0FBQSxFQUFBaUMsMEJBQUEsRUFBQXRCLFlBQUEsU0FBQWYsY0FBQSxDQUFBcUMsMEJBQUEsbUJBQUFqQyxLQUFBLEVBQUFnQyxpQkFBQSxFQUFBckIsWUFBQSxTQUFBcUIsaUJBQUEsQ0FBQTZELFdBQUEsR0FBQXBGLE1BQUEsQ0FBQXdCLDBCQUFBLEVBQUExQixpQkFBQSx3QkFBQWpCLE9BQUEsQ0FBQXdHLG1CQUFBLGFBQUFDLE1BQUEsUUFBQUMsSUFBQSx3QkFBQUQsTUFBQSxJQUFBQSxNQUFBLENBQUFFLFdBQUEsV0FBQUQsSUFBQSxLQUFBQSxJQUFBLEtBQUFoRSxpQkFBQSw2QkFBQWdFLElBQUEsQ0FBQUgsV0FBQSxJQUFBRyxJQUFBLENBQUFFLElBQUEsT0FBQTVHLE9BQUEsQ0FBQTZHLElBQUEsYUFBQUosTUFBQSxXQUFBdkcsTUFBQSxDQUFBNEcsY0FBQSxHQUFBNUcsTUFBQSxDQUFBNEcsY0FBQSxDQUFBTCxNQUFBLEVBQUE5RCwwQkFBQSxLQUFBOEQsTUFBQSxDQUFBTSxTQUFBLEdBQUFwRSwwQkFBQSxFQUFBeEIsTUFBQSxDQUFBc0YsTUFBQSxFQUFBeEYsaUJBQUEseUJBQUF3RixNQUFBLENBQUF0RyxTQUFBLEdBQUFELE1BQUEsQ0FBQThCLE1BQUEsQ0FBQWlCLEVBQUEsR0FBQXdELE1BQUEsS0FBQXpHLE9BQUEsQ0FBQWdILEtBQUEsYUFBQTFFLEdBQUEsYUFBQXdCLE9BQUEsRUFBQXhCLEdBQUEsT0FBQVkscUJBQUEsQ0FBQUksYUFBQSxDQUFBbkQsU0FBQSxHQUFBZ0IsTUFBQSxDQUFBbUMsYUFBQSxDQUFBbkQsU0FBQSxFQUFBWSxtQkFBQSxpQ0FBQWYsT0FBQSxDQUFBc0QsYUFBQSxHQUFBQSxhQUFBLEVBQUF0RCxPQUFBLENBQUFpSCxLQUFBLGFBQUF4RixPQUFBLEVBQUFDLE9BQUEsRUFBQUMsSUFBQSxFQUFBQyxXQUFBLEVBQUEyQixXQUFBLGVBQUFBLFdBQUEsS0FBQUEsV0FBQSxHQUFBMkQsT0FBQSxPQUFBQyxJQUFBLE9BQUE3RCxhQUFBLENBQUE5QixJQUFBLENBQUFDLE9BQUEsRUFBQUMsT0FBQSxFQUFBQyxJQUFBLEVBQUFDLFdBQUEsR0FBQTJCLFdBQUEsVUFBQXZELE9BQUEsQ0FBQXdHLG1CQUFBLENBQUE5RSxPQUFBLElBQUF5RixJQUFBLEdBQUFBLElBQUEsQ0FBQS9CLElBQUEsR0FBQXJCLElBQUEsV0FBQUgsTUFBQSxXQUFBQSxNQUFBLENBQUFrQixJQUFBLEdBQUFsQixNQUFBLENBQUFsRCxLQUFBLEdBQUF5RyxJQUFBLENBQUEvQixJQUFBLFdBQUFsQyxxQkFBQSxDQUFBRCxFQUFBLEdBQUE5QixNQUFBLENBQUE4QixFQUFBLEVBQUFoQyxpQkFBQSxnQkFBQUUsTUFBQSxDQUFBOEIsRUFBQSxFQUFBcEMsY0FBQSxpQ0FBQU0sTUFBQSxDQUFBOEIsRUFBQSw2REFBQWpELE9BQUEsQ0FBQW9ILElBQUEsYUFBQUMsR0FBQSxRQUFBQyxNQUFBLEdBQUFwSCxNQUFBLENBQUFtSCxHQUFBLEdBQUFELElBQUEsZ0JBQUE1RyxHQUFBLElBQUE4RyxNQUFBLEVBQUFGLElBQUEsQ0FBQXRCLElBQUEsQ0FBQXRGLEdBQUEsVUFBQTRHLElBQUEsQ0FBQUcsT0FBQSxhQUFBbkMsS0FBQSxXQUFBZ0MsSUFBQSxDQUFBZixNQUFBLFNBQUE3RixHQUFBLEdBQUE0RyxJQUFBLENBQUFJLEdBQUEsUUFBQWhILEdBQUEsSUFBQThHLE1BQUEsU0FBQWxDLElBQUEsQ0FBQTFFLEtBQUEsR0FBQUYsR0FBQSxFQUFBNEUsSUFBQSxDQUFBTixJQUFBLE9BQUFNLElBQUEsV0FBQUEsSUFBQSxDQUFBTixJQUFBLE9BQUFNLElBQUEsUUFBQXBGLE9BQUEsQ0FBQWdELE1BQUEsR0FBQUEsTUFBQSxFQUFBZCxPQUFBLENBQUEvQixTQUFBLEtBQUF3RyxXQUFBLEVBQUF6RSxPQUFBLEVBQUErRCxLQUFBLFdBQUFBLE1BQUF3QixhQUFBLGFBQUFDLElBQUEsV0FBQXRDLElBQUEsV0FBQVYsSUFBQSxRQUFBQyxLQUFBLEdBQUFLLFNBQUEsT0FBQUYsSUFBQSxZQUFBUCxRQUFBLGNBQUFuQixNQUFBLGdCQUFBZCxHQUFBLEdBQUEwQyxTQUFBLE9BQUFhLFVBQUEsQ0FBQTFDLE9BQUEsQ0FBQTRDLGFBQUEsSUFBQTBCLGFBQUEsV0FBQWIsSUFBQSxrQkFBQUEsSUFBQSxDQUFBZSxNQUFBLE9BQUF2SCxNQUFBLENBQUFvQyxJQUFBLE9BQUFvRSxJQUFBLE1BQUFSLEtBQUEsRUFBQVEsSUFBQSxDQUFBZ0IsS0FBQSxjQUFBaEIsSUFBQSxJQUFBNUIsU0FBQSxNQUFBNkMsSUFBQSxXQUFBQSxLQUFBLFNBQUEvQyxJQUFBLFdBQUFnRCxVQUFBLFFBQUFqQyxVQUFBLElBQUFHLFVBQUEsa0JBQUE4QixVQUFBLENBQUF2RixJQUFBLFFBQUF1RixVQUFBLENBQUF4RixHQUFBLGNBQUF5RixJQUFBLEtBQUFuRCxpQkFBQSxXQUFBQSxrQkFBQW9ELFNBQUEsYUFBQWxELElBQUEsUUFBQWtELFNBQUEsTUFBQS9GLE9BQUEsa0JBQUFnRyxPQUFBQyxHQUFBLEVBQUFDLE1BQUEsV0FBQXhFLE1BQUEsQ0FBQXBCLElBQUEsWUFBQW9CLE1BQUEsQ0FBQXJCLEdBQUEsR0FBQTBGLFNBQUEsRUFBQS9GLE9BQUEsQ0FBQW1ELElBQUEsR0FBQThDLEdBQUEsRUFBQUMsTUFBQSxLQUFBbEcsT0FBQSxDQUFBbUIsTUFBQSxXQUFBbkIsT0FBQSxDQUFBSyxHQUFBLEdBQUEwQyxTQUFBLEtBQUFtRCxNQUFBLGFBQUE3QixDQUFBLFFBQUFULFVBQUEsQ0FBQVEsTUFBQSxNQUFBQyxDQUFBLFNBQUFBLENBQUEsUUFBQWQsS0FBQSxRQUFBSyxVQUFBLENBQUFTLENBQUEsR0FBQTNDLE1BQUEsR0FBQTZCLEtBQUEsQ0FBQVEsVUFBQSxpQkFBQVIsS0FBQSxDQUFBQyxNQUFBLFNBQUF3QyxNQUFBLGFBQUF6QyxLQUFBLENBQUFDLE1BQUEsU0FBQWlDLElBQUEsUUFBQVUsUUFBQSxHQUFBaEksTUFBQSxDQUFBb0MsSUFBQSxDQUFBZ0QsS0FBQSxlQUFBNkMsVUFBQSxHQUFBakksTUFBQSxDQUFBb0MsSUFBQSxDQUFBZ0QsS0FBQSxxQkFBQTRDLFFBQUEsSUFBQUMsVUFBQSxhQUFBWCxJQUFBLEdBQUFsQyxLQUFBLENBQUFFLFFBQUEsU0FBQXVDLE1BQUEsQ0FBQXpDLEtBQUEsQ0FBQUUsUUFBQSxnQkFBQWdDLElBQUEsR0FBQWxDLEtBQUEsQ0FBQUcsVUFBQSxTQUFBc0MsTUFBQSxDQUFBekMsS0FBQSxDQUFBRyxVQUFBLGNBQUF5QyxRQUFBLGFBQUFWLElBQUEsR0FBQWxDLEtBQUEsQ0FBQUUsUUFBQSxTQUFBdUMsTUFBQSxDQUFBekMsS0FBQSxDQUFBRSxRQUFBLHFCQUFBMkMsVUFBQSxZQUFBaEUsS0FBQSxxREFBQXFELElBQUEsR0FBQWxDLEtBQUEsQ0FBQUcsVUFBQSxTQUFBc0MsTUFBQSxDQUFBekMsS0FBQSxDQUFBRyxVQUFBLFlBQUFkLE1BQUEsV0FBQUEsT0FBQXRDLElBQUEsRUFBQUQsR0FBQSxhQUFBZ0UsQ0FBQSxRQUFBVCxVQUFBLENBQUFRLE1BQUEsTUFBQUMsQ0FBQSxTQUFBQSxDQUFBLFFBQUFkLEtBQUEsUUFBQUssVUFBQSxDQUFBUyxDQUFBLE9BQUFkLEtBQUEsQ0FBQUMsTUFBQSxTQUFBaUMsSUFBQSxJQUFBdEgsTUFBQSxDQUFBb0MsSUFBQSxDQUFBZ0QsS0FBQSx3QkFBQWtDLElBQUEsR0FBQWxDLEtBQUEsQ0FBQUcsVUFBQSxRQUFBMkMsWUFBQSxHQUFBOUMsS0FBQSxhQUFBOEMsWUFBQSxpQkFBQS9GLElBQUEsbUJBQUFBLElBQUEsS0FBQStGLFlBQUEsQ0FBQTdDLE1BQUEsSUFBQW5ELEdBQUEsSUFBQUEsR0FBQSxJQUFBZ0csWUFBQSxDQUFBM0MsVUFBQSxLQUFBMkMsWUFBQSxjQUFBM0UsTUFBQSxHQUFBMkUsWUFBQSxHQUFBQSxZQUFBLENBQUF0QyxVQUFBLGNBQUFyQyxNQUFBLENBQUFwQixJQUFBLEdBQUFBLElBQUEsRUFBQW9CLE1BQUEsQ0FBQXJCLEdBQUEsR0FBQUEsR0FBQSxFQUFBZ0csWUFBQSxTQUFBbEYsTUFBQSxnQkFBQWdDLElBQUEsR0FBQWtELFlBQUEsQ0FBQTNDLFVBQUEsRUFBQWxELGdCQUFBLFNBQUE4RixRQUFBLENBQUE1RSxNQUFBLE1BQUE0RSxRQUFBLFdBQUFBLFNBQUE1RSxNQUFBLEVBQUFpQyxRQUFBLG9CQUFBakMsTUFBQSxDQUFBcEIsSUFBQSxRQUFBb0IsTUFBQSxDQUFBckIsR0FBQSxxQkFBQXFCLE1BQUEsQ0FBQXBCLElBQUEsbUJBQUFvQixNQUFBLENBQUFwQixJQUFBLFFBQUE2QyxJQUFBLEdBQUF6QixNQUFBLENBQUFyQixHQUFBLGdCQUFBcUIsTUFBQSxDQUFBcEIsSUFBQSxTQUFBd0YsSUFBQSxRQUFBekYsR0FBQSxHQUFBcUIsTUFBQSxDQUFBckIsR0FBQSxPQUFBYyxNQUFBLGtCQUFBZ0MsSUFBQSx5QkFBQXpCLE1BQUEsQ0FBQXBCLElBQUEsSUFBQXFELFFBQUEsVUFBQVIsSUFBQSxHQUFBUSxRQUFBLEdBQUFuRCxnQkFBQSxLQUFBK0YsTUFBQSxXQUFBQSxPQUFBN0MsVUFBQSxhQUFBVyxDQUFBLFFBQUFULFVBQUEsQ0FBQVEsTUFBQSxNQUFBQyxDQUFBLFNBQUFBLENBQUEsUUFBQWQsS0FBQSxRQUFBSyxVQUFBLENBQUFTLENBQUEsT0FBQWQsS0FBQSxDQUFBRyxVQUFBLEtBQUFBLFVBQUEsY0FBQTRDLFFBQUEsQ0FBQS9DLEtBQUEsQ0FBQVEsVUFBQSxFQUFBUixLQUFBLENBQUFJLFFBQUEsR0FBQUcsYUFBQSxDQUFBUCxLQUFBLEdBQUEvQyxnQkFBQSx5QkFBQWdHLE9BQUFoRCxNQUFBLGFBQUFhLENBQUEsUUFBQVQsVUFBQSxDQUFBUSxNQUFBLE1BQUFDLENBQUEsU0FBQUEsQ0FBQSxRQUFBZCxLQUFBLFFBQUFLLFVBQUEsQ0FBQVMsQ0FBQSxPQUFBZCxLQUFBLENBQUFDLE1BQUEsS0FBQUEsTUFBQSxRQUFBOUIsTUFBQSxHQUFBNkIsS0FBQSxDQUFBUSxVQUFBLGtCQUFBckMsTUFBQSxDQUFBcEIsSUFBQSxRQUFBbUcsTUFBQSxHQUFBL0UsTUFBQSxDQUFBckIsR0FBQSxFQUFBeUQsYUFBQSxDQUFBUCxLQUFBLFlBQUFrRCxNQUFBLGdCQUFBckUsS0FBQSw4QkFBQXNFLGFBQUEsV0FBQUEsY0FBQXpDLFFBQUEsRUFBQWYsVUFBQSxFQUFBRSxPQUFBLGdCQUFBZCxRQUFBLEtBQUF6RCxRQUFBLEVBQUFrQyxNQUFBLENBQUFrRCxRQUFBLEdBQUFmLFVBQUEsRUFBQUEsVUFBQSxFQUFBRSxPQUFBLEVBQUFBLE9BQUEsb0JBQUFqQyxNQUFBLFVBQUFkLEdBQUEsR0FBQTBDLFNBQUEsR0FBQXZDLGdCQUFBLE9BQUF6QyxPQUFBO0FBQUEsU0FBQTRJLG1CQUFBQyxHQUFBLEVBQUFwRixPQUFBLEVBQUFDLE1BQUEsRUFBQW9GLEtBQUEsRUFBQUMsTUFBQSxFQUFBdkksR0FBQSxFQUFBOEIsR0FBQSxjQUFBNEMsSUFBQSxHQUFBMkQsR0FBQSxDQUFBckksR0FBQSxFQUFBOEIsR0FBQSxPQUFBNUIsS0FBQSxHQUFBd0UsSUFBQSxDQUFBeEUsS0FBQSxXQUFBdUQsS0FBQSxJQUFBUCxNQUFBLENBQUFPLEtBQUEsaUJBQUFpQixJQUFBLENBQUFKLElBQUEsSUFBQXJCLE9BQUEsQ0FBQS9DLEtBQUEsWUFBQXdHLE9BQUEsQ0FBQXpELE9BQUEsQ0FBQS9DLEtBQUEsRUFBQXFELElBQUEsQ0FBQStFLEtBQUEsRUFBQUMsTUFBQTtBQUFBLFNBQUFDLGtCQUFBM0csRUFBQSw2QkFBQVYsSUFBQSxTQUFBc0gsSUFBQSxHQUFBQyxTQUFBLGFBQUFoQyxPQUFBLFdBQUF6RCxPQUFBLEVBQUFDLE1BQUEsUUFBQW1GLEdBQUEsR0FBQXhHLEVBQUEsQ0FBQThHLEtBQUEsQ0FBQXhILElBQUEsRUFBQXNILElBQUEsWUFBQUgsTUFBQXBJLEtBQUEsSUFBQWtJLGtCQUFBLENBQUFDLEdBQUEsRUFBQXBGLE9BQUEsRUFBQUMsTUFBQSxFQUFBb0YsS0FBQSxFQUFBQyxNQUFBLFVBQUFySSxLQUFBLGNBQUFxSSxPQUFBeEgsR0FBQSxJQUFBcUgsa0JBQUEsQ0FBQUMsR0FBQSxFQUFBcEYsT0FBQSxFQUFBQyxNQUFBLEVBQUFvRixLQUFBLEVBQUFDLE1BQUEsV0FBQXhILEdBQUEsS0FBQXVILEtBQUEsQ0FBQTlELFNBQUE7QUFBQSxTQUFBb0UsUUFBQTlCLE1BQUEsRUFBQStCLGNBQUEsUUFBQWpDLElBQUEsR0FBQWxILE1BQUEsQ0FBQWtILElBQUEsQ0FBQUUsTUFBQSxPQUFBcEgsTUFBQSxDQUFBb0oscUJBQUEsUUFBQUMsT0FBQSxHQUFBckosTUFBQSxDQUFBb0oscUJBQUEsQ0FBQWhDLE1BQUEsR0FBQStCLGNBQUEsS0FBQUUsT0FBQSxHQUFBQSxPQUFBLENBQUFDLE1BQUEsV0FBQUMsR0FBQSxXQUFBdkosTUFBQSxDQUFBd0osd0JBQUEsQ0FBQXBDLE1BQUEsRUFBQW1DLEdBQUEsRUFBQXJJLFVBQUEsT0FBQWdHLElBQUEsQ0FBQXRCLElBQUEsQ0FBQXFELEtBQUEsQ0FBQS9CLElBQUEsRUFBQW1DLE9BQUEsWUFBQW5DLElBQUE7QUFBQSxTQUFBdUMsY0FBQUMsTUFBQSxhQUFBdEQsQ0FBQSxNQUFBQSxDQUFBLEdBQUE0QyxTQUFBLENBQUE3QyxNQUFBLEVBQUFDLENBQUEsVUFBQXVELE1BQUEsV0FBQVgsU0FBQSxDQUFBNUMsQ0FBQSxJQUFBNEMsU0FBQSxDQUFBNUMsQ0FBQSxRQUFBQSxDQUFBLE9BQUE4QyxPQUFBLENBQUFsSixNQUFBLENBQUEySixNQUFBLE9BQUExRyxPQUFBLFdBQUEzQyxHQUFBLElBQUFzSixlQUFBLENBQUFGLE1BQUEsRUFBQXBKLEdBQUEsRUFBQXFKLE1BQUEsQ0FBQXJKLEdBQUEsU0FBQU4sTUFBQSxDQUFBNkoseUJBQUEsR0FBQTdKLE1BQUEsQ0FBQThKLGdCQUFBLENBQUFKLE1BQUEsRUFBQTFKLE1BQUEsQ0FBQTZKLHlCQUFBLENBQUFGLE1BQUEsS0FBQVQsT0FBQSxDQUFBbEosTUFBQSxDQUFBMkosTUFBQSxHQUFBMUcsT0FBQSxXQUFBM0MsR0FBQSxJQUFBTixNQUFBLENBQUFJLGNBQUEsQ0FBQXNKLE1BQUEsRUFBQXBKLEdBQUEsRUFBQU4sTUFBQSxDQUFBd0osd0JBQUEsQ0FBQUcsTUFBQSxFQUFBckosR0FBQSxpQkFBQW9KLE1BQUE7QUFBQSxTQUFBRSxnQkFBQXZKLEdBQUEsRUFBQUMsR0FBQSxFQUFBRSxLQUFBLElBQUFGLEdBQUEsR0FBQXlKLGNBQUEsQ0FBQXpKLEdBQUEsT0FBQUEsR0FBQSxJQUFBRCxHQUFBLElBQUFMLE1BQUEsQ0FBQUksY0FBQSxDQUFBQyxHQUFBLEVBQUFDLEdBQUEsSUFBQUUsS0FBQSxFQUFBQSxLQUFBLEVBQUFVLFVBQUEsUUFBQUMsWUFBQSxRQUFBQyxRQUFBLG9CQUFBZixHQUFBLENBQUFDLEdBQUEsSUFBQUUsS0FBQSxXQUFBSCxHQUFBO0FBQUEsU0FBQTBKLGVBQUEzSCxHQUFBLFFBQUE5QixHQUFBLEdBQUEwSixZQUFBLENBQUE1SCxHQUFBLG9CQUFBdUIsT0FBQSxDQUFBckQsR0FBQSxpQkFBQUEsR0FBQSxHQUFBMkosTUFBQSxDQUFBM0osR0FBQTtBQUFBLFNBQUEwSixhQUFBRSxLQUFBLEVBQUFDLElBQUEsUUFBQXhHLE9BQUEsQ0FBQXVHLEtBQUEsa0JBQUFBLEtBQUEsa0JBQUFBLEtBQUEsTUFBQUUsSUFBQSxHQUFBRixLQUFBLENBQUF4SixNQUFBLENBQUEySixXQUFBLE9BQUFELElBQUEsS0FBQXRGLFNBQUEsUUFBQXdGLEdBQUEsR0FBQUYsSUFBQSxDQUFBOUgsSUFBQSxDQUFBNEgsS0FBQSxFQUFBQyxJQUFBLG9CQUFBeEcsT0FBQSxDQUFBMkcsR0FBQSx1QkFBQUEsR0FBQSxZQUFBdkYsU0FBQSw0REFBQW9GLElBQUEsZ0JBQUFGLE1BQUEsR0FBQU0sTUFBQSxFQUFBTCxLQUFBO0FBRG9EO0FBQ2hCO0FBRXBDLElBQUlRLFdBQVcsR0FBQWpCLGFBQUEsS0FBT2UsaUVBQVUsQ0FBQztBQUVqQ0UsV0FBVyxDQUFDeEcsS0FBSyxHQUFHLFlBQVk7RUFDNUIsSUFBSUEsS0FBSyxHQUFHc0csdUVBQWdCLENBQUMsQ0FBQztFQUU5QnRHLEtBQUssQ0FBQ3lHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxtQkFBbUI7RUFDNUMsT0FBT3pHLEtBQUs7QUFDaEIsQ0FBQztBQUVEd0csV0FBVyxDQUFDRSxPQUFPLENBQUNDLFlBQVk7RUFBQSxJQUFBQyxLQUFBLEdBQUFoQyxpQkFBQSxlQUFBakosbUJBQUEsR0FBQThHLElBQUEsQ0FBRyxTQUFBb0UsUUFBQUMsSUFBQTtJQUFBLElBQUFDLE1BQUE7TUFBQUMsUUFBQTtNQUFBQyxPQUFBO01BQUFqSCxLQUFBO01BQUFrSCxXQUFBO01BQUFDLElBQUE7TUFBQUMsS0FBQSxHQUFBdEMsU0FBQTtJQUFBLE9BQUFuSixtQkFBQSxHQUFBeUIsSUFBQSxVQUFBaUssU0FBQUMsUUFBQTtNQUFBLGtCQUFBQSxRQUFBLENBQUFoRSxJQUFBLEdBQUFnRSxRQUFBLENBQUF0RyxJQUFBO1FBQUE7VUFBa0IrRixNQUFNLEdBQUFELElBQUEsQ0FBTkMsTUFBTSxFQUFFQyxRQUFRLEdBQUFGLElBQUEsQ0FBUkUsUUFBUSxFQUFFQyxPQUFPLEdBQUFILElBQUEsQ0FBUEcsT0FBTyxFQUFFakgsS0FBSyxHQUFBOEcsSUFBQSxDQUFMOUcsS0FBSyxFQUFFa0gsV0FBVyxHQUFBSixJQUFBLENBQVhJLFdBQVc7VUFBSUMsSUFBSSxHQUFBQyxLQUFBLENBQUFuRixNQUFBLFFBQUFtRixLQUFBLFFBQUF4RyxTQUFBLEdBQUF3RyxLQUFBLE1BQUcsQ0FBQyxDQUFDO1VBQzNHcEgsS0FBSyxDQUFDeUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLDBCQUEwQjtVQUFDLE9BQUFhLFFBQUEsQ0FBQTdHLE1BQUEsV0FDaER1RyxRQUFRLENBQUMsU0FBUyxFQUFFO1lBQ3ZCRyxJQUFJLEVBQUVBO1VBQ1YsQ0FBQyxDQUFDO1FBQUE7UUFBQTtVQUFBLE9BQUFHLFFBQUEsQ0FBQTdELElBQUE7TUFBQTtJQUFBLEdBQUFvRCxPQUFBO0VBQUEsQ0FDTDtFQUFBLGlCQUFBVSxFQUFBO0lBQUEsT0FBQVgsS0FBQSxDQUFBN0IsS0FBQSxPQUFBRCxTQUFBO0VBQUE7QUFBQTtBQUVELGlFQUFlMEIsV0FBVyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9kb21haW4vbWFzL3Z1ZXgvc2V0dGluZ3MuanM/OTE2MCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZU1vZHVsZSBmcm9tIFwifi92dWV4L21vZHVsZXMvYmFzZS1tb2R1bGVcIjtcbmltcG9ydCBDdXN0b21lcnMgZnJvbSBcIi4vY3VzdG9tZXJzXCI7XG5cbmxldCBNYXNTZXR0aW5ncyA9IHsuLi5CYXNlTW9kdWxlfTtcblxuTWFzU2V0dGluZ3Muc3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHN0YXRlID0gQmFzZU1vZHVsZS5zdGF0ZSgpO1xuXG4gICAgc3RhdGUuZW5kcG9pbnRzWydhbGwnXSA9ICcvYXBpL21hcy9zZXR0aW5ncyc7XG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuTWFzU2V0dGluZ3MuYWN0aW9ucy51cGRhdGVPcHRpb24gPSBhc3luYyBmdW5jdGlvbiAoeyBjb21taXQsIGRpc3BhdGNoLCBnZXR0ZXJzLCBzdGF0ZSwgcm9vdEdldHRlcnMgfSwgZGF0YSA9IHt9KSB7XG4gICAgc3RhdGUuZW5kcG9pbnRzWyd1cGRhdGUnXSA9ICcvYXBpL21hcy9zZXR0aW5ncy91cGRhdGUnO1xuICAgIHJldHVybiBkaXNwYXRjaCgndXBkYXRlMicsIHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hc1NldHRpbmdzO1xuIl0sIm5hbWVzIjpbIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJleHBvcnRzIiwiT3AiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd24iLCJoYXNPd25Qcm9wZXJ0eSIsImRlZmluZVByb3BlcnR5Iiwib2JqIiwia2V5IiwiZGVzYyIsInZhbHVlIiwiJFN5bWJvbCIsIlN5bWJvbCIsIml0ZXJhdG9yU3ltYm9sIiwiaXRlcmF0b3IiLCJhc3luY0l0ZXJhdG9yU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsInRvU3RyaW5nVGFnU3ltYm9sIiwidG9TdHJpbmdUYWciLCJkZWZpbmUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJlcnIiLCJ3cmFwIiwiaW5uZXJGbiIsIm91dGVyRm4iLCJzZWxmIiwidHJ5TG9jc0xpc3QiLCJwcm90b0dlbmVyYXRvciIsIkdlbmVyYXRvciIsImdlbmVyYXRvciIsImNyZWF0ZSIsImNvbnRleHQiLCJDb250ZXh0IiwibWFrZUludm9rZU1ldGhvZCIsInRyeUNhdGNoIiwiZm4iLCJhcmciLCJ0eXBlIiwiY2FsbCIsIkNvbnRpbnVlU2VudGluZWwiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiSXRlcmF0b3JQcm90b3R5cGUiLCJnZXRQcm90byIsImdldFByb3RvdHlwZU9mIiwiTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUiLCJ2YWx1ZXMiLCJHcCIsImRlZmluZUl0ZXJhdG9yTWV0aG9kcyIsImZvckVhY2giLCJtZXRob2QiLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwiaW52b2tlIiwicmVzb2x2ZSIsInJlamVjdCIsInJlY29yZCIsInJlc3VsdCIsIl90eXBlb2YiLCJfX2F3YWl0IiwidGhlbiIsInVud3JhcHBlZCIsImVycm9yIiwicHJldmlvdXNQcm9taXNlIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJzdGF0ZSIsIkVycm9yIiwiZG9uZVJlc3VsdCIsImRlbGVnYXRlIiwiZGVsZWdhdGVSZXN1bHQiLCJtYXliZUludm9rZURlbGVnYXRlIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJkb25lIiwibWV0aG9kTmFtZSIsInVuZGVmaW5lZCIsIlR5cGVFcnJvciIsImluZm8iLCJyZXN1bHROYW1lIiwibmV4dCIsIm5leHRMb2MiLCJwdXNoVHJ5RW50cnkiLCJsb2NzIiwiZW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsIml0ZXJhYmxlIiwiaXRlcmF0b3JNZXRob2QiLCJpc05hTiIsImxlbmd0aCIsImkiLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJnZW5GdW4iLCJjdG9yIiwiY29uc3RydWN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJpdGVyIiwia2V5cyIsInZhbCIsIm9iamVjdCIsInJldmVyc2UiLCJwb3AiLCJza2lwVGVtcFJlc2V0IiwicHJldiIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJvb3RSZWNvcmQiLCJydmFsIiwiZXhjZXB0aW9uIiwiaGFuZGxlIiwibG9jIiwiY2F1Z2h0IiwiaGFzQ2F0Y2giLCJoYXNGaW5hbGx5IiwiZmluYWxseUVudHJ5IiwiY29tcGxldGUiLCJmaW5pc2giLCJfY2F0Y2giLCJ0aHJvd24iLCJkZWxlZ2F0ZVlpZWxkIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiZ2VuIiwiX25leHQiLCJfdGhyb3ciLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3MiLCJhcmd1bWVudHMiLCJhcHBseSIsIm93bktleXMiLCJlbnVtZXJhYmxlT25seSIsImdldE93blByb3BlcnR5U3ltYm9scyIsInN5bWJvbHMiLCJmaWx0ZXIiLCJzeW0iLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJfb2JqZWN0U3ByZWFkIiwidGFyZ2V0Iiwic291cmNlIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfdG9Qcm9wZXJ0eUtleSIsIl90b1ByaW1pdGl2ZSIsIlN0cmluZyIsImlucHV0IiwiaGludCIsInByaW0iLCJ0b1ByaW1pdGl2ZSIsInJlcyIsIk51bWJlciIsIkJhc2VNb2R1bGUiLCJDdXN0b21lcnMiLCJNYXNTZXR0aW5ncyIsImVuZHBvaW50cyIsImFjdGlvbnMiLCJ1cGRhdGVPcHRpb24iLCJfcmVmMiIsIl9jYWxsZWUiLCJfcmVmIiwiY29tbWl0IiwiZGlzcGF0Y2giLCJnZXR0ZXJzIiwicm9vdEdldHRlcnMiLCJkYXRhIiwiX2FyZ3MiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwiX3giXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/domain/mas/vuex/settings.js\n");

/***/ }),

/***/ "./resources/js/domain/permissions/vuex/permissions.js":
/*!*************************************************************!*\
  !*** ./resources/js/domain/permissions/vuex/permissions.js ***!
  \*************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar Permissions = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nPermissions.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n  state.endpoints['all'] = '/api/permissions';\n  return state;\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Permissions);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL3Blcm1pc3Npb25zL3Z1ZXgvcGVybWlzc2lvbnMuanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBb0Q7QUFFcEQsSUFBSUMsV0FBVyxHQUFBQyxhQUFBLEtBQU9GLGlFQUFVLENBQUM7QUFFakNDLFdBQVcsQ0FBQ0UsS0FBSyxHQUFHLFlBQVk7RUFDNUIsSUFBSUEsS0FBSyxHQUFHSCx1RUFBZ0IsQ0FBQyxDQUFDO0VBRTlCRyxLQUFLLENBQUNDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxrQkFBa0I7RUFFM0MsT0FBT0QsS0FBSztBQUNoQixDQUFDO0FBQ0QsaUVBQWVGLFdBQVciLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZG9tYWluL3Blcm1pc3Npb25zL3Z1ZXgvcGVybWlzc2lvbnMuanM/YmE4YSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZU1vZHVsZSBmcm9tIFwifi92dWV4L21vZHVsZXMvYmFzZS1tb2R1bGVcIjtcblxubGV0IFBlcm1pc3Npb25zID0gey4uLkJhc2VNb2R1bGV9O1xuXG5QZXJtaXNzaW9ucy5zdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgc3RhdGUgPSBCYXNlTW9kdWxlLnN0YXRlKCk7XG5cbiAgICBzdGF0ZS5lbmRwb2ludHNbJ2FsbCddID0gJy9hcGkvcGVybWlzc2lvbnMnO1xuXG4gICAgcmV0dXJuIHN0YXRlO1xufTtcbmV4cG9ydCBkZWZhdWx0IFBlcm1pc3Npb25zO1xuIl0sIm5hbWVzIjpbIkJhc2VNb2R1bGUiLCJQZXJtaXNzaW9ucyIsIl9vYmplY3RTcHJlYWQiLCJzdGF0ZSIsImVuZHBvaW50cyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/domain/permissions/vuex/permissions.js\n");

/***/ }),

/***/ "./resources/js/domain/permissions/vuex/role_users.js":
/*!************************************************************!*\
  !*** ./resources/js/domain/permissions/vuex/role_users.js ***!
  \************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar Role_users = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nRole_users.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n  state.endpoints['all'] = '/api/role_users';\n  return state;\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Role_users);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL3Blcm1pc3Npb25zL3Z1ZXgvcm9sZV91c2Vycy5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFvRDtBQUVwRCxJQUFJQyxVQUFVLEdBQUFDLGFBQUEsS0FBT0YsaUVBQVUsQ0FBQztBQUVoQ0MsVUFBVSxDQUFDRSxLQUFLLEdBQUcsWUFBWTtFQUMzQixJQUFJQSxLQUFLLEdBQUdILHVFQUFnQixDQUFDLENBQUM7RUFFOUJHLEtBQUssQ0FBQ0MsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLGlCQUFpQjtFQUUxQyxPQUFPRCxLQUFLO0FBQ2hCLENBQUM7QUFDRCxpRUFBZUYsVUFBVSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9kb21haW4vcGVybWlzc2lvbnMvdnVleC9yb2xlX3VzZXJzLmpzPzNlMTQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2VNb2R1bGUgZnJvbSBcIn4vdnVleC9tb2R1bGVzL2Jhc2UtbW9kdWxlXCI7XG5cbmxldCBSb2xlX3VzZXJzID0gey4uLkJhc2VNb2R1bGV9O1xuXG5Sb2xlX3VzZXJzLnN0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCBzdGF0ZSA9IEJhc2VNb2R1bGUuc3RhdGUoKTtcblxuICAgIHN0YXRlLmVuZHBvaW50c1snYWxsJ10gPSAnL2FwaS9yb2xlX3VzZXJzJztcblxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5leHBvcnQgZGVmYXVsdCBSb2xlX3VzZXJzO1xuIl0sIm5hbWVzIjpbIkJhc2VNb2R1bGUiLCJSb2xlX3VzZXJzIiwiX29iamVjdFNwcmVhZCIsInN0YXRlIiwiZW5kcG9pbnRzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/domain/permissions/vuex/role_users.js\n");

/***/ }),

/***/ "./resources/js/domain/ports/vuex/ports.js":
/*!*************************************************!*\
  !*** ./resources/js/domain/ports/vuex/ports.js ***!
  \*************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar Ports = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nPorts.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n  state.endpoints['all'] = '/api/ports';\n  state.lastDate = null;\n  state.sort = {};\n  return state;\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Ports);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL3BvcnRzL3Z1ZXgvcG9ydHMuanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBb0Q7QUFFcEQsSUFBSUMsS0FBSyxHQUFBQyxhQUFBLEtBQU9GLGlFQUFVLENBQUM7QUFFM0JDLEtBQUssQ0FBQ0UsS0FBSyxHQUFHLFlBQVk7RUFDdEIsSUFBSUEsS0FBSyxHQUFHSCx1RUFBZ0IsQ0FBQyxDQUFDO0VBRTlCRyxLQUFLLENBQUNDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxZQUFZO0VBRXJDRCxLQUFLLENBQUNFLFFBQVEsR0FBRyxJQUFJO0VBQ3JCRixLQUFLLENBQUNHLElBQUksR0FBRyxDQUFDLENBQUM7RUFHZixPQUFPSCxLQUFLO0FBQ2hCLENBQUM7QUFFRCxpRUFBZUYsS0FBSyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9kb21haW4vcG9ydHMvdnVleC9wb3J0cy5qcz9mYzExIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlTW9kdWxlIGZyb20gXCJ+L3Z1ZXgvbW9kdWxlcy9iYXNlLW1vZHVsZVwiO1xuXG5sZXQgUG9ydHMgPSB7Li4uQmFzZU1vZHVsZX07XG5cblBvcnRzLnN0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCBzdGF0ZSA9IEJhc2VNb2R1bGUuc3RhdGUoKTtcblxuICAgIHN0YXRlLmVuZHBvaW50c1snYWxsJ10gPSAnL2FwaS9wb3J0cyc7XG5cbiAgICBzdGF0ZS5sYXN0RGF0ZSA9IG51bGw7XG4gICAgc3RhdGUuc29ydCA9IHt9O1xuXG5cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQb3J0cztcbiJdLCJuYW1lcyI6WyJCYXNlTW9kdWxlIiwiUG9ydHMiLCJfb2JqZWN0U3ByZWFkIiwic3RhdGUiLCJlbmRwb2ludHMiLCJsYXN0RGF0ZSIsInNvcnQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/domain/ports/vuex/ports.js\n");

/***/ }),

/***/ "./resources/js/domain/ships/vuex/ships.js":
/*!*************************************************!*\
  !*** ./resources/js/domain/ships/vuex/ships.js ***!
  \*************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar Ships = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nShips.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n  state.endpoints['all'] = '/api/ships';\n  state.lastDate = null;\n  state.sort = {};\n  return state;\n};\nShips.mutations.setName = function (state, data) {\n  console.log(data);\n  state.all[data.id].name = data.name;\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Ships);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL3NoaXBzL3Z1ZXgvc2hpcHMuanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBb0Q7QUFFcEQsSUFBSUMsS0FBSyxHQUFBQyxhQUFBLEtBQU9GLGlFQUFVLENBQUM7QUFFM0JDLEtBQUssQ0FBQ0UsS0FBSyxHQUFHLFlBQVk7RUFDdEIsSUFBSUEsS0FBSyxHQUFHSCx1RUFBZ0IsQ0FBQyxDQUFDO0VBRTlCRyxLQUFLLENBQUNDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxZQUFZO0VBRXJDRCxLQUFLLENBQUNFLFFBQVEsR0FBRyxJQUFJO0VBQ3JCRixLQUFLLENBQUNHLElBQUksR0FBRyxDQUFDLENBQUM7RUFHZixPQUFPSCxLQUFLO0FBQ2hCLENBQUM7QUFFREYsS0FBSyxDQUFDTSxTQUFTLENBQUNDLE9BQU8sR0FBRyxVQUFVTCxLQUFLLEVBQUVNLElBQUksRUFBRTtFQUM3Q0MsT0FBTyxDQUFDQyxHQUFHLENBQUNGLElBQUksQ0FBQztFQUNqQk4sS0FBSyxDQUFDUyxHQUFHLENBQUNILElBQUksQ0FBQ0ksRUFBRSxDQUFDLENBQUNDLElBQUksR0FBR0wsSUFBSSxDQUFDSyxJQUFJO0FBQ3ZDLENBQUM7QUFFRCxpRUFBZWIsS0FBSyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9kb21haW4vc2hpcHMvdnVleC9zaGlwcy5qcz9mOTc2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlTW9kdWxlIGZyb20gXCJ+L3Z1ZXgvbW9kdWxlcy9iYXNlLW1vZHVsZVwiO1xuXG5sZXQgU2hpcHMgPSB7Li4uQmFzZU1vZHVsZX07XG5cblNoaXBzLnN0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCBzdGF0ZSA9IEJhc2VNb2R1bGUuc3RhdGUoKTtcblxuICAgIHN0YXRlLmVuZHBvaW50c1snYWxsJ10gPSAnL2FwaS9zaGlwcyc7XG5cbiAgICBzdGF0ZS5sYXN0RGF0ZSA9IG51bGw7XG4gICAgc3RhdGUuc29ydCA9IHt9O1xuXG5cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5TaGlwcy5tdXRhdGlvbnMuc2V0TmFtZSA9IGZ1bmN0aW9uIChzdGF0ZSwgZGF0YSkge1xuICAgIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgIHN0YXRlLmFsbFtkYXRhLmlkXS5uYW1lID0gZGF0YS5uYW1lO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2hpcHM7XG4iXSwibmFtZXMiOlsiQmFzZU1vZHVsZSIsIlNoaXBzIiwiX29iamVjdFNwcmVhZCIsInN0YXRlIiwiZW5kcG9pbnRzIiwibGFzdERhdGUiLCJzb3J0IiwibXV0YXRpb25zIiwic2V0TmFtZSIsImRhdGEiLCJjb25zb2xlIiwibG9nIiwiYWxsIiwiaWQiLCJuYW1lIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/domain/ships/vuex/ships.js\n");

/***/ }),

/***/ "./resources/js/domain/users/vuex/roles.js":
/*!*************************************************!*\
  !*** ./resources/js/domain/users/vuex/roles.js ***!
  \*************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar Roles = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nRoles.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n  state.endpoints['all'] = '/api/roles';\n  return state;\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Roles);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL3VzZXJzL3Z1ZXgvcm9sZXMuanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBb0Q7QUFFcEQsSUFBSUMsS0FBSyxHQUFBQyxhQUFBLEtBQU9GLGlFQUFVLENBQUM7QUFFM0JDLEtBQUssQ0FBQ0UsS0FBSyxHQUFHLFlBQVk7RUFDdEIsSUFBSUEsS0FBSyxHQUFHSCx1RUFBZ0IsQ0FBQyxDQUFDO0VBRTlCRyxLQUFLLENBQUNDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxZQUFZO0VBR3JDLE9BQU9ELEtBQUs7QUFDaEIsQ0FBQztBQUNELGlFQUFlRixLQUFLIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2RvbWFpbi91c2Vycy92dWV4L3JvbGVzLmpzPzhjZDIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2VNb2R1bGUgZnJvbSBcIn4vdnVleC9tb2R1bGVzL2Jhc2UtbW9kdWxlXCI7XG5cbmxldCBSb2xlcyA9IHsuLi5CYXNlTW9kdWxlfTtcblxuUm9sZXMuc3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHN0YXRlID0gQmFzZU1vZHVsZS5zdGF0ZSgpO1xuXG4gICAgc3RhdGUuZW5kcG9pbnRzWydhbGwnXSA9ICcvYXBpL3JvbGVzJztcblxuXG4gICAgcmV0dXJuIHN0YXRlO1xufTtcbmV4cG9ydCBkZWZhdWx0IFJvbGVzO1xuIl0sIm5hbWVzIjpbIkJhc2VNb2R1bGUiLCJSb2xlcyIsIl9vYmplY3RTcHJlYWQiLCJzdGF0ZSIsImVuZHBvaW50cyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/domain/users/vuex/roles.js\n");

/***/ }),

/***/ "./resources/js/domain/users/vuex/users.js":
/*!*************************************************!*\
  !*** ./resources/js/domain/users/vuex/users.js ***!
  \*************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/vuex/modules/base-module */ \"./resources/js/vuex/modules/base-module.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n//import Roles from \"./roles\";\n\nvar Users = _objectSpread({}, _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nUsers.state = function () {\n  var state = _vuex_modules_base_module__WEBPACK_IMPORTED_MODULE_0__[\"default\"].state();\n  state.endpoints['all'] = '/api/users';\n  state.endpoints['validate-email'] = '/api/users/validate-email';\n  return state;\n};\nUsers.mutations.reset = function (state) {\n  state.all = [];\n  state.invalidEmails = [];\n};\nUsers.mutations.addInvalidEmail = function (state, email) {\n  state.invalidEmails.push(email);\n};\nUsers.getters.invalidEmails = function (state) {\n  return state.invalidEmails;\n};\nUsers.actions.markCustomerEmailVerified = /*#__PURE__*/function () {\n  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref, id) {\n    var state, response;\n    return _regeneratorRuntime().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          state = _ref.state;\n          _context.next = 3;\n          return this.axios.post('/api/customer/verify-email', id);\n        case 3:\n          response = _context.sent;\n          if (!(response.status == 200)) {\n            _context.next = 6;\n            break;\n          }\n          return _context.abrupt(\"return\", true);\n        case 6:\n          return _context.abrupt(\"return\", false);\n        case 7:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee, this);\n  }));\n  return function (_x, _x2) {\n    return _ref2.apply(this, arguments);\n  };\n}();\nUsers.actions.ResetCustomerPassword = /*#__PURE__*/function () {\n  var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref3, id) {\n    var state, response;\n    return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n      while (1) switch (_context2.prev = _context2.next) {\n        case 0:\n          state = _ref3.state;\n          _context2.next = 3;\n          return this.axios.post('/api/customer/generate-password', id);\n        case 3:\n          response = _context2.sent;\n          if (!(response.status == 200 && response.data.success)) {\n            _context2.next = 6;\n            break;\n          }\n          return _context2.abrupt(\"return\", response.data);\n        case 6:\n          return _context2.abrupt(\"return\", false);\n        case 7:\n        case \"end\":\n          return _context2.stop();\n      }\n    }, _callee2, this);\n  }));\n  return function (_x3, _x4) {\n    return _ref4.apply(this, arguments);\n  };\n}();\nUsers.actions.emailIsValid = /*#__PURE__*/function () {\n  var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_ref5, email) {\n    var commit, state, getters, rootGetters, invalidEmails, response;\n    return _regeneratorRuntime().wrap(function _callee3$(_context3) {\n      while (1) switch (_context3.prev = _context3.next) {\n        case 0:\n          commit = _ref5.commit, state = _ref5.state, getters = _ref5.getters, rootGetters = _ref5.rootGetters;\n          if (!(email == rootGetters['auth/getUserEmail'])) {\n            _context3.next = 4;\n            break;\n          }\n          console.log('Weird');\n          return _context3.abrupt(\"return\", true);\n        case 4:\n          invalidEmails = getters['invalidEmails'];\n          if (typeof invalidEmails === 'undefined') {\n            invalidEmails = [];\n            state.invalidEmails = [];\n          }\n          if (!invalidEmails.includes(email)) {\n            _context3.next = 8;\n            break;\n          }\n          return _context3.abrupt(\"return\", false);\n        case 8:\n          _context3.next = 10;\n          return this.axios.post(state.endpoints['validate-email'], {\n            email: email\n          });\n        case 10:\n          response = _context3.sent;\n          if (!(response.data == 'available')) {\n            _context3.next = 13;\n            break;\n          }\n          return _context3.abrupt(\"return\", true);\n        case 13:\n          commit('addInvalidEmail', email);\n          return _context3.abrupt(\"return\", false);\n        case 15:\n        case \"end\":\n          return _context3.stop();\n      }\n    }, _callee3, this);\n  }));\n  return function (_x5, _x6) {\n    return _ref6.apply(this, arguments);\n  };\n}();\nUsers.getters.byRole = function (state, getters) {\n  return function (roleId) {\n    return getters['allValues'].filter(function (elem) {\n      return elem.hasOwnProperty('pivot') && elem.pivot.hasOwnProperty('role_id') && elem.pivot.role_id === roleId;\n    });\n  };\n};\nUsers.getters.byTeam = function (state, getters) {\n  return function (teamId) {\n    return getters['allValues'].filter(function (elem) {\n      return elem.hasOwnProperty('pivot') && elem.pivot.hasOwnProperty('team_id') && elem.pivot.team_id === teamId;\n    });\n  };\n};\nUsers.actions.searchUser = /*#__PURE__*/function () {\n  var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(_ref7) {\n    var commit,\n      dispatch,\n      getters,\n      state,\n      rootGetters,\n      data,\n      _args4 = arguments;\n    return _regeneratorRuntime().wrap(function _callee4$(_context4) {\n      while (1) switch (_context4.prev = _context4.next) {\n        case 0:\n          commit = _ref7.commit, dispatch = _ref7.dispatch, getters = _ref7.getters, state = _ref7.state, rootGetters = _ref7.rootGetters;\n          data = _args4.length > 1 && _args4[1] !== undefined ? _args4[1] : {};\n          if (data.searchInput) {\n            _context4.next = 4;\n            break;\n          }\n          return _context4.abrupt(\"return\", false);\n        case 4:\n          state.endpoints['search'] = '/api/users/search';\n          return _context4.abrupt(\"return\", dispatch('search', {\n            term: data.searchInput,\n            includes: [],\n            page: data.page,\n            perPage: data.per_page\n          }));\n        case 6:\n        case \"end\":\n          return _context4.stop();\n      }\n    }, _callee4);\n  }));\n  return function (_x7) {\n    return _ref8.apply(this, arguments);\n  };\n}();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Users);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZG9tYWluL3VzZXJzL3Z1ZXgvdXNlcnMuanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OytDQUNBLHFKQUFBQSxtQkFBQSxZQUFBQSxvQkFBQSxXQUFBQyxPQUFBLFNBQUFBLE9BQUEsT0FBQUMsRUFBQSxHQUFBQyxNQUFBLENBQUFDLFNBQUEsRUFBQUMsTUFBQSxHQUFBSCxFQUFBLENBQUFJLGNBQUEsRUFBQUMsY0FBQSxHQUFBSixNQUFBLENBQUFJLGNBQUEsY0FBQUMsR0FBQSxFQUFBQyxHQUFBLEVBQUFDLElBQUEsSUFBQUYsR0FBQSxDQUFBQyxHQUFBLElBQUFDLElBQUEsQ0FBQUMsS0FBQSxLQUFBQyxPQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsY0FBQSxHQUFBRixPQUFBLENBQUFHLFFBQUEsa0JBQUFDLG1CQUFBLEdBQUFKLE9BQUEsQ0FBQUssYUFBQSx1QkFBQUMsaUJBQUEsR0FBQU4sT0FBQSxDQUFBTyxXQUFBLDhCQUFBQyxPQUFBWixHQUFBLEVBQUFDLEdBQUEsRUFBQUUsS0FBQSxXQUFBUixNQUFBLENBQUFJLGNBQUEsQ0FBQUMsR0FBQSxFQUFBQyxHQUFBLElBQUFFLEtBQUEsRUFBQUEsS0FBQSxFQUFBVSxVQUFBLE1BQUFDLFlBQUEsTUFBQUMsUUFBQSxTQUFBZixHQUFBLENBQUFDLEdBQUEsV0FBQVcsTUFBQSxtQkFBQUksR0FBQSxJQUFBSixNQUFBLFlBQUFBLE9BQUFaLEdBQUEsRUFBQUMsR0FBQSxFQUFBRSxLQUFBLFdBQUFILEdBQUEsQ0FBQUMsR0FBQSxJQUFBRSxLQUFBLGdCQUFBYyxLQUFBQyxPQUFBLEVBQUFDLE9BQUEsRUFBQUMsSUFBQSxFQUFBQyxXQUFBLFFBQUFDLGNBQUEsR0FBQUgsT0FBQSxJQUFBQSxPQUFBLENBQUF2QixTQUFBLFlBQUEyQixTQUFBLEdBQUFKLE9BQUEsR0FBQUksU0FBQSxFQUFBQyxTQUFBLEdBQUE3QixNQUFBLENBQUE4QixNQUFBLENBQUFILGNBQUEsQ0FBQTFC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QUFBO0VBQUE7QUFBQTtBQUVELGlFQUFleUIsS0FBSyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9kb21haW4vdXNlcnMvdnVleC91c2Vycy5qcz9lZmUzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlTW9kdWxlIGZyb20gXCJ+L3Z1ZXgvbW9kdWxlcy9iYXNlLW1vZHVsZVwiO1xuLy9pbXBvcnQgUm9sZXMgZnJvbSBcIi4vcm9sZXNcIjtcblxubGV0IFVzZXJzID0gey4uLkJhc2VNb2R1bGV9O1xuXG5Vc2Vycy5zdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgc3RhdGUgPSBCYXNlTW9kdWxlLnN0YXRlKCk7XG5cbiAgICBzdGF0ZS5lbmRwb2ludHNbJ2FsbCddID0gJy9hcGkvdXNlcnMnO1xuICAgIHN0YXRlLmVuZHBvaW50c1sndmFsaWRhdGUtZW1haWwnXSA9ICcvYXBpL3VzZXJzL3ZhbGlkYXRlLWVtYWlsJztcblxuXG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuVXNlcnMubXV0YXRpb25zLnJlc2V0ID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICBzdGF0ZS5hbGwgPSBbXTtcbiAgICBzdGF0ZS5pbnZhbGlkRW1haWxzID0gW107XG59O1xuXG5Vc2Vycy5tdXRhdGlvbnMuYWRkSW52YWxpZEVtYWlsID0gZnVuY3Rpb24oc3RhdGUsIGVtYWlsKSB7XG4gICAgc3RhdGUuaW52YWxpZEVtYWlscy5wdXNoKGVtYWlsKTtcbn07XG5cblVzZXJzLmdldHRlcnMuaW52YWxpZEVtYWlscyA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLmludmFsaWRFbWFpbHM7XG59O1xuXG5Vc2Vycy5hY3Rpb25zLm1hcmtDdXN0b21lckVtYWlsVmVyaWZpZWQgPSBhc3luYyBmdW5jdGlvbiAoe3N0YXRlfSxpZCkge1xuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXhpb3MucG9zdCgnL2FwaS9jdXN0b21lci92ZXJpZnktZW1haWwnLGlkKTtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDIwMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuVXNlcnMuYWN0aW9ucy5SZXNldEN1c3RvbWVyUGFzc3dvcmQgPSBhc3luYyBmdW5jdGlvbiAoe3N0YXRlfSxpZCkge1xuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXhpb3MucG9zdCgnL2FwaS9jdXN0b21lci9nZW5lcmF0ZS1wYXNzd29yZCcsaWQpO1xuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAyMDAgJiYgcmVzcG9uc2UuZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5Vc2Vycy5hY3Rpb25zLmVtYWlsSXNWYWxpZCA9IGFzeW5jIGZ1bmN0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RHZXR0ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGVtYWlsKSB7XG5cbiAgICBpZiAoZW1haWwgPT0gcm9vdEdldHRlcnNbJ2F1dGgvZ2V0VXNlckVtYWlsJ10pIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1dlaXJkJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGxldCBpbnZhbGlkRW1haWxzID0gZ2V0dGVyc1snaW52YWxpZEVtYWlscyddO1xuXG5cbiAgICBpZiAodHlwZW9mIGludmFsaWRFbWFpbHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGludmFsaWRFbWFpbHMgPSBbXTtcbiAgICAgICAgc3RhdGUuaW52YWxpZEVtYWlscyA9IFtdO1xuICAgIH1cblxuICAgIGlmIChpbnZhbGlkRW1haWxzLmluY2x1ZGVzKGVtYWlsKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5heGlvcy5wb3N0KHN0YXRlLmVuZHBvaW50c1sndmFsaWRhdGUtZW1haWwnXSwge2VtYWlsOiBlbWFpbH0pO1xuXG5cbiAgICBpZiAocmVzcG9uc2UuZGF0YSA9PSAnYXZhaWxhYmxlJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb21taXQoJ2FkZEludmFsaWRFbWFpbCcsIGVtYWlsKTtcblxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cblVzZXJzLmdldHRlcnMuYnlSb2xlID0gZnVuY3Rpb24oc3RhdGUsIGdldHRlcnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ocm9sZUlkKSB7XG4gICAgICAgIHJldHVybiBnZXR0ZXJzWydhbGxWYWx1ZXMnXS5maWx0ZXIoZWxlbSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbS5oYXNPd25Qcm9wZXJ0eSgncGl2b3QnKSAmJiBlbGVtLnBpdm90Lmhhc093blByb3BlcnR5KCdyb2xlX2lkJykgJiYgZWxlbS5waXZvdC5yb2xlX2lkID09PSByb2xlSWRcbiAgICAgICAgfSlcbiAgICB9XG59O1xuXG5Vc2Vycy5nZXR0ZXJzLmJ5VGVhbSA9IGZ1bmN0aW9uKHN0YXRlLCBnZXR0ZXJzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHRlYW1JZCkge1xuICAgICAgICByZXR1cm4gZ2V0dGVyc1snYWxsVmFsdWVzJ10uZmlsdGVyKGVsZW0gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW0uaGFzT3duUHJvcGVydHkoJ3Bpdm90JykgJiYgZWxlbS5waXZvdC5oYXNPd25Qcm9wZXJ0eSgndGVhbV9pZCcpICYmIGVsZW0ucGl2b3QudGVhbV9pZCA9PT0gdGVhbUlkXG4gICAgICAgIH0pXG4gICAgfVxufTtcblxuVXNlcnMuYWN0aW9ucy5zZWFyY2hVc2VyID0gYXN5bmMgZnVuY3Rpb24gKHsgY29tbWl0LCBkaXNwYXRjaCwgZ2V0dGVycywgc3RhdGUsIHJvb3RHZXR0ZXJzIH0sIGRhdGEgPSB7fSkge1xuICAgIGlmICghZGF0YS5zZWFyY2hJbnB1dCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHN0YXRlLmVuZHBvaW50c1snc2VhcmNoJ10gPSAnL2FwaS91c2Vycy9zZWFyY2gnO1xuXG4gICAgcmV0dXJuIGRpc3BhdGNoKCdzZWFyY2gnLCB7XG4gICAgICAgIHRlcm06IGRhdGEuc2VhcmNoSW5wdXQsXG4gICAgICAgIGluY2x1ZGVzOiBbXSxcbiAgICAgICAgcGFnZTogZGF0YS5wYWdlLFxuICAgICAgICBwZXJQYWdlOiBkYXRhLnBlcl9wYWdlLFxuICAgIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgVXNlcnM7XG4iXSwibmFtZXMiOlsiX3JlZ2VuZXJhdG9yUnVudGltZSIsImV4cG9ydHMiLCJPcCIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093biIsImhhc093blByb3BlcnR5IiwiZGVmaW5lUHJvcGVydHkiLCJvYmoiLCJrZXkiLCJkZXNjIiwidmFsdWUiLCIkU3ltYm9sIiwiU3ltYm9sIiwiaXRlcmF0b3JTeW1ib2wiLCJpdGVyYXRvciIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsImRlZmluZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImVyciIsIndyYXAiLCJpbm5lckZuIiwib3V0ZXJGbiIsInNlbGYiLCJ0cnlMb2NzTGlzdCIsInByb3RvR2VuZXJhdG9yIiwiR2VuZXJhdG9yIiwiZ2VuZXJhdG9yIiwiY3JlYXRlIiwiY29udGV4dCIsIkNvbnRleHQiLCJtYWtlSW52b2tlTWV0aG9kIiwidHJ5Q2F0Y2giLCJmbiIsImFyZyIsInR5cGUiLCJjYWxsIiwiQ29udGludWVTZW50aW5lbCIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJJdGVyYXRvclByb3RvdHlwZSIsImdldFByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJOYXRpdmVJdGVyYXRvclByb3RvdHlwZSIsInZhbHVlcyIsIkdwIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiZm9yRWFjaCIsIm1ldGhvZCIsIl9pbnZva2UiLCJBc3luY0l0ZXJhdG9yIiwiUHJvbWlzZUltcGwiLCJpbnZva2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicmVjb3JkIiwicmVzdWx0IiwiX3R5cGVvZiIsIl9fYXdhaXQiLCJ0aGVuIiwidW53cmFwcGVkIiwiZXJyb3IiLCJwcmV2aW91c1Byb21pc2UiLCJjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyIsInN0YXRlIiwiRXJyb3IiLCJkb25lUmVzdWx0IiwiZGVsZWdhdGUiLCJkZWxlZ2F0ZVJlc3VsdCIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsImRvbmUiLCJtZXRob2ROYW1lIiwidW5kZWZpbmVkIiwiVHlwZUVycm9yIiwiaW5mbyIsInJlc3VsdE5hbWUiLCJuZXh0IiwibmV4dExvYyIsInB1c2hUcnlFbnRyeSIsImxvY3MiLCJlbnRyeSIsInRyeUxvYyIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInB1c2giLCJyZXNldFRyeUVudHJ5IiwiY29tcGxldGlvbiIsInJlc2V0IiwiaXRlcmFibGUiLCJpdGVyYXRvck1ldGhvZCIsImlzTmFOIiwibGVuZ3RoIiwiaSIsImRpc3BsYXlOYW1lIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImdlbkZ1biIsImN0b3IiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJtYXJrIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJhd3JhcCIsImFzeW5jIiwiUHJvbWlzZSIsIml0ZXIiLCJrZXlzIiwidmFsIiwib2JqZWN0IiwicmV2ZXJzZSIsInBvcCIsInNraXBUZW1wUmVzZXQiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicm9vdFJlY29yZCIsInJ2YWwiLCJleGNlcHRpb24iLCJoYW5kbGUiLCJsb2MiLCJjYXVnaHQiLCJoYXNDYXRjaCIsImhhc0ZpbmFsbHkiLCJmaW5hbGx5RW50cnkiLCJjb21wbGV0ZSIsImZpbmlzaCIsIl9jYXRjaCIsInRocm93biIsImRlbGVnYXRlWWllbGQiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJnZW4iLCJfbmV4dCIsIl90aHJvdyIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJncyIsImFyZ3VtZW50cyIsImFwcGx5Iiwib3duS2V5cyIsImVudW1lcmFibGVPbmx5IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwic3ltYm9scyIsImZpbHRlciIsInN5bSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIl9vYmplY3RTcHJlYWQiLCJ0YXJnZXQiLCJzb3VyY2UiLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl90b1Byb3BlcnR5S2V5IiwiX3RvUHJpbWl0aXZlIiwiU3RyaW5nIiwiaW5wdXQiLCJoaW50IiwicHJpbSIsInRvUHJpbWl0aXZlIiwicmVzIiwiTnVtYmVyIiwiQmFzZU1vZHVsZSIsIlVzZXJzIiwiZW5kcG9pbnRzIiwibXV0YXRpb25zIiwiYWxsIiwiaW52YWxpZEVtYWlscyIsImFkZEludmFsaWRFbWFpbCIsImVtYWlsIiwiZ2V0dGVycyIsImFjdGlvbnMiLCJtYXJrQ3VzdG9tZXJFbWFpbFZlcmlmaWVkIiwiX3JlZjIiLCJfY2FsbGVlIiwiX3JlZiIsImlkIiwicmVzcG9uc2UiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwiYXhpb3MiLCJwb3N0Iiwic3RhdHVzIiwiX3giLCJfeDIiLCJSZXNldEN1c3RvbWVyUGFzc3dvcmQiLCJfcmVmNCIsIl9jYWxsZWUyIiwiX3JlZjMiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJkYXRhIiwic3VjY2VzcyIsIl94MyIsIl94NCIsImVtYWlsSXNWYWxpZCIsIl9yZWY2IiwiX2NhbGxlZTMiLCJfcmVmNSIsImNvbW1pdCIsInJvb3RHZXR0ZXJzIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiY29uc29sZSIsImxvZyIsImluY2x1ZGVzIiwiX3g1IiwiX3g2IiwiYnlSb2xlIiwicm9sZUlkIiwiZWxlbSIsInBpdm90Iiwicm9sZV9pZCIsImJ5VGVhbSIsInRlYW1JZCIsInRlYW1faWQiLCJzZWFyY2hVc2VyIiwiX3JlZjgiLCJfY2FsbGVlNCIsIl9yZWY3IiwiZGlzcGF0Y2giLCJfYXJnczQiLCJfY2FsbGVlNCQiLCJfY29udGV4dDQiLCJzZWFyY2hJbnB1dCIsInRlcm0iLCJwYWdlIiwicGVyUGFnZSIsInBlcl9wYWdlIiwiX3g3Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/domain/users/vuex/users.js\n");

/***/ }),

/***/ "./resources/js/helpers/DateHelper.js":
/*!********************************************!*\
  !*** ./resources/js/helpers/DateHelper.js ***!
  \********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ _default)\n/* harmony export */ });\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nvar _default = /*#__PURE__*/function () {\n  function _default() {\n    _classCallCheck(this, _default);\n  }\n  _createClass(_default, null, [{\n    key: \"toSqlDateTimeFormat\",\n    value: function toSqlDateTimeFormat(date) {\n      return [[date.getFullYear(), date.getMonth() + 1, date.getDate()].join('-'), [date.getHours() + 1, date.getMinutes(), date.getSeconds()].join(':')].join(' ');\n    }\n\n    /**\n     * Checks if the given value is a JavaScript date object.\n     *\n     * @param date\n     * @returns {bool}\n     */\n  }, {\n    key: \"isValidDate\",\n    value: function isValidDate(date) {\n      return Object.prototype.toString.call(date) === \"[object Date]\" && !isNaN(date);\n    }\n\n    /**\n     * Convert an ISO 8601 date string, e.g. \"2019-10-30T13:30:17Z\"\n     * to a more readable format like \"30 Oct 2019, 13:30\"\n     *\n     * @param string\n     * @param format\n     * @returns {string}\n     */\n  }, {\n    key: \"formatIsoDateString\",\n    value: function formatIsoDateString(string) {\n      var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n      var date = new Date(string);\n      var options = {};\n      if (typeof string !== 'string' || !this.isValidDate(date)) {\n        return '';\n      }\n      switch (format) {\n        // e.g. 1 Jan 2020, 00:00\n        case 1:\n          options = {\n            year: 'numeric',\n            month: 'short',\n            day: '2-digit',\n            hour: '2-digit',\n            minute: '2-digit'\n          };\n          break;\n        // e.g. 1 Jan 2020\n        case 2:\n          options = {\n            year: 'numeric',\n            month: 'short',\n            day: '2-digit'\n          };\n          break;\n        // e.g. Wed, 1 Jan 2020\n        case 3:\n          options = {\n            year: 'numeric',\n            month: 'short',\n            day: 'numeric',\n            weekday: 'short'\n          };\n          break;\n        // e.g. 01/02/2020\n        case 4:\n          options = {\n            year: 'numeric',\n            month: '2-digit',\n            day: '2-digit'\n          };\n      }\n      return date.toLocaleDateString('en-gb', options);\n    }\n\n    /**\n     * Convert an ISO 8601 date string, e.g. \"2019-10-30T13:30:17Z\"\n     * to a more readable time format like \"13:30:00\"\n     *\n     * @param string\n     * @param format\n     * @param locale\n     * @returns {string}\n     */\n  }, {\n    key: \"formatLocaleTimeString\",\n    value: function formatLocaleTimeString(string) {\n      var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n      var locale = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'en-GB';\n      var timezone = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'UTC';\n      var date = new Date(string);\n      var options = {};\n      if (typeof string !== 'string' || !this.isValidDate(date)) {\n        return '';\n      }\n      switch (format) {\n        // hh:mm:ss\n        case 1:\n          options = {\n            hour: '2-digit',\n            minute: '2-digit',\n            second: '2-digit'\n          };\n      }\n      options.timezone = timezone;\n      return new Intl.DateTimeFormat(locale, options).format(date);\n    }\n\n    /**\n     * @param date\n     * @returns {string}\n     */\n  }, {\n    key: \"toIsoDate\",\n    value: function toIsoDate(date) {\n      if (typeof date.getYear !== 'function') {\n        return date;\n      }\n      return date.toISOString().split('T')[0];\n    }\n  }, {\n    key: \"toSqlDateFormat\",\n    value: function toSqlDateFormat(date) {\n      return [date.getFullYear(), date.getMonth() + 1, date.getDate()].join('-');\n    }\n\n    /**\n     * Calculates a person's age in years.\n     *\n     * @param dateOrString\n     * @param atDate Can be used to override the today date to get an age at a specific date\n     * @returns {Number}\n     */\n  }, {\n    key: \"calculateAge\",\n    value: function calculateAge(dateOrString) {\n      var atDate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n      var date = this.isValidDate(dateOrString) ? dateOrString : new Date(dateOrString);\n      var today;\n      if (atDate) {\n        today = this.isValidDate(dateOrString) ? atDate : new Date(atDate);\n      } else {\n        today = new Date();\n      }\n      var age = today.getFullYear() - date.getFullYear();\n      var m = today.getMonth() - date.getMonth();\n      if (m < 0 || m === 0 && today.getDate() < date.getDate()) {\n        age--;\n      }\n      return age;\n    }\n\n    /**\n     * @param dateOfBirth\n     * @returns {{month: null, year: null, day: null}|{month: *, year: *, day: *}}\n     */\n  }, {\n    key: \"setDateOfBirthObject\",\n    value: function setDateOfBirthObject(dateOfBirth) {\n      if (dateOfBirth !== null && typeof dateOfBirth === 'string') {\n        var customerDob = dateOfBirth.split(' ')[0].split('-');\n        return {\n          day: customerDob[2],\n          month: customerDob[1],\n          year: customerDob[0]\n        };\n      } else if (dateOfBirth instanceof Object) {\n        if (dateOfBirth.hasOwnProperty('day') && dateOfBirth.hasOwnProperty('month') && dateOfBirth.hasOwnProperty('year')) {\n          return dateOfBirth;\n        }\n      }\n      return {\n        day: null,\n        month: null,\n        year: null\n      };\n    }\n  }, {\n    key: \"unixTimestamp\",\n    value: function unixTimestamp() {\n      return Math.round(new Date().getTime() / 1000);\n    }\n  }]);\n  return _default;\n}();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvaGVscGVycy9EYXRlSGVscGVyLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7V0FDSSxTQUFBQSxvQkFBMkJDLElBQUksRUFBRTtNQUM3QixPQUFPLENBQ0gsQ0FBQ0EsSUFBSSxDQUFDQyxXQUFXLENBQUMsQ0FBQyxFQUFFRCxJQUFJLENBQUNFLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFRixJQUFJLENBQUNHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUNuRSxDQUFDSixJQUFJLENBQUNLLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFTCxJQUFJLENBQUNNLFVBQVUsQ0FBQyxDQUFDLEVBQUVOLElBQUksQ0FBQ08sVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQ3hFLENBQUNBLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDZjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMSTtJQUFBSSxHQUFBO0lBQUFDLEtBQUEsRUFNQSxTQUFBQyxZQUFtQlYsSUFBSSxFQUFFO01BQ3JCLE9BQU9XLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDQyxRQUFRLENBQUNDLElBQUksQ0FBQ2QsSUFBSSxDQUFDLEtBQUssZUFBZSxJQUFJLENBQUNlLEtBQUssQ0FBQ2YsSUFBSSxDQUFDO0lBQ25GOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFQSTtJQUFBUSxHQUFBO0lBQUFDLEtBQUEsRUFRQSxTQUFBTyxvQkFBMkJDLE1BQU0sRUFBYztNQUFBLElBQVpDLE1BQU0sR0FBQUMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsQ0FBQztNQUN6QyxJQUFJbkIsSUFBSSxHQUFHLElBQUlzQixJQUFJLENBQUNMLE1BQU0sQ0FBQztNQUMzQixJQUFJTSxPQUFPLEdB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LmpzPzRiNzUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xuICAgIHN0YXRpYyB0b1NxbERhdGVUaW1lRm9ybWF0KGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIFtkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSArIDEsIGRhdGUuZ2V0RGF0ZSgpXS5qb2luKCctJyksXG4gICAgICAgICAgICBbZGF0ZS5nZXRIb3VycygpICsgMSwgZGF0ZS5nZXRNaW51dGVzKCksIGRhdGUuZ2V0U2Vjb25kcygpXS5qb2luKCc6JylcbiAgICAgICAgXS5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIEphdmFTY3JpcHQgZGF0ZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0ZVxuICAgICAqIEByZXR1cm5zIHtib29sfVxuICAgICAqL1xuICAgIHN0YXRpYyBpc1ZhbGlkRGF0ZShkYXRlKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZGF0ZSkgPT09IFwiW29iamVjdCBEYXRlXVwiICYmICFpc05hTihkYXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGFuIElTTyA4NjAxIGRhdGUgc3RyaW5nLCBlLmcuIFwiMjAxOS0xMC0zMFQxMzozMDoxN1pcIlxuICAgICAqIHRvIGEgbW9yZSByZWFkYWJsZSBmb3JtYXQgbGlrZSBcIjMwIE9jdCAyMDE5LCAxMzozMFwiXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RyaW5nXG4gICAgICogQHBhcmFtIGZvcm1hdFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGZvcm1hdElzb0RhdGVTdHJpbmcoc3RyaW5nLCBmb3JtYXQgPSAxKSB7XG4gICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoc3RyaW5nKTtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZihzdHJpbmcpICE9PSAnc3RyaW5nJyB8fCAhdGhpcy5pc1ZhbGlkRGF0ZShkYXRlKSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgICAgICAvLyBlLmcuIDEgSmFuIDIwMjAsIDAwOjAwXG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICBtb250aDogJ3Nob3J0JyxcbiAgICAgICAgICAgICAgICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICAgICAgICAgICAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIGUuZy4gMSBKYW4gMjAyMFxuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdzaG9ydCcsXG4gICAgICAgICAgICAgICAgICAgIGRheTogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBlLmcuIFdlZCwgMSBKYW4gMjAyMFxuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdzaG9ydCcsXG4gICAgICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5OiAnc2hvcnQnLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBlLmcuIDAxLzAyLzIwMjBcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICAgICAgICAgIGRheTogJzItZGlnaXQnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1nYicsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYW4gSVNPIDg2MDEgZGF0ZSBzdHJpbmcsIGUuZy4gXCIyMDE5LTEwLTMwVDEzOjMwOjE3WlwiXG4gICAgICogdG8gYSBtb3JlIHJlYWRhYmxlIHRpbWUgZm9ybWF0IGxpa2UgXCIxMzozMDowMFwiXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RyaW5nXG4gICAgICogQHBhcmFtIGZvcm1hdFxuICAgICAqIEBwYXJhbSBsb2NhbGVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBmb3JtYXRMb2NhbGVUaW1lU3RyaW5nKHN0cmluZywgZm9ybWF0ID0gMSwgbG9jYWxlID0gJ2VuLUdCJywgdGltZXpvbmUgPSAnVVRDJykge1xuICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHN0cmluZyk7XG4gICAgICAgIGxldCBvcHRpb25zID0ge307XG4gICAgICAgIGlmICh0eXBlb2Yoc3RyaW5nKSAhPT0gJ3N0cmluZycgfHwgIXRoaXMuaXNWYWxpZERhdGUoZGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICAgICAgLy8gaGg6bW06c3NcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICAgICAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgICAgICBzZWNvbmQ6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMudGltZXpvbmUgPSB0aW1lem9uZTtcblxuICAgICAgICByZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBvcHRpb25zKS5mb3JtYXQoZGF0ZSk7XG4gICAgfVxuXG5cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBkYXRlXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgdG9Jc29EYXRlKGRhdGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRlLmdldFllYXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xuICAgIH1cblxuICAgIHN0YXRpYyB0b1NxbERhdGVGb3JtYXQoZGF0ZSkge1xuICAgICAgICByZXR1cm4gW2RhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgZGF0ZS5nZXREYXRlKCldLmpvaW4oJy0nKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgYSBwZXJzb24ncyBhZ2UgaW4geWVhcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0ZU9yU3RyaW5nXG4gICAgICogQHBhcmFtIGF0RGF0ZSBDYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgdG9kYXkgZGF0ZSB0byBnZXQgYW4gYWdlIGF0IGEgc3BlY2lmaWMgZGF0ZVxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGNhbGN1bGF0ZUFnZShkYXRlT3JTdHJpbmcsIGF0RGF0ZSA9IG51bGwpIHtcbiAgICAgICAgbGV0IGRhdGUgPSAodGhpcy5pc1ZhbGlkRGF0ZShkYXRlT3JTdHJpbmcpKSA/IGRhdGVPclN0cmluZyA6IG5ldyBEYXRlKGRhdGVPclN0cmluZyk7XG5cbiAgICAgICAgbGV0IHRvZGF5O1xuICAgICAgICBpZiAoYXREYXRlKSB7XG4gICAgICAgICAgICB0b2RheSA9ICh0aGlzLmlzVmFsaWREYXRlKGRhdGVPclN0cmluZykpID8gYXREYXRlIDogbmV3IERhdGUoYXREYXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhZ2UgPSB0b2RheS5nZXRGdWxsWWVhcigpIC0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBsZXQgbSA9IHRvZGF5LmdldE1vbnRoKCkgLSBkYXRlLmdldE1vbnRoKCk7XG4gICAgICAgIGlmIChtIDwgMCB8fCAobSA9PT0gMCAmJiB0b2RheS5nZXREYXRlKCkgPCBkYXRlLmdldERhdGUoKSkpIHtcbiAgICAgICAgICAgIGFnZS0tO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGRhdGVPZkJpcnRoXG4gICAgICogQHJldHVybnMge3ttb250aDogbnVsbCwgeWVhcjogbnVsbCwgZGF5OiBudWxsfXx7bW9udGg6ICosIHllYXI6ICosIGRheTogKn19XG4gICAgICovXG4gICAgc3RhdGljIHNldERhdGVPZkJpcnRoT2JqZWN0KGRhdGVPZkJpcnRoKSB7XG4gICAgICAgIGlmIChkYXRlT2ZCaXJ0aCAhPT0gbnVsbCAmJiB0eXBlb2YgZGF0ZU9mQmlydGggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBsZXQgY3VzdG9tZXJEb2IgPSBkYXRlT2ZCaXJ0aC5zcGxpdCgnICcpWzBdLnNwbGl0KCctJyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRheTogY3VzdG9tZXJEb2JbMl0sXG4gICAgICAgICAgICAgICAgbW9udGg6IGN1c3RvbWVyRG9iWzFdLFxuICAgICAgICAgICAgICAgIHllYXI6IGN1c3RvbWVyRG9iWzBdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRlT2ZCaXJ0aCBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgaWYgKGRhdGVPZkJpcnRoLmhhc093blByb3BlcnR5KCdkYXknKSAmJiBkYXRlT2ZCaXJ0aC5oYXNPd25Qcm9wZXJ0eSgnbW9udGgnKSAmJiBkYXRlT2ZCaXJ0aC5oYXNPd25Qcm9wZXJ0eSgneWVhcicpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGVPZkJpcnRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRheTogbnVsbCxcbiAgICAgICAgICAgIG1vbnRoOiBudWxsLFxuICAgICAgICAgICAgeWVhcjogbnVsbCxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB1bml4VGltZXN0YW1wKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCkpLzEwMDApO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJ0b1NxbERhdGVUaW1lRm9ybWF0IiwiZGF0ZSIsImdldEZ1bGxZZWFyIiwiZ2V0TW9udGgiLCJnZXREYXRlIiwiam9pbiIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJrZXkiLCJ2YWx1ZSIsImlzVmFsaWREYXRlIiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwiaXNOYU4iLCJmb3JtYXRJc29EYXRlU3RyaW5nIiwic3RyaW5nIiwiZm9ybWF0IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiRGF0ZSIsIm9wdGlvbnMiLCJ5ZWFyIiwibW9udGgiLCJkYXkiLCJob3VyIiwibWludXRlIiwid2Vla2RheSIsInRvTG9jYWxlRGF0ZVN0cmluZyIsImZvcm1hdExvY2FsZVRpbWVTdHJpbmciLCJsb2NhbGUiLCJ0aW1lem9uZSIsInNlY29uZCIsIkludGwiLCJEYXRlVGltZUZvcm1hdCIsInRvSXNvRGF0ZSIsImdldFllYXIiLCJ0b0lTT1N0cmluZyIsInNwbGl0IiwidG9TcWxEYXRlRm9ybWF0IiwiY2FsY3VsYXRlQWdlIiwiZGF0ZU9yU3RyaW5nIiwiYXREYXRlIiwidG9kYXkiLCJhZ2UiLCJtIiwic2V0RGF0ZU9mQmlydGhPYmplY3QiLCJkYXRlT2ZCaXJ0aCIsImN1c3RvbWVyRG9iIiwiaGFzT3duUHJvcGVydHkiLCJ1bml4VGltZXN0YW1wIiwiTWF0aCIsInJvdW5kIiwiZ2V0VGltZSIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/helpers/DateHelper.js\n");

/***/ }),

/***/ "./resources/js/helpers/ObjectHelper.js":
/*!**********************************************!*\
  !*** ./resources/js/helpers/ObjectHelper.js ***!
  \**********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ _default)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nvar _default = /*#__PURE__*/function () {\n  function _default() {\n    _classCallCheck(this, _default);\n  }\n  _createClass(_default, null, [{\n    key: \"compareObjects\",\n    value: function compareObjects(obj1, obj2) {\n      return JSON.stringify(obj1) === JSON.stringify(obj2);\n    }\n  }, {\n    key: \"getByString\",\n    value: function getByString(o, s) {\n      s = s.replace(/\\[(\\w+)\\]/g, '.$1'); // convert indexes to properties\n      s = s.replace(/^\\./, ''); // strip a leading dot\n      var a = s.split('.');\n      for (var i = 0, n = a.length; i < n; ++i) {\n        var k = a[i];\n        if (k in o) {\n          o = o[k];\n        } else {\n          return;\n        }\n      }\n      return o;\n    }\n  }, {\n    key: \"cleanClone\",\n    value: function cleanClone(obj) {\n      return JSON.parse(JSON.stringify((0,vue__WEBPACK_IMPORTED_MODULE_0__.toRaw)(obj)));\n    }\n  }, {\n    key: \"isObject\",\n    value: function isObject(obj) {\n      if (obj === null) {\n        return false;\n      }\n      return typeof obj === 'function' || _typeof(obj) === 'object';\n    }\n\n    /**\n     * Return an object's property, or the fallback if it doesn't exist.\n     *\n     * @param {*} object\n     * @param {string} path\n     * @param {string} fallback\n     */\n  }, {\n    key: \"optionalProperty\",\n    value: function optionalProperty(object, path) {\n      var fallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n      var properties = path.split('.');\n      for (var a = 0; a < properties.length; a += 1) {\n        if (this.isObject(object) && object.hasOwnProperty(properties[a])) {\n          object = object[properties[a]];\n        } else {\n          return fallback;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Does the object have a property that starts with the given value?\n     *\n     * @param {*} obj\n     * @param {string} val\n     */\n  }, {\n    key: \"hasPropertyStartingWith\",\n    value: function hasPropertyStartingWith(obj, val) {\n      for (var prop in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n          if (prop.startsWith(val)) {\n            return true;\n          }\n        }\n      }\n      return false;\n    }\n  }]);\n  return _default;\n}();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvaGVscGVycy9PYmplY3RIZWxwZXIuanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBMEI7QUFBQSxJQUFBQyxRQUFBO0VBQUEsU0FBQUEsU0FBQTtJQUFBQyxlQUFBLE9BQUFELFFBQUE7RUFBQTtFQUFBRSxZQUFBLENBQUFGLFFBQUE7SUFBQUcsR0FBQTtJQUFBQyxLQUFBLEVBSXRCLFNBQUFDLGVBQXNCQyxJQUFJLEVBQUVDLElBQUksRUFBRTtNQUM5QixPQUFPQyxJQUFJLENBQUNDLFNBQVMsQ0FBQ0gsSUFBSSxDQUFDLEtBQUtFLElBQUksQ0FBQ0MsU0FBUyxDQUFDRixJQUFJLENBQUM7SUFDeEQ7RUFBQztJQUFBSixHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBTSxZQUFtQkMsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7TUFDckJBLENBQUMsR0FBR0EsQ0FBQyxDQUFDQyxPQUFPLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7TUFDcENELENBQUMsR0FBR0EsQ0FBQyxDQUFDQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQVc7TUFDcEMsSUFBSUMsQ0FBQyxHQUFHRixDQUFDLENBQUNHLEtBQUssQ0FBQyxHQUFHLENBQUM7TUFDcEIsS0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQyxDQUFDLEdBQUdILENBQUMsQ0FBQ0ksTUFBTSxFQUFFRixDQUFDLEdBQUdDLENBQUMsRUFBRSxFQUFFRCxDQUFDLEVBQUU7UUFDdEMsSUFBSUcsQ0FBQyxHQUFHTCxDQUFDLENBQUNFLENBQUMsQ0FBQztRQUNaLElBQUlHLENBQUMsSUFBSVIsQ0FBQyxFQUFFO1VBQ1JBLENBQUMsR0FBR0EsQ0FBQyxDQUFDUSxDQUFDLENBQUM7UUFDWixDQUFDLE1BQU07VUFDSDtRQUNKO01BQ0o7TUFDQSxPQUFPUixDQUFDO0lBQ1o7RUFBQztJQUFBUixHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBZ0IsV0FBa0JDLEdBQUcsRUFBRTtNQUNuQixPQUFPYixJQUFJLENBQUNjLEtBQUssQ0FBQ2QsSUFBSSxDQUFDQyxTQUFTLENBQUNWLDBDQUFLLENBQUNzQixHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pEO0VBQUM7SUFBQWxCLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUFtQixTQUFnQkYsR0FBRyxFQUFFO01BQ2pCLElBQUlBLEdBQUcsS0FBSyxJQUFJLEVBQUU7UUFBRSxPQUFPLEtBQUs7TUFBRTtNQUNsQyxPQUFTLE9BQU9BLEdBQUcsS0FBSyxVQUFVLElBQU1HLE9BQUEsQ0FBT0gsR0FBRyxNQUFLLFFBQVM7SUFDcEU7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOSTtJQUFBbEIsR0FBQTtJQUFBQyxLQUFBLEVBT0EsU0FBQXFCLGlCQUF3QkMsTUFBTSxFQUFFQyxJQUFJLEVBQW1CO01BQUEsSUFBakJDLFFBQVEsR0FBQUMsU0FBQSxDQUFBWCxNQUFBLFFBQUFXLFNBQUEsUUFBQUMsU0FBQSxHQUFBRCxTQUFBLE1BQUcsSUFBSTtNQUNqRCxJQUFJRSxVQUFVLEdBQUdKLElBQUksQ0FBQ1osS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUNoQyxLQUFLLElBQUlELENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR2lCLFVBQVUsQ0FBQ2IsTUFBTSxFQUFFSixDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzNDLElBQUksSUFBSSxDQUFDUyxRQUFRLENBQUNHLE1BQU0sQ0FBQyxJQUFJQSxNQUFNLENBQUNNLGNBQWMsQ0FBQ0QsVUFBVSxDQUFDakIsQ0FBQyxDQUFDLENBQUMsRUFBRTtVQUMvRFksTUFBTSxHQUFHQSxNQUFNLENBQUNLLFVBQVUsQ0FBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUMsTUFBTTtVQUNILE9BQU9jLFFBQVE7UUFDbkI7TUFDSjtNQUNBLE9BQU9GLE1BQU07SUFDakI7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEk7SUFBQXZCLEdBQUE7SUFBQUMsS0FBQSxFQU1BLFNBQUE2Qix3QkFBK0JaLEdBQUcsRUFBRWEsR0FBRyxFQUFFO01BQ3JDLEtBQUssSUFBSUMsSUFBSSxJQUFJZCxHQUFHLEVBQUU7UUFDbEIsSUFBSWUsTUFBTSxDQUFDQyxTQUFTLENBQUNMLGNBQWMsQ0FBQ00sSUFBSSxDQUFDakIsR0FBRyxFQUFFYyxJQUFJLENBQUMsRUFBRTtVQUNqRCxJQUFJQSxJQUFJLENBQUNJLFVBQVUsQ0FBQ0wsR0FBRyxDQUFDLEVBQUU7WUFDdEIsT0FBTyxJQUFJO1VBQ2Y7UUFDSjtNQUNKO01BQ0EsT0FBTyxLQUFLO0lBQ2hCO0VBQUM7RUFBQSxPQUFBbEMsUUFBQTtBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2hlbHBlcnMvT2JqZWN0SGVscGVyLmpzP2M2YWYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt0b1Jhd30gZnJvbSAndnVlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xuXG4gICAgc3RhdGljIGNvbXBhcmVPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iajEpID09PSBKU09OLnN0cmluZ2lmeShvYmoyKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0QnlTdHJpbmcobywgcykge1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9cXFsoXFx3KylcXF0vZywgJy4kMScpOyAvLyBjb252ZXJ0IGluZGV4ZXMgdG8gcHJvcGVydGllc1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eXFwuLywgJycpOyAgICAgICAgICAgLy8gc3RyaXAgYSBsZWFkaW5nIGRvdFxuICAgICAgICB2YXIgYSA9IHMuc3BsaXQoJy4nKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBhLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICAgICAgdmFyIGsgPSBhW2ldO1xuICAgICAgICAgICAgaWYgKGsgaW4gbykge1xuICAgICAgICAgICAgICAgIG8gPSBvW2tdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG87XG4gICAgfVxuXG4gICAgc3RhdGljIGNsZWFuQ2xvbmUob2JqKSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRvUmF3KG9iaikpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNPYmplY3Qob2JqKSB7XG4gICAgICAgIGlmIChvYmogPT09IG51bGwpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIHJldHVybiAoKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHx8ICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBvYmplY3QncyBwcm9wZXJ0eSwgb3IgdGhlIGZhbGxiYWNrIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IG9iamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZhbGxiYWNrXG4gICAgICovXG4gICAgc3RhdGljIG9wdGlvbmFsUHJvcGVydHkob2JqZWN0LCBwYXRoLCBmYWxsYmFjayA9IG51bGwpIHtcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgIGZvciAobGV0IGEgPSAwOyBhIDwgcHJvcGVydGllcy5sZW5ndGg7IGEgKz0gMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNPYmplY3Qob2JqZWN0KSAmJiBvYmplY3QuaGFzT3duUHJvcGVydHkocHJvcGVydGllc1thXSkpIHtcbiAgICAgICAgICAgICAgICBvYmplY3QgPSBvYmplY3RbcHJvcGVydGllc1thXV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERvZXMgdGhlIG9iamVjdCBoYXZlIGEgcHJvcGVydHkgdGhhdCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gdmFsdWU/XG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IG9ialxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAgICAgKi9cbiAgICBzdGF0aWMgaGFzUHJvcGVydHlTdGFydGluZ1dpdGgob2JqLCB2YWwpIHtcbiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wLnN0YXJ0c1dpdGgodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxufVxuIl0sIm5hbWVzIjpbInRvUmF3IiwiX2RlZmF1bHQiLCJfY2xhc3NDYWxsQ2hlY2siLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJ2YWx1ZSIsImNvbXBhcmVPYmplY3RzIiwib2JqMSIsIm9iajIiLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0QnlTdHJpbmciLCJvIiwicyIsInJlcGxhY2UiLCJhIiwic3BsaXQiLCJpIiwibiIsImxlbmd0aCIsImsiLCJjbGVhbkNsb25lIiwib2JqIiwicGFyc2UiLCJpc09iamVjdCIsIl90eXBlb2YiLCJvcHRpb25hbFByb3BlcnR5Iiwib2JqZWN0IiwicGF0aCIsImZhbGxiYWNrIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwicHJvcGVydGllcyIsImhhc093blByb3BlcnR5IiwiaGFzUHJvcGVydHlTdGFydGluZ1dpdGgiLCJ2YWwiLCJwcm9wIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiY2FsbCIsInN0YXJ0c1dpdGgiLCJkZWZhdWx0Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/helpers/ObjectHelper.js\n");

/***/ }),

/***/ "./resources/js/helpers/StringHelper.js":
/*!**********************************************!*\
  !*** ./resources/js/helpers/StringHelper.js ***!
  \**********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ _default)\n/* harmony export */ });\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nvar _default = /*#__PURE__*/function () {\n  function _default() {\n    _classCallCheck(this, _default);\n  }\n  _createClass(_default, null, [{\n    key: \"getRandomString\",\n    value:\n    /**\n     * Create a random string\n     *\n     * @see https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript\n     *\n     * @param nbChars\n     * @returns {string|string}\n     */\n    function getRandomString(nbChars) {\n      var result = '';\n      var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n      var charactersLength = characters.length;\n      for (var i = 0; i < nbChars; i++) {\n        result += characters.charAt(Math.floor(Math.random() * charactersLength));\n      }\n      return result;\n    }\n\n    /**\n     * Slugify text\n     *\n     * @see https://gist.github.com/mathewbyrne/1280286\n     *\n     * @param text\n     */\n  }, {\n    key: \"slugify\",\n    value: function slugify(text) {\n      return text.toString().replace(/([A-Z])/g, function (x, y) {\n        return \"_\" + y.toLowerCase();\n      }).replace(/^_/, \"\").toLowerCase().toLowerCase().replace(/\\s+/g, '-') // Replace spaces with -\n      .replace(/[^\\w\\-]+/g, '') // Remove all non-word chars\n      .replace(/\\-\\-+/g, '-') // Replace multiple - with single -\n      .replace(/^-+/, '') // Trim - from start of text\n      .replace(/-+$/, ''); // Trim - from end of text\n    }\n\n    /**\n     * Uppercase first letter of a string\n     * @param string\n     * @returns {string}\n     */\n  }, {\n    key: \"ucfirst\",\n    value: function ucfirst(string) {\n      return string.charAt(0).toUpperCase() + string.slice(1);\n    }\n  }]);\n  return _default;\n}();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvaGVscGVycy9TdHJpbmdIZWxwZXIuanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFDSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0ksU0FBQUEsZ0JBQXVCQyxPQUFPLEVBQUU7TUFDNUIsSUFBSUMsTUFBTSxHQUFHLEVBQUU7TUFDZixJQUFJQyxVQUFVLEdBQUcsZ0VBQWdFO01BQ2pGLElBQUlDLGdCQUFnQixHQUFHRCxVQUFVLENBQUNFLE1BQU07TUFDeEMsS0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdMLE9BQU8sRUFBRUssQ0FBQyxFQUFFLEVBQUU7UUFDOUJKLE1BQU0sSUFBSUMsVUFBVSxDQUFDSSxNQUFNLENBQUNDLElBQUksQ0FBQ0MsS0FBSyxDQUFDRCxJQUFJLENBQUNFLE1BQU0sQ0FBQyxDQUFDLEdBQUdOLGdCQUFnQixDQUFDLENBQUM7TUFDN0U7TUFDQSxPQUFPRixNQUFNO0lBQ2pCOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTkk7SUFBQVMsR0FBQTtJQUFBQyxLQUFBLEVBT0EsU0FBQUMsUUFBZUMsSUFBSSxFQUFFO01BQ2pCLE9BQU9BLElBQUksQ0FBQ0MsUUFBUSxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLFVBQVUsRUFBRSxVQUFVQyxDQUFDLEVBQUNDLENBQUMsRUFBQztRQUFDLE9BQU8sR0FBRyxHQUFHQSxDQUFDLENBQUNDLFdBQVcsQ0FBQyxDQUFDO01BQUEsQ0FBQyxDQUFDLENBQUNILE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUNHLFdBQVcsQ0FBQyxDQUFDLENBQUNBLFdBQVcsQ0FBQyxDQUFDLENBQ2pJSCxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFXO01BQUEsQ0FDL0JBLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQU87TUFBQSxDQUMvQkEsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBUztNQUFBLENBQy9CQSxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFhO01BQUEsQ0FDL0JBLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBWTtJQUN4Qzs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQUwsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQVEsUUFBZUMsTUFBTSxFQUFFO01BQ25CLE9BQU9BLE1BQU0sQ0FBQ2QsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDZSxXQUFXLENBQUMsQ0FBQyxHQUFHRCxNQUFNLENBQUNFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0Q7RUFBQztFQUFBLE9BQUFDLFFBQUE7QUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9oZWxwZXJzL1N0cmluZ0hlbHBlci5qcz8zMWUyIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSByYW5kb20gc3RyaW5nXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEzNDk0MDQvZ2VuZXJhdGUtcmFuZG9tLXN0cmluZy1jaGFyYWN0ZXJzLWluLWphdmFzY3JpcHRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYkNoYXJzXG4gICAgICogQHJldHVybnMge3N0cmluZ3xzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldFJhbmRvbVN0cmluZyhuYkNoYXJzKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgICAgdmFyIGNoYXJhY3RlcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknO1xuICAgICAgICB2YXIgY2hhcmFjdGVyc0xlbmd0aCA9IGNoYXJhY3RlcnMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5iQ2hhcnM7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IGNoYXJhY3RlcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJhY3RlcnNMZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNsdWdpZnkgdGV4dFxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9tYXRoZXdieXJuZS8xMjgwMjg2XG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGV4dFxuICAgICAqL1xuICAgIHN0YXRpYyBzbHVnaWZ5KHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRleHQudG9TdHJpbmcoKS5yZXBsYWNlKC8oW0EtWl0pL2csIGZ1bmN0aW9uICh4LHkpe3JldHVybiBcIl9cIiArIHkudG9Mb3dlckNhc2UoKX0pLnJlcGxhY2UoL15fLywgXCJcIikudG9Mb3dlckNhc2UoKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzKy9nLCAnLScpICAgICAgICAgICAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIC1cbiAgICAgICAgICAgIC5yZXBsYWNlKC9bXlxcd1xcLV0rL2csICcnKSAgICAgICAvLyBSZW1vdmUgYWxsIG5vbi13b3JkIGNoYXJzXG4gICAgICAgICAgICAucmVwbGFjZSgvXFwtXFwtKy9nLCAnLScpICAgICAgICAgLy8gUmVwbGFjZSBtdWx0aXBsZSAtIHdpdGggc2luZ2xlIC1cbiAgICAgICAgICAgIC5yZXBsYWNlKC9eLSsvLCAnJykgICAgICAgICAgICAgLy8gVHJpbSAtIGZyb20gc3RhcnQgb2YgdGV4dFxuICAgICAgICAgICAgLnJlcGxhY2UoLy0rJC8sICcnKTsgICAgICAgICAgICAvLyBUcmltIC0gZnJvbSBlbmQgb2YgdGV4dFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwcGVyY2FzZSBmaXJzdCBsZXR0ZXIgb2YgYSBzdHJpbmdcbiAgICAgKiBAcGFyYW0gc3RyaW5nXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgdWNmaXJzdChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKVxuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJnZXRSYW5kb21TdHJpbmciLCJuYkNoYXJzIiwicmVzdWx0IiwiY2hhcmFjdGVycyIsImNoYXJhY3RlcnNMZW5ndGgiLCJsZW5ndGgiLCJpIiwiY2hhckF0IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwia2V5IiwidmFsdWUiLCJzbHVnaWZ5IiwidGV4dCIsInRvU3RyaW5nIiwicmVwbGFjZSIsIngiLCJ5IiwidG9Mb3dlckNhc2UiLCJ1Y2ZpcnN0Iiwic3RyaW5nIiwidG9VcHBlckNhc2UiLCJzbGljZSIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/helpers/StringHelper.js\n");

/***/ }),

/***/ "./resources/js/router.js":
/*!********************************!*\
  !*** ./resources/js/router.js ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"router\": () => (/* binding */ router)\n/* harmony export */ });\n/* harmony import */ var vue_router__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-router */ \"./node_modules/vue-router/dist/vue-router.mjs\");\n/* harmony import */ var _routes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./routes */ \"./resources/js/routes.js\");\n/* harmony import */ var _vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vuex */ \"./resources/js/vuex/index.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\n\n\n\nvar vueRouter = vue_router__WEBPACK_IMPORTED_MODULE_2__.createRouter({\n  history: vue_router__WEBPACK_IMPORTED_MODULE_2__.createWebHistory(),\n  routes: _routes__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n  scrollBehavior: function scrollBehavior(to, from, savedPosition) {\n    if (to.hash) {\n      return {\n        selector: to.hash\n      };\n    }\n    return {\n      x: 0,\n      y: 0\n    };\n  }\n});\nvar IS_LEGACY = document.getElementById('legacyHeader') !== null;\nvueRouter.beforeEach( /*#__PURE__*/function () {\n  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(to, from, next) {\n    var urlRequested, response;\n    return _regeneratorRuntime().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          if (!(to.meta.constructor === Object && to.meta.hasOwnProperty('legacyPath') && to.meta.legacyPath)) {\n            _context.next = 3;\n            break;\n          }\n          window.location = to.meta.legacyPath;\n          return _context.abrupt(\"return\", false);\n        case 3:\n          if (!(IS_LEGACY && window.location.pathname !== to.path)) {\n            _context.next = 6;\n            break;\n          }\n          window.location = to.path;\n          return _context.abrupt(\"return\", false);\n        case 6:\n          if (!(to.meta.constructor === Object && to.meta.hasOwnProperty('public') && to.meta[\"public\"])) {\n            _context.next = 16;\n            break;\n          }\n          if (!(to.name == 'login' && _vuex__WEBPACK_IMPORTED_MODULE_1__.store.state.auth.loggedIn)) {\n            _context.next = 15;\n            break;\n          }\n          console.log(to);\n          if (!(to.query.requestedUrl != undefined)) {\n            _context.next = 14;\n            break;\n          }\n          urlRequested = atob(to.query.requestedUrl);\n          _context.next = 13;\n          return _vuex__WEBPACK_IMPORTED_MODULE_1__.store.dispatch('auth/setLegacySession');\n        case 13:\n          window.location = urlRequested;\n        case 14:\n          return _context.abrupt(\"return\", next({\n            name: 'dashboard'\n          }));\n        case 15:\n          return _context.abrupt(\"return\", next());\n        case 16:\n          _context.next = 18;\n          return _vuex__WEBPACK_IMPORTED_MODULE_1__.store.dispatch('auth/tokenIsExpired');\n        case 18:\n          if (!_context.sent) {\n            _context.next = 34;\n            break;\n          }\n          if (!(_vuex__WEBPACK_IMPORTED_MODULE_1__.store.state.auth.hasOwnProperty('token') && _vuex__WEBPACK_IMPORTED_MODULE_1__.store.state.auth.token && _vuex__WEBPACK_IMPORTED_MODULE_1__.store.state.auth.token.constructor === Object && _vuex__WEBPACK_IMPORTED_MODULE_1__.store.state.auth.token.hasOwnProperty('refresh_token') && _vuex__WEBPACK_IMPORTED_MODULE_1__.store.state.auth.token.refresh_token !== null)) {\n            _context.next = 28;\n            break;\n          }\n          _context.next = 22;\n          return _vuex__WEBPACK_IMPORTED_MODULE_1__.store.dispatch('auth/refresh');\n        case 22:\n          response = _context.sent;\n          if (response) {\n            _context.next = 26;\n            break;\n          }\n          localStorage.clear();\n          return _context.abrupt(\"return\", next({\n            name: 'login',\n            params: {\n              previousPath: to.fullPath\n            }\n          }));\n        case 26:\n          _context.next = 30;\n          break;\n        case 28:\n          localStorage.clear();\n          return _context.abrupt(\"return\", next({\n            name: 'login',\n            params: {\n              previousPath: to.fullPath\n            }\n          }));\n        case 30:\n          if (!_vuex__WEBPACK_IMPORTED_MODULE_1__.store.getters[\"auth/tokenIsExpired\"]) {\n            _context.next = 34;\n            break;\n          }\n          _vuex__WEBPACK_IMPORTED_MODULE_1__.store.commit('alert/setDangerAlert', 'You\\'re session has expired, please log in again');\n          _vuex__WEBPACK_IMPORTED_MODULE_1__.store.commit('auth/setIsLoggedOut');\n          return _context.abrupt(\"return\", next({\n            name: 'login',\n            params: {\n              previousPath: to.fullPath\n            }\n          }));\n        case 34:\n          return _context.abrupt(\"return\", next());\n        case 35:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee);\n  }));\n  return function (_x, _x2, _x3) {\n    return _ref.apply(this, arguments);\n  };\n}());\nvar router = vueRouter;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q3dCLElBQUksRUFBRSxPQUFPO1lBQUVtRixNQUFNLEVBQUU7Y0FBQ0MsWUFBWSxFQUFFcEMsRUFBRSxDQUFDcUM7WUFBUTtVQUFDLENBQUMsQ0FBQztRQUFBO1VBQUFyQixRQUFBLENBQUF4RixJQUFBO1VBQUE7UUFBQTtVQUdyRXlHLFlBQVksQ0FBQ0MsS0FBSyxDQUFDLENBQUM7VUFBQyxPQUFBbEIsUUFBQSxDQUFBL0YsTUFBQSxXQUNkTyxJQUFJLENBQUM7WUFBQ3dCLElBQUksRUFBRSxPQUFPO1lBQUVtRixNQUFNLEVBQUU7Y0FBQ0MsWUFBWSxFQUFFcEMsRUFBRSxDQUFDcUM7WUFBUTtVQUFDLENBQUMsQ0FBQztRQUFBO1VBQUEsS0FHakUzQyx1RUFBb0M7WUFBQXNCLFFBQUEsQ0FBQXhGLElBQUE7WUFBQTtVQUFBO1VBQ3BDa0UsK0NBQVksQ0FBQyxzQkFBc0IsRUFBRSxrREFBa0QsQ0FBQztVQUN4RkEsK0NBQVksQ0FBQyxxQkFBcUIsQ0FBQztVQUFDLE9BQUFzQixRQUFBLENBQUEvRixNQUFBLFdBQzdCTyxJQUFJLENBQUM7WUFBQ3dCLElBQUksRUFBRSxPQUFPO1lBQUVtRixNQUFNLEVBQUU7Y0FBQ0MsWUFBWSxFQUFFcEMsRUFBRSxDQUFDcUM7WUFBUTtVQUFDLENBQUMsQ0FBQztRQUFBO1VBQUEsT0FBQXJCLFFBQUEsQ0FBQS9GLE1BQUEsV0FJbEVPLElBQUksQ0FBQyxDQUFDO1FBQUE7UUFBQTtVQUFBLE9BQUF3RixRQUFBLENBQUEvQyxJQUFBO01BQUE7SUFBQSxHQUFBMkMsT0FBQTtFQUFBLENBQ2hCO0VBQUEsaUJBQUE0QixFQUFBLEVBQUFDLEdBQUEsRUFBQUMsR0FBQTtJQUFBLE9BQUEvQixJQUFBLENBQUFwQixLQUFBLE9BQUFELFNBQUE7RUFBQTtBQUFBLElBQUM7QUFHSyxJQUFNcUQsTUFBTSxHQUFHaEQsU0FBUyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9yb3V0ZXIuanM/Yzg1NCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBWdWVSb3V0ZXIgZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCByb3V0ZXMgZnJvbSAnLi9yb3V0ZXMnXG5pbXBvcnQgeyBzdG9yZSB9IGZyb20gJy4vdnVleCdcblxubGV0IHZ1ZVJvdXRlciA9IFZ1ZVJvdXRlci5jcmVhdGVSb3V0ZXIoe1xuICAgIGhpc3Rvcnk6IFZ1ZVJvdXRlci5jcmVhdGVXZWJIaXN0b3J5KCksXG4gICAgcm91dGVzLFxuICAgIHNjcm9sbEJlaGF2aW9yKHRvLCBmcm9tLCBzYXZlZFBvc2l0aW9uKSB7XG4gICAgICAgIGlmICh0by5oYXNoKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzZWxlY3RvcjogdG8uaGFzaCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgeDogMCwgeTogMCB9O1xuICAgIH1cbn0pO1xuXG5jb25zdCBJU19MRUdBQ1kgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xlZ2FjeUhlYWRlcicpICE9PSBudWxsKTtcblxudnVlUm91dGVyLmJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24odG8sIGZyb20sIG5leHQpIHtcblxuICAgIGlmICh0by5tZXRhLmNvbnN0cnVjdG9yID09PSBPYmplY3QgJiYgdG8ubWV0YS5oYXNPd25Qcm9wZXJ0eSgnbGVnYWN5UGF0aCcpICYmIHRvLm1ldGEubGVnYWN5UGF0aCkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB0by5tZXRhLmxlZ2FjeVBhdGg7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoSVNfTEVHQUNZICYmIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSAhPT0gdG8ucGF0aCkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB0by5wYXRoO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRvLm1ldGEuY29uc3RydWN0b3IgPT09IE9iamVjdCAmJiB0by5tZXRhLmhhc093blByb3BlcnR5KCdwdWJsaWMnKSAmJiB0by5tZXRhLnB1YmxpYykge1xuICAgICAgICAvLyB0aGlzIHJvdXRlIGRvZXMgbm90IHJlcXVpcmUgYXV0aCwgYnV0IGlmIHRoZSB1c2VyIGlzIGF1dGhlZCBhbmQgdGhleSBhcmVcbiAgICAgICAgLy8gcmVxdWVzdGluZyB0aGUgbG9naW4gcGFnZSB0aGVuIGNoZWNrIHRvIHNlZSBpZiBpdCB3YXMgZnJvbSB0aGUgbGVnYWN5IHN5c3RlbVxuICAgICAgICAvLyBpZiBub3QgdGhlbiBwdXNoIHRoZW0gdG8gdGhlIGRhc2hib2FyZFxuXG4gICAgICAgIGlmICh0by5uYW1lID09ICdsb2dpbicgJiYgc3RvcmUuc3RhdGUuYXV0aC5sb2dnZWRJbikge1xuICAgICAgICAgICAgY29uc29sZS5sb2codG8pO1xuICAgICAgICAgICAgaWYgKHRvLnF1ZXJ5LnJlcXVlc3RlZFVybCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgdXJsUmVxdWVzdGVkID0gYXRvYih0by5xdWVyeS5yZXF1ZXN0ZWRVcmwpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0b3JlLmRpc3BhdGNoKCdhdXRoL3NldExlZ2FjeVNlc3Npb24nKTtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB1cmxSZXF1ZXN0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV4dCh7IG5hbWU6ICdkYXNoYm9hcmQnIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfVxuXG5cbiAgICBpZiAoYXdhaXQgc3RvcmUuZGlzcGF0Y2goJ2F1dGgvdG9rZW5Jc0V4cGlyZWQnKSkge1xuICAgICAgICBpZiAoc3RvcmUuc3RhdGUuYXV0aC5oYXNPd25Qcm9wZXJ0eSgndG9rZW4nKVxuICAgICAgICAgICAgJiYgc3RvcmUuc3RhdGUuYXV0aC50b2tlblxuICAgICAgICAgICAgJiYgc3RvcmUuc3RhdGUuYXV0aC50b2tlbi5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0XG4gICAgICAgICAgICAmJiBzdG9yZS5zdGF0ZS5hdXRoLnRva2VuLmhhc093blByb3BlcnR5KCdyZWZyZXNoX3Rva2VuJylcbiAgICAgICAgICAgICYmIHN0b3JlLnN0YXRlLmF1dGgudG9rZW4ucmVmcmVzaF90b2tlbiAhPT0gbnVsbFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHN0b3JlLmRpc3BhdGNoKCdhdXRoL3JlZnJlc2gnKTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCh7bmFtZTogJ2xvZ2luJywgcGFyYW1zOiB7cHJldmlvdXNQYXRoOiB0by5mdWxsUGF0aH19KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5jbGVhcigpO1xuICAgICAgICAgICAgcmV0dXJuIG5leHQoe25hbWU6ICdsb2dpbicsIHBhcmFtczoge3ByZXZpb3VzUGF0aDogdG8uZnVsbFBhdGh9fSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RvcmUuZ2V0dGVyc1snYXV0aC90b2tlbklzRXhwaXJlZCddKSB7XG4gICAgICAgICAgICBzdG9yZS5jb21taXQoJ2FsZXJ0L3NldERhbmdlckFsZXJ0JywgJ1lvdVxcJ3JlIHNlc3Npb24gaGFzIGV4cGlyZWQsIHBsZWFzZSBsb2cgaW4gYWdhaW4nKTtcbiAgICAgICAgICAgIHN0b3JlLmNvbW1pdCgnYXV0aC9zZXRJc0xvZ2dlZE91dCcpO1xuICAgICAgICAgICAgcmV0dXJuIG5leHQoe25hbWU6ICdsb2dpbicsIHBhcmFtczoge3ByZXZpb3VzUGF0aDogdG8uZnVsbFBhdGh9fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dCgpO1xufSk7XG5cblxuZXhwb3J0IGNvbnN0IHJvdXRlciA9IHZ1ZVJvdXRlcjsiXSwibmFtZXMiOlsiX3JlZ2VuZXJhdG9yUnVudGltZSIsImV4cG9ydHMiLCJPcCIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093biIsImhhc093blByb3BlcnR5IiwiZGVmaW5lUHJvcGVydHkiLCJvYmoiLCJrZXkiLCJkZXNjIiwidmFsdWUiLCIkU3ltYm9sIiwiU3ltYm9sIiwiaXRlcmF0b3JTeW1ib2wiLCJpdGVyYXRvciIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsImRlZmluZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImVyciIsIndyYXAiLCJpbm5lckZuIiwib3V0ZXJGbiIsInNlbGYiLCJ0cnlMb2NzTGlzdCIsInByb3RvR2VuZXJhdG9yIiwiR2VuZXJhdG9yIiwiZ2VuZXJhdG9yIiwiY3JlYXRlIiwiY29udGV4dCIsIkNvbnRleHQiLCJtYWtlSW52b2tlTWV0aG9kIiwidHJ5Q2F0Y2giLCJmbiIsImFyZyIsInR5cGUiLCJjYWxsIiwiQ29udGludWVTZW50aW5lbCIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJJdGVyYXRvclByb3RvdHlwZSIsImdldFByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJOYXRpdmVJdGVyYXRvclByb3RvdHlwZSIsInZhbHVlcyIsIkdwIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiZm9yRWFjaCIsIm1ldGhvZCIsIl9pbnZva2UiLCJBc3luY0l0ZXJhdG9yIiwiUHJvbWlzZUltcGwiLCJpbnZva2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicmVjb3JkIiwicmVzdWx0IiwiX3R5cGVvZiIsIl9fYXdhaXQiLCJ0aGVuIiwidW53cmFwcGVkIiwiZXJyb3IiLCJwcmV2aW91c1Byb21pc2UiLCJjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyIsInN0YXRlIiwiRXJyb3IiLCJkb25lUmVzdWx0IiwiZGVsZWdhdGUiLCJkZWxlZ2F0ZVJlc3VsdCIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsImRvbmUiLCJtZXRob2ROYW1lIiwidW5kZWZpbmVkIiwiVHlwZUVycm9yIiwiaW5mbyIsInJlc3VsdE5hbWUiLCJuZXh0IiwibmV4dExvYyIsInB1c2hUcnlFbnRyeSIsImxvY3MiLCJlbnRyeSIsInRyeUxvYyIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInB1c2giLCJyZXNldFRyeUVudHJ5IiwiY29tcGxldGlvbiIsInJlc2V0IiwiaXRlcmFibGUiLCJpdGVyYXRvck1ldGhvZCIsImlzTmFOIiwibGVuZ3RoIiwiaSIsImRpc3BsYXlOYW1lIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImdlbkZ1biIsImN0b3IiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJtYXJrIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJhd3JhcCIsImFzeW5jIiwiUHJvbWlzZSIsIml0ZXIiLCJrZXlzIiwidmFsIiwib2JqZWN0IiwicmV2ZXJzZSIsInBvcCIsInNraXBUZW1wUmVzZXQiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicm9vdFJlY29yZCIsInJ2YWwiLCJleGNlcHRpb24iLCJoYW5kbGUiLCJsb2MiLCJjYXVnaHQiLCJoYXNDYXRjaCIsImhhc0ZpbmFsbHkiLCJmaW5hbGx5RW50cnkiLCJjb21wbGV0ZSIsImZpbmlzaCIsIl9jYXRjaCIsInRocm93biIsImRlbGVnYXRlWWllbGQiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJnZW4iLCJfbmV4dCIsIl90aHJvdyIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJncyIsImFyZ3VtZW50cyIsImFwcGx5IiwiVnVlUm91dGVyIiwicm91dGVzIiwic3RvcmUiLCJ2dWVSb3V0ZXIiLCJjcmVhdGVSb3V0ZXIiLCJoaXN0b3J5IiwiY3JlYXRlV2ViSGlzdG9yeSIsInNjcm9sbEJlaGF2aW9yIiwidG8iLCJmcm9tIiwic2F2ZWRQb3NpdGlvbiIsImhhc2giLCJzZWxlY3RvciIsIngiLCJ5IiwiSVNfTEVHQUNZIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImJlZm9yZUVhY2giLCJfcmVmIiwiX2NhbGxlZSIsInVybFJlcXVlc3RlZCIsInJlc3BvbnNlIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsIm1ldGEiLCJsZWdhY3lQYXRoIiwid2luZG93IiwibG9jYXRpb24iLCJwYXRobmFtZSIsInBhdGgiLCJhdXRoIiwibG9nZ2VkSW4iLCJjb25zb2xlIiwibG9nIiwicXVlcnkiLCJyZXF1ZXN0ZWRVcmwiLCJhdG9iIiwiZGlzcGF0Y2giLCJ0b2tlbiIsInJlZnJlc2hfdG9rZW4iLCJsb2NhbFN0b3JhZ2UiLCJjbGVhciIsInBhcmFtcyIsInByZXZpb3VzUGF0aCIsImZ1bGxQYXRoIiwiZ2V0dGVycyIsImNvbW1pdCIsIl94IiwiX3gyIiwiX3gzIiwicm91dGVyIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/router.js\n");

/***/ }),

/***/ "./resources/js/routes.js":
/*!********************************!*\
  !*** ./resources/js/routes.js ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ([{\n  path: '/login',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_pages_Login_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ./pages/Login */ \"./resources/js/pages/Login.vue\"));\n  },\n  name: 'login',\n  meta: {\n    \"public\": true,\n    hiddenFromMenu: true,\n    label: 'Login'\n  }\n}, {\n  path: '/oauth/auth',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_Page_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/Page */ \"./resources/js/core/components/Page.vue\"));\n  },\n  name: 'authorize',\n  meta: {\n    hiddenFromMenu: true,\n    label: 'authorize'\n  }\n}, {\n  path: '/manage',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_pages_Dashboard_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ./pages/Dashboard */ \"./resources/js/pages/Dashboard.vue\"));\n  },\n  name: 'dashboard',\n  meta: {\n    label: 'Dashboard',\n    icon: 'ion-pie-graph'\n  }\n}, {\n  path: '/manage/booking-management',\n  name: 'booking-management',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_ParentPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/ParentPage */ \"./resources/js/core/components/ParentPage.vue\"));\n  },\n  meta: {\n    label: 'Booking Management',\n    icon: 'fa fa-briefcase',\n    permissions: ['agents.wave.login']\n  },\n  children: [{\n    path: 'bookings',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.orders',\n    meta: {\n      legacyPath: '/admin/orders',\n      label: 'View Bookings'\n    }\n  }]\n}, {\n  path: '/manage/booking-management',\n  name: 'booking-management',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_ParentPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/ParentPage */ \"./resources/js/core/components/ParentPage.vue\"));\n  },\n  meta: {\n    label: 'Booking Management',\n    icon: 'fa fa-briefcase',\n    permissions: ['bookings.list']\n  },\n  children: [{\n    path: 'bookings',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.orders',\n    meta: {\n      legacyPath: '/admin/orders',\n      label: 'View Bookings'\n    }\n  }, {\n    path: 'berthing',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_domain_bookings_pages_Berthing_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/domain/bookings/pages/Berthing */ \"./resources/js/domain/bookings/pages/Berthing.vue\"));\n    },\n    name: 'booking-management.berthing',\n    meta: {\n      label: 'Berthing'\n    }\n  }, {\n    path: 'bookings-notifications',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.bookings-notifications',\n    meta: {\n      legacyPath: '/admin/bookings-notifications',\n      label: 'Bookings Notifications'\n    }\n  }, {\n    path: 'availability',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.availability',\n    meta: {\n      legacyPath: '/admin/availability',\n      label: 'Cabin Availability'\n    }\n  }, {\n    path: 'cabin-availability-summary-report',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.cabin-availability-summary-report',\n    meta: {\n      legacyPath: '/admin/cabin-availability-summary-report',\n      label: 'Cabin Availability Report'\n    }\n  }, {\n    path: 'cabin-hold',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.cabin-hold',\n    meta: {\n      legacyPath: '/admin/cabin-hold',\n      label: 'Hold Cabins'\n    }\n  }, {\n    path: 'passenger-services',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.passenger-services',\n    meta: {\n      legacyPath: '/admin/passenger-services',\n      label: 'Passenger Services'\n    }\n  }, {\n    path: 'passenger-details',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.passenger-details',\n    meta: {\n      legacyPath: '/admin/passenger-details',\n      label: 'Passenger Details'\n    }\n  }, {\n    path: 'send-tickets',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.send-tickets',\n    meta: {\n      legacyPath: '/admin/send-tickets',\n      label: 'Send Tickets'\n    }\n  }, {\n    path: 'availability-log',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.availability-log',\n    meta: {\n      legacyPath: '/admin/availability-log',\n      label: 'Cabin Availability Log'\n    }\n  }, {\n    path: 'coaches',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.coaches',\n    meta: {\n      legacyPath: '/admin/coaches',\n      label: 'View Coaches'\n    }\n  }, {\n    path: 'gift-packages',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.gift-packages',\n    meta: {\n      legacyPath: '/admin/gift-packages',\n      label: 'View Gift Packages',\n      permissions: ['giftpackages.view']\n    }\n  }, {\n    path: 'cancellation-reasons',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.cancellation-reasons',\n    meta: {\n      legacyPath: '/admin/cancellation-reasons',\n      label: 'View Cancellation Reasons',\n      permissions: ['cancellation-reasons.view']\n    }\n  }, {\n    path: 'parking',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_domain_ancillaries_pages_ParkingOptions_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/domain/ancillaries/pages/ParkingOptions */ \"./resources/js/domain/ancillaries/pages/ParkingOptions.vue\"));\n    },\n    name: 'booking-management.parking',\n    meta: {\n      label: 'View Parking',\n      hideChildren: true,\n      sectionLink: 'index'\n    },\n    children: [{\n      path: 'index',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_domain_ancillaries_pages_parking-options_Index_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ./domain/ancillaries/pages/parking-options/Index */ \"./resources/js/domain/ancillaries/pages/parking-options/Index.vue\"));\n      },\n      name: 'ancillaries.index'\n    }]\n  }, {\n    path: 'flights',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.flights',\n    meta: {\n      legacyPath: '/admin/flights',\n      label: 'Flights'\n    }\n  }, {\n    path: 'order-additional-services',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.order-additional-services',\n    meta: {\n      legacyPath: '/admin/order-additional-services',\n      label: 'Additional Service Prices'\n    }\n  }, {\n    path: 'orders-additional',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.orders-additional',\n    meta: {\n      legacyPath: '/admin/orders-additional',\n      label: 'Additional Services Bookings'\n    }\n  }, {\n    path: 'additions-packages',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.additions-packages',\n    meta: {\n      legacyPath: '/admin/additions-packages',\n      label: 'Ambassador Moments'\n    }\n  }, {\n    path: 'additions-packages-discount',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.additions-packages-discount',\n    meta: {\n      legacyPath: '/admin/additions-packages-discount',\n      label: 'Ambassador Moments Discount'\n    }\n  }]\n}, {\n  path: '/manage/enquiry-management',\n  name: 'Enquiries',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_ParentPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/ParentPage */ \"./resources/js/core/components/ParentPage.vue\"));\n  },\n  meta: {\n    label: 'Enquiry Management',\n    icon: 'fa fa-briefcase',\n    permissions: ['enquiries.*', 'enquiries.view', 'enquiries.create']\n  },\n  children: [{\n    path: 'enquiries',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-management.enquiries',\n    meta: {\n      legacyPath: '/admin/enquiries',\n      label: 'Enquiries',\n      permissions: ['enquiries.*', 'enquiries.view']\n    }\n  }, {\n    path: ':enq',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_domain_Enquiries_pages_enquiry_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/domain/Enquiries/pages/enquiry */ \"./resources/js/domain/Enquiries/pages/enquiry.vue\"));\n    },\n    name: 'updateEnquiry',\n    meta: {\n      label: 'Update Enquiry',\n      hiddenFromMenu: true\n    }\n  }, {\n    path: 'new',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_domain_Enquiries_pages_enquiry_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/domain/Enquiries/pages/enquiry */ \"./resources/js/domain/Enquiries/pages/enquiry.vue\"));\n    },\n    name: 'newEnquiry',\n    meta: {\n      label: 'New Enquiry',\n      permissions: ['enquiries.*', 'enquiries.create']\n    }\n  }]\n}, {\n  path: '/manage/mas',\n  name: 'mas',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_ParentPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/ParentPage */ \"./resources/js/core/components/ParentPage.vue\"));\n  },\n  meta: {\n    label: 'My Ambassador Sailing',\n    icon: 'fa fa-list-alt',\n    permissions: ['mas.dest-ex', 'mas.guest.list', 'mas.settings.view']\n  },\n  children: [{\n    path: 'settings',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_domain_mas_pages_Settings_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/domain/mas/pages/Settings */ \"./resources/js/domain/mas/pages/Settings.vue\"));\n    },\n    name: 'mas.settings',\n    meta: {\n      label: 'Settings',\n      hideChildren: true,\n      icon: 'ion-settings',\n      sectionLink: 'index',\n      permissions: ['mas.settings.view']\n    },\n    children: [{\n      path: 'index',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_domain_mas_pages_settings_Index_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ./domain/mas/pages/settings/Index */ \"./resources/js/domain/mas/pages/settings/Index.vue\"));\n      },\n      name: 'mas.settings.index'\n    }]\n  }, {\n    path: 'destination-experiences',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_domain_mas_pages_DestinationExperiences_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/domain/mas/pages/DestinationExperiences */ \"./resources/js/domain/mas/pages/DestinationExperiences.vue\"));\n    },\n    name: 'mas.destination-experiences',\n    meta: {\n      label: 'Destination Experiences',\n      permissions: ['mas.dest-ex']\n    }\n  }, {\n    path: 'guest',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_domain_mas_pages_Guests_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/domain/mas/pages/Guests */ \"./resources/js/domain/mas/pages/Guests.vue\"));\n    },\n    name: 'mas.guest',\n    meta: {\n      label: 'Guests',\n      hideChildren: true,\n      icon: 'ion-person',\n      sectionLink: 'index',\n      permissions: ['mas.guest.list']\n    },\n    children: [{\n      path: 'index',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_domain_mas_pages_guests_Index_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ./domain/mas/pages/guests/Index */ \"./resources/js/domain/mas/pages/guests/Index.vue\"));\n      },\n      name: 'mas.guest.index'\n    }]\n  }]\n}, {\n  path: '/manage/investor-reports',\n  name: 'investor-reports',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_ParentPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/ParentPage */ \"./resources/js/core/components/ParentPage.vue\"));\n  },\n  meta: {\n    label: 'Management Reports',\n    icon: 'fa fa-list-alt',\n    permissions: ['investor.reporting']\n  },\n  children: [{\n    path: 'sales-report-cruise',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'investor-reports.cumulative-sales-report-by-cruise',\n    meta: {\n      legacyPath: '/admin/sales-report-cruise',\n      label: 'Cumulative by Cruise',\n      permissions: ['investor.reporting.sales']\n    }\n  }, {\n    path: 'sales-report-channel',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'investor-reports.cumulative-sales-report-by-channel',\n    meta: {\n      legacyPath: '/admin/sales-report-channel',\n      label: 'Cumulative by Channel',\n      permissions: ['investor.reporting.sales']\n    }\n  }, {\n    path: 'sales-report',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'investor-reports.cumulative-sales-report',\n    meta: {\n      legacyPath: '/admin/sales-report',\n      label: 'Daily Cumulative Revenues',\n      permissions: ['investor.reporting.sales']\n    }\n  }]\n}, {\n  path: '/manage/booking-reports',\n  name: 'booking-reports',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_ParentPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/ParentPage */ \"./resources/js/core/components/ParentPage.vue\"));\n  },\n  meta: {\n    label: 'Booking Reports',\n    icon: 'fa fa-list-alt',\n    permissions: ['reporting.view']\n  },\n  children: [{\n    path: 'balances',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.balances',\n    meta: {\n      legacyPath: '/admin/balances',\n      label: 'Outstanding Balances'\n    }\n  }, {\n    path: 'financial-payments-report',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.financial-payments-report',\n    meta: {\n      legacyPath: '/admin/financial-payments-report',\n      label: 'Payment Dates'\n    }\n  }, {\n    path: 'report-payments',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.report-payments',\n    meta: {\n      legacyPath: '/admin/report-payments',\n      label: 'Payments Report'\n    }\n  }, {\n    path: 'payment-data',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.payment-data',\n    meta: {\n      legacyPath: '/admin/payment-data',\n      label: 'Payment Data'\n    }\n  }, {\n    path: 'report-orders',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.report-orders',\n    meta: {\n      legacyPath: '/admin/report-orders',\n      label: 'Bookings Report'\n    }\n  }, {\n    path: 'report-orders-changes',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.report-orders-changes',\n    meta: {\n      legacyPath: '/admin/report-orders-changes',\n      label: 'Bookings Changes Report'\n    }\n  }, {\n    path: 'margin-revenue-report',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.margin-revenue-report',\n    meta: {\n      legacyPath: '/admin/margin-revenue-report',\n      label: 'Margin & Revenue'\n    }\n  }, {\n    path: 'cash-summary-ship',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.cash-summary-ship',\n    meta: {\n      legacyPath: '/admin/cash-summary-ship',\n      label: 'Cash Summary by Ship'\n    }\n  }, {\n    path: 'season-by-ship',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.season-by-ship',\n    meta: {\n      legacyPath: '/admin/season-by-ship',\n      label: 'Season By Cruise'\n    }\n  }, {\n    path: 'season-by-agent',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.season-by-agent',\n    meta: {\n      legacyPath: '/admin/season-by-agent',\n      label: 'Season By Agent'\n    }\n  }, {\n    path: 'ancillary-margin-report',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.ancillary-margin-report',\n    meta: {\n      legacyPath: '/admin/ancillary-margin-report',\n      label: 'Ancillary Margin'\n    }\n  }, {\n    path: 'option-orders',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.option-orders',\n    meta: {\n      legacyPath: '/admin/option-orders',\n      label: 'Option Bookings'\n    }\n  }, {\n    path: 'part-cancellation-report',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.part-cancellation-report',\n    meta: {\n      legacyPath: '/admin/part-cancellation-report',\n      label: 'Part Cancellation'\n    }\n  }, {\n    path: 'cancellation-report',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.cancellation-report',\n    meta: {\n      legacyPath: '/admin/cancellation-report',\n      label: 'Cancellation'\n    }\n  }, {\n    path: 'combination-passengers-report',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.combination-passengers-report',\n    meta: {\n      legacyPath: '/admin/combination-passengers-report',\n      label: 'Combination Passengers'\n    }\n  }, {\n    path: 'cross-cabin-status-check',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.cross-cabin-status-check',\n    meta: {\n      legacyPath: '/admin/cross-cabin-status-check',\n      label: 'Combination Check'\n    }\n  }, {\n    path: 'club-columbus-report',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.club-columbus-report',\n    meta: {\n      legacyPath: '/admin/club-columbus-report',\n      label: 'Club Columbus Report'\n    }\n  }, {\n    path: 'medical-reports',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.medical-reports',\n    meta: {\n      legacyPath: '/admin/medical-reports',\n      label: 'Medical Reports'\n    }\n  }, {\n    path: 'missing-contact-details-report',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.missing-contact-details-report',\n    meta: {\n      legacyPath: '/admin/missing-contact-details-report',\n      label: 'Missing contact details'\n    }\n  }]\n}, {\n  path: '/manage/manifests',\n  name: 'manifests',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_ParentPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/ParentPage */ \"./resources/js/core/components/ParentPage.vue\"));\n  },\n  meta: {\n    label: 'Manifests',\n    icon: 'fa fa-list',\n    permissions: ['cruises.view']\n  },\n  children: [{\n    path: 'sailing-day-reports',\n    name: 'manifests.sailing-day-reports',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_ParentPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/ParentPage */ \"./resources/js/core/components/ParentPage.vue\"));\n    },\n    meta: {\n      label: 'Sailing Day Reports',\n      icon: 'fa fa-list-alt',\n      permissions: ['manifests.sailing-day-reports']\n    },\n    children: [{\n      path: 'obc-credit-report',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n      },\n      name: 'manifests.report-passenger-manifest.obc-credit-report',\n      meta: {\n        legacyPath: '/admin/obc-credit-report',\n        label: 'OBC Credit Report'\n      }\n    }, {\n      path: 'notes-on-bookings-report',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n      },\n      name: 'manifests.report-passenger-manifest.notes-on-bookings-report',\n      meta: {\n        legacyPath: '/admin/notes-on-bookings-report',\n        label: 'Notes On Bookings Report'\n      }\n    }, {\n      path: 'report-car-parking-manifest',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n      },\n      name: 'manifests.report-passenger-manifest.report-car-parking-manifest',\n      meta: {\n        legacyPath: '/admin/report-car-parking-manifest',\n        label: 'Car Parking Manifest Report'\n      }\n    }, {\n      path: 'report-coach-manifest',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n      },\n      name: 'manifests.report-passenger-manifest.report-coach-manifest',\n      meta: {\n        legacyPath: '/admin/report-coach-manifest',\n        label: 'Coach Manifest Report'\n      }\n    }, {\n      path: 'report-guest-manifest',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n      },\n      name: 'manifests.report-passenger-manifest.report-guest-manifest',\n      meta: {\n        legacyPath: '/admin/report-guest-manifest',\n        label: 'Guest Manifest Report'\n      }\n    }, {\n      path: 'report-back-to-back-manifest',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n      },\n      name: 'manifests.report-passenger-manifest.report-back-to-back-manifest',\n      meta: {\n        legacyPath: '/admin/report-back-to-back-manifest',\n        label: 'Back To Back Manifest Report'\n      }\n    }, {\n      path: 'report-embarkation-schedule-manifest',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n      },\n      name: 'manifests.report-passenger-manifest.report-embarkation-schedule-manifest',\n      meta: {\n        legacyPath: '/admin/report-embarkation-schedule-manifest',\n        label: 'Embarkation Schedule Manifest Report'\n      }\n    }, {\n      path: 'report-staff-and-supernumerary-manifest',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n      },\n      name: 'manifests.report-passenger-manifest.report-staff-and-supernumerary-manifest',\n      meta: {\n        legacyPath: '/admin/report-staff-and-supernumerary-manifest',\n        label: 'Staff & Supernumerary Manifest Report'\n      }\n    }]\n  }, {\n    path: 'report-passenger-manifest',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'manifests.report-passenger-manifest',\n    meta: {\n      legacyPath: '/admin/report-passenger-manifest',\n      label: 'Passenger Manifest Report'\n    }\n  }, {\n    path: 'medical-insurance-manifest',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'manifests.medical-insurance-manifest',\n    meta: {\n      legacyPath: '/admin/medical-insurance-manifest',\n      label: 'Medical & Insurance Manifest'\n    }\n  }, {\n    path: 'dietary-restaurant-seating-manifest',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'manifests.dietary-restaurant-seating-manifest',\n    meta: {\n      legacyPath: '/admin/dietary-restaurant-seating-manifest',\n      label: 'Dietary & Restaurant Seating Manifest'\n    }\n  }, {\n    path: 'special-requests-list',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'manifests.special-requests-list',\n    meta: {\n      legacyPath: '/admin/special-requests-list',\n      label: 'Special Requests'\n    }\n  }, {\n    path: 'required-documents',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'manifests.report-passenger-manifest.report-required-documents-manifest',\n    meta: {\n      legacyPath: '/admin/required-documents',\n      label: 'Required Documents Manifest'\n    }\n  }, {\n    path: 'mail-merge-export',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'manifests.mail-merge-export',\n    meta: {\n      legacyPath: '/admin/mail-merge-export',\n      label: 'Mail Merge Export',\n      permissions: ['manifests.export-mailmerge-data']\n    }\n  }]\n}, {\n  path: '/manage/old-reports',\n  name: 'old-reports',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_ParentPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/ParentPage */ \"./resources/js/core/components/ParentPage.vue\"));\n  },\n  meta: {\n    label: 'Old Reports',\n    icon: 'fa fa-table',\n    permissions: ['reporting.view']\n  },\n  children: [{\n    path: 'double-booking',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'old-reports.double-booking',\n    meta: {\n      legacyPath: '/admin/double-booking',\n      label: 'Double Bookings Report'\n    }\n  }, {\n    path: 'report-recon',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'old-reports.report-recon',\n    meta: {\n      legacyPath: '/admin/report-recon',\n      label: 'Financial Recon Report'\n    }\n  }, {\n    path: 'report-addresses',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'old-reports.report-addresses',\n    meta: {\n      legacyPath: '/admin/report-addresses',\n      label: 'Address Report'\n    }\n  }]\n}, {\n  path: '/manage/promotions-and-fares',\n  name: 'promotions-and-fares',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_ParentPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/ParentPage */ \"./resources/js/core/components/ParentPage.vue\"));\n  },\n  meta: {\n    label: 'Promotions & Fares',\n    icon: 'fa fa-dot-circle',\n    permissions: ['cabin.prices.view', 'booking.additional-service-prices.view', 'drinks-packages.view', 'drinks-packages-discount.view', 'bookings.promo-codes.view', 'coaches.view', 'parking.view']\n  },\n  children: [{\n    path: 'cabin-farebases',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'promotions-and-fares.cabin-farebases',\n    meta: {\n      legacyPath: '/admin/cabin-farebases?sort=id&direction=desc',\n      label: 'Farebases',\n      permissions: ['cabin-farebases.view']\n    }\n  }, {\n    path: 'farebases',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'promotions-and-fares.farebases',\n    meta: {\n      legacyPath: '/admin/farebases',\n      label: 'Set Cruise Farebase',\n      permissions: ['farebases.view']\n    }\n  }, {\n    path: 'order-additional-services',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'promotions-and-fares.order-additional-services',\n    meta: {\n      legacyPath: '/admin/order-additional-services',\n      label: 'Additional Service Prices',\n      permissions: ['booking.additional-service-prices.view']\n    }\n  }, {\n    path: 'additions-packages',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'promotions-and-fares.additions-packages',\n    meta: {\n      legacyPath: '/admin/additions-packages',\n      label: 'Drinks Packages',\n      permissions: ['drinks-packages.view']\n    }\n  }, {\n    path: 'additions-packages-discount',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'promotions-and-fares.additions-packages-discount',\n    meta: {\n      legacyPath: '/admin/additions-packages-discount',\n      label: 'Drinks Packages Discounts',\n      permissions: ['drinks-packages-discount.view']\n    }\n  }, {\n    path: 'promo-codes',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'promotions-and-fares.promo-codes',\n    meta: {\n      legacyPath: '/admin/promo-codes',\n      label: 'Promo Codes',\n      permissions: ['bookings.promo-codes.view']\n    }\n  }, {\n    path: 'promo-codes-category',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'promotions-and-fares.promo-codes-categories',\n    meta: {\n      legacyPath: '/admin/promo-codes-categories',\n      label: 'Promo Code Categories',\n      permissions: ['bookings.promo-codes-category.view']\n    }\n  }, {\n    path: 'coaches',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'promotions-and-fares.coaches',\n    meta: {\n      legacyPath: '/admin/coaches',\n      label: 'View Coaches',\n      permissions: ['coaches.view']\n    }\n  }]\n}, {\n  path: '/manage/accounting',\n  name: 'accounting',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_ParentPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/ParentPage */ \"./resources/js/core/components/ParentPage.vue\"));\n  },\n  meta: {\n    label: 'Accounting Utilities',\n    icon: 'fa fa-pound-sign',\n    permissions: ['accounting.view']\n  },\n  children: [{\n    path: 'payments',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'accounting.payments',\n    meta: {\n      legacyPath: '/admin/payments',\n      label: 'View Payments'\n    }\n  }, {\n    path: 'cleared-payments',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'accounting.cleared-payments',\n    meta: {\n      legacyPath: '/admin/cleared-payments',\n      label: 'Cleared Payments'\n    }\n  }, {\n    path: 'payment-accounts',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'accounting.payment-accounts',\n    meta: {\n      legacyPath: '/admin/payment-accounts',\n      label: 'Bank Accounts'\n    }\n  }, {\n    path: 'payment-codes',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'accounting.payment-codes',\n    meta: {\n      legacyPath: '/admin/payment-codes',\n      label: 'Nominal Codes'\n    }\n  }, {\n    path: 'promo-codes',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'accounting.promo-codes',\n    meta: {\n      legacyPath: '/admin/promo-codes',\n      label: 'Promo Codes',\n      permissions: ['bookings.promo-codes.view']\n    }\n  }, {\n    path: 'agent-statements',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'accounting.agent-statements',\n    meta: {\n      legacyPath: '/admin/agent-statements',\n      label: 'Agent Statements'\n    }\n  }, {\n    path: 'deposit-due-report',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'deposit.due-report',\n    meta: {\n      legacyPath: '/admin/deposit-due-report',\n      label: 'Deposit Due Report',\n      permissions: ['accounts.deposit-due-report.view', 'accounts.deposit-due-report.export']\n    }\n  }, {\n    path: 'direct-debit-scheme-report',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'accounting.direct-debit-scheme-report',\n    meta: {\n      legacyPath: '/admin/direct-debit-scheme-report',\n      label: 'Direct Debit Scheme Report'\n    }\n  }]\n}, {\n  path: '/manage/cruise-management',\n  name: 'cruise-management',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_ParentPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/ParentPage */ \"./resources/js/core/components/ParentPage.vue\"));\n  },\n  meta: {\n    label: 'Cruise Management',\n    icon: 'fa fa-ship',\n    permissions: ['cruises.view']\n  },\n  children: [{\n    path: 'cruises',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'cruise-management.cruises',\n    meta: {\n      legacyPath: '/admin/cruises',\n      label: 'View Cruises'\n    }\n  }, {\n    path: 'cruises-log',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'cruise-management.cruises-log',\n    meta: {\n      legacyPath: '/admin/cruises-log',\n      label: 'View Cruises Log'\n    }\n  }, {\n    path: 'ship-itinerary',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_domain_itinerary_pages_Itineraries_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/domain/itinerary/pages/Itineraries */ \"./resources/js/domain/itinerary/pages/Itineraries.vue\"));\n    },\n    name: 'cruise-management.ship-itinerary',\n    meta: {\n      label: 'View Ships Itinerary',\n      permissions: ['itinerary.view']\n    }\n  }, {\n    path: 'new-ship-itinerary/:id',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_domain_itinerary_pages_CreateOrEditItinerary_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/domain/itinerary/pages/CreateOrEditItinerary */ \"./resources/js/domain/itinerary/pages/CreateOrEditItinerary.vue\"));\n    },\n    name: 'cruise-management.new-ship-itinerary',\n    meta: {\n      label: 'New Ship Itinerary',\n      hiddenFromMenu: true,\n      permissions: ['itinerary.edit']\n    }\n  }, {\n    path: 'budgets',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'cruise-management.budgets',\n    meta: {\n      legacyPath: '/admin/budgets',\n      label: 'Cruise Budgets',\n      permissions: ['cost-centres.view']\n    }\n  }, {\n    path: 'ships',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'cruise-management.ships',\n    meta: {\n      legacyPath: '/admin/ships',\n      label: 'View Ships'\n    }\n  }, {\n    path: 'currencies',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'cruise-management.currencies',\n    meta: {\n      legacyPath: '/admin/currencies',\n      label: 'View Currencies'\n    }\n  }, {\n    path: 'countries',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'cruise-management.countries',\n    meta: {\n      legacyPath: '/admin/countries',\n      label: 'Countries'\n    }\n  }, {\n    path: 'ports',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'cruise-management.ports',\n    meta: {\n      legacyPath: '/admin/ports',\n      label: 'Ports'\n    }\n  }, {\n    path: 'destinations',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'cruise-management.destinations',\n    meta: {\n      legacyPath: '/admin/destinations',\n      label: 'Destinations'\n    }\n  }, {\n    path: 'cabins',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'cruise-management.cabins',\n    meta: {\n      legacyPath: '/admin/cabins',\n      label: 'Full Cabin Inventory'\n    }\n  }]\n}, {\n  path: '/manage/agent-management',\n  name: 'agent-management',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_ParentPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/ParentPage */ \"./resources/js/core/components/ParentPage.vue\"));\n  },\n  meta: {\n    label: 'Travel Partner Management',\n    icon: 'fas fa-store-alt',\n    permissions: ['travel-partners.list']\n  },\n  children: [{\n    path: 'sales-report',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'investor-sales-report',\n    meta: {\n      legacyPath: '/admin/sales-report',\n      label: 'Cumulative Sales Report',\n      permissions: ['travel-partners.list']\n    }\n  }, {\n    path: 'travel-partners',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'travel-partner-management.agents',\n    meta: {\n      legacyPath: '/admin/agents',\n      label: 'View Agents'\n    }\n  }, {\n    path: 'commission-season',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'travel-partner-management.commission-season',\n    meta: {\n      legacyPath: '/admin/commission-season',\n      label: 'Commission Seasons'\n    }\n  }, {\n    path: 'agents-allocations',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'travel-partner-management.agents-allocations',\n    meta: {\n      legacyPath: '/admin/agents-allocations',\n      label: 'Agent\\'s Allocations'\n    }\n  }, {\n    path: 'group-contracts',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'travel-partner-management.group-contracts',\n    meta: {\n      legacyPath: '/admin/group-contracts',\n      label: 'Group Contracts'\n    }\n  }, {\n    path: 'group-data-reporting',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'booking-reports.group-data-reporting',\n    meta: {\n      legacyPath: '/admin/group-data-reporting',\n      label: 'Group Data Reporting'\n    }\n  }]\n}, {\n  path: '/manage/user-management',\n  name: 'user-management',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_ParentPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/ParentPage */ \"./resources/js/core/components/ParentPage.vue\"));\n  },\n  meta: {\n    label: 'User Management',\n    icon: 'ion-person',\n    permissions: ['auth.view', 'users.view', 'teams.view', 'roles.view', 'permission-keys.view']\n  },\n  children: [{\n    path: 'users',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_domain_users_pages_Users_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/domain/users/pages/Users */ \"./resources/js/domain/users/pages/Users.vue\"));\n    },\n    name: 'users',\n    meta: {\n      label: 'Users',\n      hideChildren: true,\n      icon: 'ion-person',\n      sectionLink: 'index',\n      permissions: ['auth.view']\n    },\n    children: [{\n      path: 'index',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_domain_users_pages_users_Index_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ./domain/users/pages/users/Index */ \"./resources/js/domain/users/pages/users/Index.vue\"));\n      },\n      name: 'users.index'\n    }, {\n      path: 'create',\n      name: 'users.create',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_domain_users_pages_users_Create_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ./domain/users/pages/users/Create */ \"./resources/js/domain/users/pages/users/Create.vue\"));\n      }\n    }, {\n      path: 'edit/:id',\n      name: 'users.edit',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_domain_users_pages_users_Edit_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ./domain/users/pages/users/Edit */ \"./resources/js/domain/users/pages/users/Edit.vue\"));\n      }\n    }]\n  }, {\n    path: 'permissions',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_domain_permissions_pages_Permissions_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/domain/permissions/pages/Permissions */ \"./resources/js/domain/permissions/pages/Permissions.vue\"));\n    },\n    name: 'permissions',\n    meta: {\n      label: 'Permissions',\n      hideChildren: true,\n      icon: 'ion-locked',\n      sectionLink: 'index'\n    },\n    children: [{\n      path: 'index',\n      name: 'permissions.index',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_domain_permissions_pages_permissions_Index_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ./domain/permissions/pages/permissions/Index */ \"./resources/js/domain/permissions/pages/permissions/Index.vue\"));\n      }\n    }, {\n      path: 'create',\n      name: 'permissions.create',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_core_components_Page_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/Page */ \"./resources/js/core/components/Page.vue\"));\n      }\n    }, {\n      path: 'edit/:id',\n      name: 'permissions.edit',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_domain_permissions_pages_permissions_Edit_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ./domain/permissions/pages/permissions/Edit */ \"./resources/js/domain/permissions/pages/permissions/Edit.vue\"));\n      }\n    }]\n  }, {\n    path: 'permission-keys',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_Page_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/Page */ \"./resources/js/core/components/Page.vue\"));\n    },\n    name: 'permissionKeys',\n    meta: {\n      label: 'Permission Keys',\n      hideChildren: true,\n      icon: 'ion-locked',\n      sectionLink: 'index',\n      permissions: ['permission-keys.view']\n    },\n    children: [{\n      path: 'index',\n      name: 'permissionKeys.index',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_core_components_Page_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/Page */ \"./resources/js/core/components/Page.vue\"));\n      }\n    }]\n  }]\n}, {\n  path: '/manage/system-configuration',\n  name: 'system-configuration',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_Page_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/Page */ \"./resources/js/core/components/Page.vue\"));\n  },\n  meta: {\n    label: 'System Configuration',\n    icon: 'ion-settings',\n    permissions: ['config.view']\n  },\n  children: [{\n    path: 'settings',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'system-configuration.settings',\n    meta: {\n      legacyPath: '/admin/settings',\n      label: 'Settings'\n    }\n  }, {\n    path: 'systemlog',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'system-configuration.systemlog',\n    meta: {\n      legacyPath: '/admin/systemlog',\n      label: 'System Log'\n    }\n  }, {\n    path: 'uploads',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'system-configuration.uploads',\n    meta: {\n      legacyPath: '/admin/uploads',\n      label: 'Uploads CSV'\n    }\n  }, {\n    path: 'api-logs',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'system-configuration.api-logs',\n    meta: {\n      legacyPath: '/admin/api-logs',\n      label: 'API Logs'\n    }\n  }]\n}, {\n  path: '/manage/development',\n  name: 'development',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_Page_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/Page */ \"./resources/js/core/components/Page.vue\"));\n  },\n  meta: {\n    label: 'Development',\n    icon: 'fa fa-code',\n    permissions: ['developer']\n  },\n  children: [{\n    path: '/api-client',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_Page_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/Page */ \"./resources/js/core/components/Page.vue\"));\n    },\n    name: 'api-client',\n    meta: {\n      label: 'Api Client',\n      hideChildren: true,\n      icon: 'fa fa-grav',\n      sectionLink: 'index',\n      permissions: ['something.no.one.has']\n    },\n    children: [{\n      path: 'index',\n      name: 'api-client.index',\n      component: function component() {\n        return __webpack_require__.e(/*! import() */ \"resources_js_core_components_Page_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/Page */ \"./resources/js/core/components/Page.vue\"));\n      }\n    }]\n  }, {\n    path: 'designs',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_Page_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/Page */ \"./resources/js/core/components/Page.vue\"));\n    },\n    name: 'designs',\n    meta: {\n      label: 'Component Designs',\n      icon: 'ion-paintbrush',\n      hideChildren: true\n    }\n  }]\n}, {\n  path: '/manage/marketing',\n  name: 'marketing',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ \"resources_js_core_components_ParentPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/ParentPage */ \"./resources/js/core/components/ParentPage.vue\"));\n  },\n  meta: {\n    label: 'Marketing',\n    icon: 'fa fa-list-alt',\n    permissions: ['marketing.marketing-advert-spend.view']\n  },\n  children: [{\n    path: 'marketing-advert-information',\n    component: function component() {\n      return __webpack_require__.e(/*! import() */ \"resources_js_core_components_LegacyPage_vue\").then(__webpack_require__.bind(__webpack_require__, /*! ~/core/components/LegacyPage */ \"./resources/js/core/components/LegacyPage.vue\"));\n    },\n    name: 'marketing.marketing-advert-information',\n    meta: {\n      legacyPath: '/admin/marketing-advert-information',\n      label: 'Marketing Advert Information',\n      permissions: ['marketing.marketing-advert-spend.view']\n    }\n  }]\n}]);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QkQsU0FBUyxFQUFFLFNBQUFBLFVBQUE7UUFBQSxPQUFNLDJNQUFnQztNQUFBO0lBQ3JELENBQUM7RUFFVCxDQUFDLEVBQ0Q7SUFDSUQsSUFBSSxFQUFFLFNBQVM7SUFDZkMsU0FBUyxFQUFFLFNBQUFBLFVBQUE7TUFBQSxPQUFNLDJNQUFnQztJQUFBO0lBQ2pEQyxJQUFJLEVBQUUsU0FBUztJQUNmQyxJQUFJLEVBQUU7TUFDRkUsS0FBSyxFQUFFLG1CQUFtQjtNQUMxQkMsSUFBSSxFQUFFLGdCQUFnQjtNQUN0QkksWUFBWSxFQUFFO0lBQ2xCO0VBQ0osQ0FBQztBQUVULENBQUMsRUFDRDtFQUNJVixJQUFJLEVBQUUsbUJBQW1CO0VBQ3pCRSxJQUFJLEVBQUUsV0FBVztFQUNqQkQsU0FBUyxFQUFFLFNBQUFBLFVBQUE7SUFBQSxPQUFNLDZOQUFzQztFQUFBO0VBQ3ZERSxJQUFJLEVBQUU7SUFDRkUsS0FBSyxFQUFFLFdBQVc7SUFDbEJDLElBQUksRUFBRSxnQkFBZ0I7SUFDdEJDLFdBQVcsRUFBRSxDQUNULHVDQUF1QztFQUUvQyxDQUFDO0VBQ0RDLFFBQVEsRUFBRSxDQUNOO0lBQ0lSLElBQUksRUFBRSw4QkFBOEI7SUFDcENDLFNBQVMsRUFBRSxTQUFBQSxVQUFBO01BQUEsT0FBTSw2TkFBc0M7SUFBQTtJQUN2REMsSUFBSSxFQUFFLHdDQUF3QztJQUM5Q0MsSUFBSSxFQUFFO01BQ0ZNLFVBQVUsRUFBRSxxQ0FBcUM7TUFDakRKLEtBQUssRUFBRSw4QkFBOEI7TUFDckNFLFdBQVcsRUFBRSxDQUNULHVDQUF1QztJQUUvQztFQUNKLENBQUM7QUFFVCxDQUFDLENBQ0oiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvcm91dGVzLmpzP2IwYjMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgW1xuICAgIHtcbiAgICAgICAgcGF0aDogJy9sb2dpbicsXG4gICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCcuL3BhZ2VzL0xvZ2luJyksXG4gICAgICAgIG5hbWU6ICdsb2dpbicsXG4gICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgIHB1YmxpYzogdHJ1ZSxcbiAgICAgICAgICAgIGhpZGRlbkZyb21NZW51OiB0cnVlLFxuICAgICAgICAgICAgbGFiZWw6ICdMb2dpbidcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiAnL29hdXRoL2F1dGgnLFxuICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvUGFnZScpLFxuICAgICAgICBuYW1lOiAnYXV0aG9yaXplJyxcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgaGlkZGVuRnJvbU1lbnU6IHRydWUsXG4gICAgICAgICAgICBsYWJlbDogJ2F1dGhvcml6ZSdcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiAnL21hbmFnZScsXG4gICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCcuL3BhZ2VzL0Rhc2hib2FyZCcpLFxuICAgICAgICBuYW1lOiAnZGFzaGJvYXJkJyxcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgbGFiZWw6ICdEYXNoYm9hcmQnLFxuICAgICAgICAgICAgaWNvbjogJ2lvbi1waWUtZ3JhcGgnXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJy9tYW5hZ2UvYm9va2luZy1tYW5hZ2VtZW50JyxcbiAgICAgICAgbmFtZTogJ2Jvb2tpbmctbWFuYWdlbWVudCcsXG4gICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9QYXJlbnRQYWdlJyksXG4gICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnQm9va2luZyBNYW5hZ2VtZW50JyxcbiAgICAgICAgICAgIGljb246ICdmYSBmYS1icmllZmNhc2UnLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgICAgICAnYWdlbnRzLndhdmUubG9naW4nLFxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdib29raW5ncycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYm9va2luZy1tYW5hZ2VtZW50Lm9yZGVycycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL29yZGVycycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnVmlldyBCb29raW5ncycsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiAnL21hbmFnZS9ib29raW5nLW1hbmFnZW1lbnQnLFxuICAgICAgICBuYW1lOiAnYm9va2luZy1tYW5hZ2VtZW50JyxcbiAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL1BhcmVudFBhZ2UnKSxcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgbGFiZWw6ICdCb29raW5nIE1hbmFnZW1lbnQnLFxuICAgICAgICAgICAgaWNvbjogJ2ZhIGZhLWJyaWVmY2FzZScsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgICdib29raW5ncy5saXN0JyxcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnYm9va2luZ3MnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2Jvb2tpbmctbWFuYWdlbWVudC5vcmRlcnMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9vcmRlcnMnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1ZpZXcgQm9va2luZ3MnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2JlcnRoaW5nJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9kb21haW4vYm9va2luZ3MvcGFnZXMvQmVydGhpbmcnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYm9va2luZy1tYW5hZ2VtZW50LmJlcnRoaW5nJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQmVydGhpbmcnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2Jvb2tpbmdzLW5vdGlmaWNhdGlvbnMnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2Jvb2tpbmctbWFuYWdlbWVudC5ib29raW5ncy1ub3RpZmljYXRpb25zJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vYm9va2luZ3Mtbm90aWZpY2F0aW9ucycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQm9va2luZ3MgTm90aWZpY2F0aW9ucycsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnYXZhaWxhYmlsaXR5JyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdib29raW5nLW1hbmFnZW1lbnQuYXZhaWxhYmlsaXR5JyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vYXZhaWxhYmlsaXR5JyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdDYWJpbiBBdmFpbGFiaWxpdHknLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2NhYmluLWF2YWlsYWJpbGl0eS1zdW1tYXJ5LXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYm9va2luZy1yZXBvcnRzLmNhYmluLWF2YWlsYWJpbGl0eS1zdW1tYXJ5LXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL2NhYmluLWF2YWlsYWJpbGl0eS1zdW1tYXJ5LXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQ2FiaW4gQXZhaWxhYmlsaXR5IFJlcG9ydCcsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnY2FiaW4taG9sZCcsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYm9va2luZy1tYW5hZ2VtZW50LmNhYmluLWhvbGQnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9jYWJpbi1ob2xkJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdIb2xkIENhYmlucycsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAncGFzc2VuZ2VyLXNlcnZpY2VzJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdib29raW5nLW1hbmFnZW1lbnQucGFzc2VuZ2VyLXNlcnZpY2VzJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vcGFzc2VuZ2VyLXNlcnZpY2VzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdQYXNzZW5nZXIgU2VydmljZXMnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ3Bhc3Nlbmdlci1kZXRhaWxzJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdib29raW5nLW1hbmFnZW1lbnQucGFzc2VuZ2VyLWRldGFpbHMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9wYXNzZW5nZXItZGV0YWlscycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUGFzc2VuZ2VyIERldGFpbHMnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ3NlbmQtdGlja2V0cycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYm9va2luZy1tYW5hZ2VtZW50LnNlbmQtdGlja2V0cycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL3NlbmQtdGlja2V0cycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnU2VuZCBUaWNrZXRzJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdhdmFpbGFiaWxpdHktbG9nJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdib29raW5nLW1hbmFnZW1lbnQuYXZhaWxhYmlsaXR5LWxvZycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL2F2YWlsYWJpbGl0eS1sb2cnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0NhYmluIEF2YWlsYWJpbGl0eSBMb2cnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2NvYWNoZXMnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2Jvb2tpbmctbWFuYWdlbWVudC5jb2FjaGVzJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vY29hY2hlcycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnVmlldyBDb2FjaGVzJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdnaWZ0LXBhY2thZ2VzJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdib29raW5nLW1hbmFnZW1lbnQuZ2lmdC1wYWNrYWdlcycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL2dpZnQtcGFja2FnZXMnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1ZpZXcgR2lmdCBQYWNrYWdlcycsXG4gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAnZ2lmdHBhY2thZ2VzLnZpZXcnXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdjYW5jZWxsYXRpb24tcmVhc29ucycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYm9va2luZy1tYW5hZ2VtZW50LmNhbmNlbGxhdGlvbi1yZWFzb25zJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vY2FuY2VsbGF0aW9uLXJlYXNvbnMnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1ZpZXcgQ2FuY2VsbGF0aW9uIFJlYXNvbnMnLFxuICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2NhbmNlbGxhdGlvbi1yZWFzb25zLnZpZXcnXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdwYXJraW5nJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9kb21haW4vYW5jaWxsYXJpZXMvcGFnZXMvUGFya2luZ09wdGlvbnMnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYm9va2luZy1tYW5hZ2VtZW50LnBhcmtpbmcnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdWaWV3IFBhcmtpbmcnLFxuICAgICAgICAgICAgICAgICAgICBoaWRlQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb25MaW5rOiAnaW5kZXgnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ2luZGV4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCcuL2RvbWFpbi9hbmNpbGxhcmllcy9wYWdlcy9wYXJraW5nLW9wdGlvbnMvSW5kZXgnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhbmNpbGxhcmllcy5pbmRleCdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdmbGlnaHRzJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdib29raW5nLW1hbmFnZW1lbnQuZmxpZ2h0cycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL2ZsaWdodHMnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0ZsaWdodHMnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ29yZGVyLWFkZGl0aW9uYWwtc2VydmljZXMnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2Jvb2tpbmctbWFuYWdlbWVudC5vcmRlci1hZGRpdGlvbmFsLXNlcnZpY2VzJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vb3JkZXItYWRkaXRpb25hbC1zZXJ2aWNlcycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQWRkaXRpb25hbCBTZXJ2aWNlIFByaWNlcycsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnb3JkZXJzLWFkZGl0aW9uYWwnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2Jvb2tpbmctbWFuYWdlbWVudC5vcmRlcnMtYWRkaXRpb25hbCcsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL29yZGVycy1hZGRpdGlvbmFsJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdBZGRpdGlvbmFsIFNlcnZpY2VzIEJvb2tpbmdzJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdhZGRpdGlvbnMtcGFja2FnZXMnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2Jvb2tpbmctbWFuYWdlbWVudC5hZGRpdGlvbnMtcGFja2FnZXMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9hZGRpdGlvbnMtcGFja2FnZXMnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0FtYmFzc2Fkb3IgTW9tZW50cycsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnYWRkaXRpb25zLXBhY2thZ2VzLWRpc2NvdW50JyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdib29raW5nLW1hbmFnZW1lbnQuYWRkaXRpb25zLXBhY2thZ2VzLWRpc2NvdW50JyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vYWRkaXRpb25zLXBhY2thZ2VzLWRpc2NvdW50JyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdBbWJhc3NhZG9yIE1vbWVudHMgRGlzY291bnQnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBwYXRoOiAnL21hbmFnZS9lbnF1aXJ5LW1hbmFnZW1lbnQnLFxuICAgICAgICBuYW1lOiAnRW5xdWlyaWVzJyxcbiAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL1BhcmVudFBhZ2UnKSxcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgbGFiZWw6ICdFbnF1aXJ5IE1hbmFnZW1lbnQnLFxuICAgICAgICAgICAgaWNvbjogJ2ZhIGZhLWJyaWVmY2FzZScsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgICdlbnF1aXJpZXMuKicsXG4gICAgICAgICAgICAgICAgJ2VucXVpcmllcy52aWV3JyxcbiAgICAgICAgICAgICAgICAnZW5xdWlyaWVzLmNyZWF0ZSdcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnZW5xdWlyaWVzJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdib29raW5nLW1hbmFnZW1lbnQuZW5xdWlyaWVzJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vZW5xdWlyaWVzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdFbnF1aXJpZXMnLFxuICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2VucXVpcmllcy4qJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdlbnF1aXJpZXMudmlldycsXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnOmVucScsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vZG9tYWluL0VucXVpcmllcy9wYWdlcy9lbnF1aXJ5JyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ3VwZGF0ZUVucXVpcnknLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdVcGRhdGUgRW5xdWlyeScsXG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbkZyb21NZW51OiB0cnVlLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ25ldycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vZG9tYWluL0VucXVpcmllcy9wYWdlcy9lbnF1aXJ5JyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ25ld0VucXVpcnknLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdOZXcgRW5xdWlyeScsXG4gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAnZW5xdWlyaWVzLionLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2VucXVpcmllcy5jcmVhdGUnLFxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICB9LFxuXG5cbiAgICB7XG4gICAgICAgIHBhdGg6ICcvbWFuYWdlL21hcycsXG4gICAgICAgIG5hbWU6ICdtYXMnLFxuICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvUGFyZW50UGFnZScpLFxuICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICBsYWJlbDogJ015IEFtYmFzc2Fkb3IgU2FpbGluZycsXG4gICAgICAgICAgICBpY29uOiAnZmEgZmEtbGlzdC1hbHQnLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgICAgICAnbWFzLmRlc3QtZXgnLFxuICAgICAgICAgICAgICAgICdtYXMuZ3Vlc3QubGlzdCcsXG4gICAgICAgICAgICAgICAgJ21hcy5zZXR0aW5ncy52aWV3JyxcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnc2V0dGluZ3MnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2RvbWFpbi9tYXMvcGFnZXMvU2V0dGluZ3MnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnbWFzLnNldHRpbmdzJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnU2V0dGluZ3MnLFxuICAgICAgICAgICAgICAgICAgICBoaWRlQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGljb246ICdpb24tc2V0dGluZ3MnLFxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uTGluazogJ2luZGV4JyxcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdtYXMuc2V0dGluZ3MudmlldycsXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdpbmRleCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9kb21haW4vbWFzL3BhZ2VzL3NldHRpbmdzL0luZGV4JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbWFzLnNldHRpbmdzLmluZGV4J1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0se1xuICAgICAgICAgICAgICAgIHBhdGg6ICdkZXN0aW5hdGlvbi1leHBlcmllbmNlcycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vZG9tYWluL21hcy9wYWdlcy9EZXN0aW5hdGlvbkV4cGVyaWVuY2VzJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ21hcy5kZXN0aW5hdGlvbi1leHBlcmllbmNlcycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0Rlc3RpbmF0aW9uIEV4cGVyaWVuY2VzJyxcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdtYXMuZGVzdC1leCcsXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnZ3Vlc3QnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2RvbWFpbi9tYXMvcGFnZXMvR3Vlc3RzJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ21hcy5ndWVzdCcsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0d1ZXN0cycsXG4gICAgICAgICAgICAgICAgICAgIGhpZGVDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2lvbi1wZXJzb24nLFxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uTGluazogJ2luZGV4JyxcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdtYXMuZ3Vlc3QubGlzdCcsXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdpbmRleCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9kb21haW4vbWFzL3BhZ2VzL2d1ZXN0cy9JbmRleCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ21hcy5ndWVzdC5pbmRleCdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdGg6ICcvbWFuYWdlL2ludmVzdG9yLXJlcG9ydHMnLFxuICAgICAgICBuYW1lOiAnaW52ZXN0b3ItcmVwb3J0cycsXG4gICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9QYXJlbnRQYWdlJyksXG4gICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnTWFuYWdlbWVudCBSZXBvcnRzJyxcbiAgICAgICAgICAgIGljb246ICdmYSBmYS1saXN0LWFsdCcsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgICdpbnZlc3Rvci5yZXBvcnRpbmcnXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ3NhbGVzLXJlcG9ydC1jcnVpc2UnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2ludmVzdG9yLXJlcG9ydHMuY3VtdWxhdGl2ZS1zYWxlcy1yZXBvcnQtYnktY3J1aXNlJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vc2FsZXMtcmVwb3J0LWNydWlzZScsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQ3VtdWxhdGl2ZSBieSBDcnVpc2UnLFxuICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2ludmVzdG9yLnJlcG9ydGluZy5zYWxlcycsXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdzYWxlcy1yZXBvcnQtY2hhbm5lbCcsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnaW52ZXN0b3ItcmVwb3J0cy5jdW11bGF0aXZlLXNhbGVzLXJlcG9ydC1ieS1jaGFubmVsJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vc2FsZXMtcmVwb3J0LWNoYW5uZWwnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0N1bXVsYXRpdmUgYnkgQ2hhbm5lbCcsXG4gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAnaW52ZXN0b3IucmVwb3J0aW5nLnNhbGVzJyxcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ3NhbGVzLXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnaW52ZXN0b3ItcmVwb3J0cy5jdW11bGF0aXZlLXNhbGVzLXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL3NhbGVzLXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnRGFpbHkgQ3VtdWxhdGl2ZSBSZXZlbnVlcycsXG4gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAnaW52ZXN0b3IucmVwb3J0aW5nLnNhbGVzJyxcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJy9tYW5hZ2UvYm9va2luZy1yZXBvcnRzJyxcbiAgICAgICAgbmFtZTogJ2Jvb2tpbmctcmVwb3J0cycsXG4gICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9QYXJlbnRQYWdlJyksXG4gICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnQm9va2luZyBSZXBvcnRzJyxcbiAgICAgICAgICAgIGljb246ICdmYSBmYS1saXN0LWFsdCcsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgICdyZXBvcnRpbmcudmlldydcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnYmFsYW5jZXMnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2Jvb2tpbmctcmVwb3J0cy5iYWxhbmNlcycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL2JhbGFuY2VzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdPdXRzdGFuZGluZyBCYWxhbmNlcycsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnZmluYW5jaWFsLXBheW1lbnRzLXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYm9va2luZy1yZXBvcnRzLmZpbmFuY2lhbC1wYXltZW50cy1yZXBvcnQnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9maW5hbmNpYWwtcGF5bWVudHMtcmVwb3J0JyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdQYXltZW50IERhdGVzJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdyZXBvcnQtcGF5bWVudHMnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2Jvb2tpbmctcmVwb3J0cy5yZXBvcnQtcGF5bWVudHMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9yZXBvcnQtcGF5bWVudHMnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1BheW1lbnRzIFJlcG9ydCcsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAncGF5bWVudC1kYXRhJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdib29raW5nLXJlcG9ydHMucGF5bWVudC1kYXRhJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vcGF5bWVudC1kYXRhJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdQYXltZW50IERhdGEnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ3JlcG9ydC1vcmRlcnMnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2Jvb2tpbmctcmVwb3J0cy5yZXBvcnQtb3JkZXJzJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vcmVwb3J0LW9yZGVycycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQm9va2luZ3MgUmVwb3J0JyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdyZXBvcnQtb3JkZXJzLWNoYW5nZXMnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2Jvb2tpbmctcmVwb3J0cy5yZXBvcnQtb3JkZXJzLWNoYW5nZXMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9yZXBvcnQtb3JkZXJzLWNoYW5nZXMnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0Jvb2tpbmdzIENoYW5nZXMgUmVwb3J0JyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdtYXJnaW4tcmV2ZW51ZS1yZXBvcnQnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2Jvb2tpbmctcmVwb3J0cy5tYXJnaW4tcmV2ZW51ZS1yZXBvcnQnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9tYXJnaW4tcmV2ZW51ZS1yZXBvcnQnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ01hcmdpbiAmIFJldmVudWUnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2Nhc2gtc3VtbWFyeS1zaGlwJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdib29raW5nLXJlcG9ydHMuY2FzaC1zdW1tYXJ5LXNoaXAnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9jYXNoLXN1bW1hcnktc2hpcCcsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQ2FzaCBTdW1tYXJ5IGJ5IFNoaXAnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ3NlYXNvbi1ieS1zaGlwJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdib29raW5nLXJlcG9ydHMuc2Vhc29uLWJ5LXNoaXAnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9zZWFzb24tYnktc2hpcCcsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnU2Vhc29uIEJ5IENydWlzZScsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnc2Vhc29uLWJ5LWFnZW50JyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdib29raW5nLXJlcG9ydHMuc2Vhc29uLWJ5LWFnZW50JyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vc2Vhc29uLWJ5LWFnZW50JyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdTZWFzb24gQnkgQWdlbnQnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2FuY2lsbGFyeS1tYXJnaW4tcmVwb3J0JyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdib29raW5nLXJlcG9ydHMuYW5jaWxsYXJ5LW1hcmdpbi1yZXBvcnQnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9hbmNpbGxhcnktbWFyZ2luLXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQW5jaWxsYXJ5IE1hcmdpbicsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnb3B0aW9uLW9yZGVycycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYm9va2luZy1yZXBvcnRzLm9wdGlvbi1vcmRlcnMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9vcHRpb24tb3JkZXJzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdPcHRpb24gQm9va2luZ3MnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ3BhcnQtY2FuY2VsbGF0aW9uLXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYm9va2luZy1yZXBvcnRzLnBhcnQtY2FuY2VsbGF0aW9uLXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL3BhcnQtY2FuY2VsbGF0aW9uLXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUGFydCBDYW5jZWxsYXRpb24nLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2NhbmNlbGxhdGlvbi1yZXBvcnQnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2Jvb2tpbmctcmVwb3J0cy5jYW5jZWxsYXRpb24tcmVwb3J0JyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vY2FuY2VsbGF0aW9uLXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQ2FuY2VsbGF0aW9uJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdjb21iaW5hdGlvbi1wYXNzZW5nZXJzLXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYm9va2luZy1yZXBvcnRzLmNvbWJpbmF0aW9uLXBhc3NlbmdlcnMtcmVwb3J0JyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vY29tYmluYXRpb24tcGFzc2VuZ2Vycy1yZXBvcnQnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0NvbWJpbmF0aW9uIFBhc3NlbmdlcnMnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2Nyb3NzLWNhYmluLXN0YXR1cy1jaGVjaycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYm9va2luZy1yZXBvcnRzLmNyb3NzLWNhYmluLXN0YXR1cy1jaGVjaycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL2Nyb3NzLWNhYmluLXN0YXR1cy1jaGVjaycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQ29tYmluYXRpb24gQ2hlY2snLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2NsdWItY29sdW1idXMtcmVwb3J0JyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdib29raW5nLXJlcG9ydHMuY2x1Yi1jb2x1bWJ1cy1yZXBvcnQnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9jbHViLWNvbHVtYnVzLXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQ2x1YiBDb2x1bWJ1cyBSZXBvcnQnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ21lZGljYWwtcmVwb3J0cycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYm9va2luZy1yZXBvcnRzLm1lZGljYWwtcmVwb3J0cycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL21lZGljYWwtcmVwb3J0cycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnTWVkaWNhbCBSZXBvcnRzJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdtaXNzaW5nLWNvbnRhY3QtZGV0YWlscy1yZXBvcnQnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2Jvb2tpbmctcmVwb3J0cy5taXNzaW5nLWNvbnRhY3QtZGV0YWlscy1yZXBvcnQnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9taXNzaW5nLWNvbnRhY3QtZGV0YWlscy1yZXBvcnQnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ01pc3NpbmcgY29udGFjdCBkZXRhaWxzJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJy9tYW5hZ2UvbWFuaWZlc3RzJyxcbiAgICAgICAgbmFtZTogJ21hbmlmZXN0cycsXG4gICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9QYXJlbnRQYWdlJyksXG4gICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnTWFuaWZlc3RzJyxcbiAgICAgICAgICAgIGljb246ICdmYSBmYS1saXN0JyxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAgICAgICAgJ2NydWlzZXMudmlldycsXG4gICAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ3NhaWxpbmctZGF5LXJlcG9ydHMnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdtYW5pZmVzdHMuc2FpbGluZy1kYXktcmVwb3J0cycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL1BhcmVudFBhZ2UnKSxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnU2FpbGluZyBEYXkgUmVwb3J0cycsXG4gICAgICAgICAgICAgICAgICAgIGljb246ICdmYSBmYS1saXN0LWFsdCcsXG4gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAnbWFuaWZlc3RzLnNhaWxpbmctZGF5LXJlcG9ydHMnLFxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnb2JjLWNyZWRpdC1yZXBvcnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdtYW5pZmVzdHMucmVwb3J0LXBhc3Nlbmdlci1tYW5pZmVzdC5vYmMtY3JlZGl0LXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9vYmMtY3JlZGl0LXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdPQkMgQ3JlZGl0IFJlcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdub3Rlcy1vbi1ib29raW5ncy1yZXBvcnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdtYW5pZmVzdHMucmVwb3J0LXBhc3Nlbmdlci1tYW5pZmVzdC5ub3Rlcy1vbi1ib29raW5ncy1yZXBvcnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vbm90ZXMtb24tYm9va2luZ3MtcmVwb3J0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ05vdGVzIE9uIEJvb2tpbmdzIFJlcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdyZXBvcnQtY2FyLXBhcmtpbmctbWFuaWZlc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdtYW5pZmVzdHMucmVwb3J0LXBhc3Nlbmdlci1tYW5pZmVzdC5yZXBvcnQtY2FyLXBhcmtpbmctbWFuaWZlc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vcmVwb3J0LWNhci1wYXJraW5nLW1hbmlmZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0NhciBQYXJraW5nIE1hbmlmZXN0IFJlcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdyZXBvcnQtY29hY2gtbWFuaWZlc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdtYW5pZmVzdHMucmVwb3J0LXBhc3Nlbmdlci1tYW5pZmVzdC5yZXBvcnQtY29hY2gtbWFuaWZlc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vcmVwb3J0LWNvYWNoLW1hbmlmZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0NvYWNoIE1hbmlmZXN0IFJlcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdyZXBvcnQtZ3Vlc3QtbWFuaWZlc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdtYW5pZmVzdHMucmVwb3J0LXBhc3Nlbmdlci1tYW5pZmVzdC5yZXBvcnQtZ3Vlc3QtbWFuaWZlc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vcmVwb3J0LWd1ZXN0LW1hbmlmZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0d1ZXN0IE1hbmlmZXN0IFJlcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdyZXBvcnQtYmFjay10by1iYWNrLW1hbmlmZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbWFuaWZlc3RzLnJlcG9ydC1wYXNzZW5nZXItbWFuaWZlc3QucmVwb3J0LWJhY2stdG8tYmFjay1tYW5pZmVzdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9yZXBvcnQtYmFjay10by1iYWNrLW1hbmlmZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0JhY2sgVG8gQmFjayBNYW5pZmVzdCBSZXBvcnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAncmVwb3J0LWVtYmFya2F0aW9uLXNjaGVkdWxlLW1hbmlmZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbWFuaWZlc3RzLnJlcG9ydC1wYXNzZW5nZXItbWFuaWZlc3QucmVwb3J0LWVtYmFya2F0aW9uLXNjaGVkdWxlLW1hbmlmZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL3JlcG9ydC1lbWJhcmthdGlvbi1zY2hlZHVsZS1tYW5pZmVzdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdFbWJhcmthdGlvbiBTY2hlZHVsZSBNYW5pZmVzdCBSZXBvcnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAncmVwb3J0LXN0YWZmLWFuZC1zdXBlcm51bWVyYXJ5LW1hbmlmZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbWFuaWZlc3RzLnJlcG9ydC1wYXNzZW5nZXItbWFuaWZlc3QucmVwb3J0LXN0YWZmLWFuZC1zdXBlcm51bWVyYXJ5LW1hbmlmZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL3JlcG9ydC1zdGFmZi1hbmQtc3VwZXJudW1lcmFyeS1tYW5pZmVzdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdTdGFmZiAmIFN1cGVybnVtZXJhcnkgTWFuaWZlc3QgUmVwb3J0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdyZXBvcnQtcGFzc2VuZ2VyLW1hbmlmZXN0JyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdtYW5pZmVzdHMucmVwb3J0LXBhc3Nlbmdlci1tYW5pZmVzdCcsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL3JlcG9ydC1wYXNzZW5nZXItbWFuaWZlc3QnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1Bhc3NlbmdlciBNYW5pZmVzdCBSZXBvcnQnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ21lZGljYWwtaW5zdXJhbmNlLW1hbmlmZXN0JyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdtYW5pZmVzdHMubWVkaWNhbC1pbnN1cmFuY2UtbWFuaWZlc3QnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9tZWRpY2FsLWluc3VyYW5jZS1tYW5pZmVzdCcsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnTWVkaWNhbCAmIEluc3VyYW5jZSBNYW5pZmVzdCcsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnZGlldGFyeS1yZXN0YXVyYW50LXNlYXRpbmctbWFuaWZlc3QnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ21hbmlmZXN0cy5kaWV0YXJ5LXJlc3RhdXJhbnQtc2VhdGluZy1tYW5pZmVzdCcsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL2RpZXRhcnktcmVzdGF1cmFudC1zZWF0aW5nLW1hbmlmZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdEaWV0YXJ5ICYgUmVzdGF1cmFudCBTZWF0aW5nIE1hbmlmZXN0JyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdzcGVjaWFsLXJlcXVlc3RzLWxpc3QnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ21hbmlmZXN0cy5zcGVjaWFsLXJlcXVlc3RzLWxpc3QnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9zcGVjaWFsLXJlcXVlc3RzLWxpc3QnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1NwZWNpYWwgUmVxdWVzdHMnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ3JlcXVpcmVkLWRvY3VtZW50cycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnbWFuaWZlc3RzLnJlcG9ydC1wYXNzZW5nZXItbWFuaWZlc3QucmVwb3J0LXJlcXVpcmVkLWRvY3VtZW50cy1tYW5pZmVzdCcsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL3JlcXVpcmVkLWRvY3VtZW50cycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUmVxdWlyZWQgRG9jdW1lbnRzIE1hbmlmZXN0JyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdtYWlsLW1lcmdlLWV4cG9ydCcsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnbWFuaWZlc3RzLm1haWwtbWVyZ2UtZXhwb3J0JyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vbWFpbC1tZXJnZS1leHBvcnQnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ01haWwgTWVyZ2UgRXhwb3J0JyxcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdtYW5pZmVzdHMuZXhwb3J0LW1haWxtZXJnZS1kYXRhJyxcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiAnL21hbmFnZS9vbGQtcmVwb3J0cycsXG4gICAgICAgIG5hbWU6ICdvbGQtcmVwb3J0cycsXG4gICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9QYXJlbnRQYWdlJyksXG4gICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnT2xkIFJlcG9ydHMnLFxuICAgICAgICAgICAgaWNvbjogJ2ZhIGZhLXRhYmxlJyxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAgICAgICAgJ3JlcG9ydGluZy52aWV3J1xuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdkb3VibGUtYm9va2luZycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnb2xkLXJlcG9ydHMuZG91YmxlLWJvb2tpbmcnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9kb3VibGUtYm9va2luZycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnRG91YmxlIEJvb2tpbmdzIFJlcG9ydCcsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAncmVwb3J0LXJlY29uJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdvbGQtcmVwb3J0cy5yZXBvcnQtcmVjb24nLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9yZXBvcnQtcmVjb24nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0ZpbmFuY2lhbCBSZWNvbiBSZXBvcnQnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ3JlcG9ydC1hZGRyZXNzZXMnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ29sZC1yZXBvcnRzLnJlcG9ydC1hZGRyZXNzZXMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9yZXBvcnQtYWRkcmVzc2VzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdBZGRyZXNzIFJlcG9ydCcsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdGg6ICcvbWFuYWdlL3Byb21vdGlvbnMtYW5kLWZhcmVzJyxcbiAgICAgICAgbmFtZTogJ3Byb21vdGlvbnMtYW5kLWZhcmVzJyxcbiAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL1BhcmVudFBhZ2UnKSxcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgbGFiZWw6ICdQcm9tb3Rpb25zICYgRmFyZXMnLFxuICAgICAgICAgICAgaWNvbjogJ2ZhIGZhLWRvdC1jaXJjbGUnLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgICAgICAnY2FiaW4ucHJpY2VzLnZpZXcnLFxuICAgICAgICAgICAgICAgICdib29raW5nLmFkZGl0aW9uYWwtc2VydmljZS1wcmljZXMudmlldycsXG4gICAgICAgICAgICAgICAgJ2RyaW5rcy1wYWNrYWdlcy52aWV3JyxcbiAgICAgICAgICAgICAgICAnZHJpbmtzLXBhY2thZ2VzLWRpc2NvdW50LnZpZXcnLFxuICAgICAgICAgICAgICAgICdib29raW5ncy5wcm9tby1jb2Rlcy52aWV3JyxcbiAgICAgICAgICAgICAgICAnY29hY2hlcy52aWV3JyxcbiAgICAgICAgICAgICAgICAncGFya2luZy52aWV3JyxcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnY2FiaW4tZmFyZWJhc2VzJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9tb3Rpb25zLWFuZC1mYXJlcy5jYWJpbi1mYXJlYmFzZXMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9jYWJpbi1mYXJlYmFzZXM/c29ydD1pZCZkaXJlY3Rpb249ZGVzYycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnRmFyZWJhc2VzJyxcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjYWJpbi1mYXJlYmFzZXMudmlldydcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2ZhcmViYXNlcycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAncHJvbW90aW9ucy1hbmQtZmFyZXMuZmFyZWJhc2VzJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vZmFyZWJhc2VzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdTZXQgQ3J1aXNlIEZhcmViYXNlJyxcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdmYXJlYmFzZXMudmlldydcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ29yZGVyLWFkZGl0aW9uYWwtc2VydmljZXMnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ3Byb21vdGlvbnMtYW5kLWZhcmVzLm9yZGVyLWFkZGl0aW9uYWwtc2VydmljZXMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9vcmRlci1hZGRpdGlvbmFsLXNlcnZpY2VzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdBZGRpdGlvbmFsIFNlcnZpY2UgUHJpY2VzJyxcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdib29raW5nLmFkZGl0aW9uYWwtc2VydmljZS1wcmljZXMudmlldydcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2FkZGl0aW9ucy1wYWNrYWdlcycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAncHJvbW90aW9ucy1hbmQtZmFyZXMuYWRkaXRpb25zLXBhY2thZ2VzJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vYWRkaXRpb25zLXBhY2thZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdEcmlua3MgUGFja2FnZXMnLFxuICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2RyaW5rcy1wYWNrYWdlcy52aWV3J1xuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnYWRkaXRpb25zLXBhY2thZ2VzLWRpc2NvdW50JyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9tb3Rpb25zLWFuZC1mYXJlcy5hZGRpdGlvbnMtcGFja2FnZXMtZGlzY291bnQnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9hZGRpdGlvbnMtcGFja2FnZXMtZGlzY291bnQnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0RyaW5rcyBQYWNrYWdlcyBEaXNjb3VudHMnLFxuICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2RyaW5rcy1wYWNrYWdlcy1kaXNjb3VudC52aWV3J1xuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAncHJvbW8tY29kZXMnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ3Byb21vdGlvbnMtYW5kLWZhcmVzLnByb21vLWNvZGVzJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vcHJvbW8tY29kZXMnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1Byb21vIENvZGVzJyxcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdib29raW5ncy5wcm9tby1jb2Rlcy52aWV3J1xuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAncHJvbW8tY29kZXMtY2F0ZWdvcnknLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ3Byb21vdGlvbnMtYW5kLWZhcmVzLnByb21vLWNvZGVzLWNhdGVnb3JpZXMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9wcm9tby1jb2Rlcy1jYXRlZ29yaWVzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdQcm9tbyBDb2RlIENhdGVnb3JpZXMnLFxuICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2Jvb2tpbmdzLnByb21vLWNvZGVzLWNhdGVnb3J5LnZpZXcnXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdjb2FjaGVzJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9tb3Rpb25zLWFuZC1mYXJlcy5jb2FjaGVzJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vY29hY2hlcycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnVmlldyBDb2FjaGVzJyxcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb2FjaGVzLnZpZXcnXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdGg6ICcvbWFuYWdlL2FjY291bnRpbmcnLFxuICAgICAgICBuYW1lOiAnYWNjb3VudGluZycsXG4gICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9QYXJlbnRQYWdlJyksXG4gICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnQWNjb3VudGluZyBVdGlsaXRpZXMnLFxuICAgICAgICAgICAgaWNvbjogJ2ZhIGZhLXBvdW5kLXNpZ24nLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgICAgICAnYWNjb3VudGluZy52aWV3J1xuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdwYXltZW50cycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYWNjb3VudGluZy5wYXltZW50cycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL3BheW1lbnRzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdWaWV3IFBheW1lbnRzJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdjbGVhcmVkLXBheW1lbnRzJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdhY2NvdW50aW5nLmNsZWFyZWQtcGF5bWVudHMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9jbGVhcmVkLXBheW1lbnRzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdDbGVhcmVkIFBheW1lbnRzJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdwYXltZW50LWFjY291bnRzJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdhY2NvdW50aW5nLnBheW1lbnQtYWNjb3VudHMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9wYXltZW50LWFjY291bnRzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdCYW5rIEFjY291bnRzJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdwYXltZW50LWNvZGVzJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdhY2NvdW50aW5nLnBheW1lbnQtY29kZXMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9wYXltZW50LWNvZGVzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdOb21pbmFsIENvZGVzJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdwcm9tby1jb2RlcycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnYWNjb3VudGluZy5wcm9tby1jb2RlcycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL3Byb21vLWNvZGVzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdQcm9tbyBDb2RlcycsXG4gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAnYm9va2luZ3MucHJvbW8tY29kZXMudmlldydcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2FnZW50LXN0YXRlbWVudHMnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2FjY291bnRpbmcuYWdlbnQtc3RhdGVtZW50cycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL2FnZW50LXN0YXRlbWVudHMnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0FnZW50IFN0YXRlbWVudHMnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2RlcG9zaXQtZHVlLXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnZGVwb3NpdC5kdWUtcmVwb3J0JyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vZGVwb3NpdC1kdWUtcmVwb3J0JyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdEZXBvc2l0IER1ZSBSZXBvcnQnLFxuICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2FjY291bnRzLmRlcG9zaXQtZHVlLXJlcG9ydC52aWV3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdhY2NvdW50cy5kZXBvc2l0LWR1ZS1yZXBvcnQuZXhwb3J0J1xuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnZGlyZWN0LWRlYml0LXNjaGVtZS1yZXBvcnQnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2FjY291bnRpbmcuZGlyZWN0LWRlYml0LXNjaGVtZS1yZXBvcnQnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9kaXJlY3QtZGViaXQtc2NoZW1lLXJlcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnRGlyZWN0IERlYml0IFNjaGVtZSBSZXBvcnQnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJy9tYW5hZ2UvY3J1aXNlLW1hbmFnZW1lbnQnLFxuICAgICAgICBuYW1lOiAnY3J1aXNlLW1hbmFnZW1lbnQnLFxuICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvUGFyZW50UGFnZScpLFxuICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICBsYWJlbDogJ0NydWlzZSBNYW5hZ2VtZW50JyxcbiAgICAgICAgICAgIGljb246ICdmYSBmYS1zaGlwJyxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAgICAgICAgJ2NydWlzZXMudmlldydcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnY3J1aXNlcycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnY3J1aXNlLW1hbmFnZW1lbnQuY3J1aXNlcycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL2NydWlzZXMnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1ZpZXcgQ3J1aXNlcycsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnY3J1aXNlcy1sb2cnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2NydWlzZS1tYW5hZ2VtZW50LmNydWlzZXMtbG9nJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vY3J1aXNlcy1sb2cnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1ZpZXcgQ3J1aXNlcyBMb2cnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ3NoaXAtaXRpbmVyYXJ5JyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9kb21haW4vaXRpbmVyYXJ5L3BhZ2VzL0l0aW5lcmFyaWVzJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2NydWlzZS1tYW5hZ2VtZW50LnNoaXAtaXRpbmVyYXJ5JyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnVmlldyBTaGlwcyBJdGluZXJhcnknLFxuICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2l0aW5lcmFyeS52aWV3J1xuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnbmV3LXNoaXAtaXRpbmVyYXJ5LzppZCcsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vZG9tYWluL2l0aW5lcmFyeS9wYWdlcy9DcmVhdGVPckVkaXRJdGluZXJhcnknKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnY3J1aXNlLW1hbmFnZW1lbnQubmV3LXNoaXAtaXRpbmVyYXJ5JyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnTmV3IFNoaXAgSXRpbmVyYXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuRnJvbU1lbnU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAnaXRpbmVyYXJ5LmVkaXQnXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdidWRnZXRzJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdjcnVpc2UtbWFuYWdlbWVudC5idWRnZXRzJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vYnVkZ2V0cycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQ3J1aXNlIEJ1ZGdldHMnLFxuICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2Nvc3QtY2VudHJlcy52aWV3J1xuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnc2hpcHMnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2NydWlzZS1tYW5hZ2VtZW50LnNoaXBzJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vc2hpcHMnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1ZpZXcgU2hpcHMnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2N1cnJlbmNpZXMnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2NydWlzZS1tYW5hZ2VtZW50LmN1cnJlbmNpZXMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9jdXJyZW5jaWVzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdWaWV3IEN1cnJlbmNpZXMnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2NvdW50cmllcycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnY3J1aXNlLW1hbmFnZW1lbnQuY291bnRyaWVzJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vY291bnRyaWVzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdDb3VudHJpZXMnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ3BvcnRzJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdjcnVpc2UtbWFuYWdlbWVudC5wb3J0cycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL3BvcnRzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdQb3J0cycsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnZGVzdGluYXRpb25zJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdjcnVpc2UtbWFuYWdlbWVudC5kZXN0aW5hdGlvbnMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9kZXN0aW5hdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0Rlc3RpbmF0aW9ucycsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnY2FiaW5zJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdjcnVpc2UtbWFuYWdlbWVudC5jYWJpbnMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9jYWJpbnMnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0Z1bGwgQ2FiaW4gSW52ZW50b3J5JyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJy9tYW5hZ2UvYWdlbnQtbWFuYWdlbWVudCcsXG4gICAgICAgIG5hbWU6ICdhZ2VudC1tYW5hZ2VtZW50JyxcbiAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL1BhcmVudFBhZ2UnKSxcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgbGFiZWw6ICdUcmF2ZWwgUGFydG5lciBNYW5hZ2VtZW50JyxcbiAgICAgICAgICAgIGljb246ICdmYXMgZmEtc3RvcmUtYWx0JyxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAgICAgICAgJ3RyYXZlbC1wYXJ0bmVycy5saXN0JyxcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnc2FsZXMtcmVwb3J0JyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdpbnZlc3Rvci1zYWxlcy1yZXBvcnQnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9zYWxlcy1yZXBvcnQnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0N1bXVsYXRpdmUgU2FsZXMgUmVwb3J0JyxcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICd0cmF2ZWwtcGFydG5lcnMubGlzdCcsXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICd0cmF2ZWwtcGFydG5lcnMnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ3RyYXZlbC1wYXJ0bmVyLW1hbmFnZW1lbnQuYWdlbnRzJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vYWdlbnRzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdWaWV3IEFnZW50cycsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnY29tbWlzc2lvbi1zZWFzb24nLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ3RyYXZlbC1wYXJ0bmVyLW1hbmFnZW1lbnQuY29tbWlzc2lvbi1zZWFzb24nLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9jb21taXNzaW9uLXNlYXNvbicsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQ29tbWlzc2lvbiBTZWFzb25zJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdhZ2VudHMtYWxsb2NhdGlvbnMnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ3RyYXZlbC1wYXJ0bmVyLW1hbmFnZW1lbnQuYWdlbnRzLWFsbG9jYXRpb25zJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vYWdlbnRzLWFsbG9jYXRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdBZ2VudFxcJ3MgQWxsb2NhdGlvbnMnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2dyb3VwLWNvbnRyYWN0cycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAndHJhdmVsLXBhcnRuZXItbWFuYWdlbWVudC5ncm91cC1jb250cmFjdHMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9ncm91cC1jb250cmFjdHMnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0dyb3VwIENvbnRyYWN0cycsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnZ3JvdXAtZGF0YS1yZXBvcnRpbmcnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9MZWdhY3lQYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2Jvb2tpbmctcmVwb3J0cy5ncm91cC1kYXRhLXJlcG9ydGluZycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL2dyb3VwLWRhdGEtcmVwb3J0aW5nJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdHcm91cCBEYXRhIFJlcG9ydGluZycsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiAnL21hbmFnZS91c2VyLW1hbmFnZW1lbnQnLFxuICAgICAgICBuYW1lOiAndXNlci1tYW5hZ2VtZW50JyxcbiAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL1BhcmVudFBhZ2UnKSxcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgbGFiZWw6ICdVc2VyIE1hbmFnZW1lbnQnLFxuICAgICAgICAgICAgaWNvbjogJ2lvbi1wZXJzb24nLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgICAgICAnYXV0aC52aWV3JyxcbiAgICAgICAgICAgICAgICAndXNlcnMudmlldycsXG4gICAgICAgICAgICAgICAgJ3RlYW1zLnZpZXcnLFxuICAgICAgICAgICAgICAgICdyb2xlcy52aWV3JyxcbiAgICAgICAgICAgICAgICAncGVybWlzc2lvbi1rZXlzLnZpZXcnLFxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICd1c2VycycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vZG9tYWluL3VzZXJzL3BhZ2VzL1VzZXJzJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ3VzZXJzJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnVXNlcnMnLFxuICAgICAgICAgICAgICAgICAgICBoaWRlQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGljb246ICdpb24tcGVyc29uJyxcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkxpbms6ICdpbmRleCcsXG4gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbJ2F1dGgudmlldyddXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnaW5kZXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vZG9tYWluL3VzZXJzL3BhZ2VzL3VzZXJzL0luZGV4JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAndXNlcnMuaW5kZXgnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdjcmVhdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3VzZXJzLmNyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9kb21haW4vdXNlcnMvcGFnZXMvdXNlcnMvQ3JlYXRlJylcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ2VkaXQvOmlkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICd1c2Vycy5lZGl0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCcuL2RvbWFpbi91c2Vycy9wYWdlcy91c2Vycy9FZGl0JylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ3Blcm1pc3Npb25zJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9kb21haW4vcGVybWlzc2lvbnMvcGFnZXMvUGVybWlzc2lvbnMnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAncGVybWlzc2lvbnMnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdQZXJtaXNzaW9ucycsXG4gICAgICAgICAgICAgICAgICAgIGhpZGVDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2lvbi1sb2NrZWQnLFxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uTGluazogJ2luZGV4J1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ2luZGV4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwZXJtaXNzaW9ucy5pbmRleCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9kb21haW4vcGVybWlzc2lvbnMvcGFnZXMvcGVybWlzc2lvbnMvSW5kZXgnKVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwZXJtaXNzaW9ucy5jcmVhdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL1BhZ2UnKVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnZWRpdC86aWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Blcm1pc3Npb25zLmVkaXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vZG9tYWluL3Blcm1pc3Npb25zL3BhZ2VzL3Blcm1pc3Npb25zL0VkaXQnKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAncGVybWlzc2lvbi1rZXlzJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvUGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdwZXJtaXNzaW9uS2V5cycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1Blcm1pc3Npb24gS2V5cycsXG4gICAgICAgICAgICAgICAgICAgIGhpZGVDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2lvbi1sb2NrZWQnLFxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uTGluazogJ2luZGV4JyxcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IFsncGVybWlzc2lvbi1rZXlzLnZpZXcnXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ2luZGV4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwZXJtaXNzaW9uS2V5cy5pbmRleCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvUGFnZScpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJy9tYW5hZ2Uvc3lzdGVtLWNvbmZpZ3VyYXRpb24nLFxuICAgICAgICBuYW1lOiAnc3lzdGVtLWNvbmZpZ3VyYXRpb24nLFxuICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvUGFnZScpLFxuICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICBsYWJlbDogJ1N5c3RlbSBDb25maWd1cmF0aW9uJyxcbiAgICAgICAgICAgIGljb246ICdpb24tc2V0dGluZ3MnLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgICAgICAnY29uZmlnLnZpZXcnLFxuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdzZXR0aW5ncycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnc3lzdGVtLWNvbmZpZ3VyYXRpb24uc2V0dGluZ3MnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5UGF0aDogJy9hZG1pbi9zZXR0aW5ncycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnU2V0dGluZ3MnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ3N5c3RlbWxvZycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL0xlZ2FjeVBhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnc3lzdGVtLWNvbmZpZ3VyYXRpb24uc3lzdGVtbG9nJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vc3lzdGVtbG9nJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdTeXN0ZW0gTG9nJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICd1cGxvYWRzJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdzeXN0ZW0tY29uZmlndXJhdGlvbi51cGxvYWRzJyxcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGg6ICcvYWRtaW4vdXBsb2FkcycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnVXBsb2FkcyBDU1YnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2FwaS1sb2dzJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdzeXN0ZW0tY29uZmlndXJhdGlvbi5hcGktbG9ncycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL2FwaS1sb2dzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdBUEkgTG9ncycsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiAnL21hbmFnZS9kZXZlbG9wbWVudCcsXG4gICAgICAgIG5hbWU6ICdkZXZlbG9wbWVudCcsXG4gICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9QYWdlJyksXG4gICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnRGV2ZWxvcG1lbnQnLFxuICAgICAgICAgICAgaWNvbjogJ2ZhIGZhLWNvZGUnLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IFsnZGV2ZWxvcGVyJ11cbiAgICAgICAgfSxcbiAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnL2FwaS1jbGllbnQnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9QYWdlJyksXG4gICAgICAgICAgICAgICAgbmFtZTogJ2FwaS1jbGllbnQnLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdBcGkgQ2xpZW50JyxcbiAgICAgICAgICAgICAgICAgICAgaGlkZUNoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBpY29uOiAnZmEgZmEtZ3JhdicsXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb25MaW5rOiAnaW5kZXgnLFxuICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3NvbWV0aGluZy5uby5vbmUuaGFzJ1xuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnaW5kZXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2FwaS1jbGllbnQuaW5kZXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL1BhZ2UnKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnZGVzaWducycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJ34vY29yZS9jb21wb25lbnRzL1BhZ2UnKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnZGVzaWducycsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0NvbXBvbmVudCBEZXNpZ25zJyxcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2lvbi1wYWludGJydXNoJyxcbiAgICAgICAgICAgICAgICAgICAgaGlkZUNoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJy9tYW5hZ2UvbWFya2V0aW5nJyxcbiAgICAgICAgbmFtZTogJ21hcmtldGluZycsXG4gICAgICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCd+L2NvcmUvY29tcG9uZW50cy9QYXJlbnRQYWdlJyksXG4gICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnTWFya2V0aW5nJyxcbiAgICAgICAgICAgIGljb246ICdmYSBmYS1saXN0LWFsdCcsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgICdtYXJrZXRpbmcubWFya2V0aW5nLWFkdmVydC1zcGVuZC52aWV3J1xuICAgICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdtYXJrZXRpbmctYWR2ZXJ0LWluZm9ybWF0aW9uJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnfi9jb3JlL2NvbXBvbmVudHMvTGVnYWN5UGFnZScpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdtYXJrZXRpbmcubWFya2V0aW5nLWFkdmVydC1pbmZvcm1hdGlvbicsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgICBsZWdhY3lQYXRoOiAnL2FkbWluL21hcmtldGluZy1hZHZlcnQtaW5mb3JtYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ01hcmtldGluZyBBZHZlcnQgSW5mb3JtYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ21hcmtldGluZy5tYXJrZXRpbmctYWR2ZXJ0LXNwZW5kLnZpZXcnXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9LFxuXVxuIl0sIm5hbWVzIjpbInBhdGgiLCJjb21wb25lbnQiLCJuYW1lIiwibWV0YSIsImhpZGRlbkZyb21NZW51IiwibGFiZWwiLCJpY29uIiwicGVybWlzc2lvbnMiLCJjaGlsZHJlbiIsImxlZ2FjeVBhdGgiLCJoaWRlQ2hpbGRyZW4iLCJzZWN0aW9uTGluayJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/routes.js\n");

/***/ }),

/***/ "./resources/js/validation/emailIsAvailable.js":
/*!*****************************************************!*\
  !*** ./resources/js/validation/emailIsAvailable.js ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _vuex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../vuex */ \"./resources/js/vuex/index.js\");\n/* harmony import */ var vee_validate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vee-validate */ \"./node_modules/vee-validate/dist/vee-validate.esm.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\n\n\n(0,vee_validate__WEBPACK_IMPORTED_MODULE_1__.defineRule)('email-available', /*#__PURE__*/function () {\n  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(value, args) {\n    return _regeneratorRuntime().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          _context.next = 2;\n          return _vuex__WEBPACK_IMPORTED_MODULE_0__.store.dispatch('users/emailIsValid', value);\n        case 2:\n          if (!_context.sent) {\n            _context.next = 4;\n            break;\n          }\n          return _context.abrupt(\"return\", true);\n        case 4:\n          return _context.abrupt(\"return\", 'This email address has already been taken.');\n        case 5:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee);\n  }));\n  return function (_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n}());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvdmFsaWRhdGlvbi9lbWFpbElzQXZhaWxhYmxlLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7K0NBQ0EscUpBQUFBLG1CQUFBLFlBQUFBLG9CQUFBLFdBQUFDLE9BQUEsU0FBQUEsT0FBQSxPQUFBQyxFQUFBLEdBQUFDLE1BQUEsQ0FBQUMsU0FBQSxFQUFBQyxNQUFBLEdBQUFILEVBQUEsQ0FBQUksY0FBQSxFQUFBQyxjQUFBLEdBQUFKLE1BQUEsQ0FBQUksY0FBQSxjQUFBQyxHQUFBLEVBQUFDLEdBQUEsRUFBQUMsSUFBQSxJQUFBRixHQUFBLENBQUFDLEdBQUEsSUFBQUMsSUFBQSxDQUFBQyxLQUFBLEtBQUFDLE9BQUEsd0JBQUFDLE1BQUEsR0FBQUEsTUFBQSxPQUFBQyxjQUFBLEdBQUFGLE9BQUEsQ0FBQUcsUUFBQSxrQkFBQUMsbUJBQUEsR0FBQUosT0FBQSxDQUFBSyxhQUFBLHVCQUFBQyxpQkFBQSxHQUFBTixPQUFBLENBQUFPLFdBQUEsOEJBQUFDLE9BQUFaLEdBQUEsRUFBQUMsR0FBQSxFQUFBRSxLQUFBLFdBQUFSLE1BQUEsQ0FBQUksY0FBQSxDQUFBQyxHQUFBLEVBQUFDLEdBQUEsSUFBQUUsS0FBQSxFQUFBQSxLQUFBLEVBQUFVLFVBQUEsTUFBQUMsWUFBQSxNQUFBQyxRQUFBLFNBQUFmLEdBQUEsQ0FBQUMsR0FBQSxXQUFBVyxNQUFBLG1CQUFBSSxHQUFBLElBQUFKLE1BQUEsWUFBQUEsT0FBQVosR0FBQSxFQUFBQyxHQUFBLEVBQUFFLEtBQUEsV0FBQUgsR0FBQSxDQUFBQyxHQUFBLElBQUFFLEtBQUEsZ0JBQUFjLEtBQUFDLE9BQUEsRUFBQUMsT0FBQSxFQUFBQyxJQUFBLEVBQUFDLFdBQUEsUUFBQUMsY0FBQSxHQUFBSCxPQUFBLElBQUFBLE9BQUEsQ0FBQXZCLFNBQUEsWUFBQTJCLFNBQUEsR0FBQUosT0FBQSxHQUFBSSxTQUFBLEVBQUFDLFNBQUEsR0FBQTdCLE1BQUEsQ0FBQThCLE1BQUEsQ0FBQUgsY0FBQSxDQUFB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QUE7RUFBQSxDQUN0RDtFQUFBLGlCQUFBSSxFQUFBLEVBQUFDLEdBQUE7SUFBQSxPQUFBTixJQUFBLENBQUFILEtBQUEsT0FBQUQsU0FBQTtFQUFBO0FBQUEsSUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy92YWxpZGF0aW9uL2VtYWlsSXNBdmFpbGFibGUuanM/YzA1MyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzdG9yZSB9IGZyb20gJy4uL3Z1ZXgnXG5pbXBvcnQgeyBkZWZpbmVSdWxlIH0gZnJvbSAndmVlLXZhbGlkYXRlJztcblxuZGVmaW5lUnVsZSgnZW1haWwtYXZhaWxhYmxlJywgYXN5bmMgKHZhbHVlLCBhcmdzKSA9PiB7XG4gICAgaWYgKGF3YWl0IHN0b3JlLmRpc3BhdGNoKCd1c2Vycy9lbWFpbElzVmFsaWQnLCB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiAnVGhpcyBlbWFpbCBhZGRyZXNzIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4uJztcbn0pIl0sIm5hbWVzIjpbIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJleHBvcnRzIiwiT3AiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd24iLCJoYXNPd25Qcm9wZXJ0eSIsImRlZmluZVByb3BlcnR5Iiwib2JqIiwia2V5IiwiZGVzYyIsInZhbHVlIiwiJFN5bWJvbCIsIlN5bWJvbCIsIml0ZXJhdG9yU3ltYm9sIiwiaXRlcmF0b3IiLCJhc3luY0l0ZXJhdG9yU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsInRvU3RyaW5nVGFnU3ltYm9sIiwidG9TdHJpbmdUYWciLCJkZWZpbmUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJlcnIiLCJ3cmFwIiwiaW5uZXJGbiIsIm91dGVyRm4iLCJzZWxmIiwidHJ5TG9jc0xpc3QiLCJwcm90b0dlbmVyYXRvciIsIkdlbmVyYXRvciIsImdlbmVyYXRvciIsImNyZWF0ZSIsImNvbnRleHQiLCJDb250ZXh0IiwibWFrZUludm9rZU1ldGhvZCIsInRyeUNhdGNoIiwiZm4iLCJhcmciLCJ0eXBlIiwiY2FsbCIsIkNvbnRpbnVlU2VudGluZWwiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiSXRlcmF0b3JQcm90b3R5cGUiLCJnZXRQcm90byIsImdldFByb3RvdHlwZU9mIiwiTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUiLCJ2YWx1ZXMiLCJHcCIsImRlZmluZUl0ZXJhdG9yTWV0aG9kcyIsImZvckVhY2giLCJtZXRob2QiLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwiaW52b2tlIiwicmVzb2x2ZSIsInJlamVjdCIsInJlY29yZCIsInJlc3VsdCIsIl90eXBlb2YiLCJfX2F3YWl0IiwidGhlbiIsInVud3JhcHBlZCIsImVycm9yIiwicHJldmlvdXNQcm9taXNlIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJzdGF0ZSIsIkVycm9yIiwiZG9uZVJlc3VsdCIsImRlbGVnYXRlIiwiZGVsZWdhdGVSZXN1bHQiLCJtYXliZUludm9rZURlbGVnYXRlIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJkb25lIiwibWV0aG9kTmFtZSIsInVuZGVmaW5lZCIsIlR5cGVFcnJvciIsImluZm8iLCJyZXN1bHROYW1lIiwibmV4dCIsIm5leHRMb2MiLCJwdXNoVHJ5RW50cnkiLCJsb2NzIiwiZW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsIml0ZXJhYmxlIiwiaXRlcmF0b3JNZXRob2QiLCJpc05hTiIsImxlbmd0aCIsImkiLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJnZW5GdW4iLCJjdG9yIiwiY29uc3RydWN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJpdGVyIiwia2V5cyIsInZhbCIsIm9iamVjdCIsInJldmVyc2UiLCJwb3AiLCJza2lwVGVtcFJlc2V0IiwicHJldiIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJvb3RSZWNvcmQiLCJydmFsIiwiZXhjZXB0aW9uIiwiaGFuZGxlIiwibG9jIiwiY2F1Z2h0IiwiaGFzQ2F0Y2giLCJoYXNGaW5hbGx5IiwiZmluYWxseUVudHJ5IiwiY29tcGxldGUiLCJmaW5pc2giLCJfY2F0Y2giLCJ0aHJvd24iLCJkZWxlZ2F0ZVlpZWxkIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiZ2VuIiwiX25leHQiLCJfdGhyb3ciLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3MiLCJhcmd1bWVudHMiLCJhcHBseSIsInN0b3JlIiwiZGVmaW5lUnVsZSIsIl9yZWYiLCJfY2FsbGVlIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsImRpc3BhdGNoIiwiX3giLCJfeDIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/validation/emailIsAvailable.js\n");

/***/ }),

/***/ "./resources/js/validation/validPassword.js":
/*!**************************************************!*\
  !*** ./resources/js/validation/validPassword.js ***!
  \**************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vee_validate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vee-validate */ \"./node_modules/vee-validate/dist/vee-validate.esm.js\");\n\n(0,vee_validate__WEBPACK_IMPORTED_MODULE_0__.defineRule)('valid-password', function (value) {\n  var format = new RegExp('^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[<>,.{}_+=#?!@$%^&*\"£]).{6,}$');\n  if (format.test(value)) {\n    return true;\n  }\n  return 'Password should be longer than 8 characters, contain 1 uppercase, 1 lowercase, 1 numeric and 1 special character..';\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvdmFsaWRhdGlvbi92YWxpZFBhc3N3b3JkLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQTBDO0FBRTFDQSx3REFBVSxDQUFDLGdCQUFnQixFQUFFLFVBQUNDLEtBQUssRUFBSztFQUNwQyxJQUFJQyxNQUFNLEdBQUcsSUFBSUMsTUFBTSxDQUFDLDBFQUEwRSxDQUFDO0VBQ25HLElBQUlELE1BQU0sQ0FBQ0UsSUFBSSxDQUFDSCxLQUFLLENBQUMsRUFBRTtJQUNwQixPQUFPLElBQUk7RUFDZjtFQUNBLE9BQU8sb0hBQW9IO0FBQy9ILENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy92YWxpZGF0aW9uL3ZhbGlkUGFzc3dvcmQuanM/ODMxYiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZpbmVSdWxlIH0gZnJvbSAndmVlLXZhbGlkYXRlJztcblxuZGVmaW5lUnVsZSgndmFsaWQtcGFzc3dvcmQnLCAodmFsdWUpID0+IHtcbiAgICBsZXQgZm9ybWF0ID0gbmV3IFJlZ0V4cCgnXig/PS4qP1tBLVpdKSg/PS4qP1thLXpdKSg/PS4qP1swLTldKSg/PS4qP1s8Piwue31fKz0jPyFAJCVeJipcIsKjXSkuezYsfSQnKTtcbiAgICBpZiAoZm9ybWF0LnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gJ1Bhc3N3b3JkIHNob3VsZCBiZSBsb25nZXIgdGhhbiA4IGNoYXJhY3RlcnMsIGNvbnRhaW4gMSB1cHBlcmNhc2UsIDEgbG93ZXJjYXNlLCAxIG51bWVyaWMgYW5kIDEgc3BlY2lhbCBjaGFyYWN0ZXIuLic7XG59KTtcblxuIl0sIm5hbWVzIjpbImRlZmluZVJ1bGUiLCJ2YWx1ZSIsImZvcm1hdCIsIlJlZ0V4cCIsInRlc3QiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/validation/validPassword.js\n");

/***/ }),

/***/ "./resources/js/vuex/Helpers.js":
/*!**************************************!*\
  !*** ./resources/js/vuex/Helpers.js ***!
  \**************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"expired\": () => (/* binding */ expired),\n/* harmony export */   \"modelContainsIncludes\": () => (/* binding */ modelContainsIncludes),\n/* harmony export */   \"reduce\": () => (/* binding */ reduce)\n/* harmony export */ });\n/* harmony import */ var _helpers_DateHelper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ~/helpers/DateHelper */ \"./resources/js/helpers/DateHelper.js\");\n/* harmony import */ var _helpers_ObjectHelper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ~/helpers/ObjectHelper */ \"./resources/js/helpers/ObjectHelper.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\n\n\nfunction modelContainsIncludes(model, includes) {\n  if (!model.hasOwnProperty('includes')) {\n    return false;\n  }\n  var containsAllIncludes = true;\n  includes.forEach(function (include) {\n    if (!model.includes.includes(include) || !containsAllIncludes) {\n      containsAllIncludes = false;\n    }\n  });\n  return containsAllIncludes;\n}\nfunction expired(model) {\n  if (model.hasOwnProperty('cache') && model.cache && model.cache.hasOwnProperty('expires_at')) {\n    return model.cache.expires_at > _helpers_DateHelper__WEBPACK_IMPORTED_MODULE_0__[\"default\"].unixTimestamp();\n  }\n  return true;\n}\nfunction reduce(_x, _x2, _x3) {\n  return _reduce.apply(this, arguments);\n}\nfunction _reduce() {\n  _reduce = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(model, dispatch, bindings) {\n    var ignore,\n      field,\n      dispatchName,\n      i,\n      _args = arguments;\n    return _regeneratorRuntime().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          ignore = _args.length > 3 && _args[3] !== undefined ? _args[3] : [];\n          _context.t0 = _regeneratorRuntime().keys(bindings);\n        case 2:\n          if ((_context.t1 = _context.t0()).done) {\n            _context.next = 22;\n            break;\n          }\n          field = _context.t1.value;\n          if (!bindings.hasOwnProperty(field)) {\n            _context.next = 20;\n            break;\n          }\n          dispatchName = bindings[field];\n          if (!(_helpers_ObjectHelper__WEBPACK_IMPORTED_MODULE_1__[\"default\"].isObject(model) && model.hasOwnProperty(field) && !ignore.includes(field))) {\n            _context.next = 20;\n            break;\n          }\n          if (!Array.isArray(model[field])) {\n            _context.next = 17;\n            break;\n          }\n          i = 0;\n        case 9:\n          if (!(i < model[field].length)) {\n            _context.next = 15;\n            break;\n          }\n          _context.next = 12;\n          return dispatch(dispatchName, model[field][i], {\n            root: true\n          });\n        case 12:\n          i++;\n          _context.next = 9;\n          break;\n        case 15:\n          _context.next = 19;\n          break;\n        case 17:\n          _context.next = 19;\n          return dispatch(dispatchName, model[field], {\n            root: true\n          });\n        case 19:\n          delete model[field];\n        case 20:\n          _context.next = 2;\n          break;\n        case 22:\n          return _context.abrupt(\"return\", model);\n        case 23:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee);\n  }));\n  return _reduce.apply(this, arguments);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QixLQUFBLE9BQUFELFNBQUE7QUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy92dWV4L0hlbHBlcnMuanM/N2Q0NSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGF0ZUhlbHBlciBmcm9tIFwifi9oZWxwZXJzL0RhdGVIZWxwZXJcIjtcbmltcG9ydCBPYmplY3RIZWxwZXIgZnJvbSBcIn4vaGVscGVycy9PYmplY3RIZWxwZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsQ29udGFpbnNJbmNsdWRlcyhtb2RlbCwgaW5jbHVkZXMpIHtcbiAgICBpZiAoIW1vZGVsLmhhc093blByb3BlcnR5KCdpbmNsdWRlcycpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgY29udGFpbnNBbGxJbmNsdWRlcyA9IHRydWU7XG5cbiAgICBpbmNsdWRlcy5mb3JFYWNoKGZ1bmN0aW9uIChpbmNsdWRlKSB7XG4gICAgICAgIGlmICghbW9kZWwuaW5jbHVkZXMuaW5jbHVkZXMoaW5jbHVkZSkgfHwgIWNvbnRhaW5zQWxsSW5jbHVkZXMpIHtcbiAgICAgICAgICAgIGNvbnRhaW5zQWxsSW5jbHVkZXMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gY29udGFpbnNBbGxJbmNsdWRlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGlyZWQobW9kZWwpIHtcbiAgICBpZiAobW9kZWwuaGFzT3duUHJvcGVydHkoJ2NhY2hlJykgJiYgbW9kZWwuY2FjaGUgJiYgbW9kZWwuY2FjaGUuaGFzT3duUHJvcGVydHkoJ2V4cGlyZXNfYXQnKSkge1xuICAgICAgICByZXR1cm4gbW9kZWwuY2FjaGUuZXhwaXJlc19hdCA+IERhdGVIZWxwZXIudW5peFRpbWVzdGFtcCgpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVkdWNlKG1vZGVsLCBkaXNwYXRjaCwgYmluZGluZ3MsIGlnbm9yZSA9IFtdKSB7XG4gICAgZm9yIChsZXQgZmllbGQgaW4gYmluZGluZ3MpIHtcbiAgICAgICAgaWYgKGJpbmRpbmdzLmhhc093blByb3BlcnR5KGZpZWxkKSkge1xuICAgICAgICAgICAgbGV0IGRpc3BhdGNoTmFtZSA9IGJpbmRpbmdzW2ZpZWxkXTtcbiAgICAgICAgICAgIGlmIChPYmplY3RIZWxwZXIuaXNPYmplY3QobW9kZWwpICYmIG1vZGVsLmhhc093blByb3BlcnR5KGZpZWxkKSAmJiAhaWdub3JlLmluY2x1ZGVzKGZpZWxkKSkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1vZGVsW2ZpZWxkXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2RlbFtmaWVsZF0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGRpc3BhdGNoKGRpc3BhdGNoTmFtZSwgbW9kZWxbZmllbGRdW2ldLCB7IHJvb3Q6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkaXNwYXRjaChkaXNwYXRjaE5hbWUsIG1vZGVsW2ZpZWxkXSwge3Jvb3Q6IHRydWV9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkZWxldGUgbW9kZWxbZmllbGRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsO1xufVxuIl0sIm5hbWVzIjpbIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJleHBvcnRzIiwiT3AiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd24iLCJoYXNPd25Qcm9wZXJ0eSIsImRlZmluZVByb3BlcnR5Iiwib2JqIiwia2V5IiwiZGVzYyIsInZhbHVlIiwiJFN5bWJvbCIsIlN5bWJvbCIsIml0ZXJhdG9yU3ltYm9sIiwiaXRlcmF0b3IiLCJhc3luY0l0ZXJhdG9yU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsInRvU3RyaW5nVGFnU3ltYm9sIiwidG9TdHJpbmdUYWciLCJkZWZpbmUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJlcnIiLCJ3cmFwIiwiaW5uZXJGbiIsIm91dGVyRm4iLCJzZWxmIiwidHJ5TG9jc0xpc3QiLCJwcm90b0dlbmVyYXRvciIsIkdlbmVyYXRvciIsImdlbmVyYXRvciIsImNyZWF0ZSIsImNvbnRleHQiLCJDb250ZXh0IiwibWFrZUludm9rZU1ldGhvZCIsInRyeUNhdGNoIiwiZm4iLCJhcmciLCJ0eXBlIiwiY2FsbCIsIkNvbnRpbnVlU2VudGluZWwiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiSXRlcmF0b3JQcm90b3R5cGUiLCJnZXRQcm90byIsImdldFByb3RvdHlwZU9mIiwiTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUiLCJ2YWx1ZXMiLCJHcCIsImRlZmluZUl0ZXJhdG9yTWV0aG9kcyIsImZvckVhY2giLCJtZXRob2QiLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwiaW52b2tlIiwicmVzb2x2ZSIsInJlamVjdCIsInJlY29yZCIsInJlc3VsdCIsIl90eXBlb2YiLCJfX2F3YWl0IiwidGhlbiIsInVud3JhcHBlZCIsImVycm9yIiwicHJldmlvdXNQcm9taXNlIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJzdGF0ZSIsIkVycm9yIiwiZG9uZVJlc3VsdCIsImRlbGVnYXRlIiwiZGVsZWdhdGVSZXN1bHQiLCJtYXliZUludm9rZURlbGVnYXRlIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJkb25lIiwibWV0aG9kTmFtZSIsInVuZGVmaW5lZCIsIlR5cGVFcnJvciIsImluZm8iLCJyZXN1bHROYW1lIiwibmV4dCIsIm5leHRMb2MiLCJwdXNoVHJ5RW50cnkiLCJsb2NzIiwiZW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsIml0ZXJhYmxlIiwiaXRlcmF0b3JNZXRob2QiLCJpc05hTiIsImxlbmd0aCIsImkiLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJnZW5GdW4iLCJjdG9yIiwiY29uc3RydWN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJpdGVyIiwia2V5cyIsInZhbCIsIm9iamVjdCIsInJldmVyc2UiLCJwb3AiLCJza2lwVGVtcFJlc2V0IiwicHJldiIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJvb3RSZWNvcmQiLCJydmFsIiwiZXhjZXB0aW9uIiwiaGFuZGxlIiwibG9jIiwiY2F1Z2h0IiwiaGFzQ2F0Y2giLCJoYXNGaW5hbGx5IiwiZmluYWxseUVudHJ5IiwiY29tcGxldGUiLCJmaW5pc2giLCJfY2F0Y2giLCJ0aHJvd24iLCJkZWxlZ2F0ZVlpZWxkIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiZ2VuIiwiX25leHQiLCJfdGhyb3ciLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3MiLCJhcmd1bWVudHMiLCJhcHBseSIsIkRhdGVIZWxwZXIiLCJPYmplY3RIZWxwZXIiLCJtb2RlbENvbnRhaW5zSW5jbHVkZXMiLCJtb2RlbCIsImluY2x1ZGVzIiwiY29udGFpbnNBbGxJbmNsdWRlcyIsImluY2x1ZGUiLCJleHBpcmVkIiwiY2FjaGUiLCJleHBpcmVzX2F0IiwidW5peFRpbWVzdGFtcCIsInJlZHVjZSIsIl94IiwiX3gyIiwiX3gzIiwiX3JlZHVjZSIsIl9jYWxsZWUiLCJkaXNwYXRjaCIsImJpbmRpbmdzIiwiaWdub3JlIiwiZmllbGQiLCJkaXNwYXRjaE5hbWUiLCJfYXJncyIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJ0MCIsInQxIiwiaXNPYmplY3QiLCJBcnJheSIsImlzQXJyYXkiLCJyb290Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/vuex/Helpers.js\n");

/***/ }),

/***/ "./resources/js/vuex/config.js":
/*!*************************************!*\
  !*** ./resources/js/vuex/config.js ***!
  \*************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex_persistedstate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuex-persistedstate */ \"./node_modules/vuex-persistedstate/dist/vuex-persistedstate.es.js\");\n/* harmony import */ var _modules_alert__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/alert */ \"./resources/js/vuex/modules/alert.js\");\n/* harmony import */ var _modules_auth__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/auth */ \"./resources/js/vuex/modules/auth.js\");\n/* harmony import */ var _domain_bookings_vuex_bookings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../domain/bookings/vuex/bookings */ \"./resources/js/domain/bookings/vuex/bookings.js\");\n/* harmony import */ var _domain_bookings_vuex_booking_cabins__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../domain/bookings/vuex/booking-cabins */ \"./resources/js/domain/bookings/vuex/booking-cabins.js\");\n/* harmony import */ var _domain_cruises_vuex_cruises__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../domain/cruises/vuex/cruises */ \"./resources/js/domain/cruises/vuex/cruises.js\");\n/* harmony import */ var _domain_cruises_vuex_cruise_cabins__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../domain/cruises/vuex/cruise-cabins */ \"./resources/js/domain/cruises/vuex/cruise-cabins.js\");\n/* harmony import */ var _domain_logs_vuex_logs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../domain/logs/vuex/logs */ \"./resources/js/domain/logs/vuex/logs.js\");\n/* harmony import */ var _domain_ancillaries_vuex_parking_options__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../domain/ancillaries/vuex/parking-options */ \"./resources/js/domain/ancillaries/vuex/parking-options.js\");\n/* harmony import */ var _domain_bookings_vuex_passengers__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../domain/bookings/vuex/passengers */ \"./resources/js/domain/bookings/vuex/passengers.js\");\n/* harmony import */ var _domain_permissions_vuex_permissions__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../domain/permissions/vuex/permissions */ \"./resources/js/domain/permissions/vuex/permissions.js\");\n/* harmony import */ var _domain_users_vuex_roles__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../domain/users/vuex/roles */ \"./resources/js/domain/users/vuex/roles.js\");\n/* harmony import */ var _domain_permissions_vuex_role_users__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../domain/permissions/vuex/role_users */ \"./resources/js/domain/permissions/vuex/role_users.js\");\n/* harmony import */ var _domain_ships_vuex_ships__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../domain/ships/vuex/ships */ \"./resources/js/domain/ships/vuex/ships.js\");\n/* harmony import */ var _modules_sidebar__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./modules/sidebar */ \"./resources/js/vuex/modules/sidebar.js\");\n/* harmony import */ var _domain_users_vuex_users__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../domain/users/vuex/users */ \"./resources/js/domain/users/vuex/users.js\");\n/* harmony import */ var _domain_Enquiries_vuex_enquiries__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../domain/Enquiries/vuex/enquiries */ \"./resources/js/domain/Enquiries/vuex/enquiries.js\");\n/* harmony import */ var _domain_enquiry_notes_vuex_enquiry_notes__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../domain/enquiry_notes/vuex/enquiry_notes */ \"./resources/js/domain/enquiry_notes/vuex/enquiry_notes.js\");\n/* harmony import */ var _domain_Enquiries_vuex_enquiry_brochures__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../domain/Enquiries/vuex/enquiry_brochures */ \"./resources/js/domain/Enquiries/vuex/enquiry_brochures.js\");\n/* harmony import */ var _domain_Enquiries_vuex_enquiry_brochure_enquiries__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../domain/Enquiries/vuex/enquiry_brochure_enquiries */ \"./resources/js/domain/Enquiries/vuex/enquiry_brochure_enquiries.js\");\n/* harmony import */ var _domain_mas_vuex_customers__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../domain/mas/vuex/customers */ \"./resources/js/domain/mas/vuex/customers.js\");\n/* harmony import */ var _domain_mas_vuex_settings__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../domain/mas/vuex/settings */ \"./resources/js/domain/mas/vuex/settings.js\");\n/* harmony import */ var _domain_ports_vuex_ports__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../domain/ports/vuex/ports */ \"./resources/js/domain/ports/vuex/ports.js\");\n/* harmony import */ var _domain_itinerary_vuex_itineraries__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../domain/itinerary/vuex/itineraries */ \"./resources/js/domain/itinerary/vuex/itineraries.js\");\n\n\n// Import Vuex modules\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n  modules: {\n    alert: _modules_alert__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n    auth: _modules_auth__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n    bookings: _domain_bookings_vuex_bookings__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n    bookingCabins: _domain_bookings_vuex_booking_cabins__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n    cruises: _domain_cruises_vuex_cruises__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n    cruiseCabins: _domain_cruises_vuex_cruise_cabins__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n    logs: _domain_logs_vuex_logs__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n    parkingOptions: _domain_ancillaries_vuex_parking_options__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n    passengers: _domain_bookings_vuex_passengers__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n    permissions: _domain_permissions_vuex_permissions__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n    roles: _domain_users_vuex_roles__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n    role_users: _domain_permissions_vuex_role_users__WEBPACK_IMPORTED_MODULE_12__[\"default\"],\n    ships: _domain_ships_vuex_ships__WEBPACK_IMPORTED_MODULE_13__[\"default\"],\n    sidebar: _modules_sidebar__WEBPACK_IMPORTED_MODULE_14__[\"default\"],\n    users: _domain_users_vuex_users__WEBPACK_IMPORTED_MODULE_15__[\"default\"],\n    enquiries: _domain_Enquiries_vuex_enquiries__WEBPACK_IMPORTED_MODULE_16__[\"default\"],\n    enquiry_notes: _domain_enquiry_notes_vuex_enquiry_notes__WEBPACK_IMPORTED_MODULE_17__[\"default\"],\n    enquiry_brochures: _domain_Enquiries_vuex_enquiry_brochures__WEBPACK_IMPORTED_MODULE_18__[\"default\"],\n    enquiry_brochure_enquiries: _domain_Enquiries_vuex_enquiry_brochure_enquiries__WEBPACK_IMPORTED_MODULE_19__[\"default\"],\n    customers: _domain_mas_vuex_customers__WEBPACK_IMPORTED_MODULE_20__[\"default\"],\n    settings: _domain_mas_vuex_settings__WEBPACK_IMPORTED_MODULE_21__[\"default\"],\n    ports: _domain_ports_vuex_ports__WEBPACK_IMPORTED_MODULE_22__[\"default\"],\n    itineraries: _domain_itinerary_vuex_itineraries__WEBPACK_IMPORTED_MODULE_23__[\"default\"]\n  },\n  plugins: [(0,vuex_persistedstate__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    storage: window.localStorage,\n    paths: ['auth', 'storeVersion']\n  })],\n  state: function state() {\n    return {\n      storeVersion: 1\n    };\n  },\n  getters: {\n    typeBindings: function typeBindings(state) {\n      return {\n        'booking': 'bookings',\n        'booked_cabin': 'bookingCabins',\n        'cruise': 'cruises',\n        'cruise-cabin': 'cruiseCabins',\n        'parking-option': 'parkingOptions',\n        'passenger': 'passengers',\n        'ship': 'ships',\n        'enquiries': 'enquiries',\n        'enquirynote': 'enquiry_notes',\n        'brochure': 'enquiry_brochures',\n        'brochureenquiry': 'enquiry_brochure_enquiries',\n        'user': 'users'\n      };\n    }\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvdnVleC9jb25maWcuanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUF1RDs7QUFFdkQ7QUFDb0M7QUFDRjtBQUNzQjtBQUNXO0FBQ2Y7QUFDWTtBQUNwQjtBQUM0QjtBQUNaO0FBQ0s7QUFDbEI7QUFDZTtBQUNmO0FBQ1A7QUFDTztBQUNZO0FBQ1c7QUFDSTtBQUNnQjtBQUNyQztBQUNDO0FBQ1A7QUFDZ0I7QUFFL0QsaUVBQWU7RUFDWHdCLE9BQU8sRUFBRTtJQUNMQyxLQUFLLEVBQUV4QixzREFBSztJQUNaeUIsSUFBSSxFQUFFeEIscURBQUk7SUFDVnlCLFFBQVEsRUFBRXhCLHNFQUFRO0lBQ2xCeUIsYUFBYSxFQUFFeEIsNEVBQWE7SUFDNUJ5QixPQUFPLEVBQUV4QixvRUFBTztJQUNoQnlCLFlBQVksRUFBRXhCLDBFQUFZO0lBQzFCeUIsSUFBSSxFQUFFeEIsOERBQUk7SUFDVnlCLGNBQWMsRUFBRXhCLGdGQUFjO0lBQzlCeUIsVUFBVSxFQUFFeEIsd0VBQVU7SUFDdEJ5QixXQUFXLEVBQUV4Qiw2RUFBVztJQUN4QnlCLEtBQUssRUFBRXhCLGlFQUFLO0lBQ1p5QixVQUFVLEVBQUV4Qiw0RUFBUztJQUNyQnlCLEtBQUssRUFBRXhCLGlFQUFLO0lBQ1p5QixPQUFPLEVBQUV4Qix5REFBTztJQUNoQnlCLEtBQUssRUFBRXhCLGlFQUFLO0lBQ1p5QixTQUFTLEVBQUV4Qix5RUFBUztJQUNwQnlCLGFBQWEsRUFBRXhCLGlGQUFZO0lBQzNCeUIsaUJBQWlCLEVBQUV4QixpRkFBZ0I7SUFDbkN5QiwwQkFBMEIsRUFBRXhCLDBGQUF3QjtJQUNwRHlCLFNBQVMsRUFBRXhCLG1FQUFTO0lBQ3BCeUIsUUFBUSxFQUFFeEIsa0VBQVc7SUFDckJ5QixLQUFLLEVBQUV4QixpRUFBSztJQUNaeUIsV0FBVyxFQUFFeEIsMkVBQVdBO0VBQzVCLENBQUM7RUFDRHlCLE9BQU8sRUFBRSxDQUNMaEQsK0RBQW9CLENBQUM7SUFDakJpRCxPQUFPLEVBQUVDLE1BQU0sQ0FBQ0MsWUFBWTtJQUM1QkMsS0FBSyxFQUFFLENBQ0gsTUFBTSxFQUNOLGNBQWM7RUFFdEIsQ0FBQyxDQUFDLENBQ0w7RUFDREMsS0FBSyxXQUFBQSxNQUFBLEVBQUc7SUFDSixPQUFPO01BQ0hDLFlBQVksRUFBRTtJQUNsQixDQUFDO0VBQ0wsQ0FBQztFQUNEQyxPQUFPLEVBQUU7SUFDTEMsWUFBWSxXQUFBQSxhQUFFSCxLQUFLLEVBQUU7TUFDakIsT0FBTztRQUNILFNBQVMsRUFBRSxVQUFVO1FBQ3JCLGNBQWMsRUFBRSxlQUFlO1FBQy9CLFFBQVEsRUFBRSxTQUFTO1FBQ25CLGNBQWMsRUFBRSxjQUFjO1FBQzlCLGdCQUFnQixFQUFFLGdCQUFnQjtRQUNsQyxXQUFXLEVBQUUsWUFBWTtRQUN6QixNQUFNLEVBQUUsT0FBTztRQUNmLFdBQVcsRUFBRSxXQUFXO1FBQ3hCLGFBQWEsRUFBRSxlQUFlO1FBQzlCLFVBQVUsRUFBRSxtQkFBbUI7UUFDL0IsaUJBQWlCLEVBQUUsNEJBQTRCO1FBQy9DLE1BQU0sRUFBRTtNQUNaLENBQUM7SUFDTDtFQUNKO0FBQ0osQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy92dWV4L2NvbmZpZy5qcz8zNmMxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVQZXJzaXN0ZWRTdGF0ZSBmcm9tIFwidnVleC1wZXJzaXN0ZWRzdGF0ZVwiO1xuXG4vLyBJbXBvcnQgVnVleCBtb2R1bGVzXG5pbXBvcnQgQWxlcnQgZnJvbSBcIi4vbW9kdWxlcy9hbGVydFwiO1xuaW1wb3J0IEF1dGggZnJvbSBcIi4vbW9kdWxlcy9hdXRoXCI7XG5pbXBvcnQgQm9va2luZ3MgZnJvbSBcIi4uL2RvbWFpbi9ib29raW5ncy92dWV4L2Jvb2tpbmdzXCI7XG5pbXBvcnQgQm9va2luZ0NhYmlucyBmcm9tIFwiLi4vZG9tYWluL2Jvb2tpbmdzL3Z1ZXgvYm9va2luZy1jYWJpbnNcIjtcbmltcG9ydCBDcnVpc2VzIGZyb20gXCIuLi9kb21haW4vY3J1aXNlcy92dWV4L2NydWlzZXNcIlxuaW1wb3J0IENydWlzZUNhYmlucyBmcm9tIFwiLi4vZG9tYWluL2NydWlzZXMvdnVleC9jcnVpc2UtY2FiaW5zXCI7XG5pbXBvcnQgTG9ncyBmcm9tIFwiLi4vZG9tYWluL2xvZ3MvdnVleC9sb2dzXCI7XG5pbXBvcnQgUGFya2luZ09wdGlvbnMgZnJvbSBcIi4uL2RvbWFpbi9hbmNpbGxhcmllcy92dWV4L3Bhcmtpbmctb3B0aW9uc1wiO1xuaW1wb3J0IFBhc3NlbmdlcnMgZnJvbSBcIi4uL2RvbWFpbi9ib29raW5ncy92dWV4L3Bhc3NlbmdlcnNcIjtcbmltcG9ydCBQZXJtaXNzaW9ucyBmcm9tIFwiLi4vZG9tYWluL3Blcm1pc3Npb25zL3Z1ZXgvcGVybWlzc2lvbnNcIjtcbmltcG9ydCBSb2xlcyBmcm9tIFwiLi4vZG9tYWluL3VzZXJzL3Z1ZXgvcm9sZXNcIjtcbmltcG9ydCBSb2xlVXNlcnMgZnJvbSBcIi4uL2RvbWFpbi9wZXJtaXNzaW9ucy92dWV4L3JvbGVfdXNlcnNcIjtcbmltcG9ydCBTaGlwcyBmcm9tIFwiLi4vZG9tYWluL3NoaXBzL3Z1ZXgvc2hpcHNcIjtcbmltcG9ydCBTaWRlYmFyIGZyb20gXCIuL21vZHVsZXMvc2lkZWJhclwiO1xuaW1wb3J0IFVzZXJzIGZyb20gXCIuLi9kb21haW4vdXNlcnMvdnVleC91c2Vyc1wiO1xuaW1wb3J0IEVucXVpcmllcyBmcm9tIFwiLi4vZG9tYWluL0VucXVpcmllcy92dWV4L2VucXVpcmllc1wiO1xuaW1wb3J0IEVucXVpcnlOb3RlcyBmcm9tIFwiLi4vZG9tYWluL2VucXVpcnlfbm90ZXMvdnVleC9lbnF1aXJ5X25vdGVzXCI7XG5pbXBvcnQgZW5xdWlyeUJyb2NodXJlcyBmcm9tIFwiLi4vZG9tYWluL0VucXVpcmllcy92dWV4L2VucXVpcnlfYnJvY2h1cmVzXCI7XG5pbXBvcnQgZW5xdWlyeUJyb2NodXJlRW5xdWlyaWVzIGZyb20gXCIuLi9kb21haW4vRW5xdWlyaWVzL3Z1ZXgvZW5xdWlyeV9icm9jaHVyZV9lbnF1aXJpZXNcIlxuaW1wb3J0IEN1c3RvbWVycyBmcm9tIFwiLi4vZG9tYWluL21hcy92dWV4L2N1c3RvbWVyc1wiO1xuaW1wb3J0IE1hc1NldHRpbmdzIGZyb20gXCIuLi9kb21haW4vbWFzL3Z1ZXgvc2V0dGluZ3NcIjtcbmltcG9ydCBQb3J0cyBmcm9tIFwiLi4vZG9tYWluL3BvcnRzL3Z1ZXgvcG9ydHNcIjtcbmltcG9ydCBJdGluZXJhcmllcyBmcm9tIFwiLi4vZG9tYWluL2l0aW5lcmFyeS92dWV4L2l0aW5lcmFyaWVzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBtb2R1bGVzOiB7XG4gICAgICAgIGFsZXJ0OiBBbGVydCxcbiAgICAgICAgYXV0aDogQXV0aCxcbiAgICAgICAgYm9va2luZ3M6IEJvb2tpbmdzLFxuICAgICAgICBib29raW5nQ2FiaW5zOiBCb29raW5nQ2FiaW5zLFxuICAgICAgICBjcnVpc2VzOiBDcnVpc2VzLFxuICAgICAgICBjcnVpc2VDYWJpbnM6IENydWlzZUNhYmlucyxcbiAgICAgICAgbG9nczogTG9ncyxcbiAgICAgICAgcGFya2luZ09wdGlvbnM6IFBhcmtpbmdPcHRpb25zLFxuICAgICAgICBwYXNzZW5nZXJzOiBQYXNzZW5nZXJzLFxuICAgICAgICBwZXJtaXNzaW9uczogUGVybWlzc2lvbnMsXG4gICAgICAgIHJvbGVzOiBSb2xlcyxcbiAgICAgICAgcm9sZV91c2VyczogUm9sZVVzZXJzLFxuICAgICAgICBzaGlwczogU2hpcHMsXG4gICAgICAgIHNpZGViYXI6IFNpZGViYXIsXG4gICAgICAgIHVzZXJzOiBVc2VycyxcbiAgICAgICAgZW5xdWlyaWVzOiBFbnF1aXJpZXMsXG4gICAgICAgIGVucXVpcnlfbm90ZXM6IEVucXVpcnlOb3RlcyxcbiAgICAgICAgZW5xdWlyeV9icm9jaHVyZXM6IGVucXVpcnlCcm9jaHVyZXMsXG4gICAgICAgIGVucXVpcnlfYnJvY2h1cmVfZW5xdWlyaWVzOiBlbnF1aXJ5QnJvY2h1cmVFbnF1aXJpZXMsXG4gICAgICAgIGN1c3RvbWVyczogQ3VzdG9tZXJzLFxuICAgICAgICBzZXR0aW5nczogTWFzU2V0dGluZ3MsXG4gICAgICAgIHBvcnRzOiBQb3J0cyxcbiAgICAgICAgaXRpbmVyYXJpZXM6IEl0aW5lcmFyaWVzLFxuICAgIH0sXG4gICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVQZXJzaXN0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBzdG9yYWdlOiB3aW5kb3cubG9jYWxTdG9yYWdlLFxuICAgICAgICAgICAgcGF0aHM6IFtcbiAgICAgICAgICAgICAgICAnYXV0aCcsXG4gICAgICAgICAgICAgICAgJ3N0b3JlVmVyc2lvbidcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSlcbiAgICBdLFxuICAgIHN0YXRlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RvcmVWZXJzaW9uOiAxLFxuICAgICAgICB9XG4gICAgfSxcbiAgICBnZXR0ZXJzOiB7XG4gICAgICAgIHR5cGVCaW5kaW5ncyAoc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgJ2Jvb2tpbmcnOiAnYm9va2luZ3MnLFxuICAgICAgICAgICAgICAgICdib29rZWRfY2FiaW4nOiAnYm9va2luZ0NhYmlucycsXG4gICAgICAgICAgICAgICAgJ2NydWlzZSc6ICdjcnVpc2VzJyxcbiAgICAgICAgICAgICAgICAnY3J1aXNlLWNhYmluJzogJ2NydWlzZUNhYmlucycsXG4gICAgICAgICAgICAgICAgJ3Bhcmtpbmctb3B0aW9uJzogJ3BhcmtpbmdPcHRpb25zJyxcbiAgICAgICAgICAgICAgICAncGFzc2VuZ2VyJzogJ3Bhc3NlbmdlcnMnLFxuICAgICAgICAgICAgICAgICdzaGlwJzogJ3NoaXBzJyxcbiAgICAgICAgICAgICAgICAnZW5xdWlyaWVzJzogJ2VucXVpcmllcycsXG4gICAgICAgICAgICAgICAgJ2VucXVpcnlub3RlJzogJ2VucXVpcnlfbm90ZXMnLFxuICAgICAgICAgICAgICAgICdicm9jaHVyZSc6ICdlbnF1aXJ5X2Jyb2NodXJlcycsXG4gICAgICAgICAgICAgICAgJ2Jyb2NodXJlZW5xdWlyeSc6ICdlbnF1aXJ5X2Jyb2NodXJlX2VucXVpcmllcycsXG4gICAgICAgICAgICAgICAgJ3VzZXInOiAndXNlcnMnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJjcmVhdGVQZXJzaXN0ZWRTdGF0ZSIsIkFsZXJ0IiwiQXV0aCIsIkJvb2tpbmdzIiwiQm9va2luZ0NhYmlucyIsIkNydWlzZXMiLCJDcnVpc2VDYWJpbnMiLCJMb2dzIiwiUGFya2luZ09wdGlvbnMiLCJQYXNzZW5nZXJzIiwiUGVybWlzc2lvbnMiLCJSb2xlcyIsIlJvbGVVc2VycyIsIlNoaXBzIiwiU2lkZWJhciIsIlVzZXJzIiwiRW5xdWlyaWVzIiwiRW5xdWlyeU5vdGVzIiwiZW5xdWlyeUJyb2NodXJlcyIsImVucXVpcnlCcm9jaHVyZUVucXVpcmllcyIsIkN1c3RvbWVycyIsIk1hc1NldHRpbmdzIiwiUG9ydHMiLCJJdGluZXJhcmllcyIsIm1vZHVsZXMiLCJhbGVydCIsImF1dGgiLCJib29raW5ncyIsImJvb2tpbmdDYWJpbnMiLCJjcnVpc2VzIiwiY3J1aXNlQ2FiaW5zIiwibG9ncyIsInBhcmtpbmdPcHRpb25zIiwicGFzc2VuZ2VycyIsInBlcm1pc3Npb25zIiwicm9sZXMiLCJyb2xlX3VzZXJzIiwic2hpcHMiLCJzaWRlYmFyIiwidXNlcnMiLCJlbnF1aXJpZXMiLCJlbnF1aXJ5X25vdGVzIiwiZW5xdWlyeV9icm9jaHVyZXMiLCJlbnF1aXJ5X2Jyb2NodXJlX2VucXVpcmllcyIsImN1c3RvbWVycyIsInNldHRpbmdzIiwicG9ydHMiLCJpdGluZXJhcmllcyIsInBsdWdpbnMiLCJzdG9yYWdlIiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwicGF0aHMiLCJzdGF0ZSIsInN0b3JlVmVyc2lvbiIsImdldHRlcnMiLCJ0eXBlQmluZGluZ3MiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/vuex/config.js\n");

/***/ }),

/***/ "./resources/js/vuex/index.js":
/*!************************************!*\
  !*** ./resources/js/vuex/index.js ***!
  \************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"store\": () => (/* binding */ store)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm-bundler.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./config */ \"./resources/js/vuex/config.js\");\n\n\nvar store = (0,vuex__WEBPACK_IMPORTED_MODULE_1__.createStore)(_config__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvdnVleC9pbmRleC5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBbUM7QUFDTDtBQUV2QixJQUFNRSxLQUFLLEdBQUdGLGlEQUFXLENBQUNDLCtDQUFNLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvdnVleC9pbmRleC5qcz9mNjZkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVN0b3JlIH0gZnJvbSAndnVleCc7XG5pbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnJztcblxuZXhwb3J0IGNvbnN0IHN0b3JlID0gY3JlYXRlU3RvcmUoY29uZmlnKTtcbiJdLCJuYW1lcyI6WyJjcmVhdGVTdG9yZSIsImNvbmZpZyIsInN0b3JlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/vuex/index.js\n");

/***/ }),

/***/ "./resources/js/vuex/modules/alert.js":
/*!********************************************!*\
  !*** ./resources/js/vuex/modules/alert.js ***!
  \********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n  namespaced: true,\n  state: {\n    variant: null,\n    message: null,\n    show: false\n  },\n  mutations: {\n    setAlert: function setAlert(state, _ref) {\n      var variant = _ref.variant,\n        message = _ref.message;\n      state.variant = variant;\n      state.message = message;\n      state.show = true;\n    },\n    setDangerAlert: function setDangerAlert(state, message) {\n      state.variant = 'danger';\n      state.message = message;\n      state.show = true;\n    },\n    setWarningAlert: function setWarningAlert(state, message) {\n      state.variant = 'warning';\n      state.message = message;\n      state.show = true;\n    },\n    setInfoAlert: function setInfoAlert(state, message) {\n      state.variant = 'info';\n      state.message = message;\n      state.show = true;\n    },\n    setSuccessAlert: function setSuccessAlert(state, message) {\n      state.variant = 'success';\n      state.message = message;\n      state.show = true;\n    },\n    clearAlert: function clearAlert(state) {\n      state.variant = null;\n      state.message = null;\n      state.show = false;\n    }\n  },\n  getters: {\n    getAlert: function getAlert(state) {\n      return state;\n    },\n    getType: function getType(state) {\n      return state.variant;\n    },\n    getMessage: function getMessage(state) {\n      return state.message;\n    },\n    getShow: function getShow(state) {\n      return state.show;\n    }\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvdnVleC9tb2R1bGVzL2FsZXJ0LmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQSxpRUFBZTtFQUNYQSxVQUFVLEVBQUUsSUFBSTtFQUNoQkMsS0FBSyxFQUFFO0lBQ0hDLE9BQU8sRUFBRSxJQUFJO0lBQ2JDLE9BQU8sRUFBRSxJQUFJO0lBQ2JDLElBQUksRUFBRTtFQUNWLENBQUM7RUFDREMsU0FBUyxFQUFFO0lBQ1BDLFFBQVEsV0FBQUEsU0FBQ0wsS0FBSyxFQUFBTSxJQUFBLEVBQXdCO01BQUEsSUFBcEJMLE9BQU8sR0FBQUssSUFBQSxDQUFQTCxPQUFPO1FBQUVDLE9BQU8sR0FBQUksSUFBQSxDQUFQSixPQUFPO01BQzlCRixLQUFLLENBQUNDLE9BQU8sR0FBR0EsT0FBTztNQUN2QkQsS0FBSyxDQUFDRSxPQUFPLEdBQUdBLE9BQU87TUFDdkJGLEtBQUssQ0FBQ0csSUFBSSxHQUFHLElBQUk7SUFDckIsQ0FBQztJQUVESSxjQUFjLFdBQUFBLGVBQUNQLEtBQUssRUFBRUUsT0FBTyxFQUFFO01BQzNCRixLQUFLLENBQUNDLE9BQU8sR0FBRyxRQUFRO01BQ3hCRCxLQUFLLENBQUNFLE9BQU8sR0FBR0EsT0FBTztNQUN2QkYsS0FBSyxDQUFDRyxJQUFJLEdBQUcsSUFBSTtJQUNyQixDQUFDO0lBRURLLGVBQWUsV0FBQUEsZ0JBQUNSLEtBQUssRUFBRUUsT0FBTyxFQUFFO01BQzVCRixLQUFLLENBQUNDLE9BQU8sR0FBRyxTQUFTO01BQ3pCRCxLQUFLLENBQUNFLE9BQU8sR0FBR0EsT0FBTztNQUN2QkYsS0FBSyxDQUFDRyxJQUFJLEdBQUcsSUFBSTtJQUNyQixDQUFDO0lBRURNLFlBQVksV0FBQUEsYUFBQ1QsS0FBSyxFQUFFRSxPQUFPLEVBQUU7TUFDekJGLEtBQUssQ0FBQ0MsT0FBTyxHQUFHLE1BQU07TUFDdEJELEtBQUssQ0FBQ0UsT0FBTyxHQUFHQSxPQUFPO01BQ3ZCRixLQUFLLENBQUNHLElBQUksR0FBRyxJQUFJO0lBQ3JCLENBQUM7SUFFRE8sZUFBZSxXQUFBQSxnQkFBQ1YsS0FBSyxFQUFFRSxPQUFPLEVBQUU7TUFDNUJGLEtBQUssQ0FBQ0MsT0FBTyxHQUFHLFNBQVM7TUFDekJELEtBQUssQ0FBQ0UsT0FBTyxHQUFHQSxPQUFPO01BQ3ZCRixLQUFLLENBQUNHLElBQUksR0FBRyxJQUFJO0lBQ3JCLENBQUM7SUFFRFEsVUFBVSxXQUFBQSxXQUFDWCxLQUFLLEVBQUU7TUFDZEEsS0FBSyxDQUFDQyxPQUFPLEdBQUcsSUFBSTtNQUNwQkQsS0FBSyxDQUFDRSxPQUFPLEdBQUcsSUFBSTtNQUNwQkYsS0FBSyxDQUFDRyxJQUFJLEdBQUcsS0FBSztJQUN0QjtFQUNKLENBQUM7RUFDRFMsT0FBTyxFQUFFO0lBQ0xDLFFBQVEsV0FBQUEsU0FBQ2IsS0FBSyxFQUFFO01BQ1osT0FBT0EsS0FBSztJQUNoQixDQUFDO0lBRURjLE9BQU8sV0FBQUEsUUFBQ2QsS0FBSyxFQUFFO01BQ1gsT0FBT0EsS0FBSyxDQUFDQyxPQUFPO0lBQ3hCLENBQUM7SUFFRGMsVUFBVSxXQUFBQSxXQUFDZixLQUFLLEVBQUU7TUFDZCxPQUFPQSxLQUFLLENBQUNFLE9BQU87SUFDeEIsQ0FBQztJQUVEYyxPQUFPLFdBQUFBLFFBQUNoQixLQUFLLEVBQUU7TUFDWCxPQUFPQSxLQUFLLENBQUNHLElBQUk7SUFDckI7RUFDSjtBQUNKLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvdnVleC9tb2R1bGVzL2FsZXJ0LmpzPzFhODQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWVzcGFjZWQ6IHRydWUsXG4gICAgc3RhdGU6IHtcbiAgICAgICAgdmFyaWFudDogbnVsbCxcbiAgICAgICAgbWVzc2FnZTogbnVsbCxcbiAgICAgICAgc2hvdzogZmFsc2VcbiAgICB9LFxuICAgIG11dGF0aW9uczoge1xuICAgICAgICBzZXRBbGVydChzdGF0ZSwgeyB2YXJpYW50LCBtZXNzYWdlIH0pIHtcbiAgICAgICAgICAgIHN0YXRlLnZhcmlhbnQgPSB2YXJpYW50O1xuICAgICAgICAgICAgc3RhdGUubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgICAgICBzdGF0ZS5zaG93ID0gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXREYW5nZXJBbGVydChzdGF0ZSwgbWVzc2FnZSkge1xuICAgICAgICAgICAgc3RhdGUudmFyaWFudCA9ICdkYW5nZXInO1xuICAgICAgICAgICAgc3RhdGUubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgICAgICBzdGF0ZS5zaG93ID0gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXRXYXJuaW5nQWxlcnQoc3RhdGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHN0YXRlLnZhcmlhbnQgPSAnd2FybmluZyc7XG4gICAgICAgICAgICBzdGF0ZS5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgICAgIHN0YXRlLnNob3cgPSB0cnVlO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldEluZm9BbGVydChzdGF0ZSwgbWVzc2FnZSkge1xuICAgICAgICAgICAgc3RhdGUudmFyaWFudCA9ICdpbmZvJztcbiAgICAgICAgICAgIHN0YXRlLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICAgICAgc3RhdGUuc2hvdyA9IHRydWU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0U3VjY2Vzc0FsZXJ0KHN0YXRlLCBtZXNzYWdlKSB7XG4gICAgICAgICAgICBzdGF0ZS52YXJpYW50ID0gJ3N1Y2Nlc3MnO1xuICAgICAgICAgICAgc3RhdGUubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgICAgICBzdGF0ZS5zaG93ID0gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBjbGVhckFsZXJ0KHN0YXRlKSB7XG4gICAgICAgICAgICBzdGF0ZS52YXJpYW50ID0gbnVsbDtcbiAgICAgICAgICAgIHN0YXRlLm1lc3NhZ2UgPSBudWxsO1xuICAgICAgICAgICAgc3RhdGUuc2hvdyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBnZXR0ZXJzOiB7XG4gICAgICAgIGdldEFsZXJ0KHN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0VHlwZShzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnZhcmlhbnQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0TWVzc2FnZShzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLm1lc3NhZ2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0U2hvdyhzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnNob3c7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibmFtZXMiOlsibmFtZXNwYWNlZCIsInN0YXRlIiwidmFyaWFudCIsIm1lc3NhZ2UiLCJzaG93IiwibXV0YXRpb25zIiwic2V0QWxlcnQiLCJfcmVmIiwic2V0RGFuZ2VyQWxlcnQiLCJzZXRXYXJuaW5nQWxlcnQiLCJzZXRJbmZvQWxlcnQiLCJzZXRTdWNjZXNzQWxlcnQiLCJjbGVhckFsZXJ0IiwiZ2V0dGVycyIsImdldEFsZXJ0IiwiZ2V0VHlwZSIsImdldE1lc3NhZ2UiLCJnZXRTaG93Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/vuex/modules/alert.js\n");

/***/ }),

/***/ "./resources/js/vuex/modules/auth.js":
/*!*******************************************!*\
  !*** ./resources/js/vuex/modules/auth.js ***!
  \*******************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\nvar counter = 0;\nfunction checkPermission(permission, usersPermissions) {\n  return usersPermissions.some(function (userPermission) {\n    if (userPermission.endsWith('.*')) {\n      return permission.startsWith(userPermission.slice(0, -1));\n    }\n    return permission === userPermission;\n  });\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n  namespaced: true,\n  state: {\n    loggedIn: false,\n    user: null,\n    token: null,\n    permissions: null\n  },\n  getters: {\n    user: function user(state) {\n      return state.user;\n    },\n    loggedIn: function loggedIn(state) {\n      return state.loggedIn;\n    },\n    token: function token(state) {\n      return state.token;\n    },\n    getAccessToken: function getAccessToken(state) {\n      if (state.token != null) {\n        return state.token.access_token;\n      }\n      return '';\n    },\n    getUserName: function getUserName(state) {\n      if (state.user && state.user.hasOwnProperty('name')) {\n        return state.user.name;\n      }\n      return '';\n    },\n    getUserEmail: function getUserEmail(state) {\n      if (state.user && state.user.hasOwnProperty('email')) {\n        return state.user.email;\n      }\n      return '';\n    },\n    getUserId: function getUserId(state) {\n      if (state.user && state.user.hasOwnProperty('id')) {\n        return state.user.id;\n      }\n      return '';\n    },\n    getPermissions: function getPermissions(state) {\n      return state.permissions;\n    },\n    userHasOnePermission: function userHasOnePermission(state) {\n      return function (permissionsRequired) {\n        if (permissionsRequired === undefined) {\n          return false;\n        }\n        return permissionsRequired.some(function (permission) {\n          return checkPermission(permission, state.permissions);\n        });\n      };\n    },\n    userHasAllPermissions: function userHasAllPermissions(state) {\n      return function (permissionsRequired) {\n        if (permissionsRequired === undefined) {\n          return false;\n        }\n        return permissionsRequired.every(function (permission) {\n          return checkPermission(permission, state.permissions);\n        });\n      };\n    }\n  },\n  mutations: {\n    setIsLoggedIn: function setIsLoggedIn(state) {\n      state.loggedIn = true;\n    },\n    setIsLoggedOut: function setIsLoggedOut(state) {\n      state.loggedOut = false;\n    },\n    setToken: function setToken(state, token) {\n      token.expires_at = token.expires_in * 1000 + Date.now();\n      state.token = token;\n    },\n    setUser: function setUser(state, user) {\n      state.user = user.attributes;\n      state.user.id = user.id;\n    },\n    reset: function reset(state) {\n      state.loggedIn = false;\n      state.token = null;\n      state.user = null;\n    },\n    setPermissions: function setPermissions(state, permissions) {\n      state.permissions = [];\n      permissions.forEach(function (permission) {\n        if (!state.permissions.includes(permission)) {\n          state.permissions.push(permission);\n        }\n      });\n    }\n  },\n  actions: {\n    authorize: function authorize(_ref, _ref2) {\n      var _this = this;\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {\n        var commit, responseType, clientId, _ref2$redirectUri, redirectUri, _ref2$scope, scope, _ref2$state, state, data;\n        return _regeneratorRuntime().wrap(function _callee$(_context) {\n          while (1) switch (_context.prev = _context.next) {\n            case 0:\n              commit = _ref.commit;\n              responseType = _ref2.responseType, clientId = _ref2.clientId, _ref2$redirectUri = _ref2.redirectUri, redirectUri = _ref2$redirectUri === void 0 ? null : _ref2$redirectUri, _ref2$scope = _ref2.scope, scope = _ref2$scope === void 0 ? null : _ref2$scope, _ref2$state = _ref2.state, state = _ref2$state === void 0 ? null : _ref2$state;\n              data = {\n                response_type: responseType,\n                client_id: clientId,\n                redirect_uri: redirectUri,\n                scope: scope,\n                state: state\n              };\n              if (redirectUri) {\n                data.redirect_uri = redirectUri;\n              }\n              if (scope) {\n                data.scope = scope;\n              }\n              if (state) {\n                data.state = state;\n              }\n              _context.next = 8;\n              return _this.axios.get('/oauth/authorize', {\n                params: data\n              });\n            case 8:\n              return _context.abrupt(\"return\", _context.sent);\n            case 9:\n            case \"end\":\n              return _context.stop();\n          }\n        }, _callee);\n      }))();\n    },\n    approveAuthorize: function approveAuthorize(_ref3, _ref4) {\n      var _this2 = this;\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {\n        var commit, clientId, _ref4$state, state, data;\n        return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n          while (1) switch (_context2.prev = _context2.next) {\n            case 0:\n              commit = _ref3.commit;\n              clientId = _ref4.clientId, _ref4$state = _ref4.state, state = _ref4$state === void 0 ? null : _ref4$state;\n              data = {\n                client_id: clientId,\n                state: state\n              };\n              if (state) {\n                data.state = state;\n              }\n              _context2.next = 6;\n              return _this2.axios.post('/oauth/authorize', data);\n            case 6:\n              return _context2.abrupt(\"return\", _context2.sent);\n            case 7:\n            case \"end\":\n              return _context2.stop();\n          }\n        }, _callee2);\n      }))();\n    },\n    login: function login(_ref5, _ref6) {\n      var _this3 = this;\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {\n        var commit, username, password, _ref6$googleCode, googleCode, _ref6$shownBarcode, shownBarcode, formData;\n        return _regeneratorRuntime().wrap(function _callee3$(_context3) {\n          while (1) switch (_context3.prev = _context3.next) {\n            case 0:\n              commit = _ref5.commit;\n              username = _ref6.username, password = _ref6.password, _ref6$googleCode = _ref6.googleCode, googleCode = _ref6$googleCode === void 0 ? null : _ref6$googleCode, _ref6$shownBarcode = _ref6.shownBarcode, shownBarcode = _ref6$shownBarcode === void 0 ? false : _ref6$shownBarcode;\n              formData = new FormData();\n              formData.append('username', username);\n              formData.append('password', password);\n              if (googleCode) {\n                formData.append('googleCode', googleCode);\n              }\n              if (shownBarcode) {\n                formData.append('shownBarcode', shownBarcode);\n              }\n              _context3.next = 9;\n              return _this3.axios.post('/oauth/token', formData)[\"catch\"](function (error) {\n                if (error.response && error.response.status != 400) {\n                  return Promise.reject(error);\n                }\n                return error;\n              });\n            case 9:\n              return _context3.abrupt(\"return\", _context3.sent);\n            case 10:\n            case \"end\":\n              return _context3.stop();\n          }\n        }, _callee3);\n      }))();\n    },\n    refresh: function refresh(_ref7) {\n      var _this4 = this;\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {\n        var commit, getters, dispatch, formData, returnResponse;\n        return _regeneratorRuntime().wrap(function _callee4$(_context4) {\n          while (1) switch (_context4.prev = _context4.next) {\n            case 0:\n              commit = _ref7.commit, getters = _ref7.getters, dispatch = _ref7.dispatch;\n              formData = new FormData();\n              formData.append('refresh_token', getters['token'].refresh_token);\n              _context4.next = 5;\n              return _this4.axios.post('/oauth/token/refresh', formData)[\"catch\"](function (error) {\n                if (error.response && error.response.status != 401) {\n                  return Promise.reject(error);\n                }\n                return error;\n              });\n            case 5:\n              returnResponse = _context4.sent;\n              if (!(returnResponse.status == 200)) {\n                _context4.next = 10;\n                break;\n              }\n              commit('setToken', returnResponse.data);\n              commit('setIsLoggedIn');\n              return _context4.abrupt(\"return\", true);\n            case 10:\n              localStorage.clear();\n              window.location.href = '/manage';\n              return _context4.abrupt(\"return\", false);\n            case 13:\n            case \"end\":\n              return _context4.stop();\n          }\n        }, _callee4);\n      }))();\n    },\n    setUser: function setUser(_ref8) {\n      var _this5 = this;\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {\n        var commit, dispatch, response;\n        return _regeneratorRuntime().wrap(function _callee5$(_context5) {\n          while (1) switch (_context5.prev = _context5.next) {\n            case 0:\n              commit = _ref8.commit, dispatch = _ref8.dispatch;\n              _context5.next = 3;\n              return _this5.axios.get('/api/users/current', {\n                params: {\n                  fieldset: 'currentuser'\n                }\n              });\n            case 3:\n              response = _context5.sent;\n              if (!(response.status == 200)) {\n                _context5.next = 10;\n                break;\n              }\n              commit('setUser', response.data.data);\n              commit('setPermissions', response.data.data.attributes.permissions);\n              _context5.next = 9;\n              return dispatch('setLegacySession');\n            case 9:\n              return _context5.abrupt(\"return\", true);\n            case 10:\n              localStorage.clear();\n              window.location.href = '/';\n              return _context5.abrupt(\"return\", true);\n            case 13:\n            case \"end\":\n              return _context5.stop();\n          }\n        }, _callee5);\n      }))();\n    },\n    setLegacySession: function setLegacySession(_ref9) {\n      var _this6 = this;\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {\n        var state;\n        return _regeneratorRuntime().wrap(function _callee6$(_context6) {\n          while (1) switch (_context6.prev = _context6.next) {\n            case 0:\n              state = _ref9.state;\n              _context6.next = 3;\n              return _this6.axios.post('/admin/session')[\"catch\"](function (error) {\n                if (error.response && error.response.status != 403) {\n                  return Promise.reject(error);\n                }\n                localStorage.clear();\n                window.location.href = '/';\n                return true;\n              });\n            case 3:\n              return _context6.abrupt(\"return\", _context6.sent);\n            case 6:\n              localStorage.clear();\n              window.location.href = '/';\n              return _context6.abrupt(\"return\", true);\n            case 9:\n            case \"end\":\n              return _context6.stop();\n          }\n        }, _callee6);\n      }))();\n    },\n    tokenIsExpired: function tokenIsExpired(_ref10) {\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {\n        var state;\n        return _regeneratorRuntime().wrap(function _callee7$(_context7) {\n          while (1) switch (_context7.prev = _context7.next) {\n            case 0:\n              state = _ref10.state;\n              if (!(state.token === null)) {\n                _context7.next = 3;\n                break;\n              }\n              return _context7.abrupt(\"return\", true);\n            case 3:\n              return _context7.abrupt(\"return\", Promise.resolve(!(state.token.constructor === Object && state.token.hasOwnProperty('expires_at') && state.token.expires_at > Date.now())));\n            case 4:\n            case \"end\":\n              return _context7.stop();\n          }\n        }, _callee7);\n      }))();\n    },\n    logout: function logout() {\n      var _this7 = this;\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {\n        return _regeneratorRuntime().wrap(function _callee8$(_context8) {\n          while (1) switch (_context8.prev = _context8.next) {\n            case 0:\n              _context8.next = 2;\n              return _this7.axios.get('/api/logout');\n            case 2:\n              _context8.next = 4;\n              return _this7.axios[\"delete\"]('/admin/session');\n            case 4:\n            case \"end\":\n              return _context8.stop();\n          }\n        }, _callee8);\n      }))();\n    }\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFBLENBQUE1TCxJQUFBO2NBQUEsT0FDN0J5TCxNQUFJLENBQUM5RCxLQUFLLFVBQU8sQ0FBQyxnQkFBZ0IsQ0FBQztZQUFBO1lBQUE7Y0FBQSxPQUFBaUUsU0FBQSxDQUFBbkosSUFBQTtVQUFBO1FBQUEsR0FBQWlKLFFBQUE7TUFBQTtJQUM3QztFQUNKO0FBQ0osQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy92dWV4L21vZHVsZXMvYXV0aC5qcz9iYjc3Il0sInNvdXJjZXNDb250ZW50IjpbImxldCBjb3VudGVyID0gMDtcblxuZnVuY3Rpb24gY2hlY2tQZXJtaXNzaW9uKHBlcm1pc3Npb24sIHVzZXJzUGVybWlzc2lvbnMpIHtcbiAgICByZXR1cm4gdXNlcnNQZXJtaXNzaW9ucy5zb21lKHVzZXJQZXJtaXNzaW9uID0+IHtcblxuICAgICAgICBpZiAodXNlclBlcm1pc3Npb24uZW5kc1dpdGgoJy4qJykpIHtcbiAgICAgICAgICAgIHJldHVybiAocGVybWlzc2lvbi5zdGFydHNXaXRoKHVzZXJQZXJtaXNzaW9uLnNsaWNlKDAsIC0xKSkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChwZXJtaXNzaW9uID09PSB1c2VyUGVybWlzc2lvbik7XG4gICAgfSk7XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWVzcGFjZWQ6IHRydWUsXG5cbiAgICBzdGF0ZToge1xuICAgICAgICBsb2dnZWRJbjogZmFsc2UsXG4gICAgICAgIHVzZXI6IG51bGwsXG4gICAgICAgIHRva2VuOiBudWxsLFxuICAgICAgICBwZXJtaXNzaW9uczogbnVsbFxuICAgIH0sXG5cbiAgICBnZXR0ZXJzOiB7XG4gICAgICAgIHVzZXIoc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS51c2VyO1xuICAgICAgICB9LFxuXG4gICAgICAgIGxvZ2dlZEluKHN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUubG9nZ2VkSW47XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9rZW4oc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbjtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRBY2Nlc3NUb2tlbihzdGF0ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnRva2VuICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW4uYWNjZXNzX3Rva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldFVzZXJOYW1lKHN0YXRlKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUudXNlciAmJiBzdGF0ZS51c2VyLmhhc093blByb3BlcnR5KCduYW1lJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUudXNlci5uYW1lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0VXNlckVtYWlsKHN0YXRlKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUudXNlciAmJiBzdGF0ZS51c2VyLmhhc093blByb3BlcnR5KCdlbWFpbCcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnVzZXIuZW1haWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRVc2VySWQoc3RhdGUpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS51c2VyICYmIHN0YXRlLnVzZXIuaGFzT3duUHJvcGVydHkoJ2lkJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUudXNlci5pZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldFBlcm1pc3Npb25zKHN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUucGVybWlzc2lvbnM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXNlckhhc09uZVBlcm1pc3Npb246IChzdGF0ZSkgPT4gKHBlcm1pc3Npb25zUmVxdWlyZWQpID0+IHtcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uc1JlcXVpcmVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwZXJtaXNzaW9uc1JlcXVpcmVkLnNvbWUocGVybWlzc2lvbiA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrUGVybWlzc2lvbihwZXJtaXNzaW9uLCBzdGF0ZS5wZXJtaXNzaW9ucyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICB1c2VySGFzQWxsUGVybWlzc2lvbnM6IChzdGF0ZSkgPT4gKHBlcm1pc3Npb25zUmVxdWlyZWQpID0+IHtcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uc1JlcXVpcmVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwZXJtaXNzaW9uc1JlcXVpcmVkLmV2ZXJ5KHBlcm1pc3Npb24gPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGVja1Blcm1pc3Npb24ocGVybWlzc2lvbiwgc3RhdGUucGVybWlzc2lvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgbXV0YXRpb25zOiB7XG4gICAgICAgIHNldElzTG9nZ2VkSW4oc3RhdGUpIHtcbiAgICAgICAgICAgIHN0YXRlLmxvZ2dlZEluID0gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXRJc0xvZ2dlZE91dChzdGF0ZSkge1xuICAgICAgICAgICAgc3RhdGUubG9nZ2VkT3V0ID0gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0VG9rZW4oc3RhdGUsIHRva2VuKSB7XG4gICAgICAgICAgICB0b2tlbi5leHBpcmVzX2F0ID0gdG9rZW4uZXhwaXJlc19pbioxMDAwICsgRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHN0YXRlLnRva2VuID0gdG9rZW47XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0VXNlcihzdGF0ZSwgdXNlcikge1xuICAgICAgICAgICAgc3RhdGUudXNlciA9IHVzZXIuYXR0cmlidXRlcztcbiAgICAgICAgICAgIHN0YXRlLnVzZXIuaWQgPSB1c2VyLmlkO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlc2V0KHN0YXRlKSB7XG4gICAgICAgICAgICBzdGF0ZS5sb2dnZWRJbiA9IGZhbHNlO1xuICAgICAgICAgICAgc3RhdGUudG9rZW4gPSBudWxsO1xuICAgICAgICAgICAgc3RhdGUudXNlciA9IG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0UGVybWlzc2lvbnMoc3RhdGUsIHBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICBzdGF0ZS5wZXJtaXNzaW9ucyA9IFtdO1xuICAgICAgICAgICAgcGVybWlzc2lvbnMuZm9yRWFjaCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc3RhdGUucGVybWlzc2lvbnMuaW5jbHVkZXMocGVybWlzc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUucGVybWlzc2lvbnMucHVzaChwZXJtaXNzaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBhY3Rpb25zOiB7XG4gICAgICAgIGFzeW5jIGF1dGhvcml6ZSh7IGNvbW1pdCB9LCB7IHJlc3BvbnNlVHlwZSwgY2xpZW50SWQsIHJlZGlyZWN0VXJpID0gbnVsbCwgc2NvcGUgPSBudWxsLCBzdGF0ZSA9IG51bGwgfSkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VfdHlwZTogcmVzcG9uc2VUeXBlLFxuICAgICAgICAgICAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXG4gICAgICAgICAgICAgICAgcmVkaXJlY3RfdXJpOiByZWRpcmVjdFVyaSxcbiAgICAgICAgICAgICAgICBzY29wZTogc2NvcGUsXG4gICAgICAgICAgICAgICAgc3RhdGU6IHN0YXRlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAocmVkaXJlY3RVcmkpIHtcbiAgICAgICAgICAgICAgICBkYXRhLnJlZGlyZWN0X3VyaSA9IHJlZGlyZWN0VXJpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNjb3BlKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5zY29wZSA9IHNjb3BlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5heGlvcy5nZXQoJy9vYXV0aC9hdXRob3JpemUnLCB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiBkYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBhcHByb3ZlQXV0aG9yaXplKHsgY29tbWl0IH0sIHsgY2xpZW50SWQsIHN0YXRlID0gbnVsbCB9KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IGNsaWVudElkLFxuICAgICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5heGlvcy5wb3N0KCcvb2F1dGgvYXV0aG9yaXplJywgZGF0YSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgbG9naW4oeyBjb21taXQgfSwgeyB1c2VybmFtZSwgcGFzc3dvcmQsIGdvb2dsZUNvZGUgPSBudWxsLCBzaG93bkJhcmNvZGUgPSBmYWxzZSB9KSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCd1c2VybmFtZScsIHVzZXJuYW1lKTtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgncGFzc3dvcmQnLCBwYXNzd29yZCk7XG5cbiAgICAgICAgICAgIGlmIChnb29nbGVDb2RlKSB7XG4gICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdnb29nbGVDb2RlJywgZ29vZ2xlQ29kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hvd25CYXJjb2RlKSB7XG4gICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdzaG93bkJhcmNvZGUnLCBzaG93bkJhcmNvZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5heGlvcy5wb3N0KCcvb2F1dGgvdG9rZW4nLCBmb3JtRGF0YSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnJlc3BvbnNlICYmIGVycm9yLnJlc3BvbnNlLnN0YXR1cyAhPSA0MDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgcmVmcmVzaCh7IGNvbW1pdCwgZ2V0dGVycywgZGlzcGF0Y2ggfSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgncmVmcmVzaF90b2tlbicsIGdldHRlcnNbJ3Rva2VuJ10ucmVmcmVzaF90b2tlbik7XG4gICAgICAgICAgICBsZXQgcmV0dXJuUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF4aW9zLnBvc3QoJy9vYXV0aC90b2tlbi9yZWZyZXNoJywgZm9ybURhdGEpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5yZXNwb25zZSAmJiBlcnJvci5yZXNwb25zZS5zdGF0dXMgIT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAocmV0dXJuUmVzcG9uc2Uuc3RhdHVzID09IDIwMCkge1xuICAgICAgICAgICAgICAgIGNvbW1pdCgnc2V0VG9rZW4nLCByZXR1cm5SZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgICAgICBjb21taXQoJ3NldElzTG9nZ2VkSW4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbWFuYWdlJztcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBzZXRVc2VyKHsgY29tbWl0LCBkaXNwYXRjaCB9KSB7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF4aW9zLmdldCgnL2FwaS91c2Vycy9jdXJyZW50Jywge1xuICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZHNldDogJ2N1cnJlbnR1c2VyJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDIwMCkge1xuICAgICAgICAgICAgICAgIGNvbW1pdCgnc2V0VXNlcicsIHJlc3BvbnNlLmRhdGEuZGF0YSk7XG4gICAgICAgICAgICAgICAgY29tbWl0KCdzZXRQZXJtaXNzaW9ucycsIHJlc3BvbnNlLmRhdGEuZGF0YS5hdHRyaWJ1dGVzLnBlcm1pc3Npb25zKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkaXNwYXRjaCgnc2V0TGVnYWN5U2Vzc2lvbicpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cblxuXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy8nO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgc2V0TGVnYWN5U2Vzc2lvbih7c3RhdGV9KSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5heGlvcy5wb3N0KCcvYWRtaW4vc2Vzc2lvbicpLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5yZXNwb25zZSAmJiBlcnJvci5yZXNwb25zZS5zdGF0dXMgIT0gNDAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnLyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvJztcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHRva2VuSXNFeHBpcmVkKHtzdGF0ZX0pIHtcblxuICAgICAgICAgICAgaWYgKHN0YXRlLnRva2VuID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoIShcbiAgICAgICAgICAgICAgICBzdGF0ZS50b2tlbi5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0ICYmXG4gICAgICAgICAgICAgICAgc3RhdGUudG9rZW4uaGFzT3duUHJvcGVydHkoJ2V4cGlyZXNfYXQnKSAmJlxuICAgICAgICAgICAgICAgIHN0YXRlLnRva2VuLmV4cGlyZXNfYXQgPiBEYXRlLm5vdygpKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgbG9nb3V0KCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5heGlvcy5nZXQoJy9hcGkvbG9nb3V0Jyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmF4aW9zLmRlbGV0ZSgnL2FkbWluL3Nlc3Npb24nKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJfcmVnZW5lcmF0b3JSdW50aW1lIiwiZXhwb3J0cyIsIk9wIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duIiwiaGFzT3duUHJvcGVydHkiLCJkZWZpbmVQcm9wZXJ0eSIsIm9iaiIsImtleSIsImRlc2MiLCJ2YWx1ZSIsIiRTeW1ib2wiLCJTeW1ib2wiLCJpdGVyYXRvclN5bWJvbCIsIml0ZXJhdG9yIiwiYXN5bmNJdGVyYXRvclN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJ0b1N0cmluZ1RhZ1N5bWJvbCIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiZXJyIiwid3JhcCIsImlubmVyRm4iLCJvdXRlckZuIiwic2VsZiIsInRyeUxvY3NMaXN0IiwicHJvdG9HZW5lcmF0b3IiLCJHZW5lcmF0b3IiLCJnZW5lcmF0b3IiLCJjcmVhdGUiLCJjb250ZXh0IiwiQ29udGV4dCIsIm1ha2VJbnZva2VNZXRob2QiLCJ0cnlDYXRjaCIsImZuIiwiYXJnIiwidHlwZSIsImNhbGwiLCJDb250aW51ZVNlbnRpbmVsIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsIkl0ZXJhdG9yUHJvdG90eXBlIiwiZ2V0UHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwidmFsdWVzIiwiR3AiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwibWV0aG9kIiwiX2ludm9rZSIsIkFzeW5jSXRlcmF0b3IiLCJQcm9taXNlSW1wbCIsImludm9rZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZWNvcmQiLCJyZXN1bHQiLCJfdHlwZW9mIiwiX19hd2FpdCIsInRoZW4iLCJ1bndyYXBwZWQiLCJlcnJvciIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwic3RhdGUiLCJFcnJvciIsImRvbmVSZXN1bHQiLCJkZWxlZ2F0ZSIsImRlbGVnYXRlUmVzdWx0IiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwiZG9uZSIsIm1ldGhvZE5hbWUiLCJ1bmRlZmluZWQiLCJUeXBlRXJyb3IiLCJpbmZvIiwicmVzdWx0TmFtZSIsIm5leHQiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwibG9jcyIsImVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicHVzaCIsInJlc2V0VHJ5RW50cnkiLCJjb21wbGV0aW9uIiwicmVzZXQiLCJpdGVyYWJsZSIsIml0ZXJhdG9yTWV0aG9kIiwiaXNOYU4iLCJsZW5ndGgiLCJpIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiZ2VuRnVuIiwiY3RvciIsImNvbnN0cnVjdG9yIiwibmFtZSIsIm1hcmsiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImF3cmFwIiwiYXN5bmMiLCJQcm9taXNlIiwiaXRlciIsImtleXMiLCJ2YWwiLCJvYmplY3QiLCJyZXZlcnNlIiwicG9wIiwic2tpcFRlbXBSZXNldCIsInByZXYiLCJjaGFyQXQiLCJzbGljZSIsInN0b3AiLCJyb290UmVjb3JkIiwicnZhbCIsImV4Y2VwdGlvbiIsImhhbmRsZSIsImxvYyIsImNhdWdodCIsImhhc0NhdGNoIiwiaGFzRmluYWxseSIsImZpbmFsbHlFbnRyeSIsImNvbXBsZXRlIiwiZmluaXNoIiwiX2NhdGNoIiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsImFzeW5jR2VuZXJhdG9yU3RlcCIsImdlbiIsIl9uZXh0IiwiX3Rocm93IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmdzIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJjb3VudGVyIiwiY2hlY2tQZXJtaXNzaW9uIiwicGVybWlzc2lvbiIsInVzZXJzUGVybWlzc2lvbnMiLCJzb21lIiwidXNlclBlcm1pc3Npb24iLCJlbmRzV2l0aCIsInN0YXJ0c1dpdGgiLCJuYW1lc3BhY2VkIiwibG9nZ2VkSW4iLCJ1c2VyIiwidG9rZW4iLCJwZXJtaXNzaW9ucyIsImdldHRlcnMiLCJnZXRBY2Nlc3NUb2tlbiIsImFjY2Vzc190b2tlbiIsImdldFVzZXJOYW1lIiwiZ2V0VXNlckVtYWlsIiwiZW1haWwiLCJnZXRVc2VySWQiLCJpZCIsImdldFBlcm1pc3Npb25zIiwidXNlckhhc09uZVBlcm1pc3Npb24iLCJwZXJtaXNzaW9uc1JlcXVpcmVkIiwidXNlckhhc0FsbFBlcm1pc3Npb25zIiwiZXZlcnkiLCJtdXRhdGlvbnMiLCJzZXRJc0xvZ2dlZEluIiwic2V0SXNMb2dnZWRPdXQiLCJsb2dnZWRPdXQiLCJzZXRUb2tlbiIsImV4cGlyZXNfYXQiLCJleHBpcmVzX2luIiwiRGF0ZSIsIm5vdyIsInNldFVzZXIiLCJhdHRyaWJ1dGVzIiwic2V0UGVybWlzc2lvbnMiLCJpbmNsdWRlcyIsImFjdGlvbnMiLCJhdXRob3JpemUiLCJfcmVmIiwiX3JlZjIiLCJfdGhpcyIsIl9jYWxsZWUiLCJjb21taXQiLCJyZXNwb25zZVR5cGUiLCJjbGllbnRJZCIsIl9yZWYyJHJlZGlyZWN0VXJpIiwicmVkaXJlY3RVcmkiLCJfcmVmMiRzY29wZSIsInNjb3BlIiwiX3JlZjIkc3RhdGUiLCJkYXRhIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInJlc3BvbnNlX3R5cGUiLCJjbGllbnRfaWQiLCJyZWRpcmVjdF91cmkiLCJheGlvcyIsImdldCIsInBhcmFtcyIsImFwcHJvdmVBdXRob3JpemUiLCJfcmVmMyIsIl9yZWY0IiwiX3RoaXMyIiwiX2NhbGxlZTIiLCJfcmVmNCRzdGF0ZSIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsInBvc3QiLCJsb2dpbiIsIl9yZWY1IiwiX3JlZjYiLCJfdGhpczMiLCJfY2FsbGVlMyIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJfcmVmNiRnb29nbGVDb2RlIiwiZ29vZ2xlQ29kZSIsIl9yZWY2JHNob3duQmFyY29kZSIsInNob3duQmFyY29kZSIsImZvcm1EYXRhIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiRm9ybURhdGEiLCJhcHBlbmQiLCJyZXNwb25zZSIsInN0YXR1cyIsInJlZnJlc2giLCJfcmVmNyIsIl90aGlzNCIsIl9jYWxsZWU0IiwiZGlzcGF0Y2giLCJyZXR1cm5SZXNwb25zZSIsIl9jYWxsZWU0JCIsIl9jb250ZXh0NCIsInJlZnJlc2hfdG9rZW4iLCJsb2NhbFN0b3JhZ2UiLCJjbGVhciIsIndpbmRvdyIsImxvY2F0aW9uIiwiaHJlZiIsIl9yZWY4IiwiX3RoaXM1IiwiX2NhbGxlZTUiLCJfY2FsbGVlNSQiLCJfY29udGV4dDUiLCJmaWVsZHNldCIsInNldExlZ2FjeVNlc3Npb24iLCJfcmVmOSIsIl90aGlzNiIsIl9jYWxsZWU2IiwiX2NhbGxlZTYkIiwiX2NvbnRleHQ2IiwidG9rZW5Jc0V4cGlyZWQiLCJfcmVmMTAiLCJfY2FsbGVlNyIsIl9jYWxsZWU3JCIsIl9jb250ZXh0NyIsImxvZ291dCIsIl90aGlzNyIsIl9jYWxsZWU4IiwiX2NhbGxlZTgkIiwiX2NvbnRleHQ4Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/vuex/modules/auth.js\n");

/***/ }),

/***/ "./resources/js/vuex/modules/base-module.js":
/*!**************************************************!*\
  !*** ./resources/js/vuex/modules/base-module.js ***!
  \**************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Helpers */ \"./resources/js/vuex/Helpers.js\");\n/* harmony import */ var _helpers_ObjectHelper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../helpers/ObjectHelper */ \"./resources/js/helpers/ObjectHelper.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\nvar baseModule = {\n  namespaced: true,\n  state: function state() {\n    return {\n      all: {},\n      pagination: {\n        last_page: 0,\n        path: '',\n        per_page: 10,\n        total: 0\n      },\n      searchPagination: {\n        last_page: 0,\n        path: '',\n        per_page: 10,\n        total: 0\n      },\n      endpoints: {\n        all: '',\n        fieldIsUnique: 'fieldIsUnique',\n        search: 'search',\n        update: 'update'\n      },\n      enums: {},\n      primaryKey: 'id',\n      moduleBindings: {},\n      ignore: ['pagination', 'includes', 'cache', 'translations', 'pivot'],\n      invalidUniqueFields: []\n    };\n  },\n  mutations: {\n    set: function set(state, data) {\n      if (!data.attributes) return;\n      var objectData = data.attributes;\n      objectData.id = data.id;\n      var current = state.all[objectData.id];\n      if (current !== undefined && current !== null) {\n        var currentCopy = _helpers_ObjectHelper__WEBPACK_IMPORTED_MODULE_1__[\"default\"].cleanClone(current);\n        var dataCopy = _helpers_ObjectHelper__WEBPACK_IMPORTED_MODULE_1__[\"default\"].cleanClone(objectData);\n        delete currentCopy.dirty;\n        delete dataCopy.dirty;\n        delete currentCopy.cache;\n        delete dataCopy.cache;\n        if (_helpers_ObjectHelper__WEBPACK_IMPORTED_MODULE_1__[\"default\"].compareObjects(dataCopy, currentCopy)) {\n          return;\n        }\n        objectData.dirty = true;\n      } else {\n        objectData.dirty = false;\n      }\n      state.all[objectData.id] = objectData;\n    },\n    addInvalidUniqueField: function addInvalidUniqueField(state, field) {\n      state.invalidUniqueFields[state.invalidUniqueFields.length] = field;\n    },\n    resetInvalidUniqueFields: function resetInvalidUniqueFields(state) {\n      state.invalidUniqueFields = [];\n    },\n    \"delete\": function _delete(state, id) {\n      delete state.all.id;\n    },\n    pagination: function pagination(state, data) {\n      state.pagination = _objectSpread({}, data);\n    },\n    searchPagination: function searchPagination(state, data) {\n      state.searchPagination = _objectSpread({}, data);\n    },\n    all: function all(state, date) {\n      state.all = data;\n    },\n    allClean: function allClean(state, getters) {\n      return getters['pagination'].total === getters['allValues'].length && getters['allValues'].filter(function (elem) {\n        return elem.dirty === false;\n      }).length === getters['pagination'].total;\n    },\n    clearSearchPagination: function clearSearchPagination(state) {\n      stat.searchPagination = {\n        last_page: 0,\n        path: '',\n        per_page: 10,\n        total: 0\n      };\n    },\n    setRelationData: function setRelationData(state, data) {\n      if (state.all[data.localId].relationships === undefined) {\n        state.all[data.localId].relationships = {};\n      }\n      if (state.all[data.localId].relationships[data.relationship] === undefined) {\n        state.all[data.localId].relationships[data.relationship] = [data.relatedObject];\n      } else if (Array.isArray(state.all[data.localId].relationships[data.relationship])) {\n        state.all[data.localId].relationships[data.relationship].push(data.relatedObject);\n      }\n    }\n  },\n  getters: {\n    exists: function exists(state) {\n      return function (primaryKey) {\n        return state.all.hasOwnProperty(primaryKey);\n      };\n    },\n    get: function get(state) {\n      return function (id) {\n        return state.all[id];\n      };\n    },\n    endpoints: function endpoints(state) {\n      return function (key) {\n        return state.endpoints[key];\n      };\n    },\n    all: function all(state) {\n      return state.all;\n    },\n    allValues: function allValues(state) {\n      return Object.values(state.all);\n    },\n    byName: function byName(state, getters) {\n      return function (name) {\n        return getters['allValues'].find(function (element) {\n          return element.name.toLowerCase() === name.toLowerCase();\n        });\n      };\n    },\n    invalidUniqueFields: function invalidUniqueFields(state) {\n      return state.invalidUniqueFields;\n    },\n    modelUrl: function modelUrl(state, getters) {\n      return function (id) {\n        return getters['endpoints']('all') + '/' + id;\n      };\n    },\n    pagination: function pagination(state) {\n      return state.pagination;\n    },\n    searchPagination: function searchPagination(state) {\n      return state.searchPagination;\n    },\n    page: function page(state) {\n      return function (pageNumber) {\n        return Object.values(state.all).filter(function (element) {\n          return ![null, undefined].includes(element) && element.hasOwnProperty('pagination') && element.pagination.hasOwnProperty('page') && element.pagination.page === pageNumber;\n        }).sort(function (a, b) {\n          return b.position - a.position;\n        });\n      };\n    },\n    primaryKey: function primaryKey(state) {\n      return state.primaryKey;\n    },\n    allClean: function allClean(state, getters) {\n      return getters['allValues'].every(function (elem) {\n        return elem.dirty === false;\n      });\n    },\n    pageClean: function pageClean(state, getters) {\n      return function (page) {\n        return getters['page'](page).every(function (elem) {\n          return elem.dirty === false;\n        });\n      };\n    },\n    allLocal: function allLocal(state, getters) {\n      return getters['allValues'].length === getters['pagination'].total;\n    },\n    allIncludes: function allIncludes(state, getters) {\n      return function (includes) {\n        return getters['allValues'].every(function (elem) {\n          if (!elem.hasOwnProperty('includes')) {\n            return false;\n          }\n          if (includes.length === 0) {\n            return true;\n          }\n          return includes.every(function (include) {\n            return elem.includes.includes(include);\n          });\n        });\n      };\n    },\n    pageIncludes: function pageIncludes(state, getters) {\n      return function (page, includes) {\n        return getters['page'](page).every(function (elem) {\n          if (!elem.hasOwnProperty('includes')) {\n            return false;\n          }\n          if (includes.length === 0) {\n            return true;\n          }\n          return includes.every(function (include) {\n            return elem.includes.includes(include);\n          });\n        });\n      };\n    },\n    empty: function empty(state, getters) {\n      return getters['allValues'].length === 0;\n    }\n  },\n  actions: {\n    clearAll: function clearAll(_ref) {\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {\n        var commit, dispatch, getters, state, rootGetters;\n        return _regeneratorRuntime().wrap(function _callee$(_context) {\n          while (1) switch (_context.prev = _context.next) {\n            case 0:\n              commit = _ref.commit, dispatch = _ref.dispatch, getters = _ref.getters, state = _ref.state, rootGetters = _ref.rootGetters;\n              state.all = {};\n            case 2:\n            case \"end\":\n              return _context.stop();\n          }\n        }, _callee);\n      }))();\n    },\n    getAll: function getAll(_ref2) {\n      var _arguments = arguments,\n        _this = this;\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {\n        var commit, dispatch, getters, state, rootGetters, data, params, endpoint, filter, response, i, relatedObject, relatedObjectModule, _i;\n        return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n          while (1) switch (_context2.prev = _context2.next) {\n            case 0:\n              commit = _ref2.commit, dispatch = _ref2.dispatch, getters = _ref2.getters, state = _ref2.state, rootGetters = _ref2.rootGetters;\n              data = _arguments.length > 1 && _arguments[1] !== undefined ? _arguments[1] : {};\n              params = {};\n              params.page = -1;\n              endpoint = getters['endpoints']('all');\n              if (data.hasOwnProperty('endpoint')) {\n                endpoint = data.endpoint;\n              }\n              if (data.hasOwnProperty('page')) {\n                params.page = data.page;\n              }\n              if (data.hasOwnProperty('includes')) {\n                params.includes = data.includes;\n              }\n              if (data.hasOwnProperty('fieldset')) {\n                params.fieldset = data.fieldset;\n              }\n              if (data.hasOwnProperty('filters')) {\n                for (filter in data.filters) {\n                  if (data.filters.hasOwnProperty(filter)) {\n                    params[\"filter[\" + filter + \"]\"] = data.filters[filter];\n                  }\n                }\n              }\n              _context2.next = 12;\n              return _this.axios.get(endpoint, {\n                params: params\n              });\n            case 12:\n              response = _context2.sent;\n              if (!(response.status === 200)) {\n                _context2.next = 34;\n                break;\n              }\n              if (response.data.meta != undefined && response.data.meta.pagination != undefined) {\n                commit('pagination', response.data.meta.pagination);\n              }\n              if (!(response.data.included != undefined)) {\n                _context2.next = 26;\n                break;\n              }\n              i = 0;\n            case 17:\n              if (!(i < response.data.included.length)) {\n                _context2.next = 26;\n                break;\n              }\n              relatedObject = response.data.included[i];\n              relatedObjectModule = rootGetters.typeBindings[relatedObject.type];\n              if (!(relatedObjectModule != undefined)) {\n                _context2.next = 23;\n                break;\n              }\n              _context2.next = 23;\n              return commit(relatedObjectModule + '/set', response.data.included[i], {\n                root: true\n              });\n            case 23:\n              i++;\n              _context2.next = 17;\n              break;\n            case 26:\n              _i = 0;\n            case 27:\n              if (!(_i < response.data.data.length)) {\n                _context2.next = 33;\n                break;\n              }\n              _context2.next = 30;\n              return dispatch('set', response.data.data[_i]);\n            case 30:\n              _i++;\n              _context2.next = 27;\n              break;\n            case 33:\n              return _context2.abrupt(\"return\", true);\n            case 34:\n              return _context2.abrupt(\"return\", false);\n            case 35:\n            case \"end\":\n              return _context2.stop();\n          }\n        }, _callee2);\n      }))();\n    },\n    get: function get(_ref3, data) {\n      var _this2 = this;\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {\n        var commit, dispatch, getters, state, rootGetters, id, includes, response, i, relatedObject, relatedObjectModule, model;\n        return _regeneratorRuntime().wrap(function _callee3$(_context3) {\n          while (1) switch (_context3.prev = _context3.next) {\n            case 0:\n              commit = _ref3.commit, dispatch = _ref3.dispatch, getters = _ref3.getters, state = _ref3.state, rootGetters = _ref3.rootGetters;\n              includes = [];\n              if (!(typeof data == 'string' || typeof data == 'number')) {\n                _context3.next = 6;\n                break;\n              }\n              id = data;\n              _context3.next = 12;\n              break;\n            case 6:\n              if (!data.hasOwnProperty(state.primaryKey)) {\n                _context3.next = 11;\n                break;\n              }\n              id = data[state.primaryKey];\n              if (data.hasOwnProperty('includes')) {\n                includes = data.includes;\n              }\n              _context3.next = 12;\n              break;\n            case 11:\n              return _context3.abrupt(\"return\", false);\n            case 12:\n              if (!getters['exists'](id)) {\n                _context3.next = 15;\n                break;\n              }\n              if (!((0,_Helpers__WEBPACK_IMPORTED_MODULE_0__.modelContainsIncludes)(getters['get'](id), includes) && !(0,_Helpers__WEBPACK_IMPORTED_MODULE_0__.expired)(getters['get'](id)))) {\n                _context3.next = 15;\n                break;\n              }\n              return _context3.abrupt(\"return\", getters['get'](id));\n            case 15:\n              _context3.next = 17;\n              return _this2.axios.get(getters['endpoints']('all') + '/' + id, {\n                params: {\n                  includes: includes\n                }\n              });\n            case 17:\n              response = _context3.sent;\n              if (!(response.status === 200)) {\n                _context3.next = 34;\n                break;\n              }\n              if (!(response.data.included != undefined)) {\n                _context3.next = 30;\n                break;\n              }\n              i = 0;\n            case 21:\n              if (!(i < response.data.included.length)) {\n                _context3.next = 30;\n                break;\n              }\n              relatedObject = response.data.included[i];\n              relatedObjectModule = rootGetters.typeBindings[relatedObject.type];\n              if (!(relatedObjectModule != undefined)) {\n                _context3.next = 27;\n                break;\n              }\n              _context3.next = 27;\n              return commit(relatedObjectModule + '/set', response.data.included[i], {\n                root: true\n              });\n            case 27:\n              i++;\n              _context3.next = 21;\n              break;\n            case 30:\n              model = response.data.data;\n              _context3.next = 33;\n              return dispatch('set', model);\n            case 33:\n              return _context3.abrupt(\"return\", true);\n            case 34:\n              return _context3.abrupt(\"return\", false);\n            case 35:\n            case \"end\":\n              return _context3.stop();\n          }\n        }, _callee3);\n      }))();\n    },\n    set: function set(_ref4, data) {\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {\n        var dispatch, commit, state, rootGetters, rootState, relationship, relationData, i, relatedObjectModule;\n        return _regeneratorRuntime().wrap(function _callee4$(_context4) {\n          while (1) switch (_context4.prev = _context4.next) {\n            case 0:\n              dispatch = _ref4.dispatch, commit = _ref4.commit, state = _ref4.state, rootGetters = _ref4.rootGetters, rootState = _ref4.rootState;\n              _context4.next = 3;\n              return commit('set', data);\n            case 3:\n              if (!data.hasOwnProperty('relationships')) {\n                _context4.next = 19;\n                break;\n              }\n              _context4.t0 = _regeneratorRuntime().keys(data.relationships);\n            case 5:\n              if ((_context4.t1 = _context4.t0()).done) {\n                _context4.next = 19;\n                break;\n              }\n              relationship = _context4.t1.value;\n              if (!data.relationships.hasOwnProperty(relationship)) {\n                _context4.next = 17;\n                break;\n              }\n              relationData = data.relationships[relationship];\n              i = 0;\n            case 10:\n              if (!(i < relationData.length)) {\n                _context4.next = 17;\n                break;\n              }\n              relatedObjectModule = rootGetters.typeBindings[relationData[i].type];\n              _context4.next = 14;\n              return commit('setRelationData', {\n                localId: data.id,\n                relatedObject: rootState[relatedObjectModule]['all'][relationData[i].id],\n                relationship: relationship,\n                relatedId: relationData[i].id\n              });\n            case 14:\n              i++;\n              _context4.next = 10;\n              break;\n            case 17:\n              _context4.next = 5;\n              break;\n            case 19:\n            case \"end\":\n              return _context4.stop();\n          }\n        }, _callee4);\n      }))();\n    },\n    update: function update(_ref5, data) {\n      var _this3 = this;\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {\n        var dispatch, getters, state, endpoint, response;\n        return _regeneratorRuntime().wrap(function _callee5$(_context5) {\n          while (1) switch (_context5.prev = _context5.next) {\n            case 0:\n              dispatch = _ref5.dispatch, getters = _ref5.getters, state = _ref5.state;\n              endpoint = getters['modelUrl'](data[state.primaryKey]);\n              if (data.includes) {\n                data.includes = data.includes.join(',');\n              }\n              _context5.next = 5;\n              return _this3.axios.put(endpoint, data);\n            case 5:\n              response = _context5.sent;\n              if (!(response.status === 200)) {\n                _context5.next = 10;\n                break;\n              }\n              _context5.next = 9;\n              return dispatch('set', response.data);\n            case 9:\n              return _context5.abrupt(\"return\", _context5.sent);\n            case 10:\n              return _context5.abrupt(\"return\", false);\n            case 11:\n            case \"end\":\n              return _context5.stop();\n          }\n        }, _callee5);\n      }))();\n    },\n    update2: function update2(_ref6, data) {\n      var _this4 = this;\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {\n        var dispatch, commit, getters, response;\n        return _regeneratorRuntime().wrap(function _callee6$(_context6) {\n          while (1) switch (_context6.prev = _context6.next) {\n            case 0:\n              dispatch = _ref6.dispatch, commit = _ref6.commit, getters = _ref6.getters;\n              _context6.next = 3;\n              return _this4.axios.put(getters['endpoints']('update'), data);\n            case 3:\n              response = _context6.sent;\n              if (!(response.status === 200)) {\n                _context6.next = 8;\n                break;\n              }\n              _context6.next = 7;\n              return dispatch('set', response.data);\n            case 7:\n              return _context6.abrupt(\"return\", _context6.sent);\n            case 8:\n              return _context6.abrupt(\"return\", false);\n            case 9:\n            case \"end\":\n              return _context6.stop();\n          }\n        }, _callee6);\n      }))();\n    },\n    create: function create(_ref7, data) {\n      var _this5 = this;\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {\n        var dispatch, getters, state, endpoint, response;\n        return _regeneratorRuntime().wrap(function _callee7$(_context7) {\n          while (1) switch (_context7.prev = _context7.next) {\n            case 0:\n              dispatch = _ref7.dispatch, getters = _ref7.getters, state = _ref7.state;\n              endpoint = getters['endpoints']('all');\n              if (data.includes) {\n                data.includes = data.includes.join(',');\n              }\n              _context7.next = 5;\n              return _this5.axios.post(endpoint, data);\n            case 5:\n              response = _context7.sent;\n              if (!(response.status === 201)) {\n                _context7.next = 10;\n                break;\n              }\n              _context7.next = 9;\n              return dispatch('set', response.data);\n            case 9:\n              return _context7.abrupt(\"return\", _context7.sent);\n            case 10:\n              return _context7.abrupt(\"return\", false);\n            case 11:\n            case \"end\":\n              return _context7.stop();\n          }\n        }, _callee7);\n      }))();\n    },\n    \"delete\": function _delete(_ref8, id) {\n      var _this6 = this;\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {\n        var commit, getters, state, endpoint, response;\n        return _regeneratorRuntime().wrap(function _callee8$(_context8) {\n          while (1) switch (_context8.prev = _context8.next) {\n            case 0:\n              commit = _ref8.commit, getters = _ref8.getters, state = _ref8.state;\n              endpoint = getters['modelUrl'](id);\n              _context8.next = 4;\n              return _this6.axios[\"delete\"](endpoint);\n            case 4:\n              response = _context8.sent;\n              if (!(response.status === 200 || response.status === 409)) {\n                _context8.next = 8;\n                break;\n              }\n              commit('delete', id);\n              return _context8.abrupt(\"return\", true);\n            case 8:\n              return _context8.abrupt(\"return\", false);\n            case 9:\n            case \"end\":\n              return _context8.stop();\n          }\n        }, _callee8);\n      }))();\n    },\n    fieldIsUnique: function fieldIsUnique(_ref9, data) {\n      var _this7 = this;\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {\n        var commit, state, getters, response;\n        return _regeneratorRuntime().wrap(function _callee9$(_context9) {\n          while (1) switch (_context9.prev = _context9.next) {\n            case 0:\n              commit = _ref9.commit, state = _ref9.state, getters = _ref9.getters;\n              _context9.next = 3;\n              return _this7.axios.post(getters['endpoints']('all') + '/' + getters['endpoints']('fieldIsUnique'), data);\n            case 3:\n              response = _context9.sent;\n              return _context9.abrupt(\"return\", response.status === 200);\n            case 5:\n            case \"end\":\n              return _context9.stop();\n          }\n        }, _callee9);\n      }))();\n    },\n    refresh: function refresh(_ref10, data) {\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {\n        var dispatch, commit, state;\n        return _regeneratorRuntime().wrap(function _callee10$(_context10) {\n          while (1) switch (_context10.prev = _context10.next) {\n            case 0:\n              dispatch = _ref10.dispatch, commit = _ref10.commit, state = _ref10.state;\n              commit('delete', data[state.primaryKey]);\n              _context10.next = 4;\n              return dispatch('get', data);\n            case 4:\n              return _context10.abrupt(\"return\", _context10.sent);\n            case 5:\n            case \"end\":\n              return _context10.stop();\n          }\n        }, _callee10);\n      }))();\n    },\n    byName: function byName(_ref11, name) {\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11() {\n        var dispatch, commit, getters;\n        return _regeneratorRuntime().wrap(function _callee11$(_context11) {\n          while (1) switch (_context11.prev = _context11.next) {\n            case 0:\n              dispatch = _ref11.dispatch, commit = _ref11.commit, getters = _ref11.getters;\n              if (!(getters['byName'](name) === undefined)) {\n                _context11.next = 4;\n                break;\n              }\n              _context11.next = 4;\n              return dispatch('getAll', {\n                page: -1\n              });\n            case 4:\n              return _context11.abrupt(\"return\", getters['byName'](name));\n            case 5:\n            case \"end\":\n              return _context11.stop();\n          }\n        }, _callee11);\n      }))();\n    },\n    search: function search(_ref12, _ref13) {\n      var _this8 = this;\n      return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12() {\n        var dispatch, commit, getters, term, includes, page, _ref13$perPage, perPage, response, reducedData, i;\n        return _regeneratorRuntime().wrap(function _callee12$(_context12) {\n          while (1) switch (_context12.prev = _context12.next) {\n            case 0:\n              dispatch = _ref12.dispatch, commit = _ref12.commit, getters = _ref12.getters;\n              term = _ref13.term, includes = _ref13.includes, page = _ref13.page, _ref13$perPage = _ref13.perPage, perPage = _ref13$perPage === void 0 ? 10 : _ref13$perPage;\n              _context12.next = 4;\n              return _this8.axios.get(getters['endpoints']('search'), {\n                params: {\n                  term: term,\n                  includes: includes,\n                  page: page,\n                  perPage: perPage\n                }\n              });\n            case 4:\n              response = _context12.sent;\n              if (!(response.status === 200)) {\n                _context12.next = 19;\n                break;\n              }\n              commit('searchPagination', response.data.meta);\n              reducedData = [];\n              i = 0;\n            case 9:\n              if (!(i < response.data.data.length)) {\n                _context12.next = 18;\n                break;\n              }\n              _context12.t0 = reducedData;\n              _context12.next = 13;\n              return dispatch('set', response.data.data[i]);\n            case 13:\n              _context12.t1 = _context12.sent;\n              _context12.t0.push.call(_context12.t0, _context12.t1);\n            case 15:\n              i++;\n              _context12.next = 9;\n              break;\n            case 18:\n              return _context12.abrupt(\"return\", reducedData);\n            case 19:\n              return _context12.abrupt(\"return\", false);\n            case 20:\n            case \"end\":\n              return _context12.stop();\n          }\n        }, _callee12);\n      }))();\n    }\n  }\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (baseModule);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvdnVleC9tb2R1bGVzL2Jhc2UtbW9kdWxlLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7K0NBQ0EscUpBQUFBLG1CQUFBLFlBQUFBLG9CQUFBLFdBQUFDLE9BQUEsU0FBQUEsT0FBQSxPQUFBQyxFQUFBLEdBQUFDLE1BQUEsQ0FBQUMsU0FBQSxFQUFBQyxNQUFBLEdBQUFILEVBQUEsQ0FBQUksY0FBQSxFQUFBQyxjQUFBLEdBQUFKLE1BQUEsQ0FBQUksY0FBQSxjQUFBQyxHQUFBLEVBQUFDLEdBQUEsRUFBQUMsSUFBQSxJQUFBRixHQUFBLENBQUFDLEdBQUEsSUFBQUMsSUFBQSxDQUFBQyxLQUFBLEtBQUFDLE9BQUEsd0JBQUFDLE1BQUEsR0FBQUEsTUFBQSxPQUFBQyxjQUFBLEdBQUFGLE9BQUEsQ0FBQUcsUUFBQSxrQkFBQUMsbUJBQUEsR0FBQUosT0FBQSxDQUFBSyxhQUFBLHVCQUFBQyxpQkFBQSxHQUFBTixPQUFBLENBQUFPLFdBQUEsOEJBQUFDLE9BQUFaLEdBQUEsRUFBQUMsR0FBQSxFQUFBRSxLQUFBLFdBQUFSLE1BQUEsQ0FBQUksY0FBQSxDQUFBQyxHQUFBLEVBQUFDLEdBQUEsSUFBQUUsS0FBQSxFQUFBQSxLQUFBLEVBQUFVLFVBQUEsTUFBQUMsWUFBQSxNQUFBQyxRQUFBLFNBQUFmLEdBQUEsQ0FBQUMsR0FBQSxXQUFBVyxNQUFBLG1CQUFBSSxHQUFBLElBQUFKLE1BQUEsWUFBQUEsT0FBQVosR0FBQSxFQUFBQyxHQUFBLEVBQUFFLEtBQUEsV0FBQUgsR0FBQSxDQUFBQyxHQUFBLElBQUFFLEtBQUEsZ0JBQUFjLEtBQUFDLE9BQUEsRUFBQUMsT0FBQSxFQUFBQyxJQUFBLEVBQUFDLFdBQUEsUUFBQUMsY0FBQSxHQUFBSCxPQUFBLElBQUFBLE9BQUEsQ0FBQXZCLFNBQUEsWUFBQTJCLFNBQUEsR0FBQUosT0FBQSxHQUFBSSxTQUFBLEVBQUFDLFNBQUEsR0FBQTdCLE1BQUEsQ0FBQThCLE1BQUEsQ0FBQUgsY0FBQSxDQUFB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QSxNQUFFQSxDQUFDLEdBQUc4SixRQUFRLENBQUNsRSxJQUFJLENBQUNBLElBQUksQ0FBQzdGLE1BQU07Z0JBQUEwTyxVQUFBLENBQUEzUCxJQUFBO2dCQUFBO2NBQUE7Y0FBQTJQLFVBQUEsQ0FBQWxELEVBQUEsR0FDekNnRCxXQUFXO2NBQUFFLFVBQUEsQ0FBQTNQLElBQUE7Y0FBQSxPQUFZcUssUUFBUSxDQUFDLEtBQUssRUFBRVcsUUFBUSxDQUFDbEUsSUFBSSxDQUFDQSxJQUFJLENBQUM1RixDQUFDLENBQUMsQ0FBQztZQUFBO2NBQUF5TyxVQUFBLENBQUFqRCxFQUFBLEdBQUFpRCxVQUFBLENBQUFyUSxJQUFBO2NBQUFxUSxVQUFBLENBQUFsRCxFQUFBLENBQWpEL0wsSUFBSSxDQUFBdEQsSUFBQSxDQUFBdVMsVUFBQSxDQUFBbEQsRUFBQSxFQUFBa0QsVUFBQSxDQUFBakQsRUFBQTtZQUFBO2NBRDJCeEwsQ0FBQyxFQUFFO2NBQUF5TyxVQUFBLENBQUEzUCxJQUFBO2NBQUE7WUFBQTtjQUFBLE9BQUEyUCxVQUFBLENBQUFsUSxNQUFBLFdBSTNDZ1EsV0FBVztZQUFBO2NBQUEsT0FBQUUsVUFBQSxDQUFBbFEsTUFBQSxXQUdmLEtBQUs7WUFBQTtZQUFBO2NBQUEsT0FBQWtRLFVBQUEsQ0FBQWxOLElBQUE7VUFBQTtRQUFBLEdBQUE0TSxTQUFBO01BQUE7SUFDaEI7RUFDSjtBQUNKLENBQUM7QUFFRCxpRUFBZTNKLFVBQVUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvdnVleC9tb2R1bGVzL2Jhc2UtbW9kdWxlLmpzP2RkZTQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbW9kZWxDb250YWluc0luY2x1ZGVzLCBleHBpcmVkLCByZWR1Y2UgfSBmcm9tIFwiLi4vSGVscGVyc1wiO1xuaW1wb3J0IE9iamVjdEhlbHBlciBmcm9tIFwiLi4vLi4vaGVscGVycy9PYmplY3RIZWxwZXJcIjtcblxuY29uc3QgYmFzZU1vZHVsZSA9IHtcbiAgICBuYW1lc3BhY2VkOiB0cnVlLFxuXG4gICAgc3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGw6IHt9LFxuXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgbGFzdF9wYWdlOiAwLFxuICAgICAgICAgICAgICAgIHBhdGg6ICcnLFxuICAgICAgICAgICAgICAgIHBlcl9wYWdlOiAxMCxcbiAgICAgICAgICAgICAgICB0b3RhbDogMFxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2VhcmNoUGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgICAgIGxhc3RfcGFnZTogMCxcbiAgICAgICAgICAgICAgICBwYXRoOiAnJyxcbiAgICAgICAgICAgICAgICBwZXJfcGFnZTogMTAsXG4gICAgICAgICAgICAgICAgdG90YWw6IDBcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGVuZHBvaW50czoge1xuICAgICAgICAgICAgICAgIGFsbDogJycsXG4gICAgICAgICAgICAgICAgZmllbGRJc1VuaXF1ZTogJ2ZpZWxkSXNVbmlxdWUnLFxuICAgICAgICAgICAgICAgIHNlYXJjaDogJ3NlYXJjaCcsXG4gICAgICAgICAgICAgICAgdXBkYXRlOiAndXBkYXRlJ1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZW51bXM6IHt9LFxuXG4gICAgICAgICAgICBwcmltYXJ5S2V5OiAnaWQnLFxuXG4gICAgICAgICAgICBtb2R1bGVCaW5kaW5nczoge30sXG5cbiAgICAgICAgICAgIGlnbm9yZTogW1xuICAgICAgICAgICAgICAgICdwYWdpbmF0aW9uJyxcbiAgICAgICAgICAgICAgICAnaW5jbHVkZXMnLFxuICAgICAgICAgICAgICAgICdjYWNoZScsXG4gICAgICAgICAgICAgICAgJ3RyYW5zbGF0aW9ucycsXG4gICAgICAgICAgICAgICAgJ3Bpdm90J1xuICAgICAgICAgICAgXSxcblxuICAgICAgICAgICAgaW52YWxpZFVuaXF1ZUZpZWxkczogW11cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBtdXRhdGlvbnM6IHtcbiAgICAgICAgICAgIHNldChzdGF0ZSwgZGF0YSkge1xuXG4gICAgICAgICAgICBpZighZGF0YS5hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgbGV0IG9iamVjdERhdGEgPSBkYXRhLmF0dHJpYnV0ZXM7XG4gICAgICAgICAgICBvYmplY3REYXRhLmlkID0gZGF0YS5pZDtcblxuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBzdGF0ZS5hbGxbb2JqZWN0RGF0YS5pZF07XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSB1bmRlZmluZWQgJiYgY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50Q29weSA9IE9iamVjdEhlbHBlci5jbGVhbkNsb25lKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhQ29weSA9IE9iamVjdEhlbHBlci5jbGVhbkNsb25lKG9iamVjdERhdGEpO1xuXG4gICAgICAgICAgICAgICAgZGVsZXRlIGN1cnJlbnRDb3B5LmRpcnR5O1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhQ29weS5kaXJ0eTtcbiAgICAgICAgICAgICAgICBkZWxldGUgY3VycmVudENvcHkuY2FjaGU7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGFDb3B5LmNhY2hlO1xuXG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdEhlbHBlci5jb21wYXJlT2JqZWN0cyhkYXRhQ29weSwgY3VycmVudENvcHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBvYmplY3REYXRhLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0RGF0YS5kaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGF0ZS5hbGxbb2JqZWN0RGF0YS5pZF0gPSBvYmplY3REYXRhO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFkZEludmFsaWRVbmlxdWVGaWVsZChzdGF0ZSwgZmllbGQpIHtcbiAgICAgICAgICAgIHN0YXRlLmludmFsaWRVbmlxdWVGaWVsZHNbc3RhdGUuaW52YWxpZFVuaXF1ZUZpZWxkcy5sZW5ndGhdID0gZmllbGQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVzZXRJbnZhbGlkVW5pcXVlRmllbGRzKHN0YXRlKSB7XG4gICAgICAgICAgICBzdGF0ZS5pbnZhbGlkVW5pcXVlRmllbGRzID0gW107XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGVsZXRlKHN0YXRlLCBpZCkge1xuICAgICAgICAgICAgZGVsZXRlIHN0YXRlLmFsbC5pZDtcbiAgICAgICAgfSxcblxuICAgICAgICBwYWdpbmF0aW9uKHN0YXRlLCBkYXRhKSB7XG4gICAgICAgICAgICBzdGF0ZS5wYWdpbmF0aW9uID0gey4uLmRhdGF9O1xuICAgICAgICB9LFxuXG4gICAgICAgIHNlYXJjaFBhZ2luYXRpb24oc3RhdGUsIGRhdGEpIHtcbiAgICAgICAgICAgIHN0YXRlLnNlYXJjaFBhZ2luYXRpb24gPSB7Li4uZGF0YX07XG4gICAgICAgIH0sXG5cbiAgICAgICAgYWxsKHN0YXRlLCBkYXRlKSB7XG4gICAgICAgICAgICBzdGF0ZS5hbGwgPSBkYXRhO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFsbENsZWFuKHN0YXRlLCBnZXR0ZXJzKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0dGVyc1sncGFnaW5hdGlvbiddLnRvdGFsID09PSBnZXR0ZXJzWydhbGxWYWx1ZXMnXS5sZW5ndGggJiYgZ2V0dGVyc1snYWxsVmFsdWVzJ10uZmlsdGVyKGVsZW0gPT4gZWxlbS5kaXJ0eSA9PT0gZmFsc2UpLmxlbmd0aCA9PT0gZ2V0dGVyc1sncGFnaW5hdGlvbiddLnRvdGFsO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNsZWFyU2VhcmNoUGFnaW5hdGlvbihzdGF0ZSkge1xuICAgICAgICAgICAgc3RhdC5zZWFyY2hQYWdpbmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIGxhc3RfcGFnZTogMCxcbiAgICAgICAgICAgICAgICBwYXRoOiAnJyxcbiAgICAgICAgICAgICAgICBwZXJfcGFnZTogMTAsXG4gICAgICAgICAgICAgICAgdG90YWw6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0UmVsYXRpb25EYXRhKHN0YXRlLCBkYXRhKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUuYWxsW2RhdGEubG9jYWxJZF0ucmVsYXRpb25zaGlwcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuYWxsW2RhdGEubG9jYWxJZF0ucmVsYXRpb25zaGlwcyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3RhdGUuYWxsW2RhdGEubG9jYWxJZF0ucmVsYXRpb25zaGlwc1tkYXRhLnJlbGF0aW9uc2hpcF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN0YXRlLmFsbFtkYXRhLmxvY2FsSWRdLnJlbGF0aW9uc2hpcHNbZGF0YS5yZWxhdGlvbnNoaXBdID0gWyBkYXRhLnJlbGF0ZWRPYmplY3QgXTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHN0YXRlLmFsbFtkYXRhLmxvY2FsSWRdLnJlbGF0aW9uc2hpcHNbZGF0YS5yZWxhdGlvbnNoaXBdKSkge1xuICAgICAgICAgICAgICAgIHN0YXRlLmFsbFtkYXRhLmxvY2FsSWRdLnJlbGF0aW9uc2hpcHNbZGF0YS5yZWxhdGlvbnNoaXBdLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGRhdGEucmVsYXRlZE9iamVjdFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldHRlcnM6IHtcbiAgICAgICAgZXhpc3RzKHN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUuYWxsLmhhc093blByb3BlcnR5KHByaW1hcnlLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGdldChzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS5hbGxbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGVuZHBvaW50cyhzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS5lbmRwb2ludHNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBhbGwoc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5hbGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYWxsVmFsdWVzKHN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhzdGF0ZS5hbGwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGJ5TmFtZShzdGF0ZSwgZ2V0dGVycykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0dGVyc1snYWxsVmFsdWVzJ10uZmluZChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBpbnZhbGlkVW5pcXVlRmllbGRzKHN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUuaW52YWxpZFVuaXF1ZUZpZWxkcztcbiAgICAgICAgfSxcblxuICAgICAgICBtb2RlbFVybChzdGF0ZSwgZ2V0dGVycykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldHRlcnNbJ2VuZHBvaW50cyddKCdhbGwnKSArICcvJyArIGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHBhZ2luYXRpb24oc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5wYWdpbmF0aW9uO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNlYXJjaFBhZ2luYXRpb24oc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5zZWFyY2hQYWdpbmF0aW9uO1xuICAgICAgICB9LFxuXG4gICAgICAgIHBhZ2Uoc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihwYWdlTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoc3RhdGUuYWxsKS5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyhlbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudC5oYXNPd25Qcm9wZXJ0eSgncGFnaW5hdGlvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50LnBhZ2luYXRpb24uaGFzT3duUHJvcGVydHkoJ3BhZ2UnKVxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudC5wYWdpbmF0aW9uLnBhZ2UgPT09IHBhZ2VOdW1iZXI7XG4gICAgICAgICAgICAgICAgfSkuc29ydCgoYSwgYikgPT4gYi5wb3NpdGlvbiAtIGEucG9zaXRpb24pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgcHJpbWFyeUtleShzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnByaW1hcnlLZXk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYWxsQ2xlYW4oc3RhdGUsIGdldHRlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXR0ZXJzWydhbGxWYWx1ZXMnXS5ldmVyeShlbGVtID0+IGVsZW0uZGlydHkgPT09IGZhbHNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBwYWdlQ2xlYW4oc3RhdGUsIGdldHRlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihwYWdlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldHRlcnNbJ3BhZ2UnXShwYWdlKS5ldmVyeShlbGVtID0+IGVsZW0uZGlydHkgPT09IGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBhbGxMb2NhbChzdGF0ZSwgZ2V0dGVycykge1xuICAgICAgICAgICAgcmV0dXJuIGdldHRlcnNbJ2FsbFZhbHVlcyddLmxlbmd0aCA9PT0gZ2V0dGVyc1sncGFnaW5hdGlvbiddLnRvdGFsO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFsbEluY2x1ZGVzKHN0YXRlLCBnZXR0ZXJzKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oaW5jbHVkZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0dGVyc1snYWxsVmFsdWVzJ10uZXZlcnkoZWxlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbS5oYXNPd25Qcm9wZXJ0eSgnaW5jbHVkZXMnKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5jbHVkZXMuZXZlcnkoaW5jbHVkZSA9PiBlbGVtLmluY2x1ZGVzLmluY2x1ZGVzKGluY2x1ZGUpKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHBhZ2VJbmNsdWRlcyhzdGF0ZSwgZ2V0dGVycykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHBhZ2UsIGluY2x1ZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldHRlcnNbJ3BhZ2UnXShwYWdlKS5ldmVyeShlbGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtLmhhc093blByb3BlcnR5KCdpbmNsdWRlcycpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZXMubGVuZ3RoID09PSAwKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmNsdWRlcy5ldmVyeShpbmNsdWRlID0+IGVsZW0uaW5jbHVkZXMuaW5jbHVkZXMoaW5jbHVkZSkpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZW1wdHkoc3RhdGUsIGdldHRlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXR0ZXJzWydhbGxWYWx1ZXMnXS5sZW5ndGggPT09IDA7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYWN0aW9uczoge1xuICAgICAgICBhc3luYyBjbGVhckFsbCh7IGNvbW1pdCwgZGlzcGF0Y2gsIGdldHRlcnMsIHN0YXRlLCByb290R2V0dGVycyB9KSB7XG4gICAgICAgICAgICBzdGF0ZS5hbGwgPSB7fTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0QWxsKHsgY29tbWl0LCBkaXNwYXRjaCwgZ2V0dGVycywgc3RhdGUsIHJvb3RHZXR0ZXJzIH0sIGRhdGEgPSB7fSkge1xuXG4gICAgICAgICAgICBsZXQgcGFyYW1zID0ge307XG4gICAgICAgICAgICBwYXJhbXMucGFnZSA9IC0xO1xuXG4gICAgICAgICAgICBsZXQgZW5kcG9pbnQgPSBnZXR0ZXJzWydlbmRwb2ludHMnXSgnYWxsJyk7XG5cbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KCdlbmRwb2ludCcpKSB7XG4gICAgICAgICAgICAgICAgZW5kcG9pbnQgPSBkYXRhLmVuZHBvaW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eSgncGFnZScpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLnBhZ2UgPSBkYXRhLnBhZ2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KCdpbmNsdWRlcycpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLmluY2x1ZGVzID0gZGF0YS5pbmNsdWRlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoJ2ZpZWxkc2V0JykpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMuZmllbGRzZXQgPSBkYXRhLmZpZWxkc2V0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eSgnZmlsdGVycycpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZmlsdGVyIGluIGRhdGEuZmlsdGVycykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWx0ZXJzLmhhc093blByb3BlcnR5KGZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1tcImZpbHRlcltcIitmaWx0ZXIrXCJdXCJdID0gZGF0YS5maWx0ZXJzW2ZpbHRlcl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5heGlvcy5nZXQoZW5kcG9pbnQsIHtcbiAgICAgICAgICAgICAgICBwYXJhbXNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmRhdGEubWV0YSAhPSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgJiYgcmVzcG9uc2UuZGF0YS5tZXRhLnBhZ2luYXRpb24gIT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdCgncGFnaW5hdGlvbicsIHJlc3BvbnNlLmRhdGEubWV0YS5wYWdpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLmluY2x1ZGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3BvbnNlLmRhdGEuaW5jbHVkZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWxhdGVkT2JqZWN0ID0gcmVzcG9uc2UuZGF0YS5pbmNsdWRlZFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWxhdGVkT2JqZWN0TW9kdWxlID0gcm9vdEdldHRlcnMudHlwZUJpbmRpbmdzW3JlbGF0ZWRPYmplY3QudHlwZV1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRPYmplY3RNb2R1bGUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29tbWl0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkT2JqZWN0TW9kdWxlICsgJy9zZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5kYXRhLmluY2x1ZGVkW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJvb3Q6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3BvbnNlLmRhdGEuZGF0YS5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGRpc3BhdGNoKCdzZXQnLCByZXNwb25zZS5kYXRhLmRhdGFbaV0pO1xuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBnZXQoeyBjb21taXQsIGRpc3BhdGNoLCBnZXR0ZXJzLCBzdGF0ZSwgcm9vdEdldHRlcnMgfSwgZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgaWQ7XG4gICAgICAgICAgICBsZXQgaW5jbHVkZXMgPSBbXTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnIHx8IHR5cGVvZiBkYXRhID09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgaWQgPSBkYXRhO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmhhc093blByb3BlcnR5KHN0YXRlLnByaW1hcnlLZXkpKSB7XG4gICAgICAgICAgICAgICAgaWQgPSBkYXRhW3N0YXRlLnByaW1hcnlLZXldO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoJ2luY2x1ZGVzJykpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgPSBkYXRhLmluY2x1ZGVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBzdGF0ZS5hbGwgdG8gc2VlIGlmIG1vZGVsIGlzIHNhdmVkIGxvY2FsbHlcbiAgICAgICAgICAgIGlmIChnZXR0ZXJzWydleGlzdHMnXShpZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZWxDb250YWluc0luY2x1ZGVzKGdldHRlcnNbJ2dldCddKGlkKSwgaW5jbHVkZXMpICYmICFleHBpcmVkKGdldHRlcnNbJ2dldCddKGlkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldHRlcnNbJ2dldCddKGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGVpdGhlcjpcbiAgICAgICAgICAgIC8vIC0gZG9lcyBub3QgZXhpc3QgbG9jYWxseVxuICAgICAgICAgICAgLy8gLSBkb2VzIG5vdCBjb250YWluIHRoZSBuZWNlc3NhcnkgaW5jbHVkZXNcbiAgICAgICAgICAgIC8vIC0gaGFzIGV4cGlyZWRcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXhpb3MuZ2V0KGdldHRlcnNbJ2VuZHBvaW50cyddKCdhbGwnKSArICcvJyArIGlkLCB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzOiBpbmNsdWRlc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5pbmNsdWRlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwb25zZS5kYXRhLmluY2x1ZGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVsYXRlZE9iamVjdCA9IHJlc3BvbnNlLmRhdGEuaW5jbHVkZWRbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVsYXRlZE9iamVjdE1vZHVsZSA9IHJvb3RHZXR0ZXJzLnR5cGVCaW5kaW5nc1tyZWxhdGVkT2JqZWN0LnR5cGVdXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRlZE9iamVjdE1vZHVsZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb21taXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWRPYmplY3RNb2R1bGUgKyAnL3NldCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmRhdGEuaW5jbHVkZWRbaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcm9vdDogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbW9kZWwgPSByZXNwb25zZS5kYXRhLmRhdGE7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGlzcGF0Y2goJ3NldCcsIG1vZGVsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHNldCh7ZGlzcGF0Y2gsIGNvbW1pdCwgc3RhdGUsIHJvb3RHZXR0ZXJzLCByb290U3RhdGV9LCBkYXRhKSB7XG5cbiAgICAgICAgICAgIGF3YWl0IGNvbW1pdCgnc2V0JywgZGF0YSk7XG5cbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KCdyZWxhdGlvbnNoaXBzJykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCByZWxhdGlvbnNoaXAgaW4gZGF0YS5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnJlbGF0aW9uc2hpcHMuaGFzT3duUHJvcGVydHkocmVsYXRpb25zaGlwKSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVsYXRpb25EYXRhID0gZGF0YS5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcF07XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbGF0aW9uRGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWxhdGVkT2JqZWN0TW9kdWxlID0gcm9vdEdldHRlcnMudHlwZUJpbmRpbmdzW3JlbGF0aW9uRGF0YVtpXS50eXBlXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29tbWl0KCdzZXRSZWxhdGlvbkRhdGEnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsSWQ6IGRhdGEuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWRPYmplY3Q6IHJvb3RTdGF0ZVtyZWxhdGVkT2JqZWN0TW9kdWxlXVsnYWxsJ11bcmVsYXRpb25EYXRhW2ldLmlkXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkSWQ6IHJlbGF0aW9uRGF0YVtpXS5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgdXBkYXRlKHsgZGlzcGF0Y2gsIGdldHRlcnMsIHN0YXRlfSwgZGF0YSkge1xuICAgICAgICAgICAgbGV0IGVuZHBvaW50ID0gZ2V0dGVyc1snbW9kZWxVcmwnXShkYXRhW3N0YXRlLnByaW1hcnlLZXldKTtcblxuICAgICAgICAgICAgaWYgKGRhdGEuaW5jbHVkZXMpIHtcbiAgICAgICAgICAgICAgICBkYXRhLmluY2x1ZGVzID0gZGF0YS5pbmNsdWRlcy5qb2luKCcsJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXhpb3MucHV0KGVuZHBvaW50LCBkYXRhKTtcblxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRpc3BhdGNoKCdzZXQnLCByZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHVwZGF0ZTIoeyBkaXNwYXRjaCwgY29tbWl0LCBnZXR0ZXJzIH0sIGRhdGEpIHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXhpb3MucHV0KGdldHRlcnNbJ2VuZHBvaW50cyddKCd1cGRhdGUnKSwgZGF0YSk7XG5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBkaXNwYXRjaCgnc2V0JywgcmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBjcmVhdGUoeyBkaXNwYXRjaCwgZ2V0dGVycywgc3RhdGV9LCBkYXRhKSB7XG4gICAgICAgICAgICBsZXQgZW5kcG9pbnQgPSBnZXR0ZXJzWydlbmRwb2ludHMnXSgnYWxsJyk7XG5cbiAgICAgICAgICAgIGlmIChkYXRhLmluY2x1ZGVzKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5pbmNsdWRlcyA9IGRhdGEuaW5jbHVkZXMuam9pbignLCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF4aW9zLnBvc3QoZW5kcG9pbnQsIGRhdGEpO1xuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZGlzcGF0Y2goJ3NldCcsIHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZGVsZXRlKHtjb21taXQsIGdldHRlcnMsIHN0YXRlfSwgaWQpIHtcbiAgICAgICAgICAgIGxldCBlbmRwb2ludCA9IGdldHRlcnNbJ21vZGVsVXJsJ10oaWQpO1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5heGlvcy5kZWxldGUoZW5kcG9pbnQpO1xuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDAgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgICAgICBjb21taXQoJ2RlbGV0ZScsIGlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGZpZWxkSXNVbmlxdWUoe2NvbW1pdCwgc3RhdGUsIGdldHRlcnN9LCBkYXRhKSB7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF4aW9zLnBvc3QoZ2V0dGVyc1snZW5kcG9pbnRzJ10oJ2FsbCcpICsgJy8nICsgZ2V0dGVyc1snZW5kcG9pbnRzJ10oJ2ZpZWxkSXNVbmlxdWUnKSwgZGF0YSk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5zdGF0dXMgPT09IDIwMDtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyByZWZyZXNoKHsgZGlzcGF0Y2gsIGNvbW1pdCwgc3RhdGUgfSwgZGF0YSkge1xuICAgICAgICAgICAgY29tbWl0KCdkZWxldGUnLCBkYXRhW3N0YXRlLnByaW1hcnlLZXldKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBkaXNwYXRjaCgnZ2V0JywgZGF0YSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgYnlOYW1lKHsgZGlzcGF0Y2gsIGNvbW1pdCwgZ2V0dGVycyB9LCBuYW1lKSB7XG4gICAgICAgICAgICBpZiAoZ2V0dGVyc1snYnlOYW1lJ10obmFtZSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGRpc3BhdGNoKCdnZXRBbGwnLCB7IHBhZ2U6IC0xIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZ2V0dGVyc1snYnlOYW1lJ10obmFtZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgc2VhcmNoKHsgZGlzcGF0Y2gsIGNvbW1pdCwgZ2V0dGVycyB9LCB7IHRlcm0sIGluY2x1ZGVzLCBwYWdlLCBwZXJQYWdlID0gMTAgfSkge1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5heGlvcy5nZXQoZ2V0dGVyc1snZW5kcG9pbnRzJ10oJ3NlYXJjaCcpLCB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgIHRlcm06IHRlcm0sXG4gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzOiBpbmNsdWRlcyxcbiAgICAgICAgICAgICAgICAgICAgcGFnZTogcGFnZSxcbiAgICAgICAgICAgICAgICAgICAgcGVyUGFnZTogcGVyUGFnZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgICAgICBjb21taXQoJ3NlYXJjaFBhZ2luYXRpb24nLCByZXNwb25zZS5kYXRhLm1ldGEpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHJlZHVjZWREYXRhID0gW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3BvbnNlLmRhdGEuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICByZWR1Y2VkRGF0YS5wdXNoKGF3YWl0IGRpc3BhdGNoKCdzZXQnLCByZXNwb25zZS5kYXRhLmRhdGFbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVkdWNlZERhdGE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZU1vZHVsZTtcbiJdLCJuYW1lcyI6WyJfcmVnZW5lcmF0b3JSdW50aW1lIiwiZXhwb3J0cyIsIk9wIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duIiwiaGFzT3duUHJvcGVydHkiLCJkZWZpbmVQcm9wZXJ0eSIsIm9iaiIsImtleSIsImRlc2MiLCJ2YWx1ZSIsIiRTeW1ib2wiLCJTeW1ib2wiLCJpdGVyYXRvclN5bWJvbCIsIml0ZXJhdG9yIiwiYXN5bmNJdGVyYXRvclN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJ0b1N0cmluZ1RhZ1N5bWJvbCIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiZXJyIiwid3JhcCIsImlubmVyRm4iLCJvdXRlckZuIiwic2VsZiIsInRyeUxvY3NMaXN0IiwicHJvdG9HZW5lcmF0b3IiLCJHZW5lcmF0b3IiLCJnZW5lcmF0b3IiLCJjcmVhdGUiLCJjb250ZXh0IiwiQ29udGV4dCIsIm1ha2VJbnZva2VNZXRob2QiLCJ0cnlDYXRjaCIsImZuIiwiYXJnIiwidHlwZSIsImNhbGwiLCJDb250aW51ZVNlbnRpbmVsIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsIkl0ZXJhdG9yUHJvdG90eXBlIiwiZ2V0UHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwidmFsdWVzIiwiR3AiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwibWV0aG9kIiwiX2ludm9rZSIsIkFzeW5jSXRlcmF0b3IiLCJQcm9taXNlSW1wbCIsImludm9rZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZWNvcmQiLCJyZXN1bHQiLCJfdHlwZW9mIiwiX19hd2FpdCIsInRoZW4iLCJ1bndyYXBwZWQiLCJlcnJvciIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwic3RhdGUiLCJFcnJvciIsImRvbmVSZXN1bHQiLCJkZWxlZ2F0ZSIsImRlbGVnYXRlUmVzdWx0IiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwiZG9uZSIsIm1ldGhvZE5hbWUiLCJ1bmRlZmluZWQiLCJUeXBlRXJyb3IiLCJpbmZvIiwicmVzdWx0TmFtZSIsIm5leHQiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwibG9jcyIsImVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicHVzaCIsInJlc2V0VHJ5RW50cnkiLCJjb21wbGV0aW9uIiwicmVzZXQiLCJpdGVyYWJsZSIsIml0ZXJhdG9yTWV0aG9kIiwiaXNOYU4iLCJsZW5ndGgiLCJpIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiZ2VuRnVuIiwiY3RvciIsImNvbnN0cnVjdG9yIiwibmFtZSIsIm1hcmsiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImF3cmFwIiwiYXN5bmMiLCJQcm9taXNlIiwiaXRlciIsImtleXMiLCJ2YWwiLCJvYmplY3QiLCJyZXZlcnNlIiwicG9wIiwic2tpcFRlbXBSZXNldCIsInByZXYiLCJjaGFyQXQiLCJzbGljZSIsInN0b3AiLCJyb290UmVjb3JkIiwicnZhbCIsImV4Y2VwdGlvbiIsImhhbmRsZSIsImxvYyIsImNhdWdodCIsImhhc0NhdGNoIiwiaGFzRmluYWxseSIsImZpbmFsbHlFbnRyeSIsImNvbXBsZXRlIiwiZmluaXNoIiwiX2NhdGNoIiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsImFzeW5jR2VuZXJhdG9yU3RlcCIsImdlbiIsIl9uZXh0IiwiX3Rocm93IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmdzIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJvd25LZXlzIiwiZW51bWVyYWJsZU9ubHkiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJzeW1ib2xzIiwiZmlsdGVyIiwic3ltIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiX29iamVjdFNwcmVhZCIsInRhcmdldCIsInNvdXJjZSIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJvcGVydHlLZXkiLCJfdG9QcmltaXRpdmUiLCJTdHJpbmciLCJpbnB1dCIsImhpbnQiLCJwcmltIiwidG9QcmltaXRpdmUiLCJyZXMiLCJOdW1iZXIiLCJtb2RlbENvbnRhaW5zSW5jbHVkZXMiLCJleHBpcmVkIiwicmVkdWNlIiwiT2JqZWN0SGVscGVyIiwiYmFzZU1vZHVsZSIsIm5hbWVzcGFjZWQiLCJhbGwiLCJwYWdpbmF0aW9uIiwibGFzdF9wYWdlIiwicGF0aCIsInBlcl9wYWdlIiwidG90YWwiLCJzZWFyY2hQYWdpbmF0aW9uIiwiZW5kcG9pbnRzIiwiZmllbGRJc1VuaXF1ZSIsInNlYXJjaCIsInVwZGF0ZSIsImVudW1zIiwicHJpbWFyeUtleSIsIm1vZHVsZUJpbmRpbmdzIiwiaWdub3JlIiwiaW52YWxpZFVuaXF1ZUZpZWxkcyIsIm11dGF0aW9ucyIsInNldCIsImRhdGEiLCJhdHRyaWJ1dGVzIiwib2JqZWN0RGF0YSIsImlkIiwiY3VycmVudCIsImN1cnJlbnRDb3B5IiwiY2xlYW5DbG9uZSIsImRhdGFDb3B5IiwiZGlydHkiLCJjYWNoZSIsImNvbXBhcmVPYmplY3RzIiwiYWRkSW52YWxpZFVuaXF1ZUZpZWxkIiwiZmllbGQiLCJyZXNldEludmFsaWRVbmlxdWVGaWVsZHMiLCJfZGVsZXRlIiwiZGF0ZSIsImFsbENsZWFuIiwiZ2V0dGVycyIsImVsZW0iLCJjbGVhclNlYXJjaFBhZ2luYXRpb24iLCJzdGF0Iiwic2V0UmVsYXRpb25EYXRhIiwibG9jYWxJZCIsInJlbGF0aW9uc2hpcHMiLCJyZWxhdGlvbnNoaXAiLCJyZWxhdGVkT2JqZWN0IiwiQXJyYXkiLCJpc0FycmF5IiwiZXhpc3RzIiwiZ2V0IiwiYWxsVmFsdWVzIiwiYnlOYW1lIiwiZmluZCIsImVsZW1lbnQiLCJ0b0xvd2VyQ2FzZSIsIm1vZGVsVXJsIiwicGFnZSIsInBhZ2VOdW1iZXIiLCJpbmNsdWRlcyIsInNvcnQiLCJhIiwiYiIsInBvc2l0aW9uIiwiZXZlcnkiLCJwYWdlQ2xlYW4iLCJhbGxMb2NhbCIsImFsbEluY2x1ZGVzIiwiaW5jbHVkZSIsInBhZ2VJbmNsdWRlcyIsImVtcHR5IiwiYWN0aW9ucyIsImNsZWFyQWxsIiwiX3JlZiIsIl9jYWxsZWUiLCJjb21taXQiLCJkaXNwYXRjaCIsInJvb3RHZXR0ZXJzIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsImdldEFsbCIsIl9yZWYyIiwiX2FyZ3VtZW50cyIsIl90aGlzIiwiX2NhbGxlZTIiLCJwYXJhbXMiLCJlbmRwb2ludCIsInJlc3BvbnNlIiwicmVsYXRlZE9iamVjdE1vZHVsZSIsIl9pIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiZmllbGRzZXQiLCJmaWx0ZXJzIiwiYXhpb3MiLCJzdGF0dXMiLCJtZXRhIiwiaW5jbHVkZWQiLCJ0eXBlQmluZGluZ3MiLCJyb290IiwiX3JlZjMiLCJfdGhpczIiLCJfY2FsbGVlMyIsIm1vZGVsIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiX3JlZjQiLCJfY2FsbGVlNCIsInJvb3RTdGF0ZSIsInJlbGF0aW9uRGF0YSIsIl9jYWxsZWU0JCIsIl9jb250ZXh0NCIsInQwIiwidDEiLCJyZWxhdGVkSWQiLCJfcmVmNSIsIl90aGlzMyIsIl9jYWxsZWU1IiwiX2NhbGxlZTUkIiwiX2NvbnRleHQ1Iiwiam9pbiIsInB1dCIsInVwZGF0ZTIiLCJfcmVmNiIsIl90aGlzNCIsIl9jYWxsZWU2IiwiX2NhbGxlZTYkIiwiX2NvbnRleHQ2IiwiX3JlZjciLCJfdGhpczUiLCJfY2FsbGVlNyIsIl9jYWxsZWU3JCIsIl9jb250ZXh0NyIsInBvc3QiLCJfcmVmOCIsIl90aGlzNiIsIl9jYWxsZWU4IiwiX2NhbGxlZTgkIiwiX2NvbnRleHQ4IiwiX3JlZjkiLCJfdGhpczciLCJfY2FsbGVlOSIsIl9jYWxsZWU5JCIsIl9jb250ZXh0OSIsInJlZnJlc2giLCJfcmVmMTAiLCJfY2FsbGVlMTAiLCJfY2FsbGVlMTAkIiwiX2NvbnRleHQxMCIsIl9yZWYxMSIsIl9jYWxsZWUxMSIsIl9jYWxsZWUxMSQiLCJfY29udGV4dDExIiwiX3JlZjEyIiwiX3JlZjEzIiwiX3RoaXM4IiwiX2NhbGxlZTEyIiwidGVybSIsIl9yZWYxMyRwZXJQYWdlIiwicGVyUGFnZSIsInJlZHVjZWREYXRhIiwiX2NhbGxlZTEyJCIsIl9jb250ZXh0MTIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/vuex/modules/base-module.js\n");

/***/ }),

/***/ "./resources/js/vuex/modules/sidebar.js":
/*!**********************************************!*\
  !*** ./resources/js/vuex/modules/sidebar.js ***!
  \**********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n  namespaced: true,\n  state: function state() {\n    return {\n      expanded: true\n    };\n  },\n  mutations: {\n    collapse: function collapse(state) {\n      state.expanded = false;\n    },\n    expand: function expand(state) {\n      state.expanded = true;\n    },\n    toggle: function toggle(state) {\n      state.expanded = !state.expanded;\n    }\n  },\n  getters: {\n    expanded: function expanded(state) {\n      return state.expanded;\n    }\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvdnVleC9tb2R1bGVzL3NpZGViYXIuanMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGlFQUFlO0VBQ1hBLFVBQVUsRUFBRSxJQUFJO0VBRWhCQyxLQUFLLFdBQUFBLE1BQUEsRUFBRztJQUNKLE9BQU87TUFDSEMsUUFBUSxFQUFFO0lBQ2QsQ0FBQztFQUNMLENBQUM7RUFFREMsU0FBUyxFQUFFO0lBQ1BDLFFBQVEsV0FBQUEsU0FBQ0gsS0FBSyxFQUFFO01BQ1pBLEtBQUssQ0FBQ0MsUUFBUSxHQUFHLEtBQUs7SUFDMUIsQ0FBQztJQUVERyxNQUFNLFdBQUFBLE9BQUNKLEtBQUssRUFBRTtNQUNWQSxLQUFLLENBQUNDLFFBQVEsR0FBRyxJQUFJO0lBQ3pCLENBQUM7SUFFREksTUFBTSxXQUFBQSxPQUFDTCxLQUFLLEVBQUU7TUFDVkEsS0FBSyxDQUFDQyxRQUFRLEdBQUcsQ0FBQ0QsS0FBSyxDQUFDQyxRQUFRO0lBQ3BDO0VBQ0osQ0FBQztFQUVESyxPQUFPLEVBQUU7SUFDTEwsUUFBUSxXQUFBQSxTQUFDRCxLQUFLLEVBQUU7TUFDWixPQUFPQSxLQUFLLENBQUNDLFFBQVE7SUFDekI7RUFDSjtBQUNKLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvdnVleC9tb2R1bGVzL3NpZGViYXIuanM/MDRhMCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZXNwYWNlZDogdHJ1ZSxcblxuICAgIHN0YXRlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXhwYW5kZWQ6IHRydWUsXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgbXV0YXRpb25zOiB7XG4gICAgICAgIGNvbGxhcHNlKHN0YXRlKSB7XG4gICAgICAgICAgICBzdGF0ZS5leHBhbmRlZCA9IGZhbHNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIGV4cGFuZChzdGF0ZSkge1xuICAgICAgICAgICAgc3RhdGUuZXhwYW5kZWQgPSB0cnVlO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvZ2dsZShzdGF0ZSkge1xuICAgICAgICAgICAgc3RhdGUuZXhwYW5kZWQgPSAhc3RhdGUuZXhwYW5kZWQ7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0dGVyczoge1xuICAgICAgICBleHBhbmRlZChzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmV4cGFuZGVkO1xuICAgICAgICB9XG4gICAgfVxufSJdLCJuYW1lcyI6WyJuYW1lc3BhY2VkIiwic3RhdGUiLCJleHBhbmRlZCIsIm11dGF0aW9ucyIsImNvbGxhcHNlIiwiZXhwYW5kIiwidG9nZ2xlIiwiZ2V0dGVycyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/vuex/modules/sidebar.js\n");

/***/ }),

/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-sidebar-menu/dist/vue-sidebar-menu.css":
/*!***************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-sidebar-menu/dist/vue-sidebar-menu.css ***!
  \***************************************************************************************************************************************************************************************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../css-loader/dist/runtime/cssWithMappingToString.js */ \"./node_modules/css-loader/dist/runtime/cssWithMappingToString.js\");\n/* harmony import */ var _css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".v-sidebar-menu{-webkit-box-orient:vertical;-webkit-box-direction:normal;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;left:0;position:fixed;text-align:left;top:0;-webkit-transition:max-width .3s ease;transition:max-width .3s ease;width:100%;z-index:999}.v-sidebar-menu,.v-sidebar-menu *{-webkit-box-sizing:border-box;box-sizing:border-box}.v-sidebar-menu .vsm--scroll-wrapper{-webkit-box-flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;min-height:0;position:relative}.v-sidebar-menu .vsm--scroll-wrapper:active .vsm--scroll-bar,.v-sidebar-menu .vsm--scroll-wrapper:focus .vsm--scroll-bar,.v-sidebar-menu .vsm--scroll-wrapper:hover .vsm--scroll-bar{opacity:1}.v-sidebar-menu .vsm--scroll-overflow{height:100%;overflow:hidden;width:100%}.v-sidebar-menu .vsm--scroll{-ms-overflow-style:none;height:100%;overflow-x:hidden;overflow-y:scroll;scrollbar-width:none}.v-sidebar-menu .vsm--scroll::-webkit-scrollbar{display:none;height:0;width:0}.v-sidebar-menu .vsm--scroll>.vsm--menu{position:static!important;-webkit-transition:width .3s ease;transition:width .3s ease}.v-sidebar-menu .vsm--scroll-bar{bottom:2px;opacity:0;position:absolute;right:2px;top:2px;width:6px;z-index:5}.v-sidebar-menu .vsm--scroll-bar,.v-sidebar-menu .vsm--scroll-thumb{border-radius:4px;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.v-sidebar-menu .vsm--scroll-thumb{background-color:#aaa;cursor:pointer;display:block;opacity:.5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-sidebar-menu .vsm--scroll-thumb:hover{opacity:1}.v-sidebar-menu .vsm--dropdown,.v-sidebar-menu .vsm--menu{list-style:none;margin:0;padding:0}.v-sidebar-menu .vsm--dropdown{padding:5px}.v-sidebar-menu .vsm--item{display:block;position:static!important;white-space:nowrap;width:100%}.v-sidebar-menu .vsm--link{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:16px;font-weight:400;line-height:30px;padding:10px 15px;position:static!important;text-decoration:none;-webkit-transition:all .3s ease;transition:all .3s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-sidebar-menu .vsm--link_active{font-weight:600}.v-sidebar-menu .vsm--link_disabled{opacity:.4;pointer-events:none}.v-sidebar-menu .vsm--link_level-1 .vsm--icon{-ms-flex-negative:0;border-radius:3px;flex-shrink:0;height:35px;width:35px}.v-sidebar-menu .vsm--icon{-webkit-box-pack:center;-ms-flex-pack:center;height:25px;justify-content:center;margin-right:15px;width:25px;z-index:20}.v-sidebar-menu .vsm--icon,.v-sidebar-menu .vsm--title{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}.v-sidebar-menu .vsm--title{-webkit-box-flex:1;-ms-flex:1;flex:1}.v-sidebar-menu .vsm--title>span:first-child{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.v-sidebar-menu .vsm--title_hidden{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.v-sidebar-menu .vsm--arrow{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:14px;height:30px;justify-content:center;text-align:center;width:30px}.v-sidebar-menu .vsm--arrow_default{height:12px;position:relative;-webkit-transition:-webkit-transform .3s ease;transition:-webkit-transform .3s ease;transition:transform .3s ease;transition:transform .3s ease, -webkit-transform .3s ease;transition:transform .3s ease,-webkit-transform .3s ease;width:12px}.v-sidebar-menu .vsm--arrow_default:before{border-bottom:2px solid;border-left:2px solid;-webkit-box-sizing:content-box;box-sizing:content-box;content:\\\"\\\";display:inline-block;height:6px;left:0;position:absolute;top:2px;-webkit-transform:rotate(-135deg);transform:rotate(-135deg);width:6px}.v-sidebar-menu .vsm--arrow_open .vsm--arrow_default{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.v-sidebar-menu .vsm--header{font-size:14px;font-weight:600;padding:10px 15px;text-transform:uppercase;white-space:nowrap}.v-sidebar-menu .vsm--badge_default{border-radius:3px;font-size:12px;font-weight:600;height:20px;line-height:20px;padding:0 6px;text-transform:uppercase}.v-sidebar-menu .vsm--toggle-btn{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:none;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:18px;height:65px;justify-content:center;text-align:center;width:100%}.v-sidebar-menu .vsm--toggle-btn_default{height:12px;position:relative;width:12px}.v-sidebar-menu .vsm--toggle-btn_default:before{border-left:2px solid;content:\\\"\\\";display:inline-block;height:12px;left:0;position:absolute;top:0}.v-sidebar-menu .vsm--toggle-btn_default:after{border-bottom:2px solid;border-left:2px solid;-webkit-box-sizing:content-box;box-sizing:content-box;content:\\\"\\\";display:inline-block;height:6px;left:4px;position:absolute;top:2px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:6px}.v-sidebar-menu.vsm_collapsed .vsm--link_level-1.vsm--link_hover,.v-sidebar-menu.vsm_collapsed .vsm--link_level-1:hover{background-color:transparent!important}.v-sidebar-menu.vsm_collapsed .vsm--toggle-btn_default{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.v-sidebar-menu.vsm_collapsed.vsm_rtl .vsm--toggle-btn_default{-webkit-transform:scaleX(1);transform:scaleX(1)}.v-sidebar-menu.vsm_collapsed .vsm--scroll-wrapper{width:calc(100% + 8px)}.v-sidebar-menu.vsm_rtl{direction:rtl;left:inherit;right:0;text-align:right}.v-sidebar-menu.vsm_rtl .vsm--icon{margin-left:15px;margin-right:0}.v-sidebar-menu.vsm_rtl .vsm--arrow_default{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.v-sidebar-menu.vsm_rtl .vsm--arrow_open .vsm--arrow_default{-webkit-transform:rotate(-90deg) scaleX(-1);transform:rotate(-90deg) scaleX(-1)}.v-sidebar-menu.vsm_rtl .vsm--toggle-btn_default{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.v-sidebar-menu.vsm_rtl .vsm--scroll-bar{left:2px;right:inherit}.v-sidebar-menu.vsm_relative{height:100%;position:relative}.v-sidebar-menu .expand-enter-active,.v-sidebar-menu .expand-leave-active{overflow:hidden;-webkit-transition:height .3s ease;transition:height .3s ease}.v-sidebar-menu .expand-enter-from,.v-sidebar-menu .expand-leave-to{height:0!important}.v-sidebar-menu .slide-animation-enter-active,.v-sidebar-menu .slide-animation-leave-active{-webkit-transition:width .3s ease;transition:width .3s ease}.v-sidebar-menu .slide-animation-enter-from,.v-sidebar-menu .slide-animation-leave-to{width:0!important}.v-sidebar-menu{background-color:#2a2a2e}.v-sidebar-menu .vsm--link{color:#fff}.v-sidebar-menu .vsm--link_level-1.vsm--link_active{-webkit-box-shadow:inset 3px 0 0 0 #4285f4;box-shadow:inset 3px 0 0 0 #4285f4}.v-sidebar-menu .vsm--link_level-1 .vsm--icon{background-color:#1e1e21}.v-sidebar-menu .vsm--link_hover{background-color:rgba(30,30,33,.5)}.v-sidebar-menu .vsm--link_mobile{color:#fff}.v-sidebar-menu.vsm_expanded .vsm--link_level-1.vsm--link_open{background-color:#4285f4;color:#fff}.v-sidebar-menu.vsm_expanded .vsm--link_level-1.vsm--link_open .vsm--icon{background-color:#4285f4}.v-sidebar-menu.vsm_collapsed .vsm--link_level-1.vsm--link_hover .vsm--icon{background-color:#4285f4;color:#fff}.v-sidebar-menu .vsm--dropdown{background-color:#36363b}.v-sidebar-menu .vsm--mobile-bg{background-color:#4285f4}.v-sidebar-menu.vsm_rtl .vsm--link_level-1.vsm--link_active{-webkit-box-shadow:inset -3px 0 0 0 #4285f4;box-shadow:inset -3px 0 0 0 #4285f4}.v-sidebar-menu .vsm--header{color:hsla(0,0%,100%,.7)}.v-sidebar-menu .vsm--badge_default,.v-sidebar-menu .vsm--toggle-btn{background-color:#1e1e21;color:#fff}.v-sidebar-menu.vsm_white-theme{background-color:#fff}.v-sidebar-menu.vsm_white-theme .vsm--link{color:#262626}.v-sidebar-menu.vsm_white-theme .vsm--link_level-1.vsm--link_active{-webkit-box-shadow:inset 3px 0 0 0 #4285f4;box-shadow:inset 3px 0 0 0 #4285f4}.v-sidebar-menu.vsm_white-theme .vsm--link_level-1.vsm--link_active .vsm--icon{background-color:#262626;color:#fff}.v-sidebar-menu.vsm_white-theme .vsm--link_level-1 .vsm--icon{background-color:#bbc5d6}.v-sidebar-menu.vsm_white-theme .vsm--link_hover{background-color:hsla(0,0%,95%,.5)}.v-sidebar-menu.vsm_white-theme .vsm--link_mobile{color:#fff}.v-sidebar-menu.vsm_white-theme.vsm_expanded .vsm--link_level-1.vsm--link_open{background-color:#4285f4;color:#fff}.v-sidebar-menu.vsm_white-theme.vsm_expanded .vsm--link_level-1.vsm--link_open .vsm--icon{background-color:#4285f4}.v-sidebar-menu.vsm_white-theme.vsm_collapsed .vsm--link_level-1.vsm--link_hover .vsm--icon{background-color:#4285f4;color:#fff}.v-sidebar-menu.vsm_white-theme .vsm--dropdown{background-color:#e3e3e3}.v-sidebar-menu.vsm_white-theme .vsm--mobile-bg{background-color:#4285f4}.v-sidebar-menu.vsm_white-theme.vsm_rtl .vsm--link_level-1.vsm--link_active{-webkit-box-shadow:inset -3px 0 0 0 #4285f4;box-shadow:inset -3px 0 0 0 #4285f4}.v-sidebar-menu.vsm_white-theme .vsm--header{color:rgba(38,38,38,.7)}.v-sidebar-menu.vsm_white-theme .vsm--badge_default,.v-sidebar-menu.vsm_white-theme .vsm--toggle-btn{background-color:#f2f2f2;color:#262626}\\n/*# sourceMappingURL=vue-sidebar-menu.css.map */\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/vue-sidebar-menu/dist/SidebarMenu.vue%3Fvue&type=style&index=0&id=c478414a&lang.scss\",\"webpack://./node_modules/vue-sidebar-menu/dist/vue-sidebar-menu.css\"],\"names\":[],\"mappings\":\"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ADT,iBAAkB,CAElB,KACF,CACA,+CAME,uBAAwB,CADxB,qBAAsB,CAMtB,8BAAuB,CAAvB,sBAAuB,CAVvB,UAAW,CACX,oBAAqB,CAErB,UAAW,CAIX,QAAS,CADT,iBAAkB,CAElB,OAAQ,CACR,+BAAwB,CAAxB,uBAAwB,CAPxB,SASF,CACA,wHACE,sCACF,CACA,uDACE,4BAAqB,CAArB,oBACF,CACA,+DACE,2BAAoB,CAApB,mBACF,CACA,mDACE,sBACF,CACA,wBAIE,aAAc,CAFd,YAAa,CADb,OAAQ,CAER,gBAEF,CACA,mCACE,gBAAiB,CACjB,cACF,CACA,4CACE,4BAAqB,CAArB,oBACF,CACA,6DACE,2CAAoC,CAApC,mCACF,CACA,iDACE,4BAAqB,CAArB,oBACF,CACA,yCAEE,QAAS,CADT,aAEF,CACA,6BAEE,WAAY,CADZ,iBAEF,CACA,0EAGE,eAAgB,CADhB,kCAA4B,CAA5B,0BAEF,CACA,oEAEE,kBACF,CAIA,4FACE,iCAA2B,CAA3B,yBACF,CACA,sFAEE,iBACF,CAEA,gBACE,wBACF,CACA,2BACE,UACF,CACA,oDACE,0CAAyC,CAAzC,kCACF,CACA,8CACE,wBACF,CACA,iCACE,kCACF,CACA,kCACE,UACF,CACA,+DAEE,wBAAyB,CADzB,UAEF,CACA,0EACE,wBACF,CACA,4EAEE,wBAAyB,CADzB,UAEF,CACA,+BACE,wBACF,CACA,gCACE,wBACF,CACA,4DACE,2CAA0C,CAA1C,mCACF,CACA,6BACE,wBACF,CAKA,qEAEE,wBAAyB,CADzB,UAEF,CAEA,gCACE,qBACF,CACA,2CACE,aACF,CACA,oEACE,0CAAyC,CAAzC,kCACF,CACA,+EAEE,wBAAyB,CADzB,UAEF,CACA,8DACE,wBACF,CACA,iDACE,kCACF,CACA,kDACE,UACF,CACA,+EAEE,wBAAyB,CADzB,UAEF,CACA,0FACE,wBACF,CACA,4FAEE,wBAAyB,CADzB,UAEF,CACA,+CACE,wBACF,CACA,gDACE,wBACF,CACA,4EACE,2CAA0C,CAA1C,mCACF,CACA,6CACE,uBACF,CAKA,qGAEE,wBAAyB,CADzB,aAEF;AC7XA,+CAA+C\",\"sourcesContent\":[\".v-sidebar-menu {\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  bottom: 0;\\n  display: flex;\\n  flex-direction: column;\\n  z-index: 999;\\n  box-sizing: border-box;\\n  width: 100%;\\n  text-align: left;\\n  transition: 0.3s max-width ease;\\n}\\n.v-sidebar-menu * {\\n  box-sizing: border-box;\\n}\\n.v-sidebar-menu .vsm--scroll-wrapper {\\n  position: relative;\\n  display: flex;\\n  flex: 1;\\n  min-height: 0;\\n}\\n.v-sidebar-menu .vsm--scroll-wrapper:hover .vsm--scroll-bar, .v-sidebar-menu .vsm--scroll-wrapper:focus .vsm--scroll-bar, .v-sidebar-menu .vsm--scroll-wrapper:active .vsm--scroll-bar {\\n  opacity: 1;\\n}\\n.v-sidebar-menu .vsm--scroll-overflow {\\n  overflow: hidden;\\n  width: 100%;\\n  height: 100%;\\n}\\n.v-sidebar-menu .vsm--scroll {\\n  overflow-y: scroll;\\n  overflow-x: hidden;\\n  height: 100%;\\n  -ms-overflow-style: none;\\n  scrollbar-width: none;\\n}\\n.v-sidebar-menu .vsm--scroll::-webkit-scrollbar {\\n  width: 0;\\n  height: 0;\\n  display: none;\\n}\\n.v-sidebar-menu .vsm--scroll > .vsm--menu {\\n  position: static !important;\\n  transition: 0.3s width ease;\\n}\\n.v-sidebar-menu .vsm--scroll-bar {\\n  position: absolute;\\n  top: 2px;\\n  bottom: 2px;\\n  right: 2px;\\n  width: 6px;\\n  border-radius: 4px;\\n  z-index: 5;\\n  opacity: 0;\\n  transition: 0.3s opacity ease;\\n}\\n.v-sidebar-menu .vsm--scroll-thumb {\\n  display: block;\\n  background-color: #aaa;\\n  border-radius: 4px;\\n  cursor: pointer;\\n  user-select: none;\\n  opacity: 0.5;\\n  transition: 0.3s opacity ease;\\n}\\n.v-sidebar-menu .vsm--scroll-thumb:hover {\\n  opacity: 1;\\n}\\n.v-sidebar-menu .vsm--menu,\\n.v-sidebar-menu .vsm--dropdown {\\n  padding: 0;\\n  margin: 0;\\n  list-style: none;\\n}\\n.v-sidebar-menu .vsm--dropdown {\\n  padding: 5px;\\n}\\n.v-sidebar-menu .vsm--item {\\n  position: static !important;\\n  display: block;\\n  width: 100%;\\n  white-space: nowrap;\\n}\\n.v-sidebar-menu .vsm--link {\\n  position: static !important;\\n  display: flex;\\n  align-items: center;\\n  font-size: 16px;\\n  font-weight: 400;\\n  padding: 10px 15px;\\n  line-height: 30px;\\n  text-decoration: none;\\n  user-select: none;\\n  transition: 0.3s all ease;\\n}\\n.v-sidebar-menu .vsm--link_active {\\n  font-weight: 600;\\n}\\n.v-sidebar-menu .vsm--link_disabled {\\n  opacity: 0.4;\\n  pointer-events: none;\\n}\\n.v-sidebar-menu .vsm--link_level-1 .vsm--icon {\\n  height: 35px;\\n  width: 35px;\\n  flex-shrink: 0;\\n  border-radius: 3px;\\n}\\n.v-sidebar-menu .vsm--icon {\\n  height: 25px;\\n  width: 25px;\\n  display: flex;\\n  align-items: center;\\n  justify-content: center;\\n  margin-right: 15px;\\n  z-index: 20;\\n}\\n.v-sidebar-menu .vsm--title {\\n  display: flex;\\n  align-items: center;\\n  flex: 1;\\n}\\n.v-sidebar-menu .vsm--title > span:first-child {\\n  flex-grow: 1;\\n}\\n.v-sidebar-menu .vsm--title_hidden {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  padding: 0;\\n  margin: -1px;\\n  overflow: hidden;\\n  clip: rect(0, 0, 0, 0);\\n  border: 0;\\n}\\n.v-sidebar-menu .vsm--arrow {\\n  width: 30px;\\n  height: 30px;\\n  font-size: 14px;\\n  text-align: center;\\n  display: flex;\\n  justify-content: center;\\n  align-items: center;\\n}\\n.v-sidebar-menu .vsm--arrow_default {\\n  position: relative;\\n  width: 12px;\\n  height: 12px;\\n  transition: transform 0.3s ease;\\n}\\n.v-sidebar-menu .vsm--arrow_default:before {\\n  content: \\\"\\\";\\n  width: 6px;\\n  height: 6px;\\n  border-left: 2px solid;\\n  border-bottom: 2px solid;\\n  transform: rotate(-135deg);\\n  display: inline-block;\\n  position: absolute;\\n  top: 2px;\\n  left: 0;\\n  box-sizing: content-box;\\n}\\n.v-sidebar-menu .vsm--arrow_open .vsm--arrow_default {\\n  transform: rotate(90deg);\\n}\\n.v-sidebar-menu .vsm--header {\\n  font-size: 14px;\\n  font-weight: 600;\\n  padding: 10px 15px;\\n  white-space: nowrap;\\n  text-transform: uppercase;\\n}\\n.v-sidebar-menu .vsm--badge_default {\\n  padding: 0px 6px;\\n  font-size: 12px;\\n  border-radius: 3px;\\n  height: 20px;\\n  line-height: 20px;\\n  font-weight: 600;\\n  text-transform: uppercase;\\n}\\n.v-sidebar-menu .vsm--toggle-btn {\\n  width: 100%;\\n  height: 65px;\\n  font-size: 18px;\\n  text-align: center;\\n  cursor: pointer;\\n  border: none;\\n  display: flex;\\n  justify-content: center;\\n  align-items: center;\\n}\\n.v-sidebar-menu .vsm--toggle-btn_default {\\n  position: relative;\\n  width: 12px;\\n  height: 12px;\\n}\\n.v-sidebar-menu .vsm--toggle-btn_default:before {\\n  content: \\\"\\\";\\n  display: inline-block;\\n  height: 12px;\\n  border-left: 2px solid;\\n  position: absolute;\\n  left: 0px;\\n  top: 0px;\\n}\\n.v-sidebar-menu .vsm--toggle-btn_default:after {\\n  content: \\\"\\\";\\n  display: inline-block;\\n  width: 6px;\\n  height: 6px;\\n  border-left: 2px solid;\\n  border-bottom: 2px solid;\\n  position: absolute;\\n  left: 4px;\\n  top: 2px;\\n  transform: rotate(45deg);\\n  box-sizing: content-box;\\n}\\n.v-sidebar-menu.vsm_collapsed .vsm--link_level-1.vsm--link_hover, .v-sidebar-menu.vsm_collapsed .vsm--link_level-1:hover {\\n  background-color: transparent !important;\\n}\\n.v-sidebar-menu.vsm_collapsed .vsm--toggle-btn_default {\\n  transform: scaleX(-1);\\n}\\n.v-sidebar-menu.vsm_collapsed.vsm_rtl .vsm--toggle-btn_default {\\n  transform: scaleX(1);\\n}\\n.v-sidebar-menu.vsm_collapsed .vsm--scroll-wrapper {\\n  width: calc(100% + 8px);\\n}\\n.v-sidebar-menu.vsm_rtl {\\n  right: 0;\\n  left: inherit;\\n  text-align: right;\\n  direction: rtl;\\n}\\n.v-sidebar-menu.vsm_rtl .vsm--icon {\\n  margin-left: 15px;\\n  margin-right: 0px;\\n}\\n.v-sidebar-menu.vsm_rtl .vsm--arrow_default {\\n  transform: scaleX(-1);\\n}\\n.v-sidebar-menu.vsm_rtl .vsm--arrow_open .vsm--arrow_default {\\n  transform: rotate(-90deg) scaleX(-1);\\n}\\n.v-sidebar-menu.vsm_rtl .vsm--toggle-btn_default {\\n  transform: scaleX(-1);\\n}\\n.v-sidebar-menu.vsm_rtl .vsm--scroll-bar {\\n  right: inherit;\\n  left: 2px;\\n}\\n.v-sidebar-menu.vsm_relative {\\n  position: relative;\\n  height: 100%;\\n}\\n.v-sidebar-menu .expand-enter-active,\\n.v-sidebar-menu .expand-leave-active {\\n  transition: height 0.3s ease;\\n  overflow: hidden;\\n}\\n.v-sidebar-menu .expand-enter-from,\\n.v-sidebar-menu .expand-leave-to {\\n  height: 0 !important;\\n}\\n.v-sidebar-menu .slide-animation-enter-active {\\n  transition: width 0.3s ease;\\n}\\n.v-sidebar-menu .slide-animation-leave-active {\\n  transition: width 0.3s ease;\\n}\\n.v-sidebar-menu .slide-animation-enter-from,\\n.v-sidebar-menu .slide-animation-leave-to {\\n  width: 0 !important;\\n}\\n\\n.v-sidebar-menu {\\n  background-color: #2a2a2e;\\n}\\n.v-sidebar-menu .vsm--link {\\n  color: #fff;\\n}\\n.v-sidebar-menu .vsm--link_level-1.vsm--link_active {\\n  box-shadow: 3px 0px 0px 0px #4285f4 inset;\\n}\\n.v-sidebar-menu .vsm--link_level-1 .vsm--icon {\\n  background-color: #1e1e21;\\n}\\n.v-sidebar-menu .vsm--link_hover {\\n  background-color: rgba(30, 30, 33, 0.5);\\n}\\n.v-sidebar-menu .vsm--link_mobile {\\n  color: #fff;\\n}\\n.v-sidebar-menu.vsm_expanded .vsm--link_level-1.vsm--link_open {\\n  color: #fff;\\n  background-color: #4285f4;\\n}\\n.v-sidebar-menu.vsm_expanded .vsm--link_level-1.vsm--link_open .vsm--icon {\\n  background-color: #4285f4;\\n}\\n.v-sidebar-menu.vsm_collapsed .vsm--link_level-1.vsm--link_hover .vsm--icon {\\n  color: #fff;\\n  background-color: #4285f4;\\n}\\n.v-sidebar-menu .vsm--dropdown {\\n  background-color: #36363b;\\n}\\n.v-sidebar-menu .vsm--mobile-bg {\\n  background-color: #4285f4;\\n}\\n.v-sidebar-menu.vsm_rtl .vsm--link_level-1.vsm--link_active {\\n  box-shadow: -3px 0px 0px 0px #4285f4 inset;\\n}\\n.v-sidebar-menu .vsm--header {\\n  color: rgba(255, 255, 255, 0.7);\\n}\\n.v-sidebar-menu .vsm--badge_default {\\n  color: #fff;\\n  background-color: #1e1e21;\\n}\\n.v-sidebar-menu .vsm--toggle-btn {\\n  color: #fff;\\n  background-color: #1e1e21;\\n}\\n\\n.v-sidebar-menu.vsm_white-theme {\\n  background-color: #fff;\\n}\\n.v-sidebar-menu.vsm_white-theme .vsm--link {\\n  color: #262626;\\n}\\n.v-sidebar-menu.vsm_white-theme .vsm--link_level-1.vsm--link_active {\\n  box-shadow: 3px 0px 0px 0px #4285f4 inset;\\n}\\n.v-sidebar-menu.vsm_white-theme .vsm--link_level-1.vsm--link_active .vsm--icon {\\n  color: #fff;\\n  background-color: #262626;\\n}\\n.v-sidebar-menu.vsm_white-theme .vsm--link_level-1 .vsm--icon {\\n  background-color: #bbc5d6;\\n}\\n.v-sidebar-menu.vsm_white-theme .vsm--link_hover {\\n  background-color: rgba(242, 242, 242, 0.5);\\n}\\n.v-sidebar-menu.vsm_white-theme .vsm--link_mobile {\\n  color: #fff;\\n}\\n.v-sidebar-menu.vsm_white-theme.vsm_expanded .vsm--link_level-1.vsm--link_open {\\n  color: #fff;\\n  background-color: #4285f4;\\n}\\n.v-sidebar-menu.vsm_white-theme.vsm_expanded .vsm--link_level-1.vsm--link_open .vsm--icon {\\n  background-color: #4285f4;\\n}\\n.v-sidebar-menu.vsm_white-theme.vsm_collapsed .vsm--link_level-1.vsm--link_hover .vsm--icon {\\n  color: #fff;\\n  background-color: #4285f4;\\n}\\n.v-sidebar-menu.vsm_white-theme .vsm--dropdown {\\n  background-color: #e3e3e3;\\n}\\n.v-sidebar-menu.vsm_white-theme .vsm--mobile-bg {\\n  background-color: #4285f4;\\n}\\n.v-sidebar-menu.vsm_white-theme.vsm_rtl .vsm--link_level-1.vsm--link_active {\\n  box-shadow: -3px 0px 0px 0px #4285f4 inset;\\n}\\n.v-sidebar-menu.vsm_white-theme .vsm--header {\\n  color: rgba(38, 38, 38, 0.7);\\n}\\n.v-sidebar-menu.vsm_white-theme .vsm--badge_default {\\n  color: #262626;\\n  background-color: #f2f2f2;\\n}\\n.v-sidebar-menu.vsm_white-theme .vsm--toggle-btn {\\n  color: #262626;\\n  background-color: #f2f2f2;\\n}\",\".v-sidebar-menu{-webkit-box-orient:vertical;-webkit-box-direction:normal;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;left:0;position:fixed;text-align:left;top:0;-webkit-transition:max-width .3s ease;transition:max-width .3s ease;width:100%;z-index:999}.v-sidebar-menu,.v-sidebar-menu *{-webkit-box-sizing:border-box;box-sizing:border-box}.v-sidebar-menu .vsm--scroll-wrapper{-webkit-box-flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;min-height:0;position:relative}.v-sidebar-menu .vsm--scroll-wrapper:active .vsm--scroll-bar,.v-sidebar-menu .vsm--scroll-wrapper:focus .vsm--scroll-bar,.v-sidebar-menu .vsm--scroll-wrapper:hover .vsm--scroll-bar{opacity:1}.v-sidebar-menu .vsm--scroll-overflow{height:100%;overflow:hidden;width:100%}.v-sidebar-menu .vsm--scroll{-ms-overflow-style:none;height:100%;overflow-x:hidden;overflow-y:scroll;scrollbar-width:none}.v-sidebar-menu .vsm--scroll::-webkit-scrollbar{display:none;height:0;width:0}.v-sidebar-menu .vsm--scroll>.vsm--menu{position:static!important;-webkit-transition:width .3s ease;transition:width .3s ease}.v-sidebar-menu .vsm--scroll-bar{bottom:2px;opacity:0;position:absolute;right:2px;top:2px;width:6px;z-index:5}.v-sidebar-menu .vsm--scroll-bar,.v-sidebar-menu .vsm--scroll-thumb{border-radius:4px;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.v-sidebar-menu .vsm--scroll-thumb{background-color:#aaa;cursor:pointer;display:block;opacity:.5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-sidebar-menu .vsm--scroll-thumb:hover{opacity:1}.v-sidebar-menu .vsm--dropdown,.v-sidebar-menu .vsm--menu{list-style:none;margin:0;padding:0}.v-sidebar-menu .vsm--dropdown{padding:5px}.v-sidebar-menu .vsm--item{display:block;position:static!important;white-space:nowrap;width:100%}.v-sidebar-menu .vsm--link{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:16px;font-weight:400;line-height:30px;padding:10px 15px;position:static!important;text-decoration:none;-webkit-transition:all .3s ease;transition:all .3s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-sidebar-menu .vsm--link_active{font-weight:600}.v-sidebar-menu .vsm--link_disabled{opacity:.4;pointer-events:none}.v-sidebar-menu .vsm--link_level-1 .vsm--icon{-ms-flex-negative:0;border-radius:3px;flex-shrink:0;height:35px;width:35px}.v-sidebar-menu .vsm--icon{-webkit-box-pack:center;-ms-flex-pack:center;height:25px;justify-content:center;margin-right:15px;width:25px;z-index:20}.v-sidebar-menu .vsm--icon,.v-sidebar-menu .vsm--title{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}.v-sidebar-menu .vsm--title{-webkit-box-flex:1;-ms-flex:1;flex:1}.v-sidebar-menu .vsm--title>span:first-child{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.v-sidebar-menu .vsm--title_hidden{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.v-sidebar-menu .vsm--arrow{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:14px;height:30px;justify-content:center;text-align:center;width:30px}.v-sidebar-menu .vsm--arrow_default{height:12px;position:relative;-webkit-transition:-webkit-transform .3s ease;transition:-webkit-transform .3s ease;transition:transform .3s ease;transition:transform .3s ease,-webkit-transform .3s ease;width:12px}.v-sidebar-menu .vsm--arrow_default:before{border-bottom:2px solid;border-left:2px solid;-webkit-box-sizing:content-box;box-sizing:content-box;content:\\\"\\\";display:inline-block;height:6px;left:0;position:absolute;top:2px;-webkit-transform:rotate(-135deg);transform:rotate(-135deg);width:6px}.v-sidebar-menu .vsm--arrow_open .vsm--arrow_default{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.v-sidebar-menu .vsm--header{font-size:14px;font-weight:600;padding:10px 15px;text-transform:uppercase;white-space:nowrap}.v-sidebar-menu .vsm--badge_default{border-radius:3px;font-size:12px;font-weight:600;height:20px;line-height:20px;padding:0 6px;text-transform:uppercase}.v-sidebar-menu .vsm--toggle-btn{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:none;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:18px;height:65px;justify-content:center;text-align:center;width:100%}.v-sidebar-menu .vsm--toggle-btn_default{height:12px;position:relative;width:12px}.v-sidebar-menu .vsm--toggle-btn_default:before{border-left:2px solid;content:\\\"\\\";display:inline-block;height:12px;left:0;position:absolute;top:0}.v-sidebar-menu .vsm--toggle-btn_default:after{border-bottom:2px solid;border-left:2px solid;-webkit-box-sizing:content-box;box-sizing:content-box;content:\\\"\\\";display:inline-block;height:6px;left:4px;position:absolute;top:2px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:6px}.v-sidebar-menu.vsm_collapsed .vsm--link_level-1.vsm--link_hover,.v-sidebar-menu.vsm_collapsed .vsm--link_level-1:hover{background-color:transparent!important}.v-sidebar-menu.vsm_collapsed .vsm--toggle-btn_default{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.v-sidebar-menu.vsm_collapsed.vsm_rtl .vsm--toggle-btn_default{-webkit-transform:scaleX(1);transform:scaleX(1)}.v-sidebar-menu.vsm_collapsed .vsm--scroll-wrapper{width:calc(100% + 8px)}.v-sidebar-menu.vsm_rtl{direction:rtl;left:inherit;right:0;text-align:right}.v-sidebar-menu.vsm_rtl .vsm--icon{margin-left:15px;margin-right:0}.v-sidebar-menu.vsm_rtl .vsm--arrow_default{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.v-sidebar-menu.vsm_rtl .vsm--arrow_open .vsm--arrow_default{-webkit-transform:rotate(-90deg) scaleX(-1);transform:rotate(-90deg) scaleX(-1)}.v-sidebar-menu.vsm_rtl .vsm--toggle-btn_default{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.v-sidebar-menu.vsm_rtl .vsm--scroll-bar{left:2px;right:inherit}.v-sidebar-menu.vsm_relative{height:100%;position:relative}.v-sidebar-menu .expand-enter-active,.v-sidebar-menu .expand-leave-active{overflow:hidden;-webkit-transition:height .3s ease;transition:height .3s ease}.v-sidebar-menu .expand-enter-from,.v-sidebar-menu .expand-leave-to{height:0!important}.v-sidebar-menu .slide-animation-enter-active,.v-sidebar-menu .slide-animation-leave-active{-webkit-transition:width .3s ease;transition:width .3s ease}.v-sidebar-menu .slide-animation-enter-from,.v-sidebar-menu .slide-animation-leave-to{width:0!important}.v-sidebar-menu{background-color:#2a2a2e}.v-sidebar-menu .vsm--link{color:#fff}.v-sidebar-menu .vsm--link_level-1.vsm--link_active{-webkit-box-shadow:inset 3px 0 0 0 #4285f4;box-shadow:inset 3px 0 0 0 #4285f4}.v-sidebar-menu .vsm--link_level-1 .vsm--icon{background-color:#1e1e21}.v-sidebar-menu .vsm--link_hover{background-color:rgba(30,30,33,.5)}.v-sidebar-menu .vsm--link_mobile{color:#fff}.v-sidebar-menu.vsm_expanded .vsm--link_level-1.vsm--link_open{background-color:#4285f4;color:#fff}.v-sidebar-menu.vsm_expanded .vsm--link_level-1.vsm--link_open .vsm--icon{background-color:#4285f4}.v-sidebar-menu.vsm_collapsed .vsm--link_level-1.vsm--link_hover .vsm--icon{background-color:#4285f4;color:#fff}.v-sidebar-menu .vsm--dropdown{background-color:#36363b}.v-sidebar-menu .vsm--mobile-bg{background-color:#4285f4}.v-sidebar-menu.vsm_rtl .vsm--link_level-1.vsm--link_active{-webkit-box-shadow:inset -3px 0 0 0 #4285f4;box-shadow:inset -3px 0 0 0 #4285f4}.v-sidebar-menu .vsm--header{color:hsla(0,0%,100%,.7)}.v-sidebar-menu .vsm--badge_default,.v-sidebar-menu .vsm--toggle-btn{background-color:#1e1e21;color:#fff}.v-sidebar-menu.vsm_white-theme{background-color:#fff}.v-sidebar-menu.vsm_white-theme .vsm--link{color:#262626}.v-sidebar-menu.vsm_white-theme .vsm--link_level-1.vsm--link_active{-webkit-box-shadow:inset 3px 0 0 0 #4285f4;box-shadow:inset 3px 0 0 0 #4285f4}.v-sidebar-menu.vsm_white-theme .vsm--link_level-1.vsm--link_active .vsm--icon{background-color:#262626;color:#fff}.v-sidebar-menu.vsm_white-theme .vsm--link_level-1 .vsm--icon{background-color:#bbc5d6}.v-sidebar-menu.vsm_white-theme .vsm--link_hover{background-color:hsla(0,0%,95%,.5)}.v-sidebar-menu.vsm_white-theme .vsm--link_mobile{color:#fff}.v-sidebar-menu.vsm_white-theme.vsm_expanded .vsm--link_level-1.vsm--link_open{background-color:#4285f4;color:#fff}.v-sidebar-menu.vsm_white-theme.vsm_expanded .vsm--link_level-1.vsm--link_open .vsm--icon{background-color:#4285f4}.v-sidebar-menu.vsm_white-theme.vsm_collapsed .vsm--link_level-1.vsm--link_hover .vsm--icon{background-color:#4285f4;color:#fff}.v-sidebar-menu.vsm_white-theme .vsm--dropdown{background-color:#e3e3e3}.v-sidebar-menu.vsm_white-theme .vsm--mobile-bg{background-color:#4285f4}.v-sidebar-menu.vsm_white-theme.vsm_rtl .vsm--link_level-1.vsm--link_active{-webkit-box-shadow:inset -3px 0 0 0 #4285f4;box-shadow:inset -3px 0 0 0 #4285f4}.v-sidebar-menu.vsm_white-theme .vsm--header{color:rgba(38,38,38,.7)}.v-sidebar-menu.vsm_white-theme .vsm--badge_default,.v-sidebar-menu.vsm_white-theme .vsm--toggle-btn{background-color:#f2f2f2;color:#262626}\\n/*# sourceMappingURL=vue-sidebar-menu.css.map */\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0xMi51c2VbMV0hLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMTIudXNlWzJdIS4vbm9kZV9tb2R1bGVzL3Z1ZS1zaWRlYmFyLW1lbnUvZGlzdC92dWUtc2lkZWJhci1tZW51LmNzcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQzRHO0FBQzdCO0FBQy9FLDhCQUE4QixzRUFBMkIsQ0FBQywyRkFBcUM7QUFDL0Y7QUFDQSwwREFBMEQsNEJBQTRCLDZCQUE2QixTQUFTLG9CQUFvQixvQkFBb0IsYUFBYSwwQkFBMEIsc0JBQXNCLE9BQU8sZUFBZSxnQkFBZ0IsTUFBTSxzQ0FBc0MsOEJBQThCLFdBQVcsWUFBWSxrQ0FBa0MsOEJBQThCLHNCQUFzQixxQ0FBcUMsbUJBQW1CLG9CQUFvQixvQkFBb0IsYUFBYSxXQUFXLE9BQU8sYUFBYSxrQkFBa0IscUxBQXFMLFVBQVUsc0NBQXNDLFlBQVksZ0JBQWdCLFdBQVcsNkJBQTZCLHdCQUF3QixZQUFZLGtCQUFrQixrQkFBa0IscUJBQXFCLGdEQUFnRCxhQUFhLFNBQVMsUUFBUSx3Q0FBd0MsMEJBQTBCLGtDQUFrQywwQkFBMEIsaUNBQWlDLFdBQVcsVUFBVSxrQkFBa0IsVUFBVSxRQUFRLFVBQVUsVUFBVSxvRUFBb0Usa0JBQWtCLG9DQUFvQyw0QkFBNEIsbUNBQW1DLHNCQUFzQixlQUFlLGNBQWMsV0FBVyx5QkFBeUIsc0JBQXNCLHFCQUFxQixpQkFBaUIseUNBQXlDLFVBQVUsMERBQTBELGdCQUFnQixTQUFTLFVBQVUsK0JBQStCLFlBQVksMkJBQTJCLGNBQWMsMEJBQTBCLG1CQUFtQixXQUFXLDJCQUEyQix5QkFBeUIsc0JBQXNCLG1CQUFtQixvQkFBb0Isb0JBQW9CLGFBQWEsZUFBZSxnQkFBZ0IsaUJBQWlCLGtCQUFrQiwwQkFBMEIscUJBQXFCLGdDQUFn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Qyx5QkFBeUIsZ0RBQWdELHlCQUF5Qiw0RUFBNEUsNENBQTRDLG9DQUFvQyw2Q0FBNkMsd0JBQXdCLHFHQUFxRyx5QkFBeUIsY0FBYyxxRUFBcUU7QUFDcHMrQjtBQUNBLGlFQUFlLHVCQUF1QixFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Z1ZS1zaWRlYmFyLW1lbnUvZGlzdC92dWUtc2lkZWJhci1tZW51LmNzcz9hOTlhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi52LXNpZGViYXItbWVudXstd2Via2l0LWJveC1vcmllbnQ6dmVydGljYWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDtib3R0b206MDtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1uO2xlZnQ6MDtwb3NpdGlvbjpmaXhlZDt0ZXh0LWFsaWduOmxlZnQ7dG9wOjA7LXdlYmtpdC10cmFuc2l0aW9uOm1heC13aWR0aCAuM3MgZWFzZTt0cmFuc2l0aW9uOm1heC13aWR0aCAuM3MgZWFzZTt3aWR0aDoxMDAlO3otaW5kZXg6OTk5fS52LXNpZGViYXItbWVudSwudi1zaWRlYmFyLW1lbnUgKnstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3h9LnYtc2lkZWJhci1tZW51IC52c20tLXNjcm9sbC13cmFwcGVyey13ZWJraXQtYm94LWZsZXg6MTtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4OjE7ZmxleDoxO21pbi1oZWlnaHQ6MDtwb3NpdGlvbjpyZWxhdGl2ZX0udi1zaWRlYmFyLW1lbnUgLnZzbS0tc2Nyb2xsLXdyYXBwZXI6YWN0aXZlIC52c20tLXNjcm9sbC1iYXIsLnYtc2lkZWJhci1tZW51IC52c20tLXNjcm9sbC13cmFwcGVyOmZvY3VzIC52c20tLXNjcm9sbC1iYXIsLnYtc2lkZWJhci1tZW51IC52c20tLXNjcm9sbC13cmFwcGVyOmhvdmVyIC52c20tLXNjcm9sbC1iYXJ7b3BhY2l0eToxfS52LXNpZGViYXItbWVudSAudnNtLS1zY3JvbGwtb3ZlcmZsb3d7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVuO3dpZHRoOjEwMCV9LnYtc2lkZWJhci1tZW51IC52c20tLXNjcm9sbHstbXMtb3ZlcmZsb3ctc3R5bGU6bm9uZTtoZWlnaHQ6MTAwJTtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OnNjcm9sbDtzY3JvbGxiYXItd2lkdGg6bm9uZX0udi1zaWRlYmFyLW1lbnUgLnZzbS0tc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhcntkaXNwbGF5Om5vbmU7aGVpZ2h0OjA7d2lkdGg6MH0udi1zaWRlYmFyLW1lbnUgLnZzbS0tc2Nyb2xsPi52c20tLW1lbnV7cG9zaXRpb246c3RhdGljIWltcG9ydGFudDstd2Via2l0LXRyYW5zaXRpb246d2lkdGggLjNzIGVhc2U7dHJhbnNpdGlvbjp3aWR0aCAuM3MgZWFzZX0udi1zaWRlYmFyLW1lbnUgLnZzbS0tc2Nyb2xsLWJhcntib3R0b206MnB4O29wYWNpdHk6MDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoycHg7dG9wOjJweDt3aWR0aDo2cHg7ei1pbmRleDo1fS52LXNpZGViYXItbWVudSAudnNtLS1zY3JvbGwtYmFyLC52LXNpZGViYXItbWVudSAudnNtLS1zY3JvbGwtdGh1bWJ7Ym9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjNzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4zcyBlYXNlfS52LXNpZGViYXItbWVudSAudnNtLS1zY3JvbGwtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojYWFhO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6YmxvY2s7b3BhY2l0eTouNTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LnYtc2lkZWJhci1tZW51IC52c20tLXNjcm9sbC10aHVtYjpob3ZlcntvcGFjaXR5OjF9LnYtc2lkZWJhci1tZW51IC52c20tLWRyb3Bkb3duLC52LXNpZGViYXItbWVudSAudnNtLS1tZW51e2xpc3Qtc3R5bGU6bm9uZTttYXJnaW46MDtwYWRkaW5nOjB9LnYtc2lkZWJhci1tZW51IC52c20tLWRyb3Bkb3due3BhZGRpbmc6NXB4fS52LXNpZGViYXItbWVudSAudnNtLS1pdGVte2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246c3RhdGljIWltcG9ydGFudDt3aGl0ZS1zcGFjZTpub3dyYXA7d2lkdGg6MTAwJX0udi1zaWRlYmFyLW1lbnUgLnZzbS0tbGlua3std2Via2l0LWJveC1hbGlnbjpjZW50ZXI7LW1zLWZsZXgtYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4O2ZvbnQtc2l6ZToxNnB4O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDozMHB4O3BhZGRpbmc6MTBweCAxNXB4O3Bvc2l0aW9uOnN0YXRpYyFpbXBvcnRhbnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTt0cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LnYtc2lkZWJhci1tZW51IC52c20tLWxpbmtfYWN0aXZle2ZvbnQtd2VpZ2h0OjYwMH0udi1zaWRlYmFyLW1lbnUgLnZzbS0tbGlua19kaXNhYmxlZHtvcGFjaXR5Oi40O3BvaW50ZXItZXZlbnRzOm5vbmV9LnYtc2lkZWJhci1tZW51IC52c20tLWxpbmtfbGV2ZWwtMSAudnNtLS1pY29uey1tcy1mbGV4LW5lZ2F0aXZlOjA7Ym9yZGVyLXJhZGl1czozcHg7ZmxleC1zaHJpbms6MDtoZWlnaHQ6MzVweDt3aWR0aDozNXB4fS52LXNpZGViYXItbWVudSAudnNtLS1pY29uey13ZWJraXQtYm94LXBhY2s6Y2VudGVyOy1tcy1mbGV4LXBhY2s6Y2VudGVyO2hlaWdodDoyNXB4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luLXJpZ2h0OjE1cHg7d2lkdGg6MjVweDt6LWluZGV4OjIwfS52LXNpZGViYXItbWVudSAudnNtLS1pY29uLC52LXNpZGViYXItbWVudSAudnNtLS10aXRsZXstd2Via2l0LWJveC1hbGlnbjpjZW50ZXI7LW1zLWZsZXgtYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4fS52LXNpZGViYXItbWVudSAudnNtLS10aXRsZXstd2Via2l0LWJveC1mbGV4OjE7LW1zLWZsZXg6MTtmbGV4OjF9LnYtc2lkZWJhci1tZW51IC52c20tLXRpdGxlPnNwYW46Zmlyc3QtY2hpbGR7LXdlYmtpdC1ib3gtZmxleDoxOy1tcy1mbGV4LXBvc2l0aXZlOjE7ZmxleC1ncm93OjF9LnYtc2lkZWJhci1tZW51IC52c20tLXRpdGxlX2hpZGRlbntjbGlwOnJlY3QoMCwwLDAsMCk7Ym9yZGVyOjA7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweH0udi1zaWRlYmFyLW1lbnUgLnZzbS0tYXJyb3d7LXdlYmtpdC1ib3gtcGFjazpjZW50ZXI7LW1zLWZsZXgtcGFjazpjZW50ZXI7LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDtmb250LXNpemU6MTRweDtoZWlnaHQ6MzBweDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3RleHQtYWxpZ246Y2VudGVyO3dpZHRoOjMwcHh9LnYtc2lkZWJhci1tZW51IC52c20tLWFycm93X2RlZmF1bHR7aGVpZ2h0OjEycHg7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC10cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlO3RyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjNzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjNzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjNzIGVhc2UsIC13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlO3RyYW5zaXRpb246dHJhbnNmb3JtIC4zcyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlO3dpZHRoOjEycHh9LnYtc2lkZWJhci1tZW51IC52c20tLWFycm93X2RlZmF1bHQ6YmVmb3Jle2JvcmRlci1ib3R0b206MnB4IHNvbGlkO2JvcmRlci1sZWZ0OjJweCBzb2xpZDstd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtjb250ZW50OlxcXCJcXFwiO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDo2cHg7bGVmdDowO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoycHg7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC0xMzVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTEzNWRlZyk7d2lkdGg6NnB4fS52LXNpZGViYXItbWVudSAudnNtLS1hcnJvd19vcGVuIC52c20tLWFycm93X2RlZmF1bHR7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDkwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDkwZGVnKX0udi1zaWRlYmFyLW1lbnUgLnZzbS0taGVhZGVye2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjYwMDtwYWRkaW5nOjEwcHggMTVweDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7d2hpdGUtc3BhY2U6bm93cmFwfS52LXNpZGViYXItbWVudSAudnNtLS1iYWRnZV9kZWZhdWx0e2JvcmRlci1yYWRpdXM6M3B4O2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjYwMDtoZWlnaHQ6MjBweDtsaW5lLWhlaWdodDoyMHB4O3BhZGRpbmc6MCA2cHg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfS52LXNpZGViYXItbWVudSAudnNtLS10b2dnbGUtYnRuey13ZWJraXQtYm94LXBhY2s6Y2VudGVyOy1tcy1mbGV4LXBhY2s6Y2VudGVyOy13ZWJraXQtYm94LWFsaWduOmNlbnRlcjstbXMtZmxleC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2JvcmRlcjpub25lO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7Zm9udC1zaXplOjE4cHg7aGVpZ2h0OjY1cHg7anVzdGlmeS1jb250ZW50OmNlbnRlcjt0ZXh0LWFsaWduOmNlbnRlcjt3aWR0aDoxMDAlfS52LXNpZGViYXItbWVudSAudnNtLS10b2dnbGUtYnRuX2RlZmF1bHR7aGVpZ2h0OjEycHg7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTJweH0udi1zaWRlYmFyLW1lbnUgLnZzbS0tdG9nZ2xlLWJ0bl9kZWZhdWx0OmJlZm9yZXtib3JkZXItbGVmdDoycHggc29saWQ7Y29udGVudDpcXFwiXFxcIjtkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MTJweDtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjB9LnYtc2lkZWJhci1tZW51IC52c20tLXRvZ2dsZS1idG5fZGVmYXVsdDphZnRlcntib3JkZXItYm90dG9tOjJweCBzb2xpZDtib3JkZXItbGVmdDoycHggc29saWQ7LXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Y29udGVudC1ib3g7Y29udGVudDpcXFwiXFxcIjtkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6NnB4O2xlZnQ6NHB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDoycHg7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt3aWR0aDo2cHh9LnYtc2lkZWJhci1tZW51LnZzbV9jb2xsYXBzZWQgLnZzbS0tbGlua19sZXZlbC0xLnZzbS0tbGlua19ob3Zlciwudi1zaWRlYmFyLW1lbnUudnNtX2NvbGxhcHNlZCAudnNtLS1saW5rX2xldmVsLTE6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9LnYtc2lkZWJhci1tZW51LnZzbV9jb2xsYXBzZWQgLnZzbS0tdG9nZ2xlLWJ0bl9kZWZhdWx0ey13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWCgtMSk7dHJhbnNmb3JtOnNjYWxlWCgtMSl9LnYtc2lkZWJhci1tZW51LnZzbV9jb2xsYXBzZWQudnNtX3J0bCAudnNtLS10b2dnbGUtYnRuX2RlZmF1bHR7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDEpO3RyYW5zZm9ybTpzY2FsZVgoMSl9LnYtc2lkZWJhci1tZW51LnZzbV9jb2xsYXBzZWQgLnZzbS0tc2Nyb2xsLXdyYXBwZXJ7d2lkdGg6Y2FsYygxMDAlICsgOHB4KX0udi1zaWRlYmFyLW1lbnUudnNtX3J0bHtkaXJlY3Rpb246cnRsO2xlZnQ6aW5oZXJpdDtyaWdodDowO3RleHQtYWxpZ246cmlnaHR9LnYtc2lkZWJhci1tZW51LnZzbV9ydGwgLnZzbS0taWNvbnttYXJnaW4tbGVmdDoxNXB4O21hcmdpbi1yaWdodDowfS52LXNpZGViYXItbWVudS52c21fcnRsIC52c20tLWFycm93X2RlZmF1bHR7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKC0xKTt0cmFuc2Zvcm06c2NhbGVYKC0xKX0udi1zaWRlYmFyLW1lbnUudnNtX3J0bCAudnNtLS1hcnJvd19vcGVuIC52c20tLWFycm93X2RlZmF1bHR7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC05MGRlZykgc2NhbGVYKC0xKTt0cmFuc2Zvcm06cm90YXRlKC05MGRlZykgc2NhbGVYKC0xKX0udi1zaWRlYmFyLW1lbnUudnNtX3J0bCAudnNtLS10b2dnbGUtYnRuX2RlZmF1bHR7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKC0xKTt0cmFuc2Zvcm06c2NhbGVYKC0xKX0udi1zaWRlYmFyLW1lbnUudnNtX3J0bCAudnNtLS1zY3JvbGwtYmFye2xlZnQ6MnB4O3JpZ2h0OmluaGVyaXR9LnYtc2lkZWJhci1tZW51LnZzbV9yZWxhdGl2ZXtoZWlnaHQ6MTAwJTtwb3NpdGlvbjpyZWxhdGl2ZX0udi1zaWRlYmFyLW1lbnUgLmV4cGFuZC1lbnRlci1hY3RpdmUsLnYtc2lkZWJhci1tZW51IC5leHBhbmQtbGVhdmUtYWN0aXZle292ZXJmbG93OmhpZGRlbjstd2Via2l0LXRyYW5zaXRpb246aGVpZ2h0IC4zcyBlYXNlO3RyYW5zaXRpb246aGVpZ2h0IC4zcyBlYXNlfS52LXNpZGViYXItbWVudSAuZXhwYW5kLWVudGVyLWZyb20sLnYtc2lkZWJhci1tZW51IC5leHBhbmQtbGVhdmUtdG97aGVpZ2h0OjAhaW1wb3J0YW50fS52LXNpZGViYXItbWVudSAuc2xpZGUtYW5pbWF0aW9uLWVudGVyLWFjdGl2ZSwudi1zaWRlYmFyLW1lbnUgLnNsaWRlLWFuaW1hdGlvbi1sZWF2ZS1hY3RpdmV7LXdlYmtpdC10cmFuc2l0aW9uOndpZHRoIC4zcyBlYXNlO3RyYW5zaXRpb246d2lkdGggLjNzIGVhc2V9LnYtc2lkZWJhci1tZW51IC5zbGlkZS1hbmltYXRpb24tZW50ZXItZnJvbSwudi1zaWRlYmFyLW1lbnUgLnNsaWRlLWFuaW1hdGlvbi1sZWF2ZS10b3t3aWR0aDowIWltcG9ydGFudH0udi1zaWRlYmFyLW1lbnV7YmFja2dyb3VuZC1jb2xvcjojMmEyYTJlfS52LXNpZGViYXItbWVudSAudnNtLS1saW5re2NvbG9yOiNmZmZ9LnYtc2lkZWJhci1tZW51IC52c20tLWxpbmtfbGV2ZWwtMS52c20tLWxpbmtfYWN0aXZley13ZWJraXQtYm94LXNoYWRvdzppbnNldCAzcHggMCAwIDAgIzQyODVmNDtib3gtc2hhZG93Omluc2V0IDNweCAwIDAgMCAjNDI4NWY0fS52LXNpZGViYXItbWVudSAudnNtLS1saW5rX2xldmVsLTEgLnZzbS0taWNvbntiYWNrZ3JvdW5kLWNvbG9yOiMxZTFlMjF9LnYtc2lkZWJhci1tZW51IC52c20tLWxpbmtfaG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDMwLDMwLDMzLC41KX0udi1zaWRlYmFyLW1lbnUgLnZzbS0tbGlua19tb2JpbGV7Y29sb3I6I2ZmZn0udi1zaWRlYmFyLW1lbnUudnNtX2V4cGFuZGVkIC52c20tLWxpbmtfbGV2ZWwtMS52c20tLWxpbmtfb3BlbntiYWNrZ3JvdW5kLWNvbG9yOiM0Mjg1ZjQ7Y29sb3I6I2ZmZn0udi1zaWRlYmFyLW1lbnUudnNtX2V4cGFuZGVkIC52c20tLWxpbmtfbGV2ZWwtMS52c20tLWxpbmtfb3BlbiAudnNtLS1pY29ue2JhY2tncm91bmQtY29sb3I6IzQyODVmNH0udi1zaWRlYmFyLW1lbnUudnNtX2NvbGxhcHNlZCAudnNtLS1saW5rX2xldmVsLTEudnNtLS1saW5rX2hvdmVyIC52c20tLWljb257YmFja2dyb3VuZC1jb2xvcjojNDI4NWY0O2NvbG9yOiNmZmZ9LnYtc2lkZWJhci1tZW51IC52c20tLWRyb3Bkb3due2JhY2tncm91bmQtY29sb3I6IzM2MzYzYn0udi1zaWRlYmFyLW1lbnUgLnZzbS0tbW9iaWxlLWJne2JhY2tncm91bmQtY29sb3I6IzQyODVmNH0udi1zaWRlYmFyLW1lbnUudnNtX3J0bCAudnNtLS1saW5rX2xldmVsLTEudnNtLS1saW5rX2FjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgLTNweCAwIDAgMCAjNDI4NWY0O2JveC1zaGFkb3c6aW5zZXQgLTNweCAwIDAgMCAjNDI4NWY0fS52LXNpZGViYXItbWVudSAudnNtLS1oZWFkZXJ7Y29sb3I6aHNsYSgwLDAlLDEwMCUsLjcpfS52LXNpZGViYXItbWVudSAudnNtLS1iYWRnZV9kZWZhdWx0LC52LXNpZGViYXItbWVudSAudnNtLS10b2dnbGUtYnRue2JhY2tncm91bmQtY29sb3I6IzFlMWUyMTtjb2xvcjojZmZmfS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWV7YmFja2dyb3VuZC1jb2xvcjojZmZmfS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0tbGlua3tjb2xvcjojMjYyNjI2fS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0tbGlua19sZXZlbC0xLnZzbS0tbGlua19hY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDNweCAwIDAgMCAjNDI4NWY0O2JveC1zaGFkb3c6aW5zZXQgM3B4IDAgMCAwICM0Mjg1ZjR9LnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZSAudnNtLS1saW5rX2xldmVsLTEudnNtLS1saW5rX2FjdGl2ZSAudnNtLS1pY29ue2JhY2tncm91bmQtY29sb3I6IzI2MjYyNjtjb2xvcjojZmZmfS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0tbGlua19sZXZlbC0xIC52c20tLWljb257YmFja2dyb3VuZC1jb2xvcjojYmJjNWQ2fS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0tbGlua19ob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbGEoMCwwJSw5NSUsLjUpfS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0tbGlua19tb2JpbGV7Y29sb3I6I2ZmZn0udi1zaWRlYmFyLW1lbnUudnNtX3doaXRlLXRoZW1lLnZzbV9leHBhbmRlZCAudnNtLS1saW5rX2xldmVsLTEudnNtLS1saW5rX29wZW57YmFja2dyb3VuZC1jb2xvcjojNDI4NWY0O2NvbG9yOiNmZmZ9LnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZS52c21fZXhwYW5kZWQgLnZzbS0tbGlua19sZXZlbC0xLnZzbS0tbGlua19vcGVuIC52c20tLWljb257YmFja2dyb3VuZC1jb2xvcjojNDI4NWY0fS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUudnNtX2NvbGxhcHNlZCAudnNtLS1saW5rX2xldmVsLTEudnNtLS1saW5rX2hvdmVyIC52c20tLWljb257YmFja2dyb3VuZC1jb2xvcjojNDI4NWY0O2NvbG9yOiNmZmZ9LnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZSAudnNtLS1kcm9wZG93bntiYWNrZ3JvdW5kLWNvbG9yOiNlM2UzZTN9LnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZSAudnNtLS1tb2JpbGUtYmd7YmFja2dyb3VuZC1jb2xvcjojNDI4NWY0fS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUudnNtX3J0bCAudnNtLS1saW5rX2xldmVsLTEudnNtLS1saW5rX2FjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgLTNweCAwIDAgMCAjNDI4NWY0O2JveC1zaGFkb3c6aW5zZXQgLTNweCAwIDAgMCAjNDI4NWY0fS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0taGVhZGVye2NvbG9yOnJnYmEoMzgsMzgsMzgsLjcpfS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0tYmFkZ2VfZGVmYXVsdCwudi1zaWRlYmFyLW1lbnUudnNtX3doaXRlLXRoZW1lIC52c20tLXRvZ2dsZS1idG57YmFja2dyb3VuZC1jb2xvcjojZjJmMmYyO2NvbG9yOiMyNjI2MjZ9XFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9dnVlLXNpZGViYXItbWVudS5jc3MubWFwICovXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL3Z1ZS1zaWRlYmFyLW1lbnUvZGlzdC9TaWRlYmFyTWVudS52dWUlM0Z2dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPWM0Nzg0MTRhJmxhbmcuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL3Z1ZS1zaWRlYmFyLW1lbnUvZGlzdC92dWUtc2lkZWJhci1tZW51LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxnQkFNRSwyQkFBc0IsQ0FBdEIsNEJBQXNCLENBRnRCLFFBQVMsQ0FDVCxtQkFBYSxDQUFiLG1CQUFhLENBQWIsWUFBYSxDQUNiLHlCQUFzQixDQUF0QixxQkFBc0IsQ0FIdEIsTUFBTyxDQUZQLGNBQWUsQ0FTZixlQUFnQixDQVJoQixLQUFNLENBU04scUNBQStCLENBQS9CLDZCQUErQixDQUYvQixVQUFXLENBRlgsV0FLRixDQUNBLGtDQUxFLDZCQUFzQixDQUF0QixxQkFPRixDQUNBLHFDQUdFLGtCQUFPLENBRFAsbUJBQWEsQ0FBYixtQkFBYSxDQUFiLFlBQWEsQ0FDYixVQUFPLENBQVAsTUFBTyxDQUNQLFlBQWEsQ0FIYixpQkFJRixDQUNBLHFMQUNFLFNBQ0YsQ0FDQSxzQ0FHRSxXQUFZLENBRlosZUFBZ0IsQ0FDaEIsVUFFRixDQUNBLDZCQUlFLHVCQUF3QixDQUR4QixXQUFZLENBRFosaUJBQWtCLENBRGxCLGlCQUFrQixDQUlsQixvQkFDRixDQUNBLGdEQUdFLFlBQWEsQ0FEYixRQUFTLENBRFQsT0FHRixDQUNBLHdDQUNFLHlCQUEyQixDQUMzQixpQ0FBMkIsQ0FBM0IseUJBQ0YsQ0FDQSxpQ0FHRSxVQUFXLENBS1gsU0FBVSxDQVBWLGlCQUFrQixDQUdsQixTQUFVLENBRlYsT0FBUSxDQUdSLFNBQVUsQ0FFVixTQUdGLENBQ0Esb0VBTEUsaUJBQWtCLENBR2xCLG1DQUE2QixDQUE3QiwyQkFVRixDQVJBLG1DQUVFLHFCQUFzQixDQUV0QixjQUFlLENBSGYsYUFBYyxDQUtkLFVBQVksQ0FEWix3QkFBaUIsQ0FBakIscUJBQWlCLENBQWpCLG9CQUFpQixDQUFqQixnQkFHRixDQUNBLHlDQUNFLFNBQ0YsQ0FDQSwwREFJRSxlQUFnQixDQURoQixRQUFTLENBRFQsU0FHRixDQUNBLCtCQUNFLFdBQ0YsQ0FDQSwyQkFFRSxhQUFjLENBRGQseUJBQTJCLENBRzNCLGtCQUFtQixDQURuQixVQUVGLENBQ0EsMkJBR0Usd0JBQW1CLENBQW5CLHFCQUFtQixDQUFuQixrQkFBbUIsQ0FEbkIsbUJBQWEsQ0FBYixtQkFBYSxDQUFiLFlBQWEsQ0FFYixjQUFlLENBQ2YsZUFBZ0IsQ0FFaEIsZ0JBQWlCLENBRGpCLGlCQUFrQixDQUxsQix5QkFBMkIsQ0FPM0Isb0JBQXFCLENBRXJCLCtCQUF5QixDQUF6Qix1QkFBeUIsQ0FEekIsd0JBQWlCLENBQWpCLHFCQUFpQixDQUFqQixvQkFBaUIsQ0FBakIsZ0JBRUYsQ0FDQSxrQ0FDRSxlQUNGLENBQ0Esb0NBQ0UsVUFBWSxDQUNaLG1CQUNGLENBQ0EsOENBR0UsbUJBQWMsQ0FDZCxpQkFBa0IsQ0FEbEIsYUFBYyxDQUZkLFdBQVksQ0FDWixVQUdGLENBQ0EsMkJBS0UsdUJBQXVCLENBQXZCLG9CQUF1QixDQUp2QixXQUFZLENBSVosc0JBQXVCLENBQ3ZCLGlCQUFrQixDQUpsQixVQUFXLENBS1gsVUFDRixDQUNBLHVEQUxFLHdCQUFtQixDQUFuQixxQkFBbUIsQ0FBbkIsa0JBQW1CLENBRG5CLG1CQUFhLENBQWIsbUJBQWEsQ0FBYixZQVVGLENBSkEsNEJBR0Usa0JBQU8sQ0FBUCxVQUFPLENBQVAsTUFDRixDQUNBLDZDQUNFLGtCQUFZLENBQVosbUJBQVksQ0FBWixXQUNGLENBQ0EsbUNBT0Usa0JBQXNCLENBQ3RCLFFBQVMsQ0FMVCxVQUFXLENBRVgsV0FBWSxDQUNaLGVBQWdCLENBRmhCLFNBQVUsQ0FIVixpQkFBa0IsQ0FDbEIsU0FPRixDQUNBLDRCQU1FLHVCQUF1QixDQUF2QixvQkFBdUIsQ0FDdkIsd0JBQW1CLENBQW5CLHFCQUFtQixDQUFuQixrQkFBbUIsQ0FGbkIsbUJBQWEsQ0FBYixtQkFBYSxDQUFiLFlBQWEsQ0FGYixjQUFlLENBRGYsV0FBWSxDQUlaLHNCQUF1QixDQUZ2QixpQkFBa0IsQ0FIbEIsVUFPRixDQUNBLG9DQUdFLFdBQVksQ0FGWixpQkFBa0IsQ0FHbEIsNkNBQStCLENBQS9CLHFDQUErQixDQUEvQiw2QkFBK0IsQ0FBL0IseURBQStCLENBQS9CLHdEQUErQixDQUYvQixVQUdGLENBQ0EsMkNBS0UsdUJBQXdCLENBRHhCLHFCQUFzQixDQU90Qiw4QkFBdUIsQ0FBdkIsc0JBQXVCLENBVnZCLFVBQVcsQ0FNWCxvQkFBcUIsQ0FKckIsVUFBVyxDQU9YLE1BQU8sQ0FGUCxpQkFBa0IsQ0FDbEIsT0FBUSxDQUhSLGlDQUEwQixDQUExQix5QkFBMEIsQ0FKMUIsU0FVRixDQUNBLHFEQUNFLCtCQUF3QixDQUF4Qix1QkFDRixDQUNBLDZCQUNFLGNBQWUsQ0FDZixlQUFnQixDQUNoQixpQkFBa0IsQ0FFbEIsd0JBQXlCLENBRHpCLGtCQUVGLENBQ0Esb0NBR0UsaUJBQWtCLENBRGxCLGNBQWUsQ0FJZixlQUFnQixDQUZoQixXQUFZLENBQ1osZ0JBQWlCLENBSmpCLGFBQWdCLENBTWhCLHdCQUNGLENBQ0EsaUNBUUUsdUJBQXVCLENBQXZCLG9CQUF1QixDQUN2Qix3QkFBbUIsQ0FBbkIscUJBQW1CLENBQW5CLGtCQUFtQixDQUhuQixXQUFZLENBRFosY0FBZSxDQUVmLG1CQUFhLENBQWIsbUJBQWEsQ0FBYixZQUFhLENBSmIsY0FBZSxDQURmLFdBQVksQ0FNWixzQkFBdUIsQ0FKdkIsaUJBQWtCLENBSGxCLFVBU0YsQ0FDQSx5Q0FHRSxXQUFZLENBRlosaUJBQWtCLENBQ2xCLFVBRUYsQ0FDQSxnREFJRSxxQkFBc0IsQ0FIdEIsVUFBVyxDQUNYLG9CQUFxQixDQUNyQixXQUFZLENBR1osTUFBUyxDQURULGlCQUFrQixDQUVsQixLQUNGLENBQ0EsK0NBTUUsdUJBQXdCLENBRHhCLHFCQUFzQixDQU10Qiw4QkFBdUIsQ0FBdkIsc0JBQXVCLENBVnZCLFVBQVcsQ0FDWCxvQkFBcUIsQ0FFckIsVUFBVyxDQUlYLFFBQVMsQ0FEVCxpQkFBa0IsQ0FFbEIsT0FBUSxDQUNSLCtCQUF3QixDQUF4Qix1QkFBd0IsQ0FQeEIsU0FTRixDQUNBLHdIQUNFLHNDQUNGLENBQ0EsdURBQ0UsNEJBQXFCLENBQXJCLG9CQUNGLENBQ0EsK0RBQ0UsMkJBQW9CLENBQXBCLG1CQUNGLENBQ0EsbURBQ0Usc0JBQ0YsQ0FDQSx3QkFJRSxhQUFjLENBRmQsWUFBYSxDQURiLE9BQVEsQ0FFUixnQkFFRixDQUNBLG1DQUNFLGdCQUFpQixDQUNqQixjQUNGLENBQ0EsNENBQ0UsNEJBQXFCLENBQXJCLG9CQUNGLENBQ0EsNkRBQ0UsMkNBQW9DLENBQXBDLG1DQUNGLENBQ0EsaURBQ0UsNEJBQXFCLENBQXJCLG9CQUNGLENBQ0EseUNBRUUsUUFBUyxDQURULGFBRUYsQ0FDQSw2QkFFRSxXQUFZLENBRFosaUJBRUYsQ0FDQSwwRUFHRSxlQUFnQixDQURoQixrQ0FBNEIsQ0FBNUIsMEJBRUYsQ0FDQSxvRUFFRSxrQkFDRixDQUlBLDRGQUNFLGlDQUEyQixDQUEzQix5QkFDRixDQUNBLHNGQUVFLGlCQUNGLENBRUEsZ0JBQ0Usd0JBQ0YsQ0FDQSwyQkFDRSxVQUNGLENBQ0Esb0RBQ0UsMENBQXlDLENBQXpDLGtDQUNGLENBQ0EsOENBQ0Usd0JBQ0YsQ0FDQSxpQ0FDRSxrQ0FDRixDQUNBLGtDQUNFLFVBQ0YsQ0FDQSwrREFFRSx3QkFBeUIsQ0FEekIsVUFFRixDQUNBLDBFQUNFLHdCQUNGLENBQ0EsNEVBRUUsd0JBQXlCLENBRHpCLFVBRUYsQ0FDQSwrQkFDRSx3QkFDRixDQUNBLGdDQUNFLHdCQUNGLENBQ0EsNERBQ0UsMkNBQTBDLENBQTFDLG1DQUNGLENBQ0EsNkJBQ0Usd0JBQ0YsQ0FLQSxxRUFFRSx3QkFBeUIsQ0FEekIsVUFFRixDQUVBLGdDQUNFLHFCQUNGLENBQ0EsMkNBQ0UsYUFDRixDQUNBLG9FQUNFLDBDQUF5QyxDQUF6QyxrQ0FDRixDQUNBLCtFQUVFLHdCQUF5QixDQUR6QixVQUVGLENBQ0EsOERBQ0Usd0JBQ0YsQ0FDQSxpREFDRSxrQ0FDRixDQUNBLGtEQUNFLFVBQ0YsQ0FDQSwrRUFFRSx3QkFBeUIsQ0FEekIsVUFFRixDQUNBLDBGQUNFLHdCQUNGLENBQ0EsNEZBRUUsd0JBQXlCLENBRHpCLFVBRUYsQ0FDQSwrQ0FDRSx3QkFDRixDQUNBLGdEQUNFLHdCQUNGLENBQ0EsNEVBQ0UsMkNBQTBDLENBQTFDLG1DQUNGLENBQ0EsNkNBQ0UsdUJBQ0YsQ0FLQSxxR0FFRSx3QkFBeUIsQ0FEekIsYUFFRjtBQzdYQSwrQ0FBK0NcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLnYtc2lkZWJhci1tZW51IHtcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG4gIHRvcDogMDtcXG4gIGxlZnQ6IDA7XFxuICBib3R0b206IDA7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gIHotaW5kZXg6IDk5OTtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICB3aWR0aDogMTAwJTtcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxuICB0cmFuc2l0aW9uOiAwLjNzIG1heC13aWR0aCBlYXNlO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgKiB7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0tc2Nyb2xsLXdyYXBwZXIge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGZsZXg6IDE7XFxuICBtaW4taGVpZ2h0OiAwO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0tc2Nyb2xsLXdyYXBwZXI6aG92ZXIgLnZzbS0tc2Nyb2xsLWJhciwgLnYtc2lkZWJhci1tZW51IC52c20tLXNjcm9sbC13cmFwcGVyOmZvY3VzIC52c20tLXNjcm9sbC1iYXIsIC52LXNpZGViYXItbWVudSAudnNtLS1zY3JvbGwtd3JhcHBlcjphY3RpdmUgLnZzbS0tc2Nyb2xsLWJhciB7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0tc2Nyb2xsLW92ZXJmbG93IHtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG59XFxuLnYtc2lkZWJhci1tZW51IC52c20tLXNjcm9sbCB7XFxuICBvdmVyZmxvdy15OiBzY3JvbGw7XFxuICBvdmVyZmxvdy14OiBoaWRkZW47XFxuICBoZWlnaHQ6IDEwMCU7XFxuICAtbXMtb3ZlcmZsb3ctc3R5bGU6IG5vbmU7XFxuICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7XFxufVxcbi52LXNpZGViYXItbWVudSAudnNtLS1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcXG4gIHdpZHRoOiAwO1xcbiAgaGVpZ2h0OiAwO1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuLnYtc2lkZWJhci1tZW51IC52c20tLXNjcm9sbCA+IC52c20tLW1lbnUge1xcbiAgcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50O1xcbiAgdHJhbnNpdGlvbjogMC4zcyB3aWR0aCBlYXNlO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0tc2Nyb2xsLWJhciB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDJweDtcXG4gIGJvdHRvbTogMnB4O1xcbiAgcmlnaHQ6IDJweDtcXG4gIHdpZHRoOiA2cHg7XFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICB6LWluZGV4OiA1O1xcbiAgb3BhY2l0eTogMDtcXG4gIHRyYW5zaXRpb246IDAuM3Mgb3BhY2l0eSBlYXNlO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0tc2Nyb2xsLXRodW1iIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2FhYTtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcbiAgb3BhY2l0eTogMC41O1xcbiAgdHJhbnNpdGlvbjogMC4zcyBvcGFjaXR5IGVhc2U7XFxufVxcbi52LXNpZGViYXItbWVudSAudnNtLS1zY3JvbGwtdGh1bWI6aG92ZXIge1xcbiAgb3BhY2l0eTogMTtcXG59XFxuLnYtc2lkZWJhci1tZW51IC52c20tLW1lbnUsXFxuLnYtc2lkZWJhci1tZW51IC52c20tLWRyb3Bkb3duIHtcXG4gIHBhZGRpbmc6IDA7XFxuICBtYXJnaW46IDA7XFxuICBsaXN0LXN0eWxlOiBub25lO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0tZHJvcGRvd24ge1xcbiAgcGFkZGluZzogNXB4O1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0taXRlbSB7XFxuICBwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIHdpZHRoOiAxMDAlO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG59XFxuLnYtc2lkZWJhci1tZW51IC52c20tLWxpbmsge1xcbiAgcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50O1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBmb250LXNpemU6IDE2cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgcGFkZGluZzogMTBweCAxNXB4O1xcbiAgbGluZS1oZWlnaHQ6IDMwcHg7XFxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXG4gIHRyYW5zaXRpb246IDAuM3MgYWxsIGVhc2U7XFxufVxcbi52LXNpZGViYXItbWVudSAudnNtLS1saW5rX2FjdGl2ZSB7XFxuICBmb250LXdlaWdodDogNjAwO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0tbGlua19kaXNhYmxlZCB7XFxuICBvcGFjaXR5OiAwLjQ7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLnYtc2lkZWJhci1tZW51IC52c20tLWxpbmtfbGV2ZWwtMSAudnNtLS1pY29uIHtcXG4gIGhlaWdodDogMzVweDtcXG4gIHdpZHRoOiAzNXB4O1xcbiAgZmxleC1zaHJpbms6IDA7XFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxufVxcbi52LXNpZGViYXItbWVudSAudnNtLS1pY29uIHtcXG4gIGhlaWdodDogMjVweDtcXG4gIHdpZHRoOiAyNXB4O1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIG1hcmdpbi1yaWdodDogMTVweDtcXG4gIHotaW5kZXg6IDIwO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0tdGl0bGUge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBmbGV4OiAxO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0tdGl0bGUgPiBzcGFuOmZpcnN0LWNoaWxkIHtcXG4gIGZsZXgtZ3JvdzogMTtcXG59XFxuLnYtc2lkZWJhci1tZW51IC52c20tLXRpdGxlX2hpZGRlbiB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB3aWR0aDogMXB4O1xcbiAgaGVpZ2h0OiAxcHg7XFxuICBwYWRkaW5nOiAwO1xcbiAgbWFyZ2luOiAtMXB4O1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIGNsaXA6IHJlY3QoMCwgMCwgMCwgMCk7XFxuICBib3JkZXI6IDA7XFxufVxcbi52LXNpZGViYXItbWVudSAudnNtLS1hcnJvdyB7XFxuICB3aWR0aDogMzBweDtcXG4gIGhlaWdodDogMzBweDtcXG4gIGZvbnQtc2l6ZTogMTRweDtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcbi52LXNpZGViYXItbWVudSAudnNtLS1hcnJvd19kZWZhdWx0IHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHdpZHRoOiAxMnB4O1xcbiAgaGVpZ2h0OiAxMnB4O1xcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuM3MgZWFzZTtcXG59XFxuLnYtc2lkZWJhci1tZW51IC52c20tLWFycm93X2RlZmF1bHQ6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFwiO1xcbiAgd2lkdGg6IDZweDtcXG4gIGhlaWdodDogNnB4O1xcbiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZDtcXG4gIGJvcmRlci1ib3R0b206IDJweCBzb2xpZDtcXG4gIHRyYW5zZm9ybTogcm90YXRlKC0xMzVkZWcpO1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAycHg7XFxuICBsZWZ0OiAwO1xcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XFxufVxcbi52LXNpZGViYXItbWVudSAudnNtLS1hcnJvd19vcGVuIC52c20tLWFycm93X2RlZmF1bHQge1xcbiAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0taGVhZGVyIHtcXG4gIGZvbnQtc2l6ZTogMTRweDtcXG4gIGZvbnQtd2VpZ2h0OiA2MDA7XFxuICBwYWRkaW5nOiAxMHB4IDE1cHg7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXG59XFxuLnYtc2lkZWJhci1tZW51IC52c20tLWJhZGdlX2RlZmF1bHQge1xcbiAgcGFkZGluZzogMHB4IDZweDtcXG4gIGZvbnQtc2l6ZTogMTJweDtcXG4gIGJvcmRlci1yYWRpdXM6IDNweDtcXG4gIGhlaWdodDogMjBweDtcXG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xcbiAgZm9udC13ZWlnaHQ6IDYwMDtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxufVxcbi52LXNpZGViYXItbWVudSAudnNtLS10b2dnbGUtYnRuIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiA2NXB4O1xcbiAgZm9udC1zaXplOiAxOHB4O1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgYm9yZGVyOiBub25lO1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuLnYtc2lkZWJhci1tZW51IC52c20tLXRvZ2dsZS1idG5fZGVmYXVsdCB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB3aWR0aDogMTJweDtcXG4gIGhlaWdodDogMTJweDtcXG59XFxuLnYtc2lkZWJhci1tZW51IC52c20tLXRvZ2dsZS1idG5fZGVmYXVsdDpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXCI7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBoZWlnaHQ6IDEycHg7XFxuICBib3JkZXItbGVmdDogMnB4IHNvbGlkO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgbGVmdDogMHB4O1xcbiAgdG9wOiAwcHg7XFxufVxcbi52LXNpZGViYXItbWVudSAudnNtLS10b2dnbGUtYnRuX2RlZmF1bHQ6YWZ0ZXIge1xcbiAgY29udGVudDogXFxcIlxcXCI7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICB3aWR0aDogNnB4O1xcbiAgaGVpZ2h0OiA2cHg7XFxuICBib3JkZXItbGVmdDogMnB4IHNvbGlkO1xcbiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgbGVmdDogNHB4O1xcbiAgdG9wOiAycHg7XFxuICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XFxuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV9jb2xsYXBzZWQgLnZzbS0tbGlua19sZXZlbC0xLnZzbS0tbGlua19ob3ZlciwgLnYtc2lkZWJhci1tZW51LnZzbV9jb2xsYXBzZWQgLnZzbS0tbGlua19sZXZlbC0xOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XFxufVxcbi52LXNpZGViYXItbWVudS52c21fY29sbGFwc2VkIC52c20tLXRvZ2dsZS1idG5fZGVmYXVsdCB7XFxuICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7XFxufVxcbi52LXNpZGViYXItbWVudS52c21fY29sbGFwc2VkLnZzbV9ydGwgLnZzbS0tdG9nZ2xlLWJ0bl9kZWZhdWx0IHtcXG4gIHRyYW5zZm9ybTogc2NhbGVYKDEpO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUudnNtX2NvbGxhcHNlZCAudnNtLS1zY3JvbGwtd3JhcHBlciB7XFxuICB3aWR0aDogY2FsYygxMDAlICsgOHB4KTtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV9ydGwge1xcbiAgcmlnaHQ6IDA7XFxuICBsZWZ0OiBpbmhlcml0O1xcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XFxuICBkaXJlY3Rpb246IHJ0bDtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV9ydGwgLnZzbS0taWNvbiB7XFxuICBtYXJnaW4tbGVmdDogMTVweDtcXG4gIG1hcmdpbi1yaWdodDogMHB4O1xcbn1cXG4udi1zaWRlYmFyLW1lbnUudnNtX3J0bCAudnNtLS1hcnJvd19kZWZhdWx0IHtcXG4gIHRyYW5zZm9ybTogc2NhbGVYKC0xKTtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV9ydGwgLnZzbS0tYXJyb3dfb3BlbiAudnNtLS1hcnJvd19kZWZhdWx0IHtcXG4gIHRyYW5zZm9ybTogcm90YXRlKC05MGRlZykgc2NhbGVYKC0xKTtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV9ydGwgLnZzbS0tdG9nZ2xlLWJ0bl9kZWZhdWx0IHtcXG4gIHRyYW5zZm9ybTogc2NhbGVYKC0xKTtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV9ydGwgLnZzbS0tc2Nyb2xsLWJhciB7XFxuICByaWdodDogaW5oZXJpdDtcXG4gIGxlZnQ6IDJweDtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV9yZWxhdGl2ZSB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBoZWlnaHQ6IDEwMCU7XFxufVxcbi52LXNpZGViYXItbWVudSAuZXhwYW5kLWVudGVyLWFjdGl2ZSxcXG4udi1zaWRlYmFyLW1lbnUgLmV4cGFuZC1sZWF2ZS1hY3RpdmUge1xcbiAgdHJhbnNpdGlvbjogaGVpZ2h0IDAuM3MgZWFzZTtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxufVxcbi52LXNpZGViYXItbWVudSAuZXhwYW5kLWVudGVyLWZyb20sXFxuLnYtc2lkZWJhci1tZW51IC5leHBhbmQtbGVhdmUtdG8ge1xcbiAgaGVpZ2h0OiAwICFpbXBvcnRhbnQ7XFxufVxcbi52LXNpZGViYXItbWVudSAuc2xpZGUtYW5pbWF0aW9uLWVudGVyLWFjdGl2ZSB7XFxuICB0cmFuc2l0aW9uOiB3aWR0aCAwLjNzIGVhc2U7XFxufVxcbi52LXNpZGViYXItbWVudSAuc2xpZGUtYW5pbWF0aW9uLWxlYXZlLWFjdGl2ZSB7XFxuICB0cmFuc2l0aW9uOiB3aWR0aCAwLjNzIGVhc2U7XFxufVxcbi52LXNpZGViYXItbWVudSAuc2xpZGUtYW5pbWF0aW9uLWVudGVyLWZyb20sXFxuLnYtc2lkZWJhci1tZW51IC5zbGlkZS1hbmltYXRpb24tbGVhdmUtdG8ge1xcbiAgd2lkdGg6IDAgIWltcG9ydGFudDtcXG59XFxuXFxuLnYtc2lkZWJhci1tZW51IHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyYTJhMmU7XFxufVxcbi52LXNpZGViYXItbWVudSAudnNtLS1saW5rIHtcXG4gIGNvbG9yOiAjZmZmO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0tbGlua19sZXZlbC0xLnZzbS0tbGlua19hY3RpdmUge1xcbiAgYm94LXNoYWRvdzogM3B4IDBweCAwcHggMHB4ICM0Mjg1ZjQgaW5zZXQ7XFxufVxcbi52LXNpZGViYXItbWVudSAudnNtLS1saW5rX2xldmVsLTEgLnZzbS0taWNvbiB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWUxZTIxO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0tbGlua19ob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDMwLCAzMCwgMzMsIDAuNSk7XFxufVxcbi52LXNpZGViYXItbWVudSAudnNtLS1saW5rX21vYmlsZSB7XFxuICBjb2xvcjogI2ZmZjtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV9leHBhbmRlZCAudnNtLS1saW5rX2xldmVsLTEudnNtLS1saW5rX29wZW4ge1xcbiAgY29sb3I6ICNmZmY7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDI4NWY0O1xcbn1cXG4udi1zaWRlYmFyLW1lbnUudnNtX2V4cGFuZGVkIC52c20tLWxpbmtfbGV2ZWwtMS52c20tLWxpbmtfb3BlbiAudnNtLS1pY29uIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICM0Mjg1ZjQ7XFxufVxcbi52LXNpZGViYXItbWVudS52c21fY29sbGFwc2VkIC52c20tLWxpbmtfbGV2ZWwtMS52c20tLWxpbmtfaG92ZXIgLnZzbS0taWNvbiB7XFxuICBjb2xvcjogI2ZmZjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICM0Mjg1ZjQ7XFxufVxcbi52LXNpZGViYXItbWVudSAudnNtLS1kcm9wZG93biB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzYzNjNiO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0tbW9iaWxlLWJnIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICM0Mjg1ZjQ7XFxufVxcbi52LXNpZGViYXItbWVudS52c21fcnRsIC52c20tLWxpbmtfbGV2ZWwtMS52c20tLWxpbmtfYWN0aXZlIHtcXG4gIGJveC1zaGFkb3c6IC0zcHggMHB4IDBweCAwcHggIzQyODVmNCBpbnNldDtcXG59XFxuLnYtc2lkZWJhci1tZW51IC52c20tLWhlYWRlciB7XFxuICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0tYmFkZ2VfZGVmYXVsdCB7XFxuICBjb2xvcjogI2ZmZjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMxZTFlMjE7XFxufVxcbi52LXNpZGViYXItbWVudSAudnNtLS10b2dnbGUtYnRuIHtcXG4gIGNvbG9yOiAjZmZmO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFlMWUyMTtcXG59XFxuXFxuLnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZSB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUudnNtX3doaXRlLXRoZW1lIC52c20tLWxpbmsge1xcbiAgY29sb3I6ICMyNjI2MjY7XFxufVxcbi52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0tbGlua19sZXZlbC0xLnZzbS0tbGlua19hY3RpdmUge1xcbiAgYm94LXNoYWRvdzogM3B4IDBweCAwcHggMHB4ICM0Mjg1ZjQgaW5zZXQ7XFxufVxcbi52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0tbGlua19sZXZlbC0xLnZzbS0tbGlua19hY3RpdmUgLnZzbS0taWNvbiB7XFxuICBjb2xvcjogI2ZmZjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyNjI2MjY7XFxufVxcbi52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0tbGlua19sZXZlbC0xIC52c20tLWljb24ge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2JiYzVkNjtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZSAudnNtLS1saW5rX2hvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjQyLCAyNDIsIDI0MiwgMC41KTtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZSAudnNtLS1saW5rX21vYmlsZSB7XFxuICBjb2xvcjogI2ZmZjtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZS52c21fZXhwYW5kZWQgLnZzbS0tbGlua19sZXZlbC0xLnZzbS0tbGlua19vcGVuIHtcXG4gIGNvbG9yOiAjZmZmO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzQyODVmNDtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZS52c21fZXhwYW5kZWQgLnZzbS0tbGlua19sZXZlbC0xLnZzbS0tbGlua19vcGVuIC52c20tLWljb24ge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzQyODVmNDtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZS52c21fY29sbGFwc2VkIC52c20tLWxpbmtfbGV2ZWwtMS52c20tLWxpbmtfaG92ZXIgLnZzbS0taWNvbiB7XFxuICBjb2xvcjogI2ZmZjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICM0Mjg1ZjQ7XFxufVxcbi52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0tZHJvcGRvd24ge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTNlMztcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZSAudnNtLS1tb2JpbGUtYmcge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzQyODVmNDtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZS52c21fcnRsIC52c20tLWxpbmtfbGV2ZWwtMS52c20tLWxpbmtfYWN0aXZlIHtcXG4gIGJveC1zaGFkb3c6IC0zcHggMHB4IDBweCAwcHggIzQyODVmNCBpbnNldDtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZSAudnNtLS1oZWFkZXIge1xcbiAgY29sb3I6IHJnYmEoMzgsIDM4LCAzOCwgMC43KTtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZSAudnNtLS1iYWRnZV9kZWZhdWx0IHtcXG4gIGNvbG9yOiAjMjYyNjI2O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YyZjJmMjtcXG59XFxuLnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZSAudnNtLS10b2dnbGUtYnRuIHtcXG4gIGNvbG9yOiAjMjYyNjI2O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YyZjJmMjtcXG59XCIsXCIudi1zaWRlYmFyLW1lbnV7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7Ym90dG9tOjA7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtsZWZ0OjA7cG9zaXRpb246Zml4ZWQ7dGV4dC1hbGlnbjpsZWZ0O3RvcDowOy13ZWJraXQtdHJhbnNpdGlvbjptYXgtd2lkdGggLjNzIGVhc2U7dHJhbnNpdGlvbjptYXgtd2lkdGggLjNzIGVhc2U7d2lkdGg6MTAwJTt6LWluZGV4Ojk5OX0udi1zaWRlYmFyLW1lbnUsLnYtc2lkZWJhci1tZW51ICp7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94fS52LXNpZGViYXItbWVudSAudnNtLS1zY3JvbGwtd3JhcHBlcnstd2Via2l0LWJveC1mbGV4OjE7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstbXMtZmxleDoxO2ZsZXg6MTttaW4taGVpZ2h0OjA7cG9zaXRpb246cmVsYXRpdmV9LnYtc2lkZWJhci1tZW51IC52c20tLXNjcm9sbC13cmFwcGVyOmFjdGl2ZSAudnNtLS1zY3JvbGwtYmFyLC52LXNpZGViYXItbWVudSAudnNtLS1zY3JvbGwtd3JhcHBlcjpmb2N1cyAudnNtLS1zY3JvbGwtYmFyLC52LXNpZGViYXItbWVudSAudnNtLS1zY3JvbGwtd3JhcHBlcjpob3ZlciAudnNtLS1zY3JvbGwtYmFye29wYWNpdHk6MX0udi1zaWRlYmFyLW1lbnUgLnZzbS0tc2Nyb2xsLW92ZXJmbG93e2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbjt3aWR0aDoxMDAlfS52LXNpZGViYXItbWVudSAudnNtLS1zY3JvbGx7LW1zLW92ZXJmbG93LXN0eWxlOm5vbmU7aGVpZ2h0OjEwMCU7b3ZlcmZsb3cteDpoaWRkZW47b3ZlcmZsb3cteTpzY3JvbGw7c2Nyb2xsYmFyLXdpZHRoOm5vbmV9LnYtc2lkZWJhci1tZW51IC52c20tLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXJ7ZGlzcGxheTpub25lO2hlaWdodDowO3dpZHRoOjB9LnYtc2lkZWJhci1tZW51IC52c20tLXNjcm9sbD4udnNtLS1tZW51e3Bvc2l0aW9uOnN0YXRpYyFpbXBvcnRhbnQ7LXdlYmtpdC10cmFuc2l0aW9uOndpZHRoIC4zcyBlYXNlO3RyYW5zaXRpb246d2lkdGggLjNzIGVhc2V9LnYtc2lkZWJhci1tZW51IC52c20tLXNjcm9sbC1iYXJ7Ym90dG9tOjJweDtvcGFjaXR5OjA7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MnB4O3RvcDoycHg7d2lkdGg6NnB4O3otaW5kZXg6NX0udi1zaWRlYmFyLW1lbnUgLnZzbS0tc2Nyb2xsLWJhciwudi1zaWRlYmFyLW1lbnUgLnZzbS0tc2Nyb2xsLXRodW1ie2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC4zcyBlYXNlO3RyYW5zaXRpb246b3BhY2l0eSAuM3MgZWFzZX0udi1zaWRlYmFyLW1lbnUgLnZzbS0tc2Nyb2xsLXRodW1ie2JhY2tncm91bmQtY29sb3I6I2FhYTtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmJsb2NrO29wYWNpdHk6LjU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lfS52LXNpZGViYXItbWVudSAudnNtLS1zY3JvbGwtdGh1bWI6aG92ZXJ7b3BhY2l0eToxfS52LXNpZGViYXItbWVudSAudnNtLS1kcm9wZG93biwudi1zaWRlYmFyLW1lbnUgLnZzbS0tbWVudXtsaXN0LXN0eWxlOm5vbmU7bWFyZ2luOjA7cGFkZGluZzowfS52LXNpZGViYXItbWVudSAudnNtLS1kcm9wZG93bntwYWRkaW5nOjVweH0udi1zaWRlYmFyLW1lbnUgLnZzbS0taXRlbXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnN0YXRpYyFpbXBvcnRhbnQ7d2hpdGUtc3BhY2U6bm93cmFwO3dpZHRoOjEwMCV9LnYtc2lkZWJhci1tZW51IC52c20tLWxpbmt7LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDtmb250LXNpemU6MTZweDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MzBweDtwYWRkaW5nOjEwcHggMTVweDtwb3NpdGlvbjpzdGF0aWMhaW1wb3J0YW50O3RleHQtZGVjb3JhdGlvbjpub25lOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7dHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lfS52LXNpZGViYXItbWVudSAudnNtLS1saW5rX2FjdGl2ZXtmb250LXdlaWdodDo2MDB9LnYtc2lkZWJhci1tZW51IC52c20tLWxpbmtfZGlzYWJsZWR7b3BhY2l0eTouNDtwb2ludGVyLWV2ZW50czpub25lfS52LXNpZGViYXItbWVudSAudnNtLS1saW5rX2xldmVsLTEgLnZzbS0taWNvbnstbXMtZmxleC1uZWdhdGl2ZTowO2JvcmRlci1yYWRpdXM6M3B4O2ZsZXgtc2hyaW5rOjA7aGVpZ2h0OjM1cHg7d2lkdGg6MzVweH0udi1zaWRlYmFyLW1lbnUgLnZzbS0taWNvbnstd2Via2l0LWJveC1wYWNrOmNlbnRlcjstbXMtZmxleC1wYWNrOmNlbnRlcjtoZWlnaHQ6MjVweDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbi1yaWdodDoxNXB4O3dpZHRoOjI1cHg7ei1pbmRleDoyMH0udi1zaWRlYmFyLW1lbnUgLnZzbS0taWNvbiwudi1zaWRlYmFyLW1lbnUgLnZzbS0tdGl0bGV7LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleH0udi1zaWRlYmFyLW1lbnUgLnZzbS0tdGl0bGV7LXdlYmtpdC1ib3gtZmxleDoxOy1tcy1mbGV4OjE7ZmxleDoxfS52LXNpZGViYXItbWVudSAudnNtLS10aXRsZT5zcGFuOmZpcnN0LWNoaWxkey13ZWJraXQtYm94LWZsZXg6MTstbXMtZmxleC1wb3NpdGl2ZToxO2ZsZXgtZ3JvdzoxfS52LXNpZGViYXItbWVudSAudnNtLS10aXRsZV9oaWRkZW57Y2xpcDpyZWN0KDAsMCwwLDApO2JvcmRlcjowO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHh9LnYtc2lkZWJhci1tZW51IC52c20tLWFycm93ey13ZWJraXQtYm94LXBhY2s6Y2VudGVyOy1tcy1mbGV4LXBhY2s6Y2VudGVyOy13ZWJraXQtYm94LWFsaWduOmNlbnRlcjstbXMtZmxleC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7Zm9udC1zaXplOjE0cHg7aGVpZ2h0OjMwcHg7anVzdGlmeS1jb250ZW50OmNlbnRlcjt0ZXh0LWFsaWduOmNlbnRlcjt3aWR0aDozMHB4fS52LXNpZGViYXItbWVudSAudnNtLS1hcnJvd19kZWZhdWx0e2hlaWdodDoxMnB4O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuM3MgZWFzZTt0cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlO3RyYW5zaXRpb246dHJhbnNmb3JtIC4zcyBlYXNlO3RyYW5zaXRpb246dHJhbnNmb3JtIC4zcyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlO3dpZHRoOjEycHh9LnYtc2lkZWJhci1tZW51IC52c20tLWFycm93X2RlZmF1bHQ6YmVmb3Jle2JvcmRlci1ib3R0b206MnB4IHNvbGlkO2JvcmRlci1sZWZ0OjJweCBzb2xpZDstd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtjb250ZW50OlxcXCJcXFwiO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDo2cHg7bGVmdDowO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoycHg7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC0xMzVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTEzNWRlZyk7d2lkdGg6NnB4fS52LXNpZGViYXItbWVudSAudnNtLS1hcnJvd19vcGVuIC52c20tLWFycm93X2RlZmF1bHR7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDkwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDkwZGVnKX0udi1zaWRlYmFyLW1lbnUgLnZzbS0taGVhZGVye2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjYwMDtwYWRkaW5nOjEwcHggMTVweDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7d2hpdGUtc3BhY2U6bm93cmFwfS52LXNpZGViYXItbWVudSAudnNtLS1iYWRnZV9kZWZhdWx0e2JvcmRlci1yYWRpdXM6M3B4O2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjYwMDtoZWlnaHQ6MjBweDtsaW5lLWhlaWdodDoyMHB4O3BhZGRpbmc6MCA2cHg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfS52LXNpZGViYXItbWVudSAudnNtLS10b2dnbGUtYnRuey13ZWJraXQtYm94LXBhY2s6Y2VudGVyOy1tcy1mbGV4LXBhY2s6Y2VudGVyOy13ZWJraXQtYm94LWFsaWduOmNlbnRlcjstbXMtZmxleC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2JvcmRlcjpub25lO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7Zm9udC1zaXplOjE4cHg7aGVpZ2h0OjY1cHg7anVzdGlmeS1jb250ZW50OmNlbnRlcjt0ZXh0LWFsaWduOmNlbnRlcjt3aWR0aDoxMDAlfS52LXNpZGViYXItbWVudSAudnNtLS10b2dnbGUtYnRuX2RlZmF1bHR7aGVpZ2h0OjEycHg7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTJweH0udi1zaWRlYmFyLW1lbnUgLnZzbS0tdG9nZ2xlLWJ0bl9kZWZhdWx0OmJlZm9yZXtib3JkZXItbGVmdDoycHggc29saWQ7Y29udGVudDpcXFwiXFxcIjtkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MTJweDtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjB9LnYtc2lkZWJhci1tZW51IC52c20tLXRvZ2dsZS1idG5fZGVmYXVsdDphZnRlcntib3JkZXItYm90dG9tOjJweCBzb2xpZDtib3JkZXItbGVmdDoycHggc29saWQ7LXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Y29udGVudC1ib3g7Y29udGVudDpcXFwiXFxcIjtkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6NnB4O2xlZnQ6NHB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDoycHg7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt3aWR0aDo2cHh9LnYtc2lkZWJhci1tZW51LnZzbV9jb2xsYXBzZWQgLnZzbS0tbGlua19sZXZlbC0xLnZzbS0tbGlua19ob3Zlciwudi1zaWRlYmFyLW1lbnUudnNtX2NvbGxhcHNlZCAudnNtLS1saW5rX2xldmVsLTE6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9LnYtc2lkZWJhci1tZW51LnZzbV9jb2xsYXBzZWQgLnZzbS0tdG9nZ2xlLWJ0bl9kZWZhdWx0ey13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWCgtMSk7dHJhbnNmb3JtOnNjYWxlWCgtMSl9LnYtc2lkZWJhci1tZW51LnZzbV9jb2xsYXBzZWQudnNtX3J0bCAudnNtLS10b2dnbGUtYnRuX2RlZmF1bHR7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDEpO3RyYW5zZm9ybTpzY2FsZVgoMSl9LnYtc2lkZWJhci1tZW51LnZzbV9jb2xsYXBzZWQgLnZzbS0tc2Nyb2xsLXdyYXBwZXJ7d2lkdGg6Y2FsYygxMDAlICsgOHB4KX0udi1zaWRlYmFyLW1lbnUudnNtX3J0bHtkaXJlY3Rpb246cnRsO2xlZnQ6aW5oZXJpdDtyaWdodDowO3RleHQtYWxpZ246cmlnaHR9LnYtc2lkZWJhci1tZW51LnZzbV9ydGwgLnZzbS0taWNvbnttYXJnaW4tbGVmdDoxNXB4O21hcmdpbi1yaWdodDowfS52LXNpZGViYXItbWVudS52c21fcnRsIC52c20tLWFycm93X2RlZmF1bHR7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKC0xKTt0cmFuc2Zvcm06c2NhbGVYKC0xKX0udi1zaWRlYmFyLW1lbnUudnNtX3J0bCAudnNtLS1hcnJvd19vcGVuIC52c20tLWFycm93X2RlZmF1bHR7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC05MGRlZykgc2NhbGVYKC0xKTt0cmFuc2Zvcm06cm90YXRlKC05MGRlZykgc2NhbGVYKC0xKX0udi1zaWRlYmFyLW1lbnUudnNtX3J0bCAudnNtLS10b2dnbGUtYnRuX2RlZmF1bHR7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKC0xKTt0cmFuc2Zvcm06c2NhbGVYKC0xKX0udi1zaWRlYmFyLW1lbnUudnNtX3J0bCAudnNtLS1zY3JvbGwtYmFye2xlZnQ6MnB4O3JpZ2h0OmluaGVyaXR9LnYtc2lkZWJhci1tZW51LnZzbV9yZWxhdGl2ZXtoZWlnaHQ6MTAwJTtwb3NpdGlvbjpyZWxhdGl2ZX0udi1zaWRlYmFyLW1lbnUgLmV4cGFuZC1lbnRlci1hY3RpdmUsLnYtc2lkZWJhci1tZW51IC5leHBhbmQtbGVhdmUtYWN0aXZle292ZXJmbG93OmhpZGRlbjstd2Via2l0LXRyYW5zaXRpb246aGVpZ2h0IC4zcyBlYXNlO3RyYW5zaXRpb246aGVpZ2h0IC4zcyBlYXNlfS52LXNpZGViYXItbWVudSAuZXhwYW5kLWVudGVyLWZyb20sLnYtc2lkZWJhci1tZW51IC5leHBhbmQtbGVhdmUtdG97aGVpZ2h0OjAhaW1wb3J0YW50fS52LXNpZGViYXItbWVudSAuc2xpZGUtYW5pbWF0aW9uLWVudGVyLWFjdGl2ZSwudi1zaWRlYmFyLW1lbnUgLnNsaWRlLWFuaW1hdGlvbi1sZWF2ZS1hY3RpdmV7LXdlYmtpdC10cmFuc2l0aW9uOndpZHRoIC4zcyBlYXNlO3RyYW5zaXRpb246d2lkdGggLjNzIGVhc2V9LnYtc2lkZWJhci1tZW51IC5zbGlkZS1hbmltYXRpb24tZW50ZXItZnJvbSwudi1zaWRlYmFyLW1lbnUgLnNsaWRlLWFuaW1hdGlvbi1sZWF2ZS10b3t3aWR0aDowIWltcG9ydGFudH0udi1zaWRlYmFyLW1lbnV7YmFja2dyb3VuZC1jb2xvcjojMmEyYTJlfS52LXNpZGViYXItbWVudSAudnNtLS1saW5re2NvbG9yOiNmZmZ9LnYtc2lkZWJhci1tZW51IC52c20tLWxpbmtfbGV2ZWwtMS52c20tLWxpbmtfYWN0aXZley13ZWJraXQtYm94LXNoYWRvdzppbnNldCAzcHggMCAwIDAgIzQyODVmNDtib3gtc2hhZG93Omluc2V0IDNweCAwIDAgMCAjNDI4NWY0fS52LXNpZGViYXItbWVudSAudnNtLS1saW5rX2xldmVsLTEgLnZzbS0taWNvbntiYWNrZ3JvdW5kLWNvbG9yOiMxZTFlMjF9LnYtc2lkZWJhci1tZW51IC52c20tLWxpbmtfaG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDMwLDMwLDMzLC41KX0udi1zaWRlYmFyLW1lbnUgLnZzbS0tbGlua19tb2JpbGV7Y29sb3I6I2ZmZn0udi1zaWRlYmFyLW1lbnUudnNtX2V4cGFuZGVkIC52c20tLWxpbmtfbGV2ZWwtMS52c20tLWxpbmtfb3BlbntiYWNrZ3JvdW5kLWNvbG9yOiM0Mjg1ZjQ7Y29sb3I6I2ZmZn0udi1zaWRlYmFyLW1lbnUudnNtX2V4cGFuZGVkIC52c20tLWxpbmtfbGV2ZWwtMS52c20tLWxpbmtfb3BlbiAudnNtLS1pY29ue2JhY2tncm91bmQtY29sb3I6IzQyODVmNH0udi1zaWRlYmFyLW1lbnUudnNtX2NvbGxhcHNlZCAudnNtLS1saW5rX2xldmVsLTEudnNtLS1saW5rX2hvdmVyIC52c20tLWljb257YmFja2dyb3VuZC1jb2xvcjojNDI4NWY0O2NvbG9yOiNmZmZ9LnYtc2lkZWJhci1tZW51IC52c20tLWRyb3Bkb3due2JhY2tncm91bmQtY29sb3I6IzM2MzYzYn0udi1zaWRlYmFyLW1lbnUgLnZzbS0tbW9iaWxlLWJne2JhY2tncm91bmQtY29sb3I6IzQyODVmNH0udi1zaWRlYmFyLW1lbnUudnNtX3J0bCAudnNtLS1saW5rX2xldmVsLTEudnNtLS1saW5rX2FjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgLTNweCAwIDAgMCAjNDI4NWY0O2JveC1zaGFkb3c6aW5zZXQgLTNweCAwIDAgMCAjNDI4NWY0fS52LXNpZGViYXItbWVudSAudnNtLS1oZWFkZXJ7Y29sb3I6aHNsYSgwLDAlLDEwMCUsLjcpfS52LXNpZGViYXItbWVudSAudnNtLS1iYWRnZV9kZWZhdWx0LC52LXNpZGViYXItbWVudSAudnNtLS10b2dnbGUtYnRue2JhY2tncm91bmQtY29sb3I6IzFlMWUyMTtjb2xvcjojZmZmfS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWV7YmFja2dyb3VuZC1jb2xvcjojZmZmfS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0tbGlua3tjb2xvcjojMjYyNjI2fS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0tbGlua19sZXZlbC0xLnZzbS0tbGlua19hY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDNweCAwIDAgMCAjNDI4NWY0O2JveC1zaGFkb3c6aW5zZXQgM3B4IDAgMCAwICM0Mjg1ZjR9LnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZSAudnNtLS1saW5rX2xldmVsLTEudnNtLS1saW5rX2FjdGl2ZSAudnNtLS1pY29ue2JhY2tncm91bmQtY29sb3I6IzI2MjYyNjtjb2xvcjojZmZmfS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0tbGlua19sZXZlbC0xIC52c20tLWljb257YmFja2dyb3VuZC1jb2xvcjojYmJjNWQ2fS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0tbGlua19ob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbGEoMCwwJSw5NSUsLjUpfS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0tbGlua19tb2JpbGV7Y29sb3I6I2ZmZn0udi1zaWRlYmFyLW1lbnUudnNtX3doaXRlLXRoZW1lLnZzbV9leHBhbmRlZCAudnNtLS1saW5rX2xldmVsLTEudnNtLS1saW5rX29wZW57YmFja2dyb3VuZC1jb2xvcjojNDI4NWY0O2NvbG9yOiNmZmZ9LnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZS52c21fZXhwYW5kZWQgLnZzbS0tbGlua19sZXZlbC0xLnZzbS0tbGlua19vcGVuIC52c20tLWljb257YmFja2dyb3VuZC1jb2xvcjojNDI4NWY0fS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUudnNtX2NvbGxhcHNlZCAudnNtLS1saW5rX2xldmVsLTEudnNtLS1saW5rX2hvdmVyIC52c20tLWljb257YmFja2dyb3VuZC1jb2xvcjojNDI4NWY0O2NvbG9yOiNmZmZ9LnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZSAudnNtLS1kcm9wZG93bntiYWNrZ3JvdW5kLWNvbG9yOiNlM2UzZTN9LnYtc2lkZWJhci1tZW51LnZzbV93aGl0ZS10aGVtZSAudnNtLS1tb2JpbGUtYmd7YmFja2dyb3VuZC1jb2xvcjojNDI4NWY0fS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUudnNtX3J0bCAudnNtLS1saW5rX2xldmVsLTEudnNtLS1saW5rX2FjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgLTNweCAwIDAgMCAjNDI4NWY0O2JveC1zaGFkb3c6aW5zZXQgLTNweCAwIDAgMCAjNDI4NWY0fS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0taGVhZGVye2NvbG9yOnJnYmEoMzgsMzgsMzgsLjcpfS52LXNpZGViYXItbWVudS52c21fd2hpdGUtdGhlbWUgLnZzbS0tYmFkZ2VfZGVmYXVsdCwudi1zaWRlYmFyLW1lbnUudnNtX3doaXRlLXRoZW1lIC52c20tLXRvZ2dsZS1idG57YmFja2dyb3VuZC1jb2xvcjojZjJmMmYyO2NvbG9yOiMyNjI2MjZ9XFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9dnVlLXNpZGViYXItbWVudS5jc3MubWFwICovXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-sidebar-menu/dist/vue-sidebar-menu.css\n");

/***/ }),

/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/LoadingIcon.vue?vue&type=style&index=0&id=474d299e&scoped=true&lang=css":
/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/LoadingIcon.vue?vue&type=style&index=0&id=474d299e&scoped=true&lang=css ***!
  \*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js */ \"./node_modules/css-loader/dist/runtime/cssWithMappingToString.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\ni[data-v-474d299e] {\\n        margin: auto 6px;\\n        font-size: 1em;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./resources/js/core/components/LoadingIcon.vue\"],\"names\":[],\"mappings\":\";AAoBI;QACI,gBAAgB;QAChB,cAAc;AAClB\",\"sourcesContent\":[\"<template>\\n    <i v-if=\\\"loading\\\" class=\\\"fa fa-spinner fa-spin\\\"></i>\\n</template>\\n\\n<script>\\n    // Font awesome loading spinner icon\\n    export default {\\n        name: \\\"LoadingIcon\\\",\\n        props: {\\n            // Animate icon\\n            loading: {\\n                type: Boolean,\\n                required: true,\\n                default: false,\\n            }\\n        },\\n    }\\n</script>\\n\\n<style scoped>\\n    i {\\n        margin: auto 6px;\\n        font-size: 1em;\\n    }\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0xMi51c2VbMV0hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L3N0eWxlUG9zdExvYWRlci5qcyEuL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0xMi51c2VbMl0hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2luZGV4LmpzPz9ydWxlU2V0WzBdLnVzZVswXSEuL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvTG9hZGluZ0ljb24udnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NDc0ZDI5OWUmc2NvcGVkPXRydWUmbGFuZz1jc3MuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUMrSDtBQUM3QjtBQUNsRyw4QkFBOEIsbUZBQTJCLENBQUMsd0dBQXFDO0FBQy9GO0FBQ0EsZ0VBQWdFLDJCQUEyQix5QkFBeUIsR0FBRyxTQUFTLDJHQUEyRyxNQUFNLFlBQVksV0FBVywyTEFBMkwsa0RBQWtELHFEQUFxRCxpSEFBaUgsV0FBVyxRQUFRLHNDQUFzQywyQkFBMkIseUJBQXlCLE9BQU8sK0JBQStCO0FBQzl5QjtBQUNBLGlFQUFlLHVCQUF1QixFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvcmUvY29tcG9uZW50cy9Mb2FkaW5nSWNvbi52dWU/OTg4ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIlxcbmlbZGF0YS12LTQ3NGQyOTllXSB7XFxuICAgICAgICBtYXJnaW46IGF1dG8gNnB4O1xcbiAgICAgICAgZm9udC1zaXplOiAxZW07XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvTG9hZGluZ0ljb24udnVlXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFvQkk7UUFDSSxnQkFBZ0I7UUFDaEIsY0FBYztBQUNsQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxuICAgIDxpIHYtaWY9XFxcImxvYWRpbmdcXFwiIGNsYXNzPVxcXCJmYSBmYS1zcGlubmVyIGZhLXNwaW5cXFwiPjwvaT5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIC8vIEZvbnQgYXdlc29tZSBsb2FkaW5nIHNwaW5uZXIgaWNvblxcbiAgICBleHBvcnQgZGVmYXVsdCB7XFxuICAgICAgICBuYW1lOiBcXFwiTG9hZGluZ0ljb25cXFwiLFxcbiAgICAgICAgcHJvcHM6IHtcXG4gICAgICAgICAgICAvLyBBbmltYXRlIGljb25cXG4gICAgICAgICAgICBsb2FkaW5nOiB7XFxuICAgICAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sXFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LFxcbiAgICB9XFxuPC9zY3JpcHQ+XFxuXFxuPHN0eWxlIHNjb3BlZD5cXG4gICAgaSB7XFxuICAgICAgICBtYXJnaW46IGF1dG8gNnB4O1xcbiAgICAgICAgZm9udC1zaXplOiAxZW07XFxuICAgIH1cXG48L3N0eWxlPlxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/LoadingIcon.vue?vue&type=style&index=0&id=474d299e&scoped=true&lang=css\n");

/***/ }),

/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/FooterBar.vue?vue&type=style&index=0&id=5fdfec95&scoped=true&lang=css":
/*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/FooterBar.vue?vue&type=style&index=0&id=5fdfec95&scoped=true&lang=css ***!
  \***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js */ \"./node_modules/css-loader/dist/runtime/cssWithMappingToString.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n#footer[data-v-5fdfec95] {\\n        background: #f3f5f9;\\n}\\np[data-v-5fdfec95] {\\n        font-size: 14px;\\n        color: #758697;\\n        margin-right: 10px;\\n        line-height: 12px;\\n}\\np a[data-v-5fdfec95] {\\n        color: #000;\\n}\\n\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./resources/js/core/components/nav/FooterBar.vue\"],\"names\":[],\"mappings\":\";AAeI;QACI,mBAAmB;AACvB;AAEA;QACI,eAAe;QACf,cAAc;QACd,kBAAkB;QAClB,iBAAiB;AACrB;AAEA;QACI,WAAW;AACf\",\"sourcesContent\":[\"<template>\\n    <footer id=\\\"footer\\\">\\n        <p class=\\\"text-lg-right\\\">\\n            &copy; {{ new Date().getFullYear() }} - <a href=\\\"https://www.castus.co.uk\\\">Castus</a>.\\n        </p>\\n    </footer>\\n</template>\\n\\n<script>\\nexport default {\\n    name: \\\"FooterBar\\\"\\n}\\n</script>\\n\\n<style scoped>\\n    #footer {\\n        background: #f3f5f9;\\n    }\\n\\n    p {\\n        font-size: 14px;\\n        color: #758697;\\n        margin-right: 10px;\\n        line-height: 12px;\\n    }\\n\\n    p a {\\n        color: #000;\\n    }\\n\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0xMi51c2VbMV0hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L3N0eWxlUG9zdExvYWRlci5qcyEuL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0xMi51c2VbMl0hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2luZGV4LmpzPz9ydWxlU2V0WzBdLnVzZVswXSEuL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvbmF2L0Zvb3RlckJhci52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD01ZmRmZWM5NSZzY29wZWQ9dHJ1ZSZsYW5nPWNzcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ2tJO0FBQzdCO0FBQ3JHLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSxzRUFBc0UsOEJBQThCLEdBQUcsc0JBQXNCLDBCQUEwQix5QkFBeUIsNkJBQTZCLDRCQUE0QixHQUFHLHdCQUF3QixzQkFBc0IsR0FBRyxXQUFXLDZHQUE2RyxLQUFLLFlBQVksTUFBTSxLQUFLLFVBQVUsVUFBVSxZQUFZLGFBQWEsTUFBTSxLQUFLLFVBQVUsNEhBQTRILDRCQUE0QiwwSEFBMEgsNEJBQTRCLDRDQUE0Qyw4QkFBOEIsT0FBTyxXQUFXLDBCQUEwQix5QkFBeUIsNkJBQTZCLDRCQUE0QixPQUFPLGFBQWEsc0JBQXNCLE9BQU8saUNBQWlDO0FBQzNqQztBQUNBLGlFQUFlLHVCQUF1QixFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvcmUvY29tcG9uZW50cy9uYXYvRm9vdGVyQmFyLnZ1ZT84NDc4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuI2Zvb3RlcltkYXRhLXYtNWZkZmVjOTVdIHtcXG4gICAgICAgIGJhY2tncm91bmQ6ICNmM2Y1Zjk7XFxufVxcbnBbZGF0YS12LTVmZGZlYzk1XSB7XFxuICAgICAgICBmb250LXNpemU6IDE0cHg7XFxuICAgICAgICBjb2xvcjogIzc1ODY5NztcXG4gICAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcXG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxMnB4O1xcbn1cXG5wIGFbZGF0YS12LTVmZGZlYzk1XSB7XFxuICAgICAgICBjb2xvcjogIzAwMDtcXG59XFxuXFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vcmVzb3VyY2VzL2pzL2NvcmUvY29tcG9uZW50cy9uYXYvRm9vdGVyQmFyLnZ1ZVwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBZUk7UUFDSSxtQkFBbUI7QUFDdkI7QUFFQTtRQUNJLGVBQWU7UUFDZixjQUFjO1FBQ2Qsa0JBQWtCO1FBQ2xCLGlCQUFpQjtBQUNyQjtBQUVBO1FBQ0ksV0FBVztBQUNmXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXG4gICAgPGZvb3RlciBpZD1cXFwiZm9vdGVyXFxcIj5cXG4gICAgICAgIDxwIGNsYXNzPVxcXCJ0ZXh0LWxnLXJpZ2h0XFxcIj5cXG4gICAgICAgICAgICAmY29weTsge3sgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIH19IC0gPGEgaHJlZj1cXFwiaHR0cHM6Ly93d3cuY2FzdHVzLmNvLnVrXFxcIj5DYXN0dXM8L2E+LlxcbiAgICAgICAgPC9wPlxcbiAgICA8L2Zvb3Rlcj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuZXhwb3J0IGRlZmF1bHQge1xcbiAgICBuYW1lOiBcXFwiRm9vdGVyQmFyXFxcIlxcbn1cXG48L3NjcmlwdD5cXG5cXG48c3R5bGUgc2NvcGVkPlxcbiAgICAjZm9vdGVyIHtcXG4gICAgICAgIGJhY2tncm91bmQ6ICNmM2Y1Zjk7XFxuICAgIH1cXG5cXG4gICAgcCB7XFxuICAgICAgICBmb250LXNpemU6IDE0cHg7XFxuICAgICAgICBjb2xvcjogIzc1ODY5NztcXG4gICAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcXG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxMnB4O1xcbiAgICB9XFxuXFxuICAgIHAgYSB7XFxuICAgICAgICBjb2xvcjogIzAwMDtcXG4gICAgfVxcblxcbjwvc3R5bGU+XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/FooterBar.vue?vue&type=style&index=0&id=5fdfec95&scoped=true&lang=css\n");

/***/ }),

/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/SideBar.vue?vue&type=style&index=0&id=0aa712ce&lang=css":
/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/SideBar.vue?vue&type=style&index=0&id=0aa712ce&lang=css ***!
  \*************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js */ \"./node_modules/css-loader/dist/runtime/cssWithMappingToString.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.v-sidebar-menu {\\n    top: 40px !important;\\n    background-color: rgb(43, 58, 72);\\n    z-index: 2;\\n}\\n.v-sidebar-menu .vsm--link {\\n    font-size: 13px;\\n    padding: 2px 10px;\\n}\\n.v-sidebar-menu .vsm--link.vsm--link_level-1 {\\n    padding: 5px 7px;\\n}\\n.v-sidebar-menu .vsm-item.first-item>.vsm-link>.vsm-icon {\\n    color: #fff;\\n    background-color: inherit;\\n}\\n.vsm-title {\\n    font-size: 13px;\\n    font-family: 'Open Sans', serif;\\n    font-weight: 400;\\n}\\n.vsm--list {\\n    padding-top: 10px;\\n}\\n.v-sidebar-menu .vsm-dropdown>.vsm-list {\\n    background-color: rgb(37, 50, 62);\\n}\\n.v-sidebar-menu .vsm-item.first-item.active-item>.vsm-link>.vsm-icon, .v-sidebar-menu .vsm-item.first-item.parent-active-item>.vsm-link>.vsm-icon {\\n    color: #fff;\\n    background-color: inherit;\\n}\\n.vsm-link:hover>.vsm-icon {\\n    background-color: rgba(36,44,53) !important;\\n}\\n.v-sidebar-menu .collapse-btn {\\n    height: 0px;\\n}\\n.v-sidebar-menu .vsm-item.active-item {\\n    color: white;\\n}\\n.v-sidebar-menu .vsm-item.parent-active-item {\\n    color: white;\\n}\\n.v-sidebar-menu .vsm-link {\\n    color: inherit;\\n}\\n.v-sidebar-menu .vsm-dropdown > .vsm-list .vsm-link {\\n    color: inherit;\\n    margin-left: 50px;\\n}\\n#sidebar > .collapse-btn {\\n    display: none;\\n}\\n.v-sidebar-menu .vsm--toggle-btn {\\n    height: 35px;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./resources/js/core/components/nav/SideBar.vue\"],\"names\":[],\"mappings\":\";AAqEA;IACI,oBAAoB;IACpB,iCAAiC;IACjC,UAAU;AACd;AAEA;IACI,eAAe;IACf,iBAAiB;AACrB;AAEA;IACI,gBAAgB;AACpB;AAEA;IACI,WAAW;IACX,yBAAyB;AAC7B;AAEA;IACI,eAAe;IACf,+BAA+B;IAC/B,gBAAgB;AACpB;AAEA;IACI,iBAAiB;AACrB;AAEA;IACI,iCAAiC;AACrC;AAEA;IACI,WAAW;IACX,yBAAyB;AAC7B;AAEA;IACI,2CAA2C;AAC/C;AAEA;IACI,WAAW;AACf;AAEA;IACI,YAAY;AAChB;AAEA;IACI,YAAY;AAChB;AAEA;IACI,cAAc;AAClB;AAEA;IACI,cAAc;IACd,iBAAiB;AACrB;AAEA;IACI,aAAa;AACjB;AAEA;IACI,YAAY;AAChB\",\"sourcesContent\":[\"<template>\\n    <sidebar-menu\\n        :menu=\\\"routes\\\"\\n        @toggle-collapse=\\\"onToggleCollapse\\\"\\n        :collapsed=\\\"!expanded\\\"\\n        width=\\\"270px\\\"\\n        width-collapsed=\\\"50px\\\"\\n        theme=\\\"default-theme\\\"\\n        :showOneChild=\\\"true\\\"\\n        id=\\\"sidebar\\\"\\n    />\\n</template>\\n\\n<script>\\n\\n    import Routes from '~/routes';\\n    import constructSidebarEntriesFromRoutes from '~/core/mixins/RoutingMixin';\\n\\n    // Sidebar navigation component\\n    export default {\\n        name: \\\"Sidebar\\\",\\n        data() {\\n            return {\\n                routes: [],\\n                expanded: this.$store.getters['sidebar/expanded']\\n            }\\n        },\\n        methods: {\\n            // @vuese\\n            // Load routes for sidebar and render\\n            render() {\\n                let routes = Routes;\\n\\n                this.routes = constructSidebarEntriesFromRoutes(routes);\\n            },\\n\\n            onToggleCollapse(collapsed) {\\n                this.$store.commit('sidebar/toggle');\\n                return false;\\n            },\\n\\n            setBodyClass(expanded) {\\n                if (expanded) {\\n                    document.getElementById('container').classList.add('mainnav-lg');\\n                    document.getElementById('container').classList.remove('mainnav-sm');\\n                } else {\\n                    document.getElementById('container').classList.remove('mainnav-lg');\\n                    document.getElementById('container').classList.add('mainnav-sm');\\n                }\\n            }\\n        },\\n        mounted() {\\n            this.render();\\n\\n            this.$store.watch(function(state) {\\n                return state.sidebar.expanded;\\n            }, (input) => {\\n                this.expanded = input;\\n                this.setBodyClass(input);\\n            }, {\\n                deep: true\\n            });\\n\\n            this.setBodyClass(this.expanded);\\n        }\\n    }\\n</script>\\n\\n<style>\\n.v-sidebar-menu {\\n    top: 40px !important;\\n    background-color: rgb(43, 58, 72);\\n    z-index: 2;\\n}\\n\\n.v-sidebar-menu .vsm--link {\\n    font-size: 13px;\\n    padding: 2px 10px;\\n}\\n\\n.v-sidebar-menu .vsm--link.vsm--link_level-1 {\\n    padding: 5px 7px;\\n}\\n\\n.v-sidebar-menu .vsm-item.first-item>.vsm-link>.vsm-icon {\\n    color: #fff;\\n    background-color: inherit;\\n}\\n\\n.vsm-title {\\n    font-size: 13px;\\n    font-family: 'Open Sans', serif;\\n    font-weight: 400;\\n}\\n\\n.vsm--list {\\n    padding-top: 10px;\\n}\\n\\n.v-sidebar-menu .vsm-dropdown>.vsm-list {\\n    background-color: rgb(37, 50, 62);\\n}\\n\\n.v-sidebar-menu .vsm-item.first-item.active-item>.vsm-link>.vsm-icon, .v-sidebar-menu .vsm-item.first-item.parent-active-item>.vsm-link>.vsm-icon {\\n    color: #fff;\\n    background-color: inherit;\\n}\\n\\n.vsm-link:hover>.vsm-icon {\\n    background-color: rgba(36,44,53) !important;\\n}\\n\\n.v-sidebar-menu .collapse-btn {\\n    height: 0px;\\n}\\n\\n.v-sidebar-menu .vsm-item.active-item {\\n    color: white;\\n}\\n\\n.v-sidebar-menu .vsm-item.parent-active-item {\\n    color: white;\\n}\\n\\n.v-sidebar-menu .vsm-link {\\n    color: inherit;\\n}\\n\\n.v-sidebar-menu .vsm-dropdown > .vsm-list .vsm-link {\\n    color: inherit;\\n    margin-left: 50px;\\n}\\n\\n#sidebar > .collapse-btn {\\n    display: none;\\n}\\n\\n.v-sidebar-menu .vsm--toggle-btn {\\n    height: 35px;\\n}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0xMi51c2VbMV0hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L3N0eWxlUG9zdExvYWRlci5qcyEuL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0xMi51c2VbMl0hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2luZGV4LmpzPz9ydWxlU2V0WzBdLnVzZVswXSEuL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvbmF2L1NpZGVCYXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MGFhNzEyY2UmbGFuZz1jc3MuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNrSTtBQUM3QjtBQUNyRyw4QkFBOEIsbUZBQTJCLENBQUMsd0dBQXFDO0FBQy9GO0FBQ0EsNkRBQTZELDJCQUEyQix3Q0FBd0MsaUJBQWlCLEdBQUcsOEJBQThCLHNCQUFzQix3QkFBd0IsR0FBRyxnREFBZ0QsdUJBQXVCLEdBQUcsNERBQTRELGtCQUFrQixnQ0FBZ0MsR0FBRyxjQUFjLHNCQUFzQixzQ0FBc0MsdUJBQXVCLEdBQUcsY0FBYyx3QkFBd0IsR0FBRywyQ0FBMkMsd0NBQXdDLEdBQUcscUpBQXFKLGtCQUFrQixnQ0FBZ0MsR0FBRyw2QkFBNkIsa0RBQWtELEdBQUcsaUNBQWlDLGtCQUFrQixHQUFHLHlDQUF5QyxtQkFBbUIsR0FBRyxnREFBZ0QsbUJBQW1CLEdBQUcsNkJBQTZCLHFCQUFxQixHQUFHLHVEQUF1RCxxQkFBcUIsd0JBQXdCLEdBQUcsNEJBQTRCLG9CQUFvQixHQUFHLG9DQUFvQyxtQkFBbUIsR0FBRyxTQUFTLDJHQUEyRyxNQUFNLFlBQVksYUFBYSxXQUFXLEtBQUssS0FBSyxVQUFVLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFVBQVUsWUFBWSxNQUFNLEtBQUssVUFBVSxZQUFZLGFBQWEsTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFVBQVUsWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssVUFBVSxLQUFLLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxZQUFZLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLDZYQUE2WCxpRkFBaUYsNkRBQTZELDhDQUE4QyxzQkFBc0IsK0dBQStHLFdBQVcscUJBQXFCLGtHQUFrRyxzQ0FBc0MsNEVBQTRFLGVBQWUsOENBQThDLHVEQUF1RCwrQkFBK0IsZUFBZSx5Q0FBeUMsaUNBQWlDLHVGQUF1RiwwRkFBMEYsb0JBQW9CLE1BQU0sMEZBQTBGLHVGQUF1RixtQkFBbUIsZUFBZSxXQUFXLHNCQUFzQiw0QkFBNEIsbURBQW1ELGdEQUFnRCxlQUFlLGNBQWMsd0NBQXdDLDJDQUEyQyxlQUFlLEdBQUcsMkNBQTJDLEVBQUUsaURBQWlELFdBQVcsT0FBTyx5Q0FBeUMsMkJBQTJCLHdDQUF3QyxpQkFBaUIsR0FBRyxnQ0FBZ0Msc0JBQXNCLHdCQUF3QixHQUFHLGtEQUFrRCx1QkFBdUIsR0FBRyw4REFBOEQsa0JBQWtCLGdDQUFnQyxHQUFHLGdCQUFnQixzQkFBc0Isc0NBQXNDLHVCQUF1QixHQUFHLGdCQUFnQix3QkFBd0IsR0FBRyw2Q0FBNkMsd0NBQXdDLEdBQUcsdUpBQXVKLGtCQUFrQixnQ0FBZ0MsR0FBRywrQkFBK0Isa0RBQWtELEdBQUcsbUNBQW1DLGtCQUFrQixHQUFHLDJDQUEyQyxtQkFBbUIsR0FBRyxrREFBa0QsbUJBQW1CLEdBQUcsK0JBQStCLHFCQUFxQixHQUFHLHlEQUF5RCxxQkFBcUIsd0JBQXdCLEdBQUcsOEJBQThCLG9CQUFvQixHQUFHLHNDQUFzQyxtQkFBbUIsR0FBRywrQkFBK0I7QUFDanVLO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9TaWRlQmFyLnZ1ZT9jYzUyIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLnYtc2lkZWJhci1tZW51IHtcXG4gICAgdG9wOiA0MHB4ICFpbXBvcnRhbnQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYig0MywgNTgsIDcyKTtcXG4gICAgei1pbmRleDogMjtcXG59XFxuLnYtc2lkZWJhci1tZW51IC52c20tLWxpbmsge1xcbiAgICBmb250LXNpemU6IDEzcHg7XFxuICAgIHBhZGRpbmc6IDJweCAxMHB4O1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0tbGluay52c20tLWxpbmtfbGV2ZWwtMSB7XFxuICAgIHBhZGRpbmc6IDVweCA3cHg7XFxufVxcbi52LXNpZGViYXItbWVudSAudnNtLWl0ZW0uZmlyc3QtaXRlbT4udnNtLWxpbms+LnZzbS1pY29uIHtcXG4gICAgY29sb3I6ICNmZmY7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxufVxcbi52c20tdGl0bGUge1xcbiAgICBmb250LXNpemU6IDEzcHg7XFxuICAgIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJywgc2VyaWY7XFxuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XFxufVxcbi52c20tLWxpc3Qge1xcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcXG59XFxuLnYtc2lkZWJhci1tZW51IC52c20tZHJvcGRvd24+LnZzbS1saXN0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDM3LCA1MCwgNjIpO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS1pdGVtLmZpcnN0LWl0ZW0uYWN0aXZlLWl0ZW0+LnZzbS1saW5rPi52c20taWNvbiwgLnYtc2lkZWJhci1tZW51IC52c20taXRlbS5maXJzdC1pdGVtLnBhcmVudC1hY3RpdmUtaXRlbT4udnNtLWxpbms+LnZzbS1pY29uIHtcXG4gICAgY29sb3I6ICNmZmY7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxufVxcbi52c20tbGluazpob3Zlcj4udnNtLWljb24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDM2LDQ0LDUzKSAhaW1wb3J0YW50O1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLmNvbGxhcHNlLWJ0biB7XFxuICAgIGhlaWdodDogMHB4O1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS1pdGVtLmFjdGl2ZS1pdGVtIHtcXG4gICAgY29sb3I6IHdoaXRlO1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS1pdGVtLnBhcmVudC1hY3RpdmUtaXRlbSB7XFxuICAgIGNvbG9yOiB3aGl0ZTtcXG59XFxuLnYtc2lkZWJhci1tZW51IC52c20tbGluayB7XFxuICAgIGNvbG9yOiBpbmhlcml0O1xcbn1cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS1kcm9wZG93biA+IC52c20tbGlzdCAudnNtLWxpbmsge1xcbiAgICBjb2xvcjogaW5oZXJpdDtcXG4gICAgbWFyZ2luLWxlZnQ6IDUwcHg7XFxufVxcbiNzaWRlYmFyID4gLmNvbGxhcHNlLWJ0biB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcbi52LXNpZGViYXItbWVudSAudnNtLS10b2dnbGUtYnRuIHtcXG4gICAgaGVpZ2h0OiAzNXB4O1xcbn1cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9TaWRlQmFyLnZ1ZVwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBcUVBO0lBQ0ksb0JBQW9CO0lBQ3BCLGlDQUFpQztJQUNqQyxVQUFVO0FBQ2Q7QUFFQTtJQUNJLGVBQWU7SUFDZixpQkFBaUI7QUFDckI7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjtBQUVBO0lBQ0ksV0FBVztJQUNYLHlCQUF5QjtBQUM3QjtBQUVBO0lBQ0ksZUFBZTtJQUNmLCtCQUErQjtJQUMvQixnQkFBZ0I7QUFDcEI7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjtBQUVBO0lBQ0ksaUNBQWlDO0FBQ3JDO0FBRUE7SUFDSSxXQUFXO0lBQ1gseUJBQXlCO0FBQzdCO0FBRUE7SUFDSSwyQ0FBMkM7QUFDL0M7QUFFQTtJQUNJLFdBQVc7QUFDZjtBQUVBO0lBQ0ksWUFBWTtBQUNoQjtBQUVBO0lBQ0ksWUFBWTtBQUNoQjtBQUVBO0lBQ0ksY0FBYztBQUNsQjtBQUVBO0lBQ0ksY0FBYztJQUNkLGlCQUFpQjtBQUNyQjtBQUVBO0lBQ0ksYUFBYTtBQUNqQjtBQUVBO0lBQ0ksWUFBWTtBQUNoQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxuICAgIDxzaWRlYmFyLW1lbnVcXG4gICAgICAgIDptZW51PVxcXCJyb3V0ZXNcXFwiXFxuICAgICAgICBAdG9nZ2xlLWNvbGxhcHNlPVxcXCJvblRvZ2dsZUNvbGxhcHNlXFxcIlxcbiAgICAgICAgOmNvbGxhcHNlZD1cXFwiIWV4cGFuZGVkXFxcIlxcbiAgICAgICAgd2lkdGg9XFxcIjI3MHB4XFxcIlxcbiAgICAgICAgd2lkdGgtY29sbGFwc2VkPVxcXCI1MHB4XFxcIlxcbiAgICAgICAgdGhlbWU9XFxcImRlZmF1bHQtdGhlbWVcXFwiXFxuICAgICAgICA6c2hvd09uZUNoaWxkPVxcXCJ0cnVlXFxcIlxcbiAgICAgICAgaWQ9XFxcInNpZGViYXJcXFwiXFxuICAgIC8+XFxuPC90ZW1wbGF0ZT5cXG5cXG48c2NyaXB0PlxcblxcbiAgICBpbXBvcnQgUm91dGVzIGZyb20gJ34vcm91dGVzJztcXG4gICAgaW1wb3J0IGNvbnN0cnVjdFNpZGViYXJFbnRyaWVzRnJvbVJvdXRlcyBmcm9tICd+L2NvcmUvbWl4aW5zL1JvdXRpbmdNaXhpbic7XFxuXFxuICAgIC8vIFNpZGViYXIgbmF2aWdhdGlvbiBjb21wb25lbnRcXG4gICAgZXhwb3J0IGRlZmF1bHQge1xcbiAgICAgICAgbmFtZTogXFxcIlNpZGViYXJcXFwiLFxcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICByb3V0ZXM6IFtdLFxcbiAgICAgICAgICAgICAgICBleHBhbmRlZDogdGhpcy4kc3RvcmUuZ2V0dGVyc1snc2lkZWJhci9leHBhbmRlZCddXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG4gICAgICAgIG1ldGhvZHM6IHtcXG4gICAgICAgICAgICAvLyBAdnVlc2VcXG4gICAgICAgICAgICAvLyBMb2FkIHJvdXRlcyBmb3Igc2lkZWJhciBhbmQgcmVuZGVyXFxuICAgICAgICAgICAgcmVuZGVyKCkge1xcbiAgICAgICAgICAgICAgICBsZXQgcm91dGVzID0gUm91dGVzO1xcblxcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlcyA9IGNvbnN0cnVjdFNpZGViYXJFbnRyaWVzRnJvbVJvdXRlcyhyb3V0ZXMpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgb25Ub2dnbGVDb2xsYXBzZShjb2xsYXBzZWQpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuY29tbWl0KCdzaWRlYmFyL3RvZ2dsZScpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICBzZXRCb2R5Q2xhc3MoZXhwYW5kZWQpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGV4cGFuZGVkKSB7XFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJykuY2xhc3NMaXN0LmFkZCgnbWFpbm5hdi1sZycpO1xcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhaW5lcicpLmNsYXNzTGlzdC5yZW1vdmUoJ21haW5uYXYtc20nKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKS5jbGFzc0xpc3QucmVtb3ZlKCdtYWlubmF2LWxnJyk7XFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJykuY2xhc3NMaXN0LmFkZCgnbWFpbm5hdi1zbScpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG4gICAgICAgIG1vdW50ZWQoKSB7XFxuICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTtcXG5cXG4gICAgICAgICAgICB0aGlzLiRzdG9yZS53YXRjaChmdW5jdGlvbihzdGF0ZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUuc2lkZWJhci5leHBhbmRlZDtcXG4gICAgICAgICAgICB9LCAoaW5wdXQpID0+IHtcXG4gICAgICAgICAgICAgICAgdGhpcy5leHBhbmRlZCA9IGlucHV0O1xcbiAgICAgICAgICAgICAgICB0aGlzLnNldEJvZHlDbGFzcyhpbnB1dCk7XFxuICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICBkZWVwOiB0cnVlXFxuICAgICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgICAgdGhpcy5zZXRCb2R5Q2xhc3ModGhpcy5leHBhbmRlZCk7XFxuICAgICAgICB9XFxuICAgIH1cXG48L3NjcmlwdD5cXG5cXG48c3R5bGU+XFxuLnYtc2lkZWJhci1tZW51IHtcXG4gICAgdG9wOiA0MHB4ICFpbXBvcnRhbnQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYig0MywgNTgsIDcyKTtcXG4gICAgei1pbmRleDogMjtcXG59XFxuXFxuLnYtc2lkZWJhci1tZW51IC52c20tLWxpbmsge1xcbiAgICBmb250LXNpemU6IDEzcHg7XFxuICAgIHBhZGRpbmc6IDJweCAxMHB4O1xcbn1cXG5cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS0tbGluay52c20tLWxpbmtfbGV2ZWwtMSB7XFxuICAgIHBhZGRpbmc6IDVweCA3cHg7XFxufVxcblxcbi52LXNpZGViYXItbWVudSAudnNtLWl0ZW0uZmlyc3QtaXRlbT4udnNtLWxpbms+LnZzbS1pY29uIHtcXG4gICAgY29sb3I6ICNmZmY7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxufVxcblxcbi52c20tdGl0bGUge1xcbiAgICBmb250LXNpemU6IDEzcHg7XFxuICAgIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJywgc2VyaWY7XFxuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XFxufVxcblxcbi52c20tLWxpc3Qge1xcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcXG59XFxuXFxuLnYtc2lkZWJhci1tZW51IC52c20tZHJvcGRvd24+LnZzbS1saXN0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDM3LCA1MCwgNjIpO1xcbn1cXG5cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS1pdGVtLmZpcnN0LWl0ZW0uYWN0aXZlLWl0ZW0+LnZzbS1saW5rPi52c20taWNvbiwgLnYtc2lkZWJhci1tZW51IC52c20taXRlbS5maXJzdC1pdGVtLnBhcmVudC1hY3RpdmUtaXRlbT4udnNtLWxpbms+LnZzbS1pY29uIHtcXG4gICAgY29sb3I6ICNmZmY7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxufVxcblxcbi52c20tbGluazpob3Zlcj4udnNtLWljb24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDM2LDQ0LDUzKSAhaW1wb3J0YW50O1xcbn1cXG5cXG4udi1zaWRlYmFyLW1lbnUgLmNvbGxhcHNlLWJ0biB7XFxuICAgIGhlaWdodDogMHB4O1xcbn1cXG5cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS1pdGVtLmFjdGl2ZS1pdGVtIHtcXG4gICAgY29sb3I6IHdoaXRlO1xcbn1cXG5cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS1pdGVtLnBhcmVudC1hY3RpdmUtaXRlbSB7XFxuICAgIGNvbG9yOiB3aGl0ZTtcXG59XFxuXFxuLnYtc2lkZWJhci1tZW51IC52c20tbGluayB7XFxuICAgIGNvbG9yOiBpbmhlcml0O1xcbn1cXG5cXG4udi1zaWRlYmFyLW1lbnUgLnZzbS1kcm9wZG93biA+IC52c20tbGlzdCAudnNtLWxpbmsge1xcbiAgICBjb2xvcjogaW5oZXJpdDtcXG4gICAgbWFyZ2luLWxlZnQ6IDUwcHg7XFxufVxcblxcbiNzaWRlYmFyID4gLmNvbGxhcHNlLWJ0biB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi52LXNpZGViYXItbWVudSAudnNtLS10b2dnbGUtYnRuIHtcXG4gICAgaGVpZ2h0OiAzNXB4O1xcbn1cXG48L3N0eWxlPlxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/SideBar.vue?vue&type=style&index=0&id=0aa712ce&lang=css\n");

/***/ }),

/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/TopBar.vue?vue&type=style&index=0&id=3e41eeb1&scoped=true&lang=css":
/*!************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/TopBar.vue?vue&type=style&index=0&id=3e41eeb1&scoped=true&lang=css ***!
  \************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js */ \"./node_modules/css-loader/dist/runtime/cssWithMappingToString.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.ship-icon[data-v-3e41eeb1] {\\n    max-width:30px;\\n    margin-left:10px;\\n    margin-top:10px\\n}\\n#navbar[data-v-3e41eeb1] {\\n    position: fixed;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./resources/js/core/components/nav/TopBar.vue\"],\"names\":[],\"mappings\":\";AAyFA;IACI,cAAc;IACd,gBAAgB;IAChB;AACJ;AAEA;IACI,eAAe;AACnB\",\"sourcesContent\":[\"<template>\\n    <header id=\\\"navbar\\\">\\n        <div id=\\\"navbar-container\\\" class=\\\"boxed\\\">\\n            <div class=\\\"navbar-header\\\">\\n                <a href=\\\"/admin/\\\" class=\\\"navbar-brand\\\">\\n                    <div class=\\\"brand-title\\\">\\n                        <span class=\\\"brand-text\\\">Ambassador</span>\\n                    </div>\\n                    <img src=\\\"/images/ship.png\\\" class=\\\"ship-icon\\\"/>\\n                </a>\\n            </div>\\n\\n            <div class=\\\"navbar-content clearfix\\\">\\n\\n                <ul class=\\\"nav navbar-top-links pull-left\\\">\\n                    <li class=\\\"tgl-menu-btn\\\">\\n                        <a class=\\\"mainnav-toggle\\\" @click.prevent=\\\"toggle\\\" id=\\\"mainnav-toggle\\\" href=\\\"#\\\" title=\\\"Hide menu\\\">\\n                            <i class=\\\"fa fa-navicon text-dark\\\"></i>\\n                        </a>\\n                    </li>\\n                    <li class=\\\"dropdown\\\"></li>\\n                    <li class=\\\"megadropdown\\\"></li>\\n                </ul>\\n\\n                <ul class=\\\"nav navbar-top-links pull-right\\\">\\n                    <li id=\\\"dropdown-user\\\" class=\\\"dropdown\\\">\\n                        <a href=\\\"\\\" @click.prevent=\\\"menuVisible = !menuVisible\\\" class=\\\"dropdown-toggle text-right\\\" aria-expanded=\\\"true\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<span class=\\\"ic-user pull-right\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t<i class=\\\"pli-male\\\"></i>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t</span>\\n                            <div class=\\\"username hidden-xs\\\">{{ $store.getters['auth/getUserName'] }}</div>\\n                        </a>\\n\\n\\n                        <div v-if=\\\"menuVisible\\\" class=\\\"dropdown-menu dropdown-menu-md dropdown-menu-right panel-default\\\" style=\\\"opacity: 1; display: block\\\">\\n                            <!-- User dropdown menu -->\\n                            <ul class=\\\"head-list\\\">\\n                                <li>\\n                                    <!--<a href=\\\"#\\\">-->\\n                                    <!--<i class=\\\"pli-male icon-lg icon-fw\\\"></i> Profile-->\\n                                    <!--</a>-->\\n                                </li>\\n                                <li>\\n                                    <a href=\\\"#\\\" @click.prevent=\\\"logout\\\">\\n                                        <i class=\\\"pli-unlock\\\"></i> Logout\\n                                    </a>\\n                                </li>\\n                            </ul>\\n                        </div>\\n                    </li>\\n                </ul>\\n            </div>\\n\\n\\n        </div>\\n    </header>\\n</template>\\n\\n<script>\\n    // Top navigation bar component\\n    export default {\\n        name: \\\"TopBar\\\",\\n        data() {\\n            return {\\n                menuVisible: false,\\n            }\\n        },\\n        methods: {\\n            // @vuese\\n            // Logout of wave\\n            async logout() {\\n                await this.$store.dispatch('auth/logout');\\n                localStorage.clear();\\n                window.location.href = '/login';\\n            },\\n\\n            // @vuese\\n            // Toggle the sidebar\\n            toggle(event) {\\n                this.$store.commit('sidebar/toggle');\\n                return false;\\n            },\\n\\n\\n        }\\n    }\\n</script>\\n\\n<style scoped>\\n.ship-icon {\\n    max-width:30px;\\n    margin-left:10px;\\n    margin-top:10px\\n}\\n\\n#navbar {\\n    position: fixed;\\n}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0xMi51c2VbMV0hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L3N0eWxlUG9zdExvYWRlci5qcyEuL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0xMi51c2VbMl0hLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2luZGV4LmpzPz9ydWxlU2V0WzBdLnVzZVswXSEuL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvbmF2L1RvcEJhci52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0zZTQxZWViMSZzY29wZWQ9dHJ1ZSZsYW5nPWNzcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ2tJO0FBQzdCO0FBQ3JHLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSx5RUFBeUUscUJBQXFCLHVCQUF1Qix3QkFBd0IsNEJBQTRCLHNCQUFzQixHQUFHLFNBQVMsMEdBQTBHLE1BQU0sVUFBVSxZQUFZLE1BQU0sS0FBSyxLQUFLLFVBQVUsNCtDQUE0K0MscUNBQXFDLDJMQUEyTCwwNkJBQTA2Qiw2Q0FBNkMsc0JBQXNCLG9EQUFvRCxXQUFXLHFCQUFxQixvRkFBb0YsNERBQTRELHVDQUF1QyxrREFBa0QsZUFBZSwwRkFBMEYsdURBQXVELCtCQUErQixlQUFlLGdCQUFnQixPQUFPLDJDQUEyQyxxQkFBcUIsdUJBQXVCLHdCQUF3QixhQUFhLHNCQUFzQixHQUFHLCtCQUErQjtBQUMxdkg7QUFDQSxpRUFBZSx1QkFBdUIsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvbmF2L1RvcEJhci52dWU/NjA2YiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5zaGlwLWljb25bZGF0YS12LTNlNDFlZWIxXSB7XFxuICAgIG1heC13aWR0aDozMHB4O1xcbiAgICBtYXJnaW4tbGVmdDoxMHB4O1xcbiAgICBtYXJnaW4tdG9wOjEwcHhcXG59XFxuI25hdmJhcltkYXRhLXYtM2U0MWVlYjFdIHtcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbn1cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9Ub3BCYXIudnVlXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF5RkE7SUFDSSxjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCO0FBQ0o7QUFFQTtJQUNJLGVBQWU7QUFDbkJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcbiAgICA8aGVhZGVyIGlkPVxcXCJuYXZiYXJcXFwiPlxcbiAgICAgICAgPGRpdiBpZD1cXFwibmF2YmFyLWNvbnRhaW5lclxcXCIgY2xhc3M9XFxcImJveGVkXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJuYXZiYXItaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cXFwiL2FkbWluL1xcXCIgY2xhc3M9XFxcIm5hdmJhci1icmFuZFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJicmFuZC10aXRsZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImJyYW5kLXRleHRcXFwiPkFtYmFzc2Fkb3I8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL3NoaXAucG5nXFxcIiBjbGFzcz1cXFwic2hpcC1pY29uXFxcIi8+XFxuICAgICAgICAgICAgICAgIDwvYT5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJuYXZiYXItY29udGVudCBjbGVhcmZpeFxcXCI+XFxuXFxuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cXFwibmF2IG5hdmJhci10b3AtbGlua3MgcHVsbC1sZWZ0XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cXFwidGdsLW1lbnUtYnRuXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cXFwibWFpbm5hdi10b2dnbGVcXFwiIEBjbGljay5wcmV2ZW50PVxcXCJ0b2dnbGVcXFwiIGlkPVxcXCJtYWlubmF2LXRvZ2dsZVxcXCIgaHJlZj1cXFwiI1xcXCIgdGl0bGU9XFxcIkhpZGUgbWVudVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVxcXCJmYSBmYS1uYXZpY29uIHRleHQtZGFya1xcXCI+PC9pPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cXG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XFxuICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XFxcImRyb3Bkb3duXFxcIj48L2xpPlxcbiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVxcXCJtZWdhZHJvcGRvd25cXFwiPjwvbGk+XFxuICAgICAgICAgICAgICAgIDwvdWw+XFxuXFxuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cXFwibmF2IG5hdmJhci10b3AtbGlua3MgcHVsbC1yaWdodFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bGkgaWQ9XFxcImRyb3Bkb3duLXVzZXJcXFwiIGNsYXNzPVxcXCJkcm9wZG93blxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cXFwiXFxcIiBAY2xpY2sucHJldmVudD1cXFwibWVudVZpc2libGUgPSAhbWVudVZpc2libGVcXFwiIGNsYXNzPVxcXCJkcm9wZG93bi10b2dnbGUgdGV4dC1yaWdodFxcXCIgYXJpYS1leHBhbmRlZD1cXFwidHJ1ZVxcXCI+XFxuXFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0PHNwYW4gY2xhc3M9XFxcImljLXVzZXIgcHVsbC1yaWdodFxcXCI+XFxuXFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0PGkgY2xhc3M9XFxcInBsaS1tYWxlXFxcIj48L2k+XFxuXFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0PC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ1c2VybmFtZSBoaWRkZW4teHNcXFwiPnt7ICRzdG9yZS5nZXR0ZXJzWydhdXRoL2dldFVzZXJOYW1lJ10gfX08L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuXFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB2LWlmPVxcXCJtZW51VmlzaWJsZVxcXCIgY2xhc3M9XFxcImRyb3Bkb3duLW1lbnUgZHJvcGRvd24tbWVudS1tZCBkcm9wZG93bi1tZW51LXJpZ2h0IHBhbmVsLWRlZmF1bHRcXFwiIHN0eWxlPVxcXCJvcGFjaXR5OiAxOyBkaXNwbGF5OiBibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVXNlciBkcm9wZG93biBtZW51IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XFxcImhlYWQtbGlzdFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxhIGhyZWY9XFxcIiNcXFwiPi0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08aSBjbGFzcz1cXFwicGxpLW1hbGUgaWNvbi1sZyBpY29uLWZ3XFxcIj48L2k+IFByb2ZpbGUtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPC9hPi0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVxcXCIjXFxcIiBAY2xpY2sucHJldmVudD1cXFwibG9nb3V0XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XFxcInBsaS11bmxvY2tcXFwiPjwvaT4gTG9nb3V0XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XFxuICAgICAgICAgICAgICAgIDwvdWw+XFxuICAgICAgICAgICAgPC9kaXY+XFxuXFxuXFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9oZWFkZXI+XFxuPC90ZW1wbGF0ZT5cXG5cXG48c2NyaXB0PlxcbiAgICAvLyBUb3AgbmF2aWdhdGlvbiBiYXIgY29tcG9uZW50XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIG5hbWU6IFxcXCJUb3BCYXJcXFwiLFxcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBtZW51VmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG4gICAgICAgIG1ldGhvZHM6IHtcXG4gICAgICAgICAgICAvLyBAdnVlc2VcXG4gICAgICAgICAgICAvLyBMb2dvdXQgb2Ygd2F2ZVxcbiAgICAgICAgICAgIGFzeW5jIGxvZ291dCgpIHtcXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2F1dGgvbG9nb3V0Jyk7XFxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5jbGVhcigpO1xcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvbG9naW4nO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLy8gQHZ1ZXNlXFxuICAgICAgICAgICAgLy8gVG9nZ2xlIHRoZSBzaWRlYmFyXFxuICAgICAgICAgICAgdG9nZ2xlKGV2ZW50KSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJHN0b3JlLmNvbW1pdCgnc2lkZWJhci90b2dnbGUnKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICAgICAgICAgIH0sXFxuXFxuXFxuICAgICAgICB9XFxuICAgIH1cXG48L3NjcmlwdD5cXG5cXG48c3R5bGUgc2NvcGVkPlxcbi5zaGlwLWljb24ge1xcbiAgICBtYXgtd2lkdGg6MzBweDtcXG4gICAgbWFyZ2luLWxlZnQ6MTBweDtcXG4gICAgbWFyZ2luLXRvcDoxMHB4XFxufVxcblxcbiNuYXZiYXIge1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxufVxcbjwvc3R5bGU+XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/TopBar.vue?vue&type=style&index=0&id=3e41eeb1&scoped=true&lang=css\n");

/***/ }),

/***/ "./node_modules/css-loader/dist/runtime/api.js":
/*!*****************************************************!*\
  !*** ./node_modules/css-loader/dist/runtime/api.js ***!
  \*****************************************************/
/***/ ((module) => {

"use strict";
eval("\n\n/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\n// eslint-disable-next-line func-names\nmodule.exports = function (cssWithMappingToString) {\n  var list = []; // return the list of modules as css string\n\n  list.toString = function toString() {\n    return this.map(function (item) {\n      var content = cssWithMappingToString(item);\n\n      if (item[2]) {\n        return \"@media \".concat(item[2], \" {\").concat(content, \"}\");\n      }\n\n      return content;\n    }).join(\"\");\n  }; // import a list of modules into the list\n  // eslint-disable-next-line func-names\n\n\n  list.i = function (modules, mediaQuery, dedupe) {\n    if (typeof modules === \"string\") {\n      // eslint-disable-next-line no-param-reassign\n      modules = [[null, modules, \"\"]];\n    }\n\n    var alreadyImportedModules = {};\n\n    if (dedupe) {\n      for (var i = 0; i < this.length; i++) {\n        // eslint-disable-next-line prefer-destructuring\n        var id = this[i][0];\n\n        if (id != null) {\n          alreadyImportedModules[id] = true;\n        }\n      }\n    }\n\n    for (var _i = 0; _i < modules.length; _i++) {\n      var item = [].concat(modules[_i]);\n\n      if (dedupe && alreadyImportedModules[item[0]]) {\n        // eslint-disable-next-line no-continue\n        continue;\n      }\n\n      if (mediaQuery) {\n        if (!item[2]) {\n          item[2] = mediaQuery;\n        } else {\n          item[2] = \"\".concat(mediaQuery, \" and \").concat(item[2]);\n        }\n      }\n\n      list.push(item);\n    }\n  };\n\n  return list;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEMscUJBQXFCO0FBQ2pFOztBQUVBO0FBQ0EsS0FBSztBQUNMLEtBQUs7QUFDTDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixxQkFBcUI7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanM/YWU5ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbi8vIGNzcyBiYXNlIGNvZGUsIGluamVjdGVkIGJ5IHRoZSBjc3MtbG9hZGVyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdOyAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG5cbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuXG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICByZXR1cm4gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGNvbnRlbnQsIFwifVwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTsgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcblxuXG4gIGxpc3QuaSA9IGZ1bmN0aW9uIChtb2R1bGVzLCBtZWRpYVF1ZXJ5LCBkZWR1cGUpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgXCJcIl1dO1xuICAgIH1cblxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG5cbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nXG4gICAgICAgIHZhciBpZCA9IHRoaXNbaV1bMF07XG5cbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbW9kdWxlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBpdGVtID0gW10uY29uY2F0KG1vZHVsZXNbX2ldKTtcblxuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lZGlhUXVlcnkpIHtcbiAgICAgICAgaWYgKCFpdGVtWzJdKSB7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhUXVlcnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsyXSA9IFwiXCIuY29uY2F0KG1lZGlhUXVlcnksIFwiIGFuZCBcIikuY29uY2F0KGl0ZW1bMl0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGxpc3Q7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/runtime/api.js\n");

/***/ }),

/***/ "./node_modules/css-loader/dist/runtime/cssWithMappingToString.js":
/*!************************************************************************!*\
  !*** ./node_modules/css-loader/dist/runtime/cssWithMappingToString.js ***!
  \************************************************************************/
/***/ ((module) => {

"use strict";
eval("\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nmodule.exports = function cssWithMappingToString(item) {\n  var _item = _slicedToArray(item, 4),\n      content = _item[1],\n      cssMapping = _item[3];\n\n  if (!cssMapping) {\n    return content;\n  }\n\n  if (typeof btoa === \"function\") {\n    // eslint-disable-next-line no-undef\n    var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n    var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n    var sourceMapping = \"/*# \".concat(data, \" */\");\n    var sourceURLs = cssMapping.sources.map(function (source) {\n      return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || \"\").concat(source, \" */\");\n    });\n    return [content].concat(sourceURLs).concat([sourceMapping]).join(\"\\n\");\n  }\n\n  return [content].join(\"\\n\");\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixrQ0FBa0M7O0FBRWxDLDhCQUE4Qjs7QUFFOUIsa0RBQWtELGdCQUFnQixnRUFBZ0Usd0RBQXdELDZEQUE2RCxzREFBc0Q7O0FBRTdTLHVDQUF1Qyx1REFBdUQsdUNBQXVDLFNBQVMsT0FBTyxvQkFBb0I7O0FBRXpLLHlDQUF5Qyw4RkFBOEYsd0JBQXdCLGVBQWUsZUFBZSxnQkFBZ0IsWUFBWSxNQUFNLHdCQUF3QiwrQkFBK0IsYUFBYSxxQkFBcUIsdUNBQXVDLGNBQWMsV0FBVyxZQUFZLFVBQVUsTUFBTSxtREFBbUQsVUFBVSxzQkFBc0I7O0FBRXZlLGdDQUFnQzs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxjQUFjO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qcz9mNjVlIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyB2YXIgX2kgPSBhcnIgJiYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXSk7IGlmIChfaSA9PSBudWxsKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX3MsIF9lOyB0cnkgeyBmb3IgKF9pID0gX2kuY2FsbChhcnIpOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7IF9hcnIucHVzaChfcy52YWx1ZSk7IGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsgfSB9IGNhdGNoIChlcnIpIHsgX2QgPSB0cnVlOyBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKSB7XG4gIHZhciBfaXRlbSA9IF9zbGljZWRUb0FycmF5KGl0ZW0sIDQpLFxuICAgICAgY29udGVudCA9IF9pdGVtWzFdLFxuICAgICAgY3NzTWFwcGluZyA9IF9pdGVtWzNdO1xuXG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICB2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3NzTWFwcGluZykpKSk7XG4gICAgdmFyIGRhdGEgPSBcInNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFwiLmNvbmNhdChiYXNlNjQpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gXCIvKiMgXCIuY29uY2F0KGRhdGEsIFwiICovXCIpO1xuICAgIHZhciBzb3VyY2VVUkxzID0gY3NzTWFwcGluZy5zb3VyY2VzLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gXCIvKiMgc291cmNlVVJMPVwiLmNvbmNhdChjc3NNYXBwaW5nLnNvdXJjZVJvb3QgfHwgXCJcIikuY29uY2F0KHNvdXJjZSwgXCIgKi9cIik7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoc291cmNlVVJMcykuY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/runtime/cssWithMappingToString.js\n");

/***/ }),

/***/ "./node_modules/laravel-echo/dist/echo.js":
/*!************************************************!*\
  !*** ./node_modules/laravel-echo/dist/echo.js ***!
  \************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"Channel\": () => (/* binding */ Channel),\n/* harmony export */   \"default\": () => (/* binding */ Echo)\n/* harmony export */ });\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n    return typeof obj;\n  } : function (obj) {\n    return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n  }, _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  Object.defineProperty(Constructor, \"prototype\", {\n    writable: false\n  });\n  return Constructor;\n}\n\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  Object.defineProperty(subClass, \"prototype\", {\n    writable: false\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nfunction _isNativeReflectConstruct() {\n  if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n  if (Reflect.construct.sham) return false;\n  if (typeof Proxy === \"function\") return true;\n\n  try {\n    Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n    return call;\n  } else if (call !== void 0) {\n    throw new TypeError(\"Derived constructors may only return object or undefined\");\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _createSuper(Derived) {\n  var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n  return function _createSuperInternal() {\n    var Super = _getPrototypeOf(Derived),\n        result;\n\n    if (hasNativeReflectConstruct) {\n      var NewTarget = _getPrototypeOf(this).constructor;\n\n      result = Reflect.construct(Super, arguments, NewTarget);\n    } else {\n      result = Super.apply(this, arguments);\n    }\n\n    return _possibleConstructorReturn(this, result);\n  };\n}\n\n/**\r\n * This class represents a basic channel.\r\n */\nvar Channel = /*#__PURE__*/function () {\n  function Channel() {\n    _classCallCheck(this, Channel);\n  }\n\n  _createClass(Channel, [{\n    key: \"listenForWhisper\",\n    value:\n    /**\r\n     * Listen for a whisper event on the channel instance.\r\n     */\n    function listenForWhisper(event, callback) {\n      return this.listen('.client-' + event, callback);\n    }\n    /**\r\n     * Listen for an event on the channel instance.\r\n     */\n\n  }, {\n    key: \"notification\",\n    value: function notification(callback) {\n      return this.listen('.Illuminate\\\\Notifications\\\\Events\\\\BroadcastNotificationCreated', callback);\n    }\n    /**\r\n     * Stop listening for a whisper event on the channel instance.\r\n     */\n\n  }, {\n    key: \"stopListeningForWhisper\",\n    value: function stopListeningForWhisper(event, callback) {\n      return this.stopListening('.client-' + event, callback);\n    }\n  }]);\n\n  return Channel;\n}();\n\n/**\r\n * Event name formatter\r\n */\nvar EventFormatter = /*#__PURE__*/function () {\n  /**\r\n   * Create a new class instance.\r\n   */\n  function EventFormatter(namespace) {\n    _classCallCheck(this, EventFormatter);\n\n    this.setNamespace(namespace);\n  }\n  /**\r\n   * Format the given event name.\r\n   */\n\n\n  _createClass(EventFormatter, [{\n    key: \"format\",\n    value: function format(event) {\n      if (event.charAt(0) === '.' || event.charAt(0) === '\\\\') {\n        return event.substr(1);\n      } else if (this.namespace) {\n        event = this.namespace + '.' + event;\n      }\n\n      return event.replace(/\\./g, '\\\\');\n    }\n    /**\r\n     * Set the event namespace.\r\n     */\n\n  }, {\n    key: \"setNamespace\",\n    value: function setNamespace(value) {\n      this.namespace = value;\n    }\n  }]);\n\n  return EventFormatter;\n}();\n\n/**\r\n * This class represents a Pusher channel.\r\n */\n\nvar PusherChannel = /*#__PURE__*/function (_Channel) {\n  _inherits(PusherChannel, _Channel);\n\n  var _super = _createSuper(PusherChannel);\n\n  /**\r\n   * Create a new class instance.\r\n   */\n  function PusherChannel(pusher, name, options) {\n    var _this;\n\n    _classCallCheck(this, PusherChannel);\n\n    _this = _super.call(this);\n    _this.name = name;\n    _this.pusher = pusher;\n    _this.options = options;\n    _this.eventFormatter = new EventFormatter(_this.options.namespace);\n\n    _this.subscribe();\n\n    return _this;\n  }\n  /**\r\n   * Subscribe to a Pusher channel.\r\n   */\n\n\n  _createClass(PusherChannel, [{\n    key: \"subscribe\",\n    value: function subscribe() {\n      this.subscription = this.pusher.subscribe(this.name);\n    }\n    /**\r\n     * Unsubscribe from a Pusher channel.\r\n     */\n\n  }, {\n    key: \"unsubscribe\",\n    value: function unsubscribe() {\n      this.pusher.unsubscribe(this.name);\n    }\n    /**\r\n     * Listen for an event on the channel instance.\r\n     */\n\n  }, {\n    key: \"listen\",\n    value: function listen(event, callback) {\n      this.on(this.eventFormatter.format(event), callback);\n      return this;\n    }\n    /**\r\n     * Listen for all events on the channel instance.\r\n     */\n\n  }, {\n    key: \"listenToAll\",\n    value: function listenToAll(callback) {\n      var _this2 = this;\n\n      this.subscription.bind_global(function (event, data) {\n        if (event.startsWith('pusher:')) {\n          return;\n        }\n\n        var namespace = _this2.options.namespace.replace(/\\./g, '\\\\');\n\n        var formattedEvent = event.startsWith(namespace) ? event.substring(namespace.length + 1) : '.' + event;\n        callback(formattedEvent, data);\n      });\n      return this;\n    }\n    /**\r\n     * Stop listening for an event on the channel instance.\r\n     */\n\n  }, {\n    key: \"stopListening\",\n    value: function stopListening(event, callback) {\n      if (callback) {\n        this.subscription.unbind(this.eventFormatter.format(event), callback);\n      } else {\n        this.subscription.unbind(this.eventFormatter.format(event));\n      }\n\n      return this;\n    }\n    /**\r\n     * Stop listening for all events on the channel instance.\r\n     */\n\n  }, {\n    key: \"stopListeningToAll\",\n    value: function stopListeningToAll(callback) {\n      if (callback) {\n        this.subscription.unbind_global(callback);\n      } else {\n        this.subscription.unbind_global();\n      }\n\n      return this;\n    }\n    /**\r\n     * Register a callback to be called anytime a subscription succeeds.\r\n     */\n\n  }, {\n    key: \"subscribed\",\n    value: function subscribed(callback) {\n      this.on('pusher:subscription_succeeded', function () {\n        callback();\n      });\n      return this;\n    }\n    /**\r\n     * Register a callback to be called anytime a subscription error occurs.\r\n     */\n\n  }, {\n    key: \"error\",\n    value: function error(callback) {\n      this.on('pusher:subscription_error', function (status) {\n        callback(status);\n      });\n      return this;\n    }\n    /**\r\n     * Bind a channel to an event.\r\n     */\n\n  }, {\n    key: \"on\",\n    value: function on(event, callback) {\n      this.subscription.bind(event, callback);\n      return this;\n    }\n  }]);\n\n  return PusherChannel;\n}(Channel);\n\n/**\r\n * This class represents a Pusher private channel.\r\n */\n\nvar PusherPrivateChannel = /*#__PURE__*/function (_PusherChannel) {\n  _inherits(PusherPrivateChannel, _PusherChannel);\n\n  var _super = _createSuper(PusherPrivateChannel);\n\n  function PusherPrivateChannel() {\n    _classCallCheck(this, PusherPrivateChannel);\n\n    return _super.apply(this, arguments);\n  }\n\n  _createClass(PusherPrivateChannel, [{\n    key: \"whisper\",\n    value:\n    /**\r\n     * Trigger client event on the channel.\r\n     */\n    function whisper(eventName, data) {\n      this.pusher.channels.channels[this.name].trigger(\"client-\".concat(eventName), data);\n      return this;\n    }\n  }]);\n\n  return PusherPrivateChannel;\n}(PusherChannel);\n\n/**\r\n * This class represents a Pusher private channel.\r\n */\n\nvar PusherEncryptedPrivateChannel = /*#__PURE__*/function (_PusherChannel) {\n  _inherits(PusherEncryptedPrivateChannel, _PusherChannel);\n\n  var _super = _createSuper(PusherEncryptedPrivateChannel);\n\n  function PusherEncryptedPrivateChannel() {\n    _classCallCheck(this, PusherEncryptedPrivateChannel);\n\n    return _super.apply(this, arguments);\n  }\n\n  _createClass(PusherEncryptedPrivateChannel, [{\n    key: \"whisper\",\n    value:\n    /**\r\n     * Trigger client event on the channel.\r\n     */\n    function whisper(eventName, data) {\n      this.pusher.channels.channels[this.name].trigger(\"client-\".concat(eventName), data);\n      return this;\n    }\n  }]);\n\n  return PusherEncryptedPrivateChannel;\n}(PusherChannel);\n\n/**\r\n * This class represents a Pusher presence channel.\r\n */\n\nvar PusherPresenceChannel = /*#__PURE__*/function (_PusherChannel) {\n  _inherits(PusherPresenceChannel, _PusherChannel);\n\n  var _super = _createSuper(PusherPresenceChannel);\n\n  function PusherPresenceChannel() {\n    _classCallCheck(this, PusherPresenceChannel);\n\n    return _super.apply(this, arguments);\n  }\n\n  _createClass(PusherPresenceChannel, [{\n    key: \"here\",\n    value:\n    /**\r\n     * Register a callback to be called anytime the member list changes.\r\n     */\n    function here(callback) {\n      this.on('pusher:subscription_succeeded', function (data) {\n        callback(Object.keys(data.members).map(function (k) {\n          return data.members[k];\n        }));\n      });\n      return this;\n    }\n    /**\r\n     * Listen for someone joining the channel.\r\n     */\n\n  }, {\n    key: \"joining\",\n    value: function joining(callback) {\n      this.on('pusher:member_added', function (member) {\n        callback(member.info);\n      });\n      return this;\n    }\n    /**\r\n     * Listen for someone leaving the channel.\r\n     */\n\n  }, {\n    key: \"leaving\",\n    value: function leaving(callback) {\n      this.on('pusher:member_removed', function (member) {\n        callback(member.info);\n      });\n      return this;\n    }\n    /**\r\n     * Trigger client event on the channel.\r\n     */\n\n  }, {\n    key: \"whisper\",\n    value: function whisper(eventName, data) {\n      this.pusher.channels.channels[this.name].trigger(\"client-\".concat(eventName), data);\n      return this;\n    }\n  }]);\n\n  return PusherPresenceChannel;\n}(PusherChannel);\n\n/**\r\n * This class represents a Socket.io channel.\r\n */\n\nvar SocketIoChannel = /*#__PURE__*/function (_Channel) {\n  _inherits(SocketIoChannel, _Channel);\n\n  var _super = _createSuper(SocketIoChannel);\n\n  /**\r\n   * Create a new class instance.\r\n   */\n  function SocketIoChannel(socket, name, options) {\n    var _this;\n\n    _classCallCheck(this, SocketIoChannel);\n\n    _this = _super.call(this);\n    /**\r\n     * The event callbacks applied to the socket.\r\n     */\n\n    _this.events = {};\n    /**\r\n     * User supplied callbacks for events on this channel.\r\n     */\n\n    _this.listeners = {};\n    _this.name = name;\n    _this.socket = socket;\n    _this.options = options;\n    _this.eventFormatter = new EventFormatter(_this.options.namespace);\n\n    _this.subscribe();\n\n    return _this;\n  }\n  /**\r\n   * Subscribe to a Socket.io channel.\r\n   */\n\n\n  _createClass(SocketIoChannel, [{\n    key: \"subscribe\",\n    value: function subscribe() {\n      this.socket.emit('subscribe', {\n        channel: this.name,\n        auth: this.options.auth || {}\n      });\n    }\n    /**\r\n     * Unsubscribe from channel and ubind event callbacks.\r\n     */\n\n  }, {\n    key: \"unsubscribe\",\n    value: function unsubscribe() {\n      this.unbind();\n      this.socket.emit('unsubscribe', {\n        channel: this.name,\n        auth: this.options.auth || {}\n      });\n    }\n    /**\r\n     * Listen for an event on the channel instance.\r\n     */\n\n  }, {\n    key: \"listen\",\n    value: function listen(event, callback) {\n      this.on(this.eventFormatter.format(event), callback);\n      return this;\n    }\n    /**\r\n     * Stop listening for an event on the channel instance.\r\n     */\n\n  }, {\n    key: \"stopListening\",\n    value: function stopListening(event, callback) {\n      this.unbindEvent(this.eventFormatter.format(event), callback);\n      return this;\n    }\n    /**\r\n     * Register a callback to be called anytime a subscription succeeds.\r\n     */\n\n  }, {\n    key: \"subscribed\",\n    value: function subscribed(callback) {\n      this.on('connect', function (socket) {\n        callback(socket);\n      });\n      return this;\n    }\n    /**\r\n     * Register a callback to be called anytime an error occurs.\r\n     */\n\n  }, {\n    key: \"error\",\n    value: function error(callback) {\n      return this;\n    }\n    /**\r\n     * Bind the channel's socket to an event and store the callback.\r\n     */\n\n  }, {\n    key: \"on\",\n    value: function on(event, callback) {\n      var _this2 = this;\n\n      this.listeners[event] = this.listeners[event] || [];\n\n      if (!this.events[event]) {\n        this.events[event] = function (channel, data) {\n          if (_this2.name === channel && _this2.listeners[event]) {\n            _this2.listeners[event].forEach(function (cb) {\n              return cb(data);\n            });\n          }\n        };\n\n        this.socket.on(event, this.events[event]);\n      }\n\n      this.listeners[event].push(callback);\n      return this;\n    }\n    /**\r\n     * Unbind the channel's socket from all stored event callbacks.\r\n     */\n\n  }, {\n    key: \"unbind\",\n    value: function unbind() {\n      var _this3 = this;\n\n      Object.keys(this.events).forEach(function (event) {\n        _this3.unbindEvent(event);\n      });\n    }\n    /**\r\n     * Unbind the listeners for the given event.\r\n     */\n\n  }, {\n    key: \"unbindEvent\",\n    value: function unbindEvent(event, callback) {\n      this.listeners[event] = this.listeners[event] || [];\n\n      if (callback) {\n        this.listeners[event] = this.listeners[event].filter(function (cb) {\n          return cb !== callback;\n        });\n      }\n\n      if (!callback || this.listeners[event].length === 0) {\n        if (this.events[event]) {\n          this.socket.removeListener(event, this.events[event]);\n          delete this.events[event];\n        }\n\n        delete this.listeners[event];\n      }\n    }\n  }]);\n\n  return SocketIoChannel;\n}(Channel);\n\n/**\r\n * This class represents a Socket.io private channel.\r\n */\n\nvar SocketIoPrivateChannel = /*#__PURE__*/function (_SocketIoChannel) {\n  _inherits(SocketIoPrivateChannel, _SocketIoChannel);\n\n  var _super = _createSuper(SocketIoPrivateChannel);\n\n  function SocketIoPrivateChannel() {\n    _classCallCheck(this, SocketIoPrivateChannel);\n\n    return _super.apply(this, arguments);\n  }\n\n  _createClass(SocketIoPrivateChannel, [{\n    key: \"whisper\",\n    value:\n    /**\r\n     * Trigger client event on the channel.\r\n     */\n    function whisper(eventName, data) {\n      this.socket.emit('client event', {\n        channel: this.name,\n        event: \"client-\".concat(eventName),\n        data: data\n      });\n      return this;\n    }\n  }]);\n\n  return SocketIoPrivateChannel;\n}(SocketIoChannel);\n\n/**\r\n * This class represents a Socket.io presence channel.\r\n */\n\nvar SocketIoPresenceChannel = /*#__PURE__*/function (_SocketIoPrivateChann) {\n  _inherits(SocketIoPresenceChannel, _SocketIoPrivateChann);\n\n  var _super = _createSuper(SocketIoPresenceChannel);\n\n  function SocketIoPresenceChannel() {\n    _classCallCheck(this, SocketIoPresenceChannel);\n\n    return _super.apply(this, arguments);\n  }\n\n  _createClass(SocketIoPresenceChannel, [{\n    key: \"here\",\n    value:\n    /**\r\n     * Register a callback to be called anytime the member list changes.\r\n     */\n    function here(callback) {\n      this.on('presence:subscribed', function (members) {\n        callback(members.map(function (m) {\n          return m.user_info;\n        }));\n      });\n      return this;\n    }\n    /**\r\n     * Listen for someone joining the channel.\r\n     */\n\n  }, {\n    key: \"joining\",\n    value: function joining(callback) {\n      this.on('presence:joining', function (member) {\n        return callback(member.user_info);\n      });\n      return this;\n    }\n    /**\r\n     * Listen for someone leaving the channel.\r\n     */\n\n  }, {\n    key: \"leaving\",\n    value: function leaving(callback) {\n      this.on('presence:leaving', function (member) {\n        return callback(member.user_info);\n      });\n      return this;\n    }\n  }]);\n\n  return SocketIoPresenceChannel;\n}(SocketIoPrivateChannel);\n\n/**\r\n * This class represents a null channel.\r\n */\n\nvar NullChannel = /*#__PURE__*/function (_Channel) {\n  _inherits(NullChannel, _Channel);\n\n  var _super = _createSuper(NullChannel);\n\n  function NullChannel() {\n    _classCallCheck(this, NullChannel);\n\n    return _super.apply(this, arguments);\n  }\n\n  _createClass(NullChannel, [{\n    key: \"subscribe\",\n    value:\n    /**\r\n     * Subscribe to a channel.\r\n     */\n    function subscribe() {//\n    }\n    /**\r\n     * Unsubscribe from a channel.\r\n     */\n\n  }, {\n    key: \"unsubscribe\",\n    value: function unsubscribe() {//\n    }\n    /**\r\n     * Listen for an event on the channel instance.\r\n     */\n\n  }, {\n    key: \"listen\",\n    value: function listen(event, callback) {\n      return this;\n    }\n    /**\r\n     * Listen for all events on the channel instance.\r\n     */\n\n  }, {\n    key: \"listenToAll\",\n    value: function listenToAll(callback) {\n      return this;\n    }\n    /**\r\n     * Stop listening for an event on the channel instance.\r\n     */\n\n  }, {\n    key: \"stopListening\",\n    value: function stopListening(event, callback) {\n      return this;\n    }\n    /**\r\n     * Register a callback to be called anytime a subscription succeeds.\r\n     */\n\n  }, {\n    key: \"subscribed\",\n    value: function subscribed(callback) {\n      return this;\n    }\n    /**\r\n     * Register a callback to be called anytime an error occurs.\r\n     */\n\n  }, {\n    key: \"error\",\n    value: function error(callback) {\n      return this;\n    }\n    /**\r\n     * Bind a channel to an event.\r\n     */\n\n  }, {\n    key: \"on\",\n    value: function on(event, callback) {\n      return this;\n    }\n  }]);\n\n  return NullChannel;\n}(Channel);\n\n/**\r\n * This class represents a null private channel.\r\n */\n\nvar NullPrivateChannel = /*#__PURE__*/function (_NullChannel) {\n  _inherits(NullPrivateChannel, _NullChannel);\n\n  var _super = _createSuper(NullPrivateChannel);\n\n  function NullPrivateChannel() {\n    _classCallCheck(this, NullPrivateChannel);\n\n    return _super.apply(this, arguments);\n  }\n\n  _createClass(NullPrivateChannel, [{\n    key: \"whisper\",\n    value:\n    /**\r\n     * Trigger client event on the channel.\r\n     */\n    function whisper(eventName, data) {\n      return this;\n    }\n  }]);\n\n  return NullPrivateChannel;\n}(NullChannel);\n\n/**\r\n * This class represents a null presence channel.\r\n */\n\nvar NullPresenceChannel = /*#__PURE__*/function (_NullChannel) {\n  _inherits(NullPresenceChannel, _NullChannel);\n\n  var _super = _createSuper(NullPresenceChannel);\n\n  function NullPresenceChannel() {\n    _classCallCheck(this, NullPresenceChannel);\n\n    return _super.apply(this, arguments);\n  }\n\n  _createClass(NullPresenceChannel, [{\n    key: \"here\",\n    value:\n    /**\r\n     * Register a callback to be called anytime the member list changes.\r\n     */\n    function here(callback) {\n      return this;\n    }\n    /**\r\n     * Listen for someone joining the channel.\r\n     */\n\n  }, {\n    key: \"joining\",\n    value: function joining(callback) {\n      return this;\n    }\n    /**\r\n     * Listen for someone leaving the channel.\r\n     */\n\n  }, {\n    key: \"leaving\",\n    value: function leaving(callback) {\n      return this;\n    }\n    /**\r\n     * Trigger client event on the channel.\r\n     */\n\n  }, {\n    key: \"whisper\",\n    value: function whisper(eventName, data) {\n      return this;\n    }\n  }]);\n\n  return NullPresenceChannel;\n}(NullChannel);\n\nvar Connector = /*#__PURE__*/function () {\n  /**\r\n   * Create a new class instance.\r\n   */\n  function Connector(options) {\n    _classCallCheck(this, Connector);\n\n    /**\r\n     * Default connector options.\r\n     */\n    this._defaultOptions = {\n      auth: {\n        headers: {}\n      },\n      authEndpoint: '/broadcasting/auth',\n      userAuthentication: {\n        endpoint: '/broadcasting/user-auth',\n        headers: {}\n      },\n      broadcaster: 'pusher',\n      csrfToken: null,\n      bearerToken: null,\n      host: null,\n      key: null,\n      namespace: 'App.Events'\n    };\n    this.setOptions(options);\n    this.connect();\n  }\n  /**\r\n   * Merge the custom options with the defaults.\r\n   */\n\n\n  _createClass(Connector, [{\n    key: \"setOptions\",\n    value: function setOptions(options) {\n      this.options = _extends(this._defaultOptions, options);\n      var token = this.csrfToken();\n\n      if (token) {\n        this.options.auth.headers['X-CSRF-TOKEN'] = token;\n        this.options.userAuthentication.headers['X-CSRF-TOKEN'] = token;\n      }\n\n      token = this.options.bearerToken;\n\n      if (token) {\n        this.options.auth.headers['Authorization'] = 'Bearer ' + token;\n        this.options.userAuthentication.headers['Authorization'] = 'Bearer ' + token;\n      }\n\n      return options;\n    }\n    /**\r\n     * Extract the CSRF token from the page.\r\n     */\n\n  }, {\n    key: \"csrfToken\",\n    value: function csrfToken() {\n      var selector;\n\n      if (typeof window !== 'undefined' && window['Laravel'] && window['Laravel'].csrfToken) {\n        return window['Laravel'].csrfToken;\n      } else if (this.options.csrfToken) {\n        return this.options.csrfToken;\n      } else if (typeof document !== 'undefined' && typeof document.querySelector === 'function' && (selector = document.querySelector('meta[name=\"csrf-token\"]'))) {\n        return selector.getAttribute('content');\n      }\n\n      return null;\n    }\n  }]);\n\n  return Connector;\n}();\n\n/**\r\n * This class creates a connector to Pusher.\r\n */\n\nvar PusherConnector = /*#__PURE__*/function (_Connector) {\n  _inherits(PusherConnector, _Connector);\n\n  var _super = _createSuper(PusherConnector);\n\n  function PusherConnector() {\n    var _this;\n\n    _classCallCheck(this, PusherConnector);\n\n    _this = _super.apply(this, arguments);\n    /**\r\n     * All of the subscribed channel names.\r\n     */\n\n    _this.channels = {};\n    return _this;\n  }\n  /**\r\n   * Create a fresh Pusher connection.\r\n   */\n\n\n  _createClass(PusherConnector, [{\n    key: \"connect\",\n    value: function connect() {\n      if (typeof this.options.client !== 'undefined') {\n        this.pusher = this.options.client;\n      } else if (this.options.Pusher) {\n        this.pusher = new this.options.Pusher(this.options.key, this.options);\n      } else {\n        this.pusher = new Pusher(this.options.key, this.options);\n      }\n    }\n    /**\r\n     * Sign in the user via Pusher user authentication (https://pusher.com/docs/channels/using_channels/user-authentication/).\r\n     */\n\n  }, {\n    key: \"signin\",\n    value: function signin() {\n      this.pusher.signin();\n    }\n    /**\r\n     * Listen for an event on a channel instance.\r\n     */\n\n  }, {\n    key: \"listen\",\n    value: function listen(name, event, callback) {\n      return this.channel(name).listen(event, callback);\n    }\n    /**\r\n     * Get a channel instance by name.\r\n     */\n\n  }, {\n    key: \"channel\",\n    value: function channel(name) {\n      if (!this.channels[name]) {\n        this.channels[name] = new PusherChannel(this.pusher, name, this.options);\n      }\n\n      return this.channels[name];\n    }\n    /**\r\n     * Get a private channel instance by name.\r\n     */\n\n  }, {\n    key: \"privateChannel\",\n    value: function privateChannel(name) {\n      if (!this.channels['private-' + name]) {\n        this.channels['private-' + name] = new PusherPrivateChannel(this.pusher, 'private-' + name, this.options);\n      }\n\n      return this.channels['private-' + name];\n    }\n    /**\r\n     * Get a private encrypted channel instance by name.\r\n     */\n\n  }, {\n    key: \"encryptedPrivateChannel\",\n    value: function encryptedPrivateChannel(name) {\n      if (!this.channels['private-encrypted-' + name]) {\n        this.channels['private-encrypted-' + name] = new PusherEncryptedPrivateChannel(this.pusher, 'private-encrypted-' + name, this.options);\n      }\n\n      return this.channels['private-encrypted-' + name];\n    }\n    /**\r\n     * Get a presence channel instance by name.\r\n     */\n\n  }, {\n    key: \"presenceChannel\",\n    value: function presenceChannel(name) {\n      if (!this.channels['presence-' + name]) {\n        this.channels['presence-' + name] = new PusherPresenceChannel(this.pusher, 'presence-' + name, this.options);\n      }\n\n      return this.channels['presence-' + name];\n    }\n    /**\r\n     * Leave the given channel, as well as its private and presence variants.\r\n     */\n\n  }, {\n    key: \"leave\",\n    value: function leave(name) {\n      var _this2 = this;\n\n      var channels = [name, 'private-' + name, 'private-encrypted-' + name, 'presence-' + name];\n      channels.forEach(function (name, index) {\n        _this2.leaveChannel(name);\n      });\n    }\n    /**\r\n     * Leave the given channel.\r\n     */\n\n  }, {\n    key: \"leaveChannel\",\n    value: function leaveChannel(name) {\n      if (this.channels[name]) {\n        this.channels[name].unsubscribe();\n        delete this.channels[name];\n      }\n    }\n    /**\r\n     * Get the socket ID for the connection.\r\n     */\n\n  }, {\n    key: \"socketId\",\n    value: function socketId() {\n      return this.pusher.connection.socket_id;\n    }\n    /**\r\n     * Disconnect Pusher connection.\r\n     */\n\n  }, {\n    key: \"disconnect\",\n    value: function disconnect() {\n      this.pusher.disconnect();\n    }\n  }]);\n\n  return PusherConnector;\n}(Connector);\n\n/**\r\n * This class creates a connnector to a Socket.io server.\r\n */\n\nvar SocketIoConnector = /*#__PURE__*/function (_Connector) {\n  _inherits(SocketIoConnector, _Connector);\n\n  var _super = _createSuper(SocketIoConnector);\n\n  function SocketIoConnector() {\n    var _this;\n\n    _classCallCheck(this, SocketIoConnector);\n\n    _this = _super.apply(this, arguments);\n    /**\r\n     * All of the subscribed channel names.\r\n     */\n\n    _this.channels = {};\n    return _this;\n  }\n  /**\r\n   * Create a fresh Socket.io connection.\r\n   */\n\n\n  _createClass(SocketIoConnector, [{\n    key: \"connect\",\n    value: function connect() {\n      var _this2 = this;\n\n      var io = this.getSocketIO();\n      this.socket = io(this.options.host, this.options);\n      this.socket.on('reconnect', function () {\n        Object.values(_this2.channels).forEach(function (channel) {\n          channel.subscribe();\n        });\n      });\n      return this.socket;\n    }\n    /**\r\n     * Get socket.io module from global scope or options.\r\n     */\n\n  }, {\n    key: \"getSocketIO\",\n    value: function getSocketIO() {\n      if (typeof this.options.client !== 'undefined') {\n        return this.options.client;\n      }\n\n      if (typeof io !== 'undefined') {\n        return io;\n      }\n\n      throw new Error('Socket.io client not found. Should be globally available or passed via options.client');\n    }\n    /**\r\n     * Listen for an event on a channel instance.\r\n     */\n\n  }, {\n    key: \"listen\",\n    value: function listen(name, event, callback) {\n      return this.channel(name).listen(event, callback);\n    }\n    /**\r\n     * Get a channel instance by name.\r\n     */\n\n  }, {\n    key: \"channel\",\n    value: function channel(name) {\n      if (!this.channels[name]) {\n        this.channels[name] = new SocketIoChannel(this.socket, name, this.options);\n      }\n\n      return this.channels[name];\n    }\n    /**\r\n     * Get a private channel instance by name.\r\n     */\n\n  }, {\n    key: \"privateChannel\",\n    value: function privateChannel(name) {\n      if (!this.channels['private-' + name]) {\n        this.channels['private-' + name] = new SocketIoPrivateChannel(this.socket, 'private-' + name, this.options);\n      }\n\n      return this.channels['private-' + name];\n    }\n    /**\r\n     * Get a presence channel instance by name.\r\n     */\n\n  }, {\n    key: \"presenceChannel\",\n    value: function presenceChannel(name) {\n      if (!this.channels['presence-' + name]) {\n        this.channels['presence-' + name] = new SocketIoPresenceChannel(this.socket, 'presence-' + name, this.options);\n      }\n\n      return this.channels['presence-' + name];\n    }\n    /**\r\n     * Leave the given channel, as well as its private and presence variants.\r\n     */\n\n  }, {\n    key: \"leave\",\n    value: function leave(name) {\n      var _this3 = this;\n\n      var channels = [name, 'private-' + name, 'presence-' + name];\n      channels.forEach(function (name) {\n        _this3.leaveChannel(name);\n      });\n    }\n    /**\r\n     * Leave the given channel.\r\n     */\n\n  }, {\n    key: \"leaveChannel\",\n    value: function leaveChannel(name) {\n      if (this.channels[name]) {\n        this.channels[name].unsubscribe();\n        delete this.channels[name];\n      }\n    }\n    /**\r\n     * Get the socket ID for the connection.\r\n     */\n\n  }, {\n    key: \"socketId\",\n    value: function socketId() {\n      return this.socket.id;\n    }\n    /**\r\n     * Disconnect Socketio connection.\r\n     */\n\n  }, {\n    key: \"disconnect\",\n    value: function disconnect() {\n      this.socket.disconnect();\n    }\n  }]);\n\n  return SocketIoConnector;\n}(Connector);\n\n/**\r\n * This class creates a null connector.\r\n */\n\nvar NullConnector = /*#__PURE__*/function (_Connector) {\n  _inherits(NullConnector, _Connector);\n\n  var _super = _createSuper(NullConnector);\n\n  function NullConnector() {\n    var _this;\n\n    _classCallCheck(this, NullConnector);\n\n    _this = _super.apply(this, arguments);\n    /**\r\n     * All of the subscribed channel names.\r\n     */\n\n    _this.channels = {};\n    return _this;\n  }\n  /**\r\n   * Create a fresh connection.\r\n   */\n\n\n  _createClass(NullConnector, [{\n    key: \"connect\",\n    value: function connect() {//\n    }\n    /**\r\n     * Listen for an event on a channel instance.\r\n     */\n\n  }, {\n    key: \"listen\",\n    value: function listen(name, event, callback) {\n      return new NullChannel();\n    }\n    /**\r\n     * Get a channel instance by name.\r\n     */\n\n  }, {\n    key: \"channel\",\n    value: function channel(name) {\n      return new NullChannel();\n    }\n    /**\r\n     * Get a private channel instance by name.\r\n     */\n\n  }, {\n    key: \"privateChannel\",\n    value: function privateChannel(name) {\n      return new NullPrivateChannel();\n    }\n    /**\r\n     * Get a private encrypted channel instance by name.\r\n     */\n\n  }, {\n    key: \"encryptedPrivateChannel\",\n    value: function encryptedPrivateChannel(name) {\n      return new NullPrivateChannel();\n    }\n    /**\r\n     * Get a presence channel instance by name.\r\n     */\n\n  }, {\n    key: \"presenceChannel\",\n    value: function presenceChannel(name) {\n      return new NullPresenceChannel();\n    }\n    /**\r\n     * Leave the given channel, as well as its private and presence variants.\r\n     */\n\n  }, {\n    key: \"leave\",\n    value: function leave(name) {//\n    }\n    /**\r\n     * Leave the given channel.\r\n     */\n\n  }, {\n    key: \"leaveChannel\",\n    value: function leaveChannel(name) {//\n    }\n    /**\r\n     * Get the socket ID for the connection.\r\n     */\n\n  }, {\n    key: \"socketId\",\n    value: function socketId() {\n      return 'fake-socket-id';\n    }\n    /**\r\n     * Disconnect the connection.\r\n     */\n\n  }, {\n    key: \"disconnect\",\n    value: function disconnect() {//\n    }\n  }]);\n\n  return NullConnector;\n}(Connector);\n\n/**\r\n * This class is the primary API for interacting with broadcasting.\r\n */\n\nvar Echo = /*#__PURE__*/function () {\n  /**\r\n   * Create a new class instance.\r\n   */\n  function Echo(options) {\n    _classCallCheck(this, Echo);\n\n    this.options = options;\n    this.connect();\n\n    if (!this.options.withoutInterceptors) {\n      this.registerInterceptors();\n    }\n  }\n  /**\r\n   * Get a channel instance by name.\r\n   */\n\n\n  _createClass(Echo, [{\n    key: \"channel\",\n    value: function channel(_channel) {\n      return this.connector.channel(_channel);\n    }\n    /**\r\n     * Create a new connection.\r\n     */\n\n  }, {\n    key: \"connect\",\n    value: function connect() {\n      if (this.options.broadcaster == 'pusher') {\n        this.connector = new PusherConnector(this.options);\n      } else if (this.options.broadcaster == 'socket.io') {\n        this.connector = new SocketIoConnector(this.options);\n      } else if (this.options.broadcaster == 'null') {\n        this.connector = new NullConnector(this.options);\n      } else if (typeof this.options.broadcaster == 'function') {\n        this.connector = new this.options.broadcaster(this.options);\n      }\n    }\n    /**\r\n     * Disconnect from the Echo server.\r\n     */\n\n  }, {\n    key: \"disconnect\",\n    value: function disconnect() {\n      this.connector.disconnect();\n    }\n    /**\r\n     * Get a presence channel instance by name.\r\n     */\n\n  }, {\n    key: \"join\",\n    value: function join(channel) {\n      return this.connector.presenceChannel(channel);\n    }\n    /**\r\n     * Leave the given channel, as well as its private and presence variants.\r\n     */\n\n  }, {\n    key: \"leave\",\n    value: function leave(channel) {\n      this.connector.leave(channel);\n    }\n    /**\r\n     * Leave the given channel.\r\n     */\n\n  }, {\n    key: \"leaveChannel\",\n    value: function leaveChannel(channel) {\n      this.connector.leaveChannel(channel);\n    }\n    /**\r\n     * Leave all channels.\r\n     */\n\n  }, {\n    key: \"leaveAllChannels\",\n    value: function leaveAllChannels() {\n      for (var channel in this.connector.channels) {\n        this.leaveChannel(channel);\n      }\n    }\n    /**\r\n     * Listen for an event on a channel instance.\r\n     */\n\n  }, {\n    key: \"listen\",\n    value: function listen(channel, event, callback) {\n      return this.connector.listen(channel, event, callback);\n    }\n    /**\r\n     * Get a private channel instance by name.\r\n     */\n\n  }, {\n    key: \"private\",\n    value: function _private(channel) {\n      return this.connector.privateChannel(channel);\n    }\n    /**\r\n     * Get a private encrypted channel instance by name.\r\n     */\n\n  }, {\n    key: \"encryptedPrivate\",\n    value: function encryptedPrivate(channel) {\n      return this.connector.encryptedPrivateChannel(channel);\n    }\n    /**\r\n     * Get the Socket ID for the connection.\r\n     */\n\n  }, {\n    key: \"socketId\",\n    value: function socketId() {\n      return this.connector.socketId();\n    }\n    /**\r\n     * Register 3rd party request interceptiors. These are used to automatically\r\n     * send a connections socket id to a Laravel app with a X-Socket-Id header.\r\n     */\n\n  }, {\n    key: \"registerInterceptors\",\n    value: function registerInterceptors() {\n      if (typeof Vue === 'function' && Vue.http) {\n        this.registerVueRequestInterceptor();\n      }\n\n      if (typeof axios === 'function') {\n        this.registerAxiosRequestInterceptor();\n      }\n\n      if (typeof jQuery === 'function') {\n        this.registerjQueryAjaxSetup();\n      }\n\n      if ((typeof Turbo === \"undefined\" ? \"undefined\" : _typeof(Turbo)) === 'object') {\n        this.registerTurboRequestInterceptor();\n      }\n    }\n    /**\r\n     * Register a Vue HTTP interceptor to add the X-Socket-ID header.\r\n     */\n\n  }, {\n    key: \"registerVueRequestInterceptor\",\n    value: function registerVueRequestInterceptor() {\n      var _this = this;\n\n      Vue.http.interceptors.push(function (request, next) {\n        if (_this.socketId()) {\n          request.headers.set('X-Socket-ID', _this.socketId());\n        }\n\n        next();\n      });\n    }\n    /**\r\n     * Register an Axios HTTP interceptor to add the X-Socket-ID header.\r\n     */\n\n  }, {\n    key: \"registerAxiosRequestInterceptor\",\n    value: function registerAxiosRequestInterceptor() {\n      var _this2 = this;\n\n      axios.interceptors.request.use(function (config) {\n        if (_this2.socketId()) {\n          config.headers['X-Socket-Id'] = _this2.socketId();\n        }\n\n        return config;\n      });\n    }\n    /**\r\n     * Register jQuery AjaxPrefilter to add the X-Socket-ID header.\r\n     */\n\n  }, {\n    key: \"registerjQueryAjaxSetup\",\n    value: function registerjQueryAjaxSetup() {\n      var _this3 = this;\n\n      if (typeof jQuery.ajax != 'undefined') {\n        jQuery.ajaxPrefilter(function (options, originalOptions, xhr) {\n          if (_this3.socketId()) {\n            xhr.setRequestHeader('X-Socket-Id', _this3.socketId());\n          }\n        });\n      }\n    }\n    /**\r\n     * Register the Turbo Request interceptor to add the X-Socket-ID header.\r\n     */\n\n  }, {\n    key: \"registerTurboRequestInterceptor\",\n    value: function registerTurboRequestInterceptor() {\n      var _this4 = this;\n\n      document.addEventListener('turbo:before-fetch-request', function (event) {\n        event.detail.fetchOptions.headers['X-Socket-Id'] = _this4.socketId();\n      });\n    }\n  }]);\n\n  return Echo;\n}();\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbGFyYXZlbC1lY2hvL2Rpc3QvZWNoby5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnRkFBZ0Y7QUFDaEY7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFbUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbGFyYXZlbC1lY2hvL2Rpc3QvZWNoby5qcz8wN2NmIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgfSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICB9LCBfdHlwZW9mKG9iaik7XG59XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gIF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTtcblxuICB0cnkge1xuICAgIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcbiAgaWYgKHNlbGYgPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBzZWxmO1xufVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gIGlmIChjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHJldHVybiBjYWxsO1xuICB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZFwiKTtcbiAgfVxuXG4gIHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpO1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkge1xuICB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTtcblxuICByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7XG4gICAgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLFxuICAgICAgICByZXN1bHQ7XG5cbiAgICBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkge1xuICAgICAgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjtcblxuICAgICAgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTtcbiAgfTtcbn1cblxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGJhc2ljIGNoYW5uZWwuXHJcbiAqL1xudmFyIENoYW5uZWwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDaGFubmVsKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDaGFubmVsKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhDaGFubmVsLCBbe1xuICAgIGtleTogXCJsaXN0ZW5Gb3JXaGlzcGVyXCIsXG4gICAgdmFsdWU6XG4gICAgLyoqXHJcbiAgICAgKiBMaXN0ZW4gZm9yIGEgd2hpc3BlciBldmVudCBvbiB0aGUgY2hhbm5lbCBpbnN0YW5jZS5cclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RlbkZvcldoaXNwZXIoZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0ZW4oJy5jbGllbnQtJyArIGV2ZW50LCBjYWxsYmFjayk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogTGlzdGVuIGZvciBhbiBldmVudCBvbiB0aGUgY2hhbm5lbCBpbnN0YW5jZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibm90aWZpY2F0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5vdGlmaWNhdGlvbihjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuKCcuSWxsdW1pbmF0ZVxcXFxOb3RpZmljYXRpb25zXFxcXEV2ZW50c1xcXFxCcm9hZGNhc3ROb3RpZmljYXRpb25DcmVhdGVkJywgY2FsbGJhY2spO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFN0b3AgbGlzdGVuaW5nIGZvciBhIHdoaXNwZXIgZXZlbnQgb24gdGhlIGNoYW5uZWwgaW5zdGFuY2UuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInN0b3BMaXN0ZW5pbmdGb3JXaGlzcGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3BMaXN0ZW5pbmdGb3JXaGlzcGVyKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHRoaXMuc3RvcExpc3RlbmluZygnLmNsaWVudC0nICsgZXZlbnQsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ2hhbm5lbDtcbn0oKTtcblxuLyoqXHJcbiAqIEV2ZW50IG5hbWUgZm9ybWF0dGVyXHJcbiAqL1xudmFyIEV2ZW50Rm9ybWF0dGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IGNsYXNzIGluc3RhbmNlLlxyXG4gICAqL1xuICBmdW5jdGlvbiBFdmVudEZvcm1hdHRlcihuYW1lc3BhY2UpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnRGb3JtYXR0ZXIpO1xuXG4gICAgdGhpcy5zZXROYW1lc3BhY2UobmFtZXNwYWNlKTtcbiAgfVxuICAvKipcclxuICAgKiBGb3JtYXQgdGhlIGdpdmVuIGV2ZW50IG5hbWUuXHJcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoRXZlbnRGb3JtYXR0ZXIsIFt7XG4gICAga2V5OiBcImZvcm1hdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JtYXQoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5jaGFyQXQoMCkgPT09ICcuJyB8fCBldmVudC5jaGFyQXQoMCkgPT09ICdcXFxcJykge1xuICAgICAgICByZXR1cm4gZXZlbnQuc3Vic3RyKDEpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm5hbWVzcGFjZSkge1xuICAgICAgICBldmVudCA9IHRoaXMubmFtZXNwYWNlICsgJy4nICsgZXZlbnQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBldmVudC5yZXBsYWNlKC9cXC4vZywgJ1xcXFwnKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGV2ZW50IG5hbWVzcGFjZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0TmFtZXNwYWNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldE5hbWVzcGFjZSh2YWx1ZSkge1xuICAgICAgdGhpcy5uYW1lc3BhY2UgPSB2YWx1ZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRXZlbnRGb3JtYXR0ZXI7XG59KCk7XG5cbi8qKlxyXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBQdXNoZXIgY2hhbm5lbC5cclxuICovXG5cbnZhciBQdXNoZXJDaGFubmVsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ2hhbm5lbCkge1xuICBfaW5oZXJpdHMoUHVzaGVyQ2hhbm5lbCwgX0NoYW5uZWwpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoUHVzaGVyQ2hhbm5lbCk7XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IGNsYXNzIGluc3RhbmNlLlxyXG4gICAqL1xuICBmdW5jdGlvbiBQdXNoZXJDaGFubmVsKHB1c2hlciwgbmFtZSwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQdXNoZXJDaGFubmVsKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgX3RoaXMubmFtZSA9IG5hbWU7XG4gICAgX3RoaXMucHVzaGVyID0gcHVzaGVyO1xuICAgIF90aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIF90aGlzLmV2ZW50Rm9ybWF0dGVyID0gbmV3IEV2ZW50Rm9ybWF0dGVyKF90aGlzLm9wdGlvbnMubmFtZXNwYWNlKTtcblxuICAgIF90aGlzLnN1YnNjcmliZSgpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFN1YnNjcmliZSB0byBhIFB1c2hlciBjaGFubmVsLlxyXG4gICAqL1xuXG5cbiAgX2NyZWF0ZUNsYXNzKFB1c2hlckNoYW5uZWwsIFt7XG4gICAga2V5OiBcInN1YnNjcmliZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdWJzY3JpYmUoKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMucHVzaGVyLnN1YnNjcmliZSh0aGlzLm5hbWUpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFVuc3Vic2NyaWJlIGZyb20gYSBQdXNoZXIgY2hhbm5lbC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidW5zdWJzY3JpYmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICB0aGlzLnB1c2hlci51bnN1YnNjcmliZSh0aGlzLm5hbWUpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIExpc3RlbiBmb3IgYW4gZXZlbnQgb24gdGhlIGNoYW5uZWwgaW5zdGFuY2UuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImxpc3RlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsaXN0ZW4oZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9uKHRoaXMuZXZlbnRGb3JtYXR0ZXIuZm9ybWF0KGV2ZW50KSwgY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogTGlzdGVuIGZvciBhbGwgZXZlbnRzIG9uIHRoZSBjaGFubmVsIGluc3RhbmNlLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJsaXN0ZW5Ub0FsbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsaXN0ZW5Ub0FsbChjYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmJpbmRfZ2xvYmFsKGZ1bmN0aW9uIChldmVudCwgZGF0YSkge1xuICAgICAgICBpZiAoZXZlbnQuc3RhcnRzV2l0aCgncHVzaGVyOicpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5hbWVzcGFjZSA9IF90aGlzMi5vcHRpb25zLm5hbWVzcGFjZS5yZXBsYWNlKC9cXC4vZywgJ1xcXFwnKTtcblxuICAgICAgICB2YXIgZm9ybWF0dGVkRXZlbnQgPSBldmVudC5zdGFydHNXaXRoKG5hbWVzcGFjZSkgPyBldmVudC5zdWJzdHJpbmcobmFtZXNwYWNlLmxlbmd0aCArIDEpIDogJy4nICsgZXZlbnQ7XG4gICAgICAgIGNhbGxiYWNrKGZvcm1hdHRlZEV2ZW50LCBkYXRhKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogU3RvcCBsaXN0ZW5pbmcgZm9yIGFuIGV2ZW50IG9uIHRoZSBjaGFubmVsIGluc3RhbmNlLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzdG9wTGlzdGVuaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3BMaXN0ZW5pbmcoZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5iaW5kKHRoaXMuZXZlbnRGb3JtYXR0ZXIuZm9ybWF0KGV2ZW50KSwgY2FsbGJhY2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5iaW5kKHRoaXMuZXZlbnRGb3JtYXR0ZXIuZm9ybWF0KGV2ZW50KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFN0b3AgbGlzdGVuaW5nIGZvciBhbGwgZXZlbnRzIG9uIHRoZSBjaGFubmVsIGluc3RhbmNlLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzdG9wTGlzdGVuaW5nVG9BbGxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcExpc3RlbmluZ1RvQWxsKGNhbGxiYWNrKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5iaW5kX2dsb2JhbChjYWxsYmFjayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bmJpbmRfZ2xvYmFsKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGFueXRpbWUgYSBzdWJzY3JpcHRpb24gc3VjY2VlZHMuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInN1YnNjcmliZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3Vic2NyaWJlZChjYWxsYmFjaykge1xuICAgICAgdGhpcy5vbigncHVzaGVyOnN1YnNjcmlwdGlvbl9zdWNjZWVkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGFueXRpbWUgYSBzdWJzY3JpcHRpb24gZXJyb3Igb2NjdXJzLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJlcnJvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcnJvcihjYWxsYmFjaykge1xuICAgICAgdGhpcy5vbigncHVzaGVyOnN1YnNjcmlwdGlvbl9lcnJvcicsIGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgY2FsbGJhY2soc3RhdHVzKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQmluZCBhIGNoYW5uZWwgdG8gYW4gZXZlbnQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYmluZChldmVudCwgY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFB1c2hlckNoYW5uZWw7XG59KENoYW5uZWwpO1xuXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgUHVzaGVyIHByaXZhdGUgY2hhbm5lbC5cclxuICovXG5cbnZhciBQdXNoZXJQcml2YXRlQ2hhbm5lbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1B1c2hlckNoYW5uZWwpIHtcbiAgX2luaGVyaXRzKFB1c2hlclByaXZhdGVDaGFubmVsLCBfUHVzaGVyQ2hhbm5lbCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihQdXNoZXJQcml2YXRlQ2hhbm5lbCk7XG5cbiAgZnVuY3Rpb24gUHVzaGVyUHJpdmF0ZUNoYW5uZWwoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFB1c2hlclByaXZhdGVDaGFubmVsKTtcblxuICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQdXNoZXJQcml2YXRlQ2hhbm5lbCwgW3tcbiAgICBrZXk6IFwid2hpc3BlclwiLFxuICAgIHZhbHVlOlxuICAgIC8qKlxyXG4gICAgICogVHJpZ2dlciBjbGllbnQgZXZlbnQgb24gdGhlIGNoYW5uZWwuXHJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3aGlzcGVyKGV2ZW50TmFtZSwgZGF0YSkge1xuICAgICAgdGhpcy5wdXNoZXIuY2hhbm5lbHMuY2hhbm5lbHNbdGhpcy5uYW1lXS50cmlnZ2VyKFwiY2xpZW50LVwiLmNvbmNhdChldmVudE5hbWUpLCBkYXRhKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQdXNoZXJQcml2YXRlQ2hhbm5lbDtcbn0oUHVzaGVyQ2hhbm5lbCk7XG5cbi8qKlxyXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBQdXNoZXIgcHJpdmF0ZSBjaGFubmVsLlxyXG4gKi9cblxudmFyIFB1c2hlckVuY3J5cHRlZFByaXZhdGVDaGFubmVsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUHVzaGVyQ2hhbm5lbCkge1xuICBfaW5oZXJpdHMoUHVzaGVyRW5jcnlwdGVkUHJpdmF0ZUNoYW5uZWwsIF9QdXNoZXJDaGFubmVsKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFB1c2hlckVuY3J5cHRlZFByaXZhdGVDaGFubmVsKTtcblxuICBmdW5jdGlvbiBQdXNoZXJFbmNyeXB0ZWRQcml2YXRlQ2hhbm5lbCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHVzaGVyRW5jcnlwdGVkUHJpdmF0ZUNoYW5uZWwpO1xuXG4gICAgcmV0dXJuIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFB1c2hlckVuY3J5cHRlZFByaXZhdGVDaGFubmVsLCBbe1xuICAgIGtleTogXCJ3aGlzcGVyXCIsXG4gICAgdmFsdWU6XG4gICAgLyoqXHJcbiAgICAgKiBUcmlnZ2VyIGNsaWVudCBldmVudCBvbiB0aGUgY2hhbm5lbC5cclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdoaXNwZXIoZXZlbnROYW1lLCBkYXRhKSB7XG4gICAgICB0aGlzLnB1c2hlci5jaGFubmVscy5jaGFubmVsc1t0aGlzLm5hbWVdLnRyaWdnZXIoXCJjbGllbnQtXCIuY29uY2F0KGV2ZW50TmFtZSksIGRhdGEpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFB1c2hlckVuY3J5cHRlZFByaXZhdGVDaGFubmVsO1xufShQdXNoZXJDaGFubmVsKTtcblxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFB1c2hlciBwcmVzZW5jZSBjaGFubmVsLlxyXG4gKi9cblxudmFyIFB1c2hlclByZXNlbmNlQ2hhbm5lbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1B1c2hlckNoYW5uZWwpIHtcbiAgX2luaGVyaXRzKFB1c2hlclByZXNlbmNlQ2hhbm5lbCwgX1B1c2hlckNoYW5uZWwpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoUHVzaGVyUHJlc2VuY2VDaGFubmVsKTtcblxuICBmdW5jdGlvbiBQdXNoZXJQcmVzZW5jZUNoYW5uZWwoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFB1c2hlclByZXNlbmNlQ2hhbm5lbCk7XG5cbiAgICByZXR1cm4gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUHVzaGVyUHJlc2VuY2VDaGFubmVsLCBbe1xuICAgIGtleTogXCJoZXJlXCIsXG4gICAgdmFsdWU6XG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBhbnl0aW1lIHRoZSBtZW1iZXIgbGlzdCBjaGFuZ2VzLlxyXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGVyZShjYWxsYmFjaykge1xuICAgICAgdGhpcy5vbigncHVzaGVyOnN1YnNjcmlwdGlvbl9zdWNjZWVkZWQnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBjYWxsYmFjayhPYmplY3Qua2V5cyhkYXRhLm1lbWJlcnMpLm1hcChmdW5jdGlvbiAoaykge1xuICAgICAgICAgIHJldHVybiBkYXRhLm1lbWJlcnNba107XG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogTGlzdGVuIGZvciBzb21lb25lIGpvaW5pbmcgdGhlIGNoYW5uZWwuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImpvaW5pbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gam9pbmluZyhjYWxsYmFjaykge1xuICAgICAgdGhpcy5vbigncHVzaGVyOm1lbWJlcl9hZGRlZCcsIGZ1bmN0aW9uIChtZW1iZXIpIHtcbiAgICAgICAgY2FsbGJhY2sobWVtYmVyLmluZm8pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBMaXN0ZW4gZm9yIHNvbWVvbmUgbGVhdmluZyB0aGUgY2hhbm5lbC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibGVhdmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsZWF2aW5nKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9uKCdwdXNoZXI6bWVtYmVyX3JlbW92ZWQnLCBmdW5jdGlvbiAobWVtYmVyKSB7XG4gICAgICAgIGNhbGxiYWNrKG1lbWJlci5pbmZvKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVHJpZ2dlciBjbGllbnQgZXZlbnQgb24gdGhlIGNoYW5uZWwuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIndoaXNwZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd2hpc3BlcihldmVudE5hbWUsIGRhdGEpIHtcbiAgICAgIHRoaXMucHVzaGVyLmNoYW5uZWxzLmNoYW5uZWxzW3RoaXMubmFtZV0udHJpZ2dlcihcImNsaWVudC1cIi5jb25jYXQoZXZlbnROYW1lKSwgZGF0YSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUHVzaGVyUHJlc2VuY2VDaGFubmVsO1xufShQdXNoZXJDaGFubmVsKTtcblxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFNvY2tldC5pbyBjaGFubmVsLlxyXG4gKi9cblxudmFyIFNvY2tldElvQ2hhbm5lbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NoYW5uZWwpIHtcbiAgX2luaGVyaXRzKFNvY2tldElvQ2hhbm5lbCwgX0NoYW5uZWwpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoU29ja2V0SW9DaGFubmVsKTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYSBuZXcgY2xhc3MgaW5zdGFuY2UuXHJcbiAgICovXG4gIGZ1bmN0aW9uIFNvY2tldElvQ2hhbm5lbChzb2NrZXQsIG5hbWUsIG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU29ja2V0SW9DaGFubmVsKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZXZlbnQgY2FsbGJhY2tzIGFwcGxpZWQgdG8gdGhlIHNvY2tldC5cclxuICAgICAqL1xuXG4gICAgX3RoaXMuZXZlbnRzID0ge307XG4gICAgLyoqXHJcbiAgICAgKiBVc2VyIHN1cHBsaWVkIGNhbGxiYWNrcyBmb3IgZXZlbnRzIG9uIHRoaXMgY2hhbm5lbC5cclxuICAgICAqL1xuXG4gICAgX3RoaXMubGlzdGVuZXJzID0ge307XG4gICAgX3RoaXMubmFtZSA9IG5hbWU7XG4gICAgX3RoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgIF90aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIF90aGlzLmV2ZW50Rm9ybWF0dGVyID0gbmV3IEV2ZW50Rm9ybWF0dGVyKF90aGlzLm9wdGlvbnMubmFtZXNwYWNlKTtcblxuICAgIF90aGlzLnN1YnNjcmliZSgpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFN1YnNjcmliZSB0byBhIFNvY2tldC5pbyBjaGFubmVsLlxyXG4gICAqL1xuXG5cbiAgX2NyZWF0ZUNsYXNzKFNvY2tldElvQ2hhbm5lbCwgW3tcbiAgICBrZXk6IFwic3Vic2NyaWJlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN1YnNjcmliZSgpIHtcbiAgICAgIHRoaXMuc29ja2V0LmVtaXQoJ3N1YnNjcmliZScsIHtcbiAgICAgICAgY2hhbm5lbDogdGhpcy5uYW1lLFxuICAgICAgICBhdXRoOiB0aGlzLm9wdGlvbnMuYXV0aCB8fCB7fVxuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVW5zdWJzY3JpYmUgZnJvbSBjaGFubmVsIGFuZCB1YmluZCBldmVudCBjYWxsYmFja3MuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInVuc3Vic2NyaWJlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgdGhpcy51bmJpbmQoKTtcbiAgICAgIHRoaXMuc29ja2V0LmVtaXQoJ3Vuc3Vic2NyaWJlJywge1xuICAgICAgICBjaGFubmVsOiB0aGlzLm5hbWUsXG4gICAgICAgIGF1dGg6IHRoaXMub3B0aW9ucy5hdXRoIHx8IHt9XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBMaXN0ZW4gZm9yIGFuIGV2ZW50IG9uIHRoZSBjaGFubmVsIGluc3RhbmNlLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJsaXN0ZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGlzdGVuKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgdGhpcy5vbih0aGlzLmV2ZW50Rm9ybWF0dGVyLmZvcm1hdChldmVudCksIGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFN0b3AgbGlzdGVuaW5nIGZvciBhbiBldmVudCBvbiB0aGUgY2hhbm5lbCBpbnN0YW5jZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic3RvcExpc3RlbmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wTGlzdGVuaW5nKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgdGhpcy51bmJpbmRFdmVudCh0aGlzLmV2ZW50Rm9ybWF0dGVyLmZvcm1hdChldmVudCksIGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGFueXRpbWUgYSBzdWJzY3JpcHRpb24gc3VjY2VlZHMuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInN1YnNjcmliZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3Vic2NyaWJlZChjYWxsYmFjaykge1xuICAgICAgdGhpcy5vbignY29ubmVjdCcsIGZ1bmN0aW9uIChzb2NrZXQpIHtcbiAgICAgICAgY2FsbGJhY2soc29ja2V0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgYW55dGltZSBhbiBlcnJvciBvY2N1cnMuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImVycm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVycm9yKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBCaW5kIHRoZSBjaGFubmVsJ3Mgc29ja2V0IHRvIGFuIGV2ZW50IGFuZCBzdG9yZSB0aGUgY2FsbGJhY2suXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50XSA9IHRoaXMubGlzdGVuZXJzW2V2ZW50XSB8fCBbXTtcblxuICAgICAgaWYgKCF0aGlzLmV2ZW50c1tldmVudF0pIHtcbiAgICAgICAgdGhpcy5ldmVudHNbZXZlbnRdID0gZnVuY3Rpb24gKGNoYW5uZWwsIGRhdGEpIHtcbiAgICAgICAgICBpZiAoX3RoaXMyLm5hbWUgPT09IGNoYW5uZWwgJiYgX3RoaXMyLmxpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgICAgIF90aGlzMi5saXN0ZW5lcnNbZXZlbnRdLmZvckVhY2goZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjYihkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNvY2tldC5vbihldmVudCwgdGhpcy5ldmVudHNbZXZlbnRdKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnRdLnB1c2goY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVW5iaW5kIHRoZSBjaGFubmVsJ3Mgc29ja2V0IGZyb20gYWxsIHN0b3JlZCBldmVudCBjYWxsYmFja3MuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInVuYmluZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bmJpbmQoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgT2JqZWN0LmtleXModGhpcy5ldmVudHMpLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIF90aGlzMy51bmJpbmRFdmVudChldmVudCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBVbmJpbmQgdGhlIGxpc3RlbmVycyBmb3IgdGhlIGdpdmVuIGV2ZW50LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1bmJpbmRFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bmJpbmRFdmVudChldmVudCwgY2FsbGJhY2spIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50XSA9IHRoaXMubGlzdGVuZXJzW2V2ZW50XSB8fCBbXTtcblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50XSA9IHRoaXMubGlzdGVuZXJzW2V2ZW50XS5maWx0ZXIoZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgcmV0dXJuIGNiICE9PSBjYWxsYmFjaztcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghY2FsbGJhY2sgfHwgdGhpcy5saXN0ZW5lcnNbZXZlbnRdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAodGhpcy5ldmVudHNbZXZlbnRdKSB7XG4gICAgICAgICAgdGhpcy5zb2NrZXQucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIHRoaXMuZXZlbnRzW2V2ZW50XSk7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuZXZlbnRzW2V2ZW50XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyc1tldmVudF07XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNvY2tldElvQ2hhbm5lbDtcbn0oQ2hhbm5lbCk7XG5cbi8qKlxyXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBTb2NrZXQuaW8gcHJpdmF0ZSBjaGFubmVsLlxyXG4gKi9cblxudmFyIFNvY2tldElvUHJpdmF0ZUNoYW5uZWwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Tb2NrZXRJb0NoYW5uZWwpIHtcbiAgX2luaGVyaXRzKFNvY2tldElvUHJpdmF0ZUNoYW5uZWwsIF9Tb2NrZXRJb0NoYW5uZWwpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoU29ja2V0SW9Qcml2YXRlQ2hhbm5lbCk7XG5cbiAgZnVuY3Rpb24gU29ja2V0SW9Qcml2YXRlQ2hhbm5lbCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU29ja2V0SW9Qcml2YXRlQ2hhbm5lbCk7XG5cbiAgICByZXR1cm4gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU29ja2V0SW9Qcml2YXRlQ2hhbm5lbCwgW3tcbiAgICBrZXk6IFwid2hpc3BlclwiLFxuICAgIHZhbHVlOlxuICAgIC8qKlxyXG4gICAgICogVHJpZ2dlciBjbGllbnQgZXZlbnQgb24gdGhlIGNoYW5uZWwuXHJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3aGlzcGVyKGV2ZW50TmFtZSwgZGF0YSkge1xuICAgICAgdGhpcy5zb2NrZXQuZW1pdCgnY2xpZW50IGV2ZW50Jywge1xuICAgICAgICBjaGFubmVsOiB0aGlzLm5hbWUsXG4gICAgICAgIGV2ZW50OiBcImNsaWVudC1cIi5jb25jYXQoZXZlbnROYW1lKSxcbiAgICAgICAgZGF0YTogZGF0YVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU29ja2V0SW9Qcml2YXRlQ2hhbm5lbDtcbn0oU29ja2V0SW9DaGFubmVsKTtcblxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFNvY2tldC5pbyBwcmVzZW5jZSBjaGFubmVsLlxyXG4gKi9cblxudmFyIFNvY2tldElvUHJlc2VuY2VDaGFubmVsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfU29ja2V0SW9Qcml2YXRlQ2hhbm4pIHtcbiAgX2luaGVyaXRzKFNvY2tldElvUHJlc2VuY2VDaGFubmVsLCBfU29ja2V0SW9Qcml2YXRlQ2hhbm4pO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoU29ja2V0SW9QcmVzZW5jZUNoYW5uZWwpO1xuXG4gIGZ1bmN0aW9uIFNvY2tldElvUHJlc2VuY2VDaGFubmVsKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTb2NrZXRJb1ByZXNlbmNlQ2hhbm5lbCk7XG5cbiAgICByZXR1cm4gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU29ja2V0SW9QcmVzZW5jZUNoYW5uZWwsIFt7XG4gICAga2V5OiBcImhlcmVcIixcbiAgICB2YWx1ZTpcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGFueXRpbWUgdGhlIG1lbWJlciBsaXN0IGNoYW5nZXMuXHJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoZXJlKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9uKCdwcmVzZW5jZTpzdWJzY3JpYmVkJywgZnVuY3Rpb24gKG1lbWJlcnMpIHtcbiAgICAgICAgY2FsbGJhY2sobWVtYmVycy5tYXAoZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICByZXR1cm4gbS51c2VyX2luZm87XG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogTGlzdGVuIGZvciBzb21lb25lIGpvaW5pbmcgdGhlIGNoYW5uZWwuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImpvaW5pbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gam9pbmluZyhjYWxsYmFjaykge1xuICAgICAgdGhpcy5vbigncHJlc2VuY2U6am9pbmluZycsIGZ1bmN0aW9uIChtZW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG1lbWJlci51c2VyX2luZm8pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBMaXN0ZW4gZm9yIHNvbWVvbmUgbGVhdmluZyB0aGUgY2hhbm5lbC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibGVhdmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsZWF2aW5nKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9uKCdwcmVzZW5jZTpsZWF2aW5nJywgZnVuY3Rpb24gKG1lbWJlcikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobWVtYmVyLnVzZXJfaW5mbyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTb2NrZXRJb1ByZXNlbmNlQ2hhbm5lbDtcbn0oU29ja2V0SW9Qcml2YXRlQ2hhbm5lbCk7XG5cbi8qKlxyXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBudWxsIGNoYW5uZWwuXHJcbiAqL1xuXG52YXIgTnVsbENoYW5uZWwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9DaGFubmVsKSB7XG4gIF9pbmhlcml0cyhOdWxsQ2hhbm5lbCwgX0NoYW5uZWwpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTnVsbENoYW5uZWwpO1xuXG4gIGZ1bmN0aW9uIE51bGxDaGFubmVsKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOdWxsQ2hhbm5lbCk7XG5cbiAgICByZXR1cm4gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTnVsbENoYW5uZWwsIFt7XG4gICAga2V5OiBcInN1YnNjcmliZVwiLFxuICAgIHZhbHVlOlxuICAgIC8qKlxyXG4gICAgICogU3Vic2NyaWJlIHRvIGEgY2hhbm5lbC5cclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1YnNjcmliZSgpIHsvL1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFVuc3Vic2NyaWJlIGZyb20gYSBjaGFubmVsLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1bnN1YnNjcmliZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHsvL1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIExpc3RlbiBmb3IgYW4gZXZlbnQgb24gdGhlIGNoYW5uZWwgaW5zdGFuY2UuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImxpc3RlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsaXN0ZW4oZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBMaXN0ZW4gZm9yIGFsbCBldmVudHMgb24gdGhlIGNoYW5uZWwgaW5zdGFuY2UuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImxpc3RlblRvQWxsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxpc3RlblRvQWxsKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTdG9wIGxpc3RlbmluZyBmb3IgYW4gZXZlbnQgb24gdGhlIGNoYW5uZWwgaW5zdGFuY2UuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInN0b3BMaXN0ZW5pbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcExpc3RlbmluZyhldmVudCwgY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGFueXRpbWUgYSBzdWJzY3JpcHRpb24gc3VjY2VlZHMuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInN1YnNjcmliZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3Vic2NyaWJlZChjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgYW55dGltZSBhbiBlcnJvciBvY2N1cnMuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImVycm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVycm9yKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBCaW5kIGEgY2hhbm5lbCB0byBhbiBldmVudC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb24oZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTnVsbENoYW5uZWw7XG59KENoYW5uZWwpO1xuXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbnVsbCBwcml2YXRlIGNoYW5uZWwuXHJcbiAqL1xuXG52YXIgTnVsbFByaXZhdGVDaGFubmVsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfTnVsbENoYW5uZWwpIHtcbiAgX2luaGVyaXRzKE51bGxQcml2YXRlQ2hhbm5lbCwgX051bGxDaGFubmVsKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKE51bGxQcml2YXRlQ2hhbm5lbCk7XG5cbiAgZnVuY3Rpb24gTnVsbFByaXZhdGVDaGFubmVsKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOdWxsUHJpdmF0ZUNoYW5uZWwpO1xuXG4gICAgcmV0dXJuIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE51bGxQcml2YXRlQ2hhbm5lbCwgW3tcbiAgICBrZXk6IFwid2hpc3BlclwiLFxuICAgIHZhbHVlOlxuICAgIC8qKlxyXG4gICAgICogVHJpZ2dlciBjbGllbnQgZXZlbnQgb24gdGhlIGNoYW5uZWwuXHJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3aGlzcGVyKGV2ZW50TmFtZSwgZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE51bGxQcml2YXRlQ2hhbm5lbDtcbn0oTnVsbENoYW5uZWwpO1xuXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbnVsbCBwcmVzZW5jZSBjaGFubmVsLlxyXG4gKi9cblxudmFyIE51bGxQcmVzZW5jZUNoYW5uZWwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9OdWxsQ2hhbm5lbCkge1xuICBfaW5oZXJpdHMoTnVsbFByZXNlbmNlQ2hhbm5lbCwgX051bGxDaGFubmVsKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKE51bGxQcmVzZW5jZUNoYW5uZWwpO1xuXG4gIGZ1bmN0aW9uIE51bGxQcmVzZW5jZUNoYW5uZWwoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE51bGxQcmVzZW5jZUNoYW5uZWwpO1xuXG4gICAgcmV0dXJuIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE51bGxQcmVzZW5jZUNoYW5uZWwsIFt7XG4gICAga2V5OiBcImhlcmVcIixcbiAgICB2YWx1ZTpcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGFueXRpbWUgdGhlIG1lbWJlciBsaXN0IGNoYW5nZXMuXHJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoZXJlKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBMaXN0ZW4gZm9yIHNvbWVvbmUgam9pbmluZyB0aGUgY2hhbm5lbC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiam9pbmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBqb2luaW5nKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBMaXN0ZW4gZm9yIHNvbWVvbmUgbGVhdmluZyB0aGUgY2hhbm5lbC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibGVhdmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsZWF2aW5nKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUcmlnZ2VyIGNsaWVudCBldmVudCBvbiB0aGUgY2hhbm5lbC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwid2hpc3BlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB3aGlzcGVyKGV2ZW50TmFtZSwgZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE51bGxQcmVzZW5jZUNoYW5uZWw7XG59KE51bGxDaGFubmVsKTtcblxudmFyIENvbm5lY3RvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIG5ldyBjbGFzcyBpbnN0YW5jZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gQ29ubmVjdG9yKG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29ubmVjdG9yKTtcblxuICAgIC8qKlxyXG4gICAgICogRGVmYXVsdCBjb25uZWN0b3Igb3B0aW9ucy5cclxuICAgICAqL1xuICAgIHRoaXMuX2RlZmF1bHRPcHRpb25zID0ge1xuICAgICAgYXV0aDoge1xuICAgICAgICBoZWFkZXJzOiB7fVxuICAgICAgfSxcbiAgICAgIGF1dGhFbmRwb2ludDogJy9icm9hZGNhc3RpbmcvYXV0aCcsXG4gICAgICB1c2VyQXV0aGVudGljYXRpb246IHtcbiAgICAgICAgZW5kcG9pbnQ6ICcvYnJvYWRjYXN0aW5nL3VzZXItYXV0aCcsXG4gICAgICAgIGhlYWRlcnM6IHt9XG4gICAgICB9LFxuICAgICAgYnJvYWRjYXN0ZXI6ICdwdXNoZXInLFxuICAgICAgY3NyZlRva2VuOiBudWxsLFxuICAgICAgYmVhcmVyVG9rZW46IG51bGwsXG4gICAgICBob3N0OiBudWxsLFxuICAgICAga2V5OiBudWxsLFxuICAgICAgbmFtZXNwYWNlOiAnQXBwLkV2ZW50cydcbiAgICB9O1xuICAgIHRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgICB0aGlzLmNvbm5lY3QoKTtcbiAgfVxuICAvKipcclxuICAgKiBNZXJnZSB0aGUgY3VzdG9tIG9wdGlvbnMgd2l0aCB0aGUgZGVmYXVsdHMuXHJcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoQ29ubmVjdG9yLCBbe1xuICAgIGtleTogXCJzZXRPcHRpb25zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zID0gX2V4dGVuZHModGhpcy5fZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgdmFyIHRva2VuID0gdGhpcy5jc3JmVG9rZW4oKTtcblxuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5hdXRoLmhlYWRlcnNbJ1gtQ1NSRi1UT0tFTiddID0gdG9rZW47XG4gICAgICAgIHRoaXMub3B0aW9ucy51c2VyQXV0aGVudGljYXRpb24uaGVhZGVyc1snWC1DU1JGLVRPS0VOJ10gPSB0b2tlbjtcbiAgICAgIH1cblxuICAgICAgdG9rZW4gPSB0aGlzLm9wdGlvbnMuYmVhcmVyVG9rZW47XG5cbiAgICAgIGlmICh0b2tlbikge1xuICAgICAgICB0aGlzLm9wdGlvbnMuYXV0aC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSAnQmVhcmVyICcgKyB0b2tlbjtcbiAgICAgICAgdGhpcy5vcHRpb25zLnVzZXJBdXRoZW50aWNhdGlvbi5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSAnQmVhcmVyICcgKyB0b2tlbjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRXh0cmFjdCB0aGUgQ1NSRiB0b2tlbiBmcm9tIHRoZSBwYWdlLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjc3JmVG9rZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3NyZlRva2VuKCkge1xuICAgICAgdmFyIHNlbGVjdG9yO1xuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93WydMYXJhdmVsJ10gJiYgd2luZG93WydMYXJhdmVsJ10uY3NyZlRva2VuKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3dbJ0xhcmF2ZWwnXS5jc3JmVG9rZW47XG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5jc3JmVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jc3JmVG9rZW47XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgPT09ICdmdW5jdGlvbicgJiYgKHNlbGVjdG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpKSkge1xuICAgICAgICByZXR1cm4gc2VsZWN0b3IuZ2V0QXR0cmlidXRlKCdjb250ZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDb25uZWN0b3I7XG59KCk7XG5cbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGNyZWF0ZXMgYSBjb25uZWN0b3IgdG8gUHVzaGVyLlxyXG4gKi9cblxudmFyIFB1c2hlckNvbm5lY3RvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Nvbm5lY3Rvcikge1xuICBfaW5oZXJpdHMoUHVzaGVyQ29ubmVjdG9yLCBfQ29ubmVjdG9yKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFB1c2hlckNvbm5lY3Rvcik7XG5cbiAgZnVuY3Rpb24gUHVzaGVyQ29ubmVjdG9yKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQdXNoZXJDb25uZWN0b3IpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAvKipcclxuICAgICAqIEFsbCBvZiB0aGUgc3Vic2NyaWJlZCBjaGFubmVsIG5hbWVzLlxyXG4gICAgICovXG5cbiAgICBfdGhpcy5jaGFubmVscyA9IHt9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBDcmVhdGUgYSBmcmVzaCBQdXNoZXIgY29ubmVjdGlvbi5cclxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhQdXNoZXJDb25uZWN0b3IsIFt7XG4gICAga2V5OiBcImNvbm5lY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29ubmVjdCgpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmNsaWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy5wdXNoZXIgPSB0aGlzLm9wdGlvbnMuY2xpZW50O1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuUHVzaGVyKSB7XG4gICAgICAgIHRoaXMucHVzaGVyID0gbmV3IHRoaXMub3B0aW9ucy5QdXNoZXIodGhpcy5vcHRpb25zLmtleSwgdGhpcy5vcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHVzaGVyID0gbmV3IFB1c2hlcih0aGlzLm9wdGlvbnMua2V5LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIFNpZ24gaW4gdGhlIHVzZXIgdmlhIFB1c2hlciB1c2VyIGF1dGhlbnRpY2F0aW9uIChodHRwczovL3B1c2hlci5jb20vZG9jcy9jaGFubmVscy91c2luZ19jaGFubmVscy91c2VyLWF1dGhlbnRpY2F0aW9uLykuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNpZ25pblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaWduaW4oKSB7XG4gICAgICB0aGlzLnB1c2hlci5zaWduaW4oKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBMaXN0ZW4gZm9yIGFuIGV2ZW50IG9uIGEgY2hhbm5lbCBpbnN0YW5jZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibGlzdGVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxpc3RlbihuYW1lLCBldmVudCwgY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLmNoYW5uZWwobmFtZSkubGlzdGVuKGV2ZW50LCBjYWxsYmFjayk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgY2hhbm5lbCBpbnN0YW5jZSBieSBuYW1lLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjaGFubmVsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNoYW5uZWwobmFtZSkge1xuICAgICAgaWYgKCF0aGlzLmNoYW5uZWxzW25hbWVdKSB7XG4gICAgICAgIHRoaXMuY2hhbm5lbHNbbmFtZV0gPSBuZXcgUHVzaGVyQ2hhbm5lbCh0aGlzLnB1c2hlciwgbmFtZSwgdGhpcy5vcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY2hhbm5lbHNbbmFtZV07XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgcHJpdmF0ZSBjaGFubmVsIGluc3RhbmNlIGJ5IG5hbWUuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInByaXZhdGVDaGFubmVsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByaXZhdGVDaGFubmVsKG5hbWUpIHtcbiAgICAgIGlmICghdGhpcy5jaGFubmVsc1sncHJpdmF0ZS0nICsgbmFtZV0pIHtcbiAgICAgICAgdGhpcy5jaGFubmVsc1sncHJpdmF0ZS0nICsgbmFtZV0gPSBuZXcgUHVzaGVyUHJpdmF0ZUNoYW5uZWwodGhpcy5wdXNoZXIsICdwcml2YXRlLScgKyBuYW1lLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jaGFubmVsc1sncHJpdmF0ZS0nICsgbmFtZV07XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgcHJpdmF0ZSBlbmNyeXB0ZWQgY2hhbm5lbCBpbnN0YW5jZSBieSBuYW1lLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJlbmNyeXB0ZWRQcml2YXRlQ2hhbm5lbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmNyeXB0ZWRQcml2YXRlQ2hhbm5lbChuYW1lKSB7XG4gICAgICBpZiAoIXRoaXMuY2hhbm5lbHNbJ3ByaXZhdGUtZW5jcnlwdGVkLScgKyBuYW1lXSkge1xuICAgICAgICB0aGlzLmNoYW5uZWxzWydwcml2YXRlLWVuY3J5cHRlZC0nICsgbmFtZV0gPSBuZXcgUHVzaGVyRW5jcnlwdGVkUHJpdmF0ZUNoYW5uZWwodGhpcy5wdXNoZXIsICdwcml2YXRlLWVuY3J5cHRlZC0nICsgbmFtZSwgdGhpcy5vcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY2hhbm5lbHNbJ3ByaXZhdGUtZW5jcnlwdGVkLScgKyBuYW1lXTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSBwcmVzZW5jZSBjaGFubmVsIGluc3RhbmNlIGJ5IG5hbWUuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInByZXNlbmNlQ2hhbm5lbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcmVzZW5jZUNoYW5uZWwobmFtZSkge1xuICAgICAgaWYgKCF0aGlzLmNoYW5uZWxzWydwcmVzZW5jZS0nICsgbmFtZV0pIHtcbiAgICAgICAgdGhpcy5jaGFubmVsc1sncHJlc2VuY2UtJyArIG5hbWVdID0gbmV3IFB1c2hlclByZXNlbmNlQ2hhbm5lbCh0aGlzLnB1c2hlciwgJ3ByZXNlbmNlLScgKyBuYW1lLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jaGFubmVsc1sncHJlc2VuY2UtJyArIG5hbWVdO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIExlYXZlIHRoZSBnaXZlbiBjaGFubmVsLCBhcyB3ZWxsIGFzIGl0cyBwcml2YXRlIGFuZCBwcmVzZW5jZSB2YXJpYW50cy5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibGVhdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGVhdmUobmFtZSkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBjaGFubmVscyA9IFtuYW1lLCAncHJpdmF0ZS0nICsgbmFtZSwgJ3ByaXZhdGUtZW5jcnlwdGVkLScgKyBuYW1lLCAncHJlc2VuY2UtJyArIG5hbWVdO1xuICAgICAgY2hhbm5lbHMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSwgaW5kZXgpIHtcbiAgICAgICAgX3RoaXMyLmxlYXZlQ2hhbm5lbChuYW1lKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIExlYXZlIHRoZSBnaXZlbiBjaGFubmVsLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJsZWF2ZUNoYW5uZWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGVhdmVDaGFubmVsKG5hbWUpIHtcbiAgICAgIGlmICh0aGlzLmNoYW5uZWxzW25hbWVdKSB7XG4gICAgICAgIHRoaXMuY2hhbm5lbHNbbmFtZV0udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuY2hhbm5lbHNbbmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBzb2NrZXQgSUQgZm9yIHRoZSBjb25uZWN0aW9uLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzb2NrZXRJZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzb2NrZXRJZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnB1c2hlci5jb25uZWN0aW9uLnNvY2tldF9pZDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBEaXNjb25uZWN0IFB1c2hlciBjb25uZWN0aW9uLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkaXNjb25uZWN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKSB7XG4gICAgICB0aGlzLnB1c2hlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFB1c2hlckNvbm5lY3Rvcjtcbn0oQ29ubmVjdG9yKTtcblxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgY3JlYXRlcyBhIGNvbm5uZWN0b3IgdG8gYSBTb2NrZXQuaW8gc2VydmVyLlxyXG4gKi9cblxudmFyIFNvY2tldElvQ29ubmVjdG9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29ubmVjdG9yKSB7XG4gIF9pbmhlcml0cyhTb2NrZXRJb0Nvbm5lY3RvciwgX0Nvbm5lY3Rvcik7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihTb2NrZXRJb0Nvbm5lY3Rvcik7XG5cbiAgZnVuY3Rpb24gU29ja2V0SW9Db25uZWN0b3IoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNvY2tldElvQ29ubmVjdG9yKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgLyoqXHJcbiAgICAgKiBBbGwgb2YgdGhlIHN1YnNjcmliZWQgY2hhbm5lbCBuYW1lcy5cclxuICAgICAqL1xuXG4gICAgX3RoaXMuY2hhbm5lbHMgPSB7fTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgZnJlc2ggU29ja2V0LmlvIGNvbm5lY3Rpb24uXHJcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoU29ja2V0SW9Db25uZWN0b3IsIFt7XG4gICAga2V5OiBcImNvbm5lY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29ubmVjdCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgaW8gPSB0aGlzLmdldFNvY2tldElPKCk7XG4gICAgICB0aGlzLnNvY2tldCA9IGlvKHRoaXMub3B0aW9ucy5ob3N0LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgdGhpcy5zb2NrZXQub24oJ3JlY29ubmVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhfdGhpczIuY2hhbm5lbHMpLmZvckVhY2goZnVuY3Rpb24gKGNoYW5uZWwpIHtcbiAgICAgICAgICBjaGFubmVsLnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMuc29ja2V0O1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCBzb2NrZXQuaW8gbW9kdWxlIGZyb20gZ2xvYmFsIHNjb3BlIG9yIG9wdGlvbnMuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFNvY2tldElPXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNvY2tldElPKCkge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuY2xpZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNsaWVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIGlvO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvY2tldC5pbyBjbGllbnQgbm90IGZvdW5kLiBTaG91bGQgYmUgZ2xvYmFsbHkgYXZhaWxhYmxlIG9yIHBhc3NlZCB2aWEgb3B0aW9ucy5jbGllbnQnKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBMaXN0ZW4gZm9yIGFuIGV2ZW50IG9uIGEgY2hhbm5lbCBpbnN0YW5jZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibGlzdGVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxpc3RlbihuYW1lLCBldmVudCwgY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLmNoYW5uZWwobmFtZSkubGlzdGVuKGV2ZW50LCBjYWxsYmFjayk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgY2hhbm5lbCBpbnN0YW5jZSBieSBuYW1lLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjaGFubmVsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNoYW5uZWwobmFtZSkge1xuICAgICAgaWYgKCF0aGlzLmNoYW5uZWxzW25hbWVdKSB7XG4gICAgICAgIHRoaXMuY2hhbm5lbHNbbmFtZV0gPSBuZXcgU29ja2V0SW9DaGFubmVsKHRoaXMuc29ja2V0LCBuYW1lLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jaGFubmVsc1tuYW1lXTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSBwcml2YXRlIGNoYW5uZWwgaW5zdGFuY2UgYnkgbmFtZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicHJpdmF0ZUNoYW5uZWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJpdmF0ZUNoYW5uZWwobmFtZSkge1xuICAgICAgaWYgKCF0aGlzLmNoYW5uZWxzWydwcml2YXRlLScgKyBuYW1lXSkge1xuICAgICAgICB0aGlzLmNoYW5uZWxzWydwcml2YXRlLScgKyBuYW1lXSA9IG5ldyBTb2NrZXRJb1ByaXZhdGVDaGFubmVsKHRoaXMuc29ja2V0LCAncHJpdmF0ZS0nICsgbmFtZSwgdGhpcy5vcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY2hhbm5lbHNbJ3ByaXZhdGUtJyArIG5hbWVdO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCBhIHByZXNlbmNlIGNoYW5uZWwgaW5zdGFuY2UgYnkgbmFtZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicHJlc2VuY2VDaGFubmVsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByZXNlbmNlQ2hhbm5lbChuYW1lKSB7XG4gICAgICBpZiAoIXRoaXMuY2hhbm5lbHNbJ3ByZXNlbmNlLScgKyBuYW1lXSkge1xuICAgICAgICB0aGlzLmNoYW5uZWxzWydwcmVzZW5jZS0nICsgbmFtZV0gPSBuZXcgU29ja2V0SW9QcmVzZW5jZUNoYW5uZWwodGhpcy5zb2NrZXQsICdwcmVzZW5jZS0nICsgbmFtZSwgdGhpcy5vcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY2hhbm5lbHNbJ3ByZXNlbmNlLScgKyBuYW1lXTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBMZWF2ZSB0aGUgZ2l2ZW4gY2hhbm5lbCwgYXMgd2VsbCBhcyBpdHMgcHJpdmF0ZSBhbmQgcHJlc2VuY2UgdmFyaWFudHMuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImxlYXZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxlYXZlKG5hbWUpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgY2hhbm5lbHMgPSBbbmFtZSwgJ3ByaXZhdGUtJyArIG5hbWUsICdwcmVzZW5jZS0nICsgbmFtZV07XG4gICAgICBjaGFubmVscy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIF90aGlzMy5sZWF2ZUNoYW5uZWwobmFtZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBMZWF2ZSB0aGUgZ2l2ZW4gY2hhbm5lbC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibGVhdmVDaGFubmVsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxlYXZlQ2hhbm5lbChuYW1lKSB7XG4gICAgICBpZiAodGhpcy5jaGFubmVsc1tuYW1lXSkge1xuICAgICAgICB0aGlzLmNoYW5uZWxzW25hbWVdLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNoYW5uZWxzW25hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgc29ja2V0IElEIGZvciB0aGUgY29ubmVjdGlvbi5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic29ja2V0SWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc29ja2V0SWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb2NrZXQuaWQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRGlzY29ubmVjdCBTb2NrZXRpbyBjb25uZWN0aW9uLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkaXNjb25uZWN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKSB7XG4gICAgICB0aGlzLnNvY2tldC5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNvY2tldElvQ29ubmVjdG9yO1xufShDb25uZWN0b3IpO1xuXG4vKipcclxuICogVGhpcyBjbGFzcyBjcmVhdGVzIGEgbnVsbCBjb25uZWN0b3IuXHJcbiAqL1xuXG52YXIgTnVsbENvbm5lY3RvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Nvbm5lY3Rvcikge1xuICBfaW5oZXJpdHMoTnVsbENvbm5lY3RvciwgX0Nvbm5lY3Rvcik7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihOdWxsQ29ubmVjdG9yKTtcblxuICBmdW5jdGlvbiBOdWxsQ29ubmVjdG9yKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOdWxsQ29ubmVjdG9yKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgLyoqXHJcbiAgICAgKiBBbGwgb2YgdGhlIHN1YnNjcmliZWQgY2hhbm5lbCBuYW1lcy5cclxuICAgICAqL1xuXG4gICAgX3RoaXMuY2hhbm5lbHMgPSB7fTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgZnJlc2ggY29ubmVjdGlvbi5cclxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhOdWxsQ29ubmVjdG9yLCBbe1xuICAgIGtleTogXCJjb25uZWN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbm5lY3QoKSB7Ly9cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBMaXN0ZW4gZm9yIGFuIGV2ZW50IG9uIGEgY2hhbm5lbCBpbnN0YW5jZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibGlzdGVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxpc3RlbihuYW1lLCBldmVudCwgY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBuZXcgTnVsbENoYW5uZWwoKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSBjaGFubmVsIGluc3RhbmNlIGJ5IG5hbWUuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNoYW5uZWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2hhbm5lbChuYW1lKSB7XG4gICAgICByZXR1cm4gbmV3IE51bGxDaGFubmVsKCk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgcHJpdmF0ZSBjaGFubmVsIGluc3RhbmNlIGJ5IG5hbWUuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInByaXZhdGVDaGFubmVsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByaXZhdGVDaGFubmVsKG5hbWUpIHtcbiAgICAgIHJldHVybiBuZXcgTnVsbFByaXZhdGVDaGFubmVsKCk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgcHJpdmF0ZSBlbmNyeXB0ZWQgY2hhbm5lbCBpbnN0YW5jZSBieSBuYW1lLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJlbmNyeXB0ZWRQcml2YXRlQ2hhbm5lbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmNyeXB0ZWRQcml2YXRlQ2hhbm5lbChuYW1lKSB7XG4gICAgICByZXR1cm4gbmV3IE51bGxQcml2YXRlQ2hhbm5lbCgpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCBhIHByZXNlbmNlIGNoYW5uZWwgaW5zdGFuY2UgYnkgbmFtZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicHJlc2VuY2VDaGFubmVsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByZXNlbmNlQ2hhbm5lbChuYW1lKSB7XG4gICAgICByZXR1cm4gbmV3IE51bGxQcmVzZW5jZUNoYW5uZWwoKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBMZWF2ZSB0aGUgZ2l2ZW4gY2hhbm5lbCwgYXMgd2VsbCBhcyBpdHMgcHJpdmF0ZSBhbmQgcHJlc2VuY2UgdmFyaWFudHMuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImxlYXZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxlYXZlKG5hbWUpIHsvL1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIExlYXZlIHRoZSBnaXZlbiBjaGFubmVsLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJsZWF2ZUNoYW5uZWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGVhdmVDaGFubmVsKG5hbWUpIHsvL1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgc29ja2V0IElEIGZvciB0aGUgY29ubmVjdGlvbi5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic29ja2V0SWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc29ja2V0SWQoKSB7XG4gICAgICByZXR1cm4gJ2Zha2Utc29ja2V0LWlkJztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBEaXNjb25uZWN0IHRoZSBjb25uZWN0aW9uLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkaXNjb25uZWN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKSB7Ly9cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTnVsbENvbm5lY3Rvcjtcbn0oQ29ubmVjdG9yKTtcblxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgaXMgdGhlIHByaW1hcnkgQVBJIGZvciBpbnRlcmFjdGluZyB3aXRoIGJyb2FkY2FzdGluZy5cclxuICovXG5cbnZhciBFY2hvID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IGNsYXNzIGluc3RhbmNlLlxyXG4gICAqL1xuICBmdW5jdGlvbiBFY2hvKG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRWNobyk7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuY29ubmVjdCgpO1xuXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMud2l0aG91dEludGVyY2VwdG9ycykge1xuICAgICAgdGhpcy5yZWdpc3RlckludGVyY2VwdG9ycygpO1xuICAgIH1cbiAgfVxuICAvKipcclxuICAgKiBHZXQgYSBjaGFubmVsIGluc3RhbmNlIGJ5IG5hbWUuXHJcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoRWNobywgW3tcbiAgICBrZXk6IFwiY2hhbm5lbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaGFubmVsKF9jaGFubmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuY2hhbm5lbChfY2hhbm5lbCk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24uXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNvbm5lY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29ubmVjdCgpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnJvYWRjYXN0ZXIgPT0gJ3B1c2hlcicpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0b3IgPSBuZXcgUHVzaGVyQ29ubmVjdG9yKHRoaXMub3B0aW9ucyk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5icm9hZGNhc3RlciA9PSAnc29ja2V0LmlvJykge1xuICAgICAgICB0aGlzLmNvbm5lY3RvciA9IG5ldyBTb2NrZXRJb0Nvbm5lY3Rvcih0aGlzLm9wdGlvbnMpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuYnJvYWRjYXN0ZXIgPT0gJ251bGwnKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdG9yID0gbmV3IE51bGxDb25uZWN0b3IodGhpcy5vcHRpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5icm9hZGNhc3RlciA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdG9yID0gbmV3IHRoaXMub3B0aW9ucy5icm9hZGNhc3Rlcih0aGlzLm9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgRWNobyBzZXJ2ZXIuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRpc2Nvbm5lY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzY29ubmVjdCgpIHtcbiAgICAgIHRoaXMuY29ubmVjdG9yLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSBwcmVzZW5jZSBjaGFubmVsIGluc3RhbmNlIGJ5IG5hbWUuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImpvaW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gam9pbihjaGFubmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IucHJlc2VuY2VDaGFubmVsKGNoYW5uZWwpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIExlYXZlIHRoZSBnaXZlbiBjaGFubmVsLCBhcyB3ZWxsIGFzIGl0cyBwcml2YXRlIGFuZCBwcmVzZW5jZSB2YXJpYW50cy5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibGVhdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGVhdmUoY2hhbm5lbCkge1xuICAgICAgdGhpcy5jb25uZWN0b3IubGVhdmUoY2hhbm5lbCk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogTGVhdmUgdGhlIGdpdmVuIGNoYW5uZWwuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImxlYXZlQ2hhbm5lbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsZWF2ZUNoYW5uZWwoY2hhbm5lbCkge1xuICAgICAgdGhpcy5jb25uZWN0b3IubGVhdmVDaGFubmVsKGNoYW5uZWwpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIExlYXZlIGFsbCBjaGFubmVscy5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibGVhdmVBbGxDaGFubmVsc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsZWF2ZUFsbENoYW5uZWxzKCkge1xuICAgICAgZm9yICh2YXIgY2hhbm5lbCBpbiB0aGlzLmNvbm5lY3Rvci5jaGFubmVscykge1xuICAgICAgICB0aGlzLmxlYXZlQ2hhbm5lbChjaGFubmVsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBMaXN0ZW4gZm9yIGFuIGV2ZW50IG9uIGEgY2hhbm5lbCBpbnN0YW5jZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibGlzdGVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxpc3RlbihjaGFubmVsLCBldmVudCwgY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5saXN0ZW4oY2hhbm5lbCwgZXZlbnQsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSBwcml2YXRlIGNoYW5uZWwgaW5zdGFuY2UgYnkgbmFtZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicHJpdmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfcHJpdmF0ZShjaGFubmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IucHJpdmF0ZUNoYW5uZWwoY2hhbm5lbCk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgcHJpdmF0ZSBlbmNyeXB0ZWQgY2hhbm5lbCBpbnN0YW5jZSBieSBuYW1lLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJlbmNyeXB0ZWRQcml2YXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuY3J5cHRlZFByaXZhdGUoY2hhbm5lbCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmVuY3J5cHRlZFByaXZhdGVDaGFubmVsKGNoYW5uZWwpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgU29ja2V0IElEIGZvciB0aGUgY29ubmVjdGlvbi5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic29ja2V0SWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc29ja2V0SWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3Iuc29ja2V0SWQoKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciAzcmQgcGFydHkgcmVxdWVzdCBpbnRlcmNlcHRpb3JzLiBUaGVzZSBhcmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5XHJcbiAgICAgKiBzZW5kIGEgY29ubmVjdGlvbnMgc29ja2V0IGlkIHRvIGEgTGFyYXZlbCBhcHAgd2l0aCBhIFgtU29ja2V0LUlkIGhlYWRlci5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVnaXN0ZXJJbnRlcmNlcHRvcnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVnaXN0ZXJJbnRlcmNlcHRvcnMoKSB7XG4gICAgICBpZiAodHlwZW9mIFZ1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBWdWUuaHR0cCkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVnVlUmVxdWVzdEludGVyY2VwdG9yKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgYXhpb3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlckF4aW9zUmVxdWVzdEludGVyY2VwdG9yKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgalF1ZXJ5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJqUXVlcnlBamF4U2V0dXAoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCh0eXBlb2YgVHVyYm8gPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihUdXJibykpID09PSAnb2JqZWN0Jykge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVHVyYm9SZXF1ZXN0SW50ZXJjZXB0b3IoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciBhIFZ1ZSBIVFRQIGludGVyY2VwdG9yIHRvIGFkZCB0aGUgWC1Tb2NrZXQtSUQgaGVhZGVyLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZWdpc3RlclZ1ZVJlcXVlc3RJbnRlcmNlcHRvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWdpc3RlclZ1ZVJlcXVlc3RJbnRlcmNlcHRvcigpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIFZ1ZS5odHRwLmludGVyY2VwdG9ycy5wdXNoKGZ1bmN0aW9uIChyZXF1ZXN0LCBuZXh0KSB7XG4gICAgICAgIGlmIChfdGhpcy5zb2NrZXRJZCgpKSB7XG4gICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldCgnWC1Tb2NrZXQtSUQnLCBfdGhpcy5zb2NrZXRJZCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5leHQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGFuIEF4aW9zIEhUVFAgaW50ZXJjZXB0b3IgdG8gYWRkIHRoZSBYLVNvY2tldC1JRCBoZWFkZXIuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlZ2lzdGVyQXhpb3NSZXF1ZXN0SW50ZXJjZXB0b3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVnaXN0ZXJBeGlvc1JlcXVlc3RJbnRlcmNlcHRvcigpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBheGlvcy5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICBpZiAoX3RoaXMyLnNvY2tldElkKCkpIHtcbiAgICAgICAgICBjb25maWcuaGVhZGVyc1snWC1Tb2NrZXQtSWQnXSA9IF90aGlzMi5zb2NrZXRJZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGpRdWVyeSBBamF4UHJlZmlsdGVyIHRvIGFkZCB0aGUgWC1Tb2NrZXQtSUQgaGVhZGVyLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZWdpc3RlcmpRdWVyeUFqYXhTZXR1cFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWdpc3RlcmpRdWVyeUFqYXhTZXR1cCgpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICBpZiAodHlwZW9mIGpRdWVyeS5hamF4ICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGpRdWVyeS5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uIChvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIHhocikge1xuICAgICAgICAgIGlmIChfdGhpczMuc29ja2V0SWQoKSkge1xuICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ1gtU29ja2V0LUlkJywgX3RoaXMzLnNvY2tldElkKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXIgdGhlIFR1cmJvIFJlcXVlc3QgaW50ZXJjZXB0b3IgdG8gYWRkIHRoZSBYLVNvY2tldC1JRCBoZWFkZXIuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlZ2lzdGVyVHVyYm9SZXF1ZXN0SW50ZXJjZXB0b3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVnaXN0ZXJUdXJib1JlcXVlc3RJbnRlcmNlcHRvcigpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0dXJibzpiZWZvcmUtZmV0Y2gtcmVxdWVzdCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBldmVudC5kZXRhaWwuZmV0Y2hPcHRpb25zLmhlYWRlcnNbJ1gtU29ja2V0LUlkJ10gPSBfdGhpczQuc29ja2V0SWQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBFY2hvO1xufSgpO1xuXG5leHBvcnQgeyBDaGFubmVsLCBFY2hvIGFzIGRlZmF1bHQgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/laravel-echo/dist/echo.js\n");

/***/ }),

/***/ "./resources/less/bootstrap-4-utilities.less":
/*!***************************************************!*\
  !*** ./resources/less/bootstrap-4-utilities.less ***!
  \***************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvbGVzcy9ib290c3RyYXAtNC11dGlsaXRpZXMubGVzcy5qcyIsIm1hcHBpbmdzIjoiO0FBQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvbGVzcy9ib290c3RyYXAtNC11dGlsaXRpZXMubGVzcz9kYzAzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/less/bootstrap-4-utilities.less\n");

/***/ }),

/***/ "./resources/sass/app.scss":
/*!*********************************!*\
  !*** ./resources/sass/app.scss ***!
  \*********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvc2Fzcy9hcHAuc2Nzcy5qcyIsIm1hcHBpbmdzIjoiO0FBQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvc2Fzcy9hcHAuc2Nzcz9iMzE0Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/sass/app.scss\n");

/***/ }),

/***/ "./resources/sass/nifty.scss":
/*!***********************************!*\
  !*** ./resources/sass/nifty.scss ***!
  \***********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvc2Fzcy9uaWZ0eS5zY3NzLmpzIiwibWFwcGluZ3MiOiI7QUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9zYXNzL25pZnR5LnNjc3M/NGQ0OCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB7fTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/sass/nifty.scss\n");

/***/ }),

/***/ "./resources/sass/themes/type-b/theme-ocean.scss":
/*!*******************************************************!*\
  !*** ./resources/sass/themes/type-b/theme-ocean.scss ***!
  \*******************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvc2Fzcy90aGVtZXMvdHlwZS1iL3RoZW1lLW9jZWFuLnNjc3MuanMiLCJtYXBwaW5ncyI6IjtBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL3Nhc3MvdGhlbWVzL3R5cGUtYi90aGVtZS1vY2Vhbi5zY3NzP2Q4NjAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQge307Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/sass/themes/type-b/theme-ocean.scss\n");

/***/ }),

/***/ "./node_modules/process/browser.js":
/*!*****************************************!*\
  !*** ./node_modules/process/browser.js ***!
  \*****************************************/
/***/ ((module) => {

eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isc0JBQXNCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTs7QUFFQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcz81Y2IzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/process/browser.js\n");

/***/ }),

/***/ "./node_modules/pusher-js/dist/web/pusher.js":
/*!***************************************************!*\
  !*** ./node_modules/pusher-js/dist/web/pusher.js ***!
  \***************************************************/
/***/ ((module) => {

eval("/*!\n * Pusher JavaScript Library v7.6.0\n * https://pusher.com/\n *\n * Copyright 2020, Pusher\n * Released under the MIT licence.\n */\n\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory();\n\telse {}\n})(window, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __nested_webpack_require_669__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_669__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__nested_webpack_require_669__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__nested_webpack_require_669__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__nested_webpack_require_669__.d = function(exports, name, getter) {\n/******/ \t\tif(!__nested_webpack_require_669__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__nested_webpack_require_669__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__nested_webpack_require_669__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __nested_webpack_require_669__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__nested_webpack_require_669__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __nested_webpack_require_669__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__nested_webpack_require_669__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__nested_webpack_require_669__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__nested_webpack_require_669__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__nested_webpack_require_669__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __nested_webpack_require_669__(__nested_webpack_require_669__.s = 2);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// Copyright (C) 2016 Dmitry Chestnykh\n// MIT License. See LICENSE file for details.\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Package base64 implements Base64 encoding and decoding.\n */\n// Invalid character used in decoding to indicate\n// that the character to decode is out of range of\n// alphabet and cannot be decoded.\nvar INVALID_BYTE = 256;\n/**\n * Implements standard Base64 encoding.\n *\n * Operates in constant time.\n */\nvar Coder = /** @class */ (function () {\n    // TODO(dchest): methods to encode chunk-by-chunk.\n    function Coder(_paddingCharacter) {\n        if (_paddingCharacter === void 0) { _paddingCharacter = \"=\"; }\n        this._paddingCharacter = _paddingCharacter;\n    }\n    Coder.prototype.encodedLength = function (length) {\n        if (!this._paddingCharacter) {\n            return (length * 8 + 5) / 6 | 0;\n        }\n        return (length + 2) / 3 * 4 | 0;\n    };\n    Coder.prototype.encode = function (data) {\n        var out = \"\";\n        var i = 0;\n        for (; i < data.length - 2; i += 3) {\n            var c = (data[i] << 16) | (data[i + 1] << 8) | (data[i + 2]);\n            out += this._encodeByte((c >>> 3 * 6) & 63);\n            out += this._encodeByte((c >>> 2 * 6) & 63);\n            out += this._encodeByte((c >>> 1 * 6) & 63);\n            out += this._encodeByte((c >>> 0 * 6) & 63);\n        }\n        var left = data.length - i;\n        if (left > 0) {\n            var c = (data[i] << 16) | (left === 2 ? data[i + 1] << 8 : 0);\n            out += this._encodeByte((c >>> 3 * 6) & 63);\n            out += this._encodeByte((c >>> 2 * 6) & 63);\n            if (left === 2) {\n                out += this._encodeByte((c >>> 1 * 6) & 63);\n            }\n            else {\n                out += this._paddingCharacter || \"\";\n            }\n            out += this._paddingCharacter || \"\";\n        }\n        return out;\n    };\n    Coder.prototype.maxDecodedLength = function (length) {\n        if (!this._paddingCharacter) {\n            return (length * 6 + 7) / 8 | 0;\n        }\n        return length / 4 * 3 | 0;\n    };\n    Coder.prototype.decodedLength = function (s) {\n        return this.maxDecodedLength(s.length - this._getPaddingLength(s));\n    };\n    Coder.prototype.decode = function (s) {\n        if (s.length === 0) {\n            return new Uint8Array(0);\n        }\n        var paddingLength = this._getPaddingLength(s);\n        var length = s.length - paddingLength;\n        var out = new Uint8Array(this.maxDecodedLength(length));\n        var op = 0;\n        var i = 0;\n        var haveBad = 0;\n        var v0 = 0, v1 = 0, v2 = 0, v3 = 0;\n        for (; i < length - 4; i += 4) {\n            v0 = this._decodeChar(s.charCodeAt(i + 0));\n            v1 = this._decodeChar(s.charCodeAt(i + 1));\n            v2 = this._decodeChar(s.charCodeAt(i + 2));\n            v3 = this._decodeChar(s.charCodeAt(i + 3));\n            out[op++] = (v0 << 2) | (v1 >>> 4);\n            out[op++] = (v1 << 4) | (v2 >>> 2);\n            out[op++] = (v2 << 6) | v3;\n            haveBad |= v0 & INVALID_BYTE;\n            haveBad |= v1 & INVALID_BYTE;\n            haveBad |= v2 & INVALID_BYTE;\n            haveBad |= v3 & INVALID_BYTE;\n        }\n        if (i < length - 1) {\n            v0 = this._decodeChar(s.charCodeAt(i));\n            v1 = this._decodeChar(s.charCodeAt(i + 1));\n            out[op++] = (v0 << 2) | (v1 >>> 4);\n            haveBad |= v0 & INVALID_BYTE;\n            haveBad |= v1 & INVALID_BYTE;\n        }\n        if (i < length - 2) {\n            v2 = this._decodeChar(s.charCodeAt(i + 2));\n            out[op++] = (v1 << 4) | (v2 >>> 2);\n            haveBad |= v2 & INVALID_BYTE;\n        }\n        if (i < length - 3) {\n            v3 = this._decodeChar(s.charCodeAt(i + 3));\n            out[op++] = (v2 << 6) | v3;\n            haveBad |= v3 & INVALID_BYTE;\n        }\n        if (haveBad !== 0) {\n            throw new Error(\"Base64Coder: incorrect characters for decoding\");\n        }\n        return out;\n    };\n    // Standard encoding have the following encoded/decoded ranges,\n    // which we need to convert between.\n    //\n    // ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789  +   /\n    // Index:   0 - 25                    26 - 51              52 - 61   62  63\n    // ASCII:  65 - 90                    97 - 122             48 - 57   43  47\n    //\n    // Encode 6 bits in b into a new character.\n    Coder.prototype._encodeByte = function (b) {\n        // Encoding uses constant time operations as follows:\n        //\n        // 1. Define comparison of A with B using (A - B) >>> 8:\n        //          if A > B, then result is positive integer\n        //          if A <= B, then result is 0\n        //\n        // 2. Define selection of C or 0 using bitwise AND: X & C:\n        //          if X == 0, then result is 0\n        //          if X != 0, then result is C\n        //\n        // 3. Start with the smallest comparison (b >= 0), which is always\n        //    true, so set the result to the starting ASCII value (65).\n        //\n        // 4. Continue comparing b to higher ASCII values, and selecting\n        //    zero if comparison isn't true, otherwise selecting a value\n        //    to add to result, which:\n        //\n        //          a) undoes the previous addition\n        //          b) provides new value to add\n        //\n        var result = b;\n        // b >= 0\n        result += 65;\n        // b > 25\n        result += ((25 - b) >>> 8) & ((0 - 65) - 26 + 97);\n        // b > 51\n        result += ((51 - b) >>> 8) & ((26 - 97) - 52 + 48);\n        // b > 61\n        result += ((61 - b) >>> 8) & ((52 - 48) - 62 + 43);\n        // b > 62\n        result += ((62 - b) >>> 8) & ((62 - 43) - 63 + 47);\n        return String.fromCharCode(result);\n    };\n    // Decode a character code into a byte.\n    // Must return 256 if character is out of alphabet range.\n    Coder.prototype._decodeChar = function (c) {\n        // Decoding works similar to encoding: using the same comparison\n        // function, but now it works on ranges: result is always incremented\n        // by value, but this value becomes zero if the range is not\n        // satisfied.\n        //\n        // Decoding starts with invalid value, 256, which is then\n        // subtracted when the range is satisfied. If none of the ranges\n        // apply, the function returns 256, which is then checked by\n        // the caller to throw error.\n        var result = INVALID_BYTE; // start with invalid character\n        // c == 43 (c > 42 and c < 44)\n        result += (((42 - c) & (c - 44)) >>> 8) & (-INVALID_BYTE + c - 43 + 62);\n        // c == 47 (c > 46 and c < 48)\n        result += (((46 - c) & (c - 48)) >>> 8) & (-INVALID_BYTE + c - 47 + 63);\n        // c > 47 and c < 58\n        result += (((47 - c) & (c - 58)) >>> 8) & (-INVALID_BYTE + c - 48 + 52);\n        // c > 64 and c < 91\n        result += (((64 - c) & (c - 91)) >>> 8) & (-INVALID_BYTE + c - 65 + 0);\n        // c > 96 and c < 123\n        result += (((96 - c) & (c - 123)) >>> 8) & (-INVALID_BYTE + c - 97 + 26);\n        return result;\n    };\n    Coder.prototype._getPaddingLength = function (s) {\n        var paddingLength = 0;\n        if (this._paddingCharacter) {\n            for (var i = s.length - 1; i >= 0; i--) {\n                if (s[i] !== this._paddingCharacter) {\n                    break;\n                }\n                paddingLength++;\n            }\n            if (s.length < 4 || paddingLength > 2) {\n                throw new Error(\"Base64Coder: incorrect padding\");\n            }\n        }\n        return paddingLength;\n    };\n    return Coder;\n}());\nexports.Coder = Coder;\nvar stdCoder = new Coder();\nfunction encode(data) {\n    return stdCoder.encode(data);\n}\nexports.encode = encode;\nfunction decode(s) {\n    return stdCoder.decode(s);\n}\nexports.decode = decode;\n/**\n * Implements URL-safe Base64 encoding.\n * (Same as Base64, but '+' is replaced with '-', and '/' with '_').\n *\n * Operates in constant time.\n */\nvar URLSafeCoder = /** @class */ (function (_super) {\n    __extends(URLSafeCoder, _super);\n    function URLSafeCoder() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    // URL-safe encoding have the following encoded/decoded ranges:\n    //\n    // ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789  -   _\n    // Index:   0 - 25                    26 - 51              52 - 61   62  63\n    // ASCII:  65 - 90                    97 - 122             48 - 57   45  95\n    //\n    URLSafeCoder.prototype._encodeByte = function (b) {\n        var result = b;\n        // b >= 0\n        result += 65;\n        // b > 25\n        result += ((25 - b) >>> 8) & ((0 - 65) - 26 + 97);\n        // b > 51\n        result += ((51 - b) >>> 8) & ((26 - 97) - 52 + 48);\n        // b > 61\n        result += ((61 - b) >>> 8) & ((52 - 48) - 62 + 45);\n        // b > 62\n        result += ((62 - b) >>> 8) & ((62 - 45) - 63 + 95);\n        return String.fromCharCode(result);\n    };\n    URLSafeCoder.prototype._decodeChar = function (c) {\n        var result = INVALID_BYTE;\n        // c == 45 (c > 44 and c < 46)\n        result += (((44 - c) & (c - 46)) >>> 8) & (-INVALID_BYTE + c - 45 + 62);\n        // c == 95 (c > 94 and c < 96)\n        result += (((94 - c) & (c - 96)) >>> 8) & (-INVALID_BYTE + c - 95 + 63);\n        // c > 47 and c < 58\n        result += (((47 - c) & (c - 58)) >>> 8) & (-INVALID_BYTE + c - 48 + 52);\n        // c > 64 and c < 91\n        result += (((64 - c) & (c - 91)) >>> 8) & (-INVALID_BYTE + c - 65 + 0);\n        // c > 96 and c < 123\n        result += (((96 - c) & (c - 123)) >>> 8) & (-INVALID_BYTE + c - 97 + 26);\n        return result;\n    };\n    return URLSafeCoder;\n}(Coder));\nexports.URLSafeCoder = URLSafeCoder;\nvar urlSafeCoder = new URLSafeCoder();\nfunction encodeURLSafe(data) {\n    return urlSafeCoder.encode(data);\n}\nexports.encodeURLSafe = encodeURLSafe;\nfunction decodeURLSafe(s) {\n    return urlSafeCoder.decode(s);\n}\nexports.decodeURLSafe = decodeURLSafe;\nexports.encodedLength = function (length) {\n    return stdCoder.encodedLength(length);\n};\nexports.maxDecodedLength = function (length) {\n    return stdCoder.maxDecodedLength(length);\n};\nexports.decodedLength = function (s) {\n    return stdCoder.decodedLength(s);\n};\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// Copyright (C) 2016 Dmitry Chestnykh\n// MIT License. See LICENSE file for details.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Package utf8 implements UTF-8 encoding and decoding.\n */\nvar INVALID_UTF16 = \"utf8: invalid string\";\nvar INVALID_UTF8 = \"utf8: invalid source encoding\";\n/**\n * Encodes the given string into UTF-8 byte array.\n * Throws if the source string has invalid UTF-16 encoding.\n */\nfunction encode(s) {\n    // Calculate result length and allocate output array.\n    // encodedLength() also validates string and throws errors,\n    // so we don't need repeat validation here.\n    var arr = new Uint8Array(encodedLength(s));\n    var pos = 0;\n    for (var i = 0; i < s.length; i++) {\n        var c = s.charCodeAt(i);\n        if (c < 0x80) {\n            arr[pos++] = c;\n        }\n        else if (c < 0x800) {\n            arr[pos++] = 0xc0 | c >> 6;\n            arr[pos++] = 0x80 | c & 0x3f;\n        }\n        else if (c < 0xd800) {\n            arr[pos++] = 0xe0 | c >> 12;\n            arr[pos++] = 0x80 | (c >> 6) & 0x3f;\n            arr[pos++] = 0x80 | c & 0x3f;\n        }\n        else {\n            i++; // get one more character\n            c = (c & 0x3ff) << 10;\n            c |= s.charCodeAt(i) & 0x3ff;\n            c += 0x10000;\n            arr[pos++] = 0xf0 | c >> 18;\n            arr[pos++] = 0x80 | (c >> 12) & 0x3f;\n            arr[pos++] = 0x80 | (c >> 6) & 0x3f;\n            arr[pos++] = 0x80 | c & 0x3f;\n        }\n    }\n    return arr;\n}\nexports.encode = encode;\n/**\n * Returns the number of bytes required to encode the given string into UTF-8.\n * Throws if the source string has invalid UTF-16 encoding.\n */\nfunction encodedLength(s) {\n    var result = 0;\n    for (var i = 0; i < s.length; i++) {\n        var c = s.charCodeAt(i);\n        if (c < 0x80) {\n            result += 1;\n        }\n        else if (c < 0x800) {\n            result += 2;\n        }\n        else if (c < 0xd800) {\n            result += 3;\n        }\n        else if (c <= 0xdfff) {\n            if (i >= s.length - 1) {\n                throw new Error(INVALID_UTF16);\n            }\n            i++; // \"eat\" next character\n            result += 4;\n        }\n        else {\n            throw new Error(INVALID_UTF16);\n        }\n    }\n    return result;\n}\nexports.encodedLength = encodedLength;\n/**\n * Decodes the given byte array from UTF-8 into a string.\n * Throws if encoding is invalid.\n */\nfunction decode(arr) {\n    var chars = [];\n    for (var i = 0; i < arr.length; i++) {\n        var b = arr[i];\n        if (b & 0x80) {\n            var min = void 0;\n            if (b < 0xe0) {\n                // Need 1 more byte.\n                if (i >= arr.length) {\n                    throw new Error(INVALID_UTF8);\n                }\n                var n1 = arr[++i];\n                if ((n1 & 0xc0) !== 0x80) {\n                    throw new Error(INVALID_UTF8);\n                }\n                b = (b & 0x1f) << 6 | (n1 & 0x3f);\n                min = 0x80;\n            }\n            else if (b < 0xf0) {\n                // Need 2 more bytes.\n                if (i >= arr.length - 1) {\n                    throw new Error(INVALID_UTF8);\n                }\n                var n1 = arr[++i];\n                var n2 = arr[++i];\n                if ((n1 & 0xc0) !== 0x80 || (n2 & 0xc0) !== 0x80) {\n                    throw new Error(INVALID_UTF8);\n                }\n                b = (b & 0x0f) << 12 | (n1 & 0x3f) << 6 | (n2 & 0x3f);\n                min = 0x800;\n            }\n            else if (b < 0xf8) {\n                // Need 3 more bytes.\n                if (i >= arr.length - 2) {\n                    throw new Error(INVALID_UTF8);\n                }\n                var n1 = arr[++i];\n                var n2 = arr[++i];\n                var n3 = arr[++i];\n                if ((n1 & 0xc0) !== 0x80 || (n2 & 0xc0) !== 0x80 || (n3 & 0xc0) !== 0x80) {\n                    throw new Error(INVALID_UTF8);\n                }\n                b = (b & 0x0f) << 18 | (n1 & 0x3f) << 12 | (n2 & 0x3f) << 6 | (n3 & 0x3f);\n                min = 0x10000;\n            }\n            else {\n                throw new Error(INVALID_UTF8);\n            }\n            if (b < min || (b >= 0xd800 && b <= 0xdfff)) {\n                throw new Error(INVALID_UTF8);\n            }\n            if (b >= 0x10000) {\n                // Surrogate pair.\n                if (b > 0x10ffff) {\n                    throw new Error(INVALID_UTF8);\n                }\n                b -= 0x10000;\n                chars.push(String.fromCharCode(0xd800 | (b >> 10)));\n                b = 0xdc00 | (b & 0x3ff);\n            }\n        }\n        chars.push(String.fromCharCode(b));\n    }\n    return chars.join(\"\");\n}\nexports.decode = decode;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __nested_webpack_require_19901__) {\n\n// required so we don't have to do require('pusher').default etc.\nmodule.exports = __nested_webpack_require_19901__(3).default;\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, __webpack_exports__, __nested_webpack_require_20105__) {\n\n\"use strict\";\n// ESM COMPAT FLAG\n__nested_webpack_require_20105__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./src/runtimes/web/dom/script_receiver_factory.ts\nvar ScriptReceiverFactory = (function () {\n    function ScriptReceiverFactory(prefix, name) {\n        this.lastId = 0;\n        this.prefix = prefix;\n        this.name = name;\n    }\n    ScriptReceiverFactory.prototype.create = function (callback) {\n        this.lastId++;\n        var number = this.lastId;\n        var id = this.prefix + number;\n        var name = this.name + '[' + number + ']';\n        var called = false;\n        var callbackWrapper = function () {\n            if (!called) {\n                callback.apply(null, arguments);\n                called = true;\n            }\n        };\n        this[number] = callbackWrapper;\n        return { number: number, id: id, name: name, callback: callbackWrapper };\n    };\n    ScriptReceiverFactory.prototype.remove = function (receiver) {\n        delete this[receiver.number];\n    };\n    return ScriptReceiverFactory;\n}());\n\nvar ScriptReceivers = new ScriptReceiverFactory('_pusher_script_', 'Pusher.ScriptReceivers');\n\n// CONCATENATED MODULE: ./src/core/defaults.ts\nvar Defaults = {\n    VERSION: \"7.6.0\",\n    PROTOCOL: 7,\n    wsPort: 80,\n    wssPort: 443,\n    wsPath: '',\n    httpHost: 'sockjs.pusher.com',\n    httpPort: 80,\n    httpsPort: 443,\n    httpPath: '/pusher',\n    stats_host: 'stats.pusher.com',\n    authEndpoint: '/pusher/auth',\n    authTransport: 'ajax',\n    activityTimeout: 120000,\n    pongTimeout: 30000,\n    unavailableTimeout: 10000,\n    cluster: 'mt1',\n    userAuthentication: {\n        endpoint: '/pusher/user-auth',\n        transport: 'ajax'\n    },\n    channelAuthorization: {\n        endpoint: '/pusher/auth',\n        transport: 'ajax'\n    },\n    cdn_http: \"http://js.pusher.com\",\n    cdn_https: \"https://js.pusher.com\",\n    dependency_suffix: \"\"\n};\n/* harmony default export */ var defaults = (Defaults);\n\n// CONCATENATED MODULE: ./src/runtimes/web/dom/dependency_loader.ts\n\n\nvar dependency_loader_DependencyLoader = (function () {\n    function DependencyLoader(options) {\n        this.options = options;\n        this.receivers = options.receivers || ScriptReceivers;\n        this.loading = {};\n    }\n    DependencyLoader.prototype.load = function (name, options, callback) {\n        var self = this;\n        if (self.loading[name] && self.loading[name].length > 0) {\n            self.loading[name].push(callback);\n        }\n        else {\n            self.loading[name] = [callback];\n            var request = runtime.createScriptRequest(self.getPath(name, options));\n            var receiver = self.receivers.create(function (error) {\n                self.receivers.remove(receiver);\n                if (self.loading[name]) {\n                    var callbacks = self.loading[name];\n                    delete self.loading[name];\n                    var successCallback = function (wasSuccessful) {\n                        if (!wasSuccessful) {\n                            request.cleanup();\n                        }\n                    };\n                    for (var i = 0; i < callbacks.length; i++) {\n                        callbacks[i](error, successCallback);\n                    }\n                }\n            });\n            request.send(receiver);\n        }\n    };\n    DependencyLoader.prototype.getRoot = function (options) {\n        var cdn;\n        var protocol = runtime.getDocument().location.protocol;\n        if ((options && options.useTLS) || protocol === 'https:') {\n            cdn = this.options.cdn_https;\n        }\n        else {\n            cdn = this.options.cdn_http;\n        }\n        return cdn.replace(/\\/*$/, '') + '/' + this.options.version;\n    };\n    DependencyLoader.prototype.getPath = function (name, options) {\n        return this.getRoot(options) + '/' + name + this.options.suffix + '.js';\n    };\n    return DependencyLoader;\n}());\n/* harmony default export */ var dependency_loader = (dependency_loader_DependencyLoader);\n\n// CONCATENATED MODULE: ./src/runtimes/web/dom/dependencies.ts\n\n\n\nvar DependenciesReceivers = new ScriptReceiverFactory('_pusher_dependencies', 'Pusher.DependenciesReceivers');\nvar Dependencies = new dependency_loader({\n    cdn_http: defaults.cdn_http,\n    cdn_https: defaults.cdn_https,\n    version: defaults.VERSION,\n    suffix: defaults.dependency_suffix,\n    receivers: DependenciesReceivers\n});\n\n// CONCATENATED MODULE: ./src/core/utils/url_store.ts\nvar urlStore = {\n    baseUrl: 'https://pusher.com',\n    urls: {\n        authenticationEndpoint: {\n            path: '/docs/channels/server_api/authenticating_users'\n        },\n        authorizationEndpoint: {\n            path: '/docs/channels/server_api/authorizing-users/'\n        },\n        javascriptQuickStart: {\n            path: '/docs/javascript_quick_start'\n        },\n        triggeringClientEvents: {\n            path: '/docs/client_api_guide/client_events#trigger-events'\n        },\n        encryptedChannelSupport: {\n            fullUrl: 'https://github.com/pusher/pusher-js/tree/cc491015371a4bde5743d1c87a0fbac0feb53195#encrypted-channel-support'\n        }\n    }\n};\nvar buildLogSuffix = function (key) {\n    var urlPrefix = 'See:';\n    var urlObj = urlStore.urls[key];\n    if (!urlObj)\n        return '';\n    var url;\n    if (urlObj.fullUrl) {\n        url = urlObj.fullUrl;\n    }\n    else if (urlObj.path) {\n        url = urlStore.baseUrl + urlObj.path;\n    }\n    if (!url)\n        return '';\n    return urlPrefix + \" \" + url;\n};\n/* harmony default export */ var url_store = ({ buildLogSuffix: buildLogSuffix });\n\n// CONCATENATED MODULE: ./src/core/auth/options.ts\nvar AuthRequestType;\n(function (AuthRequestType) {\n    AuthRequestType[\"UserAuthentication\"] = \"user-authentication\";\n    AuthRequestType[\"ChannelAuthorization\"] = \"channel-authorization\";\n})(AuthRequestType || (AuthRequestType = {}));\n\n// CONCATENATED MODULE: ./src/core/errors.ts\nvar __extends = ( false) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nvar BadEventName = (function (_super) {\n    __extends(BadEventName, _super);\n    function BadEventName(msg) {\n        var _newTarget = this.constructor;\n        var _this = _super.call(this, msg) || this;\n        Object.setPrototypeOf(_this, _newTarget.prototype);\n        return _this;\n    }\n    return BadEventName;\n}(Error));\n\nvar BadChannelName = (function (_super) {\n    __extends(BadChannelName, _super);\n    function BadChannelName(msg) {\n        var _newTarget = this.constructor;\n        var _this = _super.call(this, msg) || this;\n        Object.setPrototypeOf(_this, _newTarget.prototype);\n        return _this;\n    }\n    return BadChannelName;\n}(Error));\n\nvar RequestTimedOut = (function (_super) {\n    __extends(RequestTimedOut, _super);\n    function RequestTimedOut(msg) {\n        var _newTarget = this.constructor;\n        var _this = _super.call(this, msg) || this;\n        Object.setPrototypeOf(_this, _newTarget.prototype);\n        return _this;\n    }\n    return RequestTimedOut;\n}(Error));\n\nvar TransportPriorityTooLow = (function (_super) {\n    __extends(TransportPriorityTooLow, _super);\n    function TransportPriorityTooLow(msg) {\n        var _newTarget = this.constructor;\n        var _this = _super.call(this, msg) || this;\n        Object.setPrototypeOf(_this, _newTarget.prototype);\n        return _this;\n    }\n    return TransportPriorityTooLow;\n}(Error));\n\nvar TransportClosed = (function (_super) {\n    __extends(TransportClosed, _super);\n    function TransportClosed(msg) {\n        var _newTarget = this.constructor;\n        var _this = _super.call(this, msg) || this;\n        Object.setPrototypeOf(_this, _newTarget.prototype);\n        return _this;\n    }\n    return TransportClosed;\n}(Error));\n\nvar UnsupportedFeature = (function (_super) {\n    __extends(UnsupportedFeature, _super);\n    function UnsupportedFeature(msg) {\n        var _newTarget = this.constructor;\n        var _this = _super.call(this, msg) || this;\n        Object.setPrototypeOf(_this, _newTarget.prototype);\n        return _this;\n    }\n    return UnsupportedFeature;\n}(Error));\n\nvar UnsupportedTransport = (function (_super) {\n    __extends(UnsupportedTransport, _super);\n    function UnsupportedTransport(msg) {\n        var _newTarget = this.constructor;\n        var _this = _super.call(this, msg) || this;\n        Object.setPrototypeOf(_this, _newTarget.prototype);\n        return _this;\n    }\n    return UnsupportedTransport;\n}(Error));\n\nvar UnsupportedStrategy = (function (_super) {\n    __extends(UnsupportedStrategy, _super);\n    function UnsupportedStrategy(msg) {\n        var _newTarget = this.constructor;\n        var _this = _super.call(this, msg) || this;\n        Object.setPrototypeOf(_this, _newTarget.prototype);\n        return _this;\n    }\n    return UnsupportedStrategy;\n}(Error));\n\nvar HTTPAuthError = (function (_super) {\n    __extends(HTTPAuthError, _super);\n    function HTTPAuthError(status, msg) {\n        var _newTarget = this.constructor;\n        var _this = _super.call(this, msg) || this;\n        _this.status = status;\n        Object.setPrototypeOf(_this, _newTarget.prototype);\n        return _this;\n    }\n    return HTTPAuthError;\n}(Error));\n\n\n// CONCATENATED MODULE: ./src/runtimes/isomorphic/auth/xhr_auth.ts\n\n\n\n\nvar ajax = function (context, query, authOptions, authRequestType, callback) {\n    var xhr = runtime.createXHR();\n    xhr.open('POST', authOptions.endpoint, true);\n    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n    for (var headerName in authOptions.headers) {\n        xhr.setRequestHeader(headerName, authOptions.headers[headerName]);\n    }\n    if (authOptions.headersProvider != null) {\n        var dynamicHeaders = authOptions.headersProvider();\n        for (var headerName in dynamicHeaders) {\n            xhr.setRequestHeader(headerName, dynamicHeaders[headerName]);\n        }\n    }\n    xhr.onreadystatechange = function () {\n        if (xhr.readyState === 4) {\n            if (xhr.status === 200) {\n                var data = void 0;\n                var parsed = false;\n                try {\n                    data = JSON.parse(xhr.responseText);\n                    parsed = true;\n                }\n                catch (e) {\n                    callback(new HTTPAuthError(200, \"JSON returned from \" + authRequestType.toString() + \" endpoint was invalid, yet status code was 200. Data was: \" + xhr.responseText), null);\n                }\n                if (parsed) {\n                    callback(null, data);\n                }\n            }\n            else {\n                var suffix = '';\n                switch (authRequestType) {\n                    case AuthRequestType.UserAuthentication:\n                        suffix = url_store.buildLogSuffix('authenticationEndpoint');\n                        break;\n                    case AuthRequestType.ChannelAuthorization:\n                        suffix = \"Clients must be authorized to join private or presence channels. \" + url_store.buildLogSuffix('authorizationEndpoint');\n                        break;\n                }\n                callback(new HTTPAuthError(xhr.status, \"Unable to retrieve auth string from \" + authRequestType.toString() + \" endpoint - \" +\n                    (\"received status: \" + xhr.status + \" from \" + authOptions.endpoint + \". \" + suffix)), null);\n            }\n        }\n    };\n    xhr.send(query);\n    return xhr;\n};\n/* harmony default export */ var xhr_auth = (ajax);\n\n// CONCATENATED MODULE: ./src/core/base64.ts\nfunction encode(s) {\n    return btoa(utob(s));\n}\nvar fromCharCode = String.fromCharCode;\nvar b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nvar b64tab = {};\nfor (var base64_i = 0, l = b64chars.length; base64_i < l; base64_i++) {\n    b64tab[b64chars.charAt(base64_i)] = base64_i;\n}\nvar cb_utob = function (c) {\n    var cc = c.charCodeAt(0);\n    return cc < 0x80\n        ? c\n        : cc < 0x800\n            ? fromCharCode(0xc0 | (cc >>> 6)) + fromCharCode(0x80 | (cc & 0x3f))\n            : fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) +\n                fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) +\n                fromCharCode(0x80 | (cc & 0x3f));\n};\nvar utob = function (u) {\n    return u.replace(/[^\\x00-\\x7F]/g, cb_utob);\n};\nvar cb_encode = function (ccc) {\n    var padlen = [0, 2, 1][ccc.length % 3];\n    var ord = (ccc.charCodeAt(0) << 16) |\n        ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8) |\n        (ccc.length > 2 ? ccc.charCodeAt(2) : 0);\n    var chars = [\n        b64chars.charAt(ord >>> 18),\n        b64chars.charAt((ord >>> 12) & 63),\n        padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63),\n        padlen >= 1 ? '=' : b64chars.charAt(ord & 63)\n    ];\n    return chars.join('');\n};\nvar btoa = window.btoa ||\n    function (b) {\n        return b.replace(/[\\s\\S]{1,3}/g, cb_encode);\n    };\n\n// CONCATENATED MODULE: ./src/core/utils/timers/abstract_timer.ts\nvar Timer = (function () {\n    function Timer(set, clear, delay, callback) {\n        var _this = this;\n        this.clear = clear;\n        this.timer = set(function () {\n            if (_this.timer) {\n                _this.timer = callback(_this.timer);\n            }\n        }, delay);\n    }\n    Timer.prototype.isRunning = function () {\n        return this.timer !== null;\n    };\n    Timer.prototype.ensureAborted = function () {\n        if (this.timer) {\n            this.clear(this.timer);\n            this.timer = null;\n        }\n    };\n    return Timer;\n}());\n/* harmony default export */ var abstract_timer = (Timer);\n\n// CONCATENATED MODULE: ./src/core/utils/timers/index.ts\nvar timers_extends = ( false) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n\nfunction timers_clearTimeout(timer) {\n    window.clearTimeout(timer);\n}\nfunction timers_clearInterval(timer) {\n    window.clearInterval(timer);\n}\nvar OneOffTimer = (function (_super) {\n    timers_extends(OneOffTimer, _super);\n    function OneOffTimer(delay, callback) {\n        return _super.call(this, setTimeout, timers_clearTimeout, delay, function (timer) {\n            callback();\n            return null;\n        }) || this;\n    }\n    return OneOffTimer;\n}(abstract_timer));\n\nvar PeriodicTimer = (function (_super) {\n    timers_extends(PeriodicTimer, _super);\n    function PeriodicTimer(delay, callback) {\n        return _super.call(this, setInterval, timers_clearInterval, delay, function (timer) {\n            callback();\n            return timer;\n        }) || this;\n    }\n    return PeriodicTimer;\n}(abstract_timer));\n\n\n// CONCATENATED MODULE: ./src/core/util.ts\n\nvar Util = {\n    now: function () {\n        if (Date.now) {\n            return Date.now();\n        }\n        else {\n            return new Date().valueOf();\n        }\n    },\n    defer: function (callback) {\n        return new OneOffTimer(0, callback);\n    },\n    method: function (name) {\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        var boundArguments = Array.prototype.slice.call(arguments, 1);\n        return function (object) {\n            return object[name].apply(object, boundArguments.concat(arguments));\n        };\n    }\n};\n/* harmony default export */ var util = (Util);\n\n// CONCATENATED MODULE: ./src/core/utils/collections.ts\n\n\nfunction extend(target) {\n    var sources = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        sources[_i - 1] = arguments[_i];\n    }\n    for (var i = 0; i < sources.length; i++) {\n        var extensions = sources[i];\n        for (var property in extensions) {\n            if (extensions[property] &&\n                extensions[property].constructor &&\n                extensions[property].constructor === Object) {\n                target[property] = extend(target[property] || {}, extensions[property]);\n            }\n            else {\n                target[property] = extensions[property];\n            }\n        }\n    }\n    return target;\n}\nfunction stringify() {\n    var m = ['Pusher'];\n    for (var i = 0; i < arguments.length; i++) {\n        if (typeof arguments[i] === 'string') {\n            m.push(arguments[i]);\n        }\n        else {\n            m.push(safeJSONStringify(arguments[i]));\n        }\n    }\n    return m.join(' : ');\n}\nfunction arrayIndexOf(array, item) {\n    var nativeIndexOf = Array.prototype.indexOf;\n    if (array === null) {\n        return -1;\n    }\n    if (nativeIndexOf && array.indexOf === nativeIndexOf) {\n        return array.indexOf(item);\n    }\n    for (var i = 0, l = array.length; i < l; i++) {\n        if (array[i] === item) {\n            return i;\n        }\n    }\n    return -1;\n}\nfunction objectApply(object, f) {\n    for (var key in object) {\n        if (Object.prototype.hasOwnProperty.call(object, key)) {\n            f(object[key], key, object);\n        }\n    }\n}\nfunction keys(object) {\n    var keys = [];\n    objectApply(object, function (_, key) {\n        keys.push(key);\n    });\n    return keys;\n}\nfunction values(object) {\n    var values = [];\n    objectApply(object, function (value) {\n        values.push(value);\n    });\n    return values;\n}\nfunction apply(array, f, context) {\n    for (var i = 0; i < array.length; i++) {\n        f.call(context || window, array[i], i, array);\n    }\n}\nfunction map(array, f) {\n    var result = [];\n    for (var i = 0; i < array.length; i++) {\n        result.push(f(array[i], i, array, result));\n    }\n    return result;\n}\nfunction mapObject(object, f) {\n    var result = {};\n    objectApply(object, function (value, key) {\n        result[key] = f(value);\n    });\n    return result;\n}\nfunction filter(array, test) {\n    test =\n        test ||\n            function (value) {\n                return !!value;\n            };\n    var result = [];\n    for (var i = 0; i < array.length; i++) {\n        if (test(array[i], i, array, result)) {\n            result.push(array[i]);\n        }\n    }\n    return result;\n}\nfunction filterObject(object, test) {\n    var result = {};\n    objectApply(object, function (value, key) {\n        if ((test && test(value, key, object, result)) || Boolean(value)) {\n            result[key] = value;\n        }\n    });\n    return result;\n}\nfunction flatten(object) {\n    var result = [];\n    objectApply(object, function (value, key) {\n        result.push([key, value]);\n    });\n    return result;\n}\nfunction any(array, test) {\n    for (var i = 0; i < array.length; i++) {\n        if (test(array[i], i, array)) {\n            return true;\n        }\n    }\n    return false;\n}\nfunction collections_all(array, test) {\n    for (var i = 0; i < array.length; i++) {\n        if (!test(array[i], i, array)) {\n            return false;\n        }\n    }\n    return true;\n}\nfunction encodeParamsObject(data) {\n    return mapObject(data, function (value) {\n        if (typeof value === 'object') {\n            value = safeJSONStringify(value);\n        }\n        return encodeURIComponent(encode(value.toString()));\n    });\n}\nfunction buildQueryString(data) {\n    var params = filterObject(data, function (value) {\n        return value !== undefined;\n    });\n    var query = map(flatten(encodeParamsObject(params)), util.method('join', '=')).join('&');\n    return query;\n}\nfunction decycleObject(object) {\n    var objects = [], paths = [];\n    return (function derez(value, path) {\n        var i, name, nu;\n        switch (typeof value) {\n            case 'object':\n                if (!value) {\n                    return null;\n                }\n                for (i = 0; i < objects.length; i += 1) {\n                    if (objects[i] === value) {\n                        return { $ref: paths[i] };\n                    }\n                }\n                objects.push(value);\n                paths.push(path);\n                if (Object.prototype.toString.apply(value) === '[object Array]') {\n                    nu = [];\n                    for (i = 0; i < value.length; i += 1) {\n                        nu[i] = derez(value[i], path + '[' + i + ']');\n                    }\n                }\n                else {\n                    nu = {};\n                    for (name in value) {\n                        if (Object.prototype.hasOwnProperty.call(value, name)) {\n                            nu[name] = derez(value[name], path + '[' + JSON.stringify(name) + ']');\n                        }\n                    }\n                }\n                return nu;\n            case 'number':\n            case 'string':\n            case 'boolean':\n                return value;\n        }\n    })(object, '$');\n}\nfunction safeJSONStringify(source) {\n    try {\n        return JSON.stringify(source);\n    }\n    catch (e) {\n        return JSON.stringify(decycleObject(source));\n    }\n}\n\n// CONCATENATED MODULE: ./src/core/logger.ts\n\n\nvar logger_Logger = (function () {\n    function Logger() {\n        this.globalLog = function (message) {\n            if (window.console && window.console.log) {\n                window.console.log(message);\n            }\n        };\n    }\n    Logger.prototype.debug = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        this.log(this.globalLog, args);\n    };\n    Logger.prototype.warn = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        this.log(this.globalLogWarn, args);\n    };\n    Logger.prototype.error = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        this.log(this.globalLogError, args);\n    };\n    Logger.prototype.globalLogWarn = function (message) {\n        if (window.console && window.console.warn) {\n            window.console.warn(message);\n        }\n        else {\n            this.globalLog(message);\n        }\n    };\n    Logger.prototype.globalLogError = function (message) {\n        if (window.console && window.console.error) {\n            window.console.error(message);\n        }\n        else {\n            this.globalLogWarn(message);\n        }\n    };\n    Logger.prototype.log = function (defaultLoggingFunction) {\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        var message = stringify.apply(this, arguments);\n        if (core_pusher.log) {\n            core_pusher.log(message);\n        }\n        else if (core_pusher.logToConsole) {\n            var log = defaultLoggingFunction.bind(this);\n            log(message);\n        }\n    };\n    return Logger;\n}());\n/* harmony default export */ var logger = (new logger_Logger());\n\n// CONCATENATED MODULE: ./src/runtimes/web/auth/jsonp_auth.ts\n\nvar jsonp = function (context, query, authOptions, authRequestType, callback) {\n    if (authOptions.headers !== undefined ||\n        authOptions.headersProvider != null) {\n        logger.warn(\"To send headers with the \" + authRequestType.toString() + \" request, you must use AJAX, rather than JSONP.\");\n    }\n    var callbackName = context.nextAuthCallbackID.toString();\n    context.nextAuthCallbackID++;\n    var document = context.getDocument();\n    var script = document.createElement('script');\n    context.auth_callbacks[callbackName] = function (data) {\n        callback(null, data);\n    };\n    var callback_name = \"Pusher.auth_callbacks['\" + callbackName + \"']\";\n    script.src =\n        authOptions.endpoint +\n            '?callback=' +\n            encodeURIComponent(callback_name) +\n            '&' +\n            query;\n    var head = document.getElementsByTagName('head')[0] || document.documentElement;\n    head.insertBefore(script, head.firstChild);\n};\n/* harmony default export */ var jsonp_auth = (jsonp);\n\n// CONCATENATED MODULE: ./src/runtimes/web/dom/script_request.ts\nvar ScriptRequest = (function () {\n    function ScriptRequest(src) {\n        this.src = src;\n    }\n    ScriptRequest.prototype.send = function (receiver) {\n        var self = this;\n        var errorString = 'Error loading ' + self.src;\n        self.script = document.createElement('script');\n        self.script.id = receiver.id;\n        self.script.src = self.src;\n        self.script.type = 'text/javascript';\n        self.script.charset = 'UTF-8';\n        if (self.script.addEventListener) {\n            self.script.onerror = function () {\n                receiver.callback(errorString);\n            };\n            self.script.onload = function () {\n                receiver.callback(null);\n            };\n        }\n        else {\n            self.script.onreadystatechange = function () {\n                if (self.script.readyState === 'loaded' ||\n                    self.script.readyState === 'complete') {\n                    receiver.callback(null);\n                }\n            };\n        }\n        if (self.script.async === undefined &&\n            document.attachEvent &&\n            /opera/i.test(navigator.userAgent)) {\n            self.errorScript = document.createElement('script');\n            self.errorScript.id = receiver.id + '_error';\n            self.errorScript.text = receiver.name + \"('\" + errorString + \"');\";\n            self.script.async = self.errorScript.async = false;\n        }\n        else {\n            self.script.async = true;\n        }\n        var head = document.getElementsByTagName('head')[0];\n        head.insertBefore(self.script, head.firstChild);\n        if (self.errorScript) {\n            head.insertBefore(self.errorScript, self.script.nextSibling);\n        }\n    };\n    ScriptRequest.prototype.cleanup = function () {\n        if (this.script) {\n            this.script.onload = this.script.onerror = null;\n            this.script.onreadystatechange = null;\n        }\n        if (this.script && this.script.parentNode) {\n            this.script.parentNode.removeChild(this.script);\n        }\n        if (this.errorScript && this.errorScript.parentNode) {\n            this.errorScript.parentNode.removeChild(this.errorScript);\n        }\n        this.script = null;\n        this.errorScript = null;\n    };\n    return ScriptRequest;\n}());\n/* harmony default export */ var script_request = (ScriptRequest);\n\n// CONCATENATED MODULE: ./src/runtimes/web/dom/jsonp_request.ts\n\n\nvar jsonp_request_JSONPRequest = (function () {\n    function JSONPRequest(url, data) {\n        this.url = url;\n        this.data = data;\n    }\n    JSONPRequest.prototype.send = function (receiver) {\n        if (this.request) {\n            return;\n        }\n        var query = buildQueryString(this.data);\n        var url = this.url + '/' + receiver.number + '?' + query;\n        this.request = runtime.createScriptRequest(url);\n        this.request.send(receiver);\n    };\n    JSONPRequest.prototype.cleanup = function () {\n        if (this.request) {\n            this.request.cleanup();\n        }\n    };\n    return JSONPRequest;\n}());\n/* harmony default export */ var jsonp_request = (jsonp_request_JSONPRequest);\n\n// CONCATENATED MODULE: ./src/runtimes/web/timeline/jsonp_timeline.ts\n\n\nvar getAgent = function (sender, useTLS) {\n    return function (data, callback) {\n        var scheme = 'http' + (useTLS ? 's' : '') + '://';\n        var url = scheme + (sender.host || sender.options.host) + sender.options.path;\n        var request = runtime.createJSONPRequest(url, data);\n        var receiver = runtime.ScriptReceivers.create(function (error, result) {\n            ScriptReceivers.remove(receiver);\n            request.cleanup();\n            if (result && result.host) {\n                sender.host = result.host;\n            }\n            if (callback) {\n                callback(error, result);\n            }\n        });\n        request.send(receiver);\n    };\n};\nvar jsonp_timeline_jsonp = {\n    name: 'jsonp',\n    getAgent: getAgent\n};\n/* harmony default export */ var jsonp_timeline = (jsonp_timeline_jsonp);\n\n// CONCATENATED MODULE: ./src/core/transports/url_schemes.ts\n\nfunction getGenericURL(baseScheme, params, path) {\n    var scheme = baseScheme + (params.useTLS ? 's' : '');\n    var host = params.useTLS ? params.hostTLS : params.hostNonTLS;\n    return scheme + '://' + host + path;\n}\nfunction getGenericPath(key, queryString) {\n    var path = '/app/' + key;\n    var query = '?protocol=' +\n        defaults.PROTOCOL +\n        '&client=js' +\n        '&version=' +\n        defaults.VERSION +\n        (queryString ? '&' + queryString : '');\n    return path + query;\n}\nvar ws = {\n    getInitial: function (key, params) {\n        var path = (params.httpPath || '') + getGenericPath(key, 'flash=false');\n        return getGenericURL('ws', params, path);\n    }\n};\nvar http = {\n    getInitial: function (key, params) {\n        var path = (params.httpPath || '/pusher') + getGenericPath(key);\n        return getGenericURL('http', params, path);\n    }\n};\nvar sockjs = {\n    getInitial: function (key, params) {\n        return getGenericURL('http', params, params.httpPath || '/pusher');\n    },\n    getPath: function (key, params) {\n        return getGenericPath(key);\n    }\n};\n\n// CONCATENATED MODULE: ./src/core/events/callback_registry.ts\n\nvar callback_registry_CallbackRegistry = (function () {\n    function CallbackRegistry() {\n        this._callbacks = {};\n    }\n    CallbackRegistry.prototype.get = function (name) {\n        return this._callbacks[prefix(name)];\n    };\n    CallbackRegistry.prototype.add = function (name, callback, context) {\n        var prefixedEventName = prefix(name);\n        this._callbacks[prefixedEventName] =\n            this._callbacks[prefixedEventName] || [];\n        this._callbacks[prefixedEventName].push({\n            fn: callback,\n            context: context\n        });\n    };\n    CallbackRegistry.prototype.remove = function (name, callback, context) {\n        if (!name && !callback && !context) {\n            this._callbacks = {};\n            return;\n        }\n        var names = name ? [prefix(name)] : keys(this._callbacks);\n        if (callback || context) {\n            this.removeCallback(names, callback, context);\n        }\n        else {\n            this.removeAllCallbacks(names);\n        }\n    };\n    CallbackRegistry.prototype.removeCallback = function (names, callback, context) {\n        apply(names, function (name) {\n            this._callbacks[name] = filter(this._callbacks[name] || [], function (binding) {\n                return ((callback && callback !== binding.fn) ||\n                    (context && context !== binding.context));\n            });\n            if (this._callbacks[name].length === 0) {\n                delete this._callbacks[name];\n            }\n        }, this);\n    };\n    CallbackRegistry.prototype.removeAllCallbacks = function (names) {\n        apply(names, function (name) {\n            delete this._callbacks[name];\n        }, this);\n    };\n    return CallbackRegistry;\n}());\n/* harmony default export */ var callback_registry = (callback_registry_CallbackRegistry);\nfunction prefix(name) {\n    return '_' + name;\n}\n\n// CONCATENATED MODULE: ./src/core/events/dispatcher.ts\n\n\nvar dispatcher_Dispatcher = (function () {\n    function Dispatcher(failThrough) {\n        this.callbacks = new callback_registry();\n        this.global_callbacks = [];\n        this.failThrough = failThrough;\n    }\n    Dispatcher.prototype.bind = function (eventName, callback, context) {\n        this.callbacks.add(eventName, callback, context);\n        return this;\n    };\n    Dispatcher.prototype.bind_global = function (callback) {\n        this.global_callbacks.push(callback);\n        return this;\n    };\n    Dispatcher.prototype.unbind = function (eventName, callback, context) {\n        this.callbacks.remove(eventName, callback, context);\n        return this;\n    };\n    Dispatcher.prototype.unbind_global = function (callback) {\n        if (!callback) {\n            this.global_callbacks = [];\n            return this;\n        }\n        this.global_callbacks = filter(this.global_callbacks || [], function (c) { return c !== callback; });\n        return this;\n    };\n    Dispatcher.prototype.unbind_all = function () {\n        this.unbind();\n        this.unbind_global();\n        return this;\n    };\n    Dispatcher.prototype.emit = function (eventName, data, metadata) {\n        for (var i = 0; i < this.global_callbacks.length; i++) {\n            this.global_callbacks[i](eventName, data);\n        }\n        var callbacks = this.callbacks.get(eventName);\n        var args = [];\n        if (metadata) {\n            args.push(data, metadata);\n        }\n        else if (data) {\n            args.push(data);\n        }\n        if (callbacks && callbacks.length > 0) {\n            for (var i = 0; i < callbacks.length; i++) {\n                callbacks[i].fn.apply(callbacks[i].context || window, args);\n            }\n        }\n        else if (this.failThrough) {\n            this.failThrough(eventName, data);\n        }\n        return this;\n    };\n    return Dispatcher;\n}());\n/* harmony default export */ var dispatcher = (dispatcher_Dispatcher);\n\n// CONCATENATED MODULE: ./src/core/transports/transport_connection.ts\nvar transport_connection_extends = ( false) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n\n\n\n\n\nvar transport_connection_TransportConnection = (function (_super) {\n    transport_connection_extends(TransportConnection, _super);\n    function TransportConnection(hooks, name, priority, key, options) {\n        var _this = _super.call(this) || this;\n        _this.initialize = runtime.transportConnectionInitializer;\n        _this.hooks = hooks;\n        _this.name = name;\n        _this.priority = priority;\n        _this.key = key;\n        _this.options = options;\n        _this.state = 'new';\n        _this.timeline = options.timeline;\n        _this.activityTimeout = options.activityTimeout;\n        _this.id = _this.timeline.generateUniqueID();\n        return _this;\n    }\n    TransportConnection.prototype.handlesActivityChecks = function () {\n        return Boolean(this.hooks.handlesActivityChecks);\n    };\n    TransportConnection.prototype.supportsPing = function () {\n        return Boolean(this.hooks.supportsPing);\n    };\n    TransportConnection.prototype.connect = function () {\n        var _this = this;\n        if (this.socket || this.state !== 'initialized') {\n            return false;\n        }\n        var url = this.hooks.urls.getInitial(this.key, this.options);\n        try {\n            this.socket = this.hooks.getSocket(url, this.options);\n        }\n        catch (e) {\n            util.defer(function () {\n                _this.onError(e);\n                _this.changeState('closed');\n            });\n            return false;\n        }\n        this.bindListeners();\n        logger.debug('Connecting', { transport: this.name, url: url });\n        this.changeState('connecting');\n        return true;\n    };\n    TransportConnection.prototype.close = function () {\n        if (this.socket) {\n            this.socket.close();\n            return true;\n        }\n        else {\n            return false;\n        }\n    };\n    TransportConnection.prototype.send = function (data) {\n        var _this = this;\n        if (this.state === 'open') {\n            util.defer(function () {\n                if (_this.socket) {\n                    _this.socket.send(data);\n                }\n            });\n            return true;\n        }\n        else {\n            return false;\n        }\n    };\n    TransportConnection.prototype.ping = function () {\n        if (this.state === 'open' && this.supportsPing()) {\n            this.socket.ping();\n        }\n    };\n    TransportConnection.prototype.onOpen = function () {\n        if (this.hooks.beforeOpen) {\n            this.hooks.beforeOpen(this.socket, this.hooks.urls.getPath(this.key, this.options));\n        }\n        this.changeState('open');\n        this.socket.onopen = undefined;\n    };\n    TransportConnection.prototype.onError = function (error) {\n        this.emit('error', { type: 'WebSocketError', error: error });\n        this.timeline.error(this.buildTimelineMessage({ error: error.toString() }));\n    };\n    TransportConnection.prototype.onClose = function (closeEvent) {\n        if (closeEvent) {\n            this.changeState('closed', {\n                code: closeEvent.code,\n                reason: closeEvent.reason,\n                wasClean: closeEvent.wasClean\n            });\n        }\n        else {\n            this.changeState('closed');\n        }\n        this.unbindListeners();\n        this.socket = undefined;\n    };\n    TransportConnection.prototype.onMessage = function (message) {\n        this.emit('message', message);\n    };\n    TransportConnection.prototype.onActivity = function () {\n        this.emit('activity');\n    };\n    TransportConnection.prototype.bindListeners = function () {\n        var _this = this;\n        this.socket.onopen = function () {\n            _this.onOpen();\n        };\n        this.socket.onerror = function (error) {\n            _this.onError(error);\n        };\n        this.socket.onclose = function (closeEvent) {\n            _this.onClose(closeEvent);\n        };\n        this.socket.onmessage = function (message) {\n            _this.onMessage(message);\n        };\n        if (this.supportsPing()) {\n            this.socket.onactivity = function () {\n                _this.onActivity();\n            };\n        }\n    };\n    TransportConnection.prototype.unbindListeners = function () {\n        if (this.socket) {\n            this.socket.onopen = undefined;\n            this.socket.onerror = undefined;\n            this.socket.onclose = undefined;\n            this.socket.onmessage = undefined;\n            if (this.supportsPing()) {\n                this.socket.onactivity = undefined;\n            }\n        }\n    };\n    TransportConnection.prototype.changeState = function (state, params) {\n        this.state = state;\n        this.timeline.info(this.buildTimelineMessage({\n            state: state,\n            params: params\n        }));\n        this.emit(state, params);\n    };\n    TransportConnection.prototype.buildTimelineMessage = function (message) {\n        return extend({ cid: this.id }, message);\n    };\n    return TransportConnection;\n}(dispatcher));\n/* harmony default export */ var transport_connection = (transport_connection_TransportConnection);\n\n// CONCATENATED MODULE: ./src/core/transports/transport.ts\n\nvar transport_Transport = (function () {\n    function Transport(hooks) {\n        this.hooks = hooks;\n    }\n    Transport.prototype.isSupported = function (environment) {\n        return this.hooks.isSupported(environment);\n    };\n    Transport.prototype.createConnection = function (name, priority, key, options) {\n        return new transport_connection(this.hooks, name, priority, key, options);\n    };\n    return Transport;\n}());\n/* harmony default export */ var transports_transport = (transport_Transport);\n\n// CONCATENATED MODULE: ./src/runtimes/isomorphic/transports/transports.ts\n\n\n\n\nvar WSTransport = new transports_transport({\n    urls: ws,\n    handlesActivityChecks: false,\n    supportsPing: false,\n    isInitialized: function () {\n        return Boolean(runtime.getWebSocketAPI());\n    },\n    isSupported: function () {\n        return Boolean(runtime.getWebSocketAPI());\n    },\n    getSocket: function (url) {\n        return runtime.createWebSocket(url);\n    }\n});\nvar httpConfiguration = {\n    urls: http,\n    handlesActivityChecks: false,\n    supportsPing: true,\n    isInitialized: function () {\n        return true;\n    }\n};\nvar streamingConfiguration = extend({\n    getSocket: function (url) {\n        return runtime.HTTPFactory.createStreamingSocket(url);\n    }\n}, httpConfiguration);\nvar pollingConfiguration = extend({\n    getSocket: function (url) {\n        return runtime.HTTPFactory.createPollingSocket(url);\n    }\n}, httpConfiguration);\nvar xhrConfiguration = {\n    isSupported: function () {\n        return runtime.isXHRSupported();\n    }\n};\nvar XHRStreamingTransport = new transports_transport((extend({}, streamingConfiguration, xhrConfiguration)));\nvar XHRPollingTransport = new transports_transport(extend({}, pollingConfiguration, xhrConfiguration));\nvar Transports = {\n    ws: WSTransport,\n    xhr_streaming: XHRStreamingTransport,\n    xhr_polling: XHRPollingTransport\n};\n/* harmony default export */ var transports = (Transports);\n\n// CONCATENATED MODULE: ./src/runtimes/web/transports/transports.ts\n\n\n\n\n\n\nvar SockJSTransport = new transports_transport({\n    file: 'sockjs',\n    urls: sockjs,\n    handlesActivityChecks: true,\n    supportsPing: false,\n    isSupported: function () {\n        return true;\n    },\n    isInitialized: function () {\n        return window.SockJS !== undefined;\n    },\n    getSocket: function (url, options) {\n        return new window.SockJS(url, null, {\n            js_path: Dependencies.getPath('sockjs', {\n                useTLS: options.useTLS\n            }),\n            ignore_null_origin: options.ignoreNullOrigin\n        });\n    },\n    beforeOpen: function (socket, path) {\n        socket.send(JSON.stringify({\n            path: path\n        }));\n    }\n});\nvar xdrConfiguration = {\n    isSupported: function (environment) {\n        var yes = runtime.isXDRSupported(environment.useTLS);\n        return yes;\n    }\n};\nvar XDRStreamingTransport = new transports_transport((extend({}, streamingConfiguration, xdrConfiguration)));\nvar XDRPollingTransport = new transports_transport(extend({}, pollingConfiguration, xdrConfiguration));\ntransports.xdr_streaming = XDRStreamingTransport;\ntransports.xdr_polling = XDRPollingTransport;\ntransports.sockjs = SockJSTransport;\n/* harmony default export */ var transports_transports = (transports);\n\n// CONCATENATED MODULE: ./src/runtimes/web/net_info.ts\nvar net_info_extends = ( false) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n\nvar NetInfo = (function (_super) {\n    net_info_extends(NetInfo, _super);\n    function NetInfo() {\n        var _this = _super.call(this) || this;\n        var self = _this;\n        if (window.addEventListener !== undefined) {\n            window.addEventListener('online', function () {\n                self.emit('online');\n            }, false);\n            window.addEventListener('offline', function () {\n                self.emit('offline');\n            }, false);\n        }\n        return _this;\n    }\n    NetInfo.prototype.isOnline = function () {\n        if (window.navigator.onLine === undefined) {\n            return true;\n        }\n        else {\n            return window.navigator.onLine;\n        }\n    };\n    return NetInfo;\n}(dispatcher));\n\nvar net_info_Network = new NetInfo();\n\n// CONCATENATED MODULE: ./src/core/transports/assistant_to_the_transport_manager.ts\n\n\nvar assistant_to_the_transport_manager_AssistantToTheTransportManager = (function () {\n    function AssistantToTheTransportManager(manager, transport, options) {\n        this.manager = manager;\n        this.transport = transport;\n        this.minPingDelay = options.minPingDelay;\n        this.maxPingDelay = options.maxPingDelay;\n        this.pingDelay = undefined;\n    }\n    AssistantToTheTransportManager.prototype.createConnection = function (name, priority, key, options) {\n        var _this = this;\n        options = extend({}, options, {\n            activityTimeout: this.pingDelay\n        });\n        var connection = this.transport.createConnection(name, priority, key, options);\n        var openTimestamp = null;\n        var onOpen = function () {\n            connection.unbind('open', onOpen);\n            connection.bind('closed', onClosed);\n            openTimestamp = util.now();\n        };\n        var onClosed = function (closeEvent) {\n            connection.unbind('closed', onClosed);\n            if (closeEvent.code === 1002 || closeEvent.code === 1003) {\n                _this.manager.reportDeath();\n            }\n            else if (!closeEvent.wasClean && openTimestamp) {\n                var lifespan = util.now() - openTimestamp;\n                if (lifespan < 2 * _this.maxPingDelay) {\n                    _this.manager.reportDeath();\n                    _this.pingDelay = Math.max(lifespan / 2, _this.minPingDelay);\n                }\n            }\n        };\n        connection.bind('open', onOpen);\n        return connection;\n    };\n    AssistantToTheTransportManager.prototype.isSupported = function (environment) {\n        return this.manager.isAlive() && this.transport.isSupported(environment);\n    };\n    return AssistantToTheTransportManager;\n}());\n/* harmony default export */ var assistant_to_the_transport_manager = (assistant_to_the_transport_manager_AssistantToTheTransportManager);\n\n// CONCATENATED MODULE: ./src/core/connection/protocol/protocol.ts\nvar Protocol = {\n    decodeMessage: function (messageEvent) {\n        try {\n            var messageData = JSON.parse(messageEvent.data);\n            var pusherEventData = messageData.data;\n            if (typeof pusherEventData === 'string') {\n                try {\n                    pusherEventData = JSON.parse(messageData.data);\n                }\n                catch (e) { }\n            }\n            var pusherEvent = {\n                event: messageData.event,\n                channel: messageData.channel,\n                data: pusherEventData\n            };\n            if (messageData.user_id) {\n                pusherEvent.user_id = messageData.user_id;\n            }\n            return pusherEvent;\n        }\n        catch (e) {\n            throw { type: 'MessageParseError', error: e, data: messageEvent.data };\n        }\n    },\n    encodeMessage: function (event) {\n        return JSON.stringify(event);\n    },\n    processHandshake: function (messageEvent) {\n        var message = Protocol.decodeMessage(messageEvent);\n        if (message.event === 'pusher:connection_established') {\n            if (!message.data.activity_timeout) {\n                throw 'No activity timeout specified in handshake';\n            }\n            return {\n                action: 'connected',\n                id: message.data.socket_id,\n                activityTimeout: message.data.activity_timeout * 1000\n            };\n        }\n        else if (message.event === 'pusher:error') {\n            return {\n                action: this.getCloseAction(message.data),\n                error: this.getCloseError(message.data)\n            };\n        }\n        else {\n            throw 'Invalid handshake';\n        }\n    },\n    getCloseAction: function (closeEvent) {\n        if (closeEvent.code < 4000) {\n            if (closeEvent.code >= 1002 && closeEvent.code <= 1004) {\n                return 'backoff';\n            }\n            else {\n                return null;\n            }\n        }\n        else if (closeEvent.code === 4000) {\n            return 'tls_only';\n        }\n        else if (closeEvent.code < 4100) {\n            return 'refused';\n        }\n        else if (closeEvent.code < 4200) {\n            return 'backoff';\n        }\n        else if (closeEvent.code < 4300) {\n            return 'retry';\n        }\n        else {\n            return 'refused';\n        }\n    },\n    getCloseError: function (closeEvent) {\n        if (closeEvent.code !== 1000 && closeEvent.code !== 1001) {\n            return {\n                type: 'PusherError',\n                data: {\n                    code: closeEvent.code,\n                    message: closeEvent.reason || closeEvent.message\n                }\n            };\n        }\n        else {\n            return null;\n        }\n    }\n};\n/* harmony default export */ var protocol_protocol = (Protocol);\n\n// CONCATENATED MODULE: ./src/core/connection/connection.ts\nvar connection_extends = ( false) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n\n\n\n\nvar connection_Connection = (function (_super) {\n    connection_extends(Connection, _super);\n    function Connection(id, transport) {\n        var _this = _super.call(this) || this;\n        _this.id = id;\n        _this.transport = transport;\n        _this.activityTimeout = transport.activityTimeout;\n        _this.bindListeners();\n        return _this;\n    }\n    Connection.prototype.handlesActivityChecks = function () {\n        return this.transport.handlesActivityChecks();\n    };\n    Connection.prototype.send = function (data) {\n        return this.transport.send(data);\n    };\n    Connection.prototype.send_event = function (name, data, channel) {\n        var event = { event: name, data: data };\n        if (channel) {\n            event.channel = channel;\n        }\n        logger.debug('Event sent', event);\n        return this.send(protocol_protocol.encodeMessage(event));\n    };\n    Connection.prototype.ping = function () {\n        if (this.transport.supportsPing()) {\n            this.transport.ping();\n        }\n        else {\n            this.send_event('pusher:ping', {});\n        }\n    };\n    Connection.prototype.close = function () {\n        this.transport.close();\n    };\n    Connection.prototype.bindListeners = function () {\n        var _this = this;\n        var listeners = {\n            message: function (messageEvent) {\n                var pusherEvent;\n                try {\n                    pusherEvent = protocol_protocol.decodeMessage(messageEvent);\n                }\n                catch (e) {\n                    _this.emit('error', {\n                        type: 'MessageParseError',\n                        error: e,\n                        data: messageEvent.data\n                    });\n                }\n                if (pusherEvent !== undefined) {\n                    logger.debug('Event recd', pusherEvent);\n                    switch (pusherEvent.event) {\n                        case 'pusher:error':\n                            _this.emit('error', {\n                                type: 'PusherError',\n                                data: pusherEvent.data\n                            });\n                            break;\n                        case 'pusher:ping':\n                            _this.emit('ping');\n                            break;\n                        case 'pusher:pong':\n                            _this.emit('pong');\n                            break;\n                    }\n                    _this.emit('message', pusherEvent);\n                }\n            },\n            activity: function () {\n                _this.emit('activity');\n            },\n            error: function (error) {\n                _this.emit('error', error);\n            },\n            closed: function (closeEvent) {\n                unbindListeners();\n                if (closeEvent && closeEvent.code) {\n                    _this.handleCloseEvent(closeEvent);\n                }\n                _this.transport = null;\n                _this.emit('closed');\n            }\n        };\n        var unbindListeners = function () {\n            objectApply(listeners, function (listener, event) {\n                _this.transport.unbind(event, listener);\n            });\n        };\n        objectApply(listeners, function (listener, event) {\n            _this.transport.bind(event, listener);\n        });\n    };\n    Connection.prototype.handleCloseEvent = function (closeEvent) {\n        var action = protocol_protocol.getCloseAction(closeEvent);\n        var error = protocol_protocol.getCloseError(closeEvent);\n        if (error) {\n            this.emit('error', error);\n        }\n        if (action) {\n            this.emit(action, { action: action, error: error });\n        }\n    };\n    return Connection;\n}(dispatcher));\n/* harmony default export */ var connection_connection = (connection_Connection);\n\n// CONCATENATED MODULE: ./src/core/connection/handshake/index.ts\n\n\n\nvar handshake_Handshake = (function () {\n    function Handshake(transport, callback) {\n        this.transport = transport;\n        this.callback = callback;\n        this.bindListeners();\n    }\n    Handshake.prototype.close = function () {\n        this.unbindListeners();\n        this.transport.close();\n    };\n    Handshake.prototype.bindListeners = function () {\n        var _this = this;\n        this.onMessage = function (m) {\n            _this.unbindListeners();\n            var result;\n            try {\n                result = protocol_protocol.processHandshake(m);\n            }\n            catch (e) {\n                _this.finish('error', { error: e });\n                _this.transport.close();\n                return;\n            }\n            if (result.action === 'connected') {\n                _this.finish('connected', {\n                    connection: new connection_connection(result.id, _this.transport),\n                    activityTimeout: result.activityTimeout\n                });\n            }\n            else {\n                _this.finish(result.action, { error: result.error });\n                _this.transport.close();\n            }\n        };\n        this.onClosed = function (closeEvent) {\n            _this.unbindListeners();\n            var action = protocol_protocol.getCloseAction(closeEvent) || 'backoff';\n            var error = protocol_protocol.getCloseError(closeEvent);\n            _this.finish(action, { error: error });\n        };\n        this.transport.bind('message', this.onMessage);\n        this.transport.bind('closed', this.onClosed);\n    };\n    Handshake.prototype.unbindListeners = function () {\n        this.transport.unbind('message', this.onMessage);\n        this.transport.unbind('closed', this.onClosed);\n    };\n    Handshake.prototype.finish = function (action, params) {\n        this.callback(extend({ transport: this.transport, action: action }, params));\n    };\n    return Handshake;\n}());\n/* harmony default export */ var connection_handshake = (handshake_Handshake);\n\n// CONCATENATED MODULE: ./src/core/timeline/timeline_sender.ts\n\nvar timeline_sender_TimelineSender = (function () {\n    function TimelineSender(timeline, options) {\n        this.timeline = timeline;\n        this.options = options || {};\n    }\n    TimelineSender.prototype.send = function (useTLS, callback) {\n        if (this.timeline.isEmpty()) {\n            return;\n        }\n        this.timeline.send(runtime.TimelineTransport.getAgent(this, useTLS), callback);\n    };\n    return TimelineSender;\n}());\n/* harmony default export */ var timeline_sender = (timeline_sender_TimelineSender);\n\n// CONCATENATED MODULE: ./src/core/channels/channel.ts\nvar channel_extends = ( false) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n\n\n\n\n\nvar channel_Channel = (function (_super) {\n    channel_extends(Channel, _super);\n    function Channel(name, pusher) {\n        var _this = _super.call(this, function (event, data) {\n            logger.debug('No callbacks on ' + name + ' for ' + event);\n        }) || this;\n        _this.name = name;\n        _this.pusher = pusher;\n        _this.subscribed = false;\n        _this.subscriptionPending = false;\n        _this.subscriptionCancelled = false;\n        return _this;\n    }\n    Channel.prototype.authorize = function (socketId, callback) {\n        return callback(null, { auth: '' });\n    };\n    Channel.prototype.trigger = function (event, data) {\n        if (event.indexOf('client-') !== 0) {\n            throw new BadEventName(\"Event '\" + event + \"' does not start with 'client-'\");\n        }\n        if (!this.subscribed) {\n            var suffix = url_store.buildLogSuffix('triggeringClientEvents');\n            logger.warn(\"Client event triggered before channel 'subscription_succeeded' event . \" + suffix);\n        }\n        return this.pusher.send_event(event, data, this.name);\n    };\n    Channel.prototype.disconnect = function () {\n        this.subscribed = false;\n        this.subscriptionPending = false;\n    };\n    Channel.prototype.handleEvent = function (event) {\n        var eventName = event.event;\n        var data = event.data;\n        if (eventName === 'pusher_internal:subscription_succeeded') {\n            this.handleSubscriptionSucceededEvent(event);\n        }\n        else if (eventName === 'pusher_internal:subscription_count') {\n            this.handleSubscriptionCountEvent(event);\n        }\n        else if (eventName.indexOf('pusher_internal:') !== 0) {\n            var metadata = {};\n            this.emit(eventName, data, metadata);\n        }\n    };\n    Channel.prototype.handleSubscriptionSucceededEvent = function (event) {\n        this.subscriptionPending = false;\n        this.subscribed = true;\n        if (this.subscriptionCancelled) {\n            this.pusher.unsubscribe(this.name);\n        }\n        else {\n            this.emit('pusher:subscription_succeeded', event.data);\n        }\n    };\n    Channel.prototype.handleSubscriptionCountEvent = function (event) {\n        if (event.data.subscription_count) {\n            this.subscriptionCount = event.data.subscription_count;\n        }\n        this.emit('pusher:subscription_count', event.data);\n    };\n    Channel.prototype.subscribe = function () {\n        var _this = this;\n        if (this.subscribed) {\n            return;\n        }\n        this.subscriptionPending = true;\n        this.subscriptionCancelled = false;\n        this.authorize(this.pusher.connection.socket_id, function (error, data) {\n            if (error) {\n                _this.subscriptionPending = false;\n                logger.error(error.toString());\n                _this.emit('pusher:subscription_error', Object.assign({}, {\n                    type: 'AuthError',\n                    error: error.message\n                }, error instanceof HTTPAuthError ? { status: error.status } : {}));\n            }\n            else {\n                _this.pusher.send_event('pusher:subscribe', {\n                    auth: data.auth,\n                    channel_data: data.channel_data,\n                    channel: _this.name\n                });\n            }\n        });\n    };\n    Channel.prototype.unsubscribe = function () {\n        this.subscribed = false;\n        this.pusher.send_event('pusher:unsubscribe', {\n            channel: this.name\n        });\n    };\n    Channel.prototype.cancelSubscription = function () {\n        this.subscriptionCancelled = true;\n    };\n    Channel.prototype.reinstateSubscription = function () {\n        this.subscriptionCancelled = false;\n    };\n    return Channel;\n}(dispatcher));\n/* harmony default export */ var channels_channel = (channel_Channel);\n\n// CONCATENATED MODULE: ./src/core/channels/private_channel.ts\nvar private_channel_extends = ( false) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n\nvar PrivateChannel = (function (_super) {\n    private_channel_extends(PrivateChannel, _super);\n    function PrivateChannel() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    PrivateChannel.prototype.authorize = function (socketId, callback) {\n        return this.pusher.config.channelAuthorizer({\n            channelName: this.name,\n            socketId: socketId\n        }, callback);\n    };\n    return PrivateChannel;\n}(channels_channel));\n/* harmony default export */ var private_channel = (PrivateChannel);\n\n// CONCATENATED MODULE: ./src/core/channels/members.ts\n\nvar members_Members = (function () {\n    function Members() {\n        this.reset();\n    }\n    Members.prototype.get = function (id) {\n        if (Object.prototype.hasOwnProperty.call(this.members, id)) {\n            return {\n                id: id,\n                info: this.members[id]\n            };\n        }\n        else {\n            return null;\n        }\n    };\n    Members.prototype.each = function (callback) {\n        var _this = this;\n        objectApply(this.members, function (member, id) {\n            callback(_this.get(id));\n        });\n    };\n    Members.prototype.setMyID = function (id) {\n        this.myID = id;\n    };\n    Members.prototype.onSubscription = function (subscriptionData) {\n        this.members = subscriptionData.presence.hash;\n        this.count = subscriptionData.presence.count;\n        this.me = this.get(this.myID);\n    };\n    Members.prototype.addMember = function (memberData) {\n        if (this.get(memberData.user_id) === null) {\n            this.count++;\n        }\n        this.members[memberData.user_id] = memberData.user_info;\n        return this.get(memberData.user_id);\n    };\n    Members.prototype.removeMember = function (memberData) {\n        var member = this.get(memberData.user_id);\n        if (member) {\n            delete this.members[memberData.user_id];\n            this.count--;\n        }\n        return member;\n    };\n    Members.prototype.reset = function () {\n        this.members = {};\n        this.count = 0;\n        this.myID = null;\n        this.me = null;\n    };\n    return Members;\n}());\n/* harmony default export */ var members = (members_Members);\n\n// CONCATENATED MODULE: ./src/core/channels/presence_channel.ts\nvar presence_channel_extends = ( false) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nvar __awaiter = ( false) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nvar __generator = ( false) || function (thisArg, body) {\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n    function verb(n) { return function (v) { return step([n, v]); }; }\n    function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n            if (y = 0, t) op = [op[0] & 2, t.value];\n            switch (op[0]) {\n                case 0: case 1: t = op; break;\n                case 4: _.label++; return { value: op[1], done: false };\n                case 5: _.label++; y = op[1]; op = [0]; continue;\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\n                default:\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n                    if (t[2]) _.ops.pop();\n                    _.trys.pop(); continue;\n            }\n            op = body.call(thisArg, _);\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n    }\n};\n\n\n\n\nvar presence_channel_PresenceChannel = (function (_super) {\n    presence_channel_extends(PresenceChannel, _super);\n    function PresenceChannel(name, pusher) {\n        var _this = _super.call(this, name, pusher) || this;\n        _this.members = new members();\n        return _this;\n    }\n    PresenceChannel.prototype.authorize = function (socketId, callback) {\n        var _this = this;\n        _super.prototype.authorize.call(this, socketId, function (error, authData) { return __awaiter(_this, void 0, void 0, function () {\n            var channelData, suffix;\n            return __generator(this, function (_a) {\n                switch (_a.label) {\n                    case 0:\n                        if (!!error) return [3, 3];\n                        authData = authData;\n                        if (!(authData.channel_data != null)) return [3, 1];\n                        channelData = JSON.parse(authData.channel_data);\n                        this.members.setMyID(channelData.user_id);\n                        return [3, 3];\n                    case 1: return [4, this.pusher.user.signinDonePromise];\n                    case 2:\n                        _a.sent();\n                        if (this.pusher.user.user_data != null) {\n                            this.members.setMyID(this.pusher.user.user_data.id);\n                        }\n                        else {\n                            suffix = url_store.buildLogSuffix('authorizationEndpoint');\n                            logger.error(\"Invalid auth response for channel '\" + this.name + \"', \" +\n                                (\"expected 'channel_data' field. \" + suffix + \", \") +\n                                \"or the user should be signed in.\");\n                            callback('Invalid auth response');\n                            return [2];\n                        }\n                        _a.label = 3;\n                    case 3:\n                        callback(error, authData);\n                        return [2];\n                }\n            });\n        }); });\n    };\n    PresenceChannel.prototype.handleEvent = function (event) {\n        var eventName = event.event;\n        if (eventName.indexOf('pusher_internal:') === 0) {\n            this.handleInternalEvent(event);\n        }\n        else {\n            var data = event.data;\n            var metadata = {};\n            if (event.user_id) {\n                metadata.user_id = event.user_id;\n            }\n            this.emit(eventName, data, metadata);\n        }\n    };\n    PresenceChannel.prototype.handleInternalEvent = function (event) {\n        var eventName = event.event;\n        var data = event.data;\n        switch (eventName) {\n            case 'pusher_internal:subscription_succeeded':\n                this.handleSubscriptionSucceededEvent(event);\n                break;\n            case 'pusher_internal:subscription_count':\n                this.handleSubscriptionCountEvent(event);\n                break;\n            case 'pusher_internal:member_added':\n                var addedMember = this.members.addMember(data);\n                this.emit('pusher:member_added', addedMember);\n                break;\n            case 'pusher_internal:member_removed':\n                var removedMember = this.members.removeMember(data);\n                if (removedMember) {\n                    this.emit('pusher:member_removed', removedMember);\n                }\n                break;\n        }\n    };\n    PresenceChannel.prototype.handleSubscriptionSucceededEvent = function (event) {\n        this.subscriptionPending = false;\n        this.subscribed = true;\n        if (this.subscriptionCancelled) {\n            this.pusher.unsubscribe(this.name);\n        }\n        else {\n            this.members.onSubscription(event.data);\n            this.emit('pusher:subscription_succeeded', this.members);\n        }\n    };\n    PresenceChannel.prototype.disconnect = function () {\n        this.members.reset();\n        _super.prototype.disconnect.call(this);\n    };\n    return PresenceChannel;\n}(private_channel));\n/* harmony default export */ var presence_channel = (presence_channel_PresenceChannel);\n\n// EXTERNAL MODULE: ./node_modules/@stablelib/utf8/lib/utf8.js\nvar utf8 = __nested_webpack_require_20105__(1);\n\n// EXTERNAL MODULE: ./node_modules/@stablelib/base64/lib/base64.js\nvar base64 = __nested_webpack_require_20105__(0);\n\n// CONCATENATED MODULE: ./src/core/channels/encrypted_channel.ts\nvar encrypted_channel_extends = ( false) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n\n\n\n\n\nvar encrypted_channel_EncryptedChannel = (function (_super) {\n    encrypted_channel_extends(EncryptedChannel, _super);\n    function EncryptedChannel(name, pusher, nacl) {\n        var _this = _super.call(this, name, pusher) || this;\n        _this.key = null;\n        _this.nacl = nacl;\n        return _this;\n    }\n    EncryptedChannel.prototype.authorize = function (socketId, callback) {\n        var _this = this;\n        _super.prototype.authorize.call(this, socketId, function (error, authData) {\n            if (error) {\n                callback(error, authData);\n                return;\n            }\n            var sharedSecret = authData['shared_secret'];\n            if (!sharedSecret) {\n                callback(new Error(\"No shared_secret key in auth payload for encrypted channel: \" + _this.name), null);\n                return;\n            }\n            _this.key = Object(base64[\"decode\"])(sharedSecret);\n            delete authData['shared_secret'];\n            callback(null, authData);\n        });\n    };\n    EncryptedChannel.prototype.trigger = function (event, data) {\n        throw new UnsupportedFeature('Client events are not currently supported for encrypted channels');\n    };\n    EncryptedChannel.prototype.handleEvent = function (event) {\n        var eventName = event.event;\n        var data = event.data;\n        if (eventName.indexOf('pusher_internal:') === 0 ||\n            eventName.indexOf('pusher:') === 0) {\n            _super.prototype.handleEvent.call(this, event);\n            return;\n        }\n        this.handleEncryptedEvent(eventName, data);\n    };\n    EncryptedChannel.prototype.handleEncryptedEvent = function (event, data) {\n        var _this = this;\n        if (!this.key) {\n            logger.debug('Received encrypted event before key has been retrieved from the authEndpoint');\n            return;\n        }\n        if (!data.ciphertext || !data.nonce) {\n            logger.error('Unexpected format for encrypted event, expected object with `ciphertext` and `nonce` fields, got: ' +\n                data);\n            return;\n        }\n        var cipherText = Object(base64[\"decode\"])(data.ciphertext);\n        if (cipherText.length < this.nacl.secretbox.overheadLength) {\n            logger.error(\"Expected encrypted event ciphertext length to be \" + this.nacl.secretbox.overheadLength + \", got: \" + cipherText.length);\n            return;\n        }\n        var nonce = Object(base64[\"decode\"])(data.nonce);\n        if (nonce.length < this.nacl.secretbox.nonceLength) {\n            logger.error(\"Expected encrypted event nonce length to be \" + this.nacl.secretbox.nonceLength + \", got: \" + nonce.length);\n            return;\n        }\n        var bytes = this.nacl.secretbox.open(cipherText, nonce, this.key);\n        if (bytes === null) {\n            logger.debug('Failed to decrypt an event, probably because it was encrypted with a different key. Fetching a new key from the authEndpoint...');\n            this.authorize(this.pusher.connection.socket_id, function (error, authData) {\n                if (error) {\n                    logger.error(\"Failed to make a request to the authEndpoint: \" + authData + \". Unable to fetch new key, so dropping encrypted event\");\n                    return;\n                }\n                bytes = _this.nacl.secretbox.open(cipherText, nonce, _this.key);\n                if (bytes === null) {\n                    logger.error(\"Failed to decrypt event with new key. Dropping encrypted event\");\n                    return;\n                }\n                _this.emit(event, _this.getDataToEmit(bytes));\n                return;\n            });\n            return;\n        }\n        this.emit(event, this.getDataToEmit(bytes));\n    };\n    EncryptedChannel.prototype.getDataToEmit = function (bytes) {\n        var raw = Object(utf8[\"decode\"])(bytes);\n        try {\n            return JSON.parse(raw);\n        }\n        catch (_a) {\n            return raw;\n        }\n    };\n    return EncryptedChannel;\n}(private_channel));\n/* harmony default export */ var encrypted_channel = (encrypted_channel_EncryptedChannel);\n\n// CONCATENATED MODULE: ./src/core/connection/connection_manager.ts\nvar connection_manager_extends = ( false) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n\n\n\n\n\nvar connection_manager_ConnectionManager = (function (_super) {\n    connection_manager_extends(ConnectionManager, _super);\n    function ConnectionManager(key, options) {\n        var _this = _super.call(this) || this;\n        _this.state = 'initialized';\n        _this.connection = null;\n        _this.key = key;\n        _this.options = options;\n        _this.timeline = _this.options.timeline;\n        _this.usingTLS = _this.options.useTLS;\n        _this.errorCallbacks = _this.buildErrorCallbacks();\n        _this.connectionCallbacks = _this.buildConnectionCallbacks(_this.errorCallbacks);\n        _this.handshakeCallbacks = _this.buildHandshakeCallbacks(_this.errorCallbacks);\n        var Network = runtime.getNetwork();\n        Network.bind('online', function () {\n            _this.timeline.info({ netinfo: 'online' });\n            if (_this.state === 'connecting' || _this.state === 'unavailable') {\n                _this.retryIn(0);\n            }\n        });\n        Network.bind('offline', function () {\n            _this.timeline.info({ netinfo: 'offline' });\n            if (_this.connection) {\n                _this.sendActivityCheck();\n            }\n        });\n        _this.updateStrategy();\n        return _this;\n    }\n    ConnectionManager.prototype.connect = function () {\n        if (this.connection || this.runner) {\n            return;\n        }\n        if (!this.strategy.isSupported()) {\n            this.updateState('failed');\n            return;\n        }\n        this.updateState('connecting');\n        this.startConnecting();\n        this.setUnavailableTimer();\n    };\n    ConnectionManager.prototype.send = function (data) {\n        if (this.connection) {\n            return this.connection.send(data);\n        }\n        else {\n            return false;\n        }\n    };\n    ConnectionManager.prototype.send_event = function (name, data, channel) {\n        if (this.connection) {\n            return this.connection.send_event(name, data, channel);\n        }\n        else {\n            return false;\n        }\n    };\n    ConnectionManager.prototype.disconnect = function () {\n        this.disconnectInternally();\n        this.updateState('disconnected');\n    };\n    ConnectionManager.prototype.isUsingTLS = function () {\n        return this.usingTLS;\n    };\n    ConnectionManager.prototype.startConnecting = function () {\n        var _this = this;\n        var callback = function (error, handshake) {\n            if (error) {\n                _this.runner = _this.strategy.connect(0, callback);\n            }\n            else {\n                if (handshake.action === 'error') {\n                    _this.emit('error', {\n                        type: 'HandshakeError',\n                        error: handshake.error\n                    });\n                    _this.timeline.error({ handshakeError: handshake.error });\n                }\n                else {\n                    _this.abortConnecting();\n                    _this.handshakeCallbacks[handshake.action](handshake);\n                }\n            }\n        };\n        this.runner = this.strategy.connect(0, callback);\n    };\n    ConnectionManager.prototype.abortConnecting = function () {\n        if (this.runner) {\n            this.runner.abort();\n            this.runner = null;\n        }\n    };\n    ConnectionManager.prototype.disconnectInternally = function () {\n        this.abortConnecting();\n        this.clearRetryTimer();\n        this.clearUnavailableTimer();\n        if (this.connection) {\n            var connection = this.abandonConnection();\n            connection.close();\n        }\n    };\n    ConnectionManager.prototype.updateStrategy = function () {\n        this.strategy = this.options.getStrategy({\n            key: this.key,\n            timeline: this.timeline,\n            useTLS: this.usingTLS\n        });\n    };\n    ConnectionManager.prototype.retryIn = function (delay) {\n        var _this = this;\n        this.timeline.info({ action: 'retry', delay: delay });\n        if (delay > 0) {\n            this.emit('connecting_in', Math.round(delay / 1000));\n        }\n        this.retryTimer = new OneOffTimer(delay || 0, function () {\n            _this.disconnectInternally();\n            _this.connect();\n        });\n    };\n    ConnectionManager.prototype.clearRetryTimer = function () {\n        if (this.retryTimer) {\n            this.retryTimer.ensureAborted();\n            this.retryTimer = null;\n        }\n    };\n    ConnectionManager.prototype.setUnavailableTimer = function () {\n        var _this = this;\n        this.unavailableTimer = new OneOffTimer(this.options.unavailableTimeout, function () {\n            _this.updateState('unavailable');\n        });\n    };\n    ConnectionManager.prototype.clearUnavailableTimer = function () {\n        if (this.unavailableTimer) {\n            this.unavailableTimer.ensureAborted();\n        }\n    };\n    ConnectionManager.prototype.sendActivityCheck = function () {\n        var _this = this;\n        this.stopActivityCheck();\n        this.connection.ping();\n        this.activityTimer = new OneOffTimer(this.options.pongTimeout, function () {\n            _this.timeline.error({ pong_timed_out: _this.options.pongTimeout });\n            _this.retryIn(0);\n        });\n    };\n    ConnectionManager.prototype.resetActivityCheck = function () {\n        var _this = this;\n        this.stopActivityCheck();\n        if (this.connection && !this.connection.handlesActivityChecks()) {\n            this.activityTimer = new OneOffTimer(this.activityTimeout, function () {\n                _this.sendActivityCheck();\n            });\n        }\n    };\n    ConnectionManager.prototype.stopActivityCheck = function () {\n        if (this.activityTimer) {\n            this.activityTimer.ensureAborted();\n        }\n    };\n    ConnectionManager.prototype.buildConnectionCallbacks = function (errorCallbacks) {\n        var _this = this;\n        return extend({}, errorCallbacks, {\n            message: function (message) {\n                _this.resetActivityCheck();\n                _this.emit('message', message);\n            },\n            ping: function () {\n                _this.send_event('pusher:pong', {});\n            },\n            activity: function () {\n                _this.resetActivityCheck();\n            },\n            error: function (error) {\n                _this.emit('error', error);\n            },\n            closed: function () {\n                _this.abandonConnection();\n                if (_this.shouldRetry()) {\n                    _this.retryIn(1000);\n                }\n            }\n        });\n    };\n    ConnectionManager.prototype.buildHandshakeCallbacks = function (errorCallbacks) {\n        var _this = this;\n        return extend({}, errorCallbacks, {\n            connected: function (handshake) {\n                _this.activityTimeout = Math.min(_this.options.activityTimeout, handshake.activityTimeout, handshake.connection.activityTimeout || Infinity);\n                _this.clearUnavailableTimer();\n                _this.setConnection(handshake.connection);\n                _this.socket_id = _this.connection.id;\n                _this.updateState('connected', { socket_id: _this.socket_id });\n            }\n        });\n    };\n    ConnectionManager.prototype.buildErrorCallbacks = function () {\n        var _this = this;\n        var withErrorEmitted = function (callback) {\n            return function (result) {\n                if (result.error) {\n                    _this.emit('error', { type: 'WebSocketError', error: result.error });\n                }\n                callback(result);\n            };\n        };\n        return {\n            tls_only: withErrorEmitted(function () {\n                _this.usingTLS = true;\n                _this.updateStrategy();\n                _this.retryIn(0);\n            }),\n            refused: withErrorEmitted(function () {\n                _this.disconnect();\n            }),\n            backoff: withErrorEmitted(function () {\n                _this.retryIn(1000);\n            }),\n            retry: withErrorEmitted(function () {\n                _this.retryIn(0);\n            })\n        };\n    };\n    ConnectionManager.prototype.setConnection = function (connection) {\n        this.connection = connection;\n        for (var event in this.connectionCallbacks) {\n            this.connection.bind(event, this.connectionCallbacks[event]);\n        }\n        this.resetActivityCheck();\n    };\n    ConnectionManager.prototype.abandonConnection = function () {\n        if (!this.connection) {\n            return;\n        }\n        this.stopActivityCheck();\n        for (var event in this.connectionCallbacks) {\n            this.connection.unbind(event, this.connectionCallbacks[event]);\n        }\n        var connection = this.connection;\n        this.connection = null;\n        return connection;\n    };\n    ConnectionManager.prototype.updateState = function (newState, data) {\n        var previousState = this.state;\n        this.state = newState;\n        if (previousState !== newState) {\n            var newStateDescription = newState;\n            if (newStateDescription === 'connected') {\n                newStateDescription += ' with new socket ID ' + data.socket_id;\n            }\n            logger.debug('State changed', previousState + ' -> ' + newStateDescription);\n            this.timeline.info({ state: newState, params: data });\n            this.emit('state_change', { previous: previousState, current: newState });\n            this.emit(newState, data);\n        }\n    };\n    ConnectionManager.prototype.shouldRetry = function () {\n        return this.state === 'connecting' || this.state === 'connected';\n    };\n    return ConnectionManager;\n}(dispatcher));\n/* harmony default export */ var connection_manager = (connection_manager_ConnectionManager);\n\n// CONCATENATED MODULE: ./src/core/channels/channels.ts\n\n\n\n\nvar channels_Channels = (function () {\n    function Channels() {\n        this.channels = {};\n    }\n    Channels.prototype.add = function (name, pusher) {\n        if (!this.channels[name]) {\n            this.channels[name] = createChannel(name, pusher);\n        }\n        return this.channels[name];\n    };\n    Channels.prototype.all = function () {\n        return values(this.channels);\n    };\n    Channels.prototype.find = function (name) {\n        return this.channels[name];\n    };\n    Channels.prototype.remove = function (name) {\n        var channel = this.channels[name];\n        delete this.channels[name];\n        return channel;\n    };\n    Channels.prototype.disconnect = function () {\n        objectApply(this.channels, function (channel) {\n            channel.disconnect();\n        });\n    };\n    return Channels;\n}());\n/* harmony default export */ var channels = (channels_Channels);\nfunction createChannel(name, pusher) {\n    if (name.indexOf('private-encrypted-') === 0) {\n        if (pusher.config.nacl) {\n            return factory.createEncryptedChannel(name, pusher, pusher.config.nacl);\n        }\n        var errMsg = 'Tried to subscribe to a private-encrypted- channel but no nacl implementation available';\n        var suffix = url_store.buildLogSuffix('encryptedChannelSupport');\n        throw new UnsupportedFeature(errMsg + \". \" + suffix);\n    }\n    else if (name.indexOf('private-') === 0) {\n        return factory.createPrivateChannel(name, pusher);\n    }\n    else if (name.indexOf('presence-') === 0) {\n        return factory.createPresenceChannel(name, pusher);\n    }\n    else if (name.indexOf('#') === 0) {\n        throw new BadChannelName('Cannot create a channel with name \"' + name + '\".');\n    }\n    else {\n        return factory.createChannel(name, pusher);\n    }\n}\n\n// CONCATENATED MODULE: ./src/core/utils/factory.ts\n\n\n\n\n\n\n\n\n\nvar Factory = {\n    createChannels: function () {\n        return new channels();\n    },\n    createConnectionManager: function (key, options) {\n        return new connection_manager(key, options);\n    },\n    createChannel: function (name, pusher) {\n        return new channels_channel(name, pusher);\n    },\n    createPrivateChannel: function (name, pusher) {\n        return new private_channel(name, pusher);\n    },\n    createPresenceChannel: function (name, pusher) {\n        return new presence_channel(name, pusher);\n    },\n    createEncryptedChannel: function (name, pusher, nacl) {\n        return new encrypted_channel(name, pusher, nacl);\n    },\n    createTimelineSender: function (timeline, options) {\n        return new timeline_sender(timeline, options);\n    },\n    createHandshake: function (transport, callback) {\n        return new connection_handshake(transport, callback);\n    },\n    createAssistantToTheTransportManager: function (manager, transport, options) {\n        return new assistant_to_the_transport_manager(manager, transport, options);\n    }\n};\n/* harmony default export */ var factory = (Factory);\n\n// CONCATENATED MODULE: ./src/core/transports/transport_manager.ts\n\nvar transport_manager_TransportManager = (function () {\n    function TransportManager(options) {\n        this.options = options || {};\n        this.livesLeft = this.options.lives || Infinity;\n    }\n    TransportManager.prototype.getAssistant = function (transport) {\n        return factory.createAssistantToTheTransportManager(this, transport, {\n            minPingDelay: this.options.minPingDelay,\n            maxPingDelay: this.options.maxPingDelay\n        });\n    };\n    TransportManager.prototype.isAlive = function () {\n        return this.livesLeft > 0;\n    };\n    TransportManager.prototype.reportDeath = function () {\n        this.livesLeft -= 1;\n    };\n    return TransportManager;\n}());\n/* harmony default export */ var transport_manager = (transport_manager_TransportManager);\n\n// CONCATENATED MODULE: ./src/core/strategies/sequential_strategy.ts\n\n\n\nvar sequential_strategy_SequentialStrategy = (function () {\n    function SequentialStrategy(strategies, options) {\n        this.strategies = strategies;\n        this.loop = Boolean(options.loop);\n        this.failFast = Boolean(options.failFast);\n        this.timeout = options.timeout;\n        this.timeoutLimit = options.timeoutLimit;\n    }\n    SequentialStrategy.prototype.isSupported = function () {\n        return any(this.strategies, util.method('isSupported'));\n    };\n    SequentialStrategy.prototype.connect = function (minPriority, callback) {\n        var _this = this;\n        var strategies = this.strategies;\n        var current = 0;\n        var timeout = this.timeout;\n        var runner = null;\n        var tryNextStrategy = function (error, handshake) {\n            if (handshake) {\n                callback(null, handshake);\n            }\n            else {\n                current = current + 1;\n                if (_this.loop) {\n                    current = current % strategies.length;\n                }\n                if (current < strategies.length) {\n                    if (timeout) {\n                        timeout = timeout * 2;\n                        if (_this.timeoutLimit) {\n                            timeout = Math.min(timeout, _this.timeoutLimit);\n                        }\n                    }\n                    runner = _this.tryStrategy(strategies[current], minPriority, { timeout: timeout, failFast: _this.failFast }, tryNextStrategy);\n                }\n                else {\n                    callback(true);\n                }\n            }\n        };\n        runner = this.tryStrategy(strategies[current], minPriority, { timeout: timeout, failFast: this.failFast }, tryNextStrategy);\n        return {\n            abort: function () {\n                runner.abort();\n            },\n            forceMinPriority: function (p) {\n                minPriority = p;\n                if (runner) {\n                    runner.forceMinPriority(p);\n                }\n            }\n        };\n    };\n    SequentialStrategy.prototype.tryStrategy = function (strategy, minPriority, options, callback) {\n        var timer = null;\n        var runner = null;\n        if (options.timeout > 0) {\n            timer = new OneOffTimer(options.timeout, function () {\n                runner.abort();\n                callback(true);\n            });\n        }\n        runner = strategy.connect(minPriority, function (error, handshake) {\n            if (error && timer && timer.isRunning() && !options.failFast) {\n                return;\n            }\n            if (timer) {\n                timer.ensureAborted();\n            }\n            callback(error, handshake);\n        });\n        return {\n            abort: function () {\n                if (timer) {\n                    timer.ensureAborted();\n                }\n                runner.abort();\n            },\n            forceMinPriority: function (p) {\n                runner.forceMinPriority(p);\n            }\n        };\n    };\n    return SequentialStrategy;\n}());\n/* harmony default export */ var sequential_strategy = (sequential_strategy_SequentialStrategy);\n\n// CONCATENATED MODULE: ./src/core/strategies/best_connected_ever_strategy.ts\n\n\nvar best_connected_ever_strategy_BestConnectedEverStrategy = (function () {\n    function BestConnectedEverStrategy(strategies) {\n        this.strategies = strategies;\n    }\n    BestConnectedEverStrategy.prototype.isSupported = function () {\n        return any(this.strategies, util.method('isSupported'));\n    };\n    BestConnectedEverStrategy.prototype.connect = function (minPriority, callback) {\n        return connect(this.strategies, minPriority, function (i, runners) {\n            return function (error, handshake) {\n                runners[i].error = error;\n                if (error) {\n                    if (allRunnersFailed(runners)) {\n                        callback(true);\n                    }\n                    return;\n                }\n                apply(runners, function (runner) {\n                    runner.forceMinPriority(handshake.transport.priority);\n                });\n                callback(null, handshake);\n            };\n        });\n    };\n    return BestConnectedEverStrategy;\n}());\n/* harmony default export */ var best_connected_ever_strategy = (best_connected_ever_strategy_BestConnectedEverStrategy);\nfunction connect(strategies, minPriority, callbackBuilder) {\n    var runners = map(strategies, function (strategy, i, _, rs) {\n        return strategy.connect(minPriority, callbackBuilder(i, rs));\n    });\n    return {\n        abort: function () {\n            apply(runners, abortRunner);\n        },\n        forceMinPriority: function (p) {\n            apply(runners, function (runner) {\n                runner.forceMinPriority(p);\n            });\n        }\n    };\n}\nfunction allRunnersFailed(runners) {\n    return collections_all(runners, function (runner) {\n        return Boolean(runner.error);\n    });\n}\nfunction abortRunner(runner) {\n    if (!runner.error && !runner.aborted) {\n        runner.abort();\n        runner.aborted = true;\n    }\n}\n\n// CONCATENATED MODULE: ./src/core/strategies/cached_strategy.ts\n\n\n\n\nvar cached_strategy_CachedStrategy = (function () {\n    function CachedStrategy(strategy, transports, options) {\n        this.strategy = strategy;\n        this.transports = transports;\n        this.ttl = options.ttl || 1800 * 1000;\n        this.usingTLS = options.useTLS;\n        this.timeline = options.timeline;\n    }\n    CachedStrategy.prototype.isSupported = function () {\n        return this.strategy.isSupported();\n    };\n    CachedStrategy.prototype.connect = function (minPriority, callback) {\n        var usingTLS = this.usingTLS;\n        var info = fetchTransportCache(usingTLS);\n        var strategies = [this.strategy];\n        if (info && info.timestamp + this.ttl >= util.now()) {\n            var transport = this.transports[info.transport];\n            if (transport) {\n                this.timeline.info({\n                    cached: true,\n                    transport: info.transport,\n                    latency: info.latency\n                });\n                strategies.push(new sequential_strategy([transport], {\n                    timeout: info.latency * 2 + 1000,\n                    failFast: true\n                }));\n            }\n        }\n        var startTimestamp = util.now();\n        var runner = strategies\n            .pop()\n            .connect(minPriority, function cb(error, handshake) {\n            if (error) {\n                flushTransportCache(usingTLS);\n                if (strategies.length > 0) {\n                    startTimestamp = util.now();\n                    runner = strategies.pop().connect(minPriority, cb);\n                }\n                else {\n                    callback(error);\n                }\n            }\n            else {\n                storeTransportCache(usingTLS, handshake.transport.name, util.now() - startTimestamp);\n                callback(null, handshake);\n            }\n        });\n        return {\n            abort: function () {\n                runner.abort();\n            },\n            forceMinPriority: function (p) {\n                minPriority = p;\n                if (runner) {\n                    runner.forceMinPriority(p);\n                }\n            }\n        };\n    };\n    return CachedStrategy;\n}());\n/* harmony default export */ var cached_strategy = (cached_strategy_CachedStrategy);\nfunction getTransportCacheKey(usingTLS) {\n    return 'pusherTransport' + (usingTLS ? 'TLS' : 'NonTLS');\n}\nfunction fetchTransportCache(usingTLS) {\n    var storage = runtime.getLocalStorage();\n    if (storage) {\n        try {\n            var serializedCache = storage[getTransportCacheKey(usingTLS)];\n            if (serializedCache) {\n                return JSON.parse(serializedCache);\n            }\n        }\n        catch (e) {\n            flushTransportCache(usingTLS);\n        }\n    }\n    return null;\n}\nfunction storeTransportCache(usingTLS, transport, latency) {\n    var storage = runtime.getLocalStorage();\n    if (storage) {\n        try {\n            storage[getTransportCacheKey(usingTLS)] = safeJSONStringify({\n                timestamp: util.now(),\n                transport: transport,\n                latency: latency\n            });\n        }\n        catch (e) {\n        }\n    }\n}\nfunction flushTransportCache(usingTLS) {\n    var storage = runtime.getLocalStorage();\n    if (storage) {\n        try {\n            delete storage[getTransportCacheKey(usingTLS)];\n        }\n        catch (e) {\n        }\n    }\n}\n\n// CONCATENATED MODULE: ./src/core/strategies/delayed_strategy.ts\n\nvar delayed_strategy_DelayedStrategy = (function () {\n    function DelayedStrategy(strategy, _a) {\n        var number = _a.delay;\n        this.strategy = strategy;\n        this.options = { delay: number };\n    }\n    DelayedStrategy.prototype.isSupported = function () {\n        return this.strategy.isSupported();\n    };\n    DelayedStrategy.prototype.connect = function (minPriority, callback) {\n        var strategy = this.strategy;\n        var runner;\n        var timer = new OneOffTimer(this.options.delay, function () {\n            runner = strategy.connect(minPriority, callback);\n        });\n        return {\n            abort: function () {\n                timer.ensureAborted();\n                if (runner) {\n                    runner.abort();\n                }\n            },\n            forceMinPriority: function (p) {\n                minPriority = p;\n                if (runner) {\n                    runner.forceMinPriority(p);\n                }\n            }\n        };\n    };\n    return DelayedStrategy;\n}());\n/* harmony default export */ var delayed_strategy = (delayed_strategy_DelayedStrategy);\n\n// CONCATENATED MODULE: ./src/core/strategies/if_strategy.ts\nvar IfStrategy = (function () {\n    function IfStrategy(test, trueBranch, falseBranch) {\n        this.test = test;\n        this.trueBranch = trueBranch;\n        this.falseBranch = falseBranch;\n    }\n    IfStrategy.prototype.isSupported = function () {\n        var branch = this.test() ? this.trueBranch : this.falseBranch;\n        return branch.isSupported();\n    };\n    IfStrategy.prototype.connect = function (minPriority, callback) {\n        var branch = this.test() ? this.trueBranch : this.falseBranch;\n        return branch.connect(minPriority, callback);\n    };\n    return IfStrategy;\n}());\n/* harmony default export */ var if_strategy = (IfStrategy);\n\n// CONCATENATED MODULE: ./src/core/strategies/first_connected_strategy.ts\nvar FirstConnectedStrategy = (function () {\n    function FirstConnectedStrategy(strategy) {\n        this.strategy = strategy;\n    }\n    FirstConnectedStrategy.prototype.isSupported = function () {\n        return this.strategy.isSupported();\n    };\n    FirstConnectedStrategy.prototype.connect = function (minPriority, callback) {\n        var runner = this.strategy.connect(minPriority, function (error, handshake) {\n            if (handshake) {\n                runner.abort();\n            }\n            callback(error, handshake);\n        });\n        return runner;\n    };\n    return FirstConnectedStrategy;\n}());\n/* harmony default export */ var first_connected_strategy = (FirstConnectedStrategy);\n\n// CONCATENATED MODULE: ./src/runtimes/web/default_strategy.ts\n\n\n\n\n\n\n\nfunction testSupportsStrategy(strategy) {\n    return function () {\n        return strategy.isSupported();\n    };\n}\nvar getDefaultStrategy = function (config, baseOptions, defineTransport) {\n    var definedTransports = {};\n    function defineTransportStrategy(name, type, priority, options, manager) {\n        var transport = defineTransport(config, name, type, priority, options, manager);\n        definedTransports[name] = transport;\n        return transport;\n    }\n    var ws_options = Object.assign({}, baseOptions, {\n        hostNonTLS: config.wsHost + ':' + config.wsPort,\n        hostTLS: config.wsHost + ':' + config.wssPort,\n        httpPath: config.wsPath\n    });\n    var wss_options = Object.assign({}, ws_options, {\n        useTLS: true\n    });\n    var sockjs_options = Object.assign({}, baseOptions, {\n        hostNonTLS: config.httpHost + ':' + config.httpPort,\n        hostTLS: config.httpHost + ':' + config.httpsPort,\n        httpPath: config.httpPath\n    });\n    var timeouts = {\n        loop: true,\n        timeout: 15000,\n        timeoutLimit: 60000\n    };\n    var ws_manager = new transport_manager({\n        lives: 2,\n        minPingDelay: 10000,\n        maxPingDelay: config.activityTimeout\n    });\n    var streaming_manager = new transport_manager({\n        lives: 2,\n        minPingDelay: 10000,\n        maxPingDelay: config.activityTimeout\n    });\n    var ws_transport = defineTransportStrategy('ws', 'ws', 3, ws_options, ws_manager);\n    var wss_transport = defineTransportStrategy('wss', 'ws', 3, wss_options, ws_manager);\n    var sockjs_transport = defineTransportStrategy('sockjs', 'sockjs', 1, sockjs_options);\n    var xhr_streaming_transport = defineTransportStrategy('xhr_streaming', 'xhr_streaming', 1, sockjs_options, streaming_manager);\n    var xdr_streaming_transport = defineTransportStrategy('xdr_streaming', 'xdr_streaming', 1, sockjs_options, streaming_manager);\n    var xhr_polling_transport = defineTransportStrategy('xhr_polling', 'xhr_polling', 1, sockjs_options);\n    var xdr_polling_transport = defineTransportStrategy('xdr_polling', 'xdr_polling', 1, sockjs_options);\n    var ws_loop = new sequential_strategy([ws_transport], timeouts);\n    var wss_loop = new sequential_strategy([wss_transport], timeouts);\n    var sockjs_loop = new sequential_strategy([sockjs_transport], timeouts);\n    var streaming_loop = new sequential_strategy([\n        new if_strategy(testSupportsStrategy(xhr_streaming_transport), xhr_streaming_transport, xdr_streaming_transport)\n    ], timeouts);\n    var polling_loop = new sequential_strategy([\n        new if_strategy(testSupportsStrategy(xhr_polling_transport), xhr_polling_transport, xdr_polling_transport)\n    ], timeouts);\n    var http_loop = new sequential_strategy([\n        new if_strategy(testSupportsStrategy(streaming_loop), new best_connected_ever_strategy([\n            streaming_loop,\n            new delayed_strategy(polling_loop, { delay: 4000 })\n        ]), polling_loop)\n    ], timeouts);\n    var http_fallback_loop = new if_strategy(testSupportsStrategy(http_loop), http_loop, sockjs_loop);\n    var wsStrategy;\n    if (baseOptions.useTLS) {\n        wsStrategy = new best_connected_ever_strategy([\n            ws_loop,\n            new delayed_strategy(http_fallback_loop, { delay: 2000 })\n        ]);\n    }\n    else {\n        wsStrategy = new best_connected_ever_strategy([\n            ws_loop,\n            new delayed_strategy(wss_loop, { delay: 2000 }),\n            new delayed_strategy(http_fallback_loop, { delay: 5000 })\n        ]);\n    }\n    return new cached_strategy(new first_connected_strategy(new if_strategy(testSupportsStrategy(ws_transport), wsStrategy, http_fallback_loop)), definedTransports, {\n        ttl: 1800000,\n        timeline: baseOptions.timeline,\n        useTLS: baseOptions.useTLS\n    });\n};\n/* harmony default export */ var default_strategy = (getDefaultStrategy);\n\n// CONCATENATED MODULE: ./src/runtimes/web/transports/transport_connection_initializer.ts\n\n/* harmony default export */ var transport_connection_initializer = (function () {\n    var self = this;\n    self.timeline.info(self.buildTimelineMessage({\n        transport: self.name + (self.options.useTLS ? 's' : '')\n    }));\n    if (self.hooks.isInitialized()) {\n        self.changeState('initialized');\n    }\n    else if (self.hooks.file) {\n        self.changeState('initializing');\n        Dependencies.load(self.hooks.file, { useTLS: self.options.useTLS }, function (error, callback) {\n            if (self.hooks.isInitialized()) {\n                self.changeState('initialized');\n                callback(true);\n            }\n            else {\n                if (error) {\n                    self.onError(error);\n                }\n                self.onClose();\n                callback(false);\n            }\n        });\n    }\n    else {\n        self.onClose();\n    }\n});\n\n// CONCATENATED MODULE: ./src/runtimes/web/http/http_xdomain_request.ts\n\nvar http_xdomain_request_hooks = {\n    getRequest: function (socket) {\n        var xdr = new window.XDomainRequest();\n        xdr.ontimeout = function () {\n            socket.emit('error', new RequestTimedOut());\n            socket.close();\n        };\n        xdr.onerror = function (e) {\n            socket.emit('error', e);\n            socket.close();\n        };\n        xdr.onprogress = function () {\n            if (xdr.responseText && xdr.responseText.length > 0) {\n                socket.onChunk(200, xdr.responseText);\n            }\n        };\n        xdr.onload = function () {\n            if (xdr.responseText && xdr.responseText.length > 0) {\n                socket.onChunk(200, xdr.responseText);\n            }\n            socket.emit('finished', 200);\n            socket.close();\n        };\n        return xdr;\n    },\n    abortRequest: function (xdr) {\n        xdr.ontimeout = xdr.onerror = xdr.onprogress = xdr.onload = null;\n        xdr.abort();\n    }\n};\n/* harmony default export */ var http_xdomain_request = (http_xdomain_request_hooks);\n\n// CONCATENATED MODULE: ./src/core/http/http_request.ts\nvar http_request_extends = ( false) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n\n\nvar MAX_BUFFER_LENGTH = 256 * 1024;\nvar http_request_HTTPRequest = (function (_super) {\n    http_request_extends(HTTPRequest, _super);\n    function HTTPRequest(hooks, method, url) {\n        var _this = _super.call(this) || this;\n        _this.hooks = hooks;\n        _this.method = method;\n        _this.url = url;\n        return _this;\n    }\n    HTTPRequest.prototype.start = function (payload) {\n        var _this = this;\n        this.position = 0;\n        this.xhr = this.hooks.getRequest(this);\n        this.unloader = function () {\n            _this.close();\n        };\n        runtime.addUnloadListener(this.unloader);\n        this.xhr.open(this.method, this.url, true);\n        if (this.xhr.setRequestHeader) {\n            this.xhr.setRequestHeader('Content-Type', 'application/json');\n        }\n        this.xhr.send(payload);\n    };\n    HTTPRequest.prototype.close = function () {\n        if (this.unloader) {\n            runtime.removeUnloadListener(this.unloader);\n            this.unloader = null;\n        }\n        if (this.xhr) {\n            this.hooks.abortRequest(this.xhr);\n            this.xhr = null;\n        }\n    };\n    HTTPRequest.prototype.onChunk = function (status, data) {\n        while (true) {\n            var chunk = this.advanceBuffer(data);\n            if (chunk) {\n                this.emit('chunk', { status: status, data: chunk });\n            }\n            else {\n                break;\n            }\n        }\n        if (this.isBufferTooLong(data)) {\n            this.emit('buffer_too_long');\n        }\n    };\n    HTTPRequest.prototype.advanceBuffer = function (buffer) {\n        var unreadData = buffer.slice(this.position);\n        var endOfLinePosition = unreadData.indexOf('\\n');\n        if (endOfLinePosition !== -1) {\n            this.position += endOfLinePosition + 1;\n            return unreadData.slice(0, endOfLinePosition);\n        }\n        else {\n            return null;\n        }\n    };\n    HTTPRequest.prototype.isBufferTooLong = function (buffer) {\n        return this.position === buffer.length && buffer.length > MAX_BUFFER_LENGTH;\n    };\n    return HTTPRequest;\n}(dispatcher));\n/* harmony default export */ var http_request = (http_request_HTTPRequest);\n\n// CONCATENATED MODULE: ./src/core/http/state.ts\nvar State;\n(function (State) {\n    State[State[\"CONNECTING\"] = 0] = \"CONNECTING\";\n    State[State[\"OPEN\"] = 1] = \"OPEN\";\n    State[State[\"CLOSED\"] = 3] = \"CLOSED\";\n})(State || (State = {}));\n/* harmony default export */ var state = (State);\n\n// CONCATENATED MODULE: ./src/core/http/http_socket.ts\n\n\n\nvar autoIncrement = 1;\nvar http_socket_HTTPSocket = (function () {\n    function HTTPSocket(hooks, url) {\n        this.hooks = hooks;\n        this.session = randomNumber(1000) + '/' + randomString(8);\n        this.location = getLocation(url);\n        this.readyState = state.CONNECTING;\n        this.openStream();\n    }\n    HTTPSocket.prototype.send = function (payload) {\n        return this.sendRaw(JSON.stringify([payload]));\n    };\n    HTTPSocket.prototype.ping = function () {\n        this.hooks.sendHeartbeat(this);\n    };\n    HTTPSocket.prototype.close = function (code, reason) {\n        this.onClose(code, reason, true);\n    };\n    HTTPSocket.prototype.sendRaw = function (payload) {\n        if (this.readyState === state.OPEN) {\n            try {\n                runtime.createSocketRequest('POST', getUniqueURL(getSendURL(this.location, this.session))).start(payload);\n                return true;\n            }\n            catch (e) {\n                return false;\n            }\n        }\n        else {\n            return false;\n        }\n    };\n    HTTPSocket.prototype.reconnect = function () {\n        this.closeStream();\n        this.openStream();\n    };\n    HTTPSocket.prototype.onClose = function (code, reason, wasClean) {\n        this.closeStream();\n        this.readyState = state.CLOSED;\n        if (this.onclose) {\n            this.onclose({\n                code: code,\n                reason: reason,\n                wasClean: wasClean\n            });\n        }\n    };\n    HTTPSocket.prototype.onChunk = function (chunk) {\n        if (chunk.status !== 200) {\n            return;\n        }\n        if (this.readyState === state.OPEN) {\n            this.onActivity();\n        }\n        var payload;\n        var type = chunk.data.slice(0, 1);\n        switch (type) {\n            case 'o':\n                payload = JSON.parse(chunk.data.slice(1) || '{}');\n                this.onOpen(payload);\n                break;\n            case 'a':\n                payload = JSON.parse(chunk.data.slice(1) || '[]');\n                for (var i = 0; i < payload.length; i++) {\n                    this.onEvent(payload[i]);\n                }\n                break;\n            case 'm':\n                payload = JSON.parse(chunk.data.slice(1) || 'null');\n                this.onEvent(payload);\n                break;\n            case 'h':\n                this.hooks.onHeartbeat(this);\n                break;\n            case 'c':\n                payload = JSON.parse(chunk.data.slice(1) || '[]');\n                this.onClose(payload[0], payload[1], true);\n                break;\n        }\n    };\n    HTTPSocket.prototype.onOpen = function (options) {\n        if (this.readyState === state.CONNECTING) {\n            if (options && options.hostname) {\n                this.location.base = replaceHost(this.location.base, options.hostname);\n            }\n            this.readyState = state.OPEN;\n            if (this.onopen) {\n                this.onopen();\n            }\n        }\n        else {\n            this.onClose(1006, 'Server lost session', true);\n        }\n    };\n    HTTPSocket.prototype.onEvent = function (event) {\n        if (this.readyState === state.OPEN && this.onmessage) {\n            this.onmessage({ data: event });\n        }\n    };\n    HTTPSocket.prototype.onActivity = function () {\n        if (this.onactivity) {\n            this.onactivity();\n        }\n    };\n    HTTPSocket.prototype.onError = function (error) {\n        if (this.onerror) {\n            this.onerror(error);\n        }\n    };\n    HTTPSocket.prototype.openStream = function () {\n        var _this = this;\n        this.stream = runtime.createSocketRequest('POST', getUniqueURL(this.hooks.getReceiveURL(this.location, this.session)));\n        this.stream.bind('chunk', function (chunk) {\n            _this.onChunk(chunk);\n        });\n        this.stream.bind('finished', function (status) {\n            _this.hooks.onFinished(_this, status);\n        });\n        this.stream.bind('buffer_too_long', function () {\n            _this.reconnect();\n        });\n        try {\n            this.stream.start();\n        }\n        catch (error) {\n            util.defer(function () {\n                _this.onError(error);\n                _this.onClose(1006, 'Could not start streaming', false);\n            });\n        }\n    };\n    HTTPSocket.prototype.closeStream = function () {\n        if (this.stream) {\n            this.stream.unbind_all();\n            this.stream.close();\n            this.stream = null;\n        }\n    };\n    return HTTPSocket;\n}());\nfunction getLocation(url) {\n    var parts = /([^\\?]*)\\/*(\\??.*)/.exec(url);\n    return {\n        base: parts[1],\n        queryString: parts[2]\n    };\n}\nfunction getSendURL(url, session) {\n    return url.base + '/' + session + '/xhr_send';\n}\nfunction getUniqueURL(url) {\n    var separator = url.indexOf('?') === -1 ? '?' : '&';\n    return url + separator + 't=' + +new Date() + '&n=' + autoIncrement++;\n}\nfunction replaceHost(url, hostname) {\n    var urlParts = /(https?:\\/\\/)([^\\/:]+)((\\/|:)?.*)/.exec(url);\n    return urlParts[1] + hostname + urlParts[3];\n}\nfunction randomNumber(max) {\n    return runtime.randomInt(max);\n}\nfunction randomString(length) {\n    var result = [];\n    for (var i = 0; i < length; i++) {\n        result.push(randomNumber(32).toString(32));\n    }\n    return result.join('');\n}\n/* harmony default export */ var http_socket = (http_socket_HTTPSocket);\n\n// CONCATENATED MODULE: ./src/core/http/http_streaming_socket.ts\nvar http_streaming_socket_hooks = {\n    getReceiveURL: function (url, session) {\n        return url.base + '/' + session + '/xhr_streaming' + url.queryString;\n    },\n    onHeartbeat: function (socket) {\n        socket.sendRaw('[]');\n    },\n    sendHeartbeat: function (socket) {\n        socket.sendRaw('[]');\n    },\n    onFinished: function (socket, status) {\n        socket.onClose(1006, 'Connection interrupted (' + status + ')', false);\n    }\n};\n/* harmony default export */ var http_streaming_socket = (http_streaming_socket_hooks);\n\n// CONCATENATED MODULE: ./src/core/http/http_polling_socket.ts\nvar http_polling_socket_hooks = {\n    getReceiveURL: function (url, session) {\n        return url.base + '/' + session + '/xhr' + url.queryString;\n    },\n    onHeartbeat: function () {\n    },\n    sendHeartbeat: function (socket) {\n        socket.sendRaw('[]');\n    },\n    onFinished: function (socket, status) {\n        if (status === 200) {\n            socket.reconnect();\n        }\n        else {\n            socket.onClose(1006, 'Connection interrupted (' + status + ')', false);\n        }\n    }\n};\n/* harmony default export */ var http_polling_socket = (http_polling_socket_hooks);\n\n// CONCATENATED MODULE: ./src/runtimes/isomorphic/http/http_xhr_request.ts\n\nvar http_xhr_request_hooks = {\n    getRequest: function (socket) {\n        var Constructor = runtime.getXHRAPI();\n        var xhr = new Constructor();\n        xhr.onreadystatechange = xhr.onprogress = function () {\n            switch (xhr.readyState) {\n                case 3:\n                    if (xhr.responseText && xhr.responseText.length > 0) {\n                        socket.onChunk(xhr.status, xhr.responseText);\n                    }\n                    break;\n                case 4:\n                    if (xhr.responseText && xhr.responseText.length > 0) {\n                        socket.onChunk(xhr.status, xhr.responseText);\n                    }\n                    socket.emit('finished', xhr.status);\n                    socket.close();\n                    break;\n            }\n        };\n        return xhr;\n    },\n    abortRequest: function (xhr) {\n        xhr.onreadystatechange = null;\n        xhr.abort();\n    }\n};\n/* harmony default export */ var http_xhr_request = (http_xhr_request_hooks);\n\n// CONCATENATED MODULE: ./src/runtimes/isomorphic/http/http.ts\n\n\n\n\n\nvar HTTP = {\n    createStreamingSocket: function (url) {\n        return this.createSocket(http_streaming_socket, url);\n    },\n    createPollingSocket: function (url) {\n        return this.createSocket(http_polling_socket, url);\n    },\n    createSocket: function (hooks, url) {\n        return new http_socket(hooks, url);\n    },\n    createXHR: function (method, url) {\n        return this.createRequest(http_xhr_request, method, url);\n    },\n    createRequest: function (hooks, method, url) {\n        return new http_request(hooks, method, url);\n    }\n};\n/* harmony default export */ var http_http = (HTTP);\n\n// CONCATENATED MODULE: ./src/runtimes/web/http/http.ts\n\n\nhttp_http.createXDR = function (method, url) {\n    return this.createRequest(http_xdomain_request, method, url);\n};\n/* harmony default export */ var web_http_http = (http_http);\n\n// CONCATENATED MODULE: ./src/runtimes/web/runtime.ts\n\n\n\n\n\n\n\n\n\n\n\n\nvar Runtime = {\n    nextAuthCallbackID: 1,\n    auth_callbacks: {},\n    ScriptReceivers: ScriptReceivers,\n    DependenciesReceivers: DependenciesReceivers,\n    getDefaultStrategy: default_strategy,\n    Transports: transports_transports,\n    transportConnectionInitializer: transport_connection_initializer,\n    HTTPFactory: web_http_http,\n    TimelineTransport: jsonp_timeline,\n    getXHRAPI: function () {\n        return window.XMLHttpRequest;\n    },\n    getWebSocketAPI: function () {\n        return window.WebSocket || window.MozWebSocket;\n    },\n    setup: function (PusherClass) {\n        var _this = this;\n        window.Pusher = PusherClass;\n        var initializeOnDocumentBody = function () {\n            _this.onDocumentBody(PusherClass.ready);\n        };\n        if (!window.JSON) {\n            Dependencies.load('json2', {}, initializeOnDocumentBody);\n        }\n        else {\n            initializeOnDocumentBody();\n        }\n    },\n    getDocument: function () {\n        return document;\n    },\n    getProtocol: function () {\n        return this.getDocument().location.protocol;\n    },\n    getAuthorizers: function () {\n        return { ajax: xhr_auth, jsonp: jsonp_auth };\n    },\n    onDocumentBody: function (callback) {\n        var _this = this;\n        if (document.body) {\n            callback();\n        }\n        else {\n            setTimeout(function () {\n                _this.onDocumentBody(callback);\n            }, 0);\n        }\n    },\n    createJSONPRequest: function (url, data) {\n        return new jsonp_request(url, data);\n    },\n    createScriptRequest: function (src) {\n        return new script_request(src);\n    },\n    getLocalStorage: function () {\n        try {\n            return window.localStorage;\n        }\n        catch (e) {\n            return undefined;\n        }\n    },\n    createXHR: function () {\n        if (this.getXHRAPI()) {\n            return this.createXMLHttpRequest();\n        }\n        else {\n            return this.createMicrosoftXHR();\n        }\n    },\n    createXMLHttpRequest: function () {\n        var Constructor = this.getXHRAPI();\n        return new Constructor();\n    },\n    createMicrosoftXHR: function () {\n        return new ActiveXObject('Microsoft.XMLHTTP');\n    },\n    getNetwork: function () {\n        return net_info_Network;\n    },\n    createWebSocket: function (url) {\n        var Constructor = this.getWebSocketAPI();\n        return new Constructor(url);\n    },\n    createSocketRequest: function (method, url) {\n        if (this.isXHRSupported()) {\n            return this.HTTPFactory.createXHR(method, url);\n        }\n        else if (this.isXDRSupported(url.indexOf('https:') === 0)) {\n            return this.HTTPFactory.createXDR(method, url);\n        }\n        else {\n            throw 'Cross-origin HTTP requests are not supported';\n        }\n    },\n    isXHRSupported: function () {\n        var Constructor = this.getXHRAPI();\n        return (Boolean(Constructor) && new Constructor().withCredentials !== undefined);\n    },\n    isXDRSupported: function (useTLS) {\n        var protocol = useTLS ? 'https:' : 'http:';\n        var documentProtocol = this.getProtocol();\n        return (Boolean(window['XDomainRequest']) && documentProtocol === protocol);\n    },\n    addUnloadListener: function (listener) {\n        if (window.addEventListener !== undefined) {\n            window.addEventListener('unload', listener, false);\n        }\n        else if (window.attachEvent !== undefined) {\n            window.attachEvent('onunload', listener);\n        }\n    },\n    removeUnloadListener: function (listener) {\n        if (window.addEventListener !== undefined) {\n            window.removeEventListener('unload', listener, false);\n        }\n        else if (window.detachEvent !== undefined) {\n            window.detachEvent('onunload', listener);\n        }\n    },\n    randomInt: function (max) {\n        var random = function () {\n            var crypto = window.crypto || window['msCrypto'];\n            var random = crypto.getRandomValues(new Uint32Array(1))[0];\n            return random / Math.pow(2, 32);\n        };\n        return Math.floor(random() * max);\n    }\n};\n/* harmony default export */ var runtime = (Runtime);\n\n// CONCATENATED MODULE: ./src/core/timeline/level.ts\nvar TimelineLevel;\n(function (TimelineLevel) {\n    TimelineLevel[TimelineLevel[\"ERROR\"] = 3] = \"ERROR\";\n    TimelineLevel[TimelineLevel[\"INFO\"] = 6] = \"INFO\";\n    TimelineLevel[TimelineLevel[\"DEBUG\"] = 7] = \"DEBUG\";\n})(TimelineLevel || (TimelineLevel = {}));\n/* harmony default export */ var timeline_level = (TimelineLevel);\n\n// CONCATENATED MODULE: ./src/core/timeline/timeline.ts\n\n\n\nvar timeline_Timeline = (function () {\n    function Timeline(key, session, options) {\n        this.key = key;\n        this.session = session;\n        this.events = [];\n        this.options = options || {};\n        this.sent = 0;\n        this.uniqueID = 0;\n    }\n    Timeline.prototype.log = function (level, event) {\n        if (level <= this.options.level) {\n            this.events.push(extend({}, event, { timestamp: util.now() }));\n            if (this.options.limit && this.events.length > this.options.limit) {\n                this.events.shift();\n            }\n        }\n    };\n    Timeline.prototype.error = function (event) {\n        this.log(timeline_level.ERROR, event);\n    };\n    Timeline.prototype.info = function (event) {\n        this.log(timeline_level.INFO, event);\n    };\n    Timeline.prototype.debug = function (event) {\n        this.log(timeline_level.DEBUG, event);\n    };\n    Timeline.prototype.isEmpty = function () {\n        return this.events.length === 0;\n    };\n    Timeline.prototype.send = function (sendfn, callback) {\n        var _this = this;\n        var data = extend({\n            session: this.session,\n            bundle: this.sent + 1,\n            key: this.key,\n            lib: 'js',\n            version: this.options.version,\n            cluster: this.options.cluster,\n            features: this.options.features,\n            timeline: this.events\n        }, this.options.params);\n        this.events = [];\n        sendfn(data, function (error, result) {\n            if (!error) {\n                _this.sent++;\n            }\n            if (callback) {\n                callback(error, result);\n            }\n        });\n        return true;\n    };\n    Timeline.prototype.generateUniqueID = function () {\n        this.uniqueID++;\n        return this.uniqueID;\n    };\n    return Timeline;\n}());\n/* harmony default export */ var timeline_timeline = (timeline_Timeline);\n\n// CONCATENATED MODULE: ./src/core/strategies/transport_strategy.ts\n\n\n\n\nvar transport_strategy_TransportStrategy = (function () {\n    function TransportStrategy(name, priority, transport, options) {\n        this.name = name;\n        this.priority = priority;\n        this.transport = transport;\n        this.options = options || {};\n    }\n    TransportStrategy.prototype.isSupported = function () {\n        return this.transport.isSupported({\n            useTLS: this.options.useTLS\n        });\n    };\n    TransportStrategy.prototype.connect = function (minPriority, callback) {\n        var _this = this;\n        if (!this.isSupported()) {\n            return failAttempt(new UnsupportedStrategy(), callback);\n        }\n        else if (this.priority < minPriority) {\n            return failAttempt(new TransportPriorityTooLow(), callback);\n        }\n        var connected = false;\n        var transport = this.transport.createConnection(this.name, this.priority, this.options.key, this.options);\n        var handshake = null;\n        var onInitialized = function () {\n            transport.unbind('initialized', onInitialized);\n            transport.connect();\n        };\n        var onOpen = function () {\n            handshake = factory.createHandshake(transport, function (result) {\n                connected = true;\n                unbindListeners();\n                callback(null, result);\n            });\n        };\n        var onError = function (error) {\n            unbindListeners();\n            callback(error);\n        };\n        var onClosed = function () {\n            unbindListeners();\n            var serializedTransport;\n            serializedTransport = safeJSONStringify(transport);\n            callback(new TransportClosed(serializedTransport));\n        };\n        var unbindListeners = function () {\n            transport.unbind('initialized', onInitialized);\n            transport.unbind('open', onOpen);\n            transport.unbind('error', onError);\n            transport.unbind('closed', onClosed);\n        };\n        transport.bind('initialized', onInitialized);\n        transport.bind('open', onOpen);\n        transport.bind('error', onError);\n        transport.bind('closed', onClosed);\n        transport.initialize();\n        return {\n            abort: function () {\n                if (connected) {\n                    return;\n                }\n                unbindListeners();\n                if (handshake) {\n                    handshake.close();\n                }\n                else {\n                    transport.close();\n                }\n            },\n            forceMinPriority: function (p) {\n                if (connected) {\n                    return;\n                }\n                if (_this.priority < p) {\n                    if (handshake) {\n                        handshake.close();\n                    }\n                    else {\n                        transport.close();\n                    }\n                }\n            }\n        };\n    };\n    return TransportStrategy;\n}());\n/* harmony default export */ var transport_strategy = (transport_strategy_TransportStrategy);\nfunction failAttempt(error, callback) {\n    util.defer(function () {\n        callback(error);\n    });\n    return {\n        abort: function () { },\n        forceMinPriority: function () { }\n    };\n}\n\n// CONCATENATED MODULE: ./src/core/strategies/strategy_builder.ts\n\n\n\n\n\nvar strategy_builder_Transports = runtime.Transports;\nvar strategy_builder_defineTransport = function (config, name, type, priority, options, manager) {\n    var transportClass = strategy_builder_Transports[type];\n    if (!transportClass) {\n        throw new UnsupportedTransport(type);\n    }\n    var enabled = (!config.enabledTransports ||\n        arrayIndexOf(config.enabledTransports, name) !== -1) &&\n        (!config.disabledTransports ||\n            arrayIndexOf(config.disabledTransports, name) === -1);\n    var transport;\n    if (enabled) {\n        options = Object.assign({ ignoreNullOrigin: config.ignoreNullOrigin }, options);\n        transport = new transport_strategy(name, priority, manager ? manager.getAssistant(transportClass) : transportClass, options);\n    }\n    else {\n        transport = strategy_builder_UnsupportedStrategy;\n    }\n    return transport;\n};\nvar strategy_builder_UnsupportedStrategy = {\n    isSupported: function () {\n        return false;\n    },\n    connect: function (_, callback) {\n        var deferred = util.defer(function () {\n            callback(new UnsupportedStrategy());\n        });\n        return {\n            abort: function () {\n                deferred.ensureAborted();\n            },\n            forceMinPriority: function () { }\n        };\n    }\n};\n\n// CONCATENATED MODULE: ./src/core/auth/user_authenticator.ts\n\n\nvar composeChannelQuery = function (params, authOptions) {\n    var query = 'socket_id=' + encodeURIComponent(params.socketId);\n    for (var key in authOptions.params) {\n        query +=\n            '&' +\n                encodeURIComponent(key) +\n                '=' +\n                encodeURIComponent(authOptions.params[key]);\n    }\n    if (authOptions.paramsProvider != null) {\n        var dynamicParams = authOptions.paramsProvider();\n        for (var key in dynamicParams) {\n            query +=\n                '&' +\n                    encodeURIComponent(key) +\n                    '=' +\n                    encodeURIComponent(dynamicParams[key]);\n        }\n    }\n    return query;\n};\nvar UserAuthenticator = function (authOptions) {\n    if (typeof runtime.getAuthorizers()[authOptions.transport] === 'undefined') {\n        throw \"'\" + authOptions.transport + \"' is not a recognized auth transport\";\n    }\n    return function (params, callback) {\n        var query = composeChannelQuery(params, authOptions);\n        runtime.getAuthorizers()[authOptions.transport](runtime, query, authOptions, AuthRequestType.UserAuthentication, callback);\n    };\n};\n/* harmony default export */ var user_authenticator = (UserAuthenticator);\n\n// CONCATENATED MODULE: ./src/core/auth/channel_authorizer.ts\n\n\nvar channel_authorizer_composeChannelQuery = function (params, authOptions) {\n    var query = 'socket_id=' + encodeURIComponent(params.socketId);\n    query += '&channel_name=' + encodeURIComponent(params.channelName);\n    for (var key in authOptions.params) {\n        query +=\n            '&' +\n                encodeURIComponent(key) +\n                '=' +\n                encodeURIComponent(authOptions.params[key]);\n    }\n    if (authOptions.paramsProvider != null) {\n        var dynamicParams = authOptions.paramsProvider();\n        for (var key in dynamicParams) {\n            query +=\n                '&' +\n                    encodeURIComponent(key) +\n                    '=' +\n                    encodeURIComponent(dynamicParams[key]);\n        }\n    }\n    return query;\n};\nvar ChannelAuthorizer = function (authOptions) {\n    if (typeof runtime.getAuthorizers()[authOptions.transport] === 'undefined') {\n        throw \"'\" + authOptions.transport + \"' is not a recognized auth transport\";\n    }\n    return function (params, callback) {\n        var query = channel_authorizer_composeChannelQuery(params, authOptions);\n        runtime.getAuthorizers()[authOptions.transport](runtime, query, authOptions, AuthRequestType.ChannelAuthorization, callback);\n    };\n};\n/* harmony default export */ var channel_authorizer = (ChannelAuthorizer);\n\n// CONCATENATED MODULE: ./src/core/auth/deprecated_channel_authorizer.ts\nvar ChannelAuthorizerProxy = function (pusher, authOptions, channelAuthorizerGenerator) {\n    var deprecatedAuthorizerOptions = {\n        authTransport: authOptions.transport,\n        authEndpoint: authOptions.endpoint,\n        auth: {\n            params: authOptions.params,\n            headers: authOptions.headers\n        }\n    };\n    return function (params, callback) {\n        var channel = pusher.channel(params.channelName);\n        var channelAuthorizer = channelAuthorizerGenerator(channel, deprecatedAuthorizerOptions);\n        channelAuthorizer.authorize(params.socketId, callback);\n    };\n};\n\n// CONCATENATED MODULE: ./src/core/config.ts\nvar __assign = ( false) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\n\n\n\n\n\nfunction getConfig(opts, pusher) {\n    var config = {\n        activityTimeout: opts.activityTimeout || defaults.activityTimeout,\n        cluster: opts.cluster || defaults.cluster,\n        httpPath: opts.httpPath || defaults.httpPath,\n        httpPort: opts.httpPort || defaults.httpPort,\n        httpsPort: opts.httpsPort || defaults.httpsPort,\n        pongTimeout: opts.pongTimeout || defaults.pongTimeout,\n        statsHost: opts.statsHost || defaults.stats_host,\n        unavailableTimeout: opts.unavailableTimeout || defaults.unavailableTimeout,\n        wsPath: opts.wsPath || defaults.wsPath,\n        wsPort: opts.wsPort || defaults.wsPort,\n        wssPort: opts.wssPort || defaults.wssPort,\n        enableStats: getEnableStatsConfig(opts),\n        httpHost: getHttpHost(opts),\n        useTLS: shouldUseTLS(opts),\n        wsHost: getWebsocketHost(opts),\n        userAuthenticator: buildUserAuthenticator(opts),\n        channelAuthorizer: buildChannelAuthorizer(opts, pusher)\n    };\n    if ('disabledTransports' in opts)\n        config.disabledTransports = opts.disabledTransports;\n    if ('enabledTransports' in opts)\n        config.enabledTransports = opts.enabledTransports;\n    if ('ignoreNullOrigin' in opts)\n        config.ignoreNullOrigin = opts.ignoreNullOrigin;\n    if ('timelineParams' in opts)\n        config.timelineParams = opts.timelineParams;\n    if ('nacl' in opts) {\n        config.nacl = opts.nacl;\n    }\n    return config;\n}\nfunction getHttpHost(opts) {\n    if (opts.httpHost) {\n        return opts.httpHost;\n    }\n    if (opts.cluster) {\n        return \"sockjs-\" + opts.cluster + \".pusher.com\";\n    }\n    return defaults.httpHost;\n}\nfunction getWebsocketHost(opts) {\n    if (opts.wsHost) {\n        return opts.wsHost;\n    }\n    if (opts.cluster) {\n        return getWebsocketHostFromCluster(opts.cluster);\n    }\n    return getWebsocketHostFromCluster(defaults.cluster);\n}\nfunction getWebsocketHostFromCluster(cluster) {\n    return \"ws-\" + cluster + \".pusher.com\";\n}\nfunction shouldUseTLS(opts) {\n    if (runtime.getProtocol() === 'https:') {\n        return true;\n    }\n    else if (opts.forceTLS === false) {\n        return false;\n    }\n    return true;\n}\nfunction getEnableStatsConfig(opts) {\n    if ('enableStats' in opts) {\n        return opts.enableStats;\n    }\n    if ('disableStats' in opts) {\n        return !opts.disableStats;\n    }\n    return false;\n}\nfunction buildUserAuthenticator(opts) {\n    var userAuthentication = __assign(__assign({}, defaults.userAuthentication), opts.userAuthentication);\n    if ('customHandler' in userAuthentication &&\n        userAuthentication['customHandler'] != null) {\n        return userAuthentication['customHandler'];\n    }\n    return user_authenticator(userAuthentication);\n}\nfunction buildChannelAuth(opts, pusher) {\n    var channelAuthorization;\n    if ('channelAuthorization' in opts) {\n        channelAuthorization = __assign(__assign({}, defaults.channelAuthorization), opts.channelAuthorization);\n    }\n    else {\n        channelAuthorization = {\n            transport: opts.authTransport || defaults.authTransport,\n            endpoint: opts.authEndpoint || defaults.authEndpoint\n        };\n        if ('auth' in opts) {\n            if ('params' in opts.auth)\n                channelAuthorization.params = opts.auth.params;\n            if ('headers' in opts.auth)\n                channelAuthorization.headers = opts.auth.headers;\n        }\n        if ('authorizer' in opts)\n            channelAuthorization.customHandler = ChannelAuthorizerProxy(pusher, channelAuthorization, opts.authorizer);\n    }\n    return channelAuthorization;\n}\nfunction buildChannelAuthorizer(opts, pusher) {\n    var channelAuthorization = buildChannelAuth(opts, pusher);\n    if ('customHandler' in channelAuthorization &&\n        channelAuthorization['customHandler'] != null) {\n        return channelAuthorization['customHandler'];\n    }\n    return channel_authorizer(channelAuthorization);\n}\n\n// CONCATENATED MODULE: ./src/core/watchlist.ts\nvar watchlist_extends = ( false) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n\n\nvar watchlist_WatchlistFacade = (function (_super) {\n    watchlist_extends(WatchlistFacade, _super);\n    function WatchlistFacade(pusher) {\n        var _this = _super.call(this, function (eventName, data) {\n            logger.debug(\"No callbacks on watchlist events for \" + eventName);\n        }) || this;\n        _this.pusher = pusher;\n        _this.bindWatchlistInternalEvent();\n        return _this;\n    }\n    WatchlistFacade.prototype.handleEvent = function (pusherEvent) {\n        var _this = this;\n        pusherEvent.data.events.forEach(function (watchlistEvent) {\n            _this.emit(watchlistEvent.name, watchlistEvent);\n        });\n    };\n    WatchlistFacade.prototype.bindWatchlistInternalEvent = function () {\n        var _this = this;\n        this.pusher.connection.bind('message', function (pusherEvent) {\n            var eventName = pusherEvent.event;\n            if (eventName === 'pusher_internal:watchlist_events') {\n                _this.handleEvent(pusherEvent);\n            }\n        });\n    };\n    return WatchlistFacade;\n}(dispatcher));\n/* harmony default export */ var watchlist = (watchlist_WatchlistFacade);\n\n// CONCATENATED MODULE: ./src/core/utils/flat_promise.ts\nfunction flatPromise() {\n    var resolve, reject;\n    var promise = new Promise(function (res, rej) {\n        resolve = res;\n        reject = rej;\n    });\n    return { promise: promise, resolve: resolve, reject: reject };\n}\n/* harmony default export */ var flat_promise = (flatPromise);\n\n// CONCATENATED MODULE: ./src/core/user.ts\nvar user_extends = ( false) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n\n\n\n\n\nvar user_UserFacade = (function (_super) {\n    user_extends(UserFacade, _super);\n    function UserFacade(pusher) {\n        var _this = _super.call(this, function (eventName, data) {\n            logger.debug('No callbacks on user for ' + eventName);\n        }) || this;\n        _this.signin_requested = false;\n        _this.user_data = null;\n        _this.serverToUserChannel = null;\n        _this.signinDonePromise = null;\n        _this._signinDoneResolve = null;\n        _this._onAuthorize = function (err, authData) {\n            if (err) {\n                logger.warn(\"Error during signin: \" + err);\n                _this._cleanup();\n                return;\n            }\n            _this.pusher.send_event('pusher:signin', {\n                auth: authData.auth,\n                user_data: authData.user_data\n            });\n        };\n        _this.pusher = pusher;\n        _this.pusher.connection.bind('state_change', function (_a) {\n            var previous = _a.previous, current = _a.current;\n            if (previous !== 'connected' && current === 'connected') {\n                _this._signin();\n            }\n            if (previous === 'connected' && current !== 'connected') {\n                _this._cleanup();\n                _this._newSigninPromiseIfNeeded();\n            }\n        });\n        _this.watchlist = new watchlist(pusher);\n        _this.pusher.connection.bind('message', function (event) {\n            var eventName = event.event;\n            if (eventName === 'pusher:signin_success') {\n                _this._onSigninSuccess(event.data);\n            }\n            if (_this.serverToUserChannel &&\n                _this.serverToUserChannel.name === event.channel) {\n                _this.serverToUserChannel.handleEvent(event);\n            }\n        });\n        return _this;\n    }\n    UserFacade.prototype.signin = function () {\n        if (this.signin_requested) {\n            return;\n        }\n        this.signin_requested = true;\n        this._signin();\n    };\n    UserFacade.prototype._signin = function () {\n        if (!this.signin_requested) {\n            return;\n        }\n        this._newSigninPromiseIfNeeded();\n        if (this.pusher.connection.state !== 'connected') {\n            return;\n        }\n        this.pusher.config.userAuthenticator({\n            socketId: this.pusher.connection.socket_id\n        }, this._onAuthorize);\n    };\n    UserFacade.prototype._onSigninSuccess = function (data) {\n        try {\n            this.user_data = JSON.parse(data.user_data);\n        }\n        catch (e) {\n            logger.error(\"Failed parsing user data after signin: \" + data.user_data);\n            this._cleanup();\n            return;\n        }\n        if (typeof this.user_data.id !== 'string' || this.user_data.id === '') {\n            logger.error(\"user_data doesn't contain an id. user_data: \" + this.user_data);\n            this._cleanup();\n            return;\n        }\n        this._signinDoneResolve();\n        this._subscribeChannels();\n    };\n    UserFacade.prototype._subscribeChannels = function () {\n        var _this = this;\n        var ensure_subscribed = function (channel) {\n            if (channel.subscriptionPending && channel.subscriptionCancelled) {\n                channel.reinstateSubscription();\n            }\n            else if (!channel.subscriptionPending &&\n                _this.pusher.connection.state === 'connected') {\n                channel.subscribe();\n            }\n        };\n        this.serverToUserChannel = new channels_channel(\"#server-to-user-\" + this.user_data.id, this.pusher);\n        this.serverToUserChannel.bind_global(function (eventName, data) {\n            if (eventName.indexOf('pusher_internal:') === 0 ||\n                eventName.indexOf('pusher:') === 0) {\n                return;\n            }\n            _this.emit(eventName, data);\n        });\n        ensure_subscribed(this.serverToUserChannel);\n    };\n    UserFacade.prototype._cleanup = function () {\n        this.user_data = null;\n        if (this.serverToUserChannel) {\n            this.serverToUserChannel.unbind_all();\n            this.serverToUserChannel.disconnect();\n            this.serverToUserChannel = null;\n        }\n        if (this.signin_requested) {\n            this._signinDoneResolve();\n        }\n    };\n    UserFacade.prototype._newSigninPromiseIfNeeded = function () {\n        if (!this.signin_requested) {\n            return;\n        }\n        if (this.signinDonePromise && !this.signinDonePromise.done) {\n            return;\n        }\n        var _a = flat_promise(), promise = _a.promise, resolve = _a.resolve, _ = _a.reject;\n        promise.done = false;\n        var setDone = function () {\n            promise.done = true;\n        };\n        promise.then(setDone)[\"catch\"](setDone);\n        this.signinDonePromise = promise;\n        this._signinDoneResolve = resolve;\n    };\n    return UserFacade;\n}(dispatcher));\n/* harmony default export */ var user = (user_UserFacade);\n\n// CONCATENATED MODULE: ./src/core/pusher.ts\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar pusher_Pusher = (function () {\n    function Pusher(app_key, options) {\n        var _this = this;\n        checkAppKey(app_key);\n        options = options || {};\n        if (!options.cluster && !(options.wsHost || options.httpHost)) {\n            var suffix = url_store.buildLogSuffix('javascriptQuickStart');\n            logger.warn(\"You should always specify a cluster when connecting. \" + suffix);\n        }\n        if ('disableStats' in options) {\n            logger.warn('The disableStats option is deprecated in favor of enableStats');\n        }\n        this.key = app_key;\n        this.config = getConfig(options, this);\n        this.channels = factory.createChannels();\n        this.global_emitter = new dispatcher();\n        this.sessionID = runtime.randomInt(1000000000);\n        this.timeline = new timeline_timeline(this.key, this.sessionID, {\n            cluster: this.config.cluster,\n            features: Pusher.getClientFeatures(),\n            params: this.config.timelineParams || {},\n            limit: 50,\n            level: timeline_level.INFO,\n            version: defaults.VERSION\n        });\n        if (this.config.enableStats) {\n            this.timelineSender = factory.createTimelineSender(this.timeline, {\n                host: this.config.statsHost,\n                path: '/timeline/v2/' + runtime.TimelineTransport.name\n            });\n        }\n        var getStrategy = function (options) {\n            return runtime.getDefaultStrategy(_this.config, options, strategy_builder_defineTransport);\n        };\n        this.connection = factory.createConnectionManager(this.key, {\n            getStrategy: getStrategy,\n            timeline: this.timeline,\n            activityTimeout: this.config.activityTimeout,\n            pongTimeout: this.config.pongTimeout,\n            unavailableTimeout: this.config.unavailableTimeout,\n            useTLS: Boolean(this.config.useTLS)\n        });\n        this.connection.bind('connected', function () {\n            _this.subscribeAll();\n            if (_this.timelineSender) {\n                _this.timelineSender.send(_this.connection.isUsingTLS());\n            }\n        });\n        this.connection.bind('message', function (event) {\n            var eventName = event.event;\n            var internal = eventName.indexOf('pusher_internal:') === 0;\n            if (event.channel) {\n                var channel = _this.channel(event.channel);\n                if (channel) {\n                    channel.handleEvent(event);\n                }\n            }\n            if (!internal) {\n                _this.global_emitter.emit(event.event, event.data);\n            }\n        });\n        this.connection.bind('connecting', function () {\n            _this.channels.disconnect();\n        });\n        this.connection.bind('disconnected', function () {\n            _this.channels.disconnect();\n        });\n        this.connection.bind('error', function (err) {\n            logger.warn(err);\n        });\n        Pusher.instances.push(this);\n        this.timeline.info({ instances: Pusher.instances.length });\n        this.user = new user(this);\n        if (Pusher.isReady) {\n            this.connect();\n        }\n    }\n    Pusher.ready = function () {\n        Pusher.isReady = true;\n        for (var i = 0, l = Pusher.instances.length; i < l; i++) {\n            Pusher.instances[i].connect();\n        }\n    };\n    Pusher.getClientFeatures = function () {\n        return keys(filterObject({ ws: runtime.Transports.ws }, function (t) {\n            return t.isSupported({});\n        }));\n    };\n    Pusher.prototype.channel = function (name) {\n        return this.channels.find(name);\n    };\n    Pusher.prototype.allChannels = function () {\n        return this.channels.all();\n    };\n    Pusher.prototype.connect = function () {\n        this.connection.connect();\n        if (this.timelineSender) {\n            if (!this.timelineSenderTimer) {\n                var usingTLS = this.connection.isUsingTLS();\n                var timelineSender = this.timelineSender;\n                this.timelineSenderTimer = new PeriodicTimer(60000, function () {\n                    timelineSender.send(usingTLS);\n                });\n            }\n        }\n    };\n    Pusher.prototype.disconnect = function () {\n        this.connection.disconnect();\n        if (this.timelineSenderTimer) {\n            this.timelineSenderTimer.ensureAborted();\n            this.timelineSenderTimer = null;\n        }\n    };\n    Pusher.prototype.bind = function (event_name, callback, context) {\n        this.global_emitter.bind(event_name, callback, context);\n        return this;\n    };\n    Pusher.prototype.unbind = function (event_name, callback, context) {\n        this.global_emitter.unbind(event_name, callback, context);\n        return this;\n    };\n    Pusher.prototype.bind_global = function (callback) {\n        this.global_emitter.bind_global(callback);\n        return this;\n    };\n    Pusher.prototype.unbind_global = function (callback) {\n        this.global_emitter.unbind_global(callback);\n        return this;\n    };\n    Pusher.prototype.unbind_all = function (callback) {\n        this.global_emitter.unbind_all();\n        return this;\n    };\n    Pusher.prototype.subscribeAll = function () {\n        var channelName;\n        for (channelName in this.channels.channels) {\n            if (this.channels.channels.hasOwnProperty(channelName)) {\n                this.subscribe(channelName);\n            }\n        }\n    };\n    Pusher.prototype.subscribe = function (channel_name) {\n        var channel = this.channels.add(channel_name, this);\n        if (channel.subscriptionPending && channel.subscriptionCancelled) {\n            channel.reinstateSubscription();\n        }\n        else if (!channel.subscriptionPending &&\n            this.connection.state === 'connected') {\n            channel.subscribe();\n        }\n        return channel;\n    };\n    Pusher.prototype.unsubscribe = function (channel_name) {\n        var channel = this.channels.find(channel_name);\n        if (channel && channel.subscriptionPending) {\n            channel.cancelSubscription();\n        }\n        else {\n            channel = this.channels.remove(channel_name);\n            if (channel && channel.subscribed) {\n                channel.unsubscribe();\n            }\n        }\n    };\n    Pusher.prototype.send_event = function (event_name, data, channel) {\n        return this.connection.send_event(event_name, data, channel);\n    };\n    Pusher.prototype.shouldUseTLS = function () {\n        return this.config.useTLS;\n    };\n    Pusher.prototype.signin = function () {\n        this.user.signin();\n    };\n    Pusher.instances = [];\n    Pusher.isReady = false;\n    Pusher.logToConsole = false;\n    Pusher.Runtime = runtime;\n    Pusher.ScriptReceivers = runtime.ScriptReceivers;\n    Pusher.DependenciesReceivers = runtime.DependenciesReceivers;\n    Pusher.auth_callbacks = runtime.auth_callbacks;\n    return Pusher;\n}());\n/* harmony default export */ var core_pusher = __webpack_exports__[\"default\"] = (pusher_Pusher);\nfunction checkAppKey(key) {\n    if (key === null || key === undefined) {\n        throw 'You must pass your app key when you instantiate Pusher.';\n    }\n}\nruntime.setup(pusher_Pusher);\n\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=pusher.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcHVzaGVyLWpzL2Rpc3Qvd2ViL3B1c2hlci5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUksSUFBeUQ7QUFDN0Q7QUFDQSxNQUFNLEVBS3VCO0FBQzdCLENBQUM7QUFDRCxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsOEJBQW1CO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEVBQTBFLDhCQUFtQjtBQUM3RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsOEJBQW1CO0FBQzdCO0FBQ0E7QUFDQSxVQUFVLDhCQUFtQjtBQUM3QjtBQUNBO0FBQ0EsVUFBVSw4QkFBbUI7QUFDN0IsZUFBZSw4QkFBbUI7QUFDbEMsbURBQW1ELCtCQUErQjtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsOEJBQW1CO0FBQzdCO0FBQ0EsaUVBQWlFLGlCQUFpQjtBQUNsRjtBQUNBLDBEQUEwRCxhQUFhO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSw4QkFBbUI7QUFDN0IsZ0NBQWdDLDhCQUFtQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQSxXQUFXLDhCQUFtQjtBQUM5QixrREFBa0QsZ0NBQWdDO0FBQ2xGLDBFQUEwRSw4QkFBbUIsNEJBQTRCLG9CQUFvQjtBQUM3STtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsOEJBQW1CO0FBQzdCO0FBQ0Esb0NBQW9DLDRCQUE0QjtBQUNoRSwwQ0FBMEM7QUFDMUMsV0FBVyw4QkFBbUI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLDhCQUFtQixrQ0FBa0M7QUFDL0Q7QUFDQTtBQUNBLFVBQVUsOEJBQW1CO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQiw4QkFBbUIsQ0FBQyw4QkFBbUI7QUFDeEQsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGdCQUFnQixzQ0FBc0Msa0JBQWtCO0FBQ3ZGLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0EsQ0FBQztBQUNELCtDQUErQyxhQUFhO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxxQkFBcUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZ0JBQWdCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxRQUFRO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsK0NBQStDLGFBQWE7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdEOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxjQUFjO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRkFBbUYsd0JBQXdCO0FBQzNHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isa0NBQWtDO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsc0JBQXNCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBLG9DQUFvQyxNQUFnQztBQUNwRTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0Isc0NBQXNDLGtCQUFrQjtBQUN2Riw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLENBQUM7Ozs7OztBQU1EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGdDQUFnQztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixzQ0FBc0M7QUFDbkUsd0RBQXdELHlCQUF5QjtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsY0FBYztBQUN0QztBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStEO0FBQy9ELDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStEO0FBQy9ELDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QixNQUFnQztBQUN4RDtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0Isc0NBQXNDLGtCQUFrQjtBQUN2Riw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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S0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1GQUFtRiw0Q0FBNEM7QUFDL0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLDJDQUEyQztBQUNqSDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsc0NBQXNDO0FBQ3RDO0FBQ0EsS0FBSztBQUNMLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGFBQWE7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsYUFBYTtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGFBQWE7QUFDMUQsdURBQXVELGFBQWE7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2Qyw2QkFBNkI7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNB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TDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7OztBQWFBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsaUJBQWlCO0FBQ2pCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxzQ0FBc0M7QUFDdkM7O0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFdBQVcsdUJBQXVCO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLDJDQUEyQztBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBLENBQUM7QUFDRCIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wdXNoZXItanMvZGlzdC93ZWIvcHVzaGVyLmpzP2RjOGUiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBQdXNoZXIgSmF2YVNjcmlwdCBMaWJyYXJ5IHY3LjYuMFxuICogaHR0cHM6Ly9wdXNoZXIuY29tL1xuICpcbiAqIENvcHlyaWdodCAyMDIwLCBQdXNoZXJcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5jZS5cbiAqL1xuXG4oZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJQdXNoZXJcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiUHVzaGVyXCJdID0gZmFjdG9yeSgpO1xufSkod2luZG93LCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDIpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuLy8gQ29weXJpZ2h0IChDKSAyMDE2IERtaXRyeSBDaGVzdG55a2hcbi8vIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBmaWxlIGZvciBkZXRhaWxzLlxudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqIFBhY2thZ2UgYmFzZTY0IGltcGxlbWVudHMgQmFzZTY0IGVuY29kaW5nIGFuZCBkZWNvZGluZy5cbiAqL1xuLy8gSW52YWxpZCBjaGFyYWN0ZXIgdXNlZCBpbiBkZWNvZGluZyB0byBpbmRpY2F0ZVxuLy8gdGhhdCB0aGUgY2hhcmFjdGVyIHRvIGRlY29kZSBpcyBvdXQgb2YgcmFuZ2Ugb2Zcbi8vIGFscGhhYmV0IGFuZCBjYW5ub3QgYmUgZGVjb2RlZC5cbnZhciBJTlZBTElEX0JZVEUgPSAyNTY7XG4vKipcbiAqIEltcGxlbWVudHMgc3RhbmRhcmQgQmFzZTY0IGVuY29kaW5nLlxuICpcbiAqIE9wZXJhdGVzIGluIGNvbnN0YW50IHRpbWUuXG4gKi9cbnZhciBDb2RlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUT0RPKGRjaGVzdCk6IG1ldGhvZHMgdG8gZW5jb2RlIGNodW5rLWJ5LWNodW5rLlxuICAgIGZ1bmN0aW9uIENvZGVyKF9wYWRkaW5nQ2hhcmFjdGVyKSB7XG4gICAgICAgIGlmIChfcGFkZGluZ0NoYXJhY3RlciA9PT0gdm9pZCAwKSB7IF9wYWRkaW5nQ2hhcmFjdGVyID0gXCI9XCI7IH1cbiAgICAgICAgdGhpcy5fcGFkZGluZ0NoYXJhY3RlciA9IF9wYWRkaW5nQ2hhcmFjdGVyO1xuICAgIH1cbiAgICBDb2Rlci5wcm90b3R5cGUuZW5jb2RlZExlbmd0aCA9IGZ1bmN0aW9uIChsZW5ndGgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9wYWRkaW5nQ2hhcmFjdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gKGxlbmd0aCAqIDggKyA1KSAvIDYgfCAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAobGVuZ3RoICsgMikgLyAzICogNCB8IDA7XG4gICAgfTtcbiAgICBDb2Rlci5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdmFyIG91dCA9IFwiXCI7XG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgZm9yICg7IGkgPCBkYXRhLmxlbmd0aCAtIDI7IGkgKz0gMykge1xuICAgICAgICAgICAgdmFyIGMgPSAoZGF0YVtpXSA8PCAxNikgfCAoZGF0YVtpICsgMV0gPDwgOCkgfCAoZGF0YVtpICsgMl0pO1xuICAgICAgICAgICAgb3V0ICs9IHRoaXMuX2VuY29kZUJ5dGUoKGMgPj4+IDMgKiA2KSAmIDYzKTtcbiAgICAgICAgICAgIG91dCArPSB0aGlzLl9lbmNvZGVCeXRlKChjID4+PiAyICogNikgJiA2Myk7XG4gICAgICAgICAgICBvdXQgKz0gdGhpcy5fZW5jb2RlQnl0ZSgoYyA+Pj4gMSAqIDYpICYgNjMpO1xuICAgICAgICAgICAgb3V0ICs9IHRoaXMuX2VuY29kZUJ5dGUoKGMgPj4+IDAgKiA2KSAmIDYzKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGVmdCA9IGRhdGEubGVuZ3RoIC0gaTtcbiAgICAgICAgaWYgKGxlZnQgPiAwKSB7XG4gICAgICAgICAgICB2YXIgYyA9IChkYXRhW2ldIDw8IDE2KSB8IChsZWZ0ID09PSAyID8gZGF0YVtpICsgMV0gPDwgOCA6IDApO1xuICAgICAgICAgICAgb3V0ICs9IHRoaXMuX2VuY29kZUJ5dGUoKGMgPj4+IDMgKiA2KSAmIDYzKTtcbiAgICAgICAgICAgIG91dCArPSB0aGlzLl9lbmNvZGVCeXRlKChjID4+PiAyICogNikgJiA2Myk7XG4gICAgICAgICAgICBpZiAobGVmdCA9PT0gMikge1xuICAgICAgICAgICAgICAgIG91dCArPSB0aGlzLl9lbmNvZGVCeXRlKChjID4+PiAxICogNikgJiA2Myk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gdGhpcy5fcGFkZGluZ0NoYXJhY3RlciB8fCBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9IHRoaXMuX3BhZGRpbmdDaGFyYWN0ZXIgfHwgXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH07XG4gICAgQ29kZXIucHJvdG90eXBlLm1heERlY29kZWRMZW5ndGggPSBmdW5jdGlvbiAobGVuZ3RoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcGFkZGluZ0NoYXJhY3Rlcikge1xuICAgICAgICAgICAgcmV0dXJuIChsZW5ndGggKiA2ICsgNykgLyA4IHwgMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGVuZ3RoIC8gNCAqIDMgfCAwO1xuICAgIH07XG4gICAgQ29kZXIucHJvdG90eXBlLmRlY29kZWRMZW5ndGggPSBmdW5jdGlvbiAocykge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhEZWNvZGVkTGVuZ3RoKHMubGVuZ3RoIC0gdGhpcy5fZ2V0UGFkZGluZ0xlbmd0aChzKSk7XG4gICAgfTtcbiAgICBDb2Rlci5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgaWYgKHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhZGRpbmdMZW5ndGggPSB0aGlzLl9nZXRQYWRkaW5nTGVuZ3RoKHMpO1xuICAgICAgICB2YXIgbGVuZ3RoID0gcy5sZW5ndGggLSBwYWRkaW5nTGVuZ3RoO1xuICAgICAgICB2YXIgb3V0ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5tYXhEZWNvZGVkTGVuZ3RoKGxlbmd0aCkpO1xuICAgICAgICB2YXIgb3AgPSAwO1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHZhciBoYXZlQmFkID0gMDtcbiAgICAgICAgdmFyIHYwID0gMCwgdjEgPSAwLCB2MiA9IDAsIHYzID0gMDtcbiAgICAgICAgZm9yICg7IGkgPCBsZW5ndGggLSA0OyBpICs9IDQpIHtcbiAgICAgICAgICAgIHYwID0gdGhpcy5fZGVjb2RlQ2hhcihzLmNoYXJDb2RlQXQoaSArIDApKTtcbiAgICAgICAgICAgIHYxID0gdGhpcy5fZGVjb2RlQ2hhcihzLmNoYXJDb2RlQXQoaSArIDEpKTtcbiAgICAgICAgICAgIHYyID0gdGhpcy5fZGVjb2RlQ2hhcihzLmNoYXJDb2RlQXQoaSArIDIpKTtcbiAgICAgICAgICAgIHYzID0gdGhpcy5fZGVjb2RlQ2hhcihzLmNoYXJDb2RlQXQoaSArIDMpKTtcbiAgICAgICAgICAgIG91dFtvcCsrXSA9ICh2MCA8PCAyKSB8ICh2MSA+Pj4gNCk7XG4gICAgICAgICAgICBvdXRbb3ArK10gPSAodjEgPDwgNCkgfCAodjIgPj4+IDIpO1xuICAgICAgICAgICAgb3V0W29wKytdID0gKHYyIDw8IDYpIHwgdjM7XG4gICAgICAgICAgICBoYXZlQmFkIHw9IHYwICYgSU5WQUxJRF9CWVRFO1xuICAgICAgICAgICAgaGF2ZUJhZCB8PSB2MSAmIElOVkFMSURfQllURTtcbiAgICAgICAgICAgIGhhdmVCYWQgfD0gdjIgJiBJTlZBTElEX0JZVEU7XG4gICAgICAgICAgICBoYXZlQmFkIHw9IHYzICYgSU5WQUxJRF9CWVRFO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdjAgPSB0aGlzLl9kZWNvZGVDaGFyKHMuY2hhckNvZGVBdChpKSk7XG4gICAgICAgICAgICB2MSA9IHRoaXMuX2RlY29kZUNoYXIocy5jaGFyQ29kZUF0KGkgKyAxKSk7XG4gICAgICAgICAgICBvdXRbb3ArK10gPSAodjAgPDwgMikgfCAodjEgPj4+IDQpO1xuICAgICAgICAgICAgaGF2ZUJhZCB8PSB2MCAmIElOVkFMSURfQllURTtcbiAgICAgICAgICAgIGhhdmVCYWQgfD0gdjEgJiBJTlZBTElEX0JZVEU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPCBsZW5ndGggLSAyKSB7XG4gICAgICAgICAgICB2MiA9IHRoaXMuX2RlY29kZUNoYXIocy5jaGFyQ29kZUF0KGkgKyAyKSk7XG4gICAgICAgICAgICBvdXRbb3ArK10gPSAodjEgPDwgNCkgfCAodjIgPj4+IDIpO1xuICAgICAgICAgICAgaGF2ZUJhZCB8PSB2MiAmIElOVkFMSURfQllURTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDMpIHtcbiAgICAgICAgICAgIHYzID0gdGhpcy5fZGVjb2RlQ2hhcihzLmNoYXJDb2RlQXQoaSArIDMpKTtcbiAgICAgICAgICAgIG91dFtvcCsrXSA9ICh2MiA8PCA2KSB8IHYzO1xuICAgICAgICAgICAgaGF2ZUJhZCB8PSB2MyAmIElOVkFMSURfQllURTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGF2ZUJhZCAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFzZTY0Q29kZXI6IGluY29ycmVjdCBjaGFyYWN0ZXJzIGZvciBkZWNvZGluZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH07XG4gICAgLy8gU3RhbmRhcmQgZW5jb2RpbmcgaGF2ZSB0aGUgZm9sbG93aW5nIGVuY29kZWQvZGVjb2RlZCByYW5nZXMsXG4gICAgLy8gd2hpY2ggd2UgbmVlZCB0byBjb252ZXJ0IGJldHdlZW4uXG4gICAgLy9cbiAgICAvLyBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiAwMTIzNDU2Nzg5ICArICAgL1xuICAgIC8vIEluZGV4OiAgIDAgLSAyNSAgICAgICAgICAgICAgICAgICAgMjYgLSA1MSAgICAgICAgICAgICAgNTIgLSA2MSAgIDYyICA2M1xuICAgIC8vIEFTQ0lJOiAgNjUgLSA5MCAgICAgICAgICAgICAgICAgICAgOTcgLSAxMjIgICAgICAgICAgICAgNDggLSA1NyAgIDQzICA0N1xuICAgIC8vXG4gICAgLy8gRW5jb2RlIDYgYml0cyBpbiBiIGludG8gYSBuZXcgY2hhcmFjdGVyLlxuICAgIENvZGVyLnByb3RvdHlwZS5fZW5jb2RlQnl0ZSA9IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIC8vIEVuY29kaW5nIHVzZXMgY29uc3RhbnQgdGltZSBvcGVyYXRpb25zIGFzIGZvbGxvd3M6XG4gICAgICAgIC8vXG4gICAgICAgIC8vIDEuIERlZmluZSBjb21wYXJpc29uIG9mIEEgd2l0aCBCIHVzaW5nIChBIC0gQikgPj4+IDg6XG4gICAgICAgIC8vICAgICAgICAgIGlmIEEgPiBCLCB0aGVuIHJlc3VsdCBpcyBwb3NpdGl2ZSBpbnRlZ2VyXG4gICAgICAgIC8vICAgICAgICAgIGlmIEEgPD0gQiwgdGhlbiByZXN1bHQgaXMgMFxuICAgICAgICAvL1xuICAgICAgICAvLyAyLiBEZWZpbmUgc2VsZWN0aW9uIG9mIEMgb3IgMCB1c2luZyBiaXR3aXNlIEFORDogWCAmIEM6XG4gICAgICAgIC8vICAgICAgICAgIGlmIFggPT0gMCwgdGhlbiByZXN1bHQgaXMgMFxuICAgICAgICAvLyAgICAgICAgICBpZiBYICE9IDAsIHRoZW4gcmVzdWx0IGlzIENcbiAgICAgICAgLy9cbiAgICAgICAgLy8gMy4gU3RhcnQgd2l0aCB0aGUgc21hbGxlc3QgY29tcGFyaXNvbiAoYiA+PSAwKSwgd2hpY2ggaXMgYWx3YXlzXG4gICAgICAgIC8vICAgIHRydWUsIHNvIHNldCB0aGUgcmVzdWx0IHRvIHRoZSBzdGFydGluZyBBU0NJSSB2YWx1ZSAoNjUpLlxuICAgICAgICAvL1xuICAgICAgICAvLyA0LiBDb250aW51ZSBjb21wYXJpbmcgYiB0byBoaWdoZXIgQVNDSUkgdmFsdWVzLCBhbmQgc2VsZWN0aW5nXG4gICAgICAgIC8vICAgIHplcm8gaWYgY29tcGFyaXNvbiBpc24ndCB0cnVlLCBvdGhlcndpc2Ugc2VsZWN0aW5nIGEgdmFsdWVcbiAgICAgICAgLy8gICAgdG8gYWRkIHRvIHJlc3VsdCwgd2hpY2g6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgIGEpIHVuZG9lcyB0aGUgcHJldmlvdXMgYWRkaXRpb25cbiAgICAgICAgLy8gICAgICAgICAgYikgcHJvdmlkZXMgbmV3IHZhbHVlIHRvIGFkZFxuICAgICAgICAvL1xuICAgICAgICB2YXIgcmVzdWx0ID0gYjtcbiAgICAgICAgLy8gYiA+PSAwXG4gICAgICAgIHJlc3VsdCArPSA2NTtcbiAgICAgICAgLy8gYiA+IDI1XG4gICAgICAgIHJlc3VsdCArPSAoKDI1IC0gYikgPj4+IDgpICYgKCgwIC0gNjUpIC0gMjYgKyA5Nyk7XG4gICAgICAgIC8vIGIgPiA1MVxuICAgICAgICByZXN1bHQgKz0gKCg1MSAtIGIpID4+PiA4KSAmICgoMjYgLSA5NykgLSA1MiArIDQ4KTtcbiAgICAgICAgLy8gYiA+IDYxXG4gICAgICAgIHJlc3VsdCArPSAoKDYxIC0gYikgPj4+IDgpICYgKCg1MiAtIDQ4KSAtIDYyICsgNDMpO1xuICAgICAgICAvLyBiID4gNjJcbiAgICAgICAgcmVzdWx0ICs9ICgoNjIgLSBiKSA+Pj4gOCkgJiAoKDYyIC0gNDMpIC0gNjMgKyA0Nyk7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHJlc3VsdCk7XG4gICAgfTtcbiAgICAvLyBEZWNvZGUgYSBjaGFyYWN0ZXIgY29kZSBpbnRvIGEgYnl0ZS5cbiAgICAvLyBNdXN0IHJldHVybiAyNTYgaWYgY2hhcmFjdGVyIGlzIG91dCBvZiBhbHBoYWJldCByYW5nZS5cbiAgICBDb2Rlci5wcm90b3R5cGUuX2RlY29kZUNoYXIgPSBmdW5jdGlvbiAoYykge1xuICAgICAgICAvLyBEZWNvZGluZyB3b3JrcyBzaW1pbGFyIHRvIGVuY29kaW5nOiB1c2luZyB0aGUgc2FtZSBjb21wYXJpc29uXG4gICAgICAgIC8vIGZ1bmN0aW9uLCBidXQgbm93IGl0IHdvcmtzIG9uIHJhbmdlczogcmVzdWx0IGlzIGFsd2F5cyBpbmNyZW1lbnRlZFxuICAgICAgICAvLyBieSB2YWx1ZSwgYnV0IHRoaXMgdmFsdWUgYmVjb21lcyB6ZXJvIGlmIHRoZSByYW5nZSBpcyBub3RcbiAgICAgICAgLy8gc2F0aXNmaWVkLlxuICAgICAgICAvL1xuICAgICAgICAvLyBEZWNvZGluZyBzdGFydHMgd2l0aCBpbnZhbGlkIHZhbHVlLCAyNTYsIHdoaWNoIGlzIHRoZW5cbiAgICAgICAgLy8gc3VidHJhY3RlZCB3aGVuIHRoZSByYW5nZSBpcyBzYXRpc2ZpZWQuIElmIG5vbmUgb2YgdGhlIHJhbmdlc1xuICAgICAgICAvLyBhcHBseSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgMjU2LCB3aGljaCBpcyB0aGVuIGNoZWNrZWQgYnlcbiAgICAgICAgLy8gdGhlIGNhbGxlciB0byB0aHJvdyBlcnJvci5cbiAgICAgICAgdmFyIHJlc3VsdCA9IElOVkFMSURfQllURTsgLy8gc3RhcnQgd2l0aCBpbnZhbGlkIGNoYXJhY3RlclxuICAgICAgICAvLyBjID09IDQzIChjID4gNDIgYW5kIGMgPCA0NClcbiAgICAgICAgcmVzdWx0ICs9ICgoKDQyIC0gYykgJiAoYyAtIDQ0KSkgPj4+IDgpICYgKC1JTlZBTElEX0JZVEUgKyBjIC0gNDMgKyA2Mik7XG4gICAgICAgIC8vIGMgPT0gNDcgKGMgPiA0NiBhbmQgYyA8IDQ4KVxuICAgICAgICByZXN1bHQgKz0gKCgoNDYgLSBjKSAmIChjIC0gNDgpKSA+Pj4gOCkgJiAoLUlOVkFMSURfQllURSArIGMgLSA0NyArIDYzKTtcbiAgICAgICAgLy8gYyA+IDQ3IGFuZCBjIDwgNThcbiAgICAgICAgcmVzdWx0ICs9ICgoKDQ3IC0gYykgJiAoYyAtIDU4KSkgPj4+IDgpICYgKC1JTlZBTElEX0JZVEUgKyBjIC0gNDggKyA1Mik7XG4gICAgICAgIC8vIGMgPiA2NCBhbmQgYyA8IDkxXG4gICAgICAgIHJlc3VsdCArPSAoKCg2NCAtIGMpICYgKGMgLSA5MSkpID4+PiA4KSAmICgtSU5WQUxJRF9CWVRFICsgYyAtIDY1ICsgMCk7XG4gICAgICAgIC8vIGMgPiA5NiBhbmQgYyA8IDEyM1xuICAgICAgICByZXN1bHQgKz0gKCgoOTYgLSBjKSAmIChjIC0gMTIzKSkgPj4+IDgpICYgKC1JTlZBTElEX0JZVEUgKyBjIC0gOTcgKyAyNik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBDb2Rlci5wcm90b3R5cGUuX2dldFBhZGRpbmdMZW5ndGggPSBmdW5jdGlvbiAocykge1xuICAgICAgICB2YXIgcGFkZGluZ0xlbmd0aCA9IDA7XG4gICAgICAgIGlmICh0aGlzLl9wYWRkaW5nQ2hhcmFjdGVyKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGlmIChzW2ldICE9PSB0aGlzLl9wYWRkaW5nQ2hhcmFjdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYWRkaW5nTGVuZ3RoKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocy5sZW5ndGggPCA0IHx8IHBhZGRpbmdMZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFzZTY0Q29kZXI6IGluY29ycmVjdCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWRkaW5nTGVuZ3RoO1xuICAgIH07XG4gICAgcmV0dXJuIENvZGVyO1xufSgpKTtcbmV4cG9ydHMuQ29kZXIgPSBDb2RlcjtcbnZhciBzdGRDb2RlciA9IG5ldyBDb2RlcigpO1xuZnVuY3Rpb24gZW5jb2RlKGRhdGEpIHtcbiAgICByZXR1cm4gc3RkQ29kZXIuZW5jb2RlKGRhdGEpO1xufVxuZXhwb3J0cy5lbmNvZGUgPSBlbmNvZGU7XG5mdW5jdGlvbiBkZWNvZGUocykge1xuICAgIHJldHVybiBzdGRDb2Rlci5kZWNvZGUocyk7XG59XG5leHBvcnRzLmRlY29kZSA9IGRlY29kZTtcbi8qKlxuICogSW1wbGVtZW50cyBVUkwtc2FmZSBCYXNlNjQgZW5jb2RpbmcuXG4gKiAoU2FtZSBhcyBCYXNlNjQsIGJ1dCAnKycgaXMgcmVwbGFjZWQgd2l0aCAnLScsIGFuZCAnLycgd2l0aCAnXycpLlxuICpcbiAqIE9wZXJhdGVzIGluIGNvbnN0YW50IHRpbWUuXG4gKi9cbnZhciBVUkxTYWZlQ29kZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVSTFNhZmVDb2RlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBVUkxTYWZlQ29kZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgLy8gVVJMLXNhZmUgZW5jb2RpbmcgaGF2ZSB0aGUgZm9sbG93aW5nIGVuY29kZWQvZGVjb2RlZCByYW5nZXM6XG4gICAgLy9cbiAgICAvLyBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiAwMTIzNDU2Nzg5ICAtICAgX1xuICAgIC8vIEluZGV4OiAgIDAgLSAyNSAgICAgICAgICAgICAgICAgICAgMjYgLSA1MSAgICAgICAgICAgICAgNTIgLSA2MSAgIDYyICA2M1xuICAgIC8vIEFTQ0lJOiAgNjUgLSA5MCAgICAgICAgICAgICAgICAgICAgOTcgLSAxMjIgICAgICAgICAgICAgNDggLSA1NyAgIDQ1ICA5NVxuICAgIC8vXG4gICAgVVJMU2FmZUNvZGVyLnByb3RvdHlwZS5fZW5jb2RlQnl0ZSA9IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBiO1xuICAgICAgICAvLyBiID49IDBcbiAgICAgICAgcmVzdWx0ICs9IDY1O1xuICAgICAgICAvLyBiID4gMjVcbiAgICAgICAgcmVzdWx0ICs9ICgoMjUgLSBiKSA+Pj4gOCkgJiAoKDAgLSA2NSkgLSAyNiArIDk3KTtcbiAgICAgICAgLy8gYiA+IDUxXG4gICAgICAgIHJlc3VsdCArPSAoKDUxIC0gYikgPj4+IDgpICYgKCgyNiAtIDk3KSAtIDUyICsgNDgpO1xuICAgICAgICAvLyBiID4gNjFcbiAgICAgICAgcmVzdWx0ICs9ICgoNjEgLSBiKSA+Pj4gOCkgJiAoKDUyIC0gNDgpIC0gNjIgKyA0NSk7XG4gICAgICAgIC8vIGIgPiA2MlxuICAgICAgICByZXN1bHQgKz0gKCg2MiAtIGIpID4+PiA4KSAmICgoNjIgLSA0NSkgLSA2MyArIDk1KTtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocmVzdWx0KTtcbiAgICB9O1xuICAgIFVSTFNhZmVDb2Rlci5wcm90b3R5cGUuX2RlY29kZUNoYXIgPSBmdW5jdGlvbiAoYykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gSU5WQUxJRF9CWVRFO1xuICAgICAgICAvLyBjID09IDQ1IChjID4gNDQgYW5kIGMgPCA0NilcbiAgICAgICAgcmVzdWx0ICs9ICgoKDQ0IC0gYykgJiAoYyAtIDQ2KSkgPj4+IDgpICYgKC1JTlZBTElEX0JZVEUgKyBjIC0gNDUgKyA2Mik7XG4gICAgICAgIC8vIGMgPT0gOTUgKGMgPiA5NCBhbmQgYyA8IDk2KVxuICAgICAgICByZXN1bHQgKz0gKCgoOTQgLSBjKSAmIChjIC0gOTYpKSA+Pj4gOCkgJiAoLUlOVkFMSURfQllURSArIGMgLSA5NSArIDYzKTtcbiAgICAgICAgLy8gYyA+IDQ3IGFuZCBjIDwgNThcbiAgICAgICAgcmVzdWx0ICs9ICgoKDQ3IC0gYykgJiAoYyAtIDU4KSkgPj4+IDgpICYgKC1JTlZBTElEX0JZVEUgKyBjIC0gNDggKyA1Mik7XG4gICAgICAgIC8vIGMgPiA2NCBhbmQgYyA8IDkxXG4gICAgICAgIHJlc3VsdCArPSAoKCg2NCAtIGMpICYgKGMgLSA5MSkpID4+PiA4KSAmICgtSU5WQUxJRF9CWVRFICsgYyAtIDY1ICsgMCk7XG4gICAgICAgIC8vIGMgPiA5NiBhbmQgYyA8IDEyM1xuICAgICAgICByZXN1bHQgKz0gKCgoOTYgLSBjKSAmIChjIC0gMTIzKSkgPj4+IDgpICYgKC1JTlZBTElEX0JZVEUgKyBjIC0gOTcgKyAyNik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICByZXR1cm4gVVJMU2FmZUNvZGVyO1xufShDb2RlcikpO1xuZXhwb3J0cy5VUkxTYWZlQ29kZXIgPSBVUkxTYWZlQ29kZXI7XG52YXIgdXJsU2FmZUNvZGVyID0gbmV3IFVSTFNhZmVDb2RlcigpO1xuZnVuY3Rpb24gZW5jb2RlVVJMU2FmZShkYXRhKSB7XG4gICAgcmV0dXJuIHVybFNhZmVDb2Rlci5lbmNvZGUoZGF0YSk7XG59XG5leHBvcnRzLmVuY29kZVVSTFNhZmUgPSBlbmNvZGVVUkxTYWZlO1xuZnVuY3Rpb24gZGVjb2RlVVJMU2FmZShzKSB7XG4gICAgcmV0dXJuIHVybFNhZmVDb2Rlci5kZWNvZGUocyk7XG59XG5leHBvcnRzLmRlY29kZVVSTFNhZmUgPSBkZWNvZGVVUkxTYWZlO1xuZXhwb3J0cy5lbmNvZGVkTGVuZ3RoID0gZnVuY3Rpb24gKGxlbmd0aCkge1xuICAgIHJldHVybiBzdGRDb2Rlci5lbmNvZGVkTGVuZ3RoKGxlbmd0aCk7XG59O1xuZXhwb3J0cy5tYXhEZWNvZGVkTGVuZ3RoID0gZnVuY3Rpb24gKGxlbmd0aCkge1xuICAgIHJldHVybiBzdGRDb2Rlci5tYXhEZWNvZGVkTGVuZ3RoKGxlbmd0aCk7XG59O1xuZXhwb3J0cy5kZWNvZGVkTGVuZ3RoID0gZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4gc3RkQ29kZXIuZGVjb2RlZExlbmd0aChzKTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTYgRG1pdHJ5IENoZXN0bnlraFxuLy8gTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGZpbGUgZm9yIGRldGFpbHMuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqIFBhY2thZ2UgdXRmOCBpbXBsZW1lbnRzIFVURi04IGVuY29kaW5nIGFuZCBkZWNvZGluZy5cbiAqL1xudmFyIElOVkFMSURfVVRGMTYgPSBcInV0Zjg6IGludmFsaWQgc3RyaW5nXCI7XG52YXIgSU5WQUxJRF9VVEY4ID0gXCJ1dGY4OiBpbnZhbGlkIHNvdXJjZSBlbmNvZGluZ1wiO1xuLyoqXG4gKiBFbmNvZGVzIHRoZSBnaXZlbiBzdHJpbmcgaW50byBVVEYtOCBieXRlIGFycmF5LlxuICogVGhyb3dzIGlmIHRoZSBzb3VyY2Ugc3RyaW5nIGhhcyBpbnZhbGlkIFVURi0xNiBlbmNvZGluZy5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlKHMpIHtcbiAgICAvLyBDYWxjdWxhdGUgcmVzdWx0IGxlbmd0aCBhbmQgYWxsb2NhdGUgb3V0cHV0IGFycmF5LlxuICAgIC8vIGVuY29kZWRMZW5ndGgoKSBhbHNvIHZhbGlkYXRlcyBzdHJpbmcgYW5kIHRocm93cyBlcnJvcnMsXG4gICAgLy8gc28gd2UgZG9uJ3QgbmVlZCByZXBlYXQgdmFsaWRhdGlvbiBoZXJlLlxuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheShlbmNvZGVkTGVuZ3RoKHMpKTtcbiAgICB2YXIgcG9zID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGMgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgYXJyW3BvcysrXSA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAgICAgICBhcnJbcG9zKytdID0gMHhjMCB8IGMgPj4gNjtcbiAgICAgICAgICAgIGFycltwb3MrK10gPSAweDgwIHwgYyAmIDB4M2Y7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYyA8IDB4ZDgwMCkge1xuICAgICAgICAgICAgYXJyW3BvcysrXSA9IDB4ZTAgfCBjID4+IDEyO1xuICAgICAgICAgICAgYXJyW3BvcysrXSA9IDB4ODAgfCAoYyA+PiA2KSAmIDB4M2Y7XG4gICAgICAgICAgICBhcnJbcG9zKytdID0gMHg4MCB8IGMgJiAweDNmO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaSsrOyAvLyBnZXQgb25lIG1vcmUgY2hhcmFjdGVyXG4gICAgICAgICAgICBjID0gKGMgJiAweDNmZikgPDwgMTA7XG4gICAgICAgICAgICBjIHw9IHMuY2hhckNvZGVBdChpKSAmIDB4M2ZmO1xuICAgICAgICAgICAgYyArPSAweDEwMDAwO1xuICAgICAgICAgICAgYXJyW3BvcysrXSA9IDB4ZjAgfCBjID4+IDE4O1xuICAgICAgICAgICAgYXJyW3BvcysrXSA9IDB4ODAgfCAoYyA+PiAxMikgJiAweDNmO1xuICAgICAgICAgICAgYXJyW3BvcysrXSA9IDB4ODAgfCAoYyA+PiA2KSAmIDB4M2Y7XG4gICAgICAgICAgICBhcnJbcG9zKytdID0gMHg4MCB8IGMgJiAweDNmO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG59XG5leHBvcnRzLmVuY29kZSA9IGVuY29kZTtcbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIGVuY29kZSB0aGUgZ2l2ZW4gc3RyaW5nIGludG8gVVRGLTguXG4gKiBUaHJvd3MgaWYgdGhlIHNvdXJjZSBzdHJpbmcgaGFzIGludmFsaWQgVVRGLTE2IGVuY29kaW5nLlxuICovXG5mdW5jdGlvbiBlbmNvZGVkTGVuZ3RoKHMpIHtcbiAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGMgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgcmVzdWx0ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjIDwgMHhkODAwKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjIDw9IDB4ZGZmZikge1xuICAgICAgICAgICAgaWYgKGkgPj0gcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKElOVkFMSURfVVRGMTYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrOyAvLyBcImVhdFwiIG5leHQgY2hhcmFjdGVyXG4gICAgICAgICAgICByZXN1bHQgKz0gNDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihJTlZBTElEX1VURjE2KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0cy5lbmNvZGVkTGVuZ3RoID0gZW5jb2RlZExlbmd0aDtcbi8qKlxuICogRGVjb2RlcyB0aGUgZ2l2ZW4gYnl0ZSBhcnJheSBmcm9tIFVURi04IGludG8gYSBzdHJpbmcuXG4gKiBUaHJvd3MgaWYgZW5jb2RpbmcgaXMgaW52YWxpZC5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlKGFycikge1xuICAgIHZhciBjaGFycyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBiID0gYXJyW2ldO1xuICAgICAgICBpZiAoYiAmIDB4ODApIHtcbiAgICAgICAgICAgIHZhciBtaW4gPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoYiA8IDB4ZTApIHtcbiAgICAgICAgICAgICAgICAvLyBOZWVkIDEgbW9yZSBieXRlLlxuICAgICAgICAgICAgICAgIGlmIChpID49IGFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKElOVkFMSURfVVRGOCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBuMSA9IGFyclsrK2ldO1xuICAgICAgICAgICAgICAgIGlmICgobjEgJiAweGMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSU5WQUxJRF9VVEY4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYiA9IChiICYgMHgxZikgPDwgNiB8IChuMSAmIDB4M2YpO1xuICAgICAgICAgICAgICAgIG1pbiA9IDB4ODA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiIDwgMHhmMCkge1xuICAgICAgICAgICAgICAgIC8vIE5lZWQgMiBtb3JlIGJ5dGVzLlxuICAgICAgICAgICAgICAgIGlmIChpID49IGFyci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihJTlZBTElEX1VURjgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbjEgPSBhcnJbKytpXTtcbiAgICAgICAgICAgICAgICB2YXIgbjIgPSBhcnJbKytpXTtcbiAgICAgICAgICAgICAgICBpZiAoKG4xICYgMHhjMCkgIT09IDB4ODAgfHwgKG4yICYgMHhjMCkgIT09IDB4ODApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKElOVkFMSURfVVRGOCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGIgPSAoYiAmIDB4MGYpIDw8IDEyIHwgKG4xICYgMHgzZikgPDwgNiB8IChuMiAmIDB4M2YpO1xuICAgICAgICAgICAgICAgIG1pbiA9IDB4ODAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYiA8IDB4ZjgpIHtcbiAgICAgICAgICAgICAgICAvLyBOZWVkIDMgbW9yZSBieXRlcy5cbiAgICAgICAgICAgICAgICBpZiAoaSA+PSBhcnIubGVuZ3RoIC0gMikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSU5WQUxJRF9VVEY4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG4xID0gYXJyWysraV07XG4gICAgICAgICAgICAgICAgdmFyIG4yID0gYXJyWysraV07XG4gICAgICAgICAgICAgICAgdmFyIG4zID0gYXJyWysraV07XG4gICAgICAgICAgICAgICAgaWYgKChuMSAmIDB4YzApICE9PSAweDgwIHx8IChuMiAmIDB4YzApICE9PSAweDgwIHx8IChuMyAmIDB4YzApICE9PSAweDgwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihJTlZBTElEX1VURjgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBiID0gKGIgJiAweDBmKSA8PCAxOCB8IChuMSAmIDB4M2YpIDw8IDEyIHwgKG4yICYgMHgzZikgPDwgNiB8IChuMyAmIDB4M2YpO1xuICAgICAgICAgICAgICAgIG1pbiA9IDB4MTAwMDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSU5WQUxJRF9VVEY4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiIDwgbWluIHx8IChiID49IDB4ZDgwMCAmJiBiIDw9IDB4ZGZmZikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSU5WQUxJRF9VVEY4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiID49IDB4MTAwMDApIHtcbiAgICAgICAgICAgICAgICAvLyBTdXJyb2dhdGUgcGFpci5cbiAgICAgICAgICAgICAgICBpZiAoYiA+IDB4MTBmZmZmKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihJTlZBTElEX1VURjgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBiIC09IDB4MTAwMDA7XG4gICAgICAgICAgICAgICAgY2hhcnMucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ZDgwMCB8IChiID4+IDEwKSkpO1xuICAgICAgICAgICAgICAgIGIgPSAweGRjMDAgfCAoYiAmIDB4M2ZmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjaGFycy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYikpO1xuICAgIH1cbiAgICByZXR1cm4gY2hhcnMuam9pbihcIlwiKTtcbn1cbmV4cG9ydHMuZGVjb2RlID0gZGVjb2RlO1xuXG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vLyByZXF1aXJlZCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIHJlcXVpcmUoJ3B1c2hlcicpLmRlZmF1bHQgZXRjLlxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpLmRlZmF1bHQ7XG5cblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLy8gRVNNIENPTVBBVCBGTEFHXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3J1bnRpbWVzL3dlYi9kb20vc2NyaXB0X3JlY2VpdmVyX2ZhY3RvcnkudHNcbnZhciBTY3JpcHRSZWNlaXZlckZhY3RvcnkgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNjcmlwdFJlY2VpdmVyRmFjdG9yeShwcmVmaXgsIG5hbWUpIHtcbiAgICAgICAgdGhpcy5sYXN0SWQgPSAwO1xuICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB9XG4gICAgU2NyaXB0UmVjZWl2ZXJGYWN0b3J5LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5sYXN0SWQrKztcbiAgICAgICAgdmFyIG51bWJlciA9IHRoaXMubGFzdElkO1xuICAgICAgICB2YXIgaWQgPSB0aGlzLnByZWZpeCArIG51bWJlcjtcbiAgICAgICAgdmFyIG5hbWUgPSB0aGlzLm5hbWUgKyAnWycgKyBudW1iZXIgKyAnXSc7XG4gICAgICAgIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGNhbGxiYWNrV3JhcHBlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghY2FsbGVkKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzW251bWJlcl0gPSBjYWxsYmFja1dyYXBwZXI7XG4gICAgICAgIHJldHVybiB7IG51bWJlcjogbnVtYmVyLCBpZDogaWQsIG5hbWU6IG5hbWUsIGNhbGxiYWNrOiBjYWxsYmFja1dyYXBwZXIgfTtcbiAgICB9O1xuICAgIFNjcmlwdFJlY2VpdmVyRmFjdG9yeS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHJlY2VpdmVyKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzW3JlY2VpdmVyLm51bWJlcl07XG4gICAgfTtcbiAgICByZXR1cm4gU2NyaXB0UmVjZWl2ZXJGYWN0b3J5O1xufSgpKTtcblxudmFyIFNjcmlwdFJlY2VpdmVycyA9IG5ldyBTY3JpcHRSZWNlaXZlckZhY3RvcnkoJ19wdXNoZXJfc2NyaXB0XycsICdQdXNoZXIuU2NyaXB0UmVjZWl2ZXJzJyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvcmUvZGVmYXVsdHMudHNcbnZhciBEZWZhdWx0cyA9IHtcbiAgICBWRVJTSU9OOiBcIjcuNi4wXCIsXG4gICAgUFJPVE9DT0w6IDcsXG4gICAgd3NQb3J0OiA4MCxcbiAgICB3c3NQb3J0OiA0NDMsXG4gICAgd3NQYXRoOiAnJyxcbiAgICBodHRwSG9zdDogJ3NvY2tqcy5wdXNoZXIuY29tJyxcbiAgICBodHRwUG9ydDogODAsXG4gICAgaHR0cHNQb3J0OiA0NDMsXG4gICAgaHR0cFBhdGg6ICcvcHVzaGVyJyxcbiAgICBzdGF0c19ob3N0OiAnc3RhdHMucHVzaGVyLmNvbScsXG4gICAgYXV0aEVuZHBvaW50OiAnL3B1c2hlci9hdXRoJyxcbiAgICBhdXRoVHJhbnNwb3J0OiAnYWpheCcsXG4gICAgYWN0aXZpdHlUaW1lb3V0OiAxMjAwMDAsXG4gICAgcG9uZ1RpbWVvdXQ6IDMwMDAwLFxuICAgIHVuYXZhaWxhYmxlVGltZW91dDogMTAwMDAsXG4gICAgY2x1c3RlcjogJ210MScsXG4gICAgdXNlckF1dGhlbnRpY2F0aW9uOiB7XG4gICAgICAgIGVuZHBvaW50OiAnL3B1c2hlci91c2VyLWF1dGgnLFxuICAgICAgICB0cmFuc3BvcnQ6ICdhamF4J1xuICAgIH0sXG4gICAgY2hhbm5lbEF1dGhvcml6YXRpb246IHtcbiAgICAgICAgZW5kcG9pbnQ6ICcvcHVzaGVyL2F1dGgnLFxuICAgICAgICB0cmFuc3BvcnQ6ICdhamF4J1xuICAgIH0sXG4gICAgY2RuX2h0dHA6IFwiaHR0cDovL2pzLnB1c2hlci5jb21cIixcbiAgICBjZG5faHR0cHM6IFwiaHR0cHM6Ly9qcy5wdXNoZXIuY29tXCIsXG4gICAgZGVwZW5kZW5jeV9zdWZmaXg6IFwiXCJcbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBkZWZhdWx0cyA9IChEZWZhdWx0cyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3J1bnRpbWVzL3dlYi9kb20vZGVwZW5kZW5jeV9sb2FkZXIudHNcblxuXG52YXIgZGVwZW5kZW5jeV9sb2FkZXJfRGVwZW5kZW5jeUxvYWRlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVwZW5kZW5jeUxvYWRlcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMucmVjZWl2ZXJzID0gb3B0aW9ucy5yZWNlaXZlcnMgfHwgU2NyaXB0UmVjZWl2ZXJzO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB7fTtcbiAgICB9XG4gICAgRGVwZW5kZW5jeUxvYWRlci5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uIChuYW1lLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIGlmIChzZWxmLmxvYWRpbmdbbmFtZV0gJiYgc2VsZi5sb2FkaW5nW25hbWVdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNlbGYubG9hZGluZ1tuYW1lXS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYubG9hZGluZ1tuYW1lXSA9IFtjYWxsYmFja107XG4gICAgICAgICAgICB2YXIgcmVxdWVzdCA9IHJ1bnRpbWUuY3JlYXRlU2NyaXB0UmVxdWVzdChzZWxmLmdldFBhdGgobmFtZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgdmFyIHJlY2VpdmVyID0gc2VsZi5yZWNlaXZlcnMuY3JlYXRlKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHNlbGYucmVjZWl2ZXJzLnJlbW92ZShyZWNlaXZlcik7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYubG9hZGluZ1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2tzID0gc2VsZi5sb2FkaW5nW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5sb2FkaW5nW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24gKHdhc1N1Y2Nlc3NmdWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd2FzU3VjY2Vzc2Z1bCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuY2xlYW51cCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzW2ldKGVycm9yLCBzdWNjZXNzQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXF1ZXN0LnNlbmQocmVjZWl2ZXIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZXBlbmRlbmN5TG9hZGVyLnByb3RvdHlwZS5nZXRSb290ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGNkbjtcbiAgICAgICAgdmFyIHByb3RvY29sID0gcnVudGltZS5nZXREb2N1bWVudCgpLmxvY2F0aW9uLnByb3RvY29sO1xuICAgICAgICBpZiAoKG9wdGlvbnMgJiYgb3B0aW9ucy51c2VUTFMpIHx8IHByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgICAgICAgY2RuID0gdGhpcy5vcHRpb25zLmNkbl9odHRwcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNkbiA9IHRoaXMub3B0aW9ucy5jZG5faHR0cDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2RuLnJlcGxhY2UoL1xcLyokLywgJycpICsgJy8nICsgdGhpcy5vcHRpb25zLnZlcnNpb247XG4gICAgfTtcbiAgICBEZXBlbmRlbmN5TG9hZGVyLnByb3RvdHlwZS5nZXRQYXRoID0gZnVuY3Rpb24gKG5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Um9vdChvcHRpb25zKSArICcvJyArIG5hbWUgKyB0aGlzLm9wdGlvbnMuc3VmZml4ICsgJy5qcyc7XG4gICAgfTtcbiAgICByZXR1cm4gRGVwZW5kZW5jeUxvYWRlcjtcbn0oKSk7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBkZXBlbmRlbmN5X2xvYWRlciA9IChkZXBlbmRlbmN5X2xvYWRlcl9EZXBlbmRlbmN5TG9hZGVyKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvcnVudGltZXMvd2ViL2RvbS9kZXBlbmRlbmNpZXMudHNcblxuXG5cbnZhciBEZXBlbmRlbmNpZXNSZWNlaXZlcnMgPSBuZXcgU2NyaXB0UmVjZWl2ZXJGYWN0b3J5KCdfcHVzaGVyX2RlcGVuZGVuY2llcycsICdQdXNoZXIuRGVwZW5kZW5jaWVzUmVjZWl2ZXJzJyk7XG52YXIgRGVwZW5kZW5jaWVzID0gbmV3IGRlcGVuZGVuY3lfbG9hZGVyKHtcbiAgICBjZG5faHR0cDogZGVmYXVsdHMuY2RuX2h0dHAsXG4gICAgY2RuX2h0dHBzOiBkZWZhdWx0cy5jZG5faHR0cHMsXG4gICAgdmVyc2lvbjogZGVmYXVsdHMuVkVSU0lPTixcbiAgICBzdWZmaXg6IGRlZmF1bHRzLmRlcGVuZGVuY3lfc3VmZml4LFxuICAgIHJlY2VpdmVyczogRGVwZW5kZW5jaWVzUmVjZWl2ZXJzXG59KTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS91dGlscy91cmxfc3RvcmUudHNcbnZhciB1cmxTdG9yZSA9IHtcbiAgICBiYXNlVXJsOiAnaHR0cHM6Ly9wdXNoZXIuY29tJyxcbiAgICB1cmxzOiB7XG4gICAgICAgIGF1dGhlbnRpY2F0aW9uRW5kcG9pbnQ6IHtcbiAgICAgICAgICAgIHBhdGg6ICcvZG9jcy9jaGFubmVscy9zZXJ2ZXJfYXBpL2F1dGhlbnRpY2F0aW5nX3VzZXJzJ1xuICAgICAgICB9LFxuICAgICAgICBhdXRob3JpemF0aW9uRW5kcG9pbnQ6IHtcbiAgICAgICAgICAgIHBhdGg6ICcvZG9jcy9jaGFubmVscy9zZXJ2ZXJfYXBpL2F1dGhvcml6aW5nLXVzZXJzLydcbiAgICAgICAgfSxcbiAgICAgICAgamF2YXNjcmlwdFF1aWNrU3RhcnQ6IHtcbiAgICAgICAgICAgIHBhdGg6ICcvZG9jcy9qYXZhc2NyaXB0X3F1aWNrX3N0YXJ0J1xuICAgICAgICB9LFxuICAgICAgICB0cmlnZ2VyaW5nQ2xpZW50RXZlbnRzOiB7XG4gICAgICAgICAgICBwYXRoOiAnL2RvY3MvY2xpZW50X2FwaV9ndWlkZS9jbGllbnRfZXZlbnRzI3RyaWdnZXItZXZlbnRzJ1xuICAgICAgICB9LFxuICAgICAgICBlbmNyeXB0ZWRDaGFubmVsU3VwcG9ydDoge1xuICAgICAgICAgICAgZnVsbFVybDogJ2h0dHBzOi8vZ2l0aHViLmNvbS9wdXNoZXIvcHVzaGVyLWpzL3RyZWUvY2M0OTEwMTUzNzFhNGJkZTU3NDNkMWM4N2EwZmJhYzBmZWI1MzE5NSNlbmNyeXB0ZWQtY2hhbm5lbC1zdXBwb3J0J1xuICAgICAgICB9XG4gICAgfVxufTtcbnZhciBidWlsZExvZ1N1ZmZpeCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgdXJsUHJlZml4ID0gJ1NlZTonO1xuICAgIHZhciB1cmxPYmogPSB1cmxTdG9yZS51cmxzW2tleV07XG4gICAgaWYgKCF1cmxPYmopXG4gICAgICAgIHJldHVybiAnJztcbiAgICB2YXIgdXJsO1xuICAgIGlmICh1cmxPYmouZnVsbFVybCkge1xuICAgICAgICB1cmwgPSB1cmxPYmouZnVsbFVybDtcbiAgICB9XG4gICAgZWxzZSBpZiAodXJsT2JqLnBhdGgpIHtcbiAgICAgICAgdXJsID0gdXJsU3RvcmUuYmFzZVVybCArIHVybE9iai5wYXRoO1xuICAgIH1cbiAgICBpZiAoIXVybClcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIHJldHVybiB1cmxQcmVmaXggKyBcIiBcIiArIHVybDtcbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB1cmxfc3RvcmUgPSAoeyBidWlsZExvZ1N1ZmZpeDogYnVpbGRMb2dTdWZmaXggfSk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvcmUvYXV0aC9vcHRpb25zLnRzXG52YXIgQXV0aFJlcXVlc3RUeXBlO1xuKGZ1bmN0aW9uIChBdXRoUmVxdWVzdFR5cGUpIHtcbiAgICBBdXRoUmVxdWVzdFR5cGVbXCJVc2VyQXV0aGVudGljYXRpb25cIl0gPSBcInVzZXItYXV0aGVudGljYXRpb25cIjtcbiAgICBBdXRoUmVxdWVzdFR5cGVbXCJDaGFubmVsQXV0aG9yaXphdGlvblwiXSA9IFwiY2hhbm5lbC1hdXRob3JpemF0aW9uXCI7XG59KShBdXRoUmVxdWVzdFR5cGUgfHwgKEF1dGhSZXF1ZXN0VHlwZSA9IHt9KSk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvcmUvZXJyb3JzLnRzXG52YXIgX19leHRlbmRzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG52YXIgQmFkRXZlbnROYW1lID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQmFkRXZlbnROYW1lLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEJhZEV2ZW50TmFtZShtc2cpIHtcbiAgICAgICAgdmFyIF9uZXdUYXJnZXQgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgX25ld1RhcmdldC5wcm90b3R5cGUpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBCYWRFdmVudE5hbWU7XG59KEVycm9yKSk7XG5cbnZhciBCYWRDaGFubmVsTmFtZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEJhZENoYW5uZWxOYW1lLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEJhZENoYW5uZWxOYW1lKG1zZykge1xuICAgICAgICB2YXIgX25ld1RhcmdldCA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKF90aGlzLCBfbmV3VGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEJhZENoYW5uZWxOYW1lO1xufShFcnJvcikpO1xuXG52YXIgUmVxdWVzdFRpbWVkT3V0ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUmVxdWVzdFRpbWVkT3V0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlcXVlc3RUaW1lZE91dChtc2cpIHtcbiAgICAgICAgdmFyIF9uZXdUYXJnZXQgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgX25ld1RhcmdldC5wcm90b3R5cGUpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBSZXF1ZXN0VGltZWRPdXQ7XG59KEVycm9yKSk7XG5cbnZhciBUcmFuc3BvcnRQcmlvcml0eVRvb0xvdyA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRyYW5zcG9ydFByaW9yaXR5VG9vTG93LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRyYW5zcG9ydFByaW9yaXR5VG9vTG93KG1zZykge1xuICAgICAgICB2YXIgX25ld1RhcmdldCA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKF90aGlzLCBfbmV3VGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFRyYW5zcG9ydFByaW9yaXR5VG9vTG93O1xufShFcnJvcikpO1xuXG52YXIgVHJhbnNwb3J0Q2xvc2VkID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVHJhbnNwb3J0Q2xvc2VkLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRyYW5zcG9ydENsb3NlZChtc2cpIHtcbiAgICAgICAgdmFyIF9uZXdUYXJnZXQgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgX25ld1RhcmdldC5wcm90b3R5cGUpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBUcmFuc3BvcnRDbG9zZWQ7XG59KEVycm9yKSk7XG5cbnZhciBVbnN1cHBvcnRlZEZlYXR1cmUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhVbnN1cHBvcnRlZEZlYXR1cmUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVW5zdXBwb3J0ZWRGZWF0dXJlKG1zZykge1xuICAgICAgICB2YXIgX25ld1RhcmdldCA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKF90aGlzLCBfbmV3VGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFVuc3VwcG9ydGVkRmVhdHVyZTtcbn0oRXJyb3IpKTtcblxudmFyIFVuc3VwcG9ydGVkVHJhbnNwb3J0ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVW5zdXBwb3J0ZWRUcmFuc3BvcnQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVW5zdXBwb3J0ZWRUcmFuc3BvcnQobXNnKSB7XG4gICAgICAgIHZhciBfbmV3VGFyZ2V0ID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoX3RoaXMsIF9uZXdUYXJnZXQucHJvdG90eXBlKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVW5zdXBwb3J0ZWRUcmFuc3BvcnQ7XG59KEVycm9yKSk7XG5cbnZhciBVbnN1cHBvcnRlZFN0cmF0ZWd5ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVW5zdXBwb3J0ZWRTdHJhdGVneSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBVbnN1cHBvcnRlZFN0cmF0ZWd5KG1zZykge1xuICAgICAgICB2YXIgX25ld1RhcmdldCA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKF90aGlzLCBfbmV3VGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFVuc3VwcG9ydGVkU3RyYXRlZ3k7XG59KEVycm9yKSk7XG5cbnZhciBIVFRQQXV0aEVycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSFRUUEF1dGhFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBIVFRQQXV0aEVycm9yKHN0YXR1cywgbXNnKSB7XG4gICAgICAgIHZhciBfbmV3VGFyZ2V0ID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgX25ld1RhcmdldC5wcm90b3R5cGUpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBIVFRQQXV0aEVycm9yO1xufShFcnJvcikpO1xuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3J1bnRpbWVzL2lzb21vcnBoaWMvYXV0aC94aHJfYXV0aC50c1xuXG5cblxuXG52YXIgYWpheCA9IGZ1bmN0aW9uIChjb250ZXh0LCBxdWVyeSwgYXV0aE9wdGlvbnMsIGF1dGhSZXF1ZXN0VHlwZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgeGhyID0gcnVudGltZS5jcmVhdGVYSFIoKTtcbiAgICB4aHIub3BlbignUE9TVCcsIGF1dGhPcHRpb25zLmVuZHBvaW50LCB0cnVlKTtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgIGZvciAodmFyIGhlYWRlck5hbWUgaW4gYXV0aE9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXJOYW1lLCBhdXRoT3B0aW9ucy5oZWFkZXJzW2hlYWRlck5hbWVdKTtcbiAgICB9XG4gICAgaWYgKGF1dGhPcHRpb25zLmhlYWRlcnNQcm92aWRlciAhPSBudWxsKSB7XG4gICAgICAgIHZhciBkeW5hbWljSGVhZGVycyA9IGF1dGhPcHRpb25zLmhlYWRlcnNQcm92aWRlcigpO1xuICAgICAgICBmb3IgKHZhciBoZWFkZXJOYW1lIGluIGR5bmFtaWNIZWFkZXJzKSB7XG4gICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXJOYW1lLCBkeW5hbWljSGVhZGVyc1toZWFkZXJOYW1lXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdmFyIHBhcnNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgSFRUUEF1dGhFcnJvcigyMDAsIFwiSlNPTiByZXR1cm5lZCBmcm9tIFwiICsgYXV0aFJlcXVlc3RUeXBlLnRvU3RyaW5nKCkgKyBcIiBlbmRwb2ludCB3YXMgaW52YWxpZCwgeWV0IHN0YXR1cyBjb2RlIHdhcyAyMDAuIERhdGEgd2FzOiBcIiArIHhoci5yZXNwb25zZVRleHQpLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgc3VmZml4ID0gJyc7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChhdXRoUmVxdWVzdFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBBdXRoUmVxdWVzdFR5cGUuVXNlckF1dGhlbnRpY2F0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gdXJsX3N0b3JlLmJ1aWxkTG9nU3VmZml4KCdhdXRoZW50aWNhdGlvbkVuZHBvaW50Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBBdXRoUmVxdWVzdFR5cGUuQ2hhbm5lbEF1dGhvcml6YXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBcIkNsaWVudHMgbXVzdCBiZSBhdXRob3JpemVkIHRvIGpvaW4gcHJpdmF0ZSBvciBwcmVzZW5jZSBjaGFubmVscy4gXCIgKyB1cmxfc3RvcmUuYnVpbGRMb2dTdWZmaXgoJ2F1dGhvcml6YXRpb25FbmRwb2ludCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBIVFRQQXV0aEVycm9yKHhoci5zdGF0dXMsIFwiVW5hYmxlIHRvIHJldHJpZXZlIGF1dGggc3RyaW5nIGZyb20gXCIgKyBhdXRoUmVxdWVzdFR5cGUudG9TdHJpbmcoKSArIFwiIGVuZHBvaW50IC0gXCIgK1xuICAgICAgICAgICAgICAgICAgICAoXCJyZWNlaXZlZCBzdGF0dXM6IFwiICsgeGhyLnN0YXR1cyArIFwiIGZyb20gXCIgKyBhdXRoT3B0aW9ucy5lbmRwb2ludCArIFwiLiBcIiArIHN1ZmZpeCkpLCBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgeGhyLnNlbmQocXVlcnkpO1xuICAgIHJldHVybiB4aHI7XG59O1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgeGhyX2F1dGggPSAoYWpheCk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvcmUvYmFzZTY0LnRzXG5mdW5jdGlvbiBlbmNvZGUocykge1xuICAgIHJldHVybiBidG9hKHV0b2IocykpO1xufVxudmFyIGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG52YXIgYjY0Y2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG52YXIgYjY0dGFiID0ge307XG5mb3IgKHZhciBiYXNlNjRfaSA9IDAsIGwgPSBiNjRjaGFycy5sZW5ndGg7IGJhc2U2NF9pIDwgbDsgYmFzZTY0X2krKykge1xuICAgIGI2NHRhYltiNjRjaGFycy5jaGFyQXQoYmFzZTY0X2kpXSA9IGJhc2U2NF9pO1xufVxudmFyIGNiX3V0b2IgPSBmdW5jdGlvbiAoYykge1xuICAgIHZhciBjYyA9IGMuY2hhckNvZGVBdCgwKTtcbiAgICByZXR1cm4gY2MgPCAweDgwXG4gICAgICAgID8gY1xuICAgICAgICA6IGNjIDwgMHg4MDBcbiAgICAgICAgICAgID8gZnJvbUNoYXJDb2RlKDB4YzAgfCAoY2MgPj4+IDYpKSArIGZyb21DaGFyQ29kZSgweDgwIHwgKGNjICYgMHgzZikpXG4gICAgICAgICAgICA6IGZyb21DaGFyQ29kZSgweGUwIHwgKChjYyA+Pj4gMTIpICYgMHgwZikpICtcbiAgICAgICAgICAgICAgICBmcm9tQ2hhckNvZGUoMHg4MCB8ICgoY2MgPj4+IDYpICYgMHgzZikpICtcbiAgICAgICAgICAgICAgICBmcm9tQ2hhckNvZGUoMHg4MCB8IChjYyAmIDB4M2YpKTtcbn07XG52YXIgdXRvYiA9IGZ1bmN0aW9uICh1KSB7XG4gICAgcmV0dXJuIHUucmVwbGFjZSgvW15cXHgwMC1cXHg3Rl0vZywgY2JfdXRvYik7XG59O1xudmFyIGNiX2VuY29kZSA9IGZ1bmN0aW9uIChjY2MpIHtcbiAgICB2YXIgcGFkbGVuID0gWzAsIDIsIDFdW2NjYy5sZW5ndGggJSAzXTtcbiAgICB2YXIgb3JkID0gKGNjYy5jaGFyQ29kZUF0KDApIDw8IDE2KSB8XG4gICAgICAgICgoY2NjLmxlbmd0aCA+IDEgPyBjY2MuY2hhckNvZGVBdCgxKSA6IDApIDw8IDgpIHxcbiAgICAgICAgKGNjYy5sZW5ndGggPiAyID8gY2NjLmNoYXJDb2RlQXQoMikgOiAwKTtcbiAgICB2YXIgY2hhcnMgPSBbXG4gICAgICAgIGI2NGNoYXJzLmNoYXJBdChvcmQgPj4+IDE4KSxcbiAgICAgICAgYjY0Y2hhcnMuY2hhckF0KChvcmQgPj4+IDEyKSAmIDYzKSxcbiAgICAgICAgcGFkbGVuID49IDIgPyAnPScgOiBiNjRjaGFycy5jaGFyQXQoKG9yZCA+Pj4gNikgJiA2MyksXG4gICAgICAgIHBhZGxlbiA+PSAxID8gJz0nIDogYjY0Y2hhcnMuY2hhckF0KG9yZCAmIDYzKVxuICAgIF07XG4gICAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xufTtcbnZhciBidG9hID0gd2luZG93LmJ0b2EgfHxcbiAgICBmdW5jdGlvbiAoYikge1xuICAgICAgICByZXR1cm4gYi5yZXBsYWNlKC9bXFxzXFxTXXsxLDN9L2csIGNiX2VuY29kZSk7XG4gICAgfTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS91dGlscy90aW1lcnMvYWJzdHJhY3RfdGltZXIudHNcbnZhciBUaW1lciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGltZXIoc2V0LCBjbGVhciwgZGVsYXksIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuY2xlYXIgPSBjbGVhcjtcbiAgICAgICAgdGhpcy50aW1lciA9IHNldChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMudGltZXIpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy50aW1lciA9IGNhbGxiYWNrKF90aGlzLnRpbWVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZGVsYXkpO1xuICAgIH1cbiAgICBUaW1lci5wcm90b3R5cGUuaXNSdW5uaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lciAhPT0gbnVsbDtcbiAgICB9O1xuICAgIFRpbWVyLnByb3RvdHlwZS5lbnN1cmVBYm9ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLnRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVGltZXI7XG59KCkpO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYWJzdHJhY3RfdGltZXIgPSAoVGltZXIpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL3V0aWxzL3RpbWVycy9pbmRleC50c1xudmFyIHRpbWVyc19leHRlbmRzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5cbmZ1bmN0aW9uIHRpbWVyc19jbGVhclRpbWVvdXQodGltZXIpIHtcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVyKTtcbn1cbmZ1bmN0aW9uIHRpbWVyc19jbGVhckludGVydmFsKHRpbWVyKSB7XG4gICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGltZXIpO1xufVxudmFyIE9uZU9mZlRpbWVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0aW1lcnNfZXh0ZW5kcyhPbmVPZmZUaW1lciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBPbmVPZmZUaW1lcihkZWxheSwgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIHNldFRpbWVvdXQsIHRpbWVyc19jbGVhclRpbWVvdXQsIGRlbGF5LCBmdW5jdGlvbiAodGltZXIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSkgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE9uZU9mZlRpbWVyO1xufShhYnN0cmFjdF90aW1lcikpO1xuXG52YXIgUGVyaW9kaWNUaW1lciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdGltZXJzX2V4dGVuZHMoUGVyaW9kaWNUaW1lciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQZXJpb2RpY1RpbWVyKGRlbGF5LCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgc2V0SW50ZXJ2YWwsIHRpbWVyc19jbGVhckludGVydmFsLCBkZWxheSwgZnVuY3Rpb24gKHRpbWVyKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgcmV0dXJuIHRpbWVyO1xuICAgICAgICB9KSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUGVyaW9kaWNUaW1lcjtcbn0oYWJzdHJhY3RfdGltZXIpKTtcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL3V0aWwudHNcblxudmFyIFV0aWwgPSB7XG4gICAgbm93OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChEYXRlLm5vdykge1xuICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoKS52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGRlZmVyOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbmVPZmZUaW1lcigwLCBjYWxsYmFjayk7XG4gICAgfSxcbiAgICBtZXRob2Q6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBib3VuZEFyZ3VtZW50cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0W25hbWVdLmFwcGx5KG9iamVjdCwgYm91bmRBcmd1bWVudHMuY29uY2F0KGFyZ3VtZW50cykpO1xuICAgICAgICB9O1xuICAgIH1cbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB1dGlsID0gKFV0aWwpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL3V0aWxzL2NvbGxlY3Rpb25zLnRzXG5cblxuZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCkge1xuICAgIHZhciBzb3VyY2VzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgc291cmNlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBleHRlbnNpb25zID0gc291cmNlc1tpXTtcbiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZXh0ZW5zaW9ucykge1xuICAgICAgICAgICAgaWYgKGV4dGVuc2lvbnNbcHJvcGVydHldICYmXG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uc1twcm9wZXJ0eV0uY29uc3RydWN0b3IgJiZcbiAgICAgICAgICAgICAgICBleHRlbnNpb25zW3Byb3BlcnR5XS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BlcnR5XSA9IGV4dGVuZCh0YXJnZXRbcHJvcGVydHldIHx8IHt9LCBleHRlbnNpb25zW3Byb3BlcnR5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHldID0gZXh0ZW5zaW9uc1twcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeSgpIHtcbiAgICB2YXIgbSA9IFsnUHVzaGVyJ107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbaV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBtLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG0ucHVzaChzYWZlSlNPTlN0cmluZ2lmeShhcmd1bWVudHNbaV0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbS5qb2luKCcgOiAnKTtcbn1cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZihhcnJheSwgaXRlbSkge1xuICAgIHZhciBuYXRpdmVJbmRleE9mID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2Y7XG4gICAgaWYgKGFycmF5ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgaWYgKG5hdGl2ZUluZGV4T2YgJiYgYXJyYXkuaW5kZXhPZiA9PT0gbmF0aXZlSW5kZXhPZikge1xuICAgICAgICByZXR1cm4gYXJyYXkuaW5kZXhPZihpdGVtKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFycmF5W2ldID09PSBpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiBvYmplY3RBcHBseShvYmplY3QsIGYpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgICAgICAgICBmKG9iamVjdFtrZXldLCBrZXksIG9iamVjdCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgb2JqZWN0QXBwbHkob2JqZWN0LCBmdW5jdGlvbiAoXywga2V5KSB7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH0pO1xuICAgIHJldHVybiBrZXlzO1xufVxuZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkge1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICBvYmplY3RBcHBseShvYmplY3QsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbn1cbmZ1bmN0aW9uIGFwcGx5KGFycmF5LCBmLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBmLmNhbGwoY29udGV4dCB8fCB3aW5kb3csIGFycmF5W2ldLCBpLCBhcnJheSk7XG4gICAgfVxufVxuZnVuY3Rpb24gbWFwKGFycmF5LCBmKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0LnB1c2goZihhcnJheVtpXSwgaSwgYXJyYXksIHJlc3VsdCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbWFwT2JqZWN0KG9iamVjdCwgZikge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBvYmplY3RBcHBseShvYmplY3QsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gZih2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGZpbHRlcihhcnJheSwgdGVzdCkge1xuICAgIHRlc3QgPVxuICAgICAgICB0ZXN0IHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gISF2YWx1ZTtcbiAgICAgICAgICAgIH07XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRlc3QoYXJyYXlbaV0sIGksIGFycmF5LCByZXN1bHQpKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChhcnJheVtpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGZpbHRlck9iamVjdChvYmplY3QsIHRlc3QpIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgb2JqZWN0QXBwbHkob2JqZWN0LCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICBpZiAoKHRlc3QgJiYgdGVzdCh2YWx1ZSwga2V5LCBvYmplY3QsIHJlc3VsdCkpIHx8IEJvb2xlYW4odmFsdWUpKSB7XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGZsYXR0ZW4ob2JqZWN0KSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIG9iamVjdEFwcGx5KG9iamVjdCwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gYW55KGFycmF5LCB0ZXN0KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGVzdChhcnJheVtpXSwgaSwgYXJyYXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBjb2xsZWN0aW9uc19hbGwoYXJyYXksIHRlc3QpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghdGVzdChhcnJheVtpXSwgaSwgYXJyYXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBlbmNvZGVQYXJhbXNPYmplY3QoZGF0YSkge1xuICAgIHJldHVybiBtYXBPYmplY3QoZGF0YSwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHNhZmVKU09OU3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGVuY29kZSh2YWx1ZS50b1N0cmluZygpKSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBidWlsZFF1ZXJ5U3RyaW5nKGRhdGEpIHtcbiAgICB2YXIgcGFyYW1zID0gZmlsdGVyT2JqZWN0KGRhdGEsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICB2YXIgcXVlcnkgPSBtYXAoZmxhdHRlbihlbmNvZGVQYXJhbXNPYmplY3QocGFyYW1zKSksIHV0aWwubWV0aG9kKCdqb2luJywgJz0nKSkuam9pbignJicpO1xuICAgIHJldHVybiBxdWVyeTtcbn1cbmZ1bmN0aW9uIGRlY3ljbGVPYmplY3Qob2JqZWN0KSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXSwgcGF0aHMgPSBbXTtcbiAgICByZXR1cm4gKGZ1bmN0aW9uIGRlcmV6KHZhbHVlLCBwYXRoKSB7XG4gICAgICAgIHZhciBpLCBuYW1lLCBudTtcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdHNbaV0gPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAkcmVmOiBwYXRoc1tpXSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9iamVjdHMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcGF0aHMucHVzaChwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseSh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICAgICAgICAgICAgICAgICAgbnUgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBudVtpXSA9IGRlcmV6KHZhbHVlW2ldLCBwYXRoICsgJ1snICsgaSArICddJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG51ID0ge307XG4gICAgICAgICAgICAgICAgICAgIGZvciAobmFtZSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgbmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudVtuYW1lXSA9IGRlcmV6KHZhbHVlW25hbWVdLCBwYXRoICsgJ1snICsgSlNPTi5zdHJpbmdpZnkobmFtZSkgKyAnXScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudTtcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgfSkob2JqZWN0LCAnJCcpO1xufVxuZnVuY3Rpb24gc2FmZUpTT05TdHJpbmdpZnkoc291cmNlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNvdXJjZSk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkZWN5Y2xlT2JqZWN0KHNvdXJjZSkpO1xuICAgIH1cbn1cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS9sb2dnZXIudHNcblxuXG52YXIgbG9nZ2VyX0xvZ2dlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTG9nZ2VyKCkge1xuICAgICAgICB0aGlzLmdsb2JhbExvZyA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgICAgICBpZiAod2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUubG9nKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICBMb2dnZXIucHJvdG90eXBlLmRlYnVnID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nKHRoaXMuZ2xvYmFsTG9nLCBhcmdzKTtcbiAgICB9O1xuICAgIExvZ2dlci5wcm90b3R5cGUud2FybiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZyh0aGlzLmdsb2JhbExvZ1dhcm4sIGFyZ3MpO1xuICAgIH07XG4gICAgTG9nZ2VyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZyh0aGlzLmdsb2JhbExvZ0Vycm9yLCBhcmdzKTtcbiAgICB9O1xuICAgIExvZ2dlci5wcm90b3R5cGUuZ2xvYmFsTG9nV2FybiA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgIGlmICh3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS53YXJuKSB7XG4gICAgICAgICAgICB3aW5kb3cuY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nbG9iYWxMb2cobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIExvZ2dlci5wcm90b3R5cGUuZ2xvYmFsTG9nRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgICBpZiAod2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nbG9iYWxMb2dXYXJuKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBMb2dnZXIucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uIChkZWZhdWx0TG9nZ2luZ0Z1bmN0aW9uKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtZXNzYWdlID0gc3RyaW5naWZ5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGlmIChjb3JlX3B1c2hlci5sb2cpIHtcbiAgICAgICAgICAgIGNvcmVfcHVzaGVyLmxvZyhtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb3JlX3B1c2hlci5sb2dUb0NvbnNvbGUpIHtcbiAgICAgICAgICAgIHZhciBsb2cgPSBkZWZhdWx0TG9nZ2luZ0Z1bmN0aW9uLmJpbmQodGhpcyk7XG4gICAgICAgICAgICBsb2cobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBMb2dnZXI7XG59KCkpO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgbG9nZ2VyID0gKG5ldyBsb2dnZXJfTG9nZ2VyKCkpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9ydW50aW1lcy93ZWIvYXV0aC9qc29ucF9hdXRoLnRzXG5cbnZhciBqc29ucCA9IGZ1bmN0aW9uIChjb250ZXh0LCBxdWVyeSwgYXV0aE9wdGlvbnMsIGF1dGhSZXF1ZXN0VHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAoYXV0aE9wdGlvbnMuaGVhZGVycyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIGF1dGhPcHRpb25zLmhlYWRlcnNQcm92aWRlciAhPSBudWxsKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiVG8gc2VuZCBoZWFkZXJzIHdpdGggdGhlIFwiICsgYXV0aFJlcXVlc3RUeXBlLnRvU3RyaW5nKCkgKyBcIiByZXF1ZXN0LCB5b3UgbXVzdCB1c2UgQUpBWCwgcmF0aGVyIHRoYW4gSlNPTlAuXCIpO1xuICAgIH1cbiAgICB2YXIgY2FsbGJhY2tOYW1lID0gY29udGV4dC5uZXh0QXV0aENhbGxiYWNrSUQudG9TdHJpbmcoKTtcbiAgICBjb250ZXh0Lm5leHRBdXRoQ2FsbGJhY2tJRCsrO1xuICAgIHZhciBkb2N1bWVudCA9IGNvbnRleHQuZ2V0RG9jdW1lbnQoKTtcbiAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgY29udGV4dC5hdXRoX2NhbGxiYWNrc1tjYWxsYmFja05hbWVdID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgfTtcbiAgICB2YXIgY2FsbGJhY2tfbmFtZSA9IFwiUHVzaGVyLmF1dGhfY2FsbGJhY2tzWydcIiArIGNhbGxiYWNrTmFtZSArIFwiJ11cIjtcbiAgICBzY3JpcHQuc3JjID1cbiAgICAgICAgYXV0aE9wdGlvbnMuZW5kcG9pbnQgK1xuICAgICAgICAgICAgJz9jYWxsYmFjaz0nICtcbiAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChjYWxsYmFja19uYW1lKSArXG4gICAgICAgICAgICAnJicgK1xuICAgICAgICAgICAgcXVlcnk7XG4gICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBoZWFkLmluc2VydEJlZm9yZShzY3JpcHQsIGhlYWQuZmlyc3RDaGlsZCk7XG59O1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIganNvbnBfYXV0aCA9IChqc29ucCk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3J1bnRpbWVzL3dlYi9kb20vc2NyaXB0X3JlcXVlc3QudHNcbnZhciBTY3JpcHRSZXF1ZXN0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTY3JpcHRSZXF1ZXN0KHNyYykge1xuICAgICAgICB0aGlzLnNyYyA9IHNyYztcbiAgICB9XG4gICAgU2NyaXB0UmVxdWVzdC5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChyZWNlaXZlcikge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBlcnJvclN0cmluZyA9ICdFcnJvciBsb2FkaW5nICcgKyBzZWxmLnNyYztcbiAgICAgICAgc2VsZi5zY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgc2VsZi5zY3JpcHQuaWQgPSByZWNlaXZlci5pZDtcbiAgICAgICAgc2VsZi5zY3JpcHQuc3JjID0gc2VsZi5zcmM7XG4gICAgICAgIHNlbGYuc2NyaXB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICAgICAgc2VsZi5zY3JpcHQuY2hhcnNldCA9ICdVVEYtOCc7XG4gICAgICAgIGlmIChzZWxmLnNjcmlwdC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICBzZWxmLnNjcmlwdC5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVyLmNhbGxiYWNrKGVycm9yU3RyaW5nKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzZWxmLnNjcmlwdC5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVjZWl2ZXIuY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5zY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjcmlwdC5yZWFkeVN0YXRlID09PSAnbG9hZGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnNjcmlwdC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyLmNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGYuc2NyaXB0LmFzeW5jID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50ICYmXG4gICAgICAgICAgICAvb3BlcmEvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgICAgICAgICBzZWxmLmVycm9yU2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICBzZWxmLmVycm9yU2NyaXB0LmlkID0gcmVjZWl2ZXIuaWQgKyAnX2Vycm9yJztcbiAgICAgICAgICAgIHNlbGYuZXJyb3JTY3JpcHQudGV4dCA9IHJlY2VpdmVyLm5hbWUgKyBcIignXCIgKyBlcnJvclN0cmluZyArIFwiJyk7XCI7XG4gICAgICAgICAgICBzZWxmLnNjcmlwdC5hc3luYyA9IHNlbGYuZXJyb3JTY3JpcHQuYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuc2NyaXB0LmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07XG4gICAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKHNlbGYuc2NyaXB0LCBoZWFkLmZpcnN0Q2hpbGQpO1xuICAgICAgICBpZiAoc2VsZi5lcnJvclNjcmlwdCkge1xuICAgICAgICAgICAgaGVhZC5pbnNlcnRCZWZvcmUoc2VsZi5lcnJvclNjcmlwdCwgc2VsZi5zY3JpcHQubmV4dFNpYmxpbmcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTY3JpcHRSZXF1ZXN0LnByb3RvdHlwZS5jbGVhbnVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zY3JpcHQpIHtcbiAgICAgICAgICAgIHRoaXMuc2NyaXB0Lm9ubG9hZCA9IHRoaXMuc2NyaXB0Lm9uZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zY3JpcHQgJiYgdGhpcy5zY3JpcHQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5zY3JpcHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnNjcmlwdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXJyb3JTY3JpcHQgJiYgdGhpcy5lcnJvclNjcmlwdC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yU2NyaXB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lcnJvclNjcmlwdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JpcHQgPSBudWxsO1xuICAgICAgICB0aGlzLmVycm9yU2NyaXB0ID0gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiBTY3JpcHRSZXF1ZXN0O1xufSgpKTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNjcmlwdF9yZXF1ZXN0ID0gKFNjcmlwdFJlcXVlc3QpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9ydW50aW1lcy93ZWIvZG9tL2pzb25wX3JlcXVlc3QudHNcblxuXG52YXIganNvbnBfcmVxdWVzdF9KU09OUFJlcXVlc3QgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEpTT05QUmVxdWVzdCh1cmwsIGRhdGEpIHtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxuICAgIEpTT05QUmVxdWVzdC5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChyZWNlaXZlcikge1xuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHF1ZXJ5ID0gYnVpbGRRdWVyeVN0cmluZyh0aGlzLmRhdGEpO1xuICAgICAgICB2YXIgdXJsID0gdGhpcy51cmwgKyAnLycgKyByZWNlaXZlci5udW1iZXIgKyAnPycgKyBxdWVyeTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcnVudGltZS5jcmVhdGVTY3JpcHRSZXF1ZXN0KHVybCk7XG4gICAgICAgIHRoaXMucmVxdWVzdC5zZW5kKHJlY2VpdmVyKTtcbiAgICB9O1xuICAgIEpTT05QUmVxdWVzdC5wcm90b3R5cGUuY2xlYW51cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdCkge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LmNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEpTT05QUmVxdWVzdDtcbn0oKSk7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBqc29ucF9yZXF1ZXN0ID0gKGpzb25wX3JlcXVlc3RfSlNPTlBSZXF1ZXN0KTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvcnVudGltZXMvd2ViL3RpbWVsaW5lL2pzb25wX3RpbWVsaW5lLnRzXG5cblxudmFyIGdldEFnZW50ID0gZnVuY3Rpb24gKHNlbmRlciwgdXNlVExTKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgc2NoZW1lID0gJ2h0dHAnICsgKHVzZVRMUyA/ICdzJyA6ICcnKSArICc6Ly8nO1xuICAgICAgICB2YXIgdXJsID0gc2NoZW1lICsgKHNlbmRlci5ob3N0IHx8IHNlbmRlci5vcHRpb25zLmhvc3QpICsgc2VuZGVyLm9wdGlvbnMucGF0aDtcbiAgICAgICAgdmFyIHJlcXVlc3QgPSBydW50aW1lLmNyZWF0ZUpTT05QUmVxdWVzdCh1cmwsIGRhdGEpO1xuICAgICAgICB2YXIgcmVjZWl2ZXIgPSBydW50aW1lLlNjcmlwdFJlY2VpdmVycy5jcmVhdGUoZnVuY3Rpb24gKGVycm9yLCByZXN1bHQpIHtcbiAgICAgICAgICAgIFNjcmlwdFJlY2VpdmVycy5yZW1vdmUocmVjZWl2ZXIpO1xuICAgICAgICAgICAgcmVxdWVzdC5jbGVhbnVwKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5ob3N0KSB7XG4gICAgICAgICAgICAgICAgc2VuZGVyLmhvc3QgPSByZXN1bHQuaG9zdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yLCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmVxdWVzdC5zZW5kKHJlY2VpdmVyKTtcbiAgICB9O1xufTtcbnZhciBqc29ucF90aW1lbGluZV9qc29ucCA9IHtcbiAgICBuYW1lOiAnanNvbnAnLFxuICAgIGdldEFnZW50OiBnZXRBZ2VudFxufTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGpzb25wX3RpbWVsaW5lID0gKGpzb25wX3RpbWVsaW5lX2pzb25wKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS90cmFuc3BvcnRzL3VybF9zY2hlbWVzLnRzXG5cbmZ1bmN0aW9uIGdldEdlbmVyaWNVUkwoYmFzZVNjaGVtZSwgcGFyYW1zLCBwYXRoKSB7XG4gICAgdmFyIHNjaGVtZSA9IGJhc2VTY2hlbWUgKyAocGFyYW1zLnVzZVRMUyA/ICdzJyA6ICcnKTtcbiAgICB2YXIgaG9zdCA9IHBhcmFtcy51c2VUTFMgPyBwYXJhbXMuaG9zdFRMUyA6IHBhcmFtcy5ob3N0Tm9uVExTO1xuICAgIHJldHVybiBzY2hlbWUgKyAnOi8vJyArIGhvc3QgKyBwYXRoO1xufVxuZnVuY3Rpb24gZ2V0R2VuZXJpY1BhdGgoa2V5LCBxdWVyeVN0cmluZykge1xuICAgIHZhciBwYXRoID0gJy9hcHAvJyArIGtleTtcbiAgICB2YXIgcXVlcnkgPSAnP3Byb3RvY29sPScgK1xuICAgICAgICBkZWZhdWx0cy5QUk9UT0NPTCArXG4gICAgICAgICcmY2xpZW50PWpzJyArXG4gICAgICAgICcmdmVyc2lvbj0nICtcbiAgICAgICAgZGVmYXVsdHMuVkVSU0lPTiArXG4gICAgICAgIChxdWVyeVN0cmluZyA/ICcmJyArIHF1ZXJ5U3RyaW5nIDogJycpO1xuICAgIHJldHVybiBwYXRoICsgcXVlcnk7XG59XG52YXIgd3MgPSB7XG4gICAgZ2V0SW5pdGlhbDogZnVuY3Rpb24gKGtleSwgcGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gKHBhcmFtcy5odHRwUGF0aCB8fCAnJykgKyBnZXRHZW5lcmljUGF0aChrZXksICdmbGFzaD1mYWxzZScpO1xuICAgICAgICByZXR1cm4gZ2V0R2VuZXJpY1VSTCgnd3MnLCBwYXJhbXMsIHBhdGgpO1xuICAgIH1cbn07XG52YXIgaHR0cCA9IHtcbiAgICBnZXRJbml0aWFsOiBmdW5jdGlvbiAoa2V5LCBwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSAocGFyYW1zLmh0dHBQYXRoIHx8ICcvcHVzaGVyJykgKyBnZXRHZW5lcmljUGF0aChrZXkpO1xuICAgICAgICByZXR1cm4gZ2V0R2VuZXJpY1VSTCgnaHR0cCcsIHBhcmFtcywgcGF0aCk7XG4gICAgfVxufTtcbnZhciBzb2NranMgPSB7XG4gICAgZ2V0SW5pdGlhbDogZnVuY3Rpb24gKGtleSwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBnZXRHZW5lcmljVVJMKCdodHRwJywgcGFyYW1zLCBwYXJhbXMuaHR0cFBhdGggfHwgJy9wdXNoZXInKTtcbiAgICB9LFxuICAgIGdldFBhdGg6IGZ1bmN0aW9uIChrZXksIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZ2V0R2VuZXJpY1BhdGgoa2V5KTtcbiAgICB9XG59O1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL2V2ZW50cy9jYWxsYmFja19yZWdpc3RyeS50c1xuXG52YXIgY2FsbGJhY2tfcmVnaXN0cnlfQ2FsbGJhY2tSZWdpc3RyeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2FsbGJhY2tSZWdpc3RyeSgpIHtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tzID0ge307XG4gICAgfVxuICAgIENhbGxiYWNrUmVnaXN0cnkucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsYmFja3NbcHJlZml4KG5hbWUpXTtcbiAgICB9O1xuICAgIENhbGxiYWNrUmVnaXN0cnkucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgICAgICB2YXIgcHJlZml4ZWRFdmVudE5hbWUgPSBwcmVmaXgobmFtZSk7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrc1twcmVmaXhlZEV2ZW50TmFtZV0gPVxuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzW3ByZWZpeGVkRXZlbnROYW1lXSB8fCBbXTtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tzW3ByZWZpeGVkRXZlbnROYW1lXS5wdXNoKHtcbiAgICAgICAgICAgIGZuOiBjYWxsYmFjayxcbiAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHRcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDYWxsYmFja1JlZ2lzdHJ5LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAobmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCFuYW1lICYmICFjYWxsYmFjayAmJiAhY29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzID0ge307XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5hbWVzID0gbmFtZSA/IFtwcmVmaXgobmFtZSldIDoga2V5cyh0aGlzLl9jYWxsYmFja3MpO1xuICAgICAgICBpZiAoY2FsbGJhY2sgfHwgY29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVDYWxsYmFjayhuYW1lcywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGxDYWxsYmFja3MobmFtZXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDYWxsYmFja1JlZ2lzdHJ5LnByb3RvdHlwZS5yZW1vdmVDYWxsYmFjayA9IGZ1bmN0aW9uIChuYW1lcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgYXBwbHkobmFtZXMsIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3NbbmFtZV0gPSBmaWx0ZXIodGhpcy5fY2FsbGJhY2tzW25hbWVdIHx8IFtdLCBmdW5jdGlvbiAoYmluZGluZykge1xuICAgICAgICAgICAgICAgIHJldHVybiAoKGNhbGxiYWNrICYmIGNhbGxiYWNrICE9PSBiaW5kaW5nLmZuKSB8fFxuICAgICAgICAgICAgICAgICAgICAoY29udGV4dCAmJiBjb250ZXh0ICE9PSBiaW5kaW5nLmNvbnRleHQpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrc1tuYW1lXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKTtcbiAgICB9O1xuICAgIENhbGxiYWNrUmVnaXN0cnkucHJvdG90eXBlLnJlbW92ZUFsbENhbGxiYWNrcyA9IGZ1bmN0aW9uIChuYW1lcykge1xuICAgICAgICBhcHBseShuYW1lcywgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbbmFtZV07XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH07XG4gICAgcmV0dXJuIENhbGxiYWNrUmVnaXN0cnk7XG59KCkpO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY2FsbGJhY2tfcmVnaXN0cnkgPSAoY2FsbGJhY2tfcmVnaXN0cnlfQ2FsbGJhY2tSZWdpc3RyeSk7XG5mdW5jdGlvbiBwcmVmaXgobmFtZSkge1xuICAgIHJldHVybiAnXycgKyBuYW1lO1xufVxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL2V2ZW50cy9kaXNwYXRjaGVyLnRzXG5cblxudmFyIGRpc3BhdGNoZXJfRGlzcGF0Y2hlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGlzcGF0Y2hlcihmYWlsVGhyb3VnaCkge1xuICAgICAgICB0aGlzLmNhbGxiYWNrcyA9IG5ldyBjYWxsYmFja19yZWdpc3RyeSgpO1xuICAgICAgICB0aGlzLmdsb2JhbF9jYWxsYmFja3MgPSBbXTtcbiAgICAgICAgdGhpcy5mYWlsVGhyb3VnaCA9IGZhaWxUaHJvdWdoO1xuICAgIH1cbiAgICBEaXNwYXRjaGVyLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gKGV2ZW50TmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5jYWxsYmFja3MuYWRkKGV2ZW50TmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERpc3BhdGNoZXIucHJvdG90eXBlLmJpbmRfZ2xvYmFsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFsX2NhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEaXNwYXRjaGVyLnByb3RvdHlwZS51bmJpbmQgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgICAgICB0aGlzLmNhbGxiYWNrcy5yZW1vdmUoZXZlbnROYW1lLCBjYWxsYmFjaywgY29udGV4dCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRGlzcGF0Y2hlci5wcm90b3R5cGUudW5iaW5kX2dsb2JhbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLmdsb2JhbF9jYWxsYmFja3MgPSBbXTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2xvYmFsX2NhbGxiYWNrcyA9IGZpbHRlcih0aGlzLmdsb2JhbF9jYWxsYmFja3MgfHwgW10sIGZ1bmN0aW9uIChjKSB7IHJldHVybiBjICE9PSBjYWxsYmFjazsgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRGlzcGF0Y2hlci5wcm90b3R5cGUudW5iaW5kX2FsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51bmJpbmQoKTtcbiAgICAgICAgdGhpcy51bmJpbmRfZ2xvYmFsKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRGlzcGF0Y2hlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGRhdGEsIG1ldGFkYXRhKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nbG9iYWxfY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmdsb2JhbF9jYWxsYmFja3NbaV0oZXZlbnROYW1lLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2FsbGJhY2tzID0gdGhpcy5jYWxsYmFja3MuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgYXJncy5wdXNoKGRhdGEsIG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhbGxiYWNrcyAmJiBjYWxsYmFja3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja3NbaV0uZm4uYXBwbHkoY2FsbGJhY2tzW2ldLmNvbnRleHQgfHwgd2luZG93LCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmZhaWxUaHJvdWdoKSB7XG4gICAgICAgICAgICB0aGlzLmZhaWxUaHJvdWdoKGV2ZW50TmFtZSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICByZXR1cm4gRGlzcGF0Y2hlcjtcbn0oKSk7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBkaXNwYXRjaGVyID0gKGRpc3BhdGNoZXJfRGlzcGF0Y2hlcik7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvcmUvdHJhbnNwb3J0cy90cmFuc3BvcnRfY29ubmVjdGlvbi50c1xudmFyIHRyYW5zcG9ydF9jb25uZWN0aW9uX2V4dGVuZHMgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcblxuXG5cblxuXG52YXIgdHJhbnNwb3J0X2Nvbm5lY3Rpb25fVHJhbnNwb3J0Q29ubmVjdGlvbiA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHJhbnNwb3J0X2Nvbm5lY3Rpb25fZXh0ZW5kcyhUcmFuc3BvcnRDb25uZWN0aW9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRyYW5zcG9ydENvbm5lY3Rpb24oaG9va3MsIG5hbWUsIHByaW9yaXR5LCBrZXksIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuaW5pdGlhbGl6ZSA9IHJ1bnRpbWUudHJhbnNwb3J0Q29ubmVjdGlvbkluaXRpYWxpemVyO1xuICAgICAgICBfdGhpcy5ob29rcyA9IGhvb2tzO1xuICAgICAgICBfdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgX3RoaXMucHJpb3JpdHkgPSBwcmlvcml0eTtcbiAgICAgICAgX3RoaXMua2V5ID0ga2V5O1xuICAgICAgICBfdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgX3RoaXMuc3RhdGUgPSAnbmV3JztcbiAgICAgICAgX3RoaXMudGltZWxpbmUgPSBvcHRpb25zLnRpbWVsaW5lO1xuICAgICAgICBfdGhpcy5hY3Rpdml0eVRpbWVvdXQgPSBvcHRpb25zLmFjdGl2aXR5VGltZW91dDtcbiAgICAgICAgX3RoaXMuaWQgPSBfdGhpcy50aW1lbGluZS5nZW5lcmF0ZVVuaXF1ZUlEKCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgVHJhbnNwb3J0Q29ubmVjdGlvbi5wcm90b3R5cGUuaGFuZGxlc0FjdGl2aXR5Q2hlY2tzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLmhvb2tzLmhhbmRsZXNBY3Rpdml0eUNoZWNrcyk7XG4gICAgfTtcbiAgICBUcmFuc3BvcnRDb25uZWN0aW9uLnByb3RvdHlwZS5zdXBwb3J0c1BpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuaG9va3Muc3VwcG9ydHNQaW5nKTtcbiAgICB9O1xuICAgIFRyYW5zcG9ydENvbm5lY3Rpb24ucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLnNvY2tldCB8fCB0aGlzLnN0YXRlICE9PSAnaW5pdGlhbGl6ZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVybCA9IHRoaXMuaG9va3MudXJscy5nZXRJbml0aWFsKHRoaXMua2V5LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSB0aGlzLmhvb2tzLmdldFNvY2tldCh1cmwsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHV0aWwuZGVmZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLm9uRXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgX3RoaXMuY2hhbmdlU3RhdGUoJ2Nsb3NlZCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iaW5kTGlzdGVuZXJzKCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnQ29ubmVjdGluZycsIHsgdHJhbnNwb3J0OiB0aGlzLm5hbWUsIHVybDogdXJsIH0pO1xuICAgICAgICB0aGlzLmNoYW5nZVN0YXRlKCdjb25uZWN0aW5nJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgVHJhbnNwb3J0Q29ubmVjdGlvbi5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUcmFuc3BvcnRDb25uZWN0aW9uLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdvcGVuJykge1xuICAgICAgICAgICAgdXRpbC5kZWZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLnNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUcmFuc3BvcnRDb25uZWN0aW9uLnByb3RvdHlwZS5waW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ29wZW4nICYmIHRoaXMuc3VwcG9ydHNQaW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnBpbmcoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVHJhbnNwb3J0Q29ubmVjdGlvbi5wcm90b3R5cGUub25PcGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5ob29rcy5iZWZvcmVPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmhvb2tzLmJlZm9yZU9wZW4odGhpcy5zb2NrZXQsIHRoaXMuaG9va3MudXJscy5nZXRQYXRoKHRoaXMua2V5LCB0aGlzLm9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYW5nZVN0YXRlKCdvcGVuJyk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFRyYW5zcG9ydENvbm5lY3Rpb24ucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHsgdHlwZTogJ1dlYlNvY2tldEVycm9yJywgZXJyb3I6IGVycm9yIH0pO1xuICAgICAgICB0aGlzLnRpbWVsaW5lLmVycm9yKHRoaXMuYnVpbGRUaW1lbGluZU1lc3NhZ2UoeyBlcnJvcjogZXJyb3IudG9TdHJpbmcoKSB9KSk7XG4gICAgfTtcbiAgICBUcmFuc3BvcnRDb25uZWN0aW9uLnByb3RvdHlwZS5vbkNsb3NlID0gZnVuY3Rpb24gKGNsb3NlRXZlbnQpIHtcbiAgICAgICAgaWYgKGNsb3NlRXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlU3RhdGUoJ2Nsb3NlZCcsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBjbG9zZUV2ZW50LmNvZGUsXG4gICAgICAgICAgICAgICAgcmVhc29uOiBjbG9zZUV2ZW50LnJlYXNvbixcbiAgICAgICAgICAgICAgICB3YXNDbGVhbjogY2xvc2VFdmVudC53YXNDbGVhblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZVN0YXRlKCdjbG9zZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVuYmluZExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLnNvY2tldCA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFRyYW5zcG9ydENvbm5lY3Rpb24ucHJvdG90eXBlLm9uTWVzc2FnZSA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICAgIH07XG4gICAgVHJhbnNwb3J0Q29ubmVjdGlvbi5wcm90b3R5cGUub25BY3Rpdml0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdhY3Rpdml0eScpO1xuICAgIH07XG4gICAgVHJhbnNwb3J0Q29ubmVjdGlvbi5wcm90b3R5cGUuYmluZExpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMub25PcGVuKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIF90aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gZnVuY3Rpb24gKGNsb3NlRXZlbnQpIHtcbiAgICAgICAgICAgIF90aGlzLm9uQ2xvc2UoY2xvc2VFdmVudCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgICAgICBfdGhpcy5vbk1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRzUGluZygpKSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5vbmFjdGl2aXR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLm9uQWN0aXZpdHkoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRyYW5zcG9ydENvbm5lY3Rpb24ucHJvdG90eXBlLnVuYmluZExpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0aGlzLnN1cHBvcnRzUGluZygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQub25hY3Rpdml0eSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgVHJhbnNwb3J0Q29ubmVjdGlvbi5wcm90b3R5cGUuY2hhbmdlU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUsIHBhcmFtcykge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMudGltZWxpbmUuaW5mbyh0aGlzLmJ1aWxkVGltZWxpbmVNZXNzYWdlKHtcbiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgIHBhcmFtczogcGFyYW1zXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5lbWl0KHN0YXRlLCBwYXJhbXMpO1xuICAgIH07XG4gICAgVHJhbnNwb3J0Q29ubmVjdGlvbi5wcm90b3R5cGUuYnVpbGRUaW1lbGluZU1lc3NhZ2UgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHsgY2lkOiB0aGlzLmlkIH0sIG1lc3NhZ2UpO1xuICAgIH07XG4gICAgcmV0dXJuIFRyYW5zcG9ydENvbm5lY3Rpb247XG59KGRpc3BhdGNoZXIpKTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHRyYW5zcG9ydF9jb25uZWN0aW9uID0gKHRyYW5zcG9ydF9jb25uZWN0aW9uX1RyYW5zcG9ydENvbm5lY3Rpb24pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL3RyYW5zcG9ydHMvdHJhbnNwb3J0LnRzXG5cbnZhciB0cmFuc3BvcnRfVHJhbnNwb3J0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUcmFuc3BvcnQoaG9va3MpIHtcbiAgICAgICAgdGhpcy5ob29rcyA9IGhvb2tzO1xuICAgIH1cbiAgICBUcmFuc3BvcnQucHJvdG90eXBlLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKGVudmlyb25tZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvb2tzLmlzU3VwcG9ydGVkKGVudmlyb25tZW50KTtcbiAgICB9O1xuICAgIFRyYW5zcG9ydC5wcm90b3R5cGUuY3JlYXRlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uIChuYW1lLCBwcmlvcml0eSwga2V5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgdHJhbnNwb3J0X2Nvbm5lY3Rpb24odGhpcy5ob29rcywgbmFtZSwgcHJpb3JpdHksIGtleSwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICByZXR1cm4gVHJhbnNwb3J0O1xufSgpKTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHRyYW5zcG9ydHNfdHJhbnNwb3J0ID0gKHRyYW5zcG9ydF9UcmFuc3BvcnQpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9ydW50aW1lcy9pc29tb3JwaGljL3RyYW5zcG9ydHMvdHJhbnNwb3J0cy50c1xuXG5cblxuXG52YXIgV1NUcmFuc3BvcnQgPSBuZXcgdHJhbnNwb3J0c190cmFuc3BvcnQoe1xuICAgIHVybHM6IHdzLFxuICAgIGhhbmRsZXNBY3Rpdml0eUNoZWNrczogZmFsc2UsXG4gICAgc3VwcG9ydHNQaW5nOiBmYWxzZSxcbiAgICBpc0luaXRpYWxpemVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHJ1bnRpbWUuZ2V0V2ViU29ja2V0QVBJKCkpO1xuICAgIH0sXG4gICAgaXNTdXBwb3J0ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ocnVudGltZS5nZXRXZWJTb2NrZXRBUEkoKSk7XG4gICAgfSxcbiAgICBnZXRTb2NrZXQ6IGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgcmV0dXJuIHJ1bnRpbWUuY3JlYXRlV2ViU29ja2V0KHVybCk7XG4gICAgfVxufSk7XG52YXIgaHR0cENvbmZpZ3VyYXRpb24gPSB7XG4gICAgdXJsczogaHR0cCxcbiAgICBoYW5kbGVzQWN0aXZpdHlDaGVja3M6IGZhbHNlLFxuICAgIHN1cHBvcnRzUGluZzogdHJ1ZSxcbiAgICBpc0luaXRpYWxpemVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn07XG52YXIgc3RyZWFtaW5nQ29uZmlndXJhdGlvbiA9IGV4dGVuZCh7XG4gICAgZ2V0U29ja2V0OiBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIHJldHVybiBydW50aW1lLkhUVFBGYWN0b3J5LmNyZWF0ZVN0cmVhbWluZ1NvY2tldCh1cmwpO1xuICAgIH1cbn0sIGh0dHBDb25maWd1cmF0aW9uKTtcbnZhciBwb2xsaW5nQ29uZmlndXJhdGlvbiA9IGV4dGVuZCh7XG4gICAgZ2V0U29ja2V0OiBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIHJldHVybiBydW50aW1lLkhUVFBGYWN0b3J5LmNyZWF0ZVBvbGxpbmdTb2NrZXQodXJsKTtcbiAgICB9XG59LCBodHRwQ29uZmlndXJhdGlvbik7XG52YXIgeGhyQ29uZmlndXJhdGlvbiA9IHtcbiAgICBpc1N1cHBvcnRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcnVudGltZS5pc1hIUlN1cHBvcnRlZCgpO1xuICAgIH1cbn07XG52YXIgWEhSU3RyZWFtaW5nVHJhbnNwb3J0ID0gbmV3IHRyYW5zcG9ydHNfdHJhbnNwb3J0KChleHRlbmQoe30sIHN0cmVhbWluZ0NvbmZpZ3VyYXRpb24sIHhockNvbmZpZ3VyYXRpb24pKSk7XG52YXIgWEhSUG9sbGluZ1RyYW5zcG9ydCA9IG5ldyB0cmFuc3BvcnRzX3RyYW5zcG9ydChleHRlbmQoe30sIHBvbGxpbmdDb25maWd1cmF0aW9uLCB4aHJDb25maWd1cmF0aW9uKSk7XG52YXIgVHJhbnNwb3J0cyA9IHtcbiAgICB3czogV1NUcmFuc3BvcnQsXG4gICAgeGhyX3N0cmVhbWluZzogWEhSU3RyZWFtaW5nVHJhbnNwb3J0LFxuICAgIHhocl9wb2xsaW5nOiBYSFJQb2xsaW5nVHJhbnNwb3J0XG59O1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdHJhbnNwb3J0cyA9IChUcmFuc3BvcnRzKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvcnVudGltZXMvd2ViL3RyYW5zcG9ydHMvdHJhbnNwb3J0cy50c1xuXG5cblxuXG5cblxudmFyIFNvY2tKU1RyYW5zcG9ydCA9IG5ldyB0cmFuc3BvcnRzX3RyYW5zcG9ydCh7XG4gICAgZmlsZTogJ3NvY2tqcycsXG4gICAgdXJsczogc29ja2pzLFxuICAgIGhhbmRsZXNBY3Rpdml0eUNoZWNrczogdHJ1ZSxcbiAgICBzdXBwb3J0c1Bpbmc6IGZhbHNlLFxuICAgIGlzU3VwcG9ydGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaXNJbml0aWFsaXplZDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LlNvY2tKUyAhPT0gdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgZ2V0U29ja2V0OiBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgd2luZG93LlNvY2tKUyh1cmwsIG51bGwsIHtcbiAgICAgICAgICAgIGpzX3BhdGg6IERlcGVuZGVuY2llcy5nZXRQYXRoKCdzb2NranMnLCB7XG4gICAgICAgICAgICAgICAgdXNlVExTOiBvcHRpb25zLnVzZVRMU1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBpZ25vcmVfbnVsbF9vcmlnaW46IG9wdGlvbnMuaWdub3JlTnVsbE9yaWdpblxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGJlZm9yZU9wZW46IGZ1bmN0aW9uIChzb2NrZXQsIHBhdGgpIHtcbiAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgcGF0aDogcGF0aFxuICAgICAgICB9KSk7XG4gICAgfVxufSk7XG52YXIgeGRyQ29uZmlndXJhdGlvbiA9IHtcbiAgICBpc1N1cHBvcnRlZDogZnVuY3Rpb24gKGVudmlyb25tZW50KSB7XG4gICAgICAgIHZhciB5ZXMgPSBydW50aW1lLmlzWERSU3VwcG9ydGVkKGVudmlyb25tZW50LnVzZVRMUyk7XG4gICAgICAgIHJldHVybiB5ZXM7XG4gICAgfVxufTtcbnZhciBYRFJTdHJlYW1pbmdUcmFuc3BvcnQgPSBuZXcgdHJhbnNwb3J0c190cmFuc3BvcnQoKGV4dGVuZCh7fSwgc3RyZWFtaW5nQ29uZmlndXJhdGlvbiwgeGRyQ29uZmlndXJhdGlvbikpKTtcbnZhciBYRFJQb2xsaW5nVHJhbnNwb3J0ID0gbmV3IHRyYW5zcG9ydHNfdHJhbnNwb3J0KGV4dGVuZCh7fSwgcG9sbGluZ0NvbmZpZ3VyYXRpb24sIHhkckNvbmZpZ3VyYXRpb24pKTtcbnRyYW5zcG9ydHMueGRyX3N0cmVhbWluZyA9IFhEUlN0cmVhbWluZ1RyYW5zcG9ydDtcbnRyYW5zcG9ydHMueGRyX3BvbGxpbmcgPSBYRFJQb2xsaW5nVHJhbnNwb3J0O1xudHJhbnNwb3J0cy5zb2NranMgPSBTb2NrSlNUcmFuc3BvcnQ7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0cmFuc3BvcnRzX3RyYW5zcG9ydHMgPSAodHJhbnNwb3J0cyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3J1bnRpbWVzL3dlYi9uZXRfaW5mby50c1xudmFyIG5ldF9pbmZvX2V4dGVuZHMgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcblxudmFyIE5ldEluZm8gPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIG5ldF9pbmZvX2V4dGVuZHMoTmV0SW5mbywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOZXRJbmZvKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICB2YXIgc2VsZiA9IF90aGlzO1xuICAgICAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29ubGluZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ29ubGluZScpO1xuICAgICAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdvZmZsaW5lJyk7XG4gICAgICAgICAgICB9LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBOZXRJbmZvLnByb3RvdHlwZS5pc09ubGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3Iub25MaW5lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5uYXZpZ2F0b3Iub25MaW5lO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gTmV0SW5mbztcbn0oZGlzcGF0Y2hlcikpO1xuXG52YXIgbmV0X2luZm9fTmV0d29yayA9IG5ldyBOZXRJbmZvKCk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvcmUvdHJhbnNwb3J0cy9hc3Npc3RhbnRfdG9fdGhlX3RyYW5zcG9ydF9tYW5hZ2VyLnRzXG5cblxudmFyIGFzc2lzdGFudF90b190aGVfdHJhbnNwb3J0X21hbmFnZXJfQXNzaXN0YW50VG9UaGVUcmFuc3BvcnRNYW5hZ2VyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBc3Npc3RhbnRUb1RoZVRyYW5zcG9ydE1hbmFnZXIobWFuYWdlciwgdHJhbnNwb3J0LCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG4gICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuICAgICAgICB0aGlzLm1pblBpbmdEZWxheSA9IG9wdGlvbnMubWluUGluZ0RlbGF5O1xuICAgICAgICB0aGlzLm1heFBpbmdEZWxheSA9IG9wdGlvbnMubWF4UGluZ0RlbGF5O1xuICAgICAgICB0aGlzLnBpbmdEZWxheSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgQXNzaXN0YW50VG9UaGVUcmFuc3BvcnRNYW5hZ2VyLnByb3RvdHlwZS5jcmVhdGVDb25uZWN0aW9uID0gZnVuY3Rpb24gKG5hbWUsIHByaW9yaXR5LCBrZXksIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7fSwgb3B0aW9ucywge1xuICAgICAgICAgICAgYWN0aXZpdHlUaW1lb3V0OiB0aGlzLnBpbmdEZWxheVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb24gPSB0aGlzLnRyYW5zcG9ydC5jcmVhdGVDb25uZWN0aW9uKG5hbWUsIHByaW9yaXR5LCBrZXksIG9wdGlvbnMpO1xuICAgICAgICB2YXIgb3BlblRpbWVzdGFtcCA9IG51bGw7XG4gICAgICAgIHZhciBvbk9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25uZWN0aW9uLnVuYmluZCgnb3BlbicsIG9uT3Blbik7XG4gICAgICAgICAgICBjb25uZWN0aW9uLmJpbmQoJ2Nsb3NlZCcsIG9uQ2xvc2VkKTtcbiAgICAgICAgICAgIG9wZW5UaW1lc3RhbXAgPSB1dGlsLm5vdygpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgb25DbG9zZWQgPSBmdW5jdGlvbiAoY2xvc2VFdmVudCkge1xuICAgICAgICAgICAgY29ubmVjdGlvbi51bmJpbmQoJ2Nsb3NlZCcsIG9uQ2xvc2VkKTtcbiAgICAgICAgICAgIGlmIChjbG9zZUV2ZW50LmNvZGUgPT09IDEwMDIgfHwgY2xvc2VFdmVudC5jb2RlID09PSAxMDAzKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMubWFuYWdlci5yZXBvcnREZWF0aCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWNsb3NlRXZlbnQud2FzQ2xlYW4gJiYgb3BlblRpbWVzdGFtcCkge1xuICAgICAgICAgICAgICAgIHZhciBsaWZlc3BhbiA9IHV0aWwubm93KCkgLSBvcGVuVGltZXN0YW1wO1xuICAgICAgICAgICAgICAgIGlmIChsaWZlc3BhbiA8IDIgKiBfdGhpcy5tYXhQaW5nRGVsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMubWFuYWdlci5yZXBvcnREZWF0aCgpO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5waW5nRGVsYXkgPSBNYXRoLm1heChsaWZlc3BhbiAvIDIsIF90aGlzLm1pblBpbmdEZWxheSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25uZWN0aW9uLmJpbmQoJ29wZW4nLCBvbk9wZW4pO1xuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9O1xuICAgIEFzc2lzdGFudFRvVGhlVHJhbnNwb3J0TWFuYWdlci5wcm90b3R5cGUuaXNTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoZW52aXJvbm1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5pc0FsaXZlKCkgJiYgdGhpcy50cmFuc3BvcnQuaXNTdXBwb3J0ZWQoZW52aXJvbm1lbnQpO1xuICAgIH07XG4gICAgcmV0dXJuIEFzc2lzdGFudFRvVGhlVHJhbnNwb3J0TWFuYWdlcjtcbn0oKSk7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhc3Npc3RhbnRfdG9fdGhlX3RyYW5zcG9ydF9tYW5hZ2VyID0gKGFzc2lzdGFudF90b190aGVfdHJhbnNwb3J0X21hbmFnZXJfQXNzaXN0YW50VG9UaGVUcmFuc3BvcnRNYW5hZ2VyKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS9jb25uZWN0aW9uL3Byb3RvY29sL3Byb3RvY29sLnRzXG52YXIgUHJvdG9jb2wgPSB7XG4gICAgZGVjb2RlTWVzc2FnZTogZnVuY3Rpb24gKG1lc3NhZ2VFdmVudCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIG1lc3NhZ2VEYXRhID0gSlNPTi5wYXJzZShtZXNzYWdlRXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB2YXIgcHVzaGVyRXZlbnREYXRhID0gbWVzc2FnZURhdGEuZGF0YTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHVzaGVyRXZlbnREYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hlckV2ZW50RGF0YSA9IEpTT04ucGFyc2UobWVzc2FnZURhdGEuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwdXNoZXJFdmVudCA9IHtcbiAgICAgICAgICAgICAgICBldmVudDogbWVzc2FnZURhdGEuZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbDogbWVzc2FnZURhdGEuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICBkYXRhOiBwdXNoZXJFdmVudERhdGFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAobWVzc2FnZURhdGEudXNlcl9pZCkge1xuICAgICAgICAgICAgICAgIHB1c2hlckV2ZW50LnVzZXJfaWQgPSBtZXNzYWdlRGF0YS51c2VyX2lkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHB1c2hlckV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyB7IHR5cGU6ICdNZXNzYWdlUGFyc2VFcnJvcicsIGVycm9yOiBlLCBkYXRhOiBtZXNzYWdlRXZlbnQuZGF0YSB9O1xuICAgICAgICB9XG4gICAgfSxcbiAgICBlbmNvZGVNZXNzYWdlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGV2ZW50KTtcbiAgICB9LFxuICAgIHByb2Nlc3NIYW5kc2hha2U6IGZ1bmN0aW9uIChtZXNzYWdlRXZlbnQpIHtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBQcm90b2NvbC5kZWNvZGVNZXNzYWdlKG1lc3NhZ2VFdmVudCk7XG4gICAgICAgIGlmIChtZXNzYWdlLmV2ZW50ID09PSAncHVzaGVyOmNvbm5lY3Rpb25fZXN0YWJsaXNoZWQnKSB7XG4gICAgICAgICAgICBpZiAoIW1lc3NhZ2UuZGF0YS5hY3Rpdml0eV90aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgJ05vIGFjdGl2aXR5IHRpbWVvdXQgc3BlY2lmaWVkIGluIGhhbmRzaGFrZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2Nvbm5lY3RlZCcsXG4gICAgICAgICAgICAgICAgaWQ6IG1lc3NhZ2UuZGF0YS5zb2NrZXRfaWQsXG4gICAgICAgICAgICAgICAgYWN0aXZpdHlUaW1lb3V0OiBtZXNzYWdlLmRhdGEuYWN0aXZpdHlfdGltZW91dCAqIDEwMDBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWVzc2FnZS5ldmVudCA9PT0gJ3B1c2hlcjplcnJvcicpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmdldENsb3NlQWN0aW9uKG1lc3NhZ2UuZGF0YSksXG4gICAgICAgICAgICAgICAgZXJyb3I6IHRoaXMuZ2V0Q2xvc2VFcnJvcihtZXNzYWdlLmRhdGEpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgJ0ludmFsaWQgaGFuZHNoYWtlJztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZ2V0Q2xvc2VBY3Rpb246IGZ1bmN0aW9uIChjbG9zZUV2ZW50KSB7XG4gICAgICAgIGlmIChjbG9zZUV2ZW50LmNvZGUgPCA0MDAwKSB7XG4gICAgICAgICAgICBpZiAoY2xvc2VFdmVudC5jb2RlID49IDEwMDIgJiYgY2xvc2VFdmVudC5jb2RlIDw9IDEwMDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2JhY2tvZmYnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2xvc2VFdmVudC5jb2RlID09PSA0MDAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Rsc19vbmx5JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjbG9zZUV2ZW50LmNvZGUgPCA0MTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3JlZnVzZWQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNsb3NlRXZlbnQuY29kZSA8IDQyMDApIHtcbiAgICAgICAgICAgIHJldHVybiAnYmFja29mZic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2xvc2VFdmVudC5jb2RlIDwgNDMwMCkge1xuICAgICAgICAgICAgcmV0dXJuICdyZXRyeSc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJ3JlZnVzZWQnO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBnZXRDbG9zZUVycm9yOiBmdW5jdGlvbiAoY2xvc2VFdmVudCkge1xuICAgICAgICBpZiAoY2xvc2VFdmVudC5jb2RlICE9PSAxMDAwICYmIGNsb3NlRXZlbnQuY29kZSAhPT0gMTAwMSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnUHVzaGVyRXJyb3InLFxuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogY2xvc2VFdmVudC5jb2RlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjbG9zZUV2ZW50LnJlYXNvbiB8fCBjbG9zZUV2ZW50Lm1lc3NhZ2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59O1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcHJvdG9jb2xfcHJvdG9jb2wgPSAoUHJvdG9jb2wpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL2Nvbm5lY3Rpb24vY29ubmVjdGlvbi50c1xudmFyIGNvbm5lY3Rpb25fZXh0ZW5kcyA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xuXG5cblxuXG52YXIgY29ubmVjdGlvbl9Db25uZWN0aW9uID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBjb25uZWN0aW9uX2V4dGVuZHMoQ29ubmVjdGlvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDb25uZWN0aW9uKGlkLCB0cmFuc3BvcnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuaWQgPSBpZDtcbiAgICAgICAgX3RoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuICAgICAgICBfdGhpcy5hY3Rpdml0eVRpbWVvdXQgPSB0cmFuc3BvcnQuYWN0aXZpdHlUaW1lb3V0O1xuICAgICAgICBfdGhpcy5iaW5kTGlzdGVuZXJzKCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUuaGFuZGxlc0FjdGl2aXR5Q2hlY2tzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuaGFuZGxlc0FjdGl2aXR5Q2hlY2tzKCk7XG4gICAgfTtcbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0LnNlbmQoZGF0YSk7XG4gICAgfTtcbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5zZW5kX2V2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIGRhdGEsIGNoYW5uZWwpIHtcbiAgICAgICAgdmFyIGV2ZW50ID0geyBldmVudDogbmFtZSwgZGF0YTogZGF0YSB9O1xuICAgICAgICBpZiAoY2hhbm5lbCkge1xuICAgICAgICAgICAgZXZlbnQuY2hhbm5lbCA9IGNoYW5uZWw7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdFdmVudCBzZW50JywgZXZlbnQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKHByb3RvY29sX3Byb3RvY29sLmVuY29kZU1lc3NhZ2UoZXZlbnQpKTtcbiAgICB9O1xuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLnBpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnRyYW5zcG9ydC5zdXBwb3J0c1BpbmcoKSkge1xuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQucGluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZW5kX2V2ZW50KCdwdXNoZXI6cGluZycsIHt9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgfTtcbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5iaW5kTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbGlzdGVuZXJzID0ge1xuICAgICAgICAgICAgbWVzc2FnZTogZnVuY3Rpb24gKG1lc3NhZ2VFdmVudCkge1xuICAgICAgICAgICAgICAgIHZhciBwdXNoZXJFdmVudDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBwdXNoZXJFdmVudCA9IHByb3RvY29sX3Byb3RvY29sLmRlY29kZU1lc3NhZ2UobWVzc2FnZUV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTWVzc2FnZVBhcnNlRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBtZXNzYWdlRXZlbnQuZGF0YVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHB1c2hlckV2ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdFdmVudCByZWNkJywgcHVzaGVyRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHB1c2hlckV2ZW50LmV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwdXNoZXI6ZXJyb3InOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUHVzaGVyRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBwdXNoZXJFdmVudC5kYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwdXNoZXI6cGluZyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgncGluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncHVzaGVyOnBvbmcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoJ3BvbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdtZXNzYWdlJywgcHVzaGVyRXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY3Rpdml0eTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoJ2FjdGl2aXR5Jyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsb3NlZDogZnVuY3Rpb24gKGNsb3NlRXZlbnQpIHtcbiAgICAgICAgICAgICAgICB1bmJpbmRMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICBpZiAoY2xvc2VFdmVudCAmJiBjbG9zZUV2ZW50LmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuaGFuZGxlQ2xvc2VFdmVudChjbG9zZUV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX3RoaXMudHJhbnNwb3J0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdjbG9zZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHVuYmluZExpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG9iamVjdEFwcGx5KGxpc3RlbmVycywgZnVuY3Rpb24gKGxpc3RlbmVyLCBldmVudCkge1xuICAgICAgICAgICAgICAgIF90aGlzLnRyYW5zcG9ydC51bmJpbmQoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBvYmplY3RBcHBseShsaXN0ZW5lcnMsIGZ1bmN0aW9uIChsaXN0ZW5lciwgZXZlbnQpIHtcbiAgICAgICAgICAgIF90aGlzLnRyYW5zcG9ydC5iaW5kKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUuaGFuZGxlQ2xvc2VFdmVudCA9IGZ1bmN0aW9uIChjbG9zZUV2ZW50KSB7XG4gICAgICAgIHZhciBhY3Rpb24gPSBwcm90b2NvbF9wcm90b2NvbC5nZXRDbG9zZUFjdGlvbihjbG9zZUV2ZW50KTtcbiAgICAgICAgdmFyIGVycm9yID0gcHJvdG9jb2xfcHJvdG9jb2wuZ2V0Q2xvc2VFcnJvcihjbG9zZUV2ZW50KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChhY3Rpb24sIHsgYWN0aW9uOiBhY3Rpb24sIGVycm9yOiBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIENvbm5lY3Rpb247XG59KGRpc3BhdGNoZXIpKTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNvbm5lY3Rpb25fY29ubmVjdGlvbiA9IChjb25uZWN0aW9uX0Nvbm5lY3Rpb24pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL2Nvbm5lY3Rpb24vaGFuZHNoYWtlL2luZGV4LnRzXG5cblxuXG52YXIgaGFuZHNoYWtlX0hhbmRzaGFrZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSGFuZHNoYWtlKHRyYW5zcG9ydCwgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgdGhpcy5iaW5kTGlzdGVuZXJzKCk7XG4gICAgfVxuICAgIEhhbmRzaGFrZS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudW5iaW5kTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMudHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgfTtcbiAgICBIYW5kc2hha2UucHJvdG90eXBlLmJpbmRMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMub25NZXNzYWdlID0gZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICAgIF90aGlzLnVuYmluZExpc3RlbmVycygpO1xuICAgICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcHJvdG9jb2xfcHJvdG9jb2wucHJvY2Vzc0hhbmRzaGFrZShtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuZmluaXNoKCdlcnJvcicsIHsgZXJyb3I6IGUgfSk7XG4gICAgICAgICAgICAgICAgX3RoaXMudHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT09ICdjb25uZWN0ZWQnKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuZmluaXNoKCdjb25uZWN0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IG5ldyBjb25uZWN0aW9uX2Nvbm5lY3Rpb24ocmVzdWx0LmlkLCBfdGhpcy50cmFuc3BvcnQpLFxuICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eVRpbWVvdXQ6IHJlc3VsdC5hY3Rpdml0eVRpbWVvdXRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIF90aGlzLmZpbmlzaChyZXN1bHQuYWN0aW9uLCB7IGVycm9yOiByZXN1bHQuZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgX3RoaXMudHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub25DbG9zZWQgPSBmdW5jdGlvbiAoY2xvc2VFdmVudCkge1xuICAgICAgICAgICAgX3RoaXMudW5iaW5kTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICB2YXIgYWN0aW9uID0gcHJvdG9jb2xfcHJvdG9jb2wuZ2V0Q2xvc2VBY3Rpb24oY2xvc2VFdmVudCkgfHwgJ2JhY2tvZmYnO1xuICAgICAgICAgICAgdmFyIGVycm9yID0gcHJvdG9jb2xfcHJvdG9jb2wuZ2V0Q2xvc2VFcnJvcihjbG9zZUV2ZW50KTtcbiAgICAgICAgICAgIF90aGlzLmZpbmlzaChhY3Rpb24sIHsgZXJyb3I6IGVycm9yIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnRyYW5zcG9ydC5iaW5kKCdtZXNzYWdlJywgdGhpcy5vbk1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnRyYW5zcG9ydC5iaW5kKCdjbG9zZWQnLCB0aGlzLm9uQ2xvc2VkKTtcbiAgICB9O1xuICAgIEhhbmRzaGFrZS5wcm90b3R5cGUudW5iaW5kTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnRyYW5zcG9ydC51bmJpbmQoJ21lc3NhZ2UnLCB0aGlzLm9uTWVzc2FnZSk7XG4gICAgICAgIHRoaXMudHJhbnNwb3J0LnVuYmluZCgnY2xvc2VkJywgdGhpcy5vbkNsb3NlZCk7XG4gICAgfTtcbiAgICBIYW5kc2hha2UucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uIChhY3Rpb24sIHBhcmFtcykge1xuICAgICAgICB0aGlzLmNhbGxiYWNrKGV4dGVuZCh7IHRyYW5zcG9ydDogdGhpcy50cmFuc3BvcnQsIGFjdGlvbjogYWN0aW9uIH0sIHBhcmFtcykpO1xuICAgIH07XG4gICAgcmV0dXJuIEhhbmRzaGFrZTtcbn0oKSk7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjb25uZWN0aW9uX2hhbmRzaGFrZSA9IChoYW5kc2hha2VfSGFuZHNoYWtlKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS90aW1lbGluZS90aW1lbGluZV9zZW5kZXIudHNcblxudmFyIHRpbWVsaW5lX3NlbmRlcl9UaW1lbGluZVNlbmRlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGltZWxpbmVTZW5kZXIodGltZWxpbmUsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50aW1lbGluZSA9IHRpbWVsaW5lO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIH1cbiAgICBUaW1lbGluZVNlbmRlci5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uICh1c2VUTFMsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVsaW5lLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGltZWxpbmUuc2VuZChydW50aW1lLlRpbWVsaW5lVHJhbnNwb3J0LmdldEFnZW50KHRoaXMsIHVzZVRMUyksIGNhbGxiYWNrKTtcbiAgICB9O1xuICAgIHJldHVybiBUaW1lbGluZVNlbmRlcjtcbn0oKSk7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0aW1lbGluZV9zZW5kZXIgPSAodGltZWxpbmVfc2VuZGVyX1RpbWVsaW5lU2VuZGVyKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS9jaGFubmVscy9jaGFubmVsLnRzXG52YXIgY2hhbm5lbF9leHRlbmRzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5cblxuXG5cblxudmFyIGNoYW5uZWxfQ2hhbm5lbCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgY2hhbm5lbF9leHRlbmRzKENoYW5uZWwsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2hhbm5lbChuYW1lLCBwdXNoZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ05vIGNhbGxiYWNrcyBvbiAnICsgbmFtZSArICcgZm9yICcgKyBldmVudCk7XG4gICAgICAgIH0pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICBfdGhpcy5wdXNoZXIgPSBwdXNoZXI7XG4gICAgICAgIF90aGlzLnN1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMuc3Vic2NyaXB0aW9uUGVuZGluZyA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5zdWJzY3JpcHRpb25DYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBDaGFubmVsLnByb3RvdHlwZS5hdXRob3JpemUgPSBmdW5jdGlvbiAoc29ja2V0SWQsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB7IGF1dGg6ICcnIH0pO1xuICAgIH07XG4gICAgQ2hhbm5lbC5wcm90b3R5cGUudHJpZ2dlciA9IGZ1bmN0aW9uIChldmVudCwgZGF0YSkge1xuICAgICAgICBpZiAoZXZlbnQuaW5kZXhPZignY2xpZW50LScpICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFkRXZlbnROYW1lKFwiRXZlbnQgJ1wiICsgZXZlbnQgKyBcIicgZG9lcyBub3Qgc3RhcnQgd2l0aCAnY2xpZW50LSdcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnN1YnNjcmliZWQpIHtcbiAgICAgICAgICAgIHZhciBzdWZmaXggPSB1cmxfc3RvcmUuYnVpbGRMb2dTdWZmaXgoJ3RyaWdnZXJpbmdDbGllbnRFdmVudHMnKTtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiQ2xpZW50IGV2ZW50IHRyaWdnZXJlZCBiZWZvcmUgY2hhbm5lbCAnc3Vic2NyaXB0aW9uX3N1Y2NlZWRlZCcgZXZlbnQgLiBcIiArIHN1ZmZpeCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucHVzaGVyLnNlbmRfZXZlbnQoZXZlbnQsIGRhdGEsIHRoaXMubmFtZSk7XG4gICAgfTtcbiAgICBDaGFubmVsLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25QZW5kaW5nID0gZmFsc2U7XG4gICAgfTtcbiAgICBDaGFubmVsLnByb3RvdHlwZS5oYW5kbGVFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgZXZlbnROYW1lID0gZXZlbnQuZXZlbnQ7XG4gICAgICAgIHZhciBkYXRhID0gZXZlbnQuZGF0YTtcbiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gJ3B1c2hlcl9pbnRlcm5hbDpzdWJzY3JpcHRpb25fc3VjY2VlZGVkJykge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWJzY3JpcHRpb25TdWNjZWVkZWRFdmVudChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXZlbnROYW1lID09PSAncHVzaGVyX2ludGVybmFsOnN1YnNjcmlwdGlvbl9jb3VudCcpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3Vic2NyaXB0aW9uQ291bnRFdmVudChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXZlbnROYW1lLmluZGV4T2YoJ3B1c2hlcl9pbnRlcm5hbDonKSAhPT0gMCkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0ge307XG4gICAgICAgICAgICB0aGlzLmVtaXQoZXZlbnROYW1lLCBkYXRhLCBtZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENoYW5uZWwucHJvdG90eXBlLmhhbmRsZVN1YnNjcmlwdGlvblN1Y2NlZWRlZEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uUGVuZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN1YnNjcmliZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25DYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaGVyLnVuc3Vic2NyaWJlKHRoaXMubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3B1c2hlcjpzdWJzY3JpcHRpb25fc3VjY2VlZGVkJywgZXZlbnQuZGF0YSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENoYW5uZWwucHJvdG90eXBlLmhhbmRsZVN1YnNjcmlwdGlvbkNvdW50RXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmRhdGEuc3Vic2NyaXB0aW9uX2NvdW50KSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkNvdW50ID0gZXZlbnQuZGF0YS5zdWJzY3JpcHRpb25fY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KCdwdXNoZXI6c3Vic2NyaXB0aW9uX2NvdW50JywgZXZlbnQuZGF0YSk7XG4gICAgfTtcbiAgICBDaGFubmVsLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmliZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvblBlbmRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkNhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmF1dGhvcml6ZSh0aGlzLnB1c2hlci5jb25uZWN0aW9uLnNvY2tldF9pZCwgZnVuY3Rpb24gKGVycm9yLCBkYXRhKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5zdWJzY3JpcHRpb25QZW5kaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoJ3B1c2hlcjpzdWJzY3JpcHRpb25fZXJyb3InLCBPYmplY3QuYXNzaWduKHt9LCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdBdXRoRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICAgIH0sIGVycm9yIGluc3RhbmNlb2YgSFRUUEF1dGhFcnJvciA/IHsgc3RhdHVzOiBlcnJvci5zdGF0dXMgfSA6IHt9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5wdXNoZXIuc2VuZF9ldmVudCgncHVzaGVyOnN1YnNjcmliZScsIHtcbiAgICAgICAgICAgICAgICAgICAgYXV0aDogZGF0YS5hdXRoLFxuICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2RhdGE6IGRhdGEuY2hhbm5lbF9kYXRhLFxuICAgICAgICAgICAgICAgICAgICBjaGFubmVsOiBfdGhpcy5uYW1lXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ2hhbm5lbC5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnB1c2hlci5zZW5kX2V2ZW50KCdwdXNoZXI6dW5zdWJzY3JpYmUnLCB7XG4gICAgICAgICAgICBjaGFubmVsOiB0aGlzLm5hbWVcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDaGFubmVsLnByb3RvdHlwZS5jYW5jZWxTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIENoYW5uZWwucHJvdG90eXBlLnJlaW5zdGF0ZVN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25DYW5jZWxsZWQgPSBmYWxzZTtcbiAgICB9O1xuICAgIHJldHVybiBDaGFubmVsO1xufShkaXNwYXRjaGVyKSk7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjaGFubmVsc19jaGFubmVsID0gKGNoYW5uZWxfQ2hhbm5lbCk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvcmUvY2hhbm5lbHMvcHJpdmF0ZV9jaGFubmVsLnRzXG52YXIgcHJpdmF0ZV9jaGFubmVsX2V4dGVuZHMgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcblxudmFyIFByaXZhdGVDaGFubmVsID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBwcml2YXRlX2NoYW5uZWxfZXh0ZW5kcyhQcml2YXRlQ2hhbm5lbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQcml2YXRlQ2hhbm5lbCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQcml2YXRlQ2hhbm5lbC5wcm90b3R5cGUuYXV0aG9yaXplID0gZnVuY3Rpb24gKHNvY2tldElkLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5wdXNoZXIuY29uZmlnLmNoYW5uZWxBdXRob3JpemVyKHtcbiAgICAgICAgICAgIGNoYW5uZWxOYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBzb2NrZXRJZDogc29ja2V0SWRcbiAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgIH07XG4gICAgcmV0dXJuIFByaXZhdGVDaGFubmVsO1xufShjaGFubmVsc19jaGFubmVsKSk7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwcml2YXRlX2NoYW5uZWwgPSAoUHJpdmF0ZUNoYW5uZWwpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL2NoYW5uZWxzL21lbWJlcnMudHNcblxudmFyIG1lbWJlcnNfTWVtYmVycyA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWVtYmVycygpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cbiAgICBNZW1iZXJzLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLm1lbWJlcnMsIGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgaW5mbzogdGhpcy5tZW1iZXJzW2lkXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBNZW1iZXJzLnByb3RvdHlwZS5lYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIG9iamVjdEFwcGx5KHRoaXMubWVtYmVycywgZnVuY3Rpb24gKG1lbWJlciwgaWQpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKF90aGlzLmdldChpZCkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE1lbWJlcnMucHJvdG90eXBlLnNldE15SUQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdGhpcy5teUlEID0gaWQ7XG4gICAgfTtcbiAgICBNZW1iZXJzLnByb3RvdHlwZS5vblN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25EYXRhKSB7XG4gICAgICAgIHRoaXMubWVtYmVycyA9IHN1YnNjcmlwdGlvbkRhdGEucHJlc2VuY2UuaGFzaDtcbiAgICAgICAgdGhpcy5jb3VudCA9IHN1YnNjcmlwdGlvbkRhdGEucHJlc2VuY2UuY291bnQ7XG4gICAgICAgIHRoaXMubWUgPSB0aGlzLmdldCh0aGlzLm15SUQpO1xuICAgIH07XG4gICAgTWVtYmVycy5wcm90b3R5cGUuYWRkTWVtYmVyID0gZnVuY3Rpb24gKG1lbWJlckRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0KG1lbWJlckRhdGEudXNlcl9pZCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY291bnQrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lbWJlcnNbbWVtYmVyRGF0YS51c2VyX2lkXSA9IG1lbWJlckRhdGEudXNlcl9pbmZvO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQobWVtYmVyRGF0YS51c2VyX2lkKTtcbiAgICB9O1xuICAgIE1lbWJlcnMucHJvdG90eXBlLnJlbW92ZU1lbWJlciA9IGZ1bmN0aW9uIChtZW1iZXJEYXRhKSB7XG4gICAgICAgIHZhciBtZW1iZXIgPSB0aGlzLmdldChtZW1iZXJEYXRhLnVzZXJfaWQpO1xuICAgICAgICBpZiAobWVtYmVyKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5tZW1iZXJzW21lbWJlckRhdGEudXNlcl9pZF07XG4gICAgICAgICAgICB0aGlzLmNvdW50LS07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lbWJlcjtcbiAgICB9O1xuICAgIE1lbWJlcnMucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1lbWJlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XG4gICAgICAgIHRoaXMubXlJRCA9IG51bGw7XG4gICAgICAgIHRoaXMubWUgPSBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIE1lbWJlcnM7XG59KCkpO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgbWVtYmVycyA9IChtZW1iZXJzX01lbWJlcnMpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL2NoYW5uZWxzL3ByZXNlbmNlX2NoYW5uZWwudHNcbnZhciBwcmVzZW5jZV9jaGFubmVsX2V4dGVuZHMgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2F3YWl0ZXIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufTtcblxuXG5cblxudmFyIHByZXNlbmNlX2NoYW5uZWxfUHJlc2VuY2VDaGFubmVsID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBwcmVzZW5jZV9jaGFubmVsX2V4dGVuZHMoUHJlc2VuY2VDaGFubmVsLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFByZXNlbmNlQ2hhbm5lbChuYW1lLCBwdXNoZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbmFtZSwgcHVzaGVyKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5tZW1iZXJzID0gbmV3IG1lbWJlcnMoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQcmVzZW5jZUNoYW5uZWwucHJvdG90eXBlLmF1dGhvcml6ZSA9IGZ1bmN0aW9uIChzb2NrZXRJZCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5hdXRob3JpemUuY2FsbCh0aGlzLCBzb2NrZXRJZCwgZnVuY3Rpb24gKGVycm9yLCBhdXRoRGF0YSkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNoYW5uZWxEYXRhLCBzdWZmaXg7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFlcnJvcikgcmV0dXJuIFszLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhEYXRhID0gYXV0aERhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShhdXRoRGF0YS5jaGFubmVsX2RhdGEgIT0gbnVsbCkpIHJldHVybiBbMywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRGF0YSA9IEpTT04ucGFyc2UoYXV0aERhdGEuY2hhbm5lbF9kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVtYmVycy5zZXRNeUlEKGNoYW5uZWxEYXRhLnVzZXJfaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQsIHRoaXMucHVzaGVyLnVzZXIuc2lnbmluRG9uZVByb21pc2VdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wdXNoZXIudXNlci51c2VyX2RhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVtYmVycy5zZXRNeUlEKHRoaXMucHVzaGVyLnVzZXIudXNlcl9kYXRhLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHVybF9zdG9yZS5idWlsZExvZ1N1ZmZpeCgnYXV0aG9yaXphdGlvbkVuZHBvaW50Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiSW52YWxpZCBhdXRoIHJlc3BvbnNlIGZvciBjaGFubmVsICdcIiArIHRoaXMubmFtZSArIFwiJywgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJleHBlY3RlZCAnY2hhbm5lbF9kYXRhJyBmaWVsZC4gXCIgKyBzdWZmaXggKyBcIiwgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvciB0aGUgdXNlciBzaG91bGQgYmUgc2lnbmVkIGluLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygnSW52YWxpZCBhdXRoIHJlc3BvbnNlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IsIGF1dGhEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pOyB9KTtcbiAgICB9O1xuICAgIFByZXNlbmNlQ2hhbm5lbC5wcm90b3R5cGUuaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIGV2ZW50TmFtZSA9IGV2ZW50LmV2ZW50O1xuICAgICAgICBpZiAoZXZlbnROYW1lLmluZGV4T2YoJ3B1c2hlcl9pbnRlcm5hbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IHt9O1xuICAgICAgICAgICAgaWYgKGV2ZW50LnVzZXJfaWQpIHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YS51c2VyX2lkID0gZXZlbnQudXNlcl9pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZW1pdChldmVudE5hbWUsIGRhdGEsIG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUHJlc2VuY2VDaGFubmVsLnByb3RvdHlwZS5oYW5kbGVJbnRlcm5hbEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBldmVudE5hbWUgPSBldmVudC5ldmVudDtcbiAgICAgICAgdmFyIGRhdGEgPSBldmVudC5kYXRhO1xuICAgICAgICBzd2l0Y2ggKGV2ZW50TmFtZSkge1xuICAgICAgICAgICAgY2FzZSAncHVzaGVyX2ludGVybmFsOnN1YnNjcmlwdGlvbl9zdWNjZWVkZWQnOlxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3Vic2NyaXB0aW9uU3VjY2VlZGVkRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHVzaGVyX2ludGVybmFsOnN1YnNjcmlwdGlvbl9jb3VudCc6XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWJzY3JpcHRpb25Db3VudEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3B1c2hlcl9pbnRlcm5hbDptZW1iZXJfYWRkZWQnOlxuICAgICAgICAgICAgICAgIHZhciBhZGRlZE1lbWJlciA9IHRoaXMubWVtYmVycy5hZGRNZW1iZXIoZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdwdXNoZXI6bWVtYmVyX2FkZGVkJywgYWRkZWRNZW1iZXIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHVzaGVyX2ludGVybmFsOm1lbWJlcl9yZW1vdmVkJzpcbiAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZE1lbWJlciA9IHRoaXMubWVtYmVycy5yZW1vdmVNZW1iZXIoZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZWRNZW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdwdXNoZXI6bWVtYmVyX3JlbW92ZWQnLCByZW1vdmVkTWVtYmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFByZXNlbmNlQ2hhbm5lbC5wcm90b3R5cGUuaGFuZGxlU3Vic2NyaXB0aW9uU3VjY2VlZGVkRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25QZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbkNhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5wdXNoZXIudW5zdWJzY3JpYmUodGhpcy5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWVtYmVycy5vblN1YnNjcmlwdGlvbihldmVudC5kYXRhKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncHVzaGVyOnN1YnNjcmlwdGlvbl9zdWNjZWVkZWQnLCB0aGlzLm1lbWJlcnMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQcmVzZW5jZUNoYW5uZWwucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWVtYmVycy5yZXNldCgpO1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLmRpc2Nvbm5lY3QuY2FsbCh0aGlzKTtcbiAgICB9O1xuICAgIHJldHVybiBQcmVzZW5jZUNoYW5uZWw7XG59KHByaXZhdGVfY2hhbm5lbCkpO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcHJlc2VuY2VfY2hhbm5lbCA9IChwcmVzZW5jZV9jaGFubmVsX1ByZXNlbmNlQ2hhbm5lbCk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvQHN0YWJsZWxpYi91dGY4L2xpYi91dGY4LmpzXG52YXIgdXRmOCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvQHN0YWJsZWxpYi9iYXNlNjQvbGliL2Jhc2U2NC5qc1xudmFyIGJhc2U2NCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvcmUvY2hhbm5lbHMvZW5jcnlwdGVkX2NoYW5uZWwudHNcbnZhciBlbmNyeXB0ZWRfY2hhbm5lbF9leHRlbmRzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5cblxuXG5cblxudmFyIGVuY3J5cHRlZF9jaGFubmVsX0VuY3J5cHRlZENoYW5uZWwgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIGVuY3J5cHRlZF9jaGFubmVsX2V4dGVuZHMoRW5jcnlwdGVkQ2hhbm5lbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFbmNyeXB0ZWRDaGFubmVsKG5hbWUsIHB1c2hlciwgbmFjbCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBuYW1lLCBwdXNoZXIpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmtleSA9IG51bGw7XG4gICAgICAgIF90aGlzLm5hY2wgPSBuYWNsO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEVuY3J5cHRlZENoYW5uZWwucHJvdG90eXBlLmF1dGhvcml6ZSA9IGZ1bmN0aW9uIChzb2NrZXRJZCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5hdXRob3JpemUuY2FsbCh0aGlzLCBzb2NrZXRJZCwgZnVuY3Rpb24gKGVycm9yLCBhdXRoRGF0YSkge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IsIGF1dGhEYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc2hhcmVkU2VjcmV0ID0gYXV0aERhdGFbJ3NoYXJlZF9zZWNyZXQnXTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkU2VjcmV0KSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKFwiTm8gc2hhcmVkX3NlY3JldCBrZXkgaW4gYXV0aCBwYXlsb2FkIGZvciBlbmNyeXB0ZWQgY2hhbm5lbDogXCIgKyBfdGhpcy5uYW1lKSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMua2V5ID0gT2JqZWN0KGJhc2U2NFtcImRlY29kZVwiXSkoc2hhcmVkU2VjcmV0KTtcbiAgICAgICAgICAgIGRlbGV0ZSBhdXRoRGF0YVsnc2hhcmVkX3NlY3JldCddO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgYXV0aERhdGEpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEVuY3J5cHRlZENoYW5uZWwucHJvdG90eXBlLnRyaWdnZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRmVhdHVyZSgnQ2xpZW50IGV2ZW50cyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIGVuY3J5cHRlZCBjaGFubmVscycpO1xuICAgIH07XG4gICAgRW5jcnlwdGVkQ2hhbm5lbC5wcm90b3R5cGUuaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIGV2ZW50TmFtZSA9IGV2ZW50LmV2ZW50O1xuICAgICAgICB2YXIgZGF0YSA9IGV2ZW50LmRhdGE7XG4gICAgICAgIGlmIChldmVudE5hbWUuaW5kZXhPZigncHVzaGVyX2ludGVybmFsOicpID09PSAwIHx8XG4gICAgICAgICAgICBldmVudE5hbWUuaW5kZXhPZigncHVzaGVyOicpID09PSAwKSB7XG4gICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmhhbmRsZUV2ZW50LmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFuZGxlRW5jcnlwdGVkRXZlbnQoZXZlbnROYW1lLCBkYXRhKTtcbiAgICB9O1xuICAgIEVuY3J5cHRlZENoYW5uZWwucHJvdG90eXBlLmhhbmRsZUVuY3J5cHRlZEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5rZXkpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVjZWl2ZWQgZW5jcnlwdGVkIGV2ZW50IGJlZm9yZSBrZXkgaGFzIGJlZW4gcmV0cmlldmVkIGZyb20gdGhlIGF1dGhFbmRwb2ludCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGF0YS5jaXBoZXJ0ZXh0IHx8ICFkYXRhLm5vbmNlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1VuZXhwZWN0ZWQgZm9ybWF0IGZvciBlbmNyeXB0ZWQgZXZlbnQsIGV4cGVjdGVkIG9iamVjdCB3aXRoIGBjaXBoZXJ0ZXh0YCBhbmQgYG5vbmNlYCBmaWVsZHMsIGdvdDogJyArXG4gICAgICAgICAgICAgICAgZGF0YSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNpcGhlclRleHQgPSBPYmplY3QoYmFzZTY0W1wiZGVjb2RlXCJdKShkYXRhLmNpcGhlcnRleHQpO1xuICAgICAgICBpZiAoY2lwaGVyVGV4dC5sZW5ndGggPCB0aGlzLm5hY2wuc2VjcmV0Ym94Lm92ZXJoZWFkTGVuZ3RoKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJFeHBlY3RlZCBlbmNyeXB0ZWQgZXZlbnQgY2lwaGVydGV4dCBsZW5ndGggdG8gYmUgXCIgKyB0aGlzLm5hY2wuc2VjcmV0Ym94Lm92ZXJoZWFkTGVuZ3RoICsgXCIsIGdvdDogXCIgKyBjaXBoZXJUZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5vbmNlID0gT2JqZWN0KGJhc2U2NFtcImRlY29kZVwiXSkoZGF0YS5ub25jZSk7XG4gICAgICAgIGlmIChub25jZS5sZW5ndGggPCB0aGlzLm5hY2wuc2VjcmV0Ym94Lm5vbmNlTGVuZ3RoKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJFeHBlY3RlZCBlbmNyeXB0ZWQgZXZlbnQgbm9uY2UgbGVuZ3RoIHRvIGJlIFwiICsgdGhpcy5uYWNsLnNlY3JldGJveC5ub25jZUxlbmd0aCArIFwiLCBnb3Q6IFwiICsgbm9uY2UubGVuZ3RoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLm5hY2wuc2VjcmV0Ym94Lm9wZW4oY2lwaGVyVGV4dCwgbm9uY2UsIHRoaXMua2V5KTtcbiAgICAgICAgaWYgKGJ5dGVzID09PSBudWxsKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byBkZWNyeXB0IGFuIGV2ZW50LCBwcm9iYWJseSBiZWNhdXNlIGl0IHdhcyBlbmNyeXB0ZWQgd2l0aCBhIGRpZmZlcmVudCBrZXkuIEZldGNoaW5nIGEgbmV3IGtleSBmcm9tIHRoZSBhdXRoRW5kcG9pbnQuLi4nKTtcbiAgICAgICAgICAgIHRoaXMuYXV0aG9yaXplKHRoaXMucHVzaGVyLmNvbm5lY3Rpb24uc29ja2V0X2lkLCBmdW5jdGlvbiAoZXJyb3IsIGF1dGhEYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkZhaWxlZCB0byBtYWtlIGEgcmVxdWVzdCB0byB0aGUgYXV0aEVuZHBvaW50OiBcIiArIGF1dGhEYXRhICsgXCIuIFVuYWJsZSB0byBmZXRjaCBuZXcga2V5LCBzbyBkcm9wcGluZyBlbmNyeXB0ZWQgZXZlbnRcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnl0ZXMgPSBfdGhpcy5uYWNsLnNlY3JldGJveC5vcGVuKGNpcGhlclRleHQsIG5vbmNlLCBfdGhpcy5rZXkpO1xuICAgICAgICAgICAgICAgIGlmIChieXRlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJGYWlsZWQgdG8gZGVjcnlwdCBldmVudCB3aXRoIG5ldyBrZXkuIERyb3BwaW5nIGVuY3J5cHRlZCBldmVudFwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KGV2ZW50LCBfdGhpcy5nZXREYXRhVG9FbWl0KGJ5dGVzKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KGV2ZW50LCB0aGlzLmdldERhdGFUb0VtaXQoYnl0ZXMpKTtcbiAgICB9O1xuICAgIEVuY3J5cHRlZENoYW5uZWwucHJvdG90eXBlLmdldERhdGFUb0VtaXQgPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICAgICAgdmFyIHJhdyA9IE9iamVjdCh1dGY4W1wiZGVjb2RlXCJdKShieXRlcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyYXcpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgcmV0dXJuIHJhdztcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEVuY3J5cHRlZENoYW5uZWw7XG59KHByaXZhdGVfY2hhbm5lbCkpO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgZW5jcnlwdGVkX2NoYW5uZWwgPSAoZW5jcnlwdGVkX2NoYW5uZWxfRW5jcnlwdGVkQ2hhbm5lbCk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvcmUvY29ubmVjdGlvbi9jb25uZWN0aW9uX21hbmFnZXIudHNcbnZhciBjb25uZWN0aW9uX21hbmFnZXJfZXh0ZW5kcyA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xuXG5cblxuXG5cbnZhciBjb25uZWN0aW9uX21hbmFnZXJfQ29ubmVjdGlvbk1hbmFnZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIGNvbm5lY3Rpb25fbWFuYWdlcl9leHRlbmRzKENvbm5lY3Rpb25NYW5hZ2VyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENvbm5lY3Rpb25NYW5hZ2VyKGtleSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdGF0ZSA9ICdpbml0aWFsaXplZCc7XG4gICAgICAgIF90aGlzLmNvbm5lY3Rpb24gPSBudWxsO1xuICAgICAgICBfdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIF90aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICBfdGhpcy50aW1lbGluZSA9IF90aGlzLm9wdGlvbnMudGltZWxpbmU7XG4gICAgICAgIF90aGlzLnVzaW5nVExTID0gX3RoaXMub3B0aW9ucy51c2VUTFM7XG4gICAgICAgIF90aGlzLmVycm9yQ2FsbGJhY2tzID0gX3RoaXMuYnVpbGRFcnJvckNhbGxiYWNrcygpO1xuICAgICAgICBfdGhpcy5jb25uZWN0aW9uQ2FsbGJhY2tzID0gX3RoaXMuYnVpbGRDb25uZWN0aW9uQ2FsbGJhY2tzKF90aGlzLmVycm9yQ2FsbGJhY2tzKTtcbiAgICAgICAgX3RoaXMuaGFuZHNoYWtlQ2FsbGJhY2tzID0gX3RoaXMuYnVpbGRIYW5kc2hha2VDYWxsYmFja3MoX3RoaXMuZXJyb3JDYWxsYmFja3MpO1xuICAgICAgICB2YXIgTmV0d29yayA9IHJ1bnRpbWUuZ2V0TmV0d29yaygpO1xuICAgICAgICBOZXR3b3JrLmJpbmQoJ29ubGluZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnRpbWVsaW5lLmluZm8oeyBuZXRpbmZvOiAnb25saW5lJyB9KTtcbiAgICAgICAgICAgIGlmIChfdGhpcy5zdGF0ZSA9PT0gJ2Nvbm5lY3RpbmcnIHx8IF90aGlzLnN0YXRlID09PSAndW5hdmFpbGFibGUnKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMucmV0cnlJbigwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIE5ldHdvcmsuYmluZCgnb2ZmbGluZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnRpbWVsaW5lLmluZm8oeyBuZXRpbmZvOiAnb2ZmbGluZScgfSk7XG4gICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbikge1xuICAgICAgICAgICAgICAgIF90aGlzLnNlbmRBY3Rpdml0eUNoZWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBfdGhpcy51cGRhdGVTdHJhdGVneSgpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uIHx8IHRoaXMucnVubmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnN0cmF0ZWd5LmlzU3VwcG9ydGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUoJ2ZhaWxlZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGUoJ2Nvbm5lY3RpbmcnKTtcbiAgICAgICAgdGhpcy5zdGFydENvbm5lY3RpbmcoKTtcbiAgICAgICAgdGhpcy5zZXRVbmF2YWlsYWJsZVRpbWVyKCk7XG4gICAgfTtcbiAgICBDb25uZWN0aW9uTWFuYWdlci5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLnNlbmRfZXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgZGF0YSwgY2hhbm5lbCkge1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLnNlbmRfZXZlbnQobmFtZSwgZGF0YSwgY2hhbm5lbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RJbnRlcm5hbGx5KCk7XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgIH07XG4gICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLmlzVXNpbmdUTFMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzaW5nVExTO1xuICAgIH07XG4gICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLnN0YXJ0Q29ubmVjdGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gKGVycm9yLCBoYW5kc2hha2UpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIF90aGlzLnJ1bm5lciA9IF90aGlzLnN0cmF0ZWd5LmNvbm5lY3QoMCwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRzaGFrZS5hY3Rpb24gPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnSGFuZHNoYWtlRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGhhbmRzaGFrZS5lcnJvclxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMudGltZWxpbmUuZXJyb3IoeyBoYW5kc2hha2VFcnJvcjogaGFuZHNoYWtlLmVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWJvcnRDb25uZWN0aW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmhhbmRzaGFrZUNhbGxiYWNrc1toYW5kc2hha2UuYWN0aW9uXShoYW5kc2hha2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5ydW5uZXIgPSB0aGlzLnN0cmF0ZWd5LmNvbm5lY3QoMCwgY2FsbGJhY2spO1xuICAgIH07XG4gICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLmFib3J0Q29ubmVjdGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucnVubmVyKSB7XG4gICAgICAgICAgICB0aGlzLnJ1bm5lci5hYm9ydCgpO1xuICAgICAgICAgICAgdGhpcy5ydW5uZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDb25uZWN0aW9uTWFuYWdlci5wcm90b3R5cGUuZGlzY29ubmVjdEludGVybmFsbHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWJvcnRDb25uZWN0aW5nKCk7XG4gICAgICAgIHRoaXMuY2xlYXJSZXRyeVRpbWVyKCk7XG4gICAgICAgIHRoaXMuY2xlYXJVbmF2YWlsYWJsZVRpbWVyKCk7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uID0gdGhpcy5hYmFuZG9uQ29ubmVjdGlvbigpO1xuICAgICAgICAgICAgY29ubmVjdGlvbi5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDb25uZWN0aW9uTWFuYWdlci5wcm90b3R5cGUudXBkYXRlU3RyYXRlZ3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3RyYXRlZ3kgPSB0aGlzLm9wdGlvbnMuZ2V0U3RyYXRlZ3koe1xuICAgICAgICAgICAga2V5OiB0aGlzLmtleSxcbiAgICAgICAgICAgIHRpbWVsaW5lOiB0aGlzLnRpbWVsaW5lLFxuICAgICAgICAgICAgdXNlVExTOiB0aGlzLnVzaW5nVExTXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLnJldHJ5SW4gPSBmdW5jdGlvbiAoZGVsYXkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy50aW1lbGluZS5pbmZvKHsgYWN0aW9uOiAncmV0cnknLCBkZWxheTogZGVsYXkgfSk7XG4gICAgICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdGluZ19pbicsIE1hdGgucm91bmQoZGVsYXkgLyAxMDAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXRyeVRpbWVyID0gbmV3IE9uZU9mZlRpbWVyKGRlbGF5IHx8IDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLmRpc2Nvbm5lY3RJbnRlcm5hbGx5KCk7XG4gICAgICAgICAgICBfdGhpcy5jb25uZWN0KCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLmNsZWFyUmV0cnlUaW1lciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucmV0cnlUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5yZXRyeVRpbWVyLmVuc3VyZUFib3J0ZWQoKTtcbiAgICAgICAgICAgIHRoaXMucmV0cnlUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5zZXRVbmF2YWlsYWJsZVRpbWVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnVuYXZhaWxhYmxlVGltZXIgPSBuZXcgT25lT2ZmVGltZXIodGhpcy5vcHRpb25zLnVuYXZhaWxhYmxlVGltZW91dCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMudXBkYXRlU3RhdGUoJ3VuYXZhaWxhYmxlJyk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLmNsZWFyVW5hdmFpbGFibGVUaW1lciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMudW5hdmFpbGFibGVUaW1lcikge1xuICAgICAgICAgICAgdGhpcy51bmF2YWlsYWJsZVRpbWVyLmVuc3VyZUFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLnNlbmRBY3Rpdml0eUNoZWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnN0b3BBY3Rpdml0eUNoZWNrKCk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5waW5nKCk7XG4gICAgICAgIHRoaXMuYWN0aXZpdHlUaW1lciA9IG5ldyBPbmVPZmZUaW1lcih0aGlzLm9wdGlvbnMucG9uZ1RpbWVvdXQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnRpbWVsaW5lLmVycm9yKHsgcG9uZ190aW1lZF9vdXQ6IF90aGlzLm9wdGlvbnMucG9uZ1RpbWVvdXQgfSk7XG4gICAgICAgICAgICBfdGhpcy5yZXRyeUluKDApO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5yZXNldEFjdGl2aXR5Q2hlY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuc3RvcEFjdGl2aXR5Q2hlY2soKTtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbiAmJiAhdGhpcy5jb25uZWN0aW9uLmhhbmRsZXNBY3Rpdml0eUNoZWNrcygpKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2aXR5VGltZXIgPSBuZXcgT25lT2ZmVGltZXIodGhpcy5hY3Rpdml0eVRpbWVvdXQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZW5kQWN0aXZpdHlDaGVjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5zdG9wQWN0aXZpdHlDaGVjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZpdHlUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5hY3Rpdml0eVRpbWVyLmVuc3VyZUFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLmJ1aWxkQ29ubmVjdGlvbkNhbGxiYWNrcyA9IGZ1bmN0aW9uIChlcnJvckNhbGxiYWNrcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBlcnJvckNhbGxiYWNrcywge1xuICAgICAgICAgICAgbWVzc2FnZTogZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5yZXNldEFjdGl2aXR5Q2hlY2soKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdtZXNzYWdlJywgbWVzc2FnZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLnNlbmRfZXZlbnQoJ3B1c2hlcjpwb25nJywge30pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjdGl2aXR5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMucmVzZXRBY3Rpdml0eUNoZWNrKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsb3NlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmFiYW5kb25Db25uZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLnNob3VsZFJldHJ5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMucmV0cnlJbigxMDAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLmJ1aWxkSGFuZHNoYWtlQ2FsbGJhY2tzID0gZnVuY3Rpb24gKGVycm9yQ2FsbGJhY2tzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIGVycm9yQ2FsbGJhY2tzLCB7XG4gICAgICAgICAgICBjb25uZWN0ZWQ6IGZ1bmN0aW9uIChoYW5kc2hha2UpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5hY3Rpdml0eVRpbWVvdXQgPSBNYXRoLm1pbihfdGhpcy5vcHRpb25zLmFjdGl2aXR5VGltZW91dCwgaGFuZHNoYWtlLmFjdGl2aXR5VGltZW91dCwgaGFuZHNoYWtlLmNvbm5lY3Rpb24uYWN0aXZpdHlUaW1lb3V0IHx8IEluZmluaXR5KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5jbGVhclVuYXZhaWxhYmxlVGltZXIoKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXRDb25uZWN0aW9uKGhhbmRzaGFrZS5jb25uZWN0aW9uKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5zb2NrZXRfaWQgPSBfdGhpcy5jb25uZWN0aW9uLmlkO1xuICAgICAgICAgICAgICAgIF90aGlzLnVwZGF0ZVN0YXRlKCdjb25uZWN0ZWQnLCB7IHNvY2tldF9pZDogX3RoaXMuc29ja2V0X2lkIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5idWlsZEVycm9yQ2FsbGJhY2tzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgd2l0aEVycm9yRW1pdHRlZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoJ2Vycm9yJywgeyB0eXBlOiAnV2ViU29ja2V0RXJyb3InLCBlcnJvcjogcmVzdWx0LmVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXN1bHQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRsc19vbmx5OiB3aXRoRXJyb3JFbWl0dGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy51c2luZ1RMUyA9IHRydWU7XG4gICAgICAgICAgICAgICAgX3RoaXMudXBkYXRlU3RyYXRlZ3koKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5yZXRyeUluKDApO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICByZWZ1c2VkOiB3aXRoRXJyb3JFbWl0dGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGJhY2tvZmY6IHdpdGhFcnJvckVtaXR0ZWQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLnJldHJ5SW4oMTAwMCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHJldHJ5OiB3aXRoRXJyb3JFbWl0dGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5yZXRyeUluKDApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5zZXRDb25uZWN0aW9uID0gZnVuY3Rpb24gKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgZm9yICh2YXIgZXZlbnQgaW4gdGhpcy5jb25uZWN0aW9uQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uYmluZChldmVudCwgdGhpcy5jb25uZWN0aW9uQ2FsbGJhY2tzW2V2ZW50XSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldEFjdGl2aXR5Q2hlY2soKTtcbiAgICB9O1xuICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5hYmFuZG9uQ29ubmVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0b3BBY3Rpdml0eUNoZWNrKCk7XG4gICAgICAgIGZvciAodmFyIGV2ZW50IGluIHRoaXMuY29ubmVjdGlvbkNhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLnVuYmluZChldmVudCwgdGhpcy5jb25uZWN0aW9uQ2FsbGJhY2tzW2V2ZW50XSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbm5lY3Rpb24gPSB0aGlzLmNvbm5lY3Rpb247XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG51bGw7XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgIH07XG4gICAgQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLnVwZGF0ZVN0YXRlID0gZnVuY3Rpb24gKG5ld1N0YXRlLCBkYXRhKSB7XG4gICAgICAgIHZhciBwcmV2aW91c1N0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICBpZiAocHJldmlvdXNTdGF0ZSAhPT0gbmV3U3RhdGUpIHtcbiAgICAgICAgICAgIHZhciBuZXdTdGF0ZURlc2NyaXB0aW9uID0gbmV3U3RhdGU7XG4gICAgICAgICAgICBpZiAobmV3U3RhdGVEZXNjcmlwdGlvbiA9PT0gJ2Nvbm5lY3RlZCcpIHtcbiAgICAgICAgICAgICAgICBuZXdTdGF0ZURlc2NyaXB0aW9uICs9ICcgd2l0aCBuZXcgc29ja2V0IElEICcgKyBkYXRhLnNvY2tldF9pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU3RhdGUgY2hhbmdlZCcsIHByZXZpb3VzU3RhdGUgKyAnIC0+ICcgKyBuZXdTdGF0ZURlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgIHRoaXMudGltZWxpbmUuaW5mbyh7IHN0YXRlOiBuZXdTdGF0ZSwgcGFyYW1zOiBkYXRhIH0pO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGF0ZV9jaGFuZ2UnLCB7IHByZXZpb3VzOiBwcmV2aW91c1N0YXRlLCBjdXJyZW50OiBuZXdTdGF0ZSB9KTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChuZXdTdGF0ZSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5zaG91bGRSZXRyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUgPT09ICdjb25uZWN0aW5nJyB8fCB0aGlzLnN0YXRlID09PSAnY29ubmVjdGVkJztcbiAgICB9O1xuICAgIHJldHVybiBDb25uZWN0aW9uTWFuYWdlcjtcbn0oZGlzcGF0Y2hlcikpO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY29ubmVjdGlvbl9tYW5hZ2VyID0gKGNvbm5lY3Rpb25fbWFuYWdlcl9Db25uZWN0aW9uTWFuYWdlcik7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvcmUvY2hhbm5lbHMvY2hhbm5lbHMudHNcblxuXG5cblxudmFyIGNoYW5uZWxzX0NoYW5uZWxzID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDaGFubmVscygpIHtcbiAgICAgICAgdGhpcy5jaGFubmVscyA9IHt9O1xuICAgIH1cbiAgICBDaGFubmVscy5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKG5hbWUsIHB1c2hlcikge1xuICAgICAgICBpZiAoIXRoaXMuY2hhbm5lbHNbbmFtZV0pIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbHNbbmFtZV0gPSBjcmVhdGVDaGFubmVsKG5hbWUsIHB1c2hlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbm5lbHNbbmFtZV07XG4gICAgfTtcbiAgICBDaGFubmVscy5wcm90b3R5cGUuYWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmFsdWVzKHRoaXMuY2hhbm5lbHMpO1xuICAgIH07XG4gICAgQ2hhbm5lbHMucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGFubmVsc1tuYW1lXTtcbiAgICB9O1xuICAgIENoYW5uZWxzLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHNbbmFtZV07XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNoYW5uZWxzW25hbWVdO1xuICAgICAgICByZXR1cm4gY2hhbm5lbDtcbiAgICB9O1xuICAgIENoYW5uZWxzLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBvYmplY3RBcHBseSh0aGlzLmNoYW5uZWxzLCBmdW5jdGlvbiAoY2hhbm5lbCkge1xuICAgICAgICAgICAgY2hhbm5lbC5kaXNjb25uZWN0KCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIENoYW5uZWxzO1xufSgpKTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNoYW5uZWxzID0gKGNoYW5uZWxzX0NoYW5uZWxzKTtcbmZ1bmN0aW9uIGNyZWF0ZUNoYW5uZWwobmFtZSwgcHVzaGVyKSB7XG4gICAgaWYgKG5hbWUuaW5kZXhPZigncHJpdmF0ZS1lbmNyeXB0ZWQtJykgPT09IDApIHtcbiAgICAgICAgaWYgKHB1c2hlci5jb25maWcubmFjbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlRW5jcnlwdGVkQ2hhbm5lbChuYW1lLCBwdXNoZXIsIHB1c2hlci5jb25maWcubmFjbCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVyck1zZyA9ICdUcmllZCB0byBzdWJzY3JpYmUgdG8gYSBwcml2YXRlLWVuY3J5cHRlZC0gY2hhbm5lbCBidXQgbm8gbmFjbCBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUnO1xuICAgICAgICB2YXIgc3VmZml4ID0gdXJsX3N0b3JlLmJ1aWxkTG9nU3VmZml4KCdlbmNyeXB0ZWRDaGFubmVsU3VwcG9ydCcpO1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRGZWF0dXJlKGVyck1zZyArIFwiLiBcIiArIHN1ZmZpeCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5hbWUuaW5kZXhPZigncHJpdmF0ZS0nKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVQcml2YXRlQ2hhbm5lbChuYW1lLCBwdXNoZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChuYW1lLmluZGV4T2YoJ3ByZXNlbmNlLScpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZVByZXNlbmNlQ2hhbm5lbChuYW1lLCBwdXNoZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChuYW1lLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgQmFkQ2hhbm5lbE5hbWUoJ0Nhbm5vdCBjcmVhdGUgYSBjaGFubmVsIHdpdGggbmFtZSBcIicgKyBuYW1lICsgJ1wiLicpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlQ2hhbm5lbChuYW1lLCBwdXNoZXIpO1xuICAgIH1cbn1cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS91dGlscy9mYWN0b3J5LnRzXG5cblxuXG5cblxuXG5cblxuXG52YXIgRmFjdG9yeSA9IHtcbiAgICBjcmVhdGVDaGFubmVsczogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IGNoYW5uZWxzKCk7XG4gICAgfSxcbiAgICBjcmVhdGVDb25uZWN0aW9uTWFuYWdlcjogZnVuY3Rpb24gKGtleSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IGNvbm5lY3Rpb25fbWFuYWdlcihrZXksIG9wdGlvbnMpO1xuICAgIH0sXG4gICAgY3JlYXRlQ2hhbm5lbDogZnVuY3Rpb24gKG5hbWUsIHB1c2hlcikge1xuICAgICAgICByZXR1cm4gbmV3IGNoYW5uZWxzX2NoYW5uZWwobmFtZSwgcHVzaGVyKTtcbiAgICB9LFxuICAgIGNyZWF0ZVByaXZhdGVDaGFubmVsOiBmdW5jdGlvbiAobmFtZSwgcHVzaGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgcHJpdmF0ZV9jaGFubmVsKG5hbWUsIHB1c2hlcik7XG4gICAgfSxcbiAgICBjcmVhdGVQcmVzZW5jZUNoYW5uZWw6IGZ1bmN0aW9uIChuYW1lLCBwdXNoZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBwcmVzZW5jZV9jaGFubmVsKG5hbWUsIHB1c2hlcik7XG4gICAgfSxcbiAgICBjcmVhdGVFbmNyeXB0ZWRDaGFubmVsOiBmdW5jdGlvbiAobmFtZSwgcHVzaGVyLCBuYWNsKSB7XG4gICAgICAgIHJldHVybiBuZXcgZW5jcnlwdGVkX2NoYW5uZWwobmFtZSwgcHVzaGVyLCBuYWNsKTtcbiAgICB9LFxuICAgIGNyZWF0ZVRpbWVsaW5lU2VuZGVyOiBmdW5jdGlvbiAodGltZWxpbmUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0aW1lbGluZV9zZW5kZXIodGltZWxpbmUsIG9wdGlvbnMpO1xuICAgIH0sXG4gICAgY3JlYXRlSGFuZHNoYWtlOiBmdW5jdGlvbiAodHJhbnNwb3J0LCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gbmV3IGNvbm5lY3Rpb25faGFuZHNoYWtlKHRyYW5zcG9ydCwgY2FsbGJhY2spO1xuICAgIH0sXG4gICAgY3JlYXRlQXNzaXN0YW50VG9UaGVUcmFuc3BvcnRNYW5hZ2VyOiBmdW5jdGlvbiAobWFuYWdlciwgdHJhbnNwb3J0LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgYXNzaXN0YW50X3RvX3RoZV90cmFuc3BvcnRfbWFuYWdlcihtYW5hZ2VyLCB0cmFuc3BvcnQsIG9wdGlvbnMpO1xuICAgIH1cbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBmYWN0b3J5ID0gKEZhY3RvcnkpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL3RyYW5zcG9ydHMvdHJhbnNwb3J0X21hbmFnZXIudHNcblxudmFyIHRyYW5zcG9ydF9tYW5hZ2VyX1RyYW5zcG9ydE1hbmFnZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRyYW5zcG9ydE1hbmFnZXIob3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICB0aGlzLmxpdmVzTGVmdCA9IHRoaXMub3B0aW9ucy5saXZlcyB8fCBJbmZpbml0eTtcbiAgICB9XG4gICAgVHJhbnNwb3J0TWFuYWdlci5wcm90b3R5cGUuZ2V0QXNzaXN0YW50ID0gZnVuY3Rpb24gKHRyYW5zcG9ydCkge1xuICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVBc3Npc3RhbnRUb1RoZVRyYW5zcG9ydE1hbmFnZXIodGhpcywgdHJhbnNwb3J0LCB7XG4gICAgICAgICAgICBtaW5QaW5nRGVsYXk6IHRoaXMub3B0aW9ucy5taW5QaW5nRGVsYXksXG4gICAgICAgICAgICBtYXhQaW5nRGVsYXk6IHRoaXMub3B0aW9ucy5tYXhQaW5nRGVsYXlcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBUcmFuc3BvcnRNYW5hZ2VyLnByb3RvdHlwZS5pc0FsaXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5saXZlc0xlZnQgPiAwO1xuICAgIH07XG4gICAgVHJhbnNwb3J0TWFuYWdlci5wcm90b3R5cGUucmVwb3J0RGVhdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubGl2ZXNMZWZ0IC09IDE7XG4gICAgfTtcbiAgICByZXR1cm4gVHJhbnNwb3J0TWFuYWdlcjtcbn0oKSk7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0cmFuc3BvcnRfbWFuYWdlciA9ICh0cmFuc3BvcnRfbWFuYWdlcl9UcmFuc3BvcnRNYW5hZ2VyKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS9zdHJhdGVnaWVzL3NlcXVlbnRpYWxfc3RyYXRlZ3kudHNcblxuXG5cbnZhciBzZXF1ZW50aWFsX3N0cmF0ZWd5X1NlcXVlbnRpYWxTdHJhdGVneSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2VxdWVudGlhbFN0cmF0ZWd5KHN0cmF0ZWdpZXMsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdHJhdGVnaWVzID0gc3RyYXRlZ2llcztcbiAgICAgICAgdGhpcy5sb29wID0gQm9vbGVhbihvcHRpb25zLmxvb3ApO1xuICAgICAgICB0aGlzLmZhaWxGYXN0ID0gQm9vbGVhbihvcHRpb25zLmZhaWxGYXN0KTtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0O1xuICAgICAgICB0aGlzLnRpbWVvdXRMaW1pdCA9IG9wdGlvbnMudGltZW91dExpbWl0O1xuICAgIH1cbiAgICBTZXF1ZW50aWFsU3RyYXRlZ3kucHJvdG90eXBlLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYW55KHRoaXMuc3RyYXRlZ2llcywgdXRpbC5tZXRob2QoJ2lzU3VwcG9ydGVkJykpO1xuICAgIH07XG4gICAgU2VxdWVudGlhbFN0cmF0ZWd5LnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKG1pblByaW9yaXR5LCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgc3RyYXRlZ2llcyA9IHRoaXMuc3RyYXRlZ2llcztcbiAgICAgICAgdmFyIGN1cnJlbnQgPSAwO1xuICAgICAgICB2YXIgdGltZW91dCA9IHRoaXMudGltZW91dDtcbiAgICAgICAgdmFyIHJ1bm5lciA9IG51bGw7XG4gICAgICAgIHZhciB0cnlOZXh0U3RyYXRlZ3kgPSBmdW5jdGlvbiAoZXJyb3IsIGhhbmRzaGFrZSkge1xuICAgICAgICAgICAgaWYgKGhhbmRzaGFrZSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGhhbmRzaGFrZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudCArIDE7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmxvb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQgJSBzdHJhdGVnaWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPCBzdHJhdGVnaWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IHRpbWVvdXQgKiAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLnRpbWVvdXRMaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBNYXRoLm1pbih0aW1lb3V0LCBfdGhpcy50aW1lb3V0TGltaXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJ1bm5lciA9IF90aGlzLnRyeVN0cmF0ZWd5KHN0cmF0ZWdpZXNbY3VycmVudF0sIG1pblByaW9yaXR5LCB7IHRpbWVvdXQ6IHRpbWVvdXQsIGZhaWxGYXN0OiBfdGhpcy5mYWlsRmFzdCB9LCB0cnlOZXh0U3RyYXRlZ3kpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBydW5uZXIgPSB0aGlzLnRyeVN0cmF0ZWd5KHN0cmF0ZWdpZXNbY3VycmVudF0sIG1pblByaW9yaXR5LCB7IHRpbWVvdXQ6IHRpbWVvdXQsIGZhaWxGYXN0OiB0aGlzLmZhaWxGYXN0IH0sIHRyeU5leHRTdHJhdGVneSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhYm9ydDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJ1bm5lci5hYm9ydCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvcmNlTWluUHJpb3JpdHk6IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgICAgICAgbWluUHJpb3JpdHkgPSBwO1xuICAgICAgICAgICAgICAgIGlmIChydW5uZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVubmVyLmZvcmNlTWluUHJpb3JpdHkocCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG4gICAgU2VxdWVudGlhbFN0cmF0ZWd5LnByb3RvdHlwZS50cnlTdHJhdGVneSA9IGZ1bmN0aW9uIChzdHJhdGVneSwgbWluUHJpb3JpdHksIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciB0aW1lciA9IG51bGw7XG4gICAgICAgIHZhciBydW5uZXIgPSBudWxsO1xuICAgICAgICBpZiAob3B0aW9ucy50aW1lb3V0ID4gMCkge1xuICAgICAgICAgICAgdGltZXIgPSBuZXcgT25lT2ZmVGltZXIob3B0aW9ucy50aW1lb3V0LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVubmVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBydW5uZXIgPSBzdHJhdGVneS5jb25uZWN0KG1pblByaW9yaXR5LCBmdW5jdGlvbiAoZXJyb3IsIGhhbmRzaGFrZSkge1xuICAgICAgICAgICAgaWYgKGVycm9yICYmIHRpbWVyICYmIHRpbWVyLmlzUnVubmluZygpICYmICFvcHRpb25zLmZhaWxGYXN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRpbWVyKSB7XG4gICAgICAgICAgICAgICAgdGltZXIuZW5zdXJlQWJvcnRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IsIGhhbmRzaGFrZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZXIuZW5zdXJlQWJvcnRlZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBydW5uZXIuYWJvcnQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmb3JjZU1pblByaW9yaXR5OiBmdW5jdGlvbiAocCkge1xuICAgICAgICAgICAgICAgIHJ1bm5lci5mb3JjZU1pblByaW9yaXR5KHApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIFNlcXVlbnRpYWxTdHJhdGVneTtcbn0oKSk7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzZXF1ZW50aWFsX3N0cmF0ZWd5ID0gKHNlcXVlbnRpYWxfc3RyYXRlZ3lfU2VxdWVudGlhbFN0cmF0ZWd5KTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS9zdHJhdGVnaWVzL2Jlc3RfY29ubmVjdGVkX2V2ZXJfc3RyYXRlZ3kudHNcblxuXG52YXIgYmVzdF9jb25uZWN0ZWRfZXZlcl9zdHJhdGVneV9CZXN0Q29ubmVjdGVkRXZlclN0cmF0ZWd5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCZXN0Q29ubmVjdGVkRXZlclN0cmF0ZWd5KHN0cmF0ZWdpZXMpIHtcbiAgICAgICAgdGhpcy5zdHJhdGVnaWVzID0gc3RyYXRlZ2llcztcbiAgICB9XG4gICAgQmVzdENvbm5lY3RlZEV2ZXJTdHJhdGVneS5wcm90b3R5cGUuaXNTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBhbnkodGhpcy5zdHJhdGVnaWVzLCB1dGlsLm1ldGhvZCgnaXNTdXBwb3J0ZWQnKSk7XG4gICAgfTtcbiAgICBCZXN0Q29ubmVjdGVkRXZlclN0cmF0ZWd5LnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKG1pblByaW9yaXR5LCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gY29ubmVjdCh0aGlzLnN0cmF0ZWdpZXMsIG1pblByaW9yaXR5LCBmdW5jdGlvbiAoaSwgcnVubmVycykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlcnJvciwgaGFuZHNoYWtlKSB7XG4gICAgICAgICAgICAgICAgcnVubmVyc1tpXS5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsUnVubmVyc0ZhaWxlZChydW5uZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhcHBseShydW5uZXJzLCBmdW5jdGlvbiAocnVubmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bm5lci5mb3JjZU1pblByaW9yaXR5KGhhbmRzaGFrZS50cmFuc3BvcnQucHJpb3JpdHkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGhhbmRzaGFrZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBCZXN0Q29ubmVjdGVkRXZlclN0cmF0ZWd5O1xufSgpKTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGJlc3RfY29ubmVjdGVkX2V2ZXJfc3RyYXRlZ3kgPSAoYmVzdF9jb25uZWN0ZWRfZXZlcl9zdHJhdGVneV9CZXN0Q29ubmVjdGVkRXZlclN0cmF0ZWd5KTtcbmZ1bmN0aW9uIGNvbm5lY3Qoc3RyYXRlZ2llcywgbWluUHJpb3JpdHksIGNhbGxiYWNrQnVpbGRlcikge1xuICAgIHZhciBydW5uZXJzID0gbWFwKHN0cmF0ZWdpZXMsIGZ1bmN0aW9uIChzdHJhdGVneSwgaSwgXywgcnMpIHtcbiAgICAgICAgcmV0dXJuIHN0cmF0ZWd5LmNvbm5lY3QobWluUHJpb3JpdHksIGNhbGxiYWNrQnVpbGRlcihpLCBycykpO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBhcHBseShydW5uZXJzLCBhYm9ydFJ1bm5lcik7XG4gICAgICAgIH0sXG4gICAgICAgIGZvcmNlTWluUHJpb3JpdHk6IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgICBhcHBseShydW5uZXJzLCBmdW5jdGlvbiAocnVubmVyKSB7XG4gICAgICAgICAgICAgICAgcnVubmVyLmZvcmNlTWluUHJpb3JpdHkocCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBhbGxSdW5uZXJzRmFpbGVkKHJ1bm5lcnMpIHtcbiAgICByZXR1cm4gY29sbGVjdGlvbnNfYWxsKHJ1bm5lcnMsIGZ1bmN0aW9uIChydW5uZXIpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ocnVubmVyLmVycm9yKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGFib3J0UnVubmVyKHJ1bm5lcikge1xuICAgIGlmICghcnVubmVyLmVycm9yICYmICFydW5uZXIuYWJvcnRlZCkge1xuICAgICAgICBydW5uZXIuYWJvcnQoKTtcbiAgICAgICAgcnVubmVyLmFib3J0ZWQgPSB0cnVlO1xuICAgIH1cbn1cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS9zdHJhdGVnaWVzL2NhY2hlZF9zdHJhdGVneS50c1xuXG5cblxuXG52YXIgY2FjaGVkX3N0cmF0ZWd5X0NhY2hlZFN0cmF0ZWd5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDYWNoZWRTdHJhdGVneShzdHJhdGVneSwgdHJhbnNwb3J0cywgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4gICAgICAgIHRoaXMudHJhbnNwb3J0cyA9IHRyYW5zcG9ydHM7XG4gICAgICAgIHRoaXMudHRsID0gb3B0aW9ucy50dGwgfHwgMTgwMCAqIDEwMDA7XG4gICAgICAgIHRoaXMudXNpbmdUTFMgPSBvcHRpb25zLnVzZVRMUztcbiAgICAgICAgdGhpcy50aW1lbGluZSA9IG9wdGlvbnMudGltZWxpbmU7XG4gICAgfVxuICAgIENhY2hlZFN0cmF0ZWd5LnByb3RvdHlwZS5pc1N1cHBvcnRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyYXRlZ3kuaXNTdXBwb3J0ZWQoKTtcbiAgICB9O1xuICAgIENhY2hlZFN0cmF0ZWd5LnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKG1pblByaW9yaXR5LCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgdXNpbmdUTFMgPSB0aGlzLnVzaW5nVExTO1xuICAgICAgICB2YXIgaW5mbyA9IGZldGNoVHJhbnNwb3J0Q2FjaGUodXNpbmdUTFMpO1xuICAgICAgICB2YXIgc3RyYXRlZ2llcyA9IFt0aGlzLnN0cmF0ZWd5XTtcbiAgICAgICAgaWYgKGluZm8gJiYgaW5mby50aW1lc3RhbXAgKyB0aGlzLnR0bCA+PSB1dGlsLm5vdygpKSB7XG4gICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gdGhpcy50cmFuc3BvcnRzW2luZm8udHJhbnNwb3J0XTtcbiAgICAgICAgICAgIGlmICh0cmFuc3BvcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVsaW5lLmluZm8oe1xuICAgICAgICAgICAgICAgICAgICBjYWNoZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydDogaW5mby50cmFuc3BvcnQsXG4gICAgICAgICAgICAgICAgICAgIGxhdGVuY3k6IGluZm8ubGF0ZW5jeVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0cmF0ZWdpZXMucHVzaChuZXcgc2VxdWVudGlhbF9zdHJhdGVneShbdHJhbnNwb3J0XSwge1xuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiBpbmZvLmxhdGVuY3kgKiAyICsgMTAwMCxcbiAgICAgICAgICAgICAgICAgICAgZmFpbEZhc3Q6IHRydWVcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0YXJ0VGltZXN0YW1wID0gdXRpbC5ub3coKTtcbiAgICAgICAgdmFyIHJ1bm5lciA9IHN0cmF0ZWdpZXNcbiAgICAgICAgICAgIC5wb3AoKVxuICAgICAgICAgICAgLmNvbm5lY3QobWluUHJpb3JpdHksIGZ1bmN0aW9uIGNiKGVycm9yLCBoYW5kc2hha2UpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGZsdXNoVHJhbnNwb3J0Q2FjaGUodXNpbmdUTFMpO1xuICAgICAgICAgICAgICAgIGlmIChzdHJhdGVnaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lc3RhbXAgPSB1dGlsLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICBydW5uZXIgPSBzdHJhdGVnaWVzLnBvcCgpLmNvbm5lY3QobWluUHJpb3JpdHksIGNiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdG9yZVRyYW5zcG9ydENhY2hlKHVzaW5nVExTLCBoYW5kc2hha2UudHJhbnNwb3J0Lm5hbWUsIHV0aWwubm93KCkgLSBzdGFydFRpbWVzdGFtcCk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgaGFuZHNoYWtlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhYm9ydDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJ1bm5lci5hYm9ydCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvcmNlTWluUHJpb3JpdHk6IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgICAgICAgbWluUHJpb3JpdHkgPSBwO1xuICAgICAgICAgICAgICAgIGlmIChydW5uZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVubmVyLmZvcmNlTWluUHJpb3JpdHkocCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIENhY2hlZFN0cmF0ZWd5O1xufSgpKTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNhY2hlZF9zdHJhdGVneSA9IChjYWNoZWRfc3RyYXRlZ3lfQ2FjaGVkU3RyYXRlZ3kpO1xuZnVuY3Rpb24gZ2V0VHJhbnNwb3J0Q2FjaGVLZXkodXNpbmdUTFMpIHtcbiAgICByZXR1cm4gJ3B1c2hlclRyYW5zcG9ydCcgKyAodXNpbmdUTFMgPyAnVExTJyA6ICdOb25UTFMnKTtcbn1cbmZ1bmN0aW9uIGZldGNoVHJhbnNwb3J0Q2FjaGUodXNpbmdUTFMpIHtcbiAgICB2YXIgc3RvcmFnZSA9IHJ1bnRpbWUuZ2V0TG9jYWxTdG9yYWdlKCk7XG4gICAgaWYgKHN0b3JhZ2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBzZXJpYWxpemVkQ2FjaGUgPSBzdG9yYWdlW2dldFRyYW5zcG9ydENhY2hlS2V5KHVzaW5nVExTKV07XG4gICAgICAgICAgICBpZiAoc2VyaWFsaXplZENhY2hlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc2VyaWFsaXplZENhY2hlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZmx1c2hUcmFuc3BvcnRDYWNoZSh1c2luZ1RMUyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBzdG9yZVRyYW5zcG9ydENhY2hlKHVzaW5nVExTLCB0cmFuc3BvcnQsIGxhdGVuY3kpIHtcbiAgICB2YXIgc3RvcmFnZSA9IHJ1bnRpbWUuZ2V0TG9jYWxTdG9yYWdlKCk7XG4gICAgaWYgKHN0b3JhZ2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN0b3JhZ2VbZ2V0VHJhbnNwb3J0Q2FjaGVLZXkodXNpbmdUTFMpXSA9IHNhZmVKU09OU3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IHV0aWwubm93KCksXG4gICAgICAgICAgICAgICAgdHJhbnNwb3J0OiB0cmFuc3BvcnQsXG4gICAgICAgICAgICAgICAgbGF0ZW5jeTogbGF0ZW5jeVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGZsdXNoVHJhbnNwb3J0Q2FjaGUodXNpbmdUTFMpIHtcbiAgICB2YXIgc3RvcmFnZSA9IHJ1bnRpbWUuZ2V0TG9jYWxTdG9yYWdlKCk7XG4gICAgaWYgKHN0b3JhZ2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlbGV0ZSBzdG9yYWdlW2dldFRyYW5zcG9ydENhY2hlS2V5KHVzaW5nVExTKV07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS9zdHJhdGVnaWVzL2RlbGF5ZWRfc3RyYXRlZ3kudHNcblxudmFyIGRlbGF5ZWRfc3RyYXRlZ3lfRGVsYXllZFN0cmF0ZWd5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEZWxheWVkU3RyYXRlZ3koc3RyYXRlZ3ksIF9hKSB7XG4gICAgICAgIHZhciBudW1iZXIgPSBfYS5kZWxheTtcbiAgICAgICAgdGhpcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7IGRlbGF5OiBudW1iZXIgfTtcbiAgICB9XG4gICAgRGVsYXllZFN0cmF0ZWd5LnByb3RvdHlwZS5pc1N1cHBvcnRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyYXRlZ3kuaXNTdXBwb3J0ZWQoKTtcbiAgICB9O1xuICAgIERlbGF5ZWRTdHJhdGVneS5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uIChtaW5Qcmlvcml0eSwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVneTtcbiAgICAgICAgdmFyIHJ1bm5lcjtcbiAgICAgICAgdmFyIHRpbWVyID0gbmV3IE9uZU9mZlRpbWVyKHRoaXMub3B0aW9ucy5kZWxheSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcnVubmVyID0gc3RyYXRlZ3kuY29ubmVjdChtaW5Qcmlvcml0eSwgY2FsbGJhY2spO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGltZXIuZW5zdXJlQWJvcnRlZCgpO1xuICAgICAgICAgICAgICAgIGlmIChydW5uZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVubmVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvcmNlTWluUHJpb3JpdHk6IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgICAgICAgbWluUHJpb3JpdHkgPSBwO1xuICAgICAgICAgICAgICAgIGlmIChydW5uZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVubmVyLmZvcmNlTWluUHJpb3JpdHkocCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIERlbGF5ZWRTdHJhdGVneTtcbn0oKSk7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBkZWxheWVkX3N0cmF0ZWd5ID0gKGRlbGF5ZWRfc3RyYXRlZ3lfRGVsYXllZFN0cmF0ZWd5KTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS9zdHJhdGVnaWVzL2lmX3N0cmF0ZWd5LnRzXG52YXIgSWZTdHJhdGVneSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSWZTdHJhdGVneSh0ZXN0LCB0cnVlQnJhbmNoLCBmYWxzZUJyYW5jaCkge1xuICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0O1xuICAgICAgICB0aGlzLnRydWVCcmFuY2ggPSB0cnVlQnJhbmNoO1xuICAgICAgICB0aGlzLmZhbHNlQnJhbmNoID0gZmFsc2VCcmFuY2g7XG4gICAgfVxuICAgIElmU3RyYXRlZ3kucHJvdG90eXBlLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnJhbmNoID0gdGhpcy50ZXN0KCkgPyB0aGlzLnRydWVCcmFuY2ggOiB0aGlzLmZhbHNlQnJhbmNoO1xuICAgICAgICByZXR1cm4gYnJhbmNoLmlzU3VwcG9ydGVkKCk7XG4gICAgfTtcbiAgICBJZlN0cmF0ZWd5LnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKG1pblByaW9yaXR5LCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgYnJhbmNoID0gdGhpcy50ZXN0KCkgPyB0aGlzLnRydWVCcmFuY2ggOiB0aGlzLmZhbHNlQnJhbmNoO1xuICAgICAgICByZXR1cm4gYnJhbmNoLmNvbm5lY3QobWluUHJpb3JpdHksIGNhbGxiYWNrKTtcbiAgICB9O1xuICAgIHJldHVybiBJZlN0cmF0ZWd5O1xufSgpKTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGlmX3N0cmF0ZWd5ID0gKElmU3RyYXRlZ3kpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL3N0cmF0ZWdpZXMvZmlyc3RfY29ubmVjdGVkX3N0cmF0ZWd5LnRzXG52YXIgRmlyc3RDb25uZWN0ZWRTdHJhdGVneSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRmlyc3RDb25uZWN0ZWRTdHJhdGVneShzdHJhdGVneSkge1xuICAgICAgICB0aGlzLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4gICAgfVxuICAgIEZpcnN0Q29ubmVjdGVkU3RyYXRlZ3kucHJvdG90eXBlLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHJhdGVneS5pc1N1cHBvcnRlZCgpO1xuICAgIH07XG4gICAgRmlyc3RDb25uZWN0ZWRTdHJhdGVneS5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uIChtaW5Qcmlvcml0eSwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHJ1bm5lciA9IHRoaXMuc3RyYXRlZ3kuY29ubmVjdChtaW5Qcmlvcml0eSwgZnVuY3Rpb24gKGVycm9yLCBoYW5kc2hha2UpIHtcbiAgICAgICAgICAgIGlmIChoYW5kc2hha2UpIHtcbiAgICAgICAgICAgICAgICBydW5uZXIuYWJvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yLCBoYW5kc2hha2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJ1bm5lcjtcbiAgICB9O1xuICAgIHJldHVybiBGaXJzdENvbm5lY3RlZFN0cmF0ZWd5O1xufSgpKTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGZpcnN0X2Nvbm5lY3RlZF9zdHJhdGVneSA9IChGaXJzdENvbm5lY3RlZFN0cmF0ZWd5KTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvcnVudGltZXMvd2ViL2RlZmF1bHRfc3RyYXRlZ3kudHNcblxuXG5cblxuXG5cblxuZnVuY3Rpb24gdGVzdFN1cHBvcnRzU3RyYXRlZ3koc3RyYXRlZ3kpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gc3RyYXRlZ3kuaXNTdXBwb3J0ZWQoKTtcbiAgICB9O1xufVxudmFyIGdldERlZmF1bHRTdHJhdGVneSA9IGZ1bmN0aW9uIChjb25maWcsIGJhc2VPcHRpb25zLCBkZWZpbmVUcmFuc3BvcnQpIHtcbiAgICB2YXIgZGVmaW5lZFRyYW5zcG9ydHMgPSB7fTtcbiAgICBmdW5jdGlvbiBkZWZpbmVUcmFuc3BvcnRTdHJhdGVneShuYW1lLCB0eXBlLCBwcmlvcml0eSwgb3B0aW9ucywgbWFuYWdlcikge1xuICAgICAgICB2YXIgdHJhbnNwb3J0ID0gZGVmaW5lVHJhbnNwb3J0KGNvbmZpZywgbmFtZSwgdHlwZSwgcHJpb3JpdHksIG9wdGlvbnMsIG1hbmFnZXIpO1xuICAgICAgICBkZWZpbmVkVHJhbnNwb3J0c1tuYW1lXSA9IHRyYW5zcG9ydDtcbiAgICAgICAgcmV0dXJuIHRyYW5zcG9ydDtcbiAgICB9XG4gICAgdmFyIHdzX29wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBiYXNlT3B0aW9ucywge1xuICAgICAgICBob3N0Tm9uVExTOiBjb25maWcud3NIb3N0ICsgJzonICsgY29uZmlnLndzUG9ydCxcbiAgICAgICAgaG9zdFRMUzogY29uZmlnLndzSG9zdCArICc6JyArIGNvbmZpZy53c3NQb3J0LFxuICAgICAgICBodHRwUGF0aDogY29uZmlnLndzUGF0aFxuICAgIH0pO1xuICAgIHZhciB3c3Nfb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHdzX29wdGlvbnMsIHtcbiAgICAgICAgdXNlVExTOiB0cnVlXG4gICAgfSk7XG4gICAgdmFyIHNvY2tqc19vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgYmFzZU9wdGlvbnMsIHtcbiAgICAgICAgaG9zdE5vblRMUzogY29uZmlnLmh0dHBIb3N0ICsgJzonICsgY29uZmlnLmh0dHBQb3J0LFxuICAgICAgICBob3N0VExTOiBjb25maWcuaHR0cEhvc3QgKyAnOicgKyBjb25maWcuaHR0cHNQb3J0LFxuICAgICAgICBodHRwUGF0aDogY29uZmlnLmh0dHBQYXRoXG4gICAgfSk7XG4gICAgdmFyIHRpbWVvdXRzID0ge1xuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICB0aW1lb3V0OiAxNTAwMCxcbiAgICAgICAgdGltZW91dExpbWl0OiA2MDAwMFxuICAgIH07XG4gICAgdmFyIHdzX21hbmFnZXIgPSBuZXcgdHJhbnNwb3J0X21hbmFnZXIoe1xuICAgICAgICBsaXZlczogMixcbiAgICAgICAgbWluUGluZ0RlbGF5OiAxMDAwMCxcbiAgICAgICAgbWF4UGluZ0RlbGF5OiBjb25maWcuYWN0aXZpdHlUaW1lb3V0XG4gICAgfSk7XG4gICAgdmFyIHN0cmVhbWluZ19tYW5hZ2VyID0gbmV3IHRyYW5zcG9ydF9tYW5hZ2VyKHtcbiAgICAgICAgbGl2ZXM6IDIsXG4gICAgICAgIG1pblBpbmdEZWxheTogMTAwMDAsXG4gICAgICAgIG1heFBpbmdEZWxheTogY29uZmlnLmFjdGl2aXR5VGltZW91dFxuICAgIH0pO1xuICAgIHZhciB3c190cmFuc3BvcnQgPSBkZWZpbmVUcmFuc3BvcnRTdHJhdGVneSgnd3MnLCAnd3MnLCAzLCB3c19vcHRpb25zLCB3c19tYW5hZ2VyKTtcbiAgICB2YXIgd3NzX3RyYW5zcG9ydCA9IGRlZmluZVRyYW5zcG9ydFN0cmF0ZWd5KCd3c3MnLCAnd3MnLCAzLCB3c3Nfb3B0aW9ucywgd3NfbWFuYWdlcik7XG4gICAgdmFyIHNvY2tqc190cmFuc3BvcnQgPSBkZWZpbmVUcmFuc3BvcnRTdHJhdGVneSgnc29ja2pzJywgJ3NvY2tqcycsIDEsIHNvY2tqc19vcHRpb25zKTtcbiAgICB2YXIgeGhyX3N0cmVhbWluZ190cmFuc3BvcnQgPSBkZWZpbmVUcmFuc3BvcnRTdHJhdGVneSgneGhyX3N0cmVhbWluZycsICd4aHJfc3RyZWFtaW5nJywgMSwgc29ja2pzX29wdGlvbnMsIHN0cmVhbWluZ19tYW5hZ2VyKTtcbiAgICB2YXIgeGRyX3N0cmVhbWluZ190cmFuc3BvcnQgPSBkZWZpbmVUcmFuc3BvcnRTdHJhdGVneSgneGRyX3N0cmVhbWluZycsICd4ZHJfc3RyZWFtaW5nJywgMSwgc29ja2pzX29wdGlvbnMsIHN0cmVhbWluZ19tYW5hZ2VyKTtcbiAgICB2YXIgeGhyX3BvbGxpbmdfdHJhbnNwb3J0ID0gZGVmaW5lVHJhbnNwb3J0U3RyYXRlZ3koJ3hocl9wb2xsaW5nJywgJ3hocl9wb2xsaW5nJywgMSwgc29ja2pzX29wdGlvbnMpO1xuICAgIHZhciB4ZHJfcG9sbGluZ190cmFuc3BvcnQgPSBkZWZpbmVUcmFuc3BvcnRTdHJhdGVneSgneGRyX3BvbGxpbmcnLCAneGRyX3BvbGxpbmcnLCAxLCBzb2NranNfb3B0aW9ucyk7XG4gICAgdmFyIHdzX2xvb3AgPSBuZXcgc2VxdWVudGlhbF9zdHJhdGVneShbd3NfdHJhbnNwb3J0XSwgdGltZW91dHMpO1xuICAgIHZhciB3c3NfbG9vcCA9IG5ldyBzZXF1ZW50aWFsX3N0cmF0ZWd5KFt3c3NfdHJhbnNwb3J0XSwgdGltZW91dHMpO1xuICAgIHZhciBzb2NranNfbG9vcCA9IG5ldyBzZXF1ZW50aWFsX3N0cmF0ZWd5KFtzb2NranNfdHJhbnNwb3J0XSwgdGltZW91dHMpO1xuICAgIHZhciBzdHJlYW1pbmdfbG9vcCA9IG5ldyBzZXF1ZW50aWFsX3N0cmF0ZWd5KFtcbiAgICAgICAgbmV3IGlmX3N0cmF0ZWd5KHRlc3RTdXBwb3J0c1N0cmF0ZWd5KHhocl9zdHJlYW1pbmdfdHJhbnNwb3J0KSwgeGhyX3N0cmVhbWluZ190cmFuc3BvcnQsIHhkcl9zdHJlYW1pbmdfdHJhbnNwb3J0KVxuICAgIF0sIHRpbWVvdXRzKTtcbiAgICB2YXIgcG9sbGluZ19sb29wID0gbmV3IHNlcXVlbnRpYWxfc3RyYXRlZ3koW1xuICAgICAgICBuZXcgaWZfc3RyYXRlZ3kodGVzdFN1cHBvcnRzU3RyYXRlZ3koeGhyX3BvbGxpbmdfdHJhbnNwb3J0KSwgeGhyX3BvbGxpbmdfdHJhbnNwb3J0LCB4ZHJfcG9sbGluZ190cmFuc3BvcnQpXG4gICAgXSwgdGltZW91dHMpO1xuICAgIHZhciBodHRwX2xvb3AgPSBuZXcgc2VxdWVudGlhbF9zdHJhdGVneShbXG4gICAgICAgIG5ldyBpZl9zdHJhdGVneSh0ZXN0U3VwcG9ydHNTdHJhdGVneShzdHJlYW1pbmdfbG9vcCksIG5ldyBiZXN0X2Nvbm5lY3RlZF9ldmVyX3N0cmF0ZWd5KFtcbiAgICAgICAgICAgIHN0cmVhbWluZ19sb29wLFxuICAgICAgICAgICAgbmV3IGRlbGF5ZWRfc3RyYXRlZ3kocG9sbGluZ19sb29wLCB7IGRlbGF5OiA0MDAwIH0pXG4gICAgICAgIF0pLCBwb2xsaW5nX2xvb3ApXG4gICAgXSwgdGltZW91dHMpO1xuICAgIHZhciBodHRwX2ZhbGxiYWNrX2xvb3AgPSBuZXcgaWZfc3RyYXRlZ3kodGVzdFN1cHBvcnRzU3RyYXRlZ3koaHR0cF9sb29wKSwgaHR0cF9sb29wLCBzb2NranNfbG9vcCk7XG4gICAgdmFyIHdzU3RyYXRlZ3k7XG4gICAgaWYgKGJhc2VPcHRpb25zLnVzZVRMUykge1xuICAgICAgICB3c1N0cmF0ZWd5ID0gbmV3IGJlc3RfY29ubmVjdGVkX2V2ZXJfc3RyYXRlZ3koW1xuICAgICAgICAgICAgd3NfbG9vcCxcbiAgICAgICAgICAgIG5ldyBkZWxheWVkX3N0cmF0ZWd5KGh0dHBfZmFsbGJhY2tfbG9vcCwgeyBkZWxheTogMjAwMCB9KVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdzU3RyYXRlZ3kgPSBuZXcgYmVzdF9jb25uZWN0ZWRfZXZlcl9zdHJhdGVneShbXG4gICAgICAgICAgICB3c19sb29wLFxuICAgICAgICAgICAgbmV3IGRlbGF5ZWRfc3RyYXRlZ3kod3NzX2xvb3AsIHsgZGVsYXk6IDIwMDAgfSksXG4gICAgICAgICAgICBuZXcgZGVsYXllZF9zdHJhdGVneShodHRwX2ZhbGxiYWNrX2xvb3AsIHsgZGVsYXk6IDUwMDAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgY2FjaGVkX3N0cmF0ZWd5KG5ldyBmaXJzdF9jb25uZWN0ZWRfc3RyYXRlZ3kobmV3IGlmX3N0cmF0ZWd5KHRlc3RTdXBwb3J0c1N0cmF0ZWd5KHdzX3RyYW5zcG9ydCksIHdzU3RyYXRlZ3ksIGh0dHBfZmFsbGJhY2tfbG9vcCkpLCBkZWZpbmVkVHJhbnNwb3J0cywge1xuICAgICAgICB0dGw6IDE4MDAwMDAsXG4gICAgICAgIHRpbWVsaW5lOiBiYXNlT3B0aW9ucy50aW1lbGluZSxcbiAgICAgICAgdXNlVExTOiBiYXNlT3B0aW9ucy51c2VUTFNcbiAgICB9KTtcbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBkZWZhdWx0X3N0cmF0ZWd5ID0gKGdldERlZmF1bHRTdHJhdGVneSk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3J1bnRpbWVzL3dlYi90cmFuc3BvcnRzL3RyYW5zcG9ydF9jb25uZWN0aW9uX2luaXRpYWxpemVyLnRzXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHRyYW5zcG9ydF9jb25uZWN0aW9uX2luaXRpYWxpemVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgc2VsZi50aW1lbGluZS5pbmZvKHNlbGYuYnVpbGRUaW1lbGluZU1lc3NhZ2Uoe1xuICAgICAgICB0cmFuc3BvcnQ6IHNlbGYubmFtZSArIChzZWxmLm9wdGlvbnMudXNlVExTID8gJ3MnIDogJycpXG4gICAgfSkpO1xuICAgIGlmIChzZWxmLmhvb2tzLmlzSW5pdGlhbGl6ZWQoKSkge1xuICAgICAgICBzZWxmLmNoYW5nZVN0YXRlKCdpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzZWxmLmhvb2tzLmZpbGUpIHtcbiAgICAgICAgc2VsZi5jaGFuZ2VTdGF0ZSgnaW5pdGlhbGl6aW5nJyk7XG4gICAgICAgIERlcGVuZGVuY2llcy5sb2FkKHNlbGYuaG9va3MuZmlsZSwgeyB1c2VUTFM6IHNlbGYub3B0aW9ucy51c2VUTFMgfSwgZnVuY3Rpb24gKGVycm9yLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKHNlbGYuaG9va3MuaXNJbml0aWFsaXplZCgpKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5jaGFuZ2VTdGF0ZSgnaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZWxmLm9uQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2VsZi5vbkNsb3NlKCk7XG4gICAgfVxufSk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3J1bnRpbWVzL3dlYi9odHRwL2h0dHBfeGRvbWFpbl9yZXF1ZXN0LnRzXG5cbnZhciBodHRwX3hkb21haW5fcmVxdWVzdF9ob29rcyA9IHtcbiAgICBnZXRSZXF1ZXN0OiBmdW5jdGlvbiAoc29ja2V0KSB7XG4gICAgICAgIHZhciB4ZHIgPSBuZXcgd2luZG93LlhEb21haW5SZXF1ZXN0KCk7XG4gICAgICAgIHhkci5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzb2NrZXQuZW1pdCgnZXJyb3InLCBuZXcgUmVxdWVzdFRpbWVkT3V0KCkpO1xuICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHhkci5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHNvY2tldC5lbWl0KCdlcnJvcicsIGUpO1xuICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHhkci5vbnByb2dyZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHhkci5yZXNwb25zZVRleHQgJiYgeGRyLnJlc3BvbnNlVGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgc29ja2V0Lm9uQ2h1bmsoMjAwLCB4ZHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgeGRyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh4ZHIucmVzcG9uc2VUZXh0ICYmIHhkci5yZXNwb25zZVRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNvY2tldC5vbkNodW5rKDIwMCwgeGRyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzb2NrZXQuZW1pdCgnZmluaXNoZWQnLCAyMDApO1xuICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB4ZHI7XG4gICAgfSxcbiAgICBhYm9ydFJlcXVlc3Q6IGZ1bmN0aW9uICh4ZHIpIHtcbiAgICAgICAgeGRyLm9udGltZW91dCA9IHhkci5vbmVycm9yID0geGRyLm9ucHJvZ3Jlc3MgPSB4ZHIub25sb2FkID0gbnVsbDtcbiAgICAgICAgeGRyLmFib3J0KCk7XG4gICAgfVxufTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGh0dHBfeGRvbWFpbl9yZXF1ZXN0ID0gKGh0dHBfeGRvbWFpbl9yZXF1ZXN0X2hvb2tzKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS9odHRwL2h0dHBfcmVxdWVzdC50c1xudmFyIGh0dHBfcmVxdWVzdF9leHRlbmRzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5cblxudmFyIE1BWF9CVUZGRVJfTEVOR1RIID0gMjU2ICogMTAyNDtcbnZhciBodHRwX3JlcXVlc3RfSFRUUFJlcXVlc3QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIGh0dHBfcmVxdWVzdF9leHRlbmRzKEhUVFBSZXF1ZXN0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEhUVFBSZXF1ZXN0KGhvb2tzLCBtZXRob2QsIHVybCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5ob29rcyA9IGhvb2tzO1xuICAgICAgICBfdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIF90aGlzLnVybCA9IHVybDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBIVFRQUmVxdWVzdC5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAocGF5bG9hZCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgICAgICAgdGhpcy54aHIgPSB0aGlzLmhvb2tzLmdldFJlcXVlc3QodGhpcyk7XG4gICAgICAgIHRoaXMudW5sb2FkZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5jbG9zZSgpO1xuICAgICAgICB9O1xuICAgICAgICBydW50aW1lLmFkZFVubG9hZExpc3RlbmVyKHRoaXMudW5sb2FkZXIpO1xuICAgICAgICB0aGlzLnhoci5vcGVuKHRoaXMubWV0aG9kLCB0aGlzLnVybCwgdHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLnhoci5zZXRSZXF1ZXN0SGVhZGVyKSB7XG4gICAgICAgICAgICB0aGlzLnhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMueGhyLnNlbmQocGF5bG9hZCk7XG4gICAgfTtcbiAgICBIVFRQUmVxdWVzdC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnVubG9hZGVyKSB7XG4gICAgICAgICAgICBydW50aW1lLnJlbW92ZVVubG9hZExpc3RlbmVyKHRoaXMudW5sb2FkZXIpO1xuICAgICAgICAgICAgdGhpcy51bmxvYWRlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMueGhyKSB7XG4gICAgICAgICAgICB0aGlzLmhvb2tzLmFib3J0UmVxdWVzdCh0aGlzLnhocik7XG4gICAgICAgICAgICB0aGlzLnhociA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEhUVFBSZXF1ZXN0LnByb3RvdHlwZS5vbkNodW5rID0gZnVuY3Rpb24gKHN0YXR1cywgZGF0YSkge1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdmFyIGNodW5rID0gdGhpcy5hZHZhbmNlQnVmZmVyKGRhdGEpO1xuICAgICAgICAgICAgaWYgKGNodW5rKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdjaHVuaycsIHsgc3RhdHVzOiBzdGF0dXMsIGRhdGE6IGNodW5rIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNCdWZmZXJUb29Mb25nKGRhdGEpKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2J1ZmZlcl90b29fbG9uZycpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBIVFRQUmVxdWVzdC5wcm90b3R5cGUuYWR2YW5jZUJ1ZmZlciA9IGZ1bmN0aW9uIChidWZmZXIpIHtcbiAgICAgICAgdmFyIHVucmVhZERhdGEgPSBidWZmZXIuc2xpY2UodGhpcy5wb3NpdGlvbik7XG4gICAgICAgIHZhciBlbmRPZkxpbmVQb3NpdGlvbiA9IHVucmVhZERhdGEuaW5kZXhPZignXFxuJyk7XG4gICAgICAgIGlmIChlbmRPZkxpbmVQb3NpdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gKz0gZW5kT2ZMaW5lUG9zaXRpb24gKyAxO1xuICAgICAgICAgICAgcmV0dXJuIHVucmVhZERhdGEuc2xpY2UoMCwgZW5kT2ZMaW5lUG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEhUVFBSZXF1ZXN0LnByb3RvdHlwZS5pc0J1ZmZlclRvb0xvbmcgPSBmdW5jdGlvbiAoYnVmZmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uID09PSBidWZmZXIubGVuZ3RoICYmIGJ1ZmZlci5sZW5ndGggPiBNQVhfQlVGRkVSX0xFTkdUSDtcbiAgICB9O1xuICAgIHJldHVybiBIVFRQUmVxdWVzdDtcbn0oZGlzcGF0Y2hlcikpO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgaHR0cF9yZXF1ZXN0ID0gKGh0dHBfcmVxdWVzdF9IVFRQUmVxdWVzdCk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvcmUvaHR0cC9zdGF0ZS50c1xudmFyIFN0YXRlO1xuKGZ1bmN0aW9uIChTdGF0ZSkge1xuICAgIFN0YXRlW1N0YXRlW1wiQ09OTkVDVElOR1wiXSA9IDBdID0gXCJDT05ORUNUSU5HXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJPUEVOXCJdID0gMV0gPSBcIk9QRU5cIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkNMT1NFRFwiXSA9IDNdID0gXCJDTE9TRURcIjtcbn0pKFN0YXRlIHx8IChTdGF0ZSA9IHt9KSk7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzdGF0ZSA9IChTdGF0ZSk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvcmUvaHR0cC9odHRwX3NvY2tldC50c1xuXG5cblxudmFyIGF1dG9JbmNyZW1lbnQgPSAxO1xudmFyIGh0dHBfc29ja2V0X0hUVFBTb2NrZXQgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEhUVFBTb2NrZXQoaG9va3MsIHVybCkge1xuICAgICAgICB0aGlzLmhvb2tzID0gaG9va3M7XG4gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHJhbmRvbU51bWJlcigxMDAwKSArICcvJyArIHJhbmRvbVN0cmluZyg4KTtcbiAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGdldExvY2F0aW9uKHVybCk7XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IHN0YXRlLkNPTk5FQ1RJTkc7XG4gICAgICAgIHRoaXMub3BlblN0cmVhbSgpO1xuICAgIH1cbiAgICBIVFRQU29ja2V0LnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKHBheWxvYWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFJhdyhKU09OLnN0cmluZ2lmeShbcGF5bG9hZF0pKTtcbiAgICB9O1xuICAgIEhUVFBTb2NrZXQucHJvdG90eXBlLnBpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaG9va3Muc2VuZEhlYXJ0YmVhdCh0aGlzKTtcbiAgICB9O1xuICAgIEhUVFBTb2NrZXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKGNvZGUsIHJlYXNvbikge1xuICAgICAgICB0aGlzLm9uQ2xvc2UoY29kZSwgcmVhc29uLCB0cnVlKTtcbiAgICB9O1xuICAgIEhUVFBTb2NrZXQucHJvdG90eXBlLnNlbmRSYXcgPSBmdW5jdGlvbiAocGF5bG9hZCkge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBzdGF0ZS5PUEVOKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJ1bnRpbWUuY3JlYXRlU29ja2V0UmVxdWVzdCgnUE9TVCcsIGdldFVuaXF1ZVVSTChnZXRTZW5kVVJMKHRoaXMubG9jYXRpb24sIHRoaXMuc2Vzc2lvbikpKS5zdGFydChwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBIVFRQU29ja2V0LnByb3RvdHlwZS5yZWNvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY2xvc2VTdHJlYW0oKTtcbiAgICAgICAgdGhpcy5vcGVuU3RyZWFtKCk7XG4gICAgfTtcbiAgICBIVFRQU29ja2V0LnByb3RvdHlwZS5vbkNsb3NlID0gZnVuY3Rpb24gKGNvZGUsIHJlYXNvbiwgd2FzQ2xlYW4pIHtcbiAgICAgICAgdGhpcy5jbG9zZVN0cmVhbSgpO1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBzdGF0ZS5DTE9TRUQ7XG4gICAgICAgIGlmICh0aGlzLm9uY2xvc2UpIHtcbiAgICAgICAgICAgIHRoaXMub25jbG9zZSh7XG4gICAgICAgICAgICAgICAgY29kZTogY29kZSxcbiAgICAgICAgICAgICAgICByZWFzb246IHJlYXNvbixcbiAgICAgICAgICAgICAgICB3YXNDbGVhbjogd2FzQ2xlYW5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBIVFRQU29ja2V0LnByb3RvdHlwZS5vbkNodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgIGlmIChjaHVuay5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IHN0YXRlLk9QRU4pIHtcbiAgICAgICAgICAgIHRoaXMub25BY3Rpdml0eSgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXlsb2FkO1xuICAgICAgICB2YXIgdHlwZSA9IGNodW5rLmRhdGEuc2xpY2UoMCwgMSk7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbyc6XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2UoY2h1bmsuZGF0YS5zbGljZSgxKSB8fCAne30nKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uT3BlbihwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBKU09OLnBhcnNlKGNodW5rLmRhdGEuc2xpY2UoMSkgfHwgJ1tdJyk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25FdmVudChwYXlsb2FkW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gSlNPTi5wYXJzZShjaHVuay5kYXRhLnNsaWNlKDEpIHx8ICdudWxsJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkV2ZW50KHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5vbkhlYXJ0YmVhdCh0aGlzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2MnOlxuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBKU09OLnBhcnNlKGNodW5rLmRhdGEuc2xpY2UoMSkgfHwgJ1tdJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNsb3NlKHBheWxvYWRbMF0sIHBheWxvYWRbMV0sIHRydWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBIVFRQU29ja2V0LnByb3RvdHlwZS5vbk9wZW4gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBzdGF0ZS5DT05ORUNUSU5HKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmhvc3RuYW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvbi5iYXNlID0gcmVwbGFjZUhvc3QodGhpcy5sb2NhdGlvbi5iYXNlLCBvcHRpb25zLmhvc3RuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IHN0YXRlLk9QRU47XG4gICAgICAgICAgICBpZiAodGhpcy5vbm9wZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9ub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vbkNsb3NlKDEwMDYsICdTZXJ2ZXIgbG9zdCBzZXNzaW9uJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEhUVFBTb2NrZXQucHJvdG90eXBlLm9uRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gc3RhdGUuT1BFTiAmJiB0aGlzLm9ubWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5vbm1lc3NhZ2UoeyBkYXRhOiBldmVudCB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSFRUUFNvY2tldC5wcm90b3R5cGUub25BY3Rpdml0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMub25hY3Rpdml0eSkge1xuICAgICAgICAgICAgdGhpcy5vbmFjdGl2aXR5KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEhUVFBTb2NrZXQucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMub25lcnJvcikge1xuICAgICAgICAgICAgdGhpcy5vbmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSFRUUFNvY2tldC5wcm90b3R5cGUub3BlblN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5zdHJlYW0gPSBydW50aW1lLmNyZWF0ZVNvY2tldFJlcXVlc3QoJ1BPU1QnLCBnZXRVbmlxdWVVUkwodGhpcy5ob29rcy5nZXRSZWNlaXZlVVJMKHRoaXMubG9jYXRpb24sIHRoaXMuc2Vzc2lvbikpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYmluZCgnY2h1bmsnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgICAgIF90aGlzLm9uQ2h1bmsoY2h1bmspO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYmluZCgnZmluaXNoZWQnLCBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgICAgICBfdGhpcy5ob29rcy5vbkZpbmlzaGVkKF90aGlzLCBzdGF0dXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYmluZCgnYnVmZmVyX3Rvb19sb25nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMucmVjb25uZWN0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zdHJlYW0uc3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHV0aWwuZGVmZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIF90aGlzLm9uQ2xvc2UoMTAwNiwgJ0NvdWxkIG5vdCBzdGFydCBzdHJlYW1pbmcnLCBmYWxzZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSFRUUFNvY2tldC5wcm90b3R5cGUuY2xvc2VTdHJlYW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0cmVhbSkge1xuICAgICAgICAgICAgdGhpcy5zdHJlYW0udW5iaW5kX2FsbCgpO1xuICAgICAgICAgICAgdGhpcy5zdHJlYW0uY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEhUVFBTb2NrZXQ7XG59KCkpO1xuZnVuY3Rpb24gZ2V0TG9jYXRpb24odXJsKSB7XG4gICAgdmFyIHBhcnRzID0gLyhbXlxcP10qKVxcLyooXFw/Py4qKS8uZXhlYyh1cmwpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGJhc2U6IHBhcnRzWzFdLFxuICAgICAgICBxdWVyeVN0cmluZzogcGFydHNbMl1cbiAgICB9O1xufVxuZnVuY3Rpb24gZ2V0U2VuZFVSTCh1cmwsIHNlc3Npb24pIHtcbiAgICByZXR1cm4gdXJsLmJhc2UgKyAnLycgKyBzZXNzaW9uICsgJy94aHJfc2VuZCc7XG59XG5mdW5jdGlvbiBnZXRVbmlxdWVVUkwodXJsKSB7XG4gICAgdmFyIHNlcGFyYXRvciA9IHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnO1xuICAgIHJldHVybiB1cmwgKyBzZXBhcmF0b3IgKyAndD0nICsgK25ldyBEYXRlKCkgKyAnJm49JyArIGF1dG9JbmNyZW1lbnQrKztcbn1cbmZ1bmN0aW9uIHJlcGxhY2VIb3N0KHVybCwgaG9zdG5hbWUpIHtcbiAgICB2YXIgdXJsUGFydHMgPSAvKGh0dHBzPzpcXC9cXC8pKFteXFwvOl0rKSgoXFwvfDopPy4qKS8uZXhlYyh1cmwpO1xuICAgIHJldHVybiB1cmxQYXJ0c1sxXSArIGhvc3RuYW1lICsgdXJsUGFydHNbM107XG59XG5mdW5jdGlvbiByYW5kb21OdW1iZXIobWF4KSB7XG4gICAgcmV0dXJuIHJ1bnRpbWUucmFuZG9tSW50KG1heCk7XG59XG5mdW5jdGlvbiByYW5kb21TdHJpbmcobGVuZ3RoKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocmFuZG9tTnVtYmVyKDMyKS50b1N0cmluZygzMikpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LmpvaW4oJycpO1xufVxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgaHR0cF9zb2NrZXQgPSAoaHR0cF9zb2NrZXRfSFRUUFNvY2tldCk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvcmUvaHR0cC9odHRwX3N0cmVhbWluZ19zb2NrZXQudHNcbnZhciBodHRwX3N0cmVhbWluZ19zb2NrZXRfaG9va3MgPSB7XG4gICAgZ2V0UmVjZWl2ZVVSTDogZnVuY3Rpb24gKHVybCwgc2Vzc2lvbikge1xuICAgICAgICByZXR1cm4gdXJsLmJhc2UgKyAnLycgKyBzZXNzaW9uICsgJy94aHJfc3RyZWFtaW5nJyArIHVybC5xdWVyeVN0cmluZztcbiAgICB9LFxuICAgIG9uSGVhcnRiZWF0OiBmdW5jdGlvbiAoc29ja2V0KSB7XG4gICAgICAgIHNvY2tldC5zZW5kUmF3KCdbXScpO1xuICAgIH0sXG4gICAgc2VuZEhlYXJ0YmVhdDogZnVuY3Rpb24gKHNvY2tldCkge1xuICAgICAgICBzb2NrZXQuc2VuZFJhdygnW10nKTtcbiAgICB9LFxuICAgIG9uRmluaXNoZWQ6IGZ1bmN0aW9uIChzb2NrZXQsIHN0YXR1cykge1xuICAgICAgICBzb2NrZXQub25DbG9zZSgxMDA2LCAnQ29ubmVjdGlvbiBpbnRlcnJ1cHRlZCAoJyArIHN0YXR1cyArICcpJywgZmFsc2UpO1xuICAgIH1cbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBodHRwX3N0cmVhbWluZ19zb2NrZXQgPSAoaHR0cF9zdHJlYW1pbmdfc29ja2V0X2hvb2tzKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS9odHRwL2h0dHBfcG9sbGluZ19zb2NrZXQudHNcbnZhciBodHRwX3BvbGxpbmdfc29ja2V0X2hvb2tzID0ge1xuICAgIGdldFJlY2VpdmVVUkw6IGZ1bmN0aW9uICh1cmwsIHNlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIHVybC5iYXNlICsgJy8nICsgc2Vzc2lvbiArICcveGhyJyArIHVybC5xdWVyeVN0cmluZztcbiAgICB9LFxuICAgIG9uSGVhcnRiZWF0OiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcbiAgICBzZW5kSGVhcnRiZWF0OiBmdW5jdGlvbiAoc29ja2V0KSB7XG4gICAgICAgIHNvY2tldC5zZW5kUmF3KCdbXScpO1xuICAgIH0sXG4gICAgb25GaW5pc2hlZDogZnVuY3Rpb24gKHNvY2tldCwgc3RhdHVzKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgc29ja2V0LnJlY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc29ja2V0Lm9uQ2xvc2UoMTAwNiwgJ0Nvbm5lY3Rpb24gaW50ZXJydXB0ZWQgKCcgKyBzdGF0dXMgKyAnKScsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBodHRwX3BvbGxpbmdfc29ja2V0ID0gKGh0dHBfcG9sbGluZ19zb2NrZXRfaG9va3MpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9ydW50aW1lcy9pc29tb3JwaGljL2h0dHAvaHR0cF94aHJfcmVxdWVzdC50c1xuXG52YXIgaHR0cF94aHJfcmVxdWVzdF9ob29rcyA9IHtcbiAgICBnZXRSZXF1ZXN0OiBmdW5jdGlvbiAoc29ja2V0KSB7XG4gICAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHJ1bnRpbWUuZ2V0WEhSQVBJKCk7XG4gICAgICAgIHZhciB4aHIgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHhoci5vbnByb2dyZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc3dpdGNoICh4aHIucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5yZXNwb25zZVRleHQgJiYgeGhyLnJlc3BvbnNlVGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQub25DaHVuayh4aHIuc3RhdHVzLCB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIucmVzcG9uc2VUZXh0ICYmIHhoci5yZXNwb25zZVRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0Lm9uQ2h1bmsoeGhyLnN0YXR1cywgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc29ja2V0LmVtaXQoJ2ZpbmlzaGVkJywgeGhyLnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHhocjtcbiAgICB9LFxuICAgIGFib3J0UmVxdWVzdDogZnVuY3Rpb24gKHhocikge1xuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgeGhyLmFib3J0KCk7XG4gICAgfVxufTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGh0dHBfeGhyX3JlcXVlc3QgPSAoaHR0cF94aHJfcmVxdWVzdF9ob29rcyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3J1bnRpbWVzL2lzb21vcnBoaWMvaHR0cC9odHRwLnRzXG5cblxuXG5cblxudmFyIEhUVFAgPSB7XG4gICAgY3JlYXRlU3RyZWFtaW5nU29ja2V0OiBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNvY2tldChodHRwX3N0cmVhbWluZ19zb2NrZXQsIHVybCk7XG4gICAgfSxcbiAgICBjcmVhdGVQb2xsaW5nU29ja2V0OiBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNvY2tldChodHRwX3BvbGxpbmdfc29ja2V0LCB1cmwpO1xuICAgIH0sXG4gICAgY3JlYXRlU29ja2V0OiBmdW5jdGlvbiAoaG9va3MsIHVybCkge1xuICAgICAgICByZXR1cm4gbmV3IGh0dHBfc29ja2V0KGhvb2tzLCB1cmwpO1xuICAgIH0sXG4gICAgY3JlYXRlWEhSOiBmdW5jdGlvbiAobWV0aG9kLCB1cmwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmVxdWVzdChodHRwX3hocl9yZXF1ZXN0LCBtZXRob2QsIHVybCk7XG4gICAgfSxcbiAgICBjcmVhdGVSZXF1ZXN0OiBmdW5jdGlvbiAoaG9va3MsIG1ldGhvZCwgdXJsKSB7XG4gICAgICAgIHJldHVybiBuZXcgaHR0cF9yZXF1ZXN0KGhvb2tzLCBtZXRob2QsIHVybCk7XG4gICAgfVxufTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGh0dHBfaHR0cCA9IChIVFRQKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvcnVudGltZXMvd2ViL2h0dHAvaHR0cC50c1xuXG5cbmh0dHBfaHR0cC5jcmVhdGVYRFIgPSBmdW5jdGlvbiAobWV0aG9kLCB1cmwpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVSZXF1ZXN0KGh0dHBfeGRvbWFpbl9yZXF1ZXN0LCBtZXRob2QsIHVybCk7XG59O1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgd2ViX2h0dHBfaHR0cCA9IChodHRwX2h0dHApO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9ydW50aW1lcy93ZWIvcnVudGltZS50c1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxudmFyIFJ1bnRpbWUgPSB7XG4gICAgbmV4dEF1dGhDYWxsYmFja0lEOiAxLFxuICAgIGF1dGhfY2FsbGJhY2tzOiB7fSxcbiAgICBTY3JpcHRSZWNlaXZlcnM6IFNjcmlwdFJlY2VpdmVycyxcbiAgICBEZXBlbmRlbmNpZXNSZWNlaXZlcnM6IERlcGVuZGVuY2llc1JlY2VpdmVycyxcbiAgICBnZXREZWZhdWx0U3RyYXRlZ3k6IGRlZmF1bHRfc3RyYXRlZ3ksXG4gICAgVHJhbnNwb3J0czogdHJhbnNwb3J0c190cmFuc3BvcnRzLFxuICAgIHRyYW5zcG9ydENvbm5lY3Rpb25Jbml0aWFsaXplcjogdHJhbnNwb3J0X2Nvbm5lY3Rpb25faW5pdGlhbGl6ZXIsXG4gICAgSFRUUEZhY3Rvcnk6IHdlYl9odHRwX2h0dHAsXG4gICAgVGltZWxpbmVUcmFuc3BvcnQ6IGpzb25wX3RpbWVsaW5lLFxuICAgIGdldFhIUkFQSTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LlhNTEh0dHBSZXF1ZXN0O1xuICAgIH0sXG4gICAgZ2V0V2ViU29ja2V0QVBJOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuV2ViU29ja2V0IHx8IHdpbmRvdy5Nb3pXZWJTb2NrZXQ7XG4gICAgfSxcbiAgICBzZXR1cDogZnVuY3Rpb24gKFB1c2hlckNsYXNzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHdpbmRvdy5QdXNoZXIgPSBQdXNoZXJDbGFzcztcbiAgICAgICAgdmFyIGluaXRpYWxpemVPbkRvY3VtZW50Qm9keSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLm9uRG9jdW1lbnRCb2R5KFB1c2hlckNsYXNzLnJlYWR5KTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCF3aW5kb3cuSlNPTikge1xuICAgICAgICAgICAgRGVwZW5kZW5jaWVzLmxvYWQoJ2pzb24yJywge30sIGluaXRpYWxpemVPbkRvY3VtZW50Qm9keSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbml0aWFsaXplT25Eb2N1bWVudEJvZHkoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZ2V0RG9jdW1lbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIH0sXG4gICAgZ2V0UHJvdG9jb2w6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5wcm90b2NvbDtcbiAgICB9LFxuICAgIGdldEF1dGhvcml6ZXJzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7IGFqYXg6IHhocl9hdXRoLCBqc29ucDoganNvbnBfYXV0aCB9O1xuICAgIH0sXG4gICAgb25Eb2N1bWVudEJvZHk6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLm9uRG9jdW1lbnRCb2R5KGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBjcmVhdGVKU09OUFJlcXVlc3Q6IGZ1bmN0aW9uICh1cmwsIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBqc29ucF9yZXF1ZXN0KHVybCwgZGF0YSk7XG4gICAgfSxcbiAgICBjcmVhdGVTY3JpcHRSZXF1ZXN0OiBmdW5jdGlvbiAoc3JjKSB7XG4gICAgICAgIHJldHVybiBuZXcgc2NyaXB0X3JlcXVlc3Qoc3JjKTtcbiAgICB9LFxuICAgIGdldExvY2FsU3RvcmFnZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGNyZWF0ZVhIUjogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5nZXRYSFJBUEkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU1pY3Jvc29mdFhIUigpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBjcmVhdGVYTUxIdHRwUmVxdWVzdDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzLmdldFhIUkFQSSgpO1xuICAgICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgfSxcbiAgICBjcmVhdGVNaWNyb3NvZnRYSFI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpO1xuICAgIH0sXG4gICAgZ2V0TmV0d29yazogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV0X2luZm9fTmV0d29yaztcbiAgICB9LFxuICAgIGNyZWF0ZVdlYlNvY2tldDogZnVuY3Rpb24gKHVybCkge1xuICAgICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzLmdldFdlYlNvY2tldEFQSSgpO1xuICAgICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHVybCk7XG4gICAgfSxcbiAgICBjcmVhdGVTb2NrZXRSZXF1ZXN0OiBmdW5jdGlvbiAobWV0aG9kLCB1cmwpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNYSFJTdXBwb3J0ZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuSFRUUEZhY3RvcnkuY3JlYXRlWEhSKG1ldGhvZCwgdXJsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzWERSU3VwcG9ydGVkKHVybC5pbmRleE9mKCdodHRwczonKSA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkhUVFBGYWN0b3J5LmNyZWF0ZVhEUihtZXRob2QsIHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyAnQ3Jvc3Mtb3JpZ2luIEhUVFAgcmVxdWVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQnO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBpc1hIUlN1cHBvcnRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzLmdldFhIUkFQSSgpO1xuICAgICAgICByZXR1cm4gKEJvb2xlYW4oQ29uc3RydWN0b3IpICYmIG5ldyBDb25zdHJ1Y3RvcigpLndpdGhDcmVkZW50aWFscyAhPT0gdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGlzWERSU3VwcG9ydGVkOiBmdW5jdGlvbiAodXNlVExTKSB7XG4gICAgICAgIHZhciBwcm90b2NvbCA9IHVzZVRMUyA/ICdodHRwczonIDogJ2h0dHA6JztcbiAgICAgICAgdmFyIGRvY3VtZW50UHJvdG9jb2wgPSB0aGlzLmdldFByb3RvY29sKCk7XG4gICAgICAgIHJldHVybiAoQm9vbGVhbih3aW5kb3dbJ1hEb21haW5SZXF1ZXN0J10pICYmIGRvY3VtZW50UHJvdG9jb2wgPT09IHByb3RvY29sKTtcbiAgICB9LFxuICAgIGFkZFVubG9hZExpc3RlbmVyOiBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd1bmxvYWQnLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHdpbmRvdy5hdHRhY2hFdmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3aW5kb3cuYXR0YWNoRXZlbnQoJ29udW5sb2FkJywgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICByZW1vdmVVbmxvYWRMaXN0ZW5lcjogZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndW5sb2FkJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh3aW5kb3cuZGV0YWNoRXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd2luZG93LmRldGFjaEV2ZW50KCdvbnVubG9hZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmFuZG9tSW50OiBmdW5jdGlvbiAobWF4KSB7XG4gICAgICAgIHZhciByYW5kb20gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY3J5cHRvID0gd2luZG93LmNyeXB0byB8fCB3aW5kb3dbJ21zQ3J5cHRvJ107XG4gICAgICAgICAgICB2YXIgcmFuZG9tID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDMyQXJyYXkoMSkpWzBdO1xuICAgICAgICAgICAgcmV0dXJuIHJhbmRvbSAvIE1hdGgucG93KDIsIDMyKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IocmFuZG9tKCkgKiBtYXgpO1xuICAgIH1cbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBydW50aW1lID0gKFJ1bnRpbWUpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL3RpbWVsaW5lL2xldmVsLnRzXG52YXIgVGltZWxpbmVMZXZlbDtcbihmdW5jdGlvbiAoVGltZWxpbmVMZXZlbCkge1xuICAgIFRpbWVsaW5lTGV2ZWxbVGltZWxpbmVMZXZlbFtcIkVSUk9SXCJdID0gM10gPSBcIkVSUk9SXCI7XG4gICAgVGltZWxpbmVMZXZlbFtUaW1lbGluZUxldmVsW1wiSU5GT1wiXSA9IDZdID0gXCJJTkZPXCI7XG4gICAgVGltZWxpbmVMZXZlbFtUaW1lbGluZUxldmVsW1wiREVCVUdcIl0gPSA3XSA9IFwiREVCVUdcIjtcbn0pKFRpbWVsaW5lTGV2ZWwgfHwgKFRpbWVsaW5lTGV2ZWwgPSB7fSkpO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdGltZWxpbmVfbGV2ZWwgPSAoVGltZWxpbmVMZXZlbCk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvcmUvdGltZWxpbmUvdGltZWxpbmUudHNcblxuXG5cbnZhciB0aW1lbGluZV9UaW1lbGluZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGltZWxpbmUoa2V5LCBzZXNzaW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgICAgICB0aGlzLmV2ZW50cyA9IFtdO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICB0aGlzLnNlbnQgPSAwO1xuICAgICAgICB0aGlzLnVuaXF1ZUlEID0gMDtcbiAgICB9XG4gICAgVGltZWxpbmUucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uIChsZXZlbCwgZXZlbnQpIHtcbiAgICAgICAgaWYgKGxldmVsIDw9IHRoaXMub3B0aW9ucy5sZXZlbCkge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMucHVzaChleHRlbmQoe30sIGV2ZW50LCB7IHRpbWVzdGFtcDogdXRpbC5ub3coKSB9KSk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpbWl0ICYmIHRoaXMuZXZlbnRzLmxlbmd0aCA+IHRoaXMub3B0aW9ucy5saW1pdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRpbWVsaW5lLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB0aGlzLmxvZyh0aW1lbGluZV9sZXZlbC5FUlJPUiwgZXZlbnQpO1xuICAgIH07XG4gICAgVGltZWxpbmUucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5sb2codGltZWxpbmVfbGV2ZWwuSU5GTywgZXZlbnQpO1xuICAgIH07XG4gICAgVGltZWxpbmUucHJvdG90eXBlLmRlYnVnID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHRoaXMubG9nKHRpbWVsaW5lX2xldmVsLkRFQlVHLCBldmVudCk7XG4gICAgfTtcbiAgICBUaW1lbGluZS5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRzLmxlbmd0aCA9PT0gMDtcbiAgICB9O1xuICAgIFRpbWVsaW5lLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKHNlbmRmbiwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGRhdGEgPSBleHRlbmQoe1xuICAgICAgICAgICAgc2Vzc2lvbjogdGhpcy5zZXNzaW9uLFxuICAgICAgICAgICAgYnVuZGxlOiB0aGlzLnNlbnQgKyAxLFxuICAgICAgICAgICAga2V5OiB0aGlzLmtleSxcbiAgICAgICAgICAgIGxpYjogJ2pzJyxcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMub3B0aW9ucy52ZXJzaW9uLFxuICAgICAgICAgICAgY2x1c3RlcjogdGhpcy5vcHRpb25zLmNsdXN0ZXIsXG4gICAgICAgICAgICBmZWF0dXJlczogdGhpcy5vcHRpb25zLmZlYXR1cmVzLFxuICAgICAgICAgICAgdGltZWxpbmU6IHRoaXMuZXZlbnRzXG4gICAgICAgIH0sIHRoaXMub3B0aW9ucy5wYXJhbXMpO1xuICAgICAgICB0aGlzLmV2ZW50cyA9IFtdO1xuICAgICAgICBzZW5kZm4oZGF0YSwgZnVuY3Rpb24gKGVycm9yLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnJvciwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgVGltZWxpbmUucHJvdG90eXBlLmdlbmVyYXRlVW5pcXVlSUQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudW5pcXVlSUQrKztcbiAgICAgICAgcmV0dXJuIHRoaXMudW5pcXVlSUQ7XG4gICAgfTtcbiAgICByZXR1cm4gVGltZWxpbmU7XG59KCkpO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgdGltZWxpbmVfdGltZWxpbmUgPSAodGltZWxpbmVfVGltZWxpbmUpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL3N0cmF0ZWdpZXMvdHJhbnNwb3J0X3N0cmF0ZWd5LnRzXG5cblxuXG5cbnZhciB0cmFuc3BvcnRfc3RyYXRlZ3lfVHJhbnNwb3J0U3RyYXRlZ3kgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRyYW5zcG9ydFN0cmF0ZWd5KG5hbWUsIHByaW9yaXR5LCB0cmFuc3BvcnQsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5O1xuICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB9XG4gICAgVHJhbnNwb3J0U3RyYXRlZ3kucHJvdG90eXBlLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuaXNTdXBwb3J0ZWQoe1xuICAgICAgICAgICAgdXNlVExTOiB0aGlzLm9wdGlvbnMudXNlVExTXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgVHJhbnNwb3J0U3RyYXRlZ3kucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAobWluUHJpb3JpdHksIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbEF0dGVtcHQobmV3IFVuc3VwcG9ydGVkU3RyYXRlZ3koKSwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJpb3JpdHkgPCBtaW5Qcmlvcml0eSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWxBdHRlbXB0KG5ldyBUcmFuc3BvcnRQcmlvcml0eVRvb0xvdygpLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgdHJhbnNwb3J0ID0gdGhpcy50cmFuc3BvcnQuY3JlYXRlQ29ubmVjdGlvbih0aGlzLm5hbWUsIHRoaXMucHJpb3JpdHksIHRoaXMub3B0aW9ucy5rZXksIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHZhciBoYW5kc2hha2UgPSBudWxsO1xuICAgICAgICB2YXIgb25Jbml0aWFsaXplZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRyYW5zcG9ydC51bmJpbmQoJ2luaXRpYWxpemVkJywgb25Jbml0aWFsaXplZCk7XG4gICAgICAgICAgICB0cmFuc3BvcnQuY29ubmVjdCgpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgb25PcGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaGFuZHNoYWtlID0gZmFjdG9yeS5jcmVhdGVIYW5kc2hha2UodHJhbnNwb3J0LCBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB1bmJpbmRMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBvbkVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICB1bmJpbmRMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIG9uQ2xvc2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdW5iaW5kTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICB2YXIgc2VyaWFsaXplZFRyYW5zcG9ydDtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWRUcmFuc3BvcnQgPSBzYWZlSlNPTlN0cmluZ2lmeSh0cmFuc3BvcnQpO1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IFRyYW5zcG9ydENsb3NlZChzZXJpYWxpemVkVHJhbnNwb3J0KSk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciB1bmJpbmRMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cmFuc3BvcnQudW5iaW5kKCdpbml0aWFsaXplZCcsIG9uSW5pdGlhbGl6ZWQpO1xuICAgICAgICAgICAgdHJhbnNwb3J0LnVuYmluZCgnb3BlbicsIG9uT3Blbik7XG4gICAgICAgICAgICB0cmFuc3BvcnQudW5iaW5kKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICAgICAgdHJhbnNwb3J0LnVuYmluZCgnY2xvc2VkJywgb25DbG9zZWQpO1xuICAgICAgICB9O1xuICAgICAgICB0cmFuc3BvcnQuYmluZCgnaW5pdGlhbGl6ZWQnLCBvbkluaXRpYWxpemVkKTtcbiAgICAgICAgdHJhbnNwb3J0LmJpbmQoJ29wZW4nLCBvbk9wZW4pO1xuICAgICAgICB0cmFuc3BvcnQuYmluZCgnZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgdHJhbnNwb3J0LmJpbmQoJ2Nsb3NlZCcsIG9uQ2xvc2VkKTtcbiAgICAgICAgdHJhbnNwb3J0LmluaXRpYWxpemUoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuYmluZExpc3RlbmVycygpO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kc2hha2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZHNoYWtlLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9yY2VNaW5Qcmlvcml0eTogZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLnByaW9yaXR5IDwgcCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZHNoYWtlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2UuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIFRyYW5zcG9ydFN0cmF0ZWd5O1xufSgpKTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHRyYW5zcG9ydF9zdHJhdGVneSA9ICh0cmFuc3BvcnRfc3RyYXRlZ3lfVHJhbnNwb3J0U3RyYXRlZ3kpO1xuZnVuY3Rpb24gZmFpbEF0dGVtcHQoZXJyb3IsIGNhbGxiYWNrKSB7XG4gICAgdXRpbC5kZWZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhYm9ydDogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBmb3JjZU1pblByaW9yaXR5OiBmdW5jdGlvbiAoKSB7IH1cbiAgICB9O1xufVxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL3N0cmF0ZWdpZXMvc3RyYXRlZ3lfYnVpbGRlci50c1xuXG5cblxuXG5cbnZhciBzdHJhdGVneV9idWlsZGVyX1RyYW5zcG9ydHMgPSBydW50aW1lLlRyYW5zcG9ydHM7XG52YXIgc3RyYXRlZ3lfYnVpbGRlcl9kZWZpbmVUcmFuc3BvcnQgPSBmdW5jdGlvbiAoY29uZmlnLCBuYW1lLCB0eXBlLCBwcmlvcml0eSwgb3B0aW9ucywgbWFuYWdlcikge1xuICAgIHZhciB0cmFuc3BvcnRDbGFzcyA9IHN0cmF0ZWd5X2J1aWxkZXJfVHJhbnNwb3J0c1t0eXBlXTtcbiAgICBpZiAoIXRyYW5zcG9ydENsYXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZFRyYW5zcG9ydCh0eXBlKTtcbiAgICB9XG4gICAgdmFyIGVuYWJsZWQgPSAoIWNvbmZpZy5lbmFibGVkVHJhbnNwb3J0cyB8fFxuICAgICAgICBhcnJheUluZGV4T2YoY29uZmlnLmVuYWJsZWRUcmFuc3BvcnRzLCBuYW1lKSAhPT0gLTEpICYmXG4gICAgICAgICghY29uZmlnLmRpc2FibGVkVHJhbnNwb3J0cyB8fFxuICAgICAgICAgICAgYXJyYXlJbmRleE9mKGNvbmZpZy5kaXNhYmxlZFRyYW5zcG9ydHMsIG5hbWUpID09PSAtMSk7XG4gICAgdmFyIHRyYW5zcG9ydDtcbiAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7IGlnbm9yZU51bGxPcmlnaW46IGNvbmZpZy5pZ25vcmVOdWxsT3JpZ2luIH0sIG9wdGlvbnMpO1xuICAgICAgICB0cmFuc3BvcnQgPSBuZXcgdHJhbnNwb3J0X3N0cmF0ZWd5KG5hbWUsIHByaW9yaXR5LCBtYW5hZ2VyID8gbWFuYWdlci5nZXRBc3Npc3RhbnQodHJhbnNwb3J0Q2xhc3MpIDogdHJhbnNwb3J0Q2xhc3MsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdHJhbnNwb3J0ID0gc3RyYXRlZ3lfYnVpbGRlcl9VbnN1cHBvcnRlZFN0cmF0ZWd5O1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNwb3J0O1xufTtcbnZhciBzdHJhdGVneV9idWlsZGVyX1Vuc3VwcG9ydGVkU3RyYXRlZ3kgPSB7XG4gICAgaXNTdXBwb3J0ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgY29ubmVjdDogZnVuY3Rpb24gKF8sIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBkZWZlcnJlZCA9IHV0aWwuZGVmZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IFVuc3VwcG9ydGVkU3RyYXRlZ3koKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5lbnN1cmVBYm9ydGVkKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9yY2VNaW5Qcmlvcml0eTogZnVuY3Rpb24gKCkgeyB9XG4gICAgICAgIH07XG4gICAgfVxufTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS9hdXRoL3VzZXJfYXV0aGVudGljYXRvci50c1xuXG5cbnZhciBjb21wb3NlQ2hhbm5lbFF1ZXJ5ID0gZnVuY3Rpb24gKHBhcmFtcywgYXV0aE9wdGlvbnMpIHtcbiAgICB2YXIgcXVlcnkgPSAnc29ja2V0X2lkPScgKyBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnNvY2tldElkKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gYXV0aE9wdGlvbnMucGFyYW1zKSB7XG4gICAgICAgIHF1ZXJ5ICs9XG4gICAgICAgICAgICAnJicgK1xuICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChrZXkpICtcbiAgICAgICAgICAgICAgICAnPScgK1xuICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChhdXRoT3B0aW9ucy5wYXJhbXNba2V5XSk7XG4gICAgfVxuICAgIGlmIChhdXRoT3B0aW9ucy5wYXJhbXNQcm92aWRlciAhPSBudWxsKSB7XG4gICAgICAgIHZhciBkeW5hbWljUGFyYW1zID0gYXV0aE9wdGlvbnMucGFyYW1zUHJvdmlkZXIoKTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGR5bmFtaWNQYXJhbXMpIHtcbiAgICAgICAgICAgIHF1ZXJ5ICs9XG4gICAgICAgICAgICAgICAgJyYnICtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgK1xuICAgICAgICAgICAgICAgICAgICAnPScgK1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoZHluYW1pY1BhcmFtc1trZXldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcXVlcnk7XG59O1xudmFyIFVzZXJBdXRoZW50aWNhdG9yID0gZnVuY3Rpb24gKGF1dGhPcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBydW50aW1lLmdldEF1dGhvcml6ZXJzKClbYXV0aE9wdGlvbnMudHJhbnNwb3J0XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgXCInXCIgKyBhdXRoT3B0aW9ucy50cmFuc3BvcnQgKyBcIicgaXMgbm90IGEgcmVjb2duaXplZCBhdXRoIHRyYW5zcG9ydFwiO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHF1ZXJ5ID0gY29tcG9zZUNoYW5uZWxRdWVyeShwYXJhbXMsIGF1dGhPcHRpb25zKTtcbiAgICAgICAgcnVudGltZS5nZXRBdXRob3JpemVycygpW2F1dGhPcHRpb25zLnRyYW5zcG9ydF0ocnVudGltZSwgcXVlcnksIGF1dGhPcHRpb25zLCBBdXRoUmVxdWVzdFR5cGUuVXNlckF1dGhlbnRpY2F0aW9uLCBjYWxsYmFjayk7XG4gICAgfTtcbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB1c2VyX2F1dGhlbnRpY2F0b3IgPSAoVXNlckF1dGhlbnRpY2F0b3IpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL2F1dGgvY2hhbm5lbF9hdXRob3JpemVyLnRzXG5cblxudmFyIGNoYW5uZWxfYXV0aG9yaXplcl9jb21wb3NlQ2hhbm5lbFF1ZXJ5ID0gZnVuY3Rpb24gKHBhcmFtcywgYXV0aE9wdGlvbnMpIHtcbiAgICB2YXIgcXVlcnkgPSAnc29ja2V0X2lkPScgKyBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnNvY2tldElkKTtcbiAgICBxdWVyeSArPSAnJmNoYW5uZWxfbmFtZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5jaGFubmVsTmFtZSk7XG4gICAgZm9yICh2YXIga2V5IGluIGF1dGhPcHRpb25zLnBhcmFtcykge1xuICAgICAgICBxdWVyeSArPVxuICAgICAgICAgICAgJyYnICtcbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArXG4gICAgICAgICAgICAgICAgJz0nICtcbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoYXV0aE9wdGlvbnMucGFyYW1zW2tleV0pO1xuICAgIH1cbiAgICBpZiAoYXV0aE9wdGlvbnMucGFyYW1zUHJvdmlkZXIgIT0gbnVsbCkge1xuICAgICAgICB2YXIgZHluYW1pY1BhcmFtcyA9IGF1dGhPcHRpb25zLnBhcmFtc1Byb3ZpZGVyKCk7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBkeW5hbWljUGFyYW1zKSB7XG4gICAgICAgICAgICBxdWVyeSArPVxuICAgICAgICAgICAgICAgICcmJyArXG4gICAgICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChrZXkpICtcbiAgICAgICAgICAgICAgICAgICAgJz0nICtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KGR5bmFtaWNQYXJhbXNba2V5XSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJ5O1xufTtcbnZhciBDaGFubmVsQXV0aG9yaXplciA9IGZ1bmN0aW9uIChhdXRoT3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgcnVudGltZS5nZXRBdXRob3JpemVycygpW2F1dGhPcHRpb25zLnRyYW5zcG9ydF0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IFwiJ1wiICsgYXV0aE9wdGlvbnMudHJhbnNwb3J0ICsgXCInIGlzIG5vdCBhIHJlY29nbml6ZWQgYXV0aCB0cmFuc3BvcnRcIjtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBxdWVyeSA9IGNoYW5uZWxfYXV0aG9yaXplcl9jb21wb3NlQ2hhbm5lbFF1ZXJ5KHBhcmFtcywgYXV0aE9wdGlvbnMpO1xuICAgICAgICBydW50aW1lLmdldEF1dGhvcml6ZXJzKClbYXV0aE9wdGlvbnMudHJhbnNwb3J0XShydW50aW1lLCBxdWVyeSwgYXV0aE9wdGlvbnMsIEF1dGhSZXF1ZXN0VHlwZS5DaGFubmVsQXV0aG9yaXphdGlvbiwgY2FsbGJhY2spO1xuICAgIH07XG59O1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY2hhbm5lbF9hdXRob3JpemVyID0gKENoYW5uZWxBdXRob3JpemVyKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS9hdXRoL2RlcHJlY2F0ZWRfY2hhbm5lbF9hdXRob3JpemVyLnRzXG52YXIgQ2hhbm5lbEF1dGhvcml6ZXJQcm94eSA9IGZ1bmN0aW9uIChwdXNoZXIsIGF1dGhPcHRpb25zLCBjaGFubmVsQXV0aG9yaXplckdlbmVyYXRvcikge1xuICAgIHZhciBkZXByZWNhdGVkQXV0aG9yaXplck9wdGlvbnMgPSB7XG4gICAgICAgIGF1dGhUcmFuc3BvcnQ6IGF1dGhPcHRpb25zLnRyYW5zcG9ydCxcbiAgICAgICAgYXV0aEVuZHBvaW50OiBhdXRoT3B0aW9ucy5lbmRwb2ludCxcbiAgICAgICAgYXV0aDoge1xuICAgICAgICAgICAgcGFyYW1zOiBhdXRoT3B0aW9ucy5wYXJhbXMsXG4gICAgICAgICAgICBoZWFkZXJzOiBhdXRoT3B0aW9ucy5oZWFkZXJzXG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgY2hhbm5lbCA9IHB1c2hlci5jaGFubmVsKHBhcmFtcy5jaGFubmVsTmFtZSk7XG4gICAgICAgIHZhciBjaGFubmVsQXV0aG9yaXplciA9IGNoYW5uZWxBdXRob3JpemVyR2VuZXJhdG9yKGNoYW5uZWwsIGRlcHJlY2F0ZWRBdXRob3JpemVyT3B0aW9ucyk7XG4gICAgICAgIGNoYW5uZWxBdXRob3JpemVyLmF1dGhvcml6ZShwYXJhbXMuc29ja2V0SWQsIGNhbGxiYWNrKTtcbiAgICB9O1xufTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29yZS9jb25maWcudHNcbnZhciBfX2Fzc2lnbiA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5cblxuXG5cbmZ1bmN0aW9uIGdldENvbmZpZyhvcHRzLCBwdXNoZXIpIHtcbiAgICB2YXIgY29uZmlnID0ge1xuICAgICAgICBhY3Rpdml0eVRpbWVvdXQ6IG9wdHMuYWN0aXZpdHlUaW1lb3V0IHx8IGRlZmF1bHRzLmFjdGl2aXR5VGltZW91dCxcbiAgICAgICAgY2x1c3Rlcjogb3B0cy5jbHVzdGVyIHx8IGRlZmF1bHRzLmNsdXN0ZXIsXG4gICAgICAgIGh0dHBQYXRoOiBvcHRzLmh0dHBQYXRoIHx8IGRlZmF1bHRzLmh0dHBQYXRoLFxuICAgICAgICBodHRwUG9ydDogb3B0cy5odHRwUG9ydCB8fCBkZWZhdWx0cy5odHRwUG9ydCxcbiAgICAgICAgaHR0cHNQb3J0OiBvcHRzLmh0dHBzUG9ydCB8fCBkZWZhdWx0cy5odHRwc1BvcnQsXG4gICAgICAgIHBvbmdUaW1lb3V0OiBvcHRzLnBvbmdUaW1lb3V0IHx8IGRlZmF1bHRzLnBvbmdUaW1lb3V0LFxuICAgICAgICBzdGF0c0hvc3Q6IG9wdHMuc3RhdHNIb3N0IHx8IGRlZmF1bHRzLnN0YXRzX2hvc3QsXG4gICAgICAgIHVuYXZhaWxhYmxlVGltZW91dDogb3B0cy51bmF2YWlsYWJsZVRpbWVvdXQgfHwgZGVmYXVsdHMudW5hdmFpbGFibGVUaW1lb3V0LFxuICAgICAgICB3c1BhdGg6IG9wdHMud3NQYXRoIHx8IGRlZmF1bHRzLndzUGF0aCxcbiAgICAgICAgd3NQb3J0OiBvcHRzLndzUG9ydCB8fCBkZWZhdWx0cy53c1BvcnQsXG4gICAgICAgIHdzc1BvcnQ6IG9wdHMud3NzUG9ydCB8fCBkZWZhdWx0cy53c3NQb3J0LFxuICAgICAgICBlbmFibGVTdGF0czogZ2V0RW5hYmxlU3RhdHNDb25maWcob3B0cyksXG4gICAgICAgIGh0dHBIb3N0OiBnZXRIdHRwSG9zdChvcHRzKSxcbiAgICAgICAgdXNlVExTOiBzaG91bGRVc2VUTFMob3B0cyksXG4gICAgICAgIHdzSG9zdDogZ2V0V2Vic29ja2V0SG9zdChvcHRzKSxcbiAgICAgICAgdXNlckF1dGhlbnRpY2F0b3I6IGJ1aWxkVXNlckF1dGhlbnRpY2F0b3Iob3B0cyksXG4gICAgICAgIGNoYW5uZWxBdXRob3JpemVyOiBidWlsZENoYW5uZWxBdXRob3JpemVyKG9wdHMsIHB1c2hlcilcbiAgICB9O1xuICAgIGlmICgnZGlzYWJsZWRUcmFuc3BvcnRzJyBpbiBvcHRzKVxuICAgICAgICBjb25maWcuZGlzYWJsZWRUcmFuc3BvcnRzID0gb3B0cy5kaXNhYmxlZFRyYW5zcG9ydHM7XG4gICAgaWYgKCdlbmFibGVkVHJhbnNwb3J0cycgaW4gb3B0cylcbiAgICAgICAgY29uZmlnLmVuYWJsZWRUcmFuc3BvcnRzID0gb3B0cy5lbmFibGVkVHJhbnNwb3J0cztcbiAgICBpZiAoJ2lnbm9yZU51bGxPcmlnaW4nIGluIG9wdHMpXG4gICAgICAgIGNvbmZpZy5pZ25vcmVOdWxsT3JpZ2luID0gb3B0cy5pZ25vcmVOdWxsT3JpZ2luO1xuICAgIGlmICgndGltZWxpbmVQYXJhbXMnIGluIG9wdHMpXG4gICAgICAgIGNvbmZpZy50aW1lbGluZVBhcmFtcyA9IG9wdHMudGltZWxpbmVQYXJhbXM7XG4gICAgaWYgKCduYWNsJyBpbiBvcHRzKSB7XG4gICAgICAgIGNvbmZpZy5uYWNsID0gb3B0cy5uYWNsO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xufVxuZnVuY3Rpb24gZ2V0SHR0cEhvc3Qob3B0cykge1xuICAgIGlmIChvcHRzLmh0dHBIb3N0KSB7XG4gICAgICAgIHJldHVybiBvcHRzLmh0dHBIb3N0O1xuICAgIH1cbiAgICBpZiAob3B0cy5jbHVzdGVyKSB7XG4gICAgICAgIHJldHVybiBcInNvY2tqcy1cIiArIG9wdHMuY2x1c3RlciArIFwiLnB1c2hlci5jb21cIjtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRzLmh0dHBIb3N0O1xufVxuZnVuY3Rpb24gZ2V0V2Vic29ja2V0SG9zdChvcHRzKSB7XG4gICAgaWYgKG9wdHMud3NIb3N0KSB7XG4gICAgICAgIHJldHVybiBvcHRzLndzSG9zdDtcbiAgICB9XG4gICAgaWYgKG9wdHMuY2x1c3Rlcikge1xuICAgICAgICByZXR1cm4gZ2V0V2Vic29ja2V0SG9zdEZyb21DbHVzdGVyKG9wdHMuY2x1c3Rlcik7XG4gICAgfVxuICAgIHJldHVybiBnZXRXZWJzb2NrZXRIb3N0RnJvbUNsdXN0ZXIoZGVmYXVsdHMuY2x1c3Rlcik7XG59XG5mdW5jdGlvbiBnZXRXZWJzb2NrZXRIb3N0RnJvbUNsdXN0ZXIoY2x1c3Rlcikge1xuICAgIHJldHVybiBcIndzLVwiICsgY2x1c3RlciArIFwiLnB1c2hlci5jb21cIjtcbn1cbmZ1bmN0aW9uIHNob3VsZFVzZVRMUyhvcHRzKSB7XG4gICAgaWYgKHJ1bnRpbWUuZ2V0UHJvdG9jb2woKSA9PT0gJ2h0dHBzOicpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdHMuZm9yY2VUTFMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBnZXRFbmFibGVTdGF0c0NvbmZpZyhvcHRzKSB7XG4gICAgaWYgKCdlbmFibGVTdGF0cycgaW4gb3B0cykge1xuICAgICAgICByZXR1cm4gb3B0cy5lbmFibGVTdGF0cztcbiAgICB9XG4gICAgaWYgKCdkaXNhYmxlU3RhdHMnIGluIG9wdHMpIHtcbiAgICAgICAgcmV0dXJuICFvcHRzLmRpc2FibGVTdGF0cztcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gYnVpbGRVc2VyQXV0aGVudGljYXRvcihvcHRzKSB7XG4gICAgdmFyIHVzZXJBdXRoZW50aWNhdGlvbiA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBkZWZhdWx0cy51c2VyQXV0aGVudGljYXRpb24pLCBvcHRzLnVzZXJBdXRoZW50aWNhdGlvbik7XG4gICAgaWYgKCdjdXN0b21IYW5kbGVyJyBpbiB1c2VyQXV0aGVudGljYXRpb24gJiZcbiAgICAgICAgdXNlckF1dGhlbnRpY2F0aW9uWydjdXN0b21IYW5kbGVyJ10gIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdXNlckF1dGhlbnRpY2F0aW9uWydjdXN0b21IYW5kbGVyJ107XG4gICAgfVxuICAgIHJldHVybiB1c2VyX2F1dGhlbnRpY2F0b3IodXNlckF1dGhlbnRpY2F0aW9uKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkQ2hhbm5lbEF1dGgob3B0cywgcHVzaGVyKSB7XG4gICAgdmFyIGNoYW5uZWxBdXRob3JpemF0aW9uO1xuICAgIGlmICgnY2hhbm5lbEF1dGhvcml6YXRpb24nIGluIG9wdHMpIHtcbiAgICAgICAgY2hhbm5lbEF1dGhvcml6YXRpb24gPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGVmYXVsdHMuY2hhbm5lbEF1dGhvcml6YXRpb24pLCBvcHRzLmNoYW5uZWxBdXRob3JpemF0aW9uKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNoYW5uZWxBdXRob3JpemF0aW9uID0ge1xuICAgICAgICAgICAgdHJhbnNwb3J0OiBvcHRzLmF1dGhUcmFuc3BvcnQgfHwgZGVmYXVsdHMuYXV0aFRyYW5zcG9ydCxcbiAgICAgICAgICAgIGVuZHBvaW50OiBvcHRzLmF1dGhFbmRwb2ludCB8fCBkZWZhdWx0cy5hdXRoRW5kcG9pbnRcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCdhdXRoJyBpbiBvcHRzKSB7XG4gICAgICAgICAgICBpZiAoJ3BhcmFtcycgaW4gb3B0cy5hdXRoKVxuICAgICAgICAgICAgICAgIGNoYW5uZWxBdXRob3JpemF0aW9uLnBhcmFtcyA9IG9wdHMuYXV0aC5wYXJhbXM7XG4gICAgICAgICAgICBpZiAoJ2hlYWRlcnMnIGluIG9wdHMuYXV0aClcbiAgICAgICAgICAgICAgICBjaGFubmVsQXV0aG9yaXphdGlvbi5oZWFkZXJzID0gb3B0cy5hdXRoLmhlYWRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdhdXRob3JpemVyJyBpbiBvcHRzKVxuICAgICAgICAgICAgY2hhbm5lbEF1dGhvcml6YXRpb24uY3VzdG9tSGFuZGxlciA9IENoYW5uZWxBdXRob3JpemVyUHJveHkocHVzaGVyLCBjaGFubmVsQXV0aG9yaXphdGlvbiwgb3B0cy5hdXRob3JpemVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5uZWxBdXRob3JpemF0aW9uO1xufVxuZnVuY3Rpb24gYnVpbGRDaGFubmVsQXV0aG9yaXplcihvcHRzLCBwdXNoZXIpIHtcbiAgICB2YXIgY2hhbm5lbEF1dGhvcml6YXRpb24gPSBidWlsZENoYW5uZWxBdXRoKG9wdHMsIHB1c2hlcik7XG4gICAgaWYgKCdjdXN0b21IYW5kbGVyJyBpbiBjaGFubmVsQXV0aG9yaXphdGlvbiAmJlxuICAgICAgICBjaGFubmVsQXV0aG9yaXphdGlvblsnY3VzdG9tSGFuZGxlciddICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGNoYW5uZWxBdXRob3JpemF0aW9uWydjdXN0b21IYW5kbGVyJ107XG4gICAgfVxuICAgIHJldHVybiBjaGFubmVsX2F1dGhvcml6ZXIoY2hhbm5lbEF1dGhvcml6YXRpb24pO1xufVxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL3dhdGNobGlzdC50c1xudmFyIHdhdGNobGlzdF9leHRlbmRzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5cblxudmFyIHdhdGNobGlzdF9XYXRjaGxpc3RGYWNhZGUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHdhdGNobGlzdF9leHRlbmRzKFdhdGNobGlzdEZhY2FkZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBXYXRjaGxpc3RGYWNhZGUocHVzaGVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGZ1bmN0aW9uIChldmVudE5hbWUsIGRhdGEpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcIk5vIGNhbGxiYWNrcyBvbiB3YXRjaGxpc3QgZXZlbnRzIGZvciBcIiArIGV2ZW50TmFtZSk7XG4gICAgICAgIH0pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnB1c2hlciA9IHB1c2hlcjtcbiAgICAgICAgX3RoaXMuYmluZFdhdGNobGlzdEludGVybmFsRXZlbnQoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBXYXRjaGxpc3RGYWNhZGUucHJvdG90eXBlLmhhbmRsZUV2ZW50ID0gZnVuY3Rpb24gKHB1c2hlckV2ZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHB1c2hlckV2ZW50LmRhdGEuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKHdhdGNobGlzdEV2ZW50KSB7XG4gICAgICAgICAgICBfdGhpcy5lbWl0KHdhdGNobGlzdEV2ZW50Lm5hbWUsIHdhdGNobGlzdEV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBXYXRjaGxpc3RGYWNhZGUucHJvdG90eXBlLmJpbmRXYXRjaGxpc3RJbnRlcm5hbEV2ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnB1c2hlci5jb25uZWN0aW9uLmJpbmQoJ21lc3NhZ2UnLCBmdW5jdGlvbiAocHVzaGVyRXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBldmVudE5hbWUgPSBwdXNoZXJFdmVudC5ldmVudDtcbiAgICAgICAgICAgIGlmIChldmVudE5hbWUgPT09ICdwdXNoZXJfaW50ZXJuYWw6d2F0Y2hsaXN0X2V2ZW50cycpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5oYW5kbGVFdmVudChwdXNoZXJFdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFdhdGNobGlzdEZhY2FkZTtcbn0oZGlzcGF0Y2hlcikpO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgd2F0Y2hsaXN0ID0gKHdhdGNobGlzdF9XYXRjaGxpc3RGYWNhZGUpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb3JlL3V0aWxzL2ZsYXRfcHJvbWlzZS50c1xuZnVuY3Rpb24gZmxhdFByb21pc2UoKSB7XG4gICAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikge1xuICAgICAgICByZXNvbHZlID0gcmVzO1xuICAgICAgICByZWplY3QgPSByZWo7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcHJvbWlzZTogcHJvbWlzZSwgcmVzb2x2ZTogcmVzb2x2ZSwgcmVqZWN0OiByZWplY3QgfTtcbn1cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGZsYXRfcHJvbWlzZSA9IChmbGF0UHJvbWlzZSk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvcmUvdXNlci50c1xudmFyIHVzZXJfZXh0ZW5kcyA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xuXG5cblxuXG5cbnZhciB1c2VyX1VzZXJGYWNhZGUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHVzZXJfZXh0ZW5kcyhVc2VyRmFjYWRlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVzZXJGYWNhZGUocHVzaGVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGZ1bmN0aW9uIChldmVudE5hbWUsIGRhdGEpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnTm8gY2FsbGJhY2tzIG9uIHVzZXIgZm9yICcgKyBldmVudE5hbWUpO1xuICAgICAgICB9KSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zaWduaW5fcmVxdWVzdGVkID0gZmFsc2U7XG4gICAgICAgIF90aGlzLnVzZXJfZGF0YSA9IG51bGw7XG4gICAgICAgIF90aGlzLnNlcnZlclRvVXNlckNoYW5uZWwgPSBudWxsO1xuICAgICAgICBfdGhpcy5zaWduaW5Eb25lUHJvbWlzZSA9IG51bGw7XG4gICAgICAgIF90aGlzLl9zaWduaW5Eb25lUmVzb2x2ZSA9IG51bGw7XG4gICAgICAgIF90aGlzLl9vbkF1dGhvcml6ZSA9IGZ1bmN0aW9uIChlcnIsIGF1dGhEYXRhKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJFcnJvciBkdXJpbmcgc2lnbmluOiBcIiArIGVycik7XG4gICAgICAgICAgICAgICAgX3RoaXMuX2NsZWFudXAoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5wdXNoZXIuc2VuZF9ldmVudCgncHVzaGVyOnNpZ25pbicsIHtcbiAgICAgICAgICAgICAgICBhdXRoOiBhdXRoRGF0YS5hdXRoLFxuICAgICAgICAgICAgICAgIHVzZXJfZGF0YTogYXV0aERhdGEudXNlcl9kYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMucHVzaGVyID0gcHVzaGVyO1xuICAgICAgICBfdGhpcy5wdXNoZXIuY29ubmVjdGlvbi5iaW5kKCdzdGF0ZV9jaGFuZ2UnLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IF9hLnByZXZpb3VzLCBjdXJyZW50ID0gX2EuY3VycmVudDtcbiAgICAgICAgICAgIGlmIChwcmV2aW91cyAhPT0gJ2Nvbm5lY3RlZCcgJiYgY3VycmVudCA9PT0gJ2Nvbm5lY3RlZCcpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5fc2lnbmluKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJldmlvdXMgPT09ICdjb25uZWN0ZWQnICYmIGN1cnJlbnQgIT09ICdjb25uZWN0ZWQnKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuX2NsZWFudXAoKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5fbmV3U2lnbmluUHJvbWlzZUlmTmVlZGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBfdGhpcy53YXRjaGxpc3QgPSBuZXcgd2F0Y2hsaXN0KHB1c2hlcik7XG4gICAgICAgIF90aGlzLnB1c2hlci5jb25uZWN0aW9uLmJpbmQoJ21lc3NhZ2UnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBldmVudE5hbWUgPSBldmVudC5ldmVudDtcbiAgICAgICAgICAgIGlmIChldmVudE5hbWUgPT09ICdwdXNoZXI6c2lnbmluX3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuX29uU2lnbmluU3VjY2VzcyhldmVudC5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfdGhpcy5zZXJ2ZXJUb1VzZXJDaGFubmVsICYmXG4gICAgICAgICAgICAgICAgX3RoaXMuc2VydmVyVG9Vc2VyQ2hhbm5lbC5uYW1lID09PSBldmVudC5jaGFubmVsKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuc2VydmVyVG9Vc2VyQ2hhbm5lbC5oYW5kbGVFdmVudChldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFVzZXJGYWNhZGUucHJvdG90eXBlLnNpZ25pbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2lnbmluX3JlcXVlc3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2lnbmluX3JlcXVlc3RlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3NpZ25pbigpO1xuICAgIH07XG4gICAgVXNlckZhY2FkZS5wcm90b3R5cGUuX3NpZ25pbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNpZ25pbl9yZXF1ZXN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9uZXdTaWduaW5Qcm9taXNlSWZOZWVkZWQoKTtcbiAgICAgICAgaWYgKHRoaXMucHVzaGVyLmNvbm5lY3Rpb24uc3RhdGUgIT09ICdjb25uZWN0ZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wdXNoZXIuY29uZmlnLnVzZXJBdXRoZW50aWNhdG9yKHtcbiAgICAgICAgICAgIHNvY2tldElkOiB0aGlzLnB1c2hlci5jb25uZWN0aW9uLnNvY2tldF9pZFxuICAgICAgICB9LCB0aGlzLl9vbkF1dGhvcml6ZSk7XG4gICAgfTtcbiAgICBVc2VyRmFjYWRlLnByb3RvdHlwZS5fb25TaWduaW5TdWNjZXNzID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudXNlcl9kYXRhID0gSlNPTi5wYXJzZShkYXRhLnVzZXJfZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkZhaWxlZCBwYXJzaW5nIHVzZXIgZGF0YSBhZnRlciBzaWduaW46IFwiICsgZGF0YS51c2VyX2RhdGEpO1xuICAgICAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy51c2VyX2RhdGEuaWQgIT09ICdzdHJpbmcnIHx8IHRoaXMudXNlcl9kYXRhLmlkID09PSAnJykge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwidXNlcl9kYXRhIGRvZXNuJ3QgY29udGFpbiBhbiBpZC4gdXNlcl9kYXRhOiBcIiArIHRoaXMudXNlcl9kYXRhKTtcbiAgICAgICAgICAgIHRoaXMuX2NsZWFudXAoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zaWduaW5Eb25lUmVzb2x2ZSgpO1xuICAgICAgICB0aGlzLl9zdWJzY3JpYmVDaGFubmVscygpO1xuICAgIH07XG4gICAgVXNlckZhY2FkZS5wcm90b3R5cGUuX3N1YnNjcmliZUNoYW5uZWxzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZW5zdXJlX3N1YnNjcmliZWQgPSBmdW5jdGlvbiAoY2hhbm5lbCkge1xuICAgICAgICAgICAgaWYgKGNoYW5uZWwuc3Vic2NyaXB0aW9uUGVuZGluZyAmJiBjaGFubmVsLnN1YnNjcmlwdGlvbkNhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgIGNoYW5uZWwucmVpbnN0YXRlU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghY2hhbm5lbC5zdWJzY3JpcHRpb25QZW5kaW5nICYmXG4gICAgICAgICAgICAgICAgX3RoaXMucHVzaGVyLmNvbm5lY3Rpb24uc3RhdGUgPT09ICdjb25uZWN0ZWQnKSB7XG4gICAgICAgICAgICAgICAgY2hhbm5lbC5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zZXJ2ZXJUb1VzZXJDaGFubmVsID0gbmV3IGNoYW5uZWxzX2NoYW5uZWwoXCIjc2VydmVyLXRvLXVzZXItXCIgKyB0aGlzLnVzZXJfZGF0YS5pZCwgdGhpcy5wdXNoZXIpO1xuICAgICAgICB0aGlzLnNlcnZlclRvVXNlckNoYW5uZWwuYmluZF9nbG9iYWwoZnVuY3Rpb24gKGV2ZW50TmFtZSwgZGF0YSkge1xuICAgICAgICAgICAgaWYgKGV2ZW50TmFtZS5pbmRleE9mKCdwdXNoZXJfaW50ZXJuYWw6JykgPT09IDAgfHxcbiAgICAgICAgICAgICAgICBldmVudE5hbWUuaW5kZXhPZigncHVzaGVyOicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMuZW1pdChldmVudE5hbWUsIGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgZW5zdXJlX3N1YnNjcmliZWQodGhpcy5zZXJ2ZXJUb1VzZXJDaGFubmVsKTtcbiAgICB9O1xuICAgIFVzZXJGYWNhZGUucHJvdG90eXBlLl9jbGVhbnVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVzZXJfZGF0YSA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLnNlcnZlclRvVXNlckNoYW5uZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyVG9Vc2VyQ2hhbm5lbC51bmJpbmRfYWxsKCk7XG4gICAgICAgICAgICB0aGlzLnNlcnZlclRvVXNlckNoYW5uZWwuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgdGhpcy5zZXJ2ZXJUb1VzZXJDaGFubmVsID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zaWduaW5fcmVxdWVzdGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9zaWduaW5Eb25lUmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBVc2VyRmFjYWRlLnByb3RvdHlwZS5fbmV3U2lnbmluUHJvbWlzZUlmTmVlZGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2lnbmluX3JlcXVlc3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNpZ25pbkRvbmVQcm9taXNlICYmICF0aGlzLnNpZ25pbkRvbmVQcm9taXNlLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX2EgPSBmbGF0X3Byb21pc2UoKSwgcHJvbWlzZSA9IF9hLnByb21pc2UsIHJlc29sdmUgPSBfYS5yZXNvbHZlLCBfID0gX2EucmVqZWN0O1xuICAgICAgICBwcm9taXNlLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgdmFyIHNldERvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBwcm9taXNlLmRvbmUgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICBwcm9taXNlLnRoZW4oc2V0RG9uZSlbXCJjYXRjaFwiXShzZXREb25lKTtcbiAgICAgICAgdGhpcy5zaWduaW5Eb25lUHJvbWlzZSA9IHByb21pc2U7XG4gICAgICAgIHRoaXMuX3NpZ25pbkRvbmVSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICB9O1xuICAgIHJldHVybiBVc2VyRmFjYWRlO1xufShkaXNwYXRjaGVyKSk7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB1c2VyID0gKHVzZXJfVXNlckZhY2FkZSk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvcmUvcHVzaGVyLnRzXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbnZhciBwdXNoZXJfUHVzaGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQdXNoZXIoYXBwX2tleSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBjaGVja0FwcEtleShhcHBfa2V5KTtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGlmICghb3B0aW9ucy5jbHVzdGVyICYmICEob3B0aW9ucy53c0hvc3QgfHwgb3B0aW9ucy5odHRwSG9zdCkpIHtcbiAgICAgICAgICAgIHZhciBzdWZmaXggPSB1cmxfc3RvcmUuYnVpbGRMb2dTdWZmaXgoJ2phdmFzY3JpcHRRdWlja1N0YXJ0Jyk7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIllvdSBzaG91bGQgYWx3YXlzIHNwZWNpZnkgYSBjbHVzdGVyIHdoZW4gY29ubmVjdGluZy4gXCIgKyBzdWZmaXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgnZGlzYWJsZVN0YXRzJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignVGhlIGRpc2FibGVTdGF0cyBvcHRpb24gaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBlbmFibGVTdGF0cycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMua2V5ID0gYXBwX2tleTtcbiAgICAgICAgdGhpcy5jb25maWcgPSBnZXRDb25maWcob3B0aW9ucywgdGhpcyk7XG4gICAgICAgIHRoaXMuY2hhbm5lbHMgPSBmYWN0b3J5LmNyZWF0ZUNoYW5uZWxzKCk7XG4gICAgICAgIHRoaXMuZ2xvYmFsX2VtaXR0ZXIgPSBuZXcgZGlzcGF0Y2hlcigpO1xuICAgICAgICB0aGlzLnNlc3Npb25JRCA9IHJ1bnRpbWUucmFuZG9tSW50KDEwMDAwMDAwMDApO1xuICAgICAgICB0aGlzLnRpbWVsaW5lID0gbmV3IHRpbWVsaW5lX3RpbWVsaW5lKHRoaXMua2V5LCB0aGlzLnNlc3Npb25JRCwge1xuICAgICAgICAgICAgY2x1c3RlcjogdGhpcy5jb25maWcuY2x1c3RlcixcbiAgICAgICAgICAgIGZlYXR1cmVzOiBQdXNoZXIuZ2V0Q2xpZW50RmVhdHVyZXMoKSxcbiAgICAgICAgICAgIHBhcmFtczogdGhpcy5jb25maWcudGltZWxpbmVQYXJhbXMgfHwge30sXG4gICAgICAgICAgICBsaW1pdDogNTAsXG4gICAgICAgICAgICBsZXZlbDogdGltZWxpbmVfbGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIHZlcnNpb246IGRlZmF1bHRzLlZFUlNJT05cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5lbmFibGVTdGF0cykge1xuICAgICAgICAgICAgdGhpcy50aW1lbGluZVNlbmRlciA9IGZhY3RvcnkuY3JlYXRlVGltZWxpbmVTZW5kZXIodGhpcy50aW1lbGluZSwge1xuICAgICAgICAgICAgICAgIGhvc3Q6IHRoaXMuY29uZmlnLnN0YXRzSG9zdCxcbiAgICAgICAgICAgICAgICBwYXRoOiAnL3RpbWVsaW5lL3YyLycgKyBydW50aW1lLlRpbWVsaW5lVHJhbnNwb3J0Lm5hbWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBnZXRTdHJhdGVneSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gcnVudGltZS5nZXREZWZhdWx0U3RyYXRlZ3koX3RoaXMuY29uZmlnLCBvcHRpb25zLCBzdHJhdGVneV9idWlsZGVyX2RlZmluZVRyYW5zcG9ydCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGZhY3RvcnkuY3JlYXRlQ29ubmVjdGlvbk1hbmFnZXIodGhpcy5rZXksIHtcbiAgICAgICAgICAgIGdldFN0cmF0ZWd5OiBnZXRTdHJhdGVneSxcbiAgICAgICAgICAgIHRpbWVsaW5lOiB0aGlzLnRpbWVsaW5lLFxuICAgICAgICAgICAgYWN0aXZpdHlUaW1lb3V0OiB0aGlzLmNvbmZpZy5hY3Rpdml0eVRpbWVvdXQsXG4gICAgICAgICAgICBwb25nVGltZW91dDogdGhpcy5jb25maWcucG9uZ1RpbWVvdXQsXG4gICAgICAgICAgICB1bmF2YWlsYWJsZVRpbWVvdXQ6IHRoaXMuY29uZmlnLnVuYXZhaWxhYmxlVGltZW91dCxcbiAgICAgICAgICAgIHVzZVRMUzogQm9vbGVhbih0aGlzLmNvbmZpZy51c2VUTFMpXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uYmluZCgnY29ubmVjdGVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuc3Vic2NyaWJlQWxsKCk7XG4gICAgICAgICAgICBpZiAoX3RoaXMudGltZWxpbmVTZW5kZXIpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy50aW1lbGluZVNlbmRlci5zZW5kKF90aGlzLmNvbm5lY3Rpb24uaXNVc2luZ1RMUygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5iaW5kKCdtZXNzYWdlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgZXZlbnROYW1lID0gZXZlbnQuZXZlbnQ7XG4gICAgICAgICAgICB2YXIgaW50ZXJuYWwgPSBldmVudE5hbWUuaW5kZXhPZigncHVzaGVyX2ludGVybmFsOicpID09PSAwO1xuICAgICAgICAgICAgaWYgKGV2ZW50LmNoYW5uZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2hhbm5lbCA9IF90aGlzLmNoYW5uZWwoZXZlbnQuY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC5oYW5kbGVFdmVudChldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmdsb2JhbF9lbWl0dGVyLmVtaXQoZXZlbnQuZXZlbnQsIGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmJpbmQoJ2Nvbm5lY3RpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5jaGFubmVscy5kaXNjb25uZWN0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uYmluZCgnZGlzY29ubmVjdGVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuY2hhbm5lbHMuZGlzY29ubmVjdCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmJpbmQoJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFB1c2hlci5pbnN0YW5jZXMucHVzaCh0aGlzKTtcbiAgICAgICAgdGhpcy50aW1lbGluZS5pbmZvKHsgaW5zdGFuY2VzOiBQdXNoZXIuaW5zdGFuY2VzLmxlbmd0aCB9KTtcbiAgICAgICAgdGhpcy51c2VyID0gbmV3IHVzZXIodGhpcyk7XG4gICAgICAgIGlmIChQdXNoZXIuaXNSZWFkeSkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUHVzaGVyLnJlYWR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBQdXNoZXIuaXNSZWFkeSA9IHRydWU7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gUHVzaGVyLmluc3RhbmNlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIFB1c2hlci5pbnN0YW5jZXNbaV0uY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQdXNoZXIuZ2V0Q2xpZW50RmVhdHVyZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBrZXlzKGZpbHRlck9iamVjdCh7IHdzOiBydW50aW1lLlRyYW5zcG9ydHMud3MgfSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0LmlzU3VwcG9ydGVkKHt9KTtcbiAgICAgICAgfSkpO1xuICAgIH07XG4gICAgUHVzaGVyLnByb3RvdHlwZS5jaGFubmVsID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbm5lbHMuZmluZChuYW1lKTtcbiAgICB9O1xuICAgIFB1c2hlci5wcm90b3R5cGUuYWxsQ2hhbm5lbHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5uZWxzLmFsbCgpO1xuICAgIH07XG4gICAgUHVzaGVyLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uY29ubmVjdCgpO1xuICAgICAgICBpZiAodGhpcy50aW1lbGluZVNlbmRlcikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRpbWVsaW5lU2VuZGVyVGltZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgdXNpbmdUTFMgPSB0aGlzLmNvbm5lY3Rpb24uaXNVc2luZ1RMUygpO1xuICAgICAgICAgICAgICAgIHZhciB0aW1lbGluZVNlbmRlciA9IHRoaXMudGltZWxpbmVTZW5kZXI7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lbGluZVNlbmRlclRpbWVyID0gbmV3IFBlcmlvZGljVGltZXIoNjAwMDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZWxpbmVTZW5kZXIuc2VuZCh1c2luZ1RMUyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFB1c2hlci5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgaWYgKHRoaXMudGltZWxpbmVTZW5kZXJUaW1lcikge1xuICAgICAgICAgICAgdGhpcy50aW1lbGluZVNlbmRlclRpbWVyLmVuc3VyZUFib3J0ZWQoKTtcbiAgICAgICAgICAgIHRoaXMudGltZWxpbmVTZW5kZXJUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFB1c2hlci5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIChldmVudF9uYW1lLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgICAgICB0aGlzLmdsb2JhbF9lbWl0dGVyLmJpbmQoZXZlbnRfbmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFB1c2hlci5wcm90b3R5cGUudW5iaW5kID0gZnVuY3Rpb24gKGV2ZW50X25hbWUsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuZ2xvYmFsX2VtaXR0ZXIudW5iaW5kKGV2ZW50X25hbWUsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBQdXNoZXIucHJvdG90eXBlLmJpbmRfZ2xvYmFsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFsX2VtaXR0ZXIuYmluZF9nbG9iYWwoY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFB1c2hlci5wcm90b3R5cGUudW5iaW5kX2dsb2JhbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmdsb2JhbF9lbWl0dGVyLnVuYmluZF9nbG9iYWwoY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFB1c2hlci5wcm90b3R5cGUudW5iaW5kX2FsbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmdsb2JhbF9lbWl0dGVyLnVuYmluZF9hbGwoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBQdXNoZXIucHJvdG90eXBlLnN1YnNjcmliZUFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNoYW5uZWxOYW1lO1xuICAgICAgICBmb3IgKGNoYW5uZWxOYW1lIGluIHRoaXMuY2hhbm5lbHMuY2hhbm5lbHMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYW5uZWxzLmNoYW5uZWxzLmhhc093blByb3BlcnR5KGNoYW5uZWxOYW1lKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlKGNoYW5uZWxOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgUHVzaGVyLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoY2hhbm5lbF9uYW1lKSB7XG4gICAgICAgIHZhciBjaGFubmVsID0gdGhpcy5jaGFubmVscy5hZGQoY2hhbm5lbF9uYW1lLCB0aGlzKTtcbiAgICAgICAgaWYgKGNoYW5uZWwuc3Vic2NyaXB0aW9uUGVuZGluZyAmJiBjaGFubmVsLnN1YnNjcmlwdGlvbkNhbmNlbGxlZCkge1xuICAgICAgICAgICAgY2hhbm5lbC5yZWluc3RhdGVTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghY2hhbm5lbC5zdWJzY3JpcHRpb25QZW5kaW5nICYmXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uc3RhdGUgPT09ICdjb25uZWN0ZWQnKSB7XG4gICAgICAgICAgICBjaGFubmVsLnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFubmVsO1xuICAgIH07XG4gICAgUHVzaGVyLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uIChjaGFubmVsX25hbWUpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmZpbmQoY2hhbm5lbF9uYW1lKTtcbiAgICAgICAgaWYgKGNoYW5uZWwgJiYgY2hhbm5lbC5zdWJzY3JpcHRpb25QZW5kaW5nKSB7XG4gICAgICAgICAgICBjaGFubmVsLmNhbmNlbFN1YnNjcmlwdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMucmVtb3ZlKGNoYW5uZWxfbmFtZSk7XG4gICAgICAgICAgICBpZiAoY2hhbm5lbCAmJiBjaGFubmVsLnN1YnNjcmliZWQpIHtcbiAgICAgICAgICAgICAgICBjaGFubmVsLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFB1c2hlci5wcm90b3R5cGUuc2VuZF9ldmVudCA9IGZ1bmN0aW9uIChldmVudF9uYW1lLCBkYXRhLCBjaGFubmVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uc2VuZF9ldmVudChldmVudF9uYW1lLCBkYXRhLCBjaGFubmVsKTtcbiAgICB9O1xuICAgIFB1c2hlci5wcm90b3R5cGUuc2hvdWxkVXNlVExTID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcudXNlVExTO1xuICAgIH07XG4gICAgUHVzaGVyLnByb3RvdHlwZS5zaWduaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXNlci5zaWduaW4oKTtcbiAgICB9O1xuICAgIFB1c2hlci5pbnN0YW5jZXMgPSBbXTtcbiAgICBQdXNoZXIuaXNSZWFkeSA9IGZhbHNlO1xuICAgIFB1c2hlci5sb2dUb0NvbnNvbGUgPSBmYWxzZTtcbiAgICBQdXNoZXIuUnVudGltZSA9IHJ1bnRpbWU7XG4gICAgUHVzaGVyLlNjcmlwdFJlY2VpdmVycyA9IHJ1bnRpbWUuU2NyaXB0UmVjZWl2ZXJzO1xuICAgIFB1c2hlci5EZXBlbmRlbmNpZXNSZWNlaXZlcnMgPSBydW50aW1lLkRlcGVuZGVuY2llc1JlY2VpdmVycztcbiAgICBQdXNoZXIuYXV0aF9jYWxsYmFja3MgPSBydW50aW1lLmF1dGhfY2FsbGJhY2tzO1xuICAgIHJldHVybiBQdXNoZXI7XG59KCkpO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgY29yZV9wdXNoZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChwdXNoZXJfUHVzaGVyKTtcbmZ1bmN0aW9uIGNoZWNrQXBwS2V5KGtleSkge1xuICAgIGlmIChrZXkgPT09IG51bGwgfHwga2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgJ1lvdSBtdXN0IHBhc3MgeW91ciBhcHAga2V5IHdoZW4geW91IGluc3RhbnRpYXRlIFB1c2hlci4nO1xuICAgIH1cbn1cbnJ1bnRpbWUuc2V0dXAocHVzaGVyX1B1c2hlcik7XG5cblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wdXNoZXIuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/pusher-js/dist/web/pusher.js\n");

/***/ }),

/***/ "./node_modules/vue-sidebar-menu/dist/vue-sidebar-menu.css":
/*!*****************************************************************!*\
  !*** ./node_modules/vue-sidebar-menu/dist/vue-sidebar-menu.css ***!
  \*****************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n/* harmony import */ var _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _css_loader_dist_cjs_js_clonedRuleSet_12_use_1_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_vue_sidebar_menu_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !!../../css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!../../postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./vue-sidebar-menu.css */ \"./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-sidebar-menu/dist/vue-sidebar-menu.css\");\n\n            \n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_vue_sidebar_menu_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"], options);\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_vue_sidebar_menu_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].locals || {});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdnVlLXNpZGViYXItbWVudS9kaXN0L3Z1ZS1zaWRlYmFyLW1lbnUuY3NzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBK0U7QUFDL0UsWUFBMks7O0FBRTNLOztBQUVBO0FBQ0E7O0FBRUEsYUFBYSw2RkFBRyxDQUFDLDZKQUFPOzs7O0FBSXhCLGlFQUFlLG9LQUFjLE1BQU0iLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdnVlLXNpZGViYXItbWVudS9kaXN0L3Z1ZS1zaWRlYmFyLW1lbnUuY3NzP2I4NTQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9jbG9uZWRSdWxlU2V0LTEyLnVzZVsxXSEuLi8uLi9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0xMi51c2VbMl0hLi92dWUtc2lkZWJhci1tZW51LmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/vue-sidebar-menu/dist/vue-sidebar-menu.css\n");

/***/ }),

/***/ "./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/LoadingIcon.vue?vue&type=style&index=0&id=474d299e&scoped=true&lang=css":
/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/LoadingIcon.vue?vue&type=style&index=0&id=474d299e&scoped=true&lang=css ***!
  \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_LoadingIcon_vue_vue_type_style_index_0_id_474d299e_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !!../../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./LoadingIcon.vue?vue&type=style&index=0&id=474d299e&scoped=true&lang=css */ \"./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/LoadingIcon.vue?vue&type=style&index=0&id=474d299e&scoped=true&lang=css\");\n\n            \n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_LoadingIcon_vue_vue_type_style_index_0_id_474d299e_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"], options);\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_LoadingIcon_vue_vue_type_style_index_0_id_474d299e_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].locals || {});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMTIudXNlWzFdIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9zdHlsZVBvc3RMb2FkZXIuanMhLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMTIudXNlWzJdIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9pbmRleC5qcz8/cnVsZVNldFswXS51c2VbMF0hLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL0xvYWRpbmdJY29uLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTQ3NGQyOTllJnNjb3BlZD10cnVlJmxhbmc9Y3NzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBa0c7QUFDbEcsWUFBcVk7O0FBRXJZOztBQUVBO0FBQ0E7O0FBRUEsYUFBYSwwR0FBRyxDQUFDLGdWQUFPOzs7O0FBSXhCLGlFQUFlLHVWQUFjLE1BQU0iLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL0xvYWRpbmdJY29uLnZ1ZT9hMjkyIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9jbG9uZWRSdWxlU2V0LTEyLnVzZVsxXSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMTIudXNlWzJdIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvaW5kZXguanM/P3J1bGVTZXRbMF0udXNlWzBdIS4vTG9hZGluZ0ljb24udnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NDc0ZDI5OWUmc2NvcGVkPXRydWUmbGFuZz1jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/LoadingIcon.vue?vue&type=style&index=0&id=474d299e&scoped=true&lang=css\n");

/***/ }),

/***/ "./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/FooterBar.vue?vue&type=style&index=0&id=5fdfec95&scoped=true&lang=css":
/*!*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/FooterBar.vue?vue&type=style&index=0&id=5fdfec95&scoped=true&lang=css ***!
  \*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_FooterBar_vue_vue_type_style_index_0_id_5fdfec95_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !!../../../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./FooterBar.vue?vue&type=style&index=0&id=5fdfec95&scoped=true&lang=css */ \"./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/FooterBar.vue?vue&type=style&index=0&id=5fdfec95&scoped=true&lang=css\");\n\n            \n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_FooterBar_vue_vue_type_style_index_0_id_5fdfec95_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"], options);\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_FooterBar_vue_vue_type_style_index_0_id_5fdfec95_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].locals || {});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMTIudXNlWzFdIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9zdHlsZVBvc3RMb2FkZXIuanMhLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMTIudXNlWzJdIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9pbmRleC5qcz8/cnVsZVNldFswXS51c2VbMF0hLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9Gb290ZXJCYXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NWZkZmVjOTUmc2NvcGVkPXRydWUmbGFuZz1jc3MuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFxRztBQUNyRyxZQUErWTs7QUFFL1k7O0FBRUE7QUFDQTs7QUFFQSxhQUFhLDBHQUFHLENBQUMsOFVBQU87Ozs7QUFJeEIsaUVBQWUscVZBQWMsTUFBTSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvbmF2L0Zvb3RlckJhci52dWU/MTMzYiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0xMi51c2VbMV0hLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9jbG9uZWRSdWxlU2V0LTEyLnVzZVsyXSEuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2luZGV4LmpzPz9ydWxlU2V0WzBdLnVzZVswXSEuL0Zvb3RlckJhci52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD01ZmRmZWM5NSZzY29wZWQ9dHJ1ZSZsYW5nPWNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/FooterBar.vue?vue&type=style&index=0&id=5fdfec95&scoped=true&lang=css\n");

/***/ }),

/***/ "./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/SideBar.vue?vue&type=style&index=0&id=0aa712ce&lang=css":
/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/SideBar.vue?vue&type=style&index=0&id=0aa712ce&lang=css ***!
  \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_SideBar_vue_vue_type_style_index_0_id_0aa712ce_lang_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !!../../../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./SideBar.vue?vue&type=style&index=0&id=0aa712ce&lang=css */ \"./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/SideBar.vue?vue&type=style&index=0&id=0aa712ce&lang=css\");\n\n            \n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_SideBar_vue_vue_type_style_index_0_id_0aa712ce_lang_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"], options);\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_SideBar_vue_vue_type_style_index_0_id_0aa712ce_lang_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].locals || {});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMTIudXNlWzFdIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9zdHlsZVBvc3RMb2FkZXIuanMhLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMTIudXNlWzJdIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9pbmRleC5qcz8/cnVsZVNldFswXS51c2VbMF0hLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9TaWRlQmFyLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTBhYTcxMmNlJmxhbmc9Y3NzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBcUc7QUFDckcsWUFBaVk7O0FBRWpZOztBQUVBO0FBQ0E7O0FBRUEsYUFBYSwwR0FBRyxDQUFDLGdVQUFPOzs7O0FBSXhCLGlFQUFlLHVVQUFjLE1BQU0iLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9TaWRlQmFyLnZ1ZT80NDIwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9jbG9uZWRSdWxlU2V0LTEyLnVzZVsxXSEuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMTIudXNlWzJdIS4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvaW5kZXguanM/P3J1bGVTZXRbMF0udXNlWzBdIS4vU2lkZUJhci52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0wYWE3MTJjZSZsYW5nPWNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/SideBar.vue?vue&type=style&index=0&id=0aa712ce&lang=css\n");

/***/ }),

/***/ "./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/TopBar.vue?vue&type=style&index=0&id=3e41eeb1&scoped=true&lang=css":
/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/TopBar.vue?vue&type=style&index=0&id=3e41eeb1&scoped=true&lang=css ***!
  \****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_TopBar_vue_vue_type_style_index_0_id_3e41eeb1_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !!../../../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./TopBar.vue?vue&type=style&index=0&id=3e41eeb1&scoped=true&lang=css */ \"./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/TopBar.vue?vue&type=style&index=0&id=3e41eeb1&scoped=true&lang=css\");\n\n            \n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_TopBar_vue_vue_type_style_index_0_id_3e41eeb1_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"], options);\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_TopBar_vue_vue_type_style_index_0_id_3e41eeb1_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].locals || {});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMTIudXNlWzFdIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9zdHlsZVBvc3RMb2FkZXIuanMhLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMTIudXNlWzJdIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9pbmRleC5qcz8/cnVsZVNldFswXS51c2VbMF0hLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9Ub3BCYXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9M2U0MWVlYjEmc2NvcGVkPXRydWUmbGFuZz1jc3MuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFxRztBQUNyRyxZQUE0WTs7QUFFNVk7O0FBRUE7QUFDQTs7QUFFQSxhQUFhLDBHQUFHLENBQUMsMlVBQU87Ozs7QUFJeEIsaUVBQWUsa1ZBQWMsTUFBTSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvbmF2L1RvcEJhci52dWU/OTUyNiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0xMi51c2VbMV0hLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9jbG9uZWRSdWxlU2V0LTEyLnVzZVsyXSEuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2luZGV4LmpzPz9ydWxlU2V0WzBdLnVzZVswXSEuL1RvcEJhci52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0zZTQxZWViMSZzY29wZWQ9dHJ1ZSZsYW5nPWNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/TopBar.vue?vue&type=style&index=0&id=3e41eeb1&scoped=true&lang=css\n");

/***/ }),

/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js":
/*!****************************************************************************!*\
  !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***!
  \****************************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

"use strict";
eval("\n\nvar isOldIE = function isOldIE() {\n  var memo;\n  return function memorize() {\n    if (typeof memo === 'undefined') {\n      // Test for IE <= 9 as proposed by Browserhacks\n      // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n      // Tests for existence of standard globals is to allow style-loader\n      // to operate correctly into non-standard environments\n      // @see https://github.com/webpack-contrib/style-loader/issues/177\n      memo = Boolean(window && document && document.all && !window.atob);\n    }\n\n    return memo;\n  };\n}();\n\nvar getTarget = function getTarget() {\n  var memo = {};\n  return function memorize(target) {\n    if (typeof memo[target] === 'undefined') {\n      var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n      if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n        try {\n          // This will throw an exception if access to iframe is blocked\n          // due to cross-origin restrictions\n          styleTarget = styleTarget.contentDocument.head;\n        } catch (e) {\n          // istanbul ignore next\n          styleTarget = null;\n        }\n      }\n\n      memo[target] = styleTarget;\n    }\n\n    return memo[target];\n  };\n}();\n\nvar stylesInDom = [];\n\nfunction getIndexByIdentifier(identifier) {\n  var result = -1;\n\n  for (var i = 0; i < stylesInDom.length; i++) {\n    if (stylesInDom[i].identifier === identifier) {\n      result = i;\n      break;\n    }\n  }\n\n  return result;\n}\n\nfunction modulesToDom(list, options) {\n  var idCountMap = {};\n  var identifiers = [];\n\n  for (var i = 0; i < list.length; i++) {\n    var item = list[i];\n    var id = options.base ? item[0] + options.base : item[0];\n    var count = idCountMap[id] || 0;\n    var identifier = \"\".concat(id, \" \").concat(count);\n    idCountMap[id] = count + 1;\n    var index = getIndexByIdentifier(identifier);\n    var obj = {\n      css: item[1],\n      media: item[2],\n      sourceMap: item[3]\n    };\n\n    if (index !== -1) {\n      stylesInDom[index].references++;\n      stylesInDom[index].updater(obj);\n    } else {\n      stylesInDom.push({\n        identifier: identifier,\n        updater: addStyle(obj, options),\n        references: 1\n      });\n    }\n\n    identifiers.push(identifier);\n  }\n\n  return identifiers;\n}\n\nfunction insertStyleElement(options) {\n  var style = document.createElement('style');\n  var attributes = options.attributes || {};\n\n  if (typeof attributes.nonce === 'undefined') {\n    var nonce =  true ? __webpack_require__.nc : 0;\n\n    if (nonce) {\n      attributes.nonce = nonce;\n    }\n  }\n\n  Object.keys(attributes).forEach(function (key) {\n    style.setAttribute(key, attributes[key]);\n  });\n\n  if (typeof options.insert === 'function') {\n    options.insert(style);\n  } else {\n    var target = getTarget(options.insert || 'head');\n\n    if (!target) {\n      throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n    }\n\n    target.appendChild(style);\n  }\n\n  return style;\n}\n\nfunction removeStyleElement(style) {\n  // istanbul ignore if\n  if (style.parentNode === null) {\n    return false;\n  }\n\n  style.parentNode.removeChild(style);\n}\n/* istanbul ignore next  */\n\n\nvar replaceText = function replaceText() {\n  var textStore = [];\n  return function replace(index, replacement) {\n    textStore[index] = replacement;\n    return textStore.filter(Boolean).join('\\n');\n  };\n}();\n\nfunction applyToSingletonTag(style, index, remove, obj) {\n  var css = remove ? '' : obj.media ? \"@media \".concat(obj.media, \" {\").concat(obj.css, \"}\") : obj.css; // For old IE\n\n  /* istanbul ignore if  */\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = replaceText(index, css);\n  } else {\n    var cssNode = document.createTextNode(css);\n    var childNodes = style.childNodes;\n\n    if (childNodes[index]) {\n      style.removeChild(childNodes[index]);\n    }\n\n    if (childNodes.length) {\n      style.insertBefore(cssNode, childNodes[index]);\n    } else {\n      style.appendChild(cssNode);\n    }\n  }\n}\n\nfunction applyToTag(style, options, obj) {\n  var css = obj.css;\n  var media = obj.media;\n  var sourceMap = obj.sourceMap;\n\n  if (media) {\n    style.setAttribute('media', media);\n  } else {\n    style.removeAttribute('media');\n  }\n\n  if (sourceMap && typeof btoa !== 'undefined') {\n    css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n  } // For old IE\n\n  /* istanbul ignore if  */\n\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = css;\n  } else {\n    while (style.firstChild) {\n      style.removeChild(style.firstChild);\n    }\n\n    style.appendChild(document.createTextNode(css));\n  }\n}\n\nvar singleton = null;\nvar singletonCounter = 0;\n\nfunction addStyle(obj, options) {\n  var style;\n  var update;\n  var remove;\n\n  if (options.singleton) {\n    var styleIndex = singletonCounter++;\n    style = singleton || (singleton = insertStyleElement(options));\n    update = applyToSingletonTag.bind(null, style, styleIndex, false);\n    remove = applyToSingletonTag.bind(null, style, styleIndex, true);\n  } else {\n    style = insertStyleElement(options);\n    update = applyToTag.bind(null, style, options);\n\n    remove = function remove() {\n      removeStyleElement(style);\n    };\n  }\n\n  update(obj);\n  return function updateStyle(newObj) {\n    if (newObj) {\n      if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {\n        return;\n      }\n\n      update(obj = newObj);\n    } else {\n      remove();\n    }\n  };\n}\n\nmodule.exports = function (list, options) {\n  options = options || {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n  // tags it will allow on a page\n\n  if (!options.singleton && typeof options.singleton !== 'boolean') {\n    options.singleton = isOldIE();\n  }\n\n  list = list || [];\n  var lastIdentifiers = modulesToDom(list, options);\n  return function update(newList) {\n    newList = newList || [];\n\n    if (Object.prototype.toString.call(newList) !== '[object Array]') {\n      return;\n    }\n\n    for (var i = 0; i < lastIdentifiers.length; i++) {\n      var identifier = lastIdentifiers[i];\n      var index = getIndexByIdentifier(identifier);\n      stylesInDom[index].references--;\n    }\n\n    var newLastIdentifiers = modulesToDom(newList, options);\n\n    for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n      var _identifier = lastIdentifiers[_i];\n\n      var _index = getIndexByIdentifier(_identifier);\n\n      if (stylesInDom[_index].references === 0) {\n        stylesInDom[_index].updater();\n\n        stylesInDom.splice(_index, 1);\n      }\n    }\n\n    lastIdentifiers = newLastIdentifiers;\n  };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDs7QUFFeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7O0FBRUEsa0JBQWtCLHdCQUF3QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQixLQUF3QyxHQUFHLHNCQUFpQixHQUFHLENBQUk7O0FBRW5GO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBLHFFQUFxRSxxQkFBcUIsY0FBYzs7QUFFeEc7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBLHlEQUF5RDtBQUN6RCxJQUFJOztBQUVKOzs7QUFHQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLDRCQUE0QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxxQkFBcUIsNkJBQTZCO0FBQ2xEOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcz9kYmQ5Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgaXNPbGRJRSA9IGZ1bmN0aW9uIGlzT2xkSUUoKSB7XG4gIHZhciBtZW1vO1xuICByZXR1cm4gZnVuY3Rpb24gbWVtb3JpemUoKSB7XG4gICAgaWYgKHR5cGVvZiBtZW1vID09PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gVGVzdCBmb3IgSUUgPD0gOSBhcyBwcm9wb3NlZCBieSBCcm93c2VyaGFja3NcbiAgICAgIC8vIEBzZWUgaHR0cDovL2Jyb3dzZXJoYWNrcy5jb20vI2hhY2stZTcxZDg2OTJmNjUzMzQxNzNmZWU3MTVjMjIyY2I4MDVcbiAgICAgIC8vIFRlc3RzIGZvciBleGlzdGVuY2Ugb2Ygc3RhbmRhcmQgZ2xvYmFscyBpcyB0byBhbGxvdyBzdHlsZS1sb2FkZXJcbiAgICAgIC8vIHRvIG9wZXJhdGUgY29ycmVjdGx5IGludG8gbm9uLXN0YW5kYXJkIGVudmlyb25tZW50c1xuICAgICAgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay1jb250cmliL3N0eWxlLWxvYWRlci9pc3N1ZXMvMTc3XG4gICAgICBtZW1vID0gQm9vbGVhbih3aW5kb3cgJiYgZG9jdW1lbnQgJiYgZG9jdW1lbnQuYWxsICYmICF3aW5kb3cuYXRvYik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbW87XG4gIH07XG59KCk7XG5cbnZhciBnZXRUYXJnZXQgPSBmdW5jdGlvbiBnZXRUYXJnZXQoKSB7XG4gIHZhciBtZW1vID0ge307XG4gIHJldHVybiBmdW5jdGlvbiBtZW1vcml6ZSh0YXJnZXQpIHtcbiAgICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTsgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcblxuICAgICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYWNjZXNzIHRvIGlmcmFtZSBpcyBibG9ja2VkXG4gICAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWVtb1t0YXJnZXRdID0gc3R5bGVUYXJnZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbW9bdGFyZ2V0XTtcbiAgfTtcbn0oKTtcblxudmFyIHN0eWxlc0luRG9tID0gW107XG5cbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzSW5Eb20ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3R5bGVzSW5Eb21baV0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgcmVzdWx0ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcbiAgICB2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcbiAgICB2YXIgY291bnQgPSBpZENvdW50TWFwW2lkXSB8fCAwO1xuICAgIHZhciBpZGVudGlmaWVyID0gXCJcIi5jb25jYXQoaWQsIFwiIFwiKS5jb25jYXQoY291bnQpO1xuICAgIGlkQ291bnRNYXBbaWRdID0gY291bnQgKyAxO1xuICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjc3M6IGl0ZW1bMV0sXG4gICAgICBtZWRpYTogaXRlbVsyXSxcbiAgICAgIHNvdXJjZU1hcDogaXRlbVszXVxuICAgIH07XG5cbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRvbVtpbmRleF0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5Eb21baW5kZXhdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGVzSW5Eb20ucHVzaCh7XG4gICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAgIHVwZGF0ZXI6IGFkZFN0eWxlKG9iaiwgb3B0aW9ucyksXG4gICAgICAgIHJlZmVyZW5jZXM6IDFcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cblxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gIHZhciBhdHRyaWJ1dGVzID0gb3B0aW9ucy5hdHRyaWJ1dGVzIHx8IHt9O1xuXG4gIGlmICh0eXBlb2YgYXR0cmlidXRlcy5ub25jZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09ICd1bmRlZmluZWQnID8gX193ZWJwYWNrX25vbmNlX18gOiBudWxsO1xuXG4gICAgaWYgKG5vbmNlKSB7XG4gICAgICBhdHRyaWJ1dGVzLm5vbmNlID0gbm9uY2U7XG4gICAgfVxuICB9XG5cbiAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgc3R5bGUuc2V0QXR0cmlidXRlKGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgfSk7XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmluc2VydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9wdGlvbnMuaW5zZXJ0KHN0eWxlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KG9wdGlvbnMuaW5zZXJ0IHx8ICdoZWFkJyk7XG5cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgICB9XG5cbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICB9XG5cbiAgcmV0dXJuIHN0eWxlO1xufVxuXG5mdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGUpIHtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gIGlmIChzdHlsZS5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3R5bGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZSk7XG59XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cblxuXG52YXIgcmVwbGFjZVRleHQgPSBmdW5jdGlvbiByZXBsYWNlVGV4dCgpIHtcbiAgdmFyIHRleHRTdG9yZSA9IFtdO1xuICByZXR1cm4gZnVuY3Rpb24gcmVwbGFjZShpbmRleCwgcmVwbGFjZW1lbnQpIHtcbiAgICB0ZXh0U3RvcmVbaW5kZXhdID0gcmVwbGFjZW1lbnQ7XG4gICAgcmV0dXJuIHRleHRTdG9yZS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJyk7XG4gIH07XG59KCk7XG5cbmZ1bmN0aW9uIGFwcGx5VG9TaW5nbGV0b25UYWcoc3R5bGUsIGluZGV4LCByZW1vdmUsIG9iaikge1xuICB2YXIgY3NzID0gcmVtb3ZlID8gJycgOiBvYmoubWVkaWEgPyBcIkBtZWRpYSBcIi5jb25jYXQob2JqLm1lZGlhLCBcIiB7XCIpLmNvbmNhdChvYmouY3NzLCBcIn1cIikgOiBvYmouY3NzOyAvLyBGb3Igb2xkIElFXG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuXG4gIGlmIChzdHlsZS5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gcmVwbGFjZVRleHQoaW5kZXgsIGNzcyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpO1xuICAgIHZhciBjaGlsZE5vZGVzID0gc3R5bGUuY2hpbGROb2RlcztcblxuICAgIGlmIChjaGlsZE5vZGVzW2luZGV4XSkge1xuICAgICAgc3R5bGUucmVtb3ZlQ2hpbGQoY2hpbGROb2Rlc1tpbmRleF0pO1xuICAgIH1cblxuICAgIGlmIChjaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgc3R5bGUuaW5zZXJ0QmVmb3JlKGNzc05vZGUsIGNoaWxkTm9kZXNbaW5kZXhdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoY3NzTm9kZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5VG9UYWcoc3R5bGUsIG9wdGlvbnMsIG9iaikge1xuICB2YXIgY3NzID0gb2JqLmNzcztcbiAgdmFyIG1lZGlhID0gb2JqLm1lZGlhO1xuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcblxuICBpZiAobWVkaWEpIHtcbiAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoJ21lZGlhJywgbWVkaWEpO1xuICB9IGVsc2Uge1xuICAgIHN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgnbWVkaWEnKTtcbiAgfVxuXG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSwgXCIgKi9cIik7XG4gIH0gLy8gRm9yIG9sZCBJRVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cblxuXG4gIGlmIChzdHlsZS5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZS5maXJzdENoaWxkKSB7XG4gICAgICBzdHlsZS5yZW1vdmVDaGlsZChzdHlsZS5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgfVxufVxuXG52YXIgc2luZ2xldG9uID0gbnVsbDtcbnZhciBzaW5nbGV0b25Db3VudGVyID0gMDtcblxuZnVuY3Rpb24gYWRkU3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBzdHlsZTtcbiAgdmFyIHVwZGF0ZTtcbiAgdmFyIHJlbW92ZTtcblxuICBpZiAob3B0aW9ucy5zaW5nbGV0b24pIHtcbiAgICB2YXIgc3R5bGVJbmRleCA9IHNpbmdsZXRvbkNvdW50ZXIrKztcbiAgICBzdHlsZSA9IHNpbmdsZXRvbiB8fCAoc2luZ2xldG9uID0gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpKTtcbiAgICB1cGRhdGUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGUsIHN0eWxlSW5kZXgsIGZhbHNlKTtcbiAgICByZW1vdmUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGUsIHN0eWxlSW5kZXgsIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIHN0eWxlID0gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICAgIHVwZGF0ZSA9IGFwcGx5VG9UYWcuYmluZChudWxsLCBzdHlsZSwgb3B0aW9ucyk7XG5cbiAgICByZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGUpO1xuICAgIH07XG4gIH1cblxuICB1cGRhdGUob2JqKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZVN0eWxlKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUob2JqID0gbmV3T2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlKCk7XG4gICAgfVxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChsaXN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OyAvLyBGb3JjZSBzaW5nbGUtdGFnIHNvbHV0aW9uIG9uIElFNi05LCB3aGljaCBoYXMgYSBoYXJkIGxpbWl0IG9uIHRoZSAjIG9mIDxzdHlsZT5cbiAgLy8gdGFncyBpdCB3aWxsIGFsbG93IG9uIGEgcGFnZVxuXG4gIGlmICghb3B0aW9ucy5zaW5nbGV0b24gJiYgdHlwZW9mIG9wdGlvbnMuc2luZ2xldG9uICE9PSAnYm9vbGVhbicpIHtcbiAgICBvcHRpb25zLnNpbmdsZXRvbiA9IGlzT2xkSUUoKTtcbiAgfVxuXG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3TGlzdCkgIT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRG9tW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuXG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2lkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbX2ldO1xuXG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuXG4gICAgICBpZiAoc3R5bGVzSW5Eb21bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRG9tW19pbmRleF0udXBkYXRlcigpO1xuXG4gICAgICAgIHN0eWxlc0luRG9tLnNwbGljZShfaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\n");

/***/ }),

/***/ "./node_modules/vee-validate/dist/vee-validate.esm.js":
/*!************************************************************!*\
  !*** ./node_modules/vee-validate/dist/vee-validate.esm.js ***!
  \************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"ErrorMessage\": () => (/* binding */ ErrorMessage),\n/* harmony export */   \"Field\": () => (/* binding */ Field),\n/* harmony export */   \"FieldArray\": () => (/* binding */ FieldArray),\n/* harmony export */   \"FieldContextKey\": () => (/* binding */ FieldContextKey),\n/* harmony export */   \"Form\": () => (/* binding */ Form),\n/* harmony export */   \"FormContextKey\": () => (/* binding */ FormContextKey),\n/* harmony export */   \"IS_ABSENT\": () => (/* binding */ IS_ABSENT),\n/* harmony export */   \"configure\": () => (/* binding */ configure),\n/* harmony export */   \"defineRule\": () => (/* binding */ defineRule),\n/* harmony export */   \"useField\": () => (/* binding */ useField),\n/* harmony export */   \"useFieldArray\": () => (/* binding */ useFieldArray),\n/* harmony export */   \"useFieldError\": () => (/* binding */ useFieldError),\n/* harmony export */   \"useFieldValue\": () => (/* binding */ useFieldValue),\n/* harmony export */   \"useForm\": () => (/* binding */ useForm),\n/* harmony export */   \"useFormErrors\": () => (/* binding */ useFormErrors),\n/* harmony export */   \"useFormValues\": () => (/* binding */ useFormValues),\n/* harmony export */   \"useIsFieldDirty\": () => (/* binding */ useIsFieldDirty),\n/* harmony export */   \"useIsFieldTouched\": () => (/* binding */ useIsFieldTouched),\n/* harmony export */   \"useIsFieldValid\": () => (/* binding */ useIsFieldValid),\n/* harmony export */   \"useIsFormDirty\": () => (/* binding */ useIsFormDirty),\n/* harmony export */   \"useIsFormTouched\": () => (/* binding */ useIsFormTouched),\n/* harmony export */   \"useIsFormValid\": () => (/* binding */ useIsFormValid),\n/* harmony export */   \"useIsSubmitting\": () => (/* binding */ useIsSubmitting),\n/* harmony export */   \"useResetForm\": () => (/* binding */ useResetForm),\n/* harmony export */   \"useSubmitCount\": () => (/* binding */ useSubmitCount),\n/* harmony export */   \"useSubmitForm\": () => (/* binding */ useSubmitForm),\n/* harmony export */   \"useValidateField\": () => (/* binding */ useValidateField),\n/* harmony export */   \"useValidateForm\": () => (/* binding */ useValidateForm),\n/* harmony export */   \"validate\": () => (/* binding */ validate),\n/* harmony export */   \"validateObject\": () => (/* binding */ validateObjectSchema)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n/* harmony import */ var _vue_devtools_api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/devtools-api */ \"./node_modules/@vue/devtools-api/lib/esm/index.js\");\n/**\n  * vee-validate v4.8.4\n  * (c) 2023 Abdelrahman Awad\n  * @license MIT\n  */\n\n\n\nfunction isCallable(fn) {\n    return typeof fn === 'function';\n}\nfunction isNullOrUndefined(value) {\n    return value === null || value === undefined;\n}\nconst isObject = (obj) => obj !== null && !!obj && typeof obj === 'object' && !Array.isArray(obj);\nfunction isIndex(value) {\n    return Number(value) >= 0;\n}\nfunction toNumber(value) {\n    const n = parseFloat(value);\n    return isNaN(n) ? value : n;\n}\n\nconst RULES = {};\n/**\n * Adds a custom validator to the list of validation rules.\n */\nfunction defineRule(id, validator) {\n    // makes sure new rules are properly formatted.\n    guardExtend(id, validator);\n    RULES[id] = validator;\n}\n/**\n * Gets an already defined rule\n */\nfunction resolveRule(id) {\n    return RULES[id];\n}\n/**\n * Guards from extension violations.\n */\nfunction guardExtend(id, validator) {\n    if (isCallable(validator)) {\n        return;\n    }\n    throw new Error(`Extension Error: The validator '${id}' must be a function.`);\n}\n\nconst FormContextKey = Symbol('vee-validate-form');\nconst FieldContextKey = Symbol('vee-validate-field-instance');\nconst IS_ABSENT = Symbol('Default empty value');\n\nconst isClient = typeof window !== 'undefined';\nfunction isLocator(value) {\n    return isCallable(value) && !!value.__locatorRef;\n}\nfunction isTypedSchema(value) {\n    return !!value && isCallable(value.parse) && value.__type === 'VVTypedSchema';\n}\nfunction isYupValidator(value) {\n    return !!value && isCallable(value.validate);\n}\nfunction hasCheckedAttr(type) {\n    return type === 'checkbox' || type === 'radio';\n}\nfunction isContainerValue(value) {\n    return isObject(value) || Array.isArray(value);\n}\n/**\n * True if the value is an empty object or array\n */\nfunction isEmptyContainer(value) {\n    if (Array.isArray(value)) {\n        return value.length === 0;\n    }\n    return isObject(value) && Object.keys(value).length === 0;\n}\n/**\n * Checks if the path opted out of nested fields using `[fieldName]` syntax\n */\nfunction isNotNestedPath(path) {\n    return /^\\[.+\\]$/i.test(path);\n}\n/**\n * Checks if an element is a native HTML5 multi-select input element\n */\nfunction isNativeMultiSelect(el) {\n    return isNativeSelect(el) && el.multiple;\n}\n/**\n * Checks if an element is a native HTML5 select input element\n */\nfunction isNativeSelect(el) {\n    return el.tagName === 'SELECT';\n}\n/**\n * Checks if a tag name with attrs object will render a native multi-select element\n */\nfunction isNativeMultiSelectNode(tag, attrs) {\n    // The falsy value array is the values that Vue won't add the `multiple` prop if it has one of these values\n    const hasTruthyBindingValue = ![false, null, undefined, 0].includes(attrs.multiple) && !Number.isNaN(attrs.multiple);\n    return tag === 'select' && 'multiple' in attrs && hasTruthyBindingValue;\n}\n/**\n * Checks if a node should have a `:value` binding or not\n *\n * These nodes should not have a value binding\n * For files, because they are not reactive\n * For multi-selects because the value binding will reset the value\n */\nfunction shouldHaveValueBinding(tag, attrs) {\n    return !isNativeMultiSelectNode(tag, attrs) && attrs.type !== 'file' && !hasCheckedAttr(attrs.type);\n}\nfunction isFormSubmitEvent(evt) {\n    return isEvent(evt) && evt.target && 'submit' in evt.target;\n}\nfunction isEvent(evt) {\n    if (!evt) {\n        return false;\n    }\n    if (typeof Event !== 'undefined' && isCallable(Event) && evt instanceof Event) {\n        return true;\n    }\n    // this is for IE and Cypress #3161\n    /* istanbul ignore next */\n    if (evt && evt.srcElement) {\n        return true;\n    }\n    return false;\n}\nfunction isPropPresent(obj, prop) {\n    return prop in obj && obj[prop] !== IS_ABSENT;\n}\n/**\n * Compares if two values are the same borrowed from:\n * https://github.com/epoberezkin/fast-deep-equal\n * We added a case for file matching since `Object.keys` doesn't work with Files.\n * */\nfunction isEqual(a, b) {\n    if (a === b)\n        return true;\n    if (a && b && typeof a === 'object' && typeof b === 'object') {\n        if (a.constructor !== b.constructor)\n            return false;\n        // eslint-disable-next-line no-var\n        var length, i, keys;\n        if (Array.isArray(a)) {\n            length = a.length;\n            // eslint-disable-next-line eqeqeq\n            if (length != b.length)\n                return false;\n            for (i = length; i-- !== 0;)\n                if (!isEqual(a[i], b[i]))\n                    return false;\n            return true;\n        }\n        if (a instanceof Map && b instanceof Map) {\n            if (a.size !== b.size)\n                return false;\n            for (i of a.entries())\n                if (!b.has(i[0]))\n                    return false;\n            for (i of a.entries())\n                if (!isEqual(i[1], b.get(i[0])))\n                    return false;\n            return true;\n        }\n        // We added this part for file comparison, arguably a little naive but should work for most cases.\n        // #3911\n        if (isFile(a) && isFile(b)) {\n            if (a.size !== b.size)\n                return false;\n            if (a.name !== b.name)\n                return false;\n            if (a.lastModified !== b.lastModified)\n                return false;\n            if (a.type !== b.type)\n                return false;\n            return true;\n        }\n        if (a instanceof Set && b instanceof Set) {\n            if (a.size !== b.size)\n                return false;\n            for (i of a.entries())\n                if (!b.has(i[0]))\n                    return false;\n            return true;\n        }\n        if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n            length = a.length;\n            // eslint-disable-next-line eqeqeq\n            if (length != b.length)\n                return false;\n            for (i = length; i-- !== 0;)\n                if (a[i] !== b[i])\n                    return false;\n            return true;\n        }\n        if (a.constructor === RegExp)\n            return a.source === b.source && a.flags === b.flags;\n        if (a.valueOf !== Object.prototype.valueOf)\n            return a.valueOf() === b.valueOf();\n        if (a.toString !== Object.prototype.toString)\n            return a.toString() === b.toString();\n        keys = Object.keys(a);\n        length = keys.length;\n        if (length !== Object.keys(b).length)\n            return false;\n        for (i = length; i-- !== 0;)\n            if (!Object.prototype.hasOwnProperty.call(b, keys[i]))\n                return false;\n        for (i = length; i-- !== 0;) {\n            // eslint-disable-next-line no-var\n            var key = keys[i];\n            if (!isEqual(a[key], b[key]))\n                return false;\n        }\n        return true;\n    }\n    // true if both NaN, false otherwise\n    // eslint-disable-next-line no-self-compare\n    return a !== a && b !== b;\n}\nfunction isFile(a) {\n    if (!isClient) {\n        return false;\n    }\n    return a instanceof File;\n}\n\nfunction set(obj, key, val) {\n\tif (typeof val.value === 'object') val.value = klona(val.value);\n\tif (!val.enumerable || val.get || val.set || !val.configurable || !val.writable || key === '__proto__') {\n\t\tObject.defineProperty(obj, key, val);\n\t} else obj[key] = val.value;\n}\n\nfunction klona(x) {\n\tif (typeof x !== 'object') return x;\n\n\tvar i=0, k, list, tmp, str=Object.prototype.toString.call(x);\n\n\tif (str === '[object Object]') {\n\t\ttmp = Object.create(x.__proto__ || null);\n\t} else if (str === '[object Array]') {\n\t\ttmp = Array(x.length);\n\t} else if (str === '[object Set]') {\n\t\ttmp = new Set;\n\t\tx.forEach(function (val) {\n\t\t\ttmp.add(klona(val));\n\t\t});\n\t} else if (str === '[object Map]') {\n\t\ttmp = new Map;\n\t\tx.forEach(function (val, key) {\n\t\t\ttmp.set(klona(key), klona(val));\n\t\t});\n\t} else if (str === '[object Date]') {\n\t\ttmp = new Date(+x);\n\t} else if (str === '[object RegExp]') {\n\t\ttmp = new RegExp(x.source, x.flags);\n\t} else if (str === '[object DataView]') {\n\t\ttmp = new x.constructor( klona(x.buffer) );\n\t} else if (str === '[object ArrayBuffer]') {\n\t\ttmp = x.slice(0);\n\t} else if (str.slice(-6) === 'Array]') {\n\t\t// ArrayBuffer.isView(x)\n\t\t// ~> `new` bcuz `Buffer.slice` => ref\n\t\ttmp = new x.constructor(x);\n\t}\n\n\tif (tmp) {\n\t\tfor (list=Object.getOwnPropertySymbols(x); i < list.length; i++) {\n\t\t\tset(tmp, list[i], Object.getOwnPropertyDescriptor(x, list[i]));\n\t\t}\n\n\t\tfor (i=0, list=Object.getOwnPropertyNames(x); i < list.length; i++) {\n\t\t\tif (Object.hasOwnProperty.call(tmp, k=list[i]) && tmp[k] === x[k]) continue;\n\t\t\tset(tmp, k, Object.getOwnPropertyDescriptor(x, k));\n\t\t}\n\t}\n\n\treturn tmp || x;\n}\n\nfunction cleanupNonNestedPath(path) {\n    if (isNotNestedPath(path)) {\n        return path.replace(/\\[|\\]/gi, '');\n    }\n    return path;\n}\nfunction getFromPath(object, path, fallback) {\n    if (!object) {\n        return fallback;\n    }\n    if (isNotNestedPath(path)) {\n        return object[cleanupNonNestedPath(path)];\n    }\n    const resolvedValue = (path || '')\n        .split(/\\.|\\[(\\d+)\\]/)\n        .filter(Boolean)\n        .reduce((acc, propKey) => {\n        if (isContainerValue(acc) && propKey in acc) {\n            return acc[propKey];\n        }\n        return fallback;\n    }, object);\n    return resolvedValue;\n}\n/**\n * Sets a nested property value in a path, creates the path properties if it doesn't exist\n */\nfunction setInPath(object, path, value) {\n    if (isNotNestedPath(path)) {\n        object[cleanupNonNestedPath(path)] = value;\n        return;\n    }\n    const keys = path.split(/\\.|\\[(\\d+)\\]/).filter(Boolean);\n    let acc = object;\n    for (let i = 0; i < keys.length; i++) {\n        // Last key, set it\n        if (i === keys.length - 1) {\n            acc[keys[i]] = value;\n            return;\n        }\n        // Key does not exist, create a container for it\n        if (!(keys[i] in acc) || isNullOrUndefined(acc[keys[i]])) {\n            // container can be either an object or an array depending on the next key if it exists\n            acc[keys[i]] = isIndex(keys[i + 1]) ? [] : {};\n        }\n        acc = acc[keys[i]];\n    }\n}\nfunction unset(object, key) {\n    if (Array.isArray(object) && isIndex(key)) {\n        object.splice(Number(key), 1);\n        return;\n    }\n    if (isObject(object)) {\n        delete object[key];\n    }\n}\n/**\n * Removes a nested property from object\n */\nfunction unsetPath(object, path) {\n    if (isNotNestedPath(path)) {\n        delete object[cleanupNonNestedPath(path)];\n        return;\n    }\n    const keys = path.split(/\\.|\\[(\\d+)\\]/).filter(Boolean);\n    let acc = object;\n    for (let i = 0; i < keys.length; i++) {\n        // Last key, unset it\n        if (i === keys.length - 1) {\n            unset(acc, keys[i]);\n            break;\n        }\n        // Key does not exist, exit\n        if (!(keys[i] in acc) || isNullOrUndefined(acc[keys[i]])) {\n            break;\n        }\n        acc = acc[keys[i]];\n    }\n    const pathValues = keys.map((_, idx) => {\n        return getFromPath(object, keys.slice(0, idx).join('.'));\n    });\n    for (let i = pathValues.length - 1; i >= 0; i--) {\n        if (!isEmptyContainer(pathValues[i])) {\n            continue;\n        }\n        if (i === 0) {\n            unset(object, keys[0]);\n            continue;\n        }\n        unset(pathValues[i - 1], keys[i - 1]);\n    }\n}\n/**\n * A typed version of Object.keys\n */\nfunction keysOf(record) {\n    return Object.keys(record);\n}\n// Uses same component provide as its own injections\n// Due to changes in https://github.com/vuejs/vue-next/pull/2424\nfunction injectWithSelf(symbol, def = undefined) {\n    const vm = (0,vue__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)();\n    return (vm === null || vm === void 0 ? void 0 : vm.provides[symbol]) || (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(symbol, def);\n}\nfunction warn(message) {\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.warn)(`[vee-validate]: ${message}`);\n}\n/**\n * Ensures we deal with a singular field value\n */\nfunction normalizeField(field) {\n    if (Array.isArray(field)) {\n        return field[0];\n    }\n    return field;\n}\nfunction resolveNextCheckboxValue(currentValue, checkedValue, uncheckedValue) {\n    if (Array.isArray(currentValue)) {\n        const newVal = [...currentValue];\n        // Use isEqual since checked object values can possibly fail the equality check #3883\n        const idx = newVal.findIndex(v => isEqual(v, checkedValue));\n        idx >= 0 ? newVal.splice(idx, 1) : newVal.push(checkedValue);\n        return newVal;\n    }\n    return isEqual(currentValue, checkedValue) ? uncheckedValue : checkedValue;\n}\n/**\n * Creates a throttled function that only invokes the provided function (`func`) at most once per within a given number of milliseconds\n * (`limit`)\n */\nfunction throttle(func, limit) {\n    let inThrottle;\n    let lastResult;\n    return function (...args) {\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        const context = this;\n        if (!inThrottle) {\n            inThrottle = true;\n            setTimeout(() => (inThrottle = false), limit);\n            lastResult = func.apply(context, args);\n        }\n        return lastResult;\n    };\n}\nfunction debounceAsync(inner, ms = 0) {\n    let timer = null;\n    let resolves = [];\n    return function (...args) {\n        // Run the function after a certain amount of time\n        if (timer) {\n            window.clearTimeout(timer);\n        }\n        timer = window.setTimeout(() => {\n            // Get the result of the inner function, then apply it to the resolve function of\n            // each promise that has been created since the last time the inner function was run\n            const result = inner(...args);\n            resolves.forEach(r => r(result));\n            resolves = [];\n        }, ms);\n        return new Promise(resolve => resolves.push(resolve));\n    };\n}\nfunction applyModelModifiers(value, modifiers) {\n    if (!isObject(modifiers)) {\n        return value;\n    }\n    if (modifiers.number) {\n        return toNumber(value);\n    }\n    return value;\n}\nfunction withLatest(fn, onDone) {\n    let latestRun;\n    return async function runLatest(...args) {\n        const pending = fn(...args);\n        latestRun = pending;\n        const result = await pending;\n        if (pending !== latestRun) {\n            return result;\n        }\n        latestRun = undefined;\n        onDone(result, args);\n        return result;\n    };\n}\nfunction computedDeep({ get, set }) {\n    const baseRef = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(klona(get()));\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(get, newValue => {\n        if (isEqual(newValue, baseRef.value)) {\n            return;\n        }\n        baseRef.value = klona(newValue);\n    }, {\n        deep: true,\n    });\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(baseRef, newValue => {\n        if (isEqual(newValue, get())) {\n            return;\n        }\n        set(klona(newValue));\n    }, {\n        deep: true,\n    });\n    return baseRef;\n}\nfunction unravel(value) {\n    if (isCallable(value)) {\n        return value();\n    }\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(value);\n}\nfunction lazyToRef(value) {\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => unravel(value));\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst normalizeChildren = (tag, context, slotProps) => {\n    if (!context.slots.default) {\n        return context.slots.default;\n    }\n    if (typeof tag === 'string' || !tag) {\n        return context.slots.default(slotProps());\n    }\n    return {\n        default: () => { var _a, _b; return (_b = (_a = context.slots).default) === null || _b === void 0 ? void 0 : _b.call(_a, slotProps()); },\n    };\n};\n/**\n * Vue adds a `_value` prop at the moment on the input elements to store the REAL value on them, real values are different than the `value` attribute\n * as they do not get casted to strings unlike `el.value` which preserves user-code behavior\n */\nfunction getBoundValue(el) {\n    if (hasValueBinding(el)) {\n        return el._value;\n    }\n    return undefined;\n}\n/**\n * Vue adds a `_value` prop at the moment on the input elements to store the REAL value on them, real values are different than the `value` attribute\n * as they do not get casted to strings unlike `el.value` which preserves user-code behavior\n */\nfunction hasValueBinding(el) {\n    return '_value' in el;\n}\n\nfunction normalizeEventValue(value) {\n    if (!isEvent(value)) {\n        return value;\n    }\n    const input = value.target;\n    // Vue sets the current bound value on `_value` prop\n    // for checkboxes it it should fetch the value binding type as is (boolean instead of string)\n    if (hasCheckedAttr(input.type) && hasValueBinding(input)) {\n        return getBoundValue(input);\n    }\n    if (input.type === 'file' && input.files) {\n        const files = Array.from(input.files);\n        return input.multiple ? files : files[0];\n    }\n    if (isNativeMultiSelect(input)) {\n        return Array.from(input.options)\n            .filter(opt => opt.selected && !opt.disabled)\n            .map(getBoundValue);\n    }\n    // makes sure we get the actual `option` bound value\n    // #3440\n    if (isNativeSelect(input)) {\n        const selectedOption = Array.from(input.options).find(opt => opt.selected);\n        return selectedOption ? getBoundValue(selectedOption) : input.value;\n    }\n    return input.value;\n}\n\n/**\n * Normalizes the given rules expression.\n */\nfunction normalizeRules(rules) {\n    const acc = {};\n    Object.defineProperty(acc, '_$$isNormalized', {\n        value: true,\n        writable: false,\n        enumerable: false,\n        configurable: false,\n    });\n    if (!rules) {\n        return acc;\n    }\n    // Object is already normalized, skip.\n    if (isObject(rules) && rules._$$isNormalized) {\n        return rules;\n    }\n    if (isObject(rules)) {\n        return Object.keys(rules).reduce((prev, curr) => {\n            const params = normalizeParams(rules[curr]);\n            if (rules[curr] !== false) {\n                prev[curr] = buildParams(params);\n            }\n            return prev;\n        }, acc);\n    }\n    /* istanbul ignore if */\n    if (typeof rules !== 'string') {\n        return acc;\n    }\n    return rules.split('|').reduce((prev, rule) => {\n        const parsedRule = parseRule(rule);\n        if (!parsedRule.name) {\n            return prev;\n        }\n        prev[parsedRule.name] = buildParams(parsedRule.params);\n        return prev;\n    }, acc);\n}\n/**\n * Normalizes a rule param.\n */\nfunction normalizeParams(params) {\n    if (params === true) {\n        return [];\n    }\n    if (Array.isArray(params)) {\n        return params;\n    }\n    if (isObject(params)) {\n        return params;\n    }\n    return [params];\n}\nfunction buildParams(provided) {\n    const mapValueToLocator = (value) => {\n        // A target param using interpolation\n        if (typeof value === 'string' && value[0] === '@') {\n            return createLocator(value.slice(1));\n        }\n        return value;\n    };\n    if (Array.isArray(provided)) {\n        return provided.map(mapValueToLocator);\n    }\n    // #3073\n    if (provided instanceof RegExp) {\n        return [provided];\n    }\n    return Object.keys(provided).reduce((prev, key) => {\n        prev[key] = mapValueToLocator(provided[key]);\n        return prev;\n    }, {});\n}\n/**\n * Parses a rule string expression.\n */\nconst parseRule = (rule) => {\n    let params = [];\n    const name = rule.split(':')[0];\n    if (rule.includes(':')) {\n        params = rule.split(':').slice(1).join(':').split(',');\n    }\n    return { name, params };\n};\nfunction createLocator(value) {\n    const locator = (crossTable) => {\n        const val = getFromPath(crossTable, value) || crossTable[value];\n        return val;\n    };\n    locator.__locatorRef = value;\n    return locator;\n}\nfunction extractLocators(params) {\n    if (Array.isArray(params)) {\n        return params.filter(isLocator);\n    }\n    return keysOf(params)\n        .filter(key => isLocator(params[key]))\n        .map(key => params[key]);\n}\n\nconst DEFAULT_CONFIG = {\n    generateMessage: ({ field }) => `${field} is not valid.`,\n    bails: true,\n    validateOnBlur: true,\n    validateOnChange: true,\n    validateOnInput: false,\n    validateOnModelUpdate: true,\n};\nlet currentConfig = Object.assign({}, DEFAULT_CONFIG);\nconst getConfig = () => currentConfig;\nconst setConfig = (newConf) => {\n    currentConfig = Object.assign(Object.assign({}, currentConfig), newConf);\n};\nconst configure = setConfig;\n\n/**\n * Validates a value against the rules.\n */\nasync function validate(value, rules, options = {}) {\n    const shouldBail = options === null || options === void 0 ? void 0 : options.bails;\n    const field = {\n        name: (options === null || options === void 0 ? void 0 : options.name) || '{field}',\n        rules,\n        label: options === null || options === void 0 ? void 0 : options.label,\n        bails: shouldBail !== null && shouldBail !== void 0 ? shouldBail : true,\n        formData: (options === null || options === void 0 ? void 0 : options.values) || {},\n    };\n    const result = await _validate(field, value);\n    const errors = result.errors;\n    return {\n        errors,\n        valid: !errors.length,\n    };\n}\n/**\n * Starts the validation process.\n */\nasync function _validate(field, value) {\n    if (isTypedSchema(field.rules) || isYupValidator(field.rules)) {\n        return validateFieldWithTypedSchema(value, field.rules);\n    }\n    // if a generic function or chain of generic functions\n    if (isCallable(field.rules) || Array.isArray(field.rules)) {\n        const ctx = {\n            field: field.label || field.name,\n            name: field.name,\n            label: field.label,\n            form: field.formData,\n            value,\n        };\n        // Normalize the pipeline\n        const pipeline = Array.isArray(field.rules) ? field.rules : [field.rules];\n        const length = pipeline.length;\n        const errors = [];\n        for (let i = 0; i < length; i++) {\n            const rule = pipeline[i];\n            const result = await rule(value, ctx);\n            const isValid = typeof result !== 'string' && result;\n            if (isValid) {\n                continue;\n            }\n            const message = typeof result === 'string' ? result : _generateFieldError(ctx);\n            errors.push(message);\n            if (field.bails) {\n                return {\n                    errors,\n                };\n            }\n        }\n        return {\n            errors,\n        };\n    }\n    const normalizedContext = Object.assign(Object.assign({}, field), { rules: normalizeRules(field.rules) });\n    const errors = [];\n    const rulesKeys = Object.keys(normalizedContext.rules);\n    const length = rulesKeys.length;\n    for (let i = 0; i < length; i++) {\n        const rule = rulesKeys[i];\n        const result = await _test(normalizedContext, value, {\n            name: rule,\n            params: normalizedContext.rules[rule],\n        });\n        if (result.error) {\n            errors.push(result.error);\n            if (field.bails) {\n                return {\n                    errors,\n                };\n            }\n        }\n    }\n    return {\n        errors,\n    };\n}\nfunction isYupError(err) {\n    return !!err && err.name === 'ValidationError';\n}\nfunction yupToTypedSchema(yupSchema) {\n    const schema = {\n        __type: 'VVTypedSchema',\n        async parse(values) {\n            var _a;\n            try {\n                const output = await yupSchema.validate(values, { abortEarly: false });\n                return {\n                    output,\n                    errors: [],\n                };\n            }\n            catch (err) {\n                // Yup errors have a name prop one them.\n                // https://github.com/jquense/yup#validationerrorerrors-string--arraystring-value-any-path-string\n                if (!isYupError(err)) {\n                    throw err;\n                }\n                if (!((_a = err.inner) === null || _a === void 0 ? void 0 : _a.length) && err.errors.length) {\n                    return { errors: [{ path: err.path, errors: err.errors }] };\n                }\n                const errors = err.inner.reduce((acc, curr) => {\n                    const path = curr.path || '';\n                    if (!acc[path]) {\n                        acc[path] = { errors: [], path };\n                    }\n                    acc[path].errors.push(...curr.errors);\n                    return acc;\n                }, {});\n                return { errors: Object.values(errors) };\n            }\n        },\n    };\n    return schema;\n}\n/**\n * Handles yup validation\n */\nasync function validateFieldWithTypedSchema(value, schema) {\n    const typedSchema = isTypedSchema(schema) ? schema : yupToTypedSchema(schema);\n    const result = await typedSchema.parse(value);\n    const messages = [];\n    for (const error of result.errors) {\n        if (error.errors.length) {\n            messages.push(...error.errors);\n        }\n    }\n    return {\n        errors: messages,\n    };\n}\n/**\n * Tests a single input value against a rule.\n */\nasync function _test(field, value, rule) {\n    const validator = resolveRule(rule.name);\n    if (!validator) {\n        throw new Error(`No such validator '${rule.name}' exists.`);\n    }\n    const params = fillTargetValues(rule.params, field.formData);\n    const ctx = {\n        field: field.label || field.name,\n        name: field.name,\n        label: field.label,\n        value,\n        form: field.formData,\n        rule: Object.assign(Object.assign({}, rule), { params }),\n    };\n    const result = await validator(value, params, ctx);\n    if (typeof result === 'string') {\n        return {\n            error: result,\n        };\n    }\n    return {\n        error: result ? undefined : _generateFieldError(ctx),\n    };\n}\n/**\n * Generates error messages.\n */\nfunction _generateFieldError(fieldCtx) {\n    const message = getConfig().generateMessage;\n    if (!message) {\n        return 'Field is invalid';\n    }\n    return message(fieldCtx);\n}\nfunction fillTargetValues(params, crossTable) {\n    const normalize = (value) => {\n        if (isLocator(value)) {\n            return value(crossTable);\n        }\n        return value;\n    };\n    if (Array.isArray(params)) {\n        return params.map(normalize);\n    }\n    return Object.keys(params).reduce((acc, param) => {\n        acc[param] = normalize(params[param]);\n        return acc;\n    }, {});\n}\nasync function validateTypedSchema(schema, values) {\n    const typedSchema = isTypedSchema(schema) ? schema : yupToTypedSchema(schema);\n    const validationResult = await typedSchema.parse(values);\n    const results = {};\n    const errors = {};\n    for (const error of validationResult.errors) {\n        const messages = error.errors;\n        // Fixes issue with path mapping with Yup 1.0 including quotes around array indices\n        const path = (error.path || '').replace(/\\[\"(\\d+)\"\\]/g, (_, m) => {\n            return `[${m}]`;\n        });\n        results[path] = { valid: !messages.length, errors: messages };\n        if (messages.length) {\n            errors[path] = messages[0];\n        }\n    }\n    return {\n        valid: !validationResult.errors.length,\n        results,\n        errors,\n        values: validationResult.value,\n    };\n}\nasync function validateObjectSchema(schema, values, opts) {\n    const paths = keysOf(schema);\n    const validations = paths.map(async (path) => {\n        var _a, _b, _c;\n        const strings = (_a = opts === null || opts === void 0 ? void 0 : opts.names) === null || _a === void 0 ? void 0 : _a[path];\n        const fieldResult = await validate(getFromPath(values, path), schema[path], {\n            name: (strings === null || strings === void 0 ? void 0 : strings.name) || path,\n            label: strings === null || strings === void 0 ? void 0 : strings.label,\n            values: values,\n            bails: (_c = (_b = opts === null || opts === void 0 ? void 0 : opts.bailsMap) === null || _b === void 0 ? void 0 : _b[path]) !== null && _c !== void 0 ? _c : true,\n        });\n        return Object.assign(Object.assign({}, fieldResult), { path });\n    });\n    let isAllValid = true;\n    const validationResults = await Promise.all(validations);\n    const results = {};\n    const errors = {};\n    for (const result of validationResults) {\n        results[result.path] = {\n            valid: result.valid,\n            errors: result.errors,\n        };\n        if (!result.valid) {\n            isAllValid = false;\n            errors[result.path] = result.errors[0];\n        }\n    }\n    return {\n        valid: isAllValid,\n        results,\n        errors,\n    };\n}\n\nlet ID_COUNTER = 0;\nfunction useFieldState(path, init) {\n    const { value, initialValue, setInitialValue } = _useFieldValue(path, init.modelValue, init.form);\n    const { errorMessage, errors, setErrors } = _useFieldErrors(path, init.form);\n    const meta = _useFieldMeta(value, initialValue, errors);\n    const id = ID_COUNTER >= Number.MAX_SAFE_INTEGER ? 0 : ++ID_COUNTER;\n    function setState(state) {\n        var _a;\n        if ('value' in state) {\n            value.value = state.value;\n        }\n        if ('errors' in state) {\n            setErrors(state.errors);\n        }\n        if ('touched' in state) {\n            meta.touched = (_a = state.touched) !== null && _a !== void 0 ? _a : meta.touched;\n        }\n        if ('initialValue' in state) {\n            setInitialValue(state.initialValue);\n        }\n    }\n    return {\n        id,\n        path,\n        value,\n        initialValue,\n        meta,\n        errors,\n        errorMessage,\n        setState,\n    };\n}\n/**\n * Creates the field value and resolves the initial value\n */\nfunction _useFieldValue(path, modelValue, form) {\n    const modelRef = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)((0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(modelValue));\n    function resolveInitialValue() {\n        if (!form) {\n            return (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(modelRef);\n        }\n        return getFromPath(form.meta.value.initialValues, (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path), (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(modelRef));\n    }\n    function setInitialValue(value) {\n        if (!form) {\n            modelRef.value = value;\n            return;\n        }\n        form.stageInitialValue((0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path), value, true);\n    }\n    const initialValue = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(resolveInitialValue);\n    // if no form is associated, use a regular ref.\n    if (!form) {\n        const value = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(resolveInitialValue());\n        return {\n            value,\n            initialValue,\n            setInitialValue,\n        };\n    }\n    // to set the initial value, first check if there is a current value, if there is then use it.\n    // otherwise use the configured initial value if it exists.\n    // prioritize model value over form values\n    // #3429\n    const currentValue = modelValue ? (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(modelValue) : getFromPath(form.values, (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path), (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(initialValue));\n    form.stageInitialValue((0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path), currentValue, true);\n    // otherwise use a computed setter that triggers the `setFieldValue`\n    const value = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)({\n        get() {\n            return getFromPath(form.values, (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path));\n        },\n        set(newVal) {\n            form.setFieldValue((0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path), newVal);\n        },\n    });\n    return {\n        value,\n        initialValue,\n        setInitialValue,\n    };\n}\n/**\n * Creates meta flags state and some associated effects with them\n */\nfunction _useFieldMeta(currentValue, initialValue, errors) {\n    const meta = (0,vue__WEBPACK_IMPORTED_MODULE_0__.reactive)({\n        touched: false,\n        pending: false,\n        valid: true,\n        validated: !!(0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(errors).length,\n        initialValue: (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(initialValue)),\n        dirty: (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n            return !isEqual((0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(currentValue), (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(initialValue));\n        }),\n    });\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(errors, value => {\n        meta.valid = !value.length;\n    }, {\n        immediate: true,\n        flush: 'sync',\n    });\n    return meta;\n}\n/**\n * Creates the error message state for the field state\n */\nfunction _useFieldErrors(path, form) {\n    function normalizeErrors(messages) {\n        if (!messages) {\n            return [];\n        }\n        return Array.isArray(messages) ? messages : [messages];\n    }\n    if (!form) {\n        const errors = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)([]);\n        return {\n            errors,\n            errorMessage: (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => errors.value[0]),\n            setErrors: (messages) => {\n                errors.value = normalizeErrors(messages);\n            },\n        };\n    }\n    const errors = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => form.errorBag.value[(0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path)] || []);\n    return {\n        errors,\n        errorMessage: (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => errors.value[0]),\n        setErrors: (messages) => {\n            form.setFieldErrorBag((0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path), normalizeErrors(messages));\n        },\n    };\n}\n\nfunction installDevtoolsPlugin(app) {\n    if ((true)) {\n        (0,_vue_devtools_api__WEBPACK_IMPORTED_MODULE_1__.setupDevtoolsPlugin)({\n            id: 'vee-validate-devtools-plugin',\n            label: 'VeeValidate Plugin',\n            packageName: 'vee-validate',\n            homepage: 'https://vee-validate.logaretm.com/v4',\n            app,\n            logo: 'https://vee-validate.logaretm.com/v4/logo.png',\n        }, setupApiHooks);\n    }\n}\nconst DEVTOOLS_FORMS = {};\nconst DEVTOOLS_FIELDS = {};\nlet API;\nconst refreshInspector = throttle(() => {\n    setTimeout(async () => {\n        await (0,vue__WEBPACK_IMPORTED_MODULE_0__.nextTick)();\n        API === null || API === void 0 ? void 0 : API.sendInspectorState(INSPECTOR_ID);\n        API === null || API === void 0 ? void 0 : API.sendInspectorTree(INSPECTOR_ID);\n    }, 100);\n}, 100);\nfunction registerFormWithDevTools(form) {\n    const vm = (0,vue__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)();\n    if (!API) {\n        const app = vm === null || vm === void 0 ? void 0 : vm.appContext.app;\n        if (!app) {\n            return;\n        }\n        installDevtoolsPlugin(app);\n    }\n    DEVTOOLS_FORMS[form.formId] = Object.assign({}, form);\n    DEVTOOLS_FORMS[form.formId]._vm = vm;\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.onUnmounted)(() => {\n        delete DEVTOOLS_FORMS[form.formId];\n        refreshInspector();\n    });\n    refreshInspector();\n}\nfunction registerSingleFieldWithDevtools(field) {\n    const vm = (0,vue__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)();\n    if (!API) {\n        const app = vm === null || vm === void 0 ? void 0 : vm.appContext.app;\n        if (!app) {\n            return;\n        }\n        installDevtoolsPlugin(app);\n    }\n    DEVTOOLS_FIELDS[field.id] = Object.assign({}, field);\n    DEVTOOLS_FIELDS[field.id]._vm = vm;\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.onUnmounted)(() => {\n        delete DEVTOOLS_FIELDS[field.id];\n        refreshInspector();\n    });\n    refreshInspector();\n}\nconst INSPECTOR_ID = 'vee-validate-inspector';\nconst COLORS = {\n    error: 0xbd4b4b,\n    success: 0x06d77b,\n    unknown: 0x54436b,\n    white: 0xffffff,\n    black: 0x000000,\n    blue: 0x035397,\n    purple: 0xb980f0,\n    orange: 0xf5a962,\n    gray: 0xbbbfca,\n};\nlet SELECTED_NODE = null;\nfunction setupApiHooks(api) {\n    API = api;\n    api.addInspector({\n        id: INSPECTOR_ID,\n        icon: 'rule',\n        label: 'vee-validate',\n        noSelectionText: 'Select a vee-validate node to inspect',\n        actions: [\n            {\n                icon: 'done_outline',\n                tooltip: 'Validate selected item',\n                action: async () => {\n                    if (!SELECTED_NODE) {\n                        console.error('There is not a valid selected vee-validate node or component');\n                        return;\n                    }\n                    await SELECTED_NODE.validate();\n                },\n            },\n            {\n                icon: 'delete_sweep',\n                tooltip: 'Clear validation state of the selected item',\n                action: () => {\n                    if (!SELECTED_NODE) {\n                        console.error('There is not a valid selected vee-validate node or component');\n                        return;\n                    }\n                    if ('id' in SELECTED_NODE) {\n                        SELECTED_NODE.resetField();\n                        return;\n                    }\n                    SELECTED_NODE.resetForm();\n                },\n            },\n        ],\n    });\n    api.on.getInspectorTree(payload => {\n        if (payload.inspectorId !== INSPECTOR_ID) {\n            return;\n        }\n        const forms = Object.values(DEVTOOLS_FORMS);\n        const fields = Object.values(DEVTOOLS_FIELDS);\n        payload.rootNodes = [\n            ...forms.map(mapFormForDevtoolsInspector),\n            ...fields.map(field => mapFieldForDevtoolsInspector(field)),\n        ];\n    });\n    api.on.getInspectorState((payload, ctx) => {\n        if (payload.inspectorId !== INSPECTOR_ID || ctx.currentTab !== `custom-inspector:${INSPECTOR_ID}`) {\n            return;\n        }\n        const { form, field, type } = decodeNodeId(payload.nodeId);\n        if (form && type === 'form') {\n            payload.state = buildFormState(form);\n            SELECTED_NODE = form;\n            return;\n        }\n        if (field && type === 'field') {\n            payload.state = buildFieldState(field);\n            SELECTED_NODE = field;\n            return;\n        }\n        SELECTED_NODE = null;\n    });\n}\nfunction mapFormForDevtoolsInspector(form) {\n    const { textColor, bgColor } = getTagTheme(form);\n    const formTreeNodes = {};\n    Object.values(form.fieldsByPath.value).forEach(field => {\n        const fieldInstance = Array.isArray(field) ? field[0] : field;\n        if (!fieldInstance) {\n            return;\n        }\n        setInPath(formTreeNodes, (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(fieldInstance.name), mapFieldForDevtoolsInspector(fieldInstance, form));\n    });\n    function buildFormTree(tree, path = []) {\n        const key = [...path].pop();\n        if ('id' in tree) {\n            return Object.assign(Object.assign({}, tree), { label: key || tree.label });\n        }\n        if (isObject(tree)) {\n            return {\n                id: `${path.join('.')}`,\n                label: key || '',\n                children: Object.keys(tree).map(key => buildFormTree(tree[key], [...path, key])),\n            };\n        }\n        if (Array.isArray(tree)) {\n            return {\n                id: `${path.join('.')}`,\n                label: `${key}[]`,\n                children: tree.map((c, idx) => buildFormTree(c, [...path, String(idx)])),\n            };\n        }\n        return { id: '', label: '', children: [] };\n    }\n    const { children } = buildFormTree(formTreeNodes);\n    return {\n        id: encodeNodeId(form),\n        label: 'Form',\n        children,\n        tags: [\n            {\n                label: 'Form',\n                textColor,\n                backgroundColor: bgColor,\n            },\n            {\n                label: `${Object.keys(form.fieldsByPath.value).length} fields`,\n                textColor: COLORS.white,\n                backgroundColor: COLORS.unknown,\n            },\n        ],\n    };\n}\nfunction mapFieldForDevtoolsInspector(field, form) {\n    const fieldInstance = normalizeField(field);\n    const { textColor, bgColor } = getTagTheme(fieldInstance);\n    const isGroup = Array.isArray(field) && field.length > 1;\n    return {\n        id: encodeNodeId(form, fieldInstance, !isGroup),\n        label: (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(fieldInstance.name),\n        children: Array.isArray(field) ? field.map(fieldItem => mapFieldForDevtoolsInspector(fieldItem, form)) : undefined,\n        tags: [\n            isGroup\n                ? undefined\n                : {\n                    label: 'Field',\n                    textColor,\n                    backgroundColor: bgColor,\n                },\n            !form\n                ? {\n                    label: 'Standalone',\n                    textColor: COLORS.black,\n                    backgroundColor: COLORS.gray,\n                }\n                : undefined,\n            !isGroup && fieldInstance.type === 'checkbox'\n                ? {\n                    label: 'Checkbox',\n                    textColor: COLORS.white,\n                    backgroundColor: COLORS.blue,\n                }\n                : undefined,\n            !isGroup && fieldInstance.type === 'radio'\n                ? {\n                    label: 'Radio',\n                    textColor: COLORS.white,\n                    backgroundColor: COLORS.purple,\n                }\n                : undefined,\n            isGroup\n                ? {\n                    label: 'Group',\n                    textColor: COLORS.black,\n                    backgroundColor: COLORS.orange,\n                }\n                : undefined,\n        ].filter(Boolean),\n    };\n}\nfunction encodeNodeId(form, field, encodeIndex = true) {\n    const fieldPath = form ? (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(field === null || field === void 0 ? void 0 : field.name) : field === null || field === void 0 ? void 0 : field.id;\n    const fieldGroup = fieldPath ? form === null || form === void 0 ? void 0 : form.fieldsByPath.value[fieldPath] : undefined;\n    let idx;\n    if (encodeIndex && field && Array.isArray(fieldGroup)) {\n        idx = fieldGroup.indexOf(field);\n    }\n    const idObject = { f: form === null || form === void 0 ? void 0 : form.formId, ff: fieldPath, idx, type: field ? 'field' : 'form' };\n    return btoa(JSON.stringify(idObject));\n}\nfunction decodeNodeId(nodeId) {\n    try {\n        const idObject = JSON.parse(atob(nodeId));\n        const form = DEVTOOLS_FORMS[idObject.f];\n        if (!form && idObject.ff) {\n            const field = DEVTOOLS_FIELDS[idObject.ff];\n            if (!field) {\n                return {};\n            }\n            return {\n                type: idObject.type,\n                field,\n            };\n        }\n        if (!form) {\n            return {};\n        }\n        const fieldGroup = form.fieldsByPath.value[idObject.ff];\n        return {\n            type: idObject.type,\n            form,\n            field: Array.isArray(fieldGroup) ? fieldGroup[idObject.idx || 0] : fieldGroup,\n        };\n    }\n    catch (err) {\n        // console.error(`Devtools: [vee-validate] Failed to parse node id ${nodeId}`);\n    }\n    return {};\n}\nfunction buildFieldState(field) {\n    const { errors, meta, value } = field;\n    return {\n        'Field state': [\n            { key: 'errors', value: errors.value },\n            {\n                key: 'initialValue',\n                value: meta.initialValue,\n            },\n            {\n                key: 'currentValue',\n                value: value.value,\n            },\n            {\n                key: 'touched',\n                value: meta.touched,\n            },\n            {\n                key: 'dirty',\n                value: meta.dirty,\n            },\n            {\n                key: 'valid',\n                value: meta.valid,\n            },\n        ],\n    };\n}\nfunction buildFormState(form) {\n    const { errorBag, meta, values, isSubmitting, submitCount } = form;\n    return {\n        'Form state': [\n            {\n                key: 'submitCount',\n                value: submitCount.value,\n            },\n            {\n                key: 'isSubmitting',\n                value: isSubmitting.value,\n            },\n            {\n                key: 'touched',\n                value: meta.value.touched,\n            },\n            {\n                key: 'dirty',\n                value: meta.value.dirty,\n            },\n            {\n                key: 'valid',\n                value: meta.value.valid,\n            },\n            {\n                key: 'initialValues',\n                value: meta.value.initialValues,\n            },\n            {\n                key: 'currentValues',\n                value: values,\n            },\n            {\n                key: 'errors',\n                value: keysOf(errorBag.value).reduce((acc, key) => {\n                    var _a;\n                    const message = (_a = errorBag.value[key]) === null || _a === void 0 ? void 0 : _a[0];\n                    if (message) {\n                        acc[key] = message;\n                    }\n                    return acc;\n                }, {}),\n            },\n        ],\n    };\n}\n/**\n * Resolves the tag color based on the form state\n */\nfunction getTagTheme(fieldOrForm) {\n    // const fallbackColors = {\n    //   bgColor: COLORS.unknown,\n    //   textColor: COLORS.white,\n    // };\n    const isValid = 'id' in fieldOrForm ? fieldOrForm.meta.valid : fieldOrForm.meta.value.valid;\n    return {\n        bgColor: isValid ? COLORS.success : COLORS.error,\n        textColor: isValid ? COLORS.black : COLORS.white,\n    };\n}\n\n/**\n * Creates a field composite.\n */\nfunction useField(path, rules, opts) {\n    if (hasCheckedAttr(opts === null || opts === void 0 ? void 0 : opts.type)) {\n        return useCheckboxField(path, rules, opts);\n    }\n    return _useField(path, rules, opts);\n}\nfunction _useField(path, rules, opts) {\n    const { initialValue: modelValue, validateOnMount, bails, type, checkedValue, label, validateOnValueUpdate, uncheckedValue, controlled, keepValueOnUnmount, modelPropName, syncVModel, form: controlForm, } = normalizeOptions(opts);\n    const injectedForm = controlled ? injectWithSelf(FormContextKey) : undefined;\n    const form = controlForm || injectedForm;\n    const name = lazyToRef(path);\n    // a flag indicating if the field is about to be removed/unmounted.\n    let markedForRemoval = false;\n    const { id, value, initialValue, meta, setState, errors, errorMessage } = useFieldState(name, {\n        modelValue,\n        form,\n    });\n    if (syncVModel) {\n        useVModel({ value, prop: modelPropName, handleChange });\n    }\n    /**\n     * Handles common onBlur meta update\n     */\n    const handleBlur = () => {\n        meta.touched = true;\n    };\n    const normalizedRules = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        let rulesValue = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(rules);\n        const schema = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(form === null || form === void 0 ? void 0 : form.schema);\n        if (schema && !isYupValidator(schema) && !isTypedSchema(schema)) {\n            rulesValue = extractRuleFromSchema(schema, (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(name)) || rulesValue;\n        }\n        if (isYupValidator(rulesValue) ||\n            isTypedSchema(rulesValue) ||\n            isCallable(rulesValue) ||\n            Array.isArray(rulesValue)) {\n            return rulesValue;\n        }\n        return normalizeRules(rulesValue);\n    });\n    async function validateCurrentValue(mode) {\n        var _a, _b;\n        if (form === null || form === void 0 ? void 0 : form.validateSchema) {\n            return (_a = (await form.validateSchema(mode)).results[(0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(name)]) !== null && _a !== void 0 ? _a : { valid: true, errors: [] };\n        }\n        return validate(value.value, normalizedRules.value, {\n            name: (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(name),\n            label: (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(label),\n            values: (_b = form === null || form === void 0 ? void 0 : form.values) !== null && _b !== void 0 ? _b : {},\n            bails,\n        });\n    }\n    const validateWithStateMutation = withLatest(async () => {\n        meta.pending = true;\n        meta.validated = true;\n        return validateCurrentValue('validated-only');\n    }, result => {\n        if (markedForRemoval) {\n            result.valid = true;\n            result.errors = [];\n        }\n        setState({ errors: result.errors });\n        meta.pending = false;\n        return result;\n    });\n    const validateValidStateOnly = withLatest(async () => {\n        return validateCurrentValue('silent');\n    }, result => {\n        if (markedForRemoval) {\n            result.valid = true;\n        }\n        meta.valid = result.valid;\n        return result;\n    });\n    function validate$1(opts) {\n        if ((opts === null || opts === void 0 ? void 0 : opts.mode) === 'silent') {\n            return validateValidStateOnly();\n        }\n        return validateWithStateMutation();\n    }\n    // Common input/change event handler\n    function handleChange(e, shouldValidate = true) {\n        const newValue = normalizeEventValue(e);\n        value.value = newValue;\n        if (!validateOnValueUpdate && shouldValidate) {\n            validateWithStateMutation();\n        }\n    }\n    // Runs the initial validation\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.onMounted)(() => {\n        if (validateOnMount) {\n            return validateWithStateMutation();\n        }\n        // validate self initially if no form was handling this\n        // forms should have their own initial silent validation run to make things more efficient\n        if (!form || !form.validateSchema) {\n            validateValidStateOnly();\n        }\n    });\n    function setTouched(isTouched) {\n        meta.touched = isTouched;\n    }\n    let unwatchValue;\n    let lastWatchedValue = klona(value.value);\n    function watchValue() {\n        unwatchValue = (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(value, (val, oldVal) => {\n            if (isEqual(val, oldVal) && isEqual(val, lastWatchedValue)) {\n                return;\n            }\n            const validateFn = validateOnValueUpdate ? validateWithStateMutation : validateValidStateOnly;\n            validateFn();\n            lastWatchedValue = klona(val);\n        }, {\n            deep: true,\n        });\n    }\n    watchValue();\n    function resetField(state) {\n        var _a;\n        unwatchValue === null || unwatchValue === void 0 ? void 0 : unwatchValue();\n        const newValue = state && 'value' in state ? state.value : initialValue.value;\n        setState({\n            value: klona(newValue),\n            initialValue: klona(newValue),\n            touched: (_a = state === null || state === void 0 ? void 0 : state.touched) !== null && _a !== void 0 ? _a : false,\n            errors: (state === null || state === void 0 ? void 0 : state.errors) || [],\n        });\n        meta.pending = false;\n        meta.validated = false;\n        validateValidStateOnly();\n        // need to watch at next tick to avoid triggering the value watcher\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.nextTick)(() => {\n            watchValue();\n        });\n    }\n    function setValue(newValue) {\n        value.value = newValue;\n    }\n    function setErrors(errors) {\n        setState({ errors: Array.isArray(errors) ? errors : [errors] });\n    }\n    const field = {\n        id,\n        name,\n        label,\n        value,\n        meta,\n        errors,\n        errorMessage,\n        type,\n        checkedValue,\n        uncheckedValue,\n        bails,\n        keepValueOnUnmount,\n        resetField,\n        handleReset: () => resetField(),\n        validate: validate$1,\n        handleChange,\n        handleBlur,\n        setState,\n        setTouched,\n        setErrors,\n        setValue,\n    };\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)(FieldContextKey, field);\n    if ((0,vue__WEBPACK_IMPORTED_MODULE_0__.isRef)(rules) && typeof (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(rules) !== 'function') {\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(rules, (value, oldValue) => {\n            if (isEqual(value, oldValue)) {\n                return;\n            }\n            meta.validated ? validateWithStateMutation() : validateValidStateOnly();\n        }, {\n            deep: true,\n        });\n    }\n    if ((true)) {\n        field._vm = (0,vue__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)();\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(() => (Object.assign(Object.assign({ errors: errors.value }, meta), { value: value.value })), refreshInspector, {\n            deep: true,\n        });\n        if (!form) {\n            registerSingleFieldWithDevtools(field);\n        }\n    }\n    // if no associated form return the field API immediately\n    if (!form) {\n        return field;\n    }\n    // associate the field with the given form\n    form.register(field);\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.onBeforeUnmount)(() => {\n        markedForRemoval = true;\n        form.unregister(field);\n    });\n    // extract cross-field dependencies in a computed prop\n    const dependencies = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        const rulesVal = normalizedRules.value;\n        // is falsy, a function schema or a yup schema\n        if (!rulesVal ||\n            isCallable(rulesVal) ||\n            isYupValidator(rulesVal) ||\n            isTypedSchema(rulesVal) ||\n            Array.isArray(rulesVal)) {\n            return {};\n        }\n        return Object.keys(rulesVal).reduce((acc, rule) => {\n            const deps = extractLocators(rulesVal[rule])\n                .map((dep) => dep.__locatorRef)\n                .reduce((depAcc, depName) => {\n                const depValue = getFromPath(form.values, depName) || form.values[depName];\n                if (depValue !== undefined) {\n                    depAcc[depName] = depValue;\n                }\n                return depAcc;\n            }, {});\n            Object.assign(acc, deps);\n            return acc;\n        }, {});\n    });\n    // Adds a watcher that runs the validation whenever field dependencies change\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(dependencies, (deps, oldDeps) => {\n        // Skip if no dependencies or if the field wasn't manipulated\n        if (!Object.keys(deps).length) {\n            return;\n        }\n        const shouldValidate = !isEqual(deps, oldDeps);\n        if (shouldValidate) {\n            meta.validated ? validateWithStateMutation() : validateValidStateOnly();\n        }\n    });\n    return field;\n}\n/**\n * Normalizes partial field options to include the full options\n */\nfunction normalizeOptions(opts) {\n    var _a;\n    const defaults = () => ({\n        initialValue: undefined,\n        validateOnMount: false,\n        bails: true,\n        label: undefined,\n        validateOnValueUpdate: true,\n        keepValueOnUnmount: undefined,\n        modelPropName: 'modelValue',\n        syncVModel: true,\n        controlled: true,\n    });\n    const isVModelSynced = (_a = opts === null || opts === void 0 ? void 0 : opts.syncVModel) !== null && _a !== void 0 ? _a : true;\n    const initialValue = isVModelSynced && !('initialValue' in (opts || {}))\n        ? getCurrentModelValue((0,vue__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)(), (opts === null || opts === void 0 ? void 0 : opts.modelPropName) || 'modelValue')\n        : opts === null || opts === void 0 ? void 0 : opts.initialValue;\n    if (!opts) {\n        return Object.assign(Object.assign({}, defaults()), { initialValue });\n    }\n    // TODO: Deprecate this in next major release\n    const checkedValue = 'valueProp' in opts ? opts.valueProp : opts.checkedValue;\n    const controlled = 'standalone' in opts ? !opts.standalone : opts.controlled;\n    return Object.assign(Object.assign(Object.assign({}, defaults()), (opts || {})), { initialValue, controlled: controlled !== null && controlled !== void 0 ? controlled : true, checkedValue });\n}\n/**\n * Extracts the validation rules from a schema\n */\nfunction extractRuleFromSchema(schema, fieldName) {\n    // no schema at all\n    if (!schema) {\n        return undefined;\n    }\n    // there is a key on the schema object for this field\n    return schema[fieldName];\n}\nfunction useCheckboxField(name, rules, opts) {\n    const form = !(opts === null || opts === void 0 ? void 0 : opts.standalone) ? injectWithSelf(FormContextKey) : undefined;\n    const checkedValue = opts === null || opts === void 0 ? void 0 : opts.checkedValue;\n    const uncheckedValue = opts === null || opts === void 0 ? void 0 : opts.uncheckedValue;\n    function patchCheckboxApi(field) {\n        const handleChange = field.handleChange;\n        const checked = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n            const currentValue = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(field.value);\n            const checkedVal = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(checkedValue);\n            return Array.isArray(currentValue)\n                ? currentValue.findIndex(v => isEqual(v, checkedVal)) >= 0\n                : isEqual(checkedVal, currentValue);\n        });\n        function handleCheckboxChange(e, shouldValidate = true) {\n            var _a;\n            if (checked.value === ((_a = e === null || e === void 0 ? void 0 : e.target) === null || _a === void 0 ? void 0 : _a.checked)) {\n                if (shouldValidate) {\n                    field.validate();\n                }\n                return;\n            }\n            let newValue = normalizeEventValue(e);\n            // Single checkbox field without a form to toggle it's value\n            if (!form) {\n                newValue = resolveNextCheckboxValue((0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(field.value), (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(checkedValue), (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(uncheckedValue));\n            }\n            handleChange(newValue, shouldValidate);\n        }\n        return Object.assign(Object.assign({}, field), { checked,\n            checkedValue,\n            uncheckedValue, handleChange: handleCheckboxChange });\n    }\n    return patchCheckboxApi(_useField(name, rules, opts));\n}\nfunction useVModel({ prop, value, handleChange }) {\n    const vm = (0,vue__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)();\n    /* istanbul ignore next */\n    if (!vm) {\n        if ((true)) {\n            console.warn('Failed to setup model events because `useField` was not called in setup.');\n        }\n        return;\n    }\n    const propName = prop || 'modelValue';\n    const emitName = `update:${propName}`;\n    // Component doesn't have a model prop setup (must be defined on the props)\n    if (!(propName in vm.props)) {\n        return;\n    }\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(value, newValue => {\n        if (isEqual(newValue, getCurrentModelValue(vm, propName))) {\n            return;\n        }\n        vm.emit(emitName, newValue);\n    });\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(() => getCurrentModelValue(vm, propName), propValue => {\n        if (propValue === IS_ABSENT && value.value === undefined) {\n            return;\n        }\n        const newValue = propValue === IS_ABSENT ? undefined : propValue;\n        if (isEqual(newValue, applyModelModifiers(value.value, vm.props.modelModifiers))) {\n            return;\n        }\n        handleChange(newValue);\n    });\n}\nfunction getCurrentModelValue(vm, propName) {\n    if (!vm) {\n        return undefined;\n    }\n    return vm.props[propName];\n}\n\nconst FieldImpl = (0,vue__WEBPACK_IMPORTED_MODULE_0__.defineComponent)({\n    name: 'Field',\n    inheritAttrs: false,\n    props: {\n        as: {\n            type: [String, Object],\n            default: undefined,\n        },\n        name: {\n            type: String,\n            required: true,\n        },\n        rules: {\n            type: [Object, String, Function],\n            default: undefined,\n        },\n        validateOnMount: {\n            type: Boolean,\n            default: false,\n        },\n        validateOnBlur: {\n            type: Boolean,\n            default: undefined,\n        },\n        validateOnChange: {\n            type: Boolean,\n            default: undefined,\n        },\n        validateOnInput: {\n            type: Boolean,\n            default: undefined,\n        },\n        validateOnModelUpdate: {\n            type: Boolean,\n            default: undefined,\n        },\n        bails: {\n            type: Boolean,\n            default: () => getConfig().bails,\n        },\n        label: {\n            type: String,\n            default: undefined,\n        },\n        uncheckedValue: {\n            type: null,\n            default: undefined,\n        },\n        modelValue: {\n            type: null,\n            default: IS_ABSENT,\n        },\n        modelModifiers: {\n            type: null,\n            default: () => ({}),\n        },\n        'onUpdate:modelValue': {\n            type: null,\n            default: undefined,\n        },\n        standalone: {\n            type: Boolean,\n            default: false,\n        },\n        keepValue: {\n            type: Boolean,\n            default: undefined,\n        },\n    },\n    setup(props, ctx) {\n        const rules = (0,vue__WEBPACK_IMPORTED_MODULE_0__.toRef)(props, 'rules');\n        const name = (0,vue__WEBPACK_IMPORTED_MODULE_0__.toRef)(props, 'name');\n        const label = (0,vue__WEBPACK_IMPORTED_MODULE_0__.toRef)(props, 'label');\n        const uncheckedValue = (0,vue__WEBPACK_IMPORTED_MODULE_0__.toRef)(props, 'uncheckedValue');\n        const keepValue = (0,vue__WEBPACK_IMPORTED_MODULE_0__.toRef)(props, 'keepValue');\n        const { errors, value, errorMessage, validate: validateField, handleChange, handleBlur, setTouched, resetField, handleReset, meta, checked, setErrors, } = useField(name, rules, {\n            validateOnMount: props.validateOnMount,\n            bails: props.bails,\n            standalone: props.standalone,\n            type: ctx.attrs.type,\n            initialValue: resolveInitialValue(props, ctx),\n            // Only for checkboxes and radio buttons\n            checkedValue: ctx.attrs.value,\n            uncheckedValue,\n            label,\n            validateOnValueUpdate: false,\n            keepValueOnUnmount: keepValue,\n        });\n        // If there is a v-model applied on the component we need to emit the `update:modelValue` whenever the value binding changes\n        const onChangeHandler = function handleChangeWithModel(e, shouldValidate = true) {\n            handleChange(e, shouldValidate);\n            ctx.emit('update:modelValue', value.value);\n        };\n        const handleInput = (e) => {\n            if (!hasCheckedAttr(ctx.attrs.type)) {\n                value.value = normalizeEventValue(e);\n            }\n        };\n        const onInputHandler = function handleInputWithModel(e) {\n            handleInput(e);\n            ctx.emit('update:modelValue', value.value);\n        };\n        const fieldProps = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n            const { validateOnInput, validateOnChange, validateOnBlur, validateOnModelUpdate } = resolveValidationTriggers(props);\n            const baseOnBlur = [handleBlur, ctx.attrs.onBlur, validateOnBlur ? validateField : undefined].filter(Boolean);\n            const baseOnInput = [(e) => onChangeHandler(e, validateOnInput), ctx.attrs.onInput].filter(Boolean);\n            const baseOnChange = [(e) => onChangeHandler(e, validateOnChange), ctx.attrs.onChange].filter(Boolean);\n            const attrs = {\n                name: props.name,\n                onBlur: baseOnBlur,\n                onInput: baseOnInput,\n                onChange: baseOnChange,\n            };\n            attrs['onUpdate:modelValue'] = e => onChangeHandler(e, validateOnModelUpdate);\n            if (hasCheckedAttr(ctx.attrs.type) && checked) {\n                attrs.checked = checked.value;\n            }\n            const tag = resolveTag(props, ctx);\n            if (shouldHaveValueBinding(tag, ctx.attrs)) {\n                attrs.value = value.value;\n            }\n            return attrs;\n        });\n        function slotProps() {\n            return {\n                field: fieldProps.value,\n                value: value.value,\n                meta,\n                errors: errors.value,\n                errorMessage: errorMessage.value,\n                validate: validateField,\n                resetField,\n                handleChange: onChangeHandler,\n                handleInput: onInputHandler,\n                handleReset,\n                handleBlur,\n                setTouched,\n                setErrors,\n            };\n        }\n        ctx.expose({\n            setErrors,\n            setTouched,\n            reset: resetField,\n            validate: validateField,\n            handleChange,\n        });\n        return () => {\n            const tag = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent)(resolveTag(props, ctx));\n            const children = normalizeChildren(tag, ctx, slotProps);\n            if (tag) {\n                return (0,vue__WEBPACK_IMPORTED_MODULE_0__.h)(tag, Object.assign(Object.assign({}, ctx.attrs), fieldProps.value), children);\n            }\n            return children;\n        };\n    },\n});\nfunction resolveTag(props, ctx) {\n    let tag = props.as || '';\n    if (!props.as && !ctx.slots.default) {\n        tag = 'input';\n    }\n    return tag;\n}\nfunction resolveValidationTriggers(props) {\n    var _a, _b, _c, _d;\n    const { validateOnInput, validateOnChange, validateOnBlur, validateOnModelUpdate } = getConfig();\n    return {\n        validateOnInput: (_a = props.validateOnInput) !== null && _a !== void 0 ? _a : validateOnInput,\n        validateOnChange: (_b = props.validateOnChange) !== null && _b !== void 0 ? _b : validateOnChange,\n        validateOnBlur: (_c = props.validateOnBlur) !== null && _c !== void 0 ? _c : validateOnBlur,\n        validateOnModelUpdate: (_d = props.validateOnModelUpdate) !== null && _d !== void 0 ? _d : validateOnModelUpdate,\n    };\n}\nfunction resolveInitialValue(props, ctx) {\n    // Gets the initial value either from `value` prop/attr or `v-model` binding (modelValue)\n    // For checkboxes and radio buttons it will always be the model value not the `value` attribute\n    if (!hasCheckedAttr(ctx.attrs.type)) {\n        return isPropPresent(props, 'modelValue') ? props.modelValue : ctx.attrs.value;\n    }\n    return isPropPresent(props, 'modelValue') ? props.modelValue : undefined;\n}\nconst Field = FieldImpl;\n\nlet FORM_COUNTER = 0;\nfunction resolveInitialValues(opts) {\n    const providedValues = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(opts === null || opts === void 0 ? void 0 : opts.initialValues) || {};\n    const schema = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(opts === null || opts === void 0 ? void 0 : opts.validationSchema);\n    if (schema && isTypedSchema(schema) && isCallable(schema.cast)) {\n        return klona(schema.cast(providedValues) || {});\n    }\n    return klona(providedValues);\n}\nfunction useForm(opts) {\n    var _a;\n    const formId = FORM_COUNTER++;\n    const controlledModelPaths = new Set();\n    // Prevents fields from double resetting their values, which causes checkboxes to toggle their initial value\n    // TODO: This won't be needed if we centralize all the state inside the `form` for form inputs\n    let RESET_LOCK = false;\n    // A lookup containing fields or field groups\n    const fieldsByPath = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)({});\n    // If the form is currently submitting\n    const isSubmitting = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(false);\n    // The number of times the user tried to submit the form\n    const submitCount = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(0);\n    // field arrays managed by this form\n    const fieldArrays = [];\n    // a private ref for all form values\n    const formValues = (0,vue__WEBPACK_IMPORTED_MODULE_0__.reactive)(resolveInitialValues(opts));\n    // the source of errors for the form fields\n    const { errorBag, setErrorBag, setFieldErrorBag } = useErrorBag(opts === null || opts === void 0 ? void 0 : opts.initialErrors);\n    // Gets the first error of each field\n    const errors = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        return keysOf(errorBag.value).reduce((acc, key) => {\n            const bag = errorBag.value[key];\n            if (bag && bag.length) {\n                acc[key] = bag[0];\n            }\n            return acc;\n        }, {});\n    });\n    function getFirstFieldAtPath(path) {\n        const fieldOrGroup = fieldsByPath.value[path];\n        return Array.isArray(fieldOrGroup) ? fieldOrGroup[0] : fieldOrGroup;\n    }\n    function fieldExists(path) {\n        return !!fieldsByPath.value[path];\n    }\n    /**\n     * Holds a computed reference to all fields names and labels\n     */\n    const fieldNames = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        return keysOf(fieldsByPath.value).reduce((names, path) => {\n            const field = getFirstFieldAtPath(path);\n            if (field) {\n                names[path] = { name: (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(field.name) || '', label: (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(field.label) || '' };\n            }\n            return names;\n        }, {});\n    });\n    const fieldBailsMap = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        return keysOf(fieldsByPath.value).reduce((map, path) => {\n            var _a;\n            const field = getFirstFieldAtPath(path);\n            if (field) {\n                map[path] = (_a = field.bails) !== null && _a !== void 0 ? _a : true;\n            }\n            return map;\n        }, {});\n    });\n    // mutable non-reactive reference to initial errors\n    // we need this to process initial errors then unset them\n    const initialErrors = Object.assign({}, ((opts === null || opts === void 0 ? void 0 : opts.initialErrors) || {}));\n    const keepValuesOnUnmount = (_a = opts === null || opts === void 0 ? void 0 : opts.keepValuesOnUnmount) !== null && _a !== void 0 ? _a : false;\n    // initial form values\n    const { initialValues, originalInitialValues, setInitialValues } = useFormInitialValues(fieldsByPath, formValues, opts);\n    // form meta aggregations\n    const meta = useFormMeta(fieldsByPath, formValues, originalInitialValues, errors);\n    const controlledValues = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        return [...controlledModelPaths, ...keysOf(fieldsByPath.value)].reduce((acc, path) => {\n            const value = getFromPath(formValues, path);\n            setInPath(acc, path, value);\n            return acc;\n        }, {});\n    });\n    const schema = opts === null || opts === void 0 ? void 0 : opts.validationSchema;\n    /**\n     * Batches validation runs in 5ms batches\n     * Must have two distinct batch queues to make sure they don't override each other settings #3783\n     */\n    const debouncedSilentValidation = debounceAsync(_validateSchema, 5);\n    const debouncedValidation = debounceAsync(_validateSchema, 5);\n    const validateSchema = withLatest(async (mode) => {\n        return (await mode) === 'silent' ? debouncedSilentValidation() : debouncedValidation();\n    }, (formResult, [mode]) => {\n        // fields by id lookup\n        const fieldsById = formCtx.fieldsByPath.value || {};\n        // errors fields names, we need it to also check if custom errors are updated\n        const currentErrorsPaths = keysOf(formCtx.errorBag.value);\n        // collect all the keys from the schema and all fields\n        // this ensures we have a complete keymap of all the fields\n        const paths = [\n            ...new Set([...keysOf(formResult.results), ...keysOf(fieldsById), ...currentErrorsPaths]),\n        ];\n        // aggregates the paths into a single result object while applying the results on the fields\n        return paths.reduce((validation, path) => {\n            const field = fieldsById[path];\n            const messages = (formResult.results[path] || { errors: [] }).errors;\n            const fieldResult = {\n                errors: messages,\n                valid: !messages.length,\n            };\n            validation.results[path] = fieldResult;\n            if (!fieldResult.valid) {\n                validation.errors[path] = fieldResult.errors[0];\n            }\n            // field not rendered\n            if (!field) {\n                setFieldError(path, messages);\n                return validation;\n            }\n            // always update the valid flag regardless of the mode\n            applyFieldMutation(field, f => (f.meta.valid = fieldResult.valid));\n            if (mode === 'silent') {\n                return validation;\n            }\n            const wasValidated = Array.isArray(field) ? field.some(f => f.meta.validated) : field.meta.validated;\n            if (mode === 'validated-only' && !wasValidated) {\n                return validation;\n            }\n            applyFieldMutation(field, f => f.setState({ errors: fieldResult.errors }));\n            return validation;\n        }, { valid: formResult.valid, results: {}, errors: {} });\n    });\n    function makeSubmissionFactory(onlyControlled) {\n        return function submitHandlerFactory(fn, onValidationError) {\n            return function submissionHandler(e) {\n                if (e instanceof Event) {\n                    e.preventDefault();\n                    e.stopPropagation();\n                }\n                // Touch all fields\n                setTouched(keysOf(fieldsByPath.value).reduce((acc, field) => {\n                    acc[field] = true;\n                    return acc;\n                }, {}));\n                isSubmitting.value = true;\n                submitCount.value++;\n                return validate()\n                    .then(result => {\n                    const values = klona(formValues);\n                    if (result.valid && typeof fn === 'function') {\n                        const controlled = klona(controlledValues.value);\n                        let submittedValues = onlyControlled ? controlled : values;\n                        if (result.values) {\n                            submittedValues = result.values;\n                        }\n                        return fn(submittedValues, {\n                            evt: e,\n                            controlledValues: controlled,\n                            setErrors,\n                            setFieldError,\n                            setTouched,\n                            setFieldTouched,\n                            setValues,\n                            setFieldValue,\n                            resetForm,\n                            resetField,\n                        });\n                    }\n                    if (!result.valid && typeof onValidationError === 'function') {\n                        onValidationError({\n                            values,\n                            evt: e,\n                            errors: result.errors,\n                            results: result.results,\n                        });\n                    }\n                })\n                    .then(returnVal => {\n                    isSubmitting.value = false;\n                    return returnVal;\n                }, err => {\n                    isSubmitting.value = false;\n                    // re-throw the err so it doesn't go silent\n                    throw err;\n                });\n            };\n        };\n    }\n    const handleSubmitImpl = makeSubmissionFactory(false);\n    const handleSubmit = handleSubmitImpl;\n    handleSubmit.withControlled = makeSubmissionFactory(true);\n    const formCtx = {\n        formId,\n        fieldsByPath,\n        values: formValues,\n        controlledValues,\n        errorBag,\n        errors,\n        schema,\n        submitCount,\n        meta,\n        isSubmitting,\n        fieldArrays,\n        keepValuesOnUnmount,\n        validateSchema: (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(schema) ? validateSchema : undefined,\n        validate,\n        register: registerField,\n        unregister: unregisterField,\n        setFieldErrorBag,\n        validateField,\n        setFieldValue,\n        setValues,\n        setErrors,\n        setFieldError,\n        setFieldTouched,\n        setTouched,\n        resetForm,\n        resetField,\n        handleSubmit,\n        stageInitialValue,\n        unsetInitialValue,\n        setFieldInitialValue,\n        useFieldModel,\n    };\n    function isFieldGroup(fieldOrGroup) {\n        return Array.isArray(fieldOrGroup);\n    }\n    function applyFieldMutation(fieldOrGroup, mutation) {\n        if (Array.isArray(fieldOrGroup)) {\n            return fieldOrGroup.forEach(mutation);\n        }\n        return mutation(fieldOrGroup);\n    }\n    function mutateAllFields(mutation) {\n        Object.values(fieldsByPath.value).forEach(field => {\n            if (!field) {\n                return;\n            }\n            // avoid resetting the field values, because they should've been reset already.\n            applyFieldMutation(field, mutation);\n        });\n    }\n    /**\n     * Manually sets an error message on a specific field\n     */\n    function setFieldError(field, message) {\n        setFieldErrorBag(field, message);\n    }\n    /**\n     * Sets errors for the fields specified in the object\n     */\n    function setErrors(fields) {\n        setErrorBag(fields);\n    }\n    /**\n     * Sets a single field value\n     */\n    function setFieldValue(field, value, { force } = { force: false }) {\n        var _a;\n        const fieldInstance = fieldsByPath.value[field];\n        const clonedValue = klona(value);\n        // field wasn't found, create a virtual field as a placeholder\n        if (!fieldInstance) {\n            setInPath(formValues, field, clonedValue);\n            return;\n        }\n        if (isFieldGroup(fieldInstance) && ((_a = fieldInstance[0]) === null || _a === void 0 ? void 0 : _a.type) === 'checkbox' && !Array.isArray(value)) {\n            // Multiple checkboxes, and only one of them got updated\n            const newValue = klona(resolveNextCheckboxValue(getFromPath(formValues, field) || [], value, undefined));\n            setInPath(formValues, field, newValue);\n            return;\n        }\n        let newValue = clonedValue;\n        // Single Checkbox: toggles the field value unless the field is being reset then force it\n        if (!isFieldGroup(fieldInstance) && fieldInstance.type === 'checkbox' && !force && !RESET_LOCK) {\n            newValue = klona(resolveNextCheckboxValue(getFromPath(formValues, field), value, (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(fieldInstance.uncheckedValue)));\n        }\n        setInPath(formValues, field, newValue);\n    }\n    /**\n     * Sets multiple fields values\n     */\n    function setValues(fields) {\n        // clean up old values\n        keysOf(formValues).forEach(key => {\n            delete formValues[key];\n        });\n        // set up new values\n        keysOf(fields).forEach(path => {\n            setFieldValue(path, fields[path]);\n        });\n        // regenerate the arrays when the form values change\n        fieldArrays.forEach(f => f && f.reset());\n    }\n    function createModel(path) {\n        const { value } = _useFieldValue(path, undefined, formCtx);\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(value, () => {\n            if (!fieldExists((0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path))) {\n                validate({ mode: 'validated-only' });\n            }\n        }, {\n            deep: true,\n        });\n        controlledModelPaths.add((0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path));\n        return value;\n    }\n    function useFieldModel(path) {\n        if (!Array.isArray(path)) {\n            return createModel(path);\n        }\n        return path.map(createModel);\n    }\n    /**\n     * Sets the touched meta state on a field\n     */\n    function setFieldTouched(field, isTouched) {\n        const fieldInstance = fieldsByPath.value[field];\n        if (fieldInstance) {\n            applyFieldMutation(fieldInstance, f => f.setTouched(isTouched));\n        }\n    }\n    /**\n     * Sets the touched meta state on multiple fields\n     */\n    function setTouched(fields) {\n        keysOf(fields).forEach(field => {\n            setFieldTouched(field, !!fields[field]);\n        });\n    }\n    function resetField(field, state) {\n        const fieldInstance = fieldsByPath.value[field];\n        if (fieldInstance) {\n            applyFieldMutation(fieldInstance, f => f.resetField(state));\n        }\n    }\n    /**\n     * Resets all fields\n     */\n    function resetForm(state) {\n        RESET_LOCK = true;\n        // Reset all field states first\n        mutateAllFields(f => f.resetField());\n        // reset values\n        const newValues = (state === null || state === void 0 ? void 0 : state.values) ? state.values : originalInitialValues.value;\n        setInitialValues(newValues);\n        setValues(newValues);\n        if (state === null || state === void 0 ? void 0 : state.touched) {\n            setTouched(state.touched);\n        }\n        setErrors((state === null || state === void 0 ? void 0 : state.errors) || {});\n        submitCount.value = (state === null || state === void 0 ? void 0 : state.submitCount) || 0;\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.nextTick)(() => {\n            RESET_LOCK = false;\n        });\n    }\n    function insertFieldAtPath(field, path) {\n        const rawField = (0,vue__WEBPACK_IMPORTED_MODULE_0__.markRaw)(field);\n        const fieldPath = path;\n        // first field at that path\n        if (!fieldsByPath.value[fieldPath]) {\n            fieldsByPath.value[fieldPath] = rawField;\n            return;\n        }\n        const fieldAtPath = fieldsByPath.value[fieldPath];\n        if (fieldAtPath && !Array.isArray(fieldAtPath)) {\n            fieldsByPath.value[fieldPath] = [fieldAtPath];\n        }\n        // add the new array to that path\n        fieldsByPath.value[fieldPath] = [...fieldsByPath.value[fieldPath], rawField];\n    }\n    function removeFieldFromPath(field, path) {\n        const fieldPath = path;\n        const fieldAtPath = fieldsByPath.value[fieldPath];\n        if (!fieldAtPath) {\n            return;\n        }\n        // same field at path\n        if (!isFieldGroup(fieldAtPath) && field.id === fieldAtPath.id) {\n            delete fieldsByPath.value[fieldPath];\n            return;\n        }\n        if (isFieldGroup(fieldAtPath)) {\n            const idx = fieldAtPath.findIndex(f => f.id === field.id);\n            if (idx === -1) {\n                return;\n            }\n            fieldAtPath.splice(idx, 1);\n            if (!fieldAtPath.length) {\n                delete fieldsByPath.value[fieldPath];\n            }\n        }\n    }\n    function registerField(field) {\n        const fieldPath = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(field.name);\n        insertFieldAtPath(field, fieldPath);\n        if ((0,vue__WEBPACK_IMPORTED_MODULE_0__.isRef)(field.name)) {\n            // ensures when a field's name was already taken that it preserves its same value\n            // necessary for fields generated by loops\n            (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(field.name, async (newPath, oldPath) => {\n                // cache the value\n                await (0,vue__WEBPACK_IMPORTED_MODULE_0__.nextTick)();\n                removeFieldFromPath(field, oldPath);\n                insertFieldAtPath(field, newPath);\n                // re-validate if either path had errors before\n                if (errors.value[oldPath] || errors.value[newPath]) {\n                    // clear up both paths errors\n                    setFieldError(oldPath, undefined);\n                    validateField(newPath);\n                }\n                // clean up the old path if no other field is sharing that name\n                // #3325\n                await (0,vue__WEBPACK_IMPORTED_MODULE_0__.nextTick)();\n                if (!fieldExists(oldPath)) {\n                    unsetPath(formValues, oldPath);\n                }\n            });\n        }\n        // if field already had errors (initial errors) that's not user-set, validate it again to ensure state is correct\n        // the difference being that `initialErrors` will contain the error message while other errors (pre-validated schema) won't have them as initial errors\n        // #3342\n        const initialErrorMessage = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(field.errorMessage);\n        if (initialErrorMessage && (initialErrors === null || initialErrors === void 0 ? void 0 : initialErrors[fieldPath]) !== initialErrorMessage) {\n            validateField(fieldPath);\n        }\n        // marks the initial error as \"consumed\" so it won't be matched later with same non-initial error\n        delete initialErrors[fieldPath];\n    }\n    function unregisterField(field) {\n        const fieldName = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(field.name);\n        const fieldInstance = fieldsByPath.value[fieldName];\n        const isGroup = !!fieldInstance && isFieldGroup(fieldInstance);\n        removeFieldFromPath(field, fieldName);\n        // clears a field error on unmounted\n        // we wait till next tick to make sure if the field is completely removed and doesn't have any siblings like checkboxes\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.nextTick)(() => {\n            var _a;\n            const shouldKeepValue = (_a = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(field.keepValueOnUnmount)) !== null && _a !== void 0 ? _a : (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(keepValuesOnUnmount);\n            const currentGroupValue = getFromPath(formValues, fieldName);\n            // The boolean here is we check if the field still belongs to the same control group with that name\n            // if another group claimed the name, we should avoid handling it since it is no longer the same group\n            // this happens with `v-for` over some checkboxes and field arrays.\n            // also if the group no longer exist we can assume this group was the last one that controlled it\n            const isSameGroup = isGroup && (fieldInstance === fieldsByPath.value[fieldName] || !fieldsByPath.value[fieldName]);\n            // group field that still has a dangling value, the field may exist or not after it was removed.\n            // This used to be handled in the useField composable but the form has better context on when it should/not happen.\n            // if it does belong to it that means the group still exists\n            // #3844\n            if (isSameGroup && !shouldKeepValue) {\n                if (Array.isArray(currentGroupValue)) {\n                    const valueIdx = currentGroupValue.findIndex(i => isEqual(i, (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(field.checkedValue)));\n                    if (valueIdx > -1) {\n                        const newVal = [...currentGroupValue];\n                        newVal.splice(valueIdx, 1);\n                        setFieldValue(fieldName, newVal, { force: true });\n                    }\n                }\n                else if (currentGroupValue === (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(field.checkedValue)) {\n                    // Remove field if it is a group but does not have an array value, like for radio inputs #3963\n                    unsetPath(formValues, fieldName);\n                }\n            }\n            // Field was removed entirely, we should unset its path\n            // #3384\n            if (!fieldExists(fieldName)) {\n                setFieldError(fieldName, undefined);\n                // Checks if the field was configured to be unset during unmount or not\n                // Checks both the form-level config and field-level one\n                // Field has the priority if it is set, otherwise it goes to the form settings\n                if (shouldKeepValue) {\n                    return;\n                }\n                // Don't apply emptyContainer check unless the current group value is an array\n                if (isGroup && Array.isArray(currentGroupValue) && !isEmptyContainer(currentGroupValue)) {\n                    return;\n                }\n                unsetPath(formValues, fieldName);\n            }\n        });\n    }\n    async function validate(opts) {\n        const mode = (opts === null || opts === void 0 ? void 0 : opts.mode) || 'force';\n        if (mode === 'force') {\n            mutateAllFields(f => (f.meta.validated = true));\n        }\n        if (formCtx.validateSchema) {\n            return formCtx.validateSchema(mode);\n        }\n        // No schema, each field is responsible to validate itself\n        const validations = await Promise.all(Object.values(fieldsByPath.value).map(field => {\n            const fieldInstance = Array.isArray(field) ? field[0] : field;\n            if (!fieldInstance) {\n                return Promise.resolve({ key: '', valid: true, errors: [] });\n            }\n            return fieldInstance.validate(opts).then((result) => {\n                return {\n                    key: (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(fieldInstance.name),\n                    valid: result.valid,\n                    errors: result.errors,\n                };\n            });\n        }));\n        const results = {};\n        const errors = {};\n        for (const validation of validations) {\n            results[validation.key] = {\n                valid: validation.valid,\n                errors: validation.errors,\n            };\n            if (validation.errors.length) {\n                errors[validation.key] = validation.errors[0];\n            }\n        }\n        return {\n            valid: validations.every(r => r.valid),\n            results,\n            errors,\n        };\n    }\n    async function validateField(field) {\n        const fieldInstance = fieldsByPath.value[field];\n        if (!fieldInstance) {\n            (0,vue__WEBPACK_IMPORTED_MODULE_0__.warn)(`field with name ${field} was not found`);\n            return Promise.resolve({ errors: [], valid: true });\n        }\n        if (Array.isArray(fieldInstance)) {\n            return fieldInstance.map(f => f.validate())[0];\n        }\n        return fieldInstance.validate();\n    }\n    function unsetInitialValue(path) {\n        unsetPath(initialValues.value, path);\n    }\n    /**\n     * Sneaky function to set initial field values\n     */\n    function stageInitialValue(path, value, updateOriginal = false) {\n        setInPath(formValues, path, value);\n        setFieldInitialValue(path, value);\n        if (updateOriginal && !(opts === null || opts === void 0 ? void 0 : opts.initialValues)) {\n            setInPath(originalInitialValues.value, path, klona(value));\n        }\n    }\n    function setFieldInitialValue(path, value) {\n        setInPath(initialValues.value, path, klona(value));\n    }\n    async function _validateSchema() {\n        const schemaValue = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(schema);\n        if (!schemaValue) {\n            return { valid: true, results: {}, errors: {} };\n        }\n        const formResult = isYupValidator(schemaValue) || isTypedSchema(schemaValue)\n            ? await validateTypedSchema(schemaValue, formValues)\n            : await validateObjectSchema(schemaValue, formValues, {\n                names: fieldNames.value,\n                bailsMap: fieldBailsMap.value,\n            });\n        return formResult;\n    }\n    const submitForm = handleSubmit((_, { evt }) => {\n        if (isFormSubmitEvent(evt)) {\n            evt.target.submit();\n        }\n    });\n    // Trigger initial validation\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.onMounted)(() => {\n        if (opts === null || opts === void 0 ? void 0 : opts.initialErrors) {\n            setErrors(opts.initialErrors);\n        }\n        if (opts === null || opts === void 0 ? void 0 : opts.initialTouched) {\n            setTouched(opts.initialTouched);\n        }\n        // if validate on mount was enabled\n        if (opts === null || opts === void 0 ? void 0 : opts.validateOnMount) {\n            validate();\n            return;\n        }\n        // otherwise run initial silent validation through schema if available\n        // the useField should skip their own silent validation if a yup schema is present\n        if (formCtx.validateSchema) {\n            formCtx.validateSchema('silent');\n        }\n    });\n    if ((0,vue__WEBPACK_IMPORTED_MODULE_0__.isRef)(schema)) {\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(schema, () => {\n            var _a;\n            (_a = formCtx.validateSchema) === null || _a === void 0 ? void 0 : _a.call(formCtx, 'validated-only');\n        });\n    }\n    // Provide injections\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)(FormContextKey, formCtx);\n    if ((true)) {\n        registerFormWithDevTools(formCtx);\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(() => (Object.assign(Object.assign({ errors: errorBag.value }, meta.value), { values: formValues, isSubmitting: isSubmitting.value, submitCount: submitCount.value })), refreshInspector, {\n            deep: true,\n        });\n    }\n    return Object.assign(Object.assign({}, formCtx), { handleReset: () => resetForm(), submitForm });\n}\n/**\n * Manages form meta aggregation\n */\nfunction useFormMeta(fieldsByPath, currentValues, initialValues, errors) {\n    const MERGE_STRATEGIES = {\n        touched: 'some',\n        pending: 'some',\n        valid: 'every',\n    };\n    const isDirty = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        return !isEqual(currentValues, (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(initialValues));\n    });\n    function calculateFlags() {\n        const fields = Object.values(fieldsByPath.value).flat(1).filter(Boolean);\n        return keysOf(MERGE_STRATEGIES).reduce((acc, flag) => {\n            const mergeMethod = MERGE_STRATEGIES[flag];\n            acc[flag] = fields[mergeMethod](field => field.meta[flag]);\n            return acc;\n        }, {});\n    }\n    const flags = (0,vue__WEBPACK_IMPORTED_MODULE_0__.reactive)(calculateFlags());\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.watchEffect)(() => {\n        const value = calculateFlags();\n        flags.touched = value.touched;\n        flags.valid = value.valid;\n        flags.pending = value.pending;\n    });\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        return Object.assign(Object.assign({ initialValues: (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(initialValues) }, flags), { valid: flags.valid && !keysOf(errors.value).length, dirty: isDirty.value });\n    });\n}\n/**\n * Manages the initial values prop\n */\nfunction useFormInitialValues(fields, formValues, opts) {\n    const values = resolveInitialValues(opts);\n    const providedValues = opts === null || opts === void 0 ? void 0 : opts.initialValues;\n    // these are the mutable initial values as the fields are mounted/unmounted\n    const initialValues = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(values);\n    // these are the original initial value as provided by the user initially, they don't keep track of conditional fields\n    // this is important because some conditional fields will overwrite the initial values for other fields who had the same name\n    // like array fields, any push/insert operation will overwrite the initial values because they \"create new fields\"\n    // so these are the values that the reset function should use\n    // these only change when the user explicitly changes the initial values or when the user resets them with new values.\n    const originalInitialValues = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(klona(values));\n    function setInitialValues(values, updateFields = false) {\n        initialValues.value = klona(values);\n        originalInitialValues.value = klona(values);\n        if (!updateFields) {\n            return;\n        }\n        // update the pristine non-touched fields\n        // those are excluded because it's unlikely you want to change the form values using initial values\n        // we mostly watch them for API population or newly inserted fields\n        // if the user API is taking too much time before user interaction they should consider disabling or hiding their inputs until the values are ready\n        keysOf(fields.value).forEach(fieldPath => {\n            const field = fields.value[fieldPath];\n            const wasTouched = Array.isArray(field) ? field.some(f => f.meta.touched) : field === null || field === void 0 ? void 0 : field.meta.touched;\n            if (!field || wasTouched) {\n                return;\n            }\n            const newValue = getFromPath(initialValues.value, fieldPath);\n            setInPath(formValues, fieldPath, klona(newValue));\n        });\n    }\n    if ((0,vue__WEBPACK_IMPORTED_MODULE_0__.isRef)(providedValues)) {\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(providedValues, value => {\n            setInitialValues(value, true);\n        }, {\n            deep: true,\n        });\n    }\n    return {\n        initialValues,\n        originalInitialValues,\n        setInitialValues,\n    };\n}\nfunction useErrorBag(initialErrors) {\n    const errorBag = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)({});\n    function normalizeErrorItem(message) {\n        return Array.isArray(message) ? message : message ? [message] : [];\n    }\n    /**\n     * Manually sets an error message on a specific field\n     */\n    function setFieldErrorBag(field, message) {\n        if (!message) {\n            delete errorBag.value[field];\n            return;\n        }\n        errorBag.value[field] = normalizeErrorItem(message);\n    }\n    /**\n     * Sets errors for the fields specified in the object\n     */\n    function setErrorBag(fields) {\n        errorBag.value = keysOf(fields).reduce((acc, key) => {\n            const message = fields[key];\n            if (message) {\n                acc[key] = normalizeErrorItem(message);\n            }\n            return acc;\n        }, {});\n    }\n    if (initialErrors) {\n        setErrorBag(initialErrors);\n    }\n    return {\n        errorBag,\n        setErrorBag,\n        setFieldErrorBag,\n    };\n}\n\nconst FormImpl = (0,vue__WEBPACK_IMPORTED_MODULE_0__.defineComponent)({\n    name: 'Form',\n    inheritAttrs: false,\n    props: {\n        as: {\n            type: String,\n            default: 'form',\n        },\n        validationSchema: {\n            type: Object,\n            default: undefined,\n        },\n        initialValues: {\n            type: Object,\n            default: undefined,\n        },\n        initialErrors: {\n            type: Object,\n            default: undefined,\n        },\n        initialTouched: {\n            type: Object,\n            default: undefined,\n        },\n        validateOnMount: {\n            type: Boolean,\n            default: false,\n        },\n        onSubmit: {\n            type: Function,\n            default: undefined,\n        },\n        onInvalidSubmit: {\n            type: Function,\n            default: undefined,\n        },\n        keepValues: {\n            type: Boolean,\n            default: false,\n        },\n    },\n    setup(props, ctx) {\n        const initialValues = (0,vue__WEBPACK_IMPORTED_MODULE_0__.toRef)(props, 'initialValues');\n        const validationSchema = (0,vue__WEBPACK_IMPORTED_MODULE_0__.toRef)(props, 'validationSchema');\n        const keepValues = (0,vue__WEBPACK_IMPORTED_MODULE_0__.toRef)(props, 'keepValues');\n        const { errors, errorBag, values, meta, isSubmitting, submitCount, controlledValues, validate, validateField, handleReset, resetForm, handleSubmit, setErrors, setFieldError, setFieldValue, setValues, setFieldTouched, setTouched, resetField, } = useForm({\n            validationSchema: validationSchema.value ? validationSchema : undefined,\n            initialValues,\n            initialErrors: props.initialErrors,\n            initialTouched: props.initialTouched,\n            validateOnMount: props.validateOnMount,\n            keepValuesOnUnmount: keepValues,\n        });\n        const submitForm = handleSubmit((_, { evt }) => {\n            if (isFormSubmitEvent(evt)) {\n                evt.target.submit();\n            }\n        }, props.onInvalidSubmit);\n        const onSubmit = props.onSubmit ? handleSubmit(props.onSubmit, props.onInvalidSubmit) : submitForm;\n        function handleFormReset(e) {\n            if (isEvent(e)) {\n                // Prevent default form reset behavior\n                e.preventDefault();\n            }\n            handleReset();\n            if (typeof ctx.attrs.onReset === 'function') {\n                ctx.attrs.onReset();\n            }\n        }\n        function handleScopedSlotSubmit(evt, onSubmit) {\n            const onSuccess = typeof evt === 'function' && !onSubmit ? evt : onSubmit;\n            return handleSubmit(onSuccess, props.onInvalidSubmit)(evt);\n        }\n        function getValues() {\n            return klona(values);\n        }\n        function getMeta() {\n            return klona(meta.value);\n        }\n        function getErrors() {\n            return klona(errors.value);\n        }\n        function slotProps() {\n            return {\n                meta: meta.value,\n                errors: errors.value,\n                errorBag: errorBag.value,\n                values,\n                isSubmitting: isSubmitting.value,\n                submitCount: submitCount.value,\n                controlledValues: controlledValues.value,\n                validate,\n                validateField,\n                handleSubmit: handleScopedSlotSubmit,\n                handleReset,\n                submitForm,\n                setErrors,\n                setFieldError,\n                setFieldValue,\n                setValues,\n                setFieldTouched,\n                setTouched,\n                resetForm,\n                resetField,\n                getValues,\n                getMeta,\n                getErrors,\n            };\n        }\n        // expose these functions and methods as part of public API\n        ctx.expose({\n            setFieldError,\n            setErrors,\n            setFieldValue,\n            setValues,\n            setFieldTouched,\n            setTouched,\n            resetForm,\n            validate,\n            validateField,\n            resetField,\n            getValues,\n            getMeta,\n            getErrors,\n        });\n        return function renderForm() {\n            // avoid resolving the form component as itself\n            const tag = props.as === 'form' ? props.as : (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent)(props.as);\n            const children = normalizeChildren(tag, ctx, slotProps);\n            if (!props.as) {\n                return children;\n            }\n            // Attributes to add on a native `form` tag\n            const formAttrs = props.as === 'form'\n                ? {\n                    // Disables native validation as vee-validate will handle it.\n                    novalidate: true,\n                }\n                : {};\n            return (0,vue__WEBPACK_IMPORTED_MODULE_0__.h)(tag, Object.assign(Object.assign(Object.assign({}, formAttrs), ctx.attrs), { onSubmit, onReset: handleFormReset }), children);\n        };\n    },\n});\nconst Form = FormImpl;\n\nfunction useFieldArray(arrayPath) {\n    const form = injectWithSelf(FormContextKey, undefined);\n    const fields = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)([]);\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    const noOp = () => { };\n    const noOpApi = {\n        fields,\n        remove: noOp,\n        push: noOp,\n        swap: noOp,\n        insert: noOp,\n        update: noOp,\n        replace: noOp,\n        prepend: noOp,\n        move: noOp,\n    };\n    if (!form) {\n        warn('FieldArray requires being a child of `<Form/>` or `useForm` being called before it. Array fields may not work correctly');\n        return noOpApi;\n    }\n    if (!(0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(arrayPath)) {\n        warn('FieldArray requires a field path to be provided, did you forget to pass the `name` prop?');\n        return noOpApi;\n    }\n    const alreadyExists = form.fieldArrays.find(a => (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(a.path) === (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(arrayPath));\n    if (alreadyExists) {\n        return alreadyExists;\n    }\n    let entryCounter = 0;\n    function getCurrentValues() {\n        return getFromPath(form === null || form === void 0 ? void 0 : form.values, (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(arrayPath), []) || [];\n    }\n    function initFields() {\n        const currentValues = getCurrentValues();\n        fields.value = currentValues.map(createEntry);\n        updateEntryFlags();\n    }\n    initFields();\n    function updateEntryFlags() {\n        const fieldsLength = fields.value.length;\n        for (let i = 0; i < fieldsLength; i++) {\n            const entry = fields.value[i];\n            entry.isFirst = i === 0;\n            entry.isLast = i === fieldsLength - 1;\n        }\n    }\n    function createEntry(value) {\n        const key = entryCounter++;\n        const entry = {\n            key,\n            value: computedDeep({\n                get() {\n                    const currentValues = getFromPath(form === null || form === void 0 ? void 0 : form.values, (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(arrayPath), []) || [];\n                    const idx = fields.value.findIndex(e => e.key === key);\n                    return idx === -1 ? value : currentValues[idx];\n                },\n                set(value) {\n                    const idx = fields.value.findIndex(e => e.key === key);\n                    if (idx === -1) {\n                        warn(`Attempting to update a non-existent array item`);\n                        return;\n                    }\n                    update(idx, value);\n                },\n            }),\n            isFirst: false,\n            isLast: false,\n        };\n        return entry;\n    }\n    function afterMutation() {\n        updateEntryFlags();\n        // Should trigger a silent validation since a field may not do that #4096\n        form === null || form === void 0 ? void 0 : form.validate({ mode: 'silent' });\n    }\n    function remove(idx) {\n        const pathName = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(arrayPath);\n        const pathValue = getFromPath(form === null || form === void 0 ? void 0 : form.values, pathName);\n        if (!pathValue || !Array.isArray(pathValue)) {\n            return;\n        }\n        const newValue = [...pathValue];\n        newValue.splice(idx, 1);\n        form === null || form === void 0 ? void 0 : form.unsetInitialValue(pathName + `[${idx}]`);\n        form === null || form === void 0 ? void 0 : form.setFieldValue(pathName, newValue);\n        fields.value.splice(idx, 1);\n        afterMutation();\n    }\n    function push(value) {\n        const pathName = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(arrayPath);\n        const pathValue = getFromPath(form === null || form === void 0 ? void 0 : form.values, pathName);\n        const normalizedPathValue = isNullOrUndefined(pathValue) ? [] : pathValue;\n        if (!Array.isArray(normalizedPathValue)) {\n            return;\n        }\n        const newValue = [...normalizedPathValue];\n        newValue.push(value);\n        form === null || form === void 0 ? void 0 : form.stageInitialValue(pathName + `[${newValue.length - 1}]`, value);\n        form === null || form === void 0 ? void 0 : form.setFieldValue(pathName, newValue);\n        fields.value.push(createEntry(value));\n        afterMutation();\n    }\n    function swap(indexA, indexB) {\n        const pathName = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(arrayPath);\n        const pathValue = getFromPath(form === null || form === void 0 ? void 0 : form.values, pathName);\n        if (!Array.isArray(pathValue) || !(indexA in pathValue) || !(indexB in pathValue)) {\n            return;\n        }\n        const newValue = [...pathValue];\n        const newFields = [...fields.value];\n        // the old switcheroo\n        const temp = newValue[indexA];\n        newValue[indexA] = newValue[indexB];\n        newValue[indexB] = temp;\n        const tempEntry = newFields[indexA];\n        newFields[indexA] = newFields[indexB];\n        newFields[indexB] = tempEntry;\n        form === null || form === void 0 ? void 0 : form.setFieldValue(pathName, newValue);\n        fields.value = newFields;\n        updateEntryFlags();\n    }\n    function insert(idx, value) {\n        const pathName = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(arrayPath);\n        const pathValue = getFromPath(form === null || form === void 0 ? void 0 : form.values, pathName);\n        if (!Array.isArray(pathValue) || pathValue.length < idx) {\n            return;\n        }\n        const newValue = [...pathValue];\n        const newFields = [...fields.value];\n        newValue.splice(idx, 0, value);\n        newFields.splice(idx, 0, createEntry(value));\n        form === null || form === void 0 ? void 0 : form.setFieldValue(pathName, newValue);\n        fields.value = newFields;\n        afterMutation();\n    }\n    function replace(arr) {\n        const pathName = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(arrayPath);\n        form === null || form === void 0 ? void 0 : form.setFieldValue(pathName, arr);\n        initFields();\n        afterMutation();\n    }\n    function update(idx, value) {\n        const pathName = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(arrayPath);\n        const pathValue = getFromPath(form === null || form === void 0 ? void 0 : form.values, pathName);\n        if (!Array.isArray(pathValue) || pathValue.length - 1 < idx) {\n            return;\n        }\n        form === null || form === void 0 ? void 0 : form.setFieldValue(`${pathName}[${idx}]`, value);\n        form === null || form === void 0 ? void 0 : form.validate({ mode: 'validated-only' });\n    }\n    function prepend(value) {\n        const pathName = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(arrayPath);\n        const pathValue = getFromPath(form === null || form === void 0 ? void 0 : form.values, pathName);\n        const normalizedPathValue = isNullOrUndefined(pathValue) ? [] : pathValue;\n        if (!Array.isArray(normalizedPathValue)) {\n            return;\n        }\n        const newValue = [value, ...normalizedPathValue];\n        form === null || form === void 0 ? void 0 : form.stageInitialValue(pathName + `[${newValue.length - 1}]`, value);\n        form === null || form === void 0 ? void 0 : form.setFieldValue(pathName, newValue);\n        fields.value.unshift(createEntry(value));\n        afterMutation();\n    }\n    function move(oldIdx, newIdx) {\n        const pathName = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(arrayPath);\n        const pathValue = getFromPath(form === null || form === void 0 ? void 0 : form.values, pathName);\n        const newValue = isNullOrUndefined(pathValue) ? [] : [...pathValue];\n        if (!Array.isArray(pathValue) || !(oldIdx in pathValue) || !(newIdx in pathValue)) {\n            return;\n        }\n        const newFields = [...fields.value];\n        const movedItem = newFields[oldIdx];\n        newFields.splice(oldIdx, 1);\n        newFields.splice(newIdx, 0, movedItem);\n        const movedValue = newValue[oldIdx];\n        newValue.splice(oldIdx, 1);\n        newValue.splice(newIdx, 0, movedValue);\n        form === null || form === void 0 ? void 0 : form.setFieldValue(pathName, newValue);\n        fields.value = newFields;\n        afterMutation();\n    }\n    const fieldArrayCtx = {\n        fields,\n        remove,\n        push,\n        swap,\n        insert,\n        update,\n        replace,\n        prepend,\n        move,\n    };\n    form.fieldArrays.push(Object.assign({ path: arrayPath, reset: initFields }, fieldArrayCtx));\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.onBeforeUnmount)(() => {\n        const idx = form.fieldArrays.findIndex(i => (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(i.path) === (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(arrayPath));\n        if (idx >= 0) {\n            form.fieldArrays.splice(idx, 1);\n        }\n    });\n    // Makes sure to sync the form values with the array value if they go out of sync\n    // #4153\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(getCurrentValues, formValues => {\n        const fieldsValues = fields.value.map(f => f.value);\n        // If form values are not the same as the current values then something overrode them.\n        if (!isEqual(formValues, fieldsValues)) {\n            initFields();\n        }\n    });\n    return fieldArrayCtx;\n}\n\nconst FieldArrayImpl = (0,vue__WEBPACK_IMPORTED_MODULE_0__.defineComponent)({\n    name: 'FieldArray',\n    inheritAttrs: false,\n    props: {\n        name: {\n            type: String,\n            required: true,\n        },\n    },\n    setup(props, ctx) {\n        const { push, remove, swap, insert, replace, update, prepend, move, fields } = useFieldArray((0,vue__WEBPACK_IMPORTED_MODULE_0__.toRef)(props, 'name'));\n        function slotProps() {\n            return {\n                fields: fields.value,\n                push,\n                remove,\n                swap,\n                insert,\n                update,\n                replace,\n                prepend,\n                move,\n            };\n        }\n        ctx.expose({\n            push,\n            remove,\n            swap,\n            insert,\n            update,\n            replace,\n            prepend,\n            move,\n        });\n        return () => {\n            const children = normalizeChildren(undefined, ctx, slotProps);\n            return children;\n        };\n    },\n});\nconst FieldArray = FieldArrayImpl;\n\nconst ErrorMessageImpl = (0,vue__WEBPACK_IMPORTED_MODULE_0__.defineComponent)({\n    name: 'ErrorMessage',\n    props: {\n        as: {\n            type: String,\n            default: undefined,\n        },\n        name: {\n            type: String,\n            required: true,\n        },\n    },\n    setup(props, ctx) {\n        const form = (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(FormContextKey, undefined);\n        const message = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n            return form === null || form === void 0 ? void 0 : form.errors.value[props.name];\n        });\n        function slotProps() {\n            return {\n                message: message.value,\n            };\n        }\n        return () => {\n            // Renders nothing if there are no messages\n            if (!message.value) {\n                return undefined;\n            }\n            const tag = (props.as ? (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent)(props.as) : props.as);\n            const children = normalizeChildren(tag, ctx, slotProps);\n            const attrs = Object.assign({ role: 'alert' }, ctx.attrs);\n            // If no tag was specified and there are children\n            // render the slot as is without wrapping it\n            if (!tag && (Array.isArray(children) || !children) && (children === null || children === void 0 ? void 0 : children.length)) {\n                return children;\n            }\n            // If no children in slot\n            // render whatever specified and fallback to a <span> with the message in it's contents\n            if ((Array.isArray(children) || !children) && !(children === null || children === void 0 ? void 0 : children.length)) {\n                return (0,vue__WEBPACK_IMPORTED_MODULE_0__.h)(tag || 'span', attrs, message.value);\n            }\n            return (0,vue__WEBPACK_IMPORTED_MODULE_0__.h)(tag, attrs, children);\n        };\n    },\n});\nconst ErrorMessage = ErrorMessageImpl;\n\nfunction useResetForm() {\n    const form = injectWithSelf(FormContextKey);\n    if (!form) {\n        warn('No vee-validate <Form /> or `useForm` was detected in the component tree');\n    }\n    return function resetForm(state) {\n        if (!form) {\n            return;\n        }\n        return form.resetForm(state);\n    };\n}\n\n/**\n * If a field is dirty or not\n */\nfunction useIsFieldDirty(path) {\n    const form = injectWithSelf(FormContextKey);\n    let field = path ? undefined : (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(FieldContextKey);\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        if (path) {\n            field = normalizeField(form === null || form === void 0 ? void 0 : form.fieldsByPath.value[(0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path)]);\n        }\n        if (!field) {\n            warn(`field with name ${(0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path)} was not found`);\n            return false;\n        }\n        return field.meta.dirty;\n    });\n}\n\n/**\n * If a field is touched or not\n */\nfunction useIsFieldTouched(path) {\n    const form = injectWithSelf(FormContextKey);\n    let field = path ? undefined : (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(FieldContextKey);\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        if (path) {\n            field = normalizeField(form === null || form === void 0 ? void 0 : form.fieldsByPath.value[(0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path)]);\n        }\n        if (!field) {\n            warn(`field with name ${(0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path)} was not found`);\n            return false;\n        }\n        return field.meta.touched;\n    });\n}\n\n/**\n * If a field is validated and is valid\n */\nfunction useIsFieldValid(path) {\n    const form = injectWithSelf(FormContextKey);\n    let field = path ? undefined : (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(FieldContextKey);\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        if (path) {\n            field = normalizeField(form === null || form === void 0 ? void 0 : form.fieldsByPath.value[(0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path)]);\n        }\n        if (!field) {\n            warn(`field with name ${(0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path)} was not found`);\n            return false;\n        }\n        return field.meta.valid;\n    });\n}\n\n/**\n * If the form is submitting or not\n */\nfunction useIsSubmitting() {\n    const form = injectWithSelf(FormContextKey);\n    if (!form) {\n        warn('No vee-validate <Form /> or `useForm` was detected in the component tree');\n    }\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        var _a;\n        return (_a = form === null || form === void 0 ? void 0 : form.isSubmitting.value) !== null && _a !== void 0 ? _a : false;\n    });\n}\n\n/**\n * Validates a single field\n */\nfunction useValidateField(path) {\n    const form = injectWithSelf(FormContextKey);\n    let field = path ? undefined : (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(FieldContextKey);\n    return function validateField() {\n        if (path) {\n            field = normalizeField(form === null || form === void 0 ? void 0 : form.fieldsByPath.value[(0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path)]);\n        }\n        if (!field) {\n            warn(`field with name ${(0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path)} was not found`);\n            return Promise.resolve({\n                errors: [],\n                valid: true,\n            });\n        }\n        return field.validate();\n    };\n}\n\n/**\n * If the form is dirty or not\n */\nfunction useIsFormDirty() {\n    const form = injectWithSelf(FormContextKey);\n    if (!form) {\n        warn('No vee-validate <Form /> or `useForm` was detected in the component tree');\n    }\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        var _a;\n        return (_a = form === null || form === void 0 ? void 0 : form.meta.value.dirty) !== null && _a !== void 0 ? _a : false;\n    });\n}\n\n/**\n * If the form is touched or not\n */\nfunction useIsFormTouched() {\n    const form = injectWithSelf(FormContextKey);\n    if (!form) {\n        warn('No vee-validate <Form /> or `useForm` was detected in the component tree');\n    }\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        var _a;\n        return (_a = form === null || form === void 0 ? void 0 : form.meta.value.touched) !== null && _a !== void 0 ? _a : false;\n    });\n}\n\n/**\n * If the form has been validated and is valid\n */\nfunction useIsFormValid() {\n    const form = injectWithSelf(FormContextKey);\n    if (!form) {\n        warn('No vee-validate <Form /> or `useForm` was detected in the component tree');\n    }\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        var _a;\n        return (_a = form === null || form === void 0 ? void 0 : form.meta.value.valid) !== null && _a !== void 0 ? _a : false;\n    });\n}\n\n/**\n * Validate multiple fields\n */\nfunction useValidateForm() {\n    const form = injectWithSelf(FormContextKey);\n    if (!form) {\n        warn('No vee-validate <Form /> or `useForm` was detected in the component tree');\n    }\n    return function validateField() {\n        if (!form) {\n            return Promise.resolve({ results: {}, errors: {}, valid: true });\n        }\n        return form.validate();\n    };\n}\n\n/**\n * The number of form's submission count\n */\nfunction useSubmitCount() {\n    const form = injectWithSelf(FormContextKey);\n    if (!form) {\n        warn('No vee-validate <Form /> or `useForm` was detected in the component tree');\n    }\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        var _a;\n        return (_a = form === null || form === void 0 ? void 0 : form.submitCount.value) !== null && _a !== void 0 ? _a : 0;\n    });\n}\n\n/**\n * Gives access to a field's current value\n */\nfunction useFieldValue(path) {\n    const form = injectWithSelf(FormContextKey);\n    // We don't want to use self injected context as it doesn't make sense\n    const field = path ? undefined : (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(FieldContextKey);\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        if (path) {\n            return getFromPath(form === null || form === void 0 ? void 0 : form.values, (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path));\n        }\n        return (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(field === null || field === void 0 ? void 0 : field.value);\n    });\n}\n\n/**\n * Gives access to a form's values\n */\nfunction useFormValues() {\n    const form = injectWithSelf(FormContextKey);\n    if (!form) {\n        warn('No vee-validate <Form /> or `useForm` was detected in the component tree');\n    }\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        return (form === null || form === void 0 ? void 0 : form.values) || {};\n    });\n}\n\n/**\n * Gives access to all form errors\n */\nfunction useFormErrors() {\n    const form = injectWithSelf(FormContextKey);\n    if (!form) {\n        warn('No vee-validate <Form /> or `useForm` was detected in the component tree');\n    }\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        return ((form === null || form === void 0 ? void 0 : form.errors.value) || {});\n    });\n}\n\n/**\n * Gives access to a single field error\n */\nfunction useFieldError(path) {\n    const form = injectWithSelf(FormContextKey);\n    // We don't want to use self injected context as it doesn't make sense\n    const field = path ? undefined : (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(FieldContextKey);\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n        if (path) {\n            return form === null || form === void 0 ? void 0 : form.errors.value[(0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(path)];\n        }\n        return field === null || field === void 0 ? void 0 : field.errorMessage.value;\n    });\n}\n\nfunction useSubmitForm(cb) {\n    const form = injectWithSelf(FormContextKey);\n    if (!form) {\n        warn('No vee-validate <Form /> or `useForm` was detected in the component tree');\n    }\n    const onSubmit = form ? form.handleSubmit(cb) : undefined;\n    return function submitForm(e) {\n        if (!onSubmit) {\n            return;\n        }\n        return onSubmit(e);\n    };\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdmVlLXZhbGlkYXRlL2Rpc3QvdmVlLXZhbGlkYXRlLmVzbS5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDcVA7QUFDN0w7O0FBRXhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsR0FBRztBQUMxRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLFVBQVU7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDZDQUFRO0FBQ25CO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDZDQUFRO0FBQ25CLHFGQUFxRjtBQUNyRixLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLDJDQUFNO0FBQzNDLFdBQVcsNkNBQVE7QUFDbkI7QUFDQSxpRkFBaUYsMENBQUs7QUFDdEY7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNGMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdmVlLXZhbGlkYXRlL2Rpc3QvdmVlLXZhbGlkYXRlLmVzbS5qcz8xMGQ1Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICAqIHZlZS12YWxpZGF0ZSB2NC44LjRcbiAgKiAoYykgMjAyMyBBYmRlbHJhaG1hbiBBd2FkXG4gICogQGxpY2Vuc2UgTUlUXG4gICovXG5pbXBvcnQgeyBnZXRDdXJyZW50SW5zdGFuY2UsIGluamVjdCwgd2FybiBhcyB3YXJuJDEsIGNvbXB1dGVkLCByZWYsIHdhdGNoLCB1bnJlZiwgcmVhY3RpdmUsIG9uVW5tb3VudGVkLCBuZXh0VGljaywgb25Nb3VudGVkLCBwcm92aWRlLCBpc1JlZiwgb25CZWZvcmVVbm1vdW50LCBkZWZpbmVDb21wb25lbnQsIHRvUmVmLCByZXNvbHZlRHluYW1pY0NvbXBvbmVudCwgaCwgd2F0Y2hFZmZlY3QsIG1hcmtSYXcgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHsgc2V0dXBEZXZ0b29sc1BsdWdpbiB9IGZyb20gJ0B2dWUvZGV2dG9vbHMtYXBpJztcblxuZnVuY3Rpb24gaXNDYWxsYWJsZShmbikge1xuICAgIHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbic7XG59XG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuY29uc3QgaXNPYmplY3QgPSAob2JqKSA9PiBvYmogIT09IG51bGwgJiYgISFvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob2JqKTtcbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKSA+PSAwO1xufVxuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgICBjb25zdCBuID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgcmV0dXJuIGlzTmFOKG4pID8gdmFsdWUgOiBuO1xufVxuXG5jb25zdCBSVUxFUyA9IHt9O1xuLyoqXG4gKiBBZGRzIGEgY3VzdG9tIHZhbGlkYXRvciB0byB0aGUgbGlzdCBvZiB2YWxpZGF0aW9uIHJ1bGVzLlxuICovXG5mdW5jdGlvbiBkZWZpbmVSdWxlKGlkLCB2YWxpZGF0b3IpIHtcbiAgICAvLyBtYWtlcyBzdXJlIG5ldyBydWxlcyBhcmUgcHJvcGVybHkgZm9ybWF0dGVkLlxuICAgIGd1YXJkRXh0ZW5kKGlkLCB2YWxpZGF0b3IpO1xuICAgIFJVTEVTW2lkXSA9IHZhbGlkYXRvcjtcbn1cbi8qKlxuICogR2V0cyBhbiBhbHJlYWR5IGRlZmluZWQgcnVsZVxuICovXG5mdW5jdGlvbiByZXNvbHZlUnVsZShpZCkge1xuICAgIHJldHVybiBSVUxFU1tpZF07XG59XG4vKipcbiAqIEd1YXJkcyBmcm9tIGV4dGVuc2lvbiB2aW9sYXRpb25zLlxuICovXG5mdW5jdGlvbiBndWFyZEV4dGVuZChpZCwgdmFsaWRhdG9yKSB7XG4gICAgaWYgKGlzQ2FsbGFibGUodmFsaWRhdG9yKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgRXh0ZW5zaW9uIEVycm9yOiBUaGUgdmFsaWRhdG9yICcke2lkfScgbXVzdCBiZSBhIGZ1bmN0aW9uLmApO1xufVxuXG5jb25zdCBGb3JtQ29udGV4dEtleSA9IFN5bWJvbCgndmVlLXZhbGlkYXRlLWZvcm0nKTtcbmNvbnN0IEZpZWxkQ29udGV4dEtleSA9IFN5bWJvbCgndmVlLXZhbGlkYXRlLWZpZWxkLWluc3RhbmNlJyk7XG5jb25zdCBJU19BQlNFTlQgPSBTeW1ib2woJ0RlZmF1bHQgZW1wdHkgdmFsdWUnKTtcblxuY29uc3QgaXNDbGllbnQgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbmZ1bmN0aW9uIGlzTG9jYXRvcih2YWx1ZSkge1xuICAgIHJldHVybiBpc0NhbGxhYmxlKHZhbHVlKSAmJiAhIXZhbHVlLl9fbG9jYXRvclJlZjtcbn1cbmZ1bmN0aW9uIGlzVHlwZWRTY2hlbWEodmFsdWUpIHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiBpc0NhbGxhYmxlKHZhbHVlLnBhcnNlKSAmJiB2YWx1ZS5fX3R5cGUgPT09ICdWVlR5cGVkU2NoZW1hJztcbn1cbmZ1bmN0aW9uIGlzWXVwVmFsaWRhdG9yKHZhbHVlKSB7XG4gICAgcmV0dXJuICEhdmFsdWUgJiYgaXNDYWxsYWJsZSh2YWx1ZS52YWxpZGF0ZSk7XG59XG5mdW5jdGlvbiBoYXNDaGVja2VkQXR0cih0eXBlKSB7XG4gICAgcmV0dXJuIHR5cGUgPT09ICdjaGVja2JveCcgfHwgdHlwZSA9PT0gJ3JhZGlvJztcbn1cbmZ1bmN0aW9uIGlzQ29udGFpbmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuLyoqXG4gKiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBlbXB0eSBvYmplY3Qgb3IgYXJyYXlcbiAqL1xuZnVuY3Rpb24gaXNFbXB0eUNvbnRhaW5lcih2YWx1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG59XG4vKipcbiAqIENoZWNrcyBpZiB0aGUgcGF0aCBvcHRlZCBvdXQgb2YgbmVzdGVkIGZpZWxkcyB1c2luZyBgW2ZpZWxkTmFtZV1gIHN5bnRheFxuICovXG5mdW5jdGlvbiBpc05vdE5lc3RlZFBhdGgocGF0aCkge1xuICAgIHJldHVybiAvXlxcWy4rXFxdJC9pLnRlc3QocGF0aCk7XG59XG4vKipcbiAqIENoZWNrcyBpZiBhbiBlbGVtZW50IGlzIGEgbmF0aXZlIEhUTUw1IG11bHRpLXNlbGVjdCBpbnB1dCBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGlzTmF0aXZlTXVsdGlTZWxlY3QoZWwpIHtcbiAgICByZXR1cm4gaXNOYXRpdmVTZWxlY3QoZWwpICYmIGVsLm11bHRpcGxlO1xufVxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZWxlbWVudCBpcyBhIG5hdGl2ZSBIVE1MNSBzZWxlY3QgaW5wdXQgZWxlbWVudFxuICovXG5mdW5jdGlvbiBpc05hdGl2ZVNlbGVjdChlbCkge1xuICAgIHJldHVybiBlbC50YWdOYW1lID09PSAnU0VMRUNUJztcbn1cbi8qKlxuICogQ2hlY2tzIGlmIGEgdGFnIG5hbWUgd2l0aCBhdHRycyBvYmplY3Qgd2lsbCByZW5kZXIgYSBuYXRpdmUgbXVsdGktc2VsZWN0IGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gaXNOYXRpdmVNdWx0aVNlbGVjdE5vZGUodGFnLCBhdHRycykge1xuICAgIC8vIFRoZSBmYWxzeSB2YWx1ZSBhcnJheSBpcyB0aGUgdmFsdWVzIHRoYXQgVnVlIHdvbid0IGFkZCB0aGUgYG11bHRpcGxlYCBwcm9wIGlmIGl0IGhhcyBvbmUgb2YgdGhlc2UgdmFsdWVzXG4gICAgY29uc3QgaGFzVHJ1dGh5QmluZGluZ1ZhbHVlID0gIVtmYWxzZSwgbnVsbCwgdW5kZWZpbmVkLCAwXS5pbmNsdWRlcyhhdHRycy5tdWx0aXBsZSkgJiYgIU51bWJlci5pc05hTihhdHRycy5tdWx0aXBsZSk7XG4gICAgcmV0dXJuIHRhZyA9PT0gJ3NlbGVjdCcgJiYgJ211bHRpcGxlJyBpbiBhdHRycyAmJiBoYXNUcnV0aHlCaW5kaW5nVmFsdWU7XG59XG4vKipcbiAqIENoZWNrcyBpZiBhIG5vZGUgc2hvdWxkIGhhdmUgYSBgOnZhbHVlYCBiaW5kaW5nIG9yIG5vdFxuICpcbiAqIFRoZXNlIG5vZGVzIHNob3VsZCBub3QgaGF2ZSBhIHZhbHVlIGJpbmRpbmdcbiAqIEZvciBmaWxlcywgYmVjYXVzZSB0aGV5IGFyZSBub3QgcmVhY3RpdmVcbiAqIEZvciBtdWx0aS1zZWxlY3RzIGJlY2F1c2UgdGhlIHZhbHVlIGJpbmRpbmcgd2lsbCByZXNldCB0aGUgdmFsdWVcbiAqL1xuZnVuY3Rpb24gc2hvdWxkSGF2ZVZhbHVlQmluZGluZyh0YWcsIGF0dHJzKSB7XG4gICAgcmV0dXJuICFpc05hdGl2ZU11bHRpU2VsZWN0Tm9kZSh0YWcsIGF0dHJzKSAmJiBhdHRycy50eXBlICE9PSAnZmlsZScgJiYgIWhhc0NoZWNrZWRBdHRyKGF0dHJzLnR5cGUpO1xufVxuZnVuY3Rpb24gaXNGb3JtU3VibWl0RXZlbnQoZXZ0KSB7XG4gICAgcmV0dXJuIGlzRXZlbnQoZXZ0KSAmJiBldnQudGFyZ2V0ICYmICdzdWJtaXQnIGluIGV2dC50YXJnZXQ7XG59XG5mdW5jdGlvbiBpc0V2ZW50KGV2dCkge1xuICAgIGlmICghZXZ0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBFdmVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNDYWxsYWJsZShFdmVudCkgJiYgZXZ0IGluc3RhbmNlb2YgRXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIHRoaXMgaXMgZm9yIElFIGFuZCBDeXByZXNzICMzMTYxXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoZXZ0ICYmIGV2dC5zcmNFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc1Byb3BQcmVzZW50KG9iaiwgcHJvcCkge1xuICAgIHJldHVybiBwcm9wIGluIG9iaiAmJiBvYmpbcHJvcF0gIT09IElTX0FCU0VOVDtcbn1cbi8qKlxuICogQ29tcGFyZXMgaWYgdHdvIHZhbHVlcyBhcmUgdGhlIHNhbWUgYm9ycm93ZWQgZnJvbTpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lcG9iZXJlemtpbi9mYXN0LWRlZXAtZXF1YWxcbiAqIFdlIGFkZGVkIGEgY2FzZSBmb3IgZmlsZSBtYXRjaGluZyBzaW5jZSBgT2JqZWN0LmtleXNgIGRvZXNuJ3Qgd29yayB3aXRoIEZpbGVzLlxuICogKi9cbmZ1bmN0aW9uIGlzRXF1YWwoYSwgYikge1xuICAgIGlmIChhID09PSBiKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoYSAmJiBiICYmIHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby12YXJcbiAgICAgICAgdmFyIGxlbmd0aCwgaSwga2V5cztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICAgICAgICAgICAgaWYgKGxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgICAgICAgICAgaWYgKCFpc0VxdWFsKGFbaV0sIGJbaV0pKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIE1hcCAmJiBiIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZm9yIChpIG9mIGEuZW50cmllcygpKVxuICAgICAgICAgICAgICAgIGlmICghYi5oYXMoaVswXSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoaSBvZiBhLmVudHJpZXMoKSlcbiAgICAgICAgICAgICAgICBpZiAoIWlzRXF1YWwoaVsxXSwgYi5nZXQoaVswXSkpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBhZGRlZCB0aGlzIHBhcnQgZm9yIGZpbGUgY29tcGFyaXNvbiwgYXJndWFibHkgYSBsaXR0bGUgbmFpdmUgYnV0IHNob3VsZCB3b3JrIGZvciBtb3N0IGNhc2VzLlxuICAgICAgICAvLyAjMzkxMVxuICAgICAgICBpZiAoaXNGaWxlKGEpICYmIGlzRmlsZShiKSkge1xuICAgICAgICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChhLm5hbWUgIT09IGIubmFtZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoYS5sYXN0TW9kaWZpZWQgIT09IGIubGFzdE1vZGlmaWVkKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChhLnR5cGUgIT09IGIudHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIFNldCAmJiBiIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZm9yIChpIG9mIGEuZW50cmllcygpKVxuICAgICAgICAgICAgICAgIGlmICghYi5oYXMoaVswXSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoYSkgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGIpKSB7XG4gICAgICAgICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgICAgICAgICAgIGlmIChsZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgICAgICAgICAgIGlmIChhW2ldICE9PSBiW2ldKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5jb25zdHJ1Y3RvciA9PT0gUmVnRXhwKVxuICAgICAgICAgICAgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmZsYWdzID09PSBiLmZsYWdzO1xuICAgICAgICBpZiAoYS52YWx1ZU9mICE9PSBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YpXG4gICAgICAgICAgICByZXR1cm4gYS52YWx1ZU9mKCkgPT09IGIudmFsdWVPZigpO1xuICAgICAgICBpZiAoYS50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZylcbiAgICAgICAgICAgIHJldHVybiBhLnRvU3RyaW5nKCkgPT09IGIudG9TdHJpbmcoKTtcbiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgICAgICBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXlzW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXZhclxuICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICBpZiAoIWlzRXF1YWwoYVtrZXldLCBiW2tleV0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gdHJ1ZSBpZiBib3RoIE5hTiwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIHJldHVybiBhICE9PSBhICYmIGIgIT09IGI7XG59XG5mdW5jdGlvbiBpc0ZpbGUoYSkge1xuICAgIGlmICghaXNDbGllbnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gYSBpbnN0YW5jZW9mIEZpbGU7XG59XG5cbmZ1bmN0aW9uIHNldChvYmosIGtleSwgdmFsKSB7XG5cdGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnb2JqZWN0JykgdmFsLnZhbHVlID0ga2xvbmEodmFsLnZhbHVlKTtcblx0aWYgKCF2YWwuZW51bWVyYWJsZSB8fCB2YWwuZ2V0IHx8IHZhbC5zZXQgfHwgIXZhbC5jb25maWd1cmFibGUgfHwgIXZhbC53cml0YWJsZSB8fCBrZXkgPT09ICdfX3Byb3RvX18nKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWwpO1xuXHR9IGVsc2Ugb2JqW2tleV0gPSB2YWwudmFsdWU7XG59XG5cbmZ1bmN0aW9uIGtsb25hKHgpIHtcblx0aWYgKHR5cGVvZiB4ICE9PSAnb2JqZWN0JykgcmV0dXJuIHg7XG5cblx0dmFyIGk9MCwgaywgbGlzdCwgdG1wLCBzdHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpO1xuXG5cdGlmIChzdHIgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG5cdFx0dG1wID0gT2JqZWN0LmNyZWF0ZSh4Ll9fcHJvdG9fXyB8fCBudWxsKTtcblx0fSBlbHNlIGlmIChzdHIgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcblx0XHR0bXAgPSBBcnJheSh4Lmxlbmd0aCk7XG5cdH0gZWxzZSBpZiAoc3RyID09PSAnW29iamVjdCBTZXRdJykge1xuXHRcdHRtcCA9IG5ldyBTZXQ7XG5cdFx0eC5mb3JFYWNoKGZ1bmN0aW9uICh2YWwpIHtcblx0XHRcdHRtcC5hZGQoa2xvbmEodmFsKSk7XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAoc3RyID09PSAnW29iamVjdCBNYXBdJykge1xuXHRcdHRtcCA9IG5ldyBNYXA7XG5cdFx0eC5mb3JFYWNoKGZ1bmN0aW9uICh2YWwsIGtleSkge1xuXHRcdFx0dG1wLnNldChrbG9uYShrZXkpLCBrbG9uYSh2YWwpKTtcblx0XHR9KTtcblx0fSBlbHNlIGlmIChzdHIgPT09ICdbb2JqZWN0IERhdGVdJykge1xuXHRcdHRtcCA9IG5ldyBEYXRlKCt4KTtcblx0fSBlbHNlIGlmIChzdHIgPT09ICdbb2JqZWN0IFJlZ0V4cF0nKSB7XG5cdFx0dG1wID0gbmV3IFJlZ0V4cCh4LnNvdXJjZSwgeC5mbGFncyk7XG5cdH0gZWxzZSBpZiAoc3RyID09PSAnW29iamVjdCBEYXRhVmlld10nKSB7XG5cdFx0dG1wID0gbmV3IHguY29uc3RydWN0b3IoIGtsb25hKHguYnVmZmVyKSApO1xuXHR9IGVsc2UgaWYgKHN0ciA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuXHRcdHRtcCA9IHguc2xpY2UoMCk7XG5cdH0gZWxzZSBpZiAoc3RyLnNsaWNlKC02KSA9PT0gJ0FycmF5XScpIHtcblx0XHQvLyBBcnJheUJ1ZmZlci5pc1ZpZXcoeClcblx0XHQvLyB+PiBgbmV3YCBiY3V6IGBCdWZmZXIuc2xpY2VgID0+IHJlZlxuXHRcdHRtcCA9IG5ldyB4LmNvbnN0cnVjdG9yKHgpO1xuXHR9XG5cblx0aWYgKHRtcCkge1xuXHRcdGZvciAobGlzdD1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHgpOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuXHRcdFx0c2V0KHRtcCwgbGlzdFtpXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih4LCBsaXN0W2ldKSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChpPTAsIGxpc3Q9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoeCk7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodG1wLCBrPWxpc3RbaV0pICYmIHRtcFtrXSA9PT0geFtrXSkgY29udGludWU7XG5cdFx0XHRzZXQodG1wLCBrLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHgsIGspKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG1wIHx8IHg7XG59XG5cbmZ1bmN0aW9uIGNsZWFudXBOb25OZXN0ZWRQYXRoKHBhdGgpIHtcbiAgICBpZiAoaXNOb3ROZXN0ZWRQYXRoKHBhdGgpKSB7XG4gICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcW3xcXF0vZ2ksICcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG59XG5mdW5jdGlvbiBnZXRGcm9tUGF0aChvYmplY3QsIHBhdGgsIGZhbGxiYWNrKSB7XG4gICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgIH1cbiAgICBpZiAoaXNOb3ROZXN0ZWRQYXRoKHBhdGgpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3RbY2xlYW51cE5vbk5lc3RlZFBhdGgocGF0aCldO1xuICAgIH1cbiAgICBjb25zdCByZXNvbHZlZFZhbHVlID0gKHBhdGggfHwgJycpXG4gICAgICAgIC5zcGxpdCgvXFwufFxcWyhcXGQrKVxcXS8pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLnJlZHVjZSgoYWNjLCBwcm9wS2V5KSA9PiB7XG4gICAgICAgIGlmIChpc0NvbnRhaW5lclZhbHVlKGFjYykgJiYgcHJvcEtleSBpbiBhY2MpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2NbcHJvcEtleV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgIH0sIG9iamVjdCk7XG4gICAgcmV0dXJuIHJlc29sdmVkVmFsdWU7XG59XG4vKipcbiAqIFNldHMgYSBuZXN0ZWQgcHJvcGVydHkgdmFsdWUgaW4gYSBwYXRoLCBjcmVhdGVzIHRoZSBwYXRoIHByb3BlcnRpZXMgaWYgaXQgZG9lc24ndCBleGlzdFxuICovXG5mdW5jdGlvbiBzZXRJblBhdGgob2JqZWN0LCBwYXRoLCB2YWx1ZSkge1xuICAgIGlmIChpc05vdE5lc3RlZFBhdGgocGF0aCkpIHtcbiAgICAgICAgb2JqZWN0W2NsZWFudXBOb25OZXN0ZWRQYXRoKHBhdGgpXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KC9cXC58XFxbKFxcZCspXFxdLykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBhY2MgPSBvYmplY3Q7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIExhc3Qga2V5LCBzZXQgaXRcbiAgICAgICAgaWYgKGkgPT09IGtleXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgYWNjW2tleXNbaV1dID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gS2V5IGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgYSBjb250YWluZXIgZm9yIGl0XG4gICAgICAgIGlmICghKGtleXNbaV0gaW4gYWNjKSB8fCBpc051bGxPclVuZGVmaW5lZChhY2Nba2V5c1tpXV0pKSB7XG4gICAgICAgICAgICAvLyBjb250YWluZXIgY2FuIGJlIGVpdGhlciBhbiBvYmplY3Qgb3IgYW4gYXJyYXkgZGVwZW5kaW5nIG9uIHRoZSBuZXh0IGtleSBpZiBpdCBleGlzdHNcbiAgICAgICAgICAgIGFjY1trZXlzW2ldXSA9IGlzSW5kZXgoa2V5c1tpICsgMV0pID8gW10gOiB7fTtcbiAgICAgICAgfVxuICAgICAgICBhY2MgPSBhY2Nba2V5c1tpXV07XG4gICAgfVxufVxuZnVuY3Rpb24gdW5zZXQob2JqZWN0LCBrZXkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpICYmIGlzSW5kZXgoa2V5KSkge1xuICAgICAgICBvYmplY3Quc3BsaWNlKE51bWJlcihrZXkpLCAxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICBkZWxldGUgb2JqZWN0W2tleV07XG4gICAgfVxufVxuLyoqXG4gKiBSZW1vdmVzIGEgbmVzdGVkIHByb3BlcnR5IGZyb20gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIHVuc2V0UGF0aChvYmplY3QsIHBhdGgpIHtcbiAgICBpZiAoaXNOb3ROZXN0ZWRQYXRoKHBhdGgpKSB7XG4gICAgICAgIGRlbGV0ZSBvYmplY3RbY2xlYW51cE5vbk5lc3RlZFBhdGgocGF0aCldO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KC9cXC58XFxbKFxcZCspXFxdLykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBhY2MgPSBvYmplY3Q7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIExhc3Qga2V5LCB1bnNldCBpdFxuICAgICAgICBpZiAoaSA9PT0ga2V5cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICB1bnNldChhY2MsIGtleXNbaV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gS2V5IGRvZXMgbm90IGV4aXN0LCBleGl0XG4gICAgICAgIGlmICghKGtleXNbaV0gaW4gYWNjKSB8fCBpc051bGxPclVuZGVmaW5lZChhY2Nba2V5c1tpXV0pKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBhY2MgPSBhY2Nba2V5c1tpXV07XG4gICAgfVxuICAgIGNvbnN0IHBhdGhWYWx1ZXMgPSBrZXlzLm1hcCgoXywgaWR4KSA9PiB7XG4gICAgICAgIHJldHVybiBnZXRGcm9tUGF0aChvYmplY3QsIGtleXMuc2xpY2UoMCwgaWR4KS5qb2luKCcuJykpO1xuICAgIH0pO1xuICAgIGZvciAobGV0IGkgPSBwYXRoVmFsdWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmICghaXNFbXB0eUNvbnRhaW5lcihwYXRoVmFsdWVzW2ldKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgIHVuc2V0KG9iamVjdCwga2V5c1swXSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB1bnNldChwYXRoVmFsdWVzW2kgLSAxXSwga2V5c1tpIC0gMV0pO1xuICAgIH1cbn1cbi8qKlxuICogQSB0eXBlZCB2ZXJzaW9uIG9mIE9iamVjdC5rZXlzXG4gKi9cbmZ1bmN0aW9uIGtleXNPZihyZWNvcmQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVjb3JkKTtcbn1cbi8vIFVzZXMgc2FtZSBjb21wb25lbnQgcHJvdmlkZSBhcyBpdHMgb3duIGluamVjdGlvbnNcbi8vIER1ZSB0byBjaGFuZ2VzIGluIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtbmV4dC9wdWxsLzI0MjRcbmZ1bmN0aW9uIGluamVjdFdpdGhTZWxmKHN5bWJvbCwgZGVmID0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgdm0gPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICByZXR1cm4gKHZtID09PSBudWxsIHx8IHZtID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2bS5wcm92aWRlc1tzeW1ib2xdKSB8fCBpbmplY3Qoc3ltYm9sLCBkZWYpO1xufVxuZnVuY3Rpb24gd2FybihtZXNzYWdlKSB7XG4gICAgd2FybiQxKGBbdmVlLXZhbGlkYXRlXTogJHttZXNzYWdlfWApO1xufVxuLyoqXG4gKiBFbnN1cmVzIHdlIGRlYWwgd2l0aCBhIHNpbmd1bGFyIGZpZWxkIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZpZWxkKGZpZWxkKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQpKSB7XG4gICAgICAgIHJldHVybiBmaWVsZFswXTtcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkO1xufVxuZnVuY3Rpb24gcmVzb2x2ZU5leHRDaGVja2JveFZhbHVlKGN1cnJlbnRWYWx1ZSwgY2hlY2tlZFZhbHVlLCB1bmNoZWNrZWRWYWx1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsID0gWy4uLmN1cnJlbnRWYWx1ZV07XG4gICAgICAgIC8vIFVzZSBpc0VxdWFsIHNpbmNlIGNoZWNrZWQgb2JqZWN0IHZhbHVlcyBjYW4gcG9zc2libHkgZmFpbCB0aGUgZXF1YWxpdHkgY2hlY2sgIzM4ODNcbiAgICAgICAgY29uc3QgaWR4ID0gbmV3VmFsLmZpbmRJbmRleCh2ID0+IGlzRXF1YWwodiwgY2hlY2tlZFZhbHVlKSk7XG4gICAgICAgIGlkeCA+PSAwID8gbmV3VmFsLnNwbGljZShpZHgsIDEpIDogbmV3VmFsLnB1c2goY2hlY2tlZFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ld1ZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGlzRXF1YWwoY3VycmVudFZhbHVlLCBjaGVja2VkVmFsdWUpID8gdW5jaGVja2VkVmFsdWUgOiBjaGVja2VkVmFsdWU7XG59XG4vKipcbiAqIENyZWF0ZXMgYSB0aHJvdHRsZWQgZnVuY3Rpb24gdGhhdCBvbmx5IGludm9rZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIChgZnVuY2ApIGF0IG1vc3Qgb25jZSBwZXIgd2l0aGluIGEgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kc1xuICogKGBsaW1pdGApXG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIGxpbWl0KSB7XG4gICAgbGV0IGluVGhyb3R0bGU7XG4gICAgbGV0IGxhc3RSZXN1bHQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcztcbiAgICAgICAgaWYgKCFpblRocm90dGxlKSB7XG4gICAgICAgICAgICBpblRocm90dGxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gKGluVGhyb3R0bGUgPSBmYWxzZSksIGxpbWl0KTtcbiAgICAgICAgICAgIGxhc3RSZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXN0UmVzdWx0O1xuICAgIH07XG59XG5mdW5jdGlvbiBkZWJvdW5jZUFzeW5jKGlubmVyLCBtcyA9IDApIHtcbiAgICBsZXQgdGltZXIgPSBudWxsO1xuICAgIGxldCByZXNvbHZlcyA9IFtdO1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAvLyBSdW4gdGhlIGZ1bmN0aW9uIGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZVxuICAgICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSByZXN1bHQgb2YgdGhlIGlubmVyIGZ1bmN0aW9uLCB0aGVuIGFwcGx5IGl0IHRvIHRoZSByZXNvbHZlIGZ1bmN0aW9uIG9mXG4gICAgICAgICAgICAvLyBlYWNoIHByb21pc2UgdGhhdCBoYXMgYmVlbiBjcmVhdGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGlubmVyIGZ1bmN0aW9uIHdhcyBydW5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGlubmVyKC4uLmFyZ3MpO1xuICAgICAgICAgICAgcmVzb2x2ZXMuZm9yRWFjaChyID0+IHIocmVzdWx0KSk7XG4gICAgICAgICAgICByZXNvbHZlcyA9IFtdO1xuICAgICAgICB9LCBtcyk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJlc29sdmVzLnB1c2gocmVzb2x2ZSkpO1xuICAgIH07XG59XG5mdW5jdGlvbiBhcHBseU1vZGVsTW9kaWZpZXJzKHZhbHVlLCBtb2RpZmllcnMpIHtcbiAgICBpZiAoIWlzT2JqZWN0KG1vZGlmaWVycykpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAobW9kaWZpZXJzLm51bWJlcikge1xuICAgICAgICByZXR1cm4gdG9OdW1iZXIodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiB3aXRoTGF0ZXN0KGZuLCBvbkRvbmUpIHtcbiAgICBsZXQgbGF0ZXN0UnVuO1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBydW5MYXRlc3QoLi4uYXJncykge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gZm4oLi4uYXJncyk7XG4gICAgICAgIGxhdGVzdFJ1biA9IHBlbmRpbmc7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBlbmRpbmc7XG4gICAgICAgIGlmIChwZW5kaW5nICE9PSBsYXRlc3RSdW4pIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgbGF0ZXN0UnVuID0gdW5kZWZpbmVkO1xuICAgICAgICBvbkRvbmUocmVzdWx0LCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xufVxuZnVuY3Rpb24gY29tcHV0ZWREZWVwKHsgZ2V0LCBzZXQgfSkge1xuICAgIGNvbnN0IGJhc2VSZWYgPSByZWYoa2xvbmEoZ2V0KCkpKTtcbiAgICB3YXRjaChnZXQsIG5ld1ZhbHVlID0+IHtcbiAgICAgICAgaWYgKGlzRXF1YWwobmV3VmFsdWUsIGJhc2VSZWYudmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYmFzZVJlZi52YWx1ZSA9IGtsb25hKG5ld1ZhbHVlKTtcbiAgICB9LCB7XG4gICAgICAgIGRlZXA6IHRydWUsXG4gICAgfSk7XG4gICAgd2F0Y2goYmFzZVJlZiwgbmV3VmFsdWUgPT4ge1xuICAgICAgICBpZiAoaXNFcXVhbChuZXdWYWx1ZSwgZ2V0KCkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0KGtsb25hKG5ld1ZhbHVlKSk7XG4gICAgfSwge1xuICAgICAgICBkZWVwOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiBiYXNlUmVmO1xufVxuZnVuY3Rpb24gdW5yYXZlbCh2YWx1ZSkge1xuICAgIGlmIChpc0NhbGxhYmxlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHVucmVmKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGxhenlUb1JlZih2YWx1ZSkge1xuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiB1bnJhdmVsKHZhbHVlKSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5jb25zdCBub3JtYWxpemVDaGlsZHJlbiA9ICh0YWcsIGNvbnRleHQsIHNsb3RQcm9wcykgPT4ge1xuICAgIGlmICghY29udGV4dC5zbG90cy5kZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LnNsb3RzLmRlZmF1bHQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGFnID09PSAnc3RyaW5nJyB8fCAhdGFnKSB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LnNsb3RzLmRlZmF1bHQoc2xvdFByb3BzKCkpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiAoKSA9PiB7IHZhciBfYSwgX2I7IHJldHVybiAoX2IgPSAoX2EgPSBjb250ZXh0LnNsb3RzKS5kZWZhdWx0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgc2xvdFByb3BzKCkpOyB9LFxuICAgIH07XG59O1xuLyoqXG4gKiBWdWUgYWRkcyBhIGBfdmFsdWVgIHByb3AgYXQgdGhlIG1vbWVudCBvbiB0aGUgaW5wdXQgZWxlbWVudHMgdG8gc3RvcmUgdGhlIFJFQUwgdmFsdWUgb24gdGhlbSwgcmVhbCB2YWx1ZXMgYXJlIGRpZmZlcmVudCB0aGFuIHRoZSBgdmFsdWVgIGF0dHJpYnV0ZVxuICogYXMgdGhleSBkbyBub3QgZ2V0IGNhc3RlZCB0byBzdHJpbmdzIHVubGlrZSBgZWwudmFsdWVgIHdoaWNoIHByZXNlcnZlcyB1c2VyLWNvZGUgYmVoYXZpb3JcbiAqL1xuZnVuY3Rpb24gZ2V0Qm91bmRWYWx1ZShlbCkge1xuICAgIGlmIChoYXNWYWx1ZUJpbmRpbmcoZWwpKSB7XG4gICAgICAgIHJldHVybiBlbC5fdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG4vKipcbiAqIFZ1ZSBhZGRzIGEgYF92YWx1ZWAgcHJvcCBhdCB0aGUgbW9tZW50IG9uIHRoZSBpbnB1dCBlbGVtZW50cyB0byBzdG9yZSB0aGUgUkVBTCB2YWx1ZSBvbiB0aGVtLCByZWFsIHZhbHVlcyBhcmUgZGlmZmVyZW50IHRoYW4gdGhlIGB2YWx1ZWAgYXR0cmlidXRlXG4gKiBhcyB0aGV5IGRvIG5vdCBnZXQgY2FzdGVkIHRvIHN0cmluZ3MgdW5saWtlIGBlbC52YWx1ZWAgd2hpY2ggcHJlc2VydmVzIHVzZXItY29kZSBiZWhhdmlvclxuICovXG5mdW5jdGlvbiBoYXNWYWx1ZUJpbmRpbmcoZWwpIHtcbiAgICByZXR1cm4gJ192YWx1ZScgaW4gZWw7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV2ZW50VmFsdWUodmFsdWUpIHtcbiAgICBpZiAoIWlzRXZlbnQodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXQgPSB2YWx1ZS50YXJnZXQ7XG4gICAgLy8gVnVlIHNldHMgdGhlIGN1cnJlbnQgYm91bmQgdmFsdWUgb24gYF92YWx1ZWAgcHJvcFxuICAgIC8vIGZvciBjaGVja2JveGVzIGl0IGl0IHNob3VsZCBmZXRjaCB0aGUgdmFsdWUgYmluZGluZyB0eXBlIGFzIGlzIChib29sZWFuIGluc3RlYWQgb2Ygc3RyaW5nKVxuICAgIGlmIChoYXNDaGVja2VkQXR0cihpbnB1dC50eXBlKSAmJiBoYXNWYWx1ZUJpbmRpbmcoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBnZXRCb3VuZFZhbHVlKGlucHV0KTtcbiAgICB9XG4gICAgaWYgKGlucHV0LnR5cGUgPT09ICdmaWxlJyAmJiBpbnB1dC5maWxlcykge1xuICAgICAgICBjb25zdCBmaWxlcyA9IEFycmF5LmZyb20oaW5wdXQuZmlsZXMpO1xuICAgICAgICByZXR1cm4gaW5wdXQubXVsdGlwbGUgPyBmaWxlcyA6IGZpbGVzWzBdO1xuICAgIH1cbiAgICBpZiAoaXNOYXRpdmVNdWx0aVNlbGVjdChpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oaW5wdXQub3B0aW9ucylcbiAgICAgICAgICAgIC5maWx0ZXIob3B0ID0+IG9wdC5zZWxlY3RlZCAmJiAhb3B0LmRpc2FibGVkKVxuICAgICAgICAgICAgLm1hcChnZXRCb3VuZFZhbHVlKTtcbiAgICB9XG4gICAgLy8gbWFrZXMgc3VyZSB3ZSBnZXQgdGhlIGFjdHVhbCBgb3B0aW9uYCBib3VuZCB2YWx1ZVxuICAgIC8vICMzNDQwXG4gICAgaWYgKGlzTmF0aXZlU2VsZWN0KGlucHV0KSkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IEFycmF5LmZyb20oaW5wdXQub3B0aW9ucykuZmluZChvcHQgPT4gb3B0LnNlbGVjdGVkKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9uID8gZ2V0Qm91bmRWYWx1ZShzZWxlY3RlZE9wdGlvbikgOiBpbnB1dC52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0LnZhbHVlO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgdGhlIGdpdmVuIHJ1bGVzIGV4cHJlc3Npb24uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJ1bGVzKHJ1bGVzKSB7XG4gICAgY29uc3QgYWNjID0ge307XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFjYywgJ18kJGlzTm9ybWFsaXplZCcsIHtcbiAgICAgICAgdmFsdWU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgaWYgKCFydWxlcykge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH1cbiAgICAvLyBPYmplY3QgaXMgYWxyZWFkeSBub3JtYWxpemVkLCBza2lwLlxuICAgIGlmIChpc09iamVjdChydWxlcykgJiYgcnVsZXMuXyQkaXNOb3JtYWxpemVkKSB7XG4gICAgICAgIHJldHVybiBydWxlcztcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0KHJ1bGVzKSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMocnVsZXMpLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gbm9ybWFsaXplUGFyYW1zKHJ1bGVzW2N1cnJdKTtcbiAgICAgICAgICAgIGlmIChydWxlc1tjdXJyXSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBwcmV2W2N1cnJdID0gYnVpbGRQYXJhbXMocGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICB9LCBhY2MpO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodHlwZW9mIHJ1bGVzICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH1cbiAgICByZXR1cm4gcnVsZXMuc3BsaXQoJ3wnKS5yZWR1Y2UoKHByZXYsIHJ1bGUpID0+IHtcbiAgICAgICAgY29uc3QgcGFyc2VkUnVsZSA9IHBhcnNlUnVsZShydWxlKTtcbiAgICAgICAgaWYgKCFwYXJzZWRSdWxlLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICB9XG4gICAgICAgIHByZXZbcGFyc2VkUnVsZS5uYW1lXSA9IGJ1aWxkUGFyYW1zKHBhcnNlZFJ1bGUucGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgfSwgYWNjKTtcbn1cbi8qKlxuICogTm9ybWFsaXplcyBhIHJ1bGUgcGFyYW0uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpIHtcbiAgICBpZiAocGFyYW1zID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zKSkge1xuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3QocGFyYW1zKSkge1xuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbiAgICByZXR1cm4gW3BhcmFtc107XG59XG5mdW5jdGlvbiBidWlsZFBhcmFtcyhwcm92aWRlZCkge1xuICAgIGNvbnN0IG1hcFZhbHVlVG9Mb2NhdG9yID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIC8vIEEgdGFyZ2V0IHBhcmFtIHVzaW5nIGludGVycG9sYXRpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWVbMF0gPT09ICdAJykge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2F0b3IodmFsdWUuc2xpY2UoMSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3ZpZGVkKSkge1xuICAgICAgICByZXR1cm4gcHJvdmlkZWQubWFwKG1hcFZhbHVlVG9Mb2NhdG9yKTtcbiAgICB9XG4gICAgLy8gIzMwNzNcbiAgICBpZiAocHJvdmlkZWQgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgcmV0dXJuIFtwcm92aWRlZF07XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhwcm92aWRlZCkucmVkdWNlKChwcmV2LCBrZXkpID0+IHtcbiAgICAgICAgcHJldltrZXldID0gbWFwVmFsdWVUb0xvY2F0b3IocHJvdmlkZWRba2V5XSk7XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgIH0sIHt9KTtcbn1cbi8qKlxuICogUGFyc2VzIGEgcnVsZSBzdHJpbmcgZXhwcmVzc2lvbi5cbiAqL1xuY29uc3QgcGFyc2VSdWxlID0gKHJ1bGUpID0+IHtcbiAgICBsZXQgcGFyYW1zID0gW107XG4gICAgY29uc3QgbmFtZSA9IHJ1bGUuc3BsaXQoJzonKVswXTtcbiAgICBpZiAocnVsZS5pbmNsdWRlcygnOicpKSB7XG4gICAgICAgIHBhcmFtcyA9IHJ1bGUuc3BsaXQoJzonKS5zbGljZSgxKS5qb2luKCc6Jykuc3BsaXQoJywnKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbmFtZSwgcGFyYW1zIH07XG59O1xuZnVuY3Rpb24gY3JlYXRlTG9jYXRvcih2YWx1ZSkge1xuICAgIGNvbnN0IGxvY2F0b3IgPSAoY3Jvc3NUYWJsZSkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSBnZXRGcm9tUGF0aChjcm9zc1RhYmxlLCB2YWx1ZSkgfHwgY3Jvc3NUYWJsZVt2YWx1ZV07XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcbiAgICBsb2NhdG9yLl9fbG9jYXRvclJlZiA9IHZhbHVlO1xuICAgIHJldHVybiBsb2NhdG9yO1xufVxuZnVuY3Rpb24gZXh0cmFjdExvY2F0b3JzKHBhcmFtcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcykpIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtcy5maWx0ZXIoaXNMb2NhdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXNPZihwYXJhbXMpXG4gICAgICAgIC5maWx0ZXIoa2V5ID0+IGlzTG9jYXRvcihwYXJhbXNba2V5XSkpXG4gICAgICAgIC5tYXAoa2V5ID0+IHBhcmFtc1trZXldKTtcbn1cblxuY29uc3QgREVGQVVMVF9DT05GSUcgPSB7XG4gICAgZ2VuZXJhdGVNZXNzYWdlOiAoeyBmaWVsZCB9KSA9PiBgJHtmaWVsZH0gaXMgbm90IHZhbGlkLmAsXG4gICAgYmFpbHM6IHRydWUsXG4gICAgdmFsaWRhdGVPbkJsdXI6IHRydWUsXG4gICAgdmFsaWRhdGVPbkNoYW5nZTogdHJ1ZSxcbiAgICB2YWxpZGF0ZU9uSW5wdXQ6IGZhbHNlLFxuICAgIHZhbGlkYXRlT25Nb2RlbFVwZGF0ZTogdHJ1ZSxcbn07XG5sZXQgY3VycmVudENvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHKTtcbmNvbnN0IGdldENvbmZpZyA9ICgpID0+IGN1cnJlbnRDb25maWc7XG5jb25zdCBzZXRDb25maWcgPSAobmV3Q29uZikgPT4ge1xuICAgIGN1cnJlbnRDb25maWcgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGN1cnJlbnRDb25maWcpLCBuZXdDb25mKTtcbn07XG5jb25zdCBjb25maWd1cmUgPSBzZXRDb25maWc7XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgdmFsdWUgYWdhaW5zdCB0aGUgcnVsZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlKHZhbHVlLCBydWxlcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgc2hvdWxkQmFpbCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5iYWlscztcbiAgICBjb25zdCBmaWVsZCA9IHtcbiAgICAgICAgbmFtZTogKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5uYW1lKSB8fCAne2ZpZWxkfScsXG4gICAgICAgIHJ1bGVzLFxuICAgICAgICBsYWJlbDogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmxhYmVsLFxuICAgICAgICBiYWlsczogc2hvdWxkQmFpbCAhPT0gbnVsbCAmJiBzaG91bGRCYWlsICE9PSB2b2lkIDAgPyBzaG91bGRCYWlsIDogdHJ1ZSxcbiAgICAgICAgZm9ybURhdGE6IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudmFsdWVzKSB8fCB7fSxcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF92YWxpZGF0ZShmaWVsZCwgdmFsdWUpO1xuICAgIGNvbnN0IGVycm9ycyA9IHJlc3VsdC5lcnJvcnM7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3JzLFxuICAgICAgICB2YWxpZDogIWVycm9ycy5sZW5ndGgsXG4gICAgfTtcbn1cbi8qKlxuICogU3RhcnRzIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3MuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIF92YWxpZGF0ZShmaWVsZCwgdmFsdWUpIHtcbiAgICBpZiAoaXNUeXBlZFNjaGVtYShmaWVsZC5ydWxlcykgfHwgaXNZdXBWYWxpZGF0b3IoZmllbGQucnVsZXMpKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZUZpZWxkV2l0aFR5cGVkU2NoZW1hKHZhbHVlLCBmaWVsZC5ydWxlcyk7XG4gICAgfVxuICAgIC8vIGlmIGEgZ2VuZXJpYyBmdW5jdGlvbiBvciBjaGFpbiBvZiBnZW5lcmljIGZ1bmN0aW9uc1xuICAgIGlmIChpc0NhbGxhYmxlKGZpZWxkLnJ1bGVzKSB8fCBBcnJheS5pc0FycmF5KGZpZWxkLnJ1bGVzKSkge1xuICAgICAgICBjb25zdCBjdHggPSB7XG4gICAgICAgICAgICBmaWVsZDogZmllbGQubGFiZWwgfHwgZmllbGQubmFtZSxcbiAgICAgICAgICAgIG5hbWU6IGZpZWxkLm5hbWUsXG4gICAgICAgICAgICBsYWJlbDogZmllbGQubGFiZWwsXG4gICAgICAgICAgICBmb3JtOiBmaWVsZC5mb3JtRGF0YSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICB9O1xuICAgICAgICAvLyBOb3JtYWxpemUgdGhlIHBpcGVsaW5lXG4gICAgICAgIGNvbnN0IHBpcGVsaW5lID0gQXJyYXkuaXNBcnJheShmaWVsZC5ydWxlcykgPyBmaWVsZC5ydWxlcyA6IFtmaWVsZC5ydWxlc107XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHBpcGVsaW5lLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSBwaXBlbGluZVtpXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bGUodmFsdWUsIGN0eCk7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gdHlwZW9mIHJlc3VsdCAhPT0gJ3N0cmluZycgJiYgcmVzdWx0O1xuICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyA/IHJlc3VsdCA6IF9nZW5lcmF0ZUZpZWxkRXJyb3IoY3R4KTtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgaWYgKGZpZWxkLmJhaWxzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9ycyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZENvbnRleHQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGZpZWxkKSwgeyBydWxlczogbm9ybWFsaXplUnVsZXMoZmllbGQucnVsZXMpIH0pO1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgIGNvbnN0IHJ1bGVzS2V5cyA9IE9iamVjdC5rZXlzKG5vcm1hbGl6ZWRDb250ZXh0LnJ1bGVzKTtcbiAgICBjb25zdCBsZW5ndGggPSBydWxlc0tleXMubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcnVsZSA9IHJ1bGVzS2V5c1tpXTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgX3Rlc3Qobm9ybWFsaXplZENvbnRleHQsIHZhbHVlLCB7XG4gICAgICAgICAgICBuYW1lOiBydWxlLFxuICAgICAgICAgICAgcGFyYW1zOiBub3JtYWxpemVkQ29udGV4dC5ydWxlc1tydWxlXSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgICBpZiAoZmllbGQuYmFpbHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcnMsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGlzWXVwRXJyb3IoZXJyKSB7XG4gICAgcmV0dXJuICEhZXJyICYmIGVyci5uYW1lID09PSAnVmFsaWRhdGlvbkVycm9yJztcbn1cbmZ1bmN0aW9uIHl1cFRvVHlwZWRTY2hlbWEoeXVwU2NoZW1hKSB7XG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgICBfX3R5cGU6ICdWVlR5cGVkU2NoZW1hJyxcbiAgICAgICAgYXN5bmMgcGFyc2UodmFsdWVzKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHl1cFNjaGVtYS52YWxpZGF0ZSh2YWx1ZXMsIHsgYWJvcnRFYXJseTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gWXVwIGVycm9ycyBoYXZlIGEgbmFtZSBwcm9wIG9uZSB0aGVtLlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlbnNlL3l1cCN2YWxpZGF0aW9uZXJyb3JlcnJvcnMtc3RyaW5nLS1hcnJheXN0cmluZy12YWx1ZS1hbnktcGF0aC1zdHJpbmdcbiAgICAgICAgICAgICAgICBpZiAoIWlzWXVwRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghKChfYSA9IGVyci5pbm5lcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCkgJiYgZXJyLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3JzOiBbeyBwYXRoOiBlcnIucGF0aCwgZXJyb3JzOiBlcnIuZXJyb3JzIH1dIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IGVyci5pbm5lci5yZWR1Y2UoKGFjYywgY3VycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gY3Vyci5wYXRoIHx8ICcnO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFjY1twYXRoXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjW3BhdGhdID0geyBlcnJvcnM6IFtdLCBwYXRoIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWNjW3BhdGhdLmVycm9ycy5wdXNoKC4uLmN1cnIuZXJyb3JzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3JzOiBPYmplY3QudmFsdWVzKGVycm9ycykgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiBzY2hlbWE7XG59XG4vKipcbiAqIEhhbmRsZXMgeXVwIHZhbGlkYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVGaWVsZFdpdGhUeXBlZFNjaGVtYSh2YWx1ZSwgc2NoZW1hKSB7XG4gICAgY29uc3QgdHlwZWRTY2hlbWEgPSBpc1R5cGVkU2NoZW1hKHNjaGVtYSkgPyBzY2hlbWEgOiB5dXBUb1R5cGVkU2NoZW1hKHNjaGVtYSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHlwZWRTY2hlbWEucGFyc2UodmFsdWUpO1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gW107XG4gICAgZm9yIChjb25zdCBlcnJvciBvZiByZXN1bHQuZXJyb3JzKSB7XG4gICAgICAgIGlmIChlcnJvci5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBtZXNzYWdlcy5wdXNoKC4uLmVycm9yLmVycm9ycyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3JzOiBtZXNzYWdlcyxcbiAgICB9O1xufVxuLyoqXG4gKiBUZXN0cyBhIHNpbmdsZSBpbnB1dCB2YWx1ZSBhZ2FpbnN0IGEgcnVsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gX3Rlc3QoZmllbGQsIHZhbHVlLCBydWxlKSB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gcmVzb2x2ZVJ1bGUocnVsZS5uYW1lKTtcbiAgICBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggdmFsaWRhdG9yICcke3J1bGUubmFtZX0nIGV4aXN0cy5gKTtcbiAgICB9XG4gICAgY29uc3QgcGFyYW1zID0gZmlsbFRhcmdldFZhbHVlcyhydWxlLnBhcmFtcywgZmllbGQuZm9ybURhdGEpO1xuICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgZmllbGQ6IGZpZWxkLmxhYmVsIHx8IGZpZWxkLm5hbWUsXG4gICAgICAgIG5hbWU6IGZpZWxkLm5hbWUsXG4gICAgICAgIGxhYmVsOiBmaWVsZC5sYWJlbCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGZvcm06IGZpZWxkLmZvcm1EYXRhLFxuICAgICAgICBydWxlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJ1bGUpLCB7IHBhcmFtcyB9KSxcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZhbGlkYXRvcih2YWx1ZSwgcGFyYW1zLCBjdHgpO1xuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyb3I6IHJlc3VsdCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6IHJlc3VsdCA/IHVuZGVmaW5lZCA6IF9nZW5lcmF0ZUZpZWxkRXJyb3IoY3R4KSxcbiAgICB9O1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgZXJyb3IgbWVzc2FnZXMuXG4gKi9cbmZ1bmN0aW9uIF9nZW5lcmF0ZUZpZWxkRXJyb3IoZmllbGRDdHgpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZ2V0Q29uZmlnKCkuZ2VuZXJhdGVNZXNzYWdlO1xuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gJ0ZpZWxkIGlzIGludmFsaWQnO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZShmaWVsZEN0eCk7XG59XG5mdW5jdGlvbiBmaWxsVGFyZ2V0VmFsdWVzKHBhcmFtcywgY3Jvc3NUYWJsZSkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZSA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoaXNMb2NhdG9yKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlKGNyb3NzVGFibGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcykpIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtcy5tYXAobm9ybWFsaXplKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHBhcmFtcykucmVkdWNlKChhY2MsIHBhcmFtKSA9PiB7XG4gICAgICAgIGFjY1twYXJhbV0gPSBub3JtYWxpemUocGFyYW1zW3BhcmFtXSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xufVxuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVUeXBlZFNjaGVtYShzY2hlbWEsIHZhbHVlcykge1xuICAgIGNvbnN0IHR5cGVkU2NoZW1hID0gaXNUeXBlZFNjaGVtYShzY2hlbWEpID8gc2NoZW1hIDogeXVwVG9UeXBlZFNjaGVtYShzY2hlbWEpO1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0eXBlZFNjaGVtYS5wYXJzZSh2YWx1ZXMpO1xuICAgIGNvbnN0IHJlc3VsdHMgPSB7fTtcbiAgICBjb25zdCBlcnJvcnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGVycm9yIG9mIHZhbGlkYXRpb25SZXN1bHQuZXJyb3JzKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gZXJyb3IuZXJyb3JzO1xuICAgICAgICAvLyBGaXhlcyBpc3N1ZSB3aXRoIHBhdGggbWFwcGluZyB3aXRoIFl1cCAxLjAgaW5jbHVkaW5nIHF1b3RlcyBhcm91bmQgYXJyYXkgaW5kaWNlc1xuICAgICAgICBjb25zdCBwYXRoID0gKGVycm9yLnBhdGggfHwgJycpLnJlcGxhY2UoL1xcW1wiKFxcZCspXCJcXF0vZywgKF8sIG0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7bX1dYDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdHNbcGF0aF0gPSB7IHZhbGlkOiAhbWVzc2FnZXMubGVuZ3RoLCBlcnJvcnM6IG1lc3NhZ2VzIH07XG4gICAgICAgIGlmIChtZXNzYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVycm9yc1twYXRoXSA9IG1lc3NhZ2VzWzBdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiAhdmFsaWRhdGlvblJlc3VsdC5lcnJvcnMubGVuZ3RoLFxuICAgICAgICByZXN1bHRzLFxuICAgICAgICBlcnJvcnMsXG4gICAgICAgIHZhbHVlczogdmFsaWRhdGlvblJlc3VsdC52YWx1ZSxcbiAgICB9O1xufVxuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVPYmplY3RTY2hlbWEoc2NoZW1hLCB2YWx1ZXMsIG9wdHMpIHtcbiAgICBjb25zdCBwYXRocyA9IGtleXNPZihzY2hlbWEpO1xuICAgIGNvbnN0IHZhbGlkYXRpb25zID0gcGF0aHMubWFwKGFzeW5jIChwYXRoKSA9PiB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCBzdHJpbmdzID0gKF9hID0gb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLm5hbWVzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbcGF0aF07XG4gICAgICAgIGNvbnN0IGZpZWxkUmVzdWx0ID0gYXdhaXQgdmFsaWRhdGUoZ2V0RnJvbVBhdGgodmFsdWVzLCBwYXRoKSwgc2NoZW1hW3BhdGhdLCB7XG4gICAgICAgICAgICBuYW1lOiAoc3RyaW5ncyA9PT0gbnVsbCB8fCBzdHJpbmdzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHJpbmdzLm5hbWUpIHx8IHBhdGgsXG4gICAgICAgICAgICBsYWJlbDogc3RyaW5ncyA9PT0gbnVsbCB8fCBzdHJpbmdzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHJpbmdzLmxhYmVsLFxuICAgICAgICAgICAgdmFsdWVzOiB2YWx1ZXMsXG4gICAgICAgICAgICBiYWlsczogKF9jID0gKF9iID0gb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLmJhaWxzTWFwKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2JbcGF0aF0pICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBmaWVsZFJlc3VsdCksIHsgcGF0aCB9KTtcbiAgICB9KTtcbiAgICBsZXQgaXNBbGxWYWxpZCA9IHRydWU7XG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbCh2YWxpZGF0aW9ucyk7XG4gICAgY29uc3QgcmVzdWx0cyA9IHt9O1xuICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHZhbGlkYXRpb25SZXN1bHRzKSB7XG4gICAgICAgIHJlc3VsdHNbcmVzdWx0LnBhdGhdID0ge1xuICAgICAgICAgICAgdmFsaWQ6IHJlc3VsdC52YWxpZCxcbiAgICAgICAgICAgIGVycm9yczogcmVzdWx0LmVycm9ycyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFyZXN1bHQudmFsaWQpIHtcbiAgICAgICAgICAgIGlzQWxsVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGVycm9yc1tyZXN1bHQucGF0aF0gPSByZXN1bHQuZXJyb3JzWzBdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiBpc0FsbFZhbGlkLFxuICAgICAgICByZXN1bHRzLFxuICAgICAgICBlcnJvcnMsXG4gICAgfTtcbn1cblxubGV0IElEX0NPVU5URVIgPSAwO1xuZnVuY3Rpb24gdXNlRmllbGRTdGF0ZShwYXRoLCBpbml0KSB7XG4gICAgY29uc3QgeyB2YWx1ZSwgaW5pdGlhbFZhbHVlLCBzZXRJbml0aWFsVmFsdWUgfSA9IF91c2VGaWVsZFZhbHVlKHBhdGgsIGluaXQubW9kZWxWYWx1ZSwgaW5pdC5mb3JtKTtcbiAgICBjb25zdCB7IGVycm9yTWVzc2FnZSwgZXJyb3JzLCBzZXRFcnJvcnMgfSA9IF91c2VGaWVsZEVycm9ycyhwYXRoLCBpbml0LmZvcm0pO1xuICAgIGNvbnN0IG1ldGEgPSBfdXNlRmllbGRNZXRhKHZhbHVlLCBpbml0aWFsVmFsdWUsIGVycm9ycyk7XG4gICAgY29uc3QgaWQgPSBJRF9DT1VOVEVSID49IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSID8gMCA6ICsrSURfQ09VTlRFUjtcbiAgICBmdW5jdGlvbiBzZXRTdGF0ZShzdGF0ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICgndmFsdWUnIGluIHN0YXRlKSB7XG4gICAgICAgICAgICB2YWx1ZS52YWx1ZSA9IHN0YXRlLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICgnZXJyb3JzJyBpbiBzdGF0ZSkge1xuICAgICAgICAgICAgc2V0RXJyb3JzKHN0YXRlLmVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCd0b3VjaGVkJyBpbiBzdGF0ZSkge1xuICAgICAgICAgICAgbWV0YS50b3VjaGVkID0gKF9hID0gc3RhdGUudG91Y2hlZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbWV0YS50b3VjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICgnaW5pdGlhbFZhbHVlJyBpbiBzdGF0ZSkge1xuICAgICAgICAgICAgc2V0SW5pdGlhbFZhbHVlKHN0YXRlLmluaXRpYWxWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaWQsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpbml0aWFsVmFsdWUsXG4gICAgICAgIG1ldGEsXG4gICAgICAgIGVycm9ycyxcbiAgICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICAgICBzZXRTdGF0ZSxcbiAgICB9O1xufVxuLyoqXG4gKiBDcmVhdGVzIHRoZSBmaWVsZCB2YWx1ZSBhbmQgcmVzb2x2ZXMgdGhlIGluaXRpYWwgdmFsdWVcbiAqL1xuZnVuY3Rpb24gX3VzZUZpZWxkVmFsdWUocGF0aCwgbW9kZWxWYWx1ZSwgZm9ybSkge1xuICAgIGNvbnN0IG1vZGVsUmVmID0gcmVmKHVucmVmKG1vZGVsVmFsdWUpKTtcbiAgICBmdW5jdGlvbiByZXNvbHZlSW5pdGlhbFZhbHVlKCkge1xuICAgICAgICBpZiAoIWZvcm0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bnJlZihtb2RlbFJlZik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldEZyb21QYXRoKGZvcm0ubWV0YS52YWx1ZS5pbml0aWFsVmFsdWVzLCB1bnJlZihwYXRoKSwgdW5yZWYobW9kZWxSZWYpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0SW5pdGlhbFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmICghZm9ybSkge1xuICAgICAgICAgICAgbW9kZWxSZWYudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3JtLnN0YWdlSW5pdGlhbFZhbHVlKHVucmVmKHBhdGgpLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IGNvbXB1dGVkKHJlc29sdmVJbml0aWFsVmFsdWUpO1xuICAgIC8vIGlmIG5vIGZvcm0gaXMgYXNzb2NpYXRlZCwgdXNlIGEgcmVndWxhciByZWYuXG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmVmKHJlc29sdmVJbml0aWFsVmFsdWUoKSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGluaXRpYWxWYWx1ZSxcbiAgICAgICAgICAgIHNldEluaXRpYWxWYWx1ZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gdG8gc2V0IHRoZSBpbml0aWFsIHZhbHVlLCBmaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIGN1cnJlbnQgdmFsdWUsIGlmIHRoZXJlIGlzIHRoZW4gdXNlIGl0LlxuICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIGNvbmZpZ3VyZWQgaW5pdGlhbCB2YWx1ZSBpZiBpdCBleGlzdHMuXG4gICAgLy8gcHJpb3JpdGl6ZSBtb2RlbCB2YWx1ZSBvdmVyIGZvcm0gdmFsdWVzXG4gICAgLy8gIzM0MjlcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBtb2RlbFZhbHVlID8gdW5yZWYobW9kZWxWYWx1ZSkgOiBnZXRGcm9tUGF0aChmb3JtLnZhbHVlcywgdW5yZWYocGF0aCksIHVucmVmKGluaXRpYWxWYWx1ZSkpO1xuICAgIGZvcm0uc3RhZ2VJbml0aWFsVmFsdWUodW5yZWYocGF0aCksIGN1cnJlbnRWYWx1ZSwgdHJ1ZSk7XG4gICAgLy8gb3RoZXJ3aXNlIHVzZSBhIGNvbXB1dGVkIHNldHRlciB0aGF0IHRyaWdnZXJzIHRoZSBgc2V0RmllbGRWYWx1ZWBcbiAgICBjb25zdCB2YWx1ZSA9IGNvbXB1dGVkKHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldEZyb21QYXRoKGZvcm0udmFsdWVzLCB1bnJlZihwYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldChuZXdWYWwpIHtcbiAgICAgICAgICAgIGZvcm0uc2V0RmllbGRWYWx1ZSh1bnJlZihwYXRoKSwgbmV3VmFsKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaW5pdGlhbFZhbHVlLFxuICAgICAgICBzZXRJbml0aWFsVmFsdWUsXG4gICAgfTtcbn1cbi8qKlxuICogQ3JlYXRlcyBtZXRhIGZsYWdzIHN0YXRlIGFuZCBzb21lIGFzc29jaWF0ZWQgZWZmZWN0cyB3aXRoIHRoZW1cbiAqL1xuZnVuY3Rpb24gX3VzZUZpZWxkTWV0YShjdXJyZW50VmFsdWUsIGluaXRpYWxWYWx1ZSwgZXJyb3JzKSB7XG4gICAgY29uc3QgbWV0YSA9IHJlYWN0aXZlKHtcbiAgICAgICAgdG91Y2hlZDogZmFsc2UsXG4gICAgICAgIHBlbmRpbmc6IGZhbHNlLFxuICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgdmFsaWRhdGVkOiAhIXVucmVmKGVycm9ycykubGVuZ3RoLFxuICAgICAgICBpbml0aWFsVmFsdWU6IGNvbXB1dGVkKCgpID0+IHVucmVmKGluaXRpYWxWYWx1ZSkpLFxuICAgICAgICBkaXJ0eTogY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFpc0VxdWFsKHVucmVmKGN1cnJlbnRWYWx1ZSksIHVucmVmKGluaXRpYWxWYWx1ZSkpO1xuICAgICAgICB9KSxcbiAgICB9KTtcbiAgICB3YXRjaChlcnJvcnMsIHZhbHVlID0+IHtcbiAgICAgICAgbWV0YS52YWxpZCA9ICF2YWx1ZS5sZW5ndGg7XG4gICAgfSwge1xuICAgICAgICBpbW1lZGlhdGU6IHRydWUsXG4gICAgICAgIGZsdXNoOiAnc3luYycsXG4gICAgfSk7XG4gICAgcmV0dXJuIG1ldGE7XG59XG4vKipcbiAqIENyZWF0ZXMgdGhlIGVycm9yIG1lc3NhZ2Ugc3RhdGUgZm9yIHRoZSBmaWVsZCBzdGF0ZVxuICovXG5mdW5jdGlvbiBfdXNlRmllbGRFcnJvcnMocGF0aCwgZm9ybSkge1xuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUVycm9ycyhtZXNzYWdlcykge1xuICAgICAgICBpZiAoIW1lc3NhZ2VzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkobWVzc2FnZXMpID8gbWVzc2FnZXMgOiBbbWVzc2FnZXNdO1xuICAgIH1cbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gcmVmKFtdKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9ycyxcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZTogY29tcHV0ZWQoKCkgPT4gZXJyb3JzLnZhbHVlWzBdKSxcbiAgICAgICAgICAgIHNldEVycm9yczogKG1lc3NhZ2VzKSA9PiB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnZhbHVlID0gbm9ybWFsaXplRXJyb3JzKG1lc3NhZ2VzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGVycm9ycyA9IGNvbXB1dGVkKCgpID0+IGZvcm0uZXJyb3JCYWcudmFsdWVbdW5yZWYocGF0aCldIHx8IFtdKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcnMsXG4gICAgICAgIGVycm9yTWVzc2FnZTogY29tcHV0ZWQoKCkgPT4gZXJyb3JzLnZhbHVlWzBdKSxcbiAgICAgICAgc2V0RXJyb3JzOiAobWVzc2FnZXMpID0+IHtcbiAgICAgICAgICAgIGZvcm0uc2V0RmllbGRFcnJvckJhZyh1bnJlZihwYXRoKSwgbm9ybWFsaXplRXJyb3JzKG1lc3NhZ2VzKSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gaW5zdGFsbERldnRvb2xzUGx1Z2luKGFwcCkge1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgc2V0dXBEZXZ0b29sc1BsdWdpbih7XG4gICAgICAgICAgICBpZDogJ3ZlZS12YWxpZGF0ZS1kZXZ0b29scy1wbHVnaW4nLFxuICAgICAgICAgICAgbGFiZWw6ICdWZWVWYWxpZGF0ZSBQbHVnaW4nLFxuICAgICAgICAgICAgcGFja2FnZU5hbWU6ICd2ZWUtdmFsaWRhdGUnLFxuICAgICAgICAgICAgaG9tZXBhZ2U6ICdodHRwczovL3ZlZS12YWxpZGF0ZS5sb2dhcmV0bS5jb20vdjQnLFxuICAgICAgICAgICAgYXBwLFxuICAgICAgICAgICAgbG9nbzogJ2h0dHBzOi8vdmVlLXZhbGlkYXRlLmxvZ2FyZXRtLmNvbS92NC9sb2dvLnBuZycsXG4gICAgICAgIH0sIHNldHVwQXBpSG9va3MpO1xuICAgIH1cbn1cbmNvbnN0IERFVlRPT0xTX0ZPUk1TID0ge307XG5jb25zdCBERVZUT09MU19GSUVMRFMgPSB7fTtcbmxldCBBUEk7XG5jb25zdCByZWZyZXNoSW5zcGVjdG9yID0gdGhyb3R0bGUoKCkgPT4ge1xuICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBuZXh0VGljaygpO1xuICAgICAgICBBUEkgPT09IG51bGwgfHwgQVBJID09PSB2b2lkIDAgPyB2b2lkIDAgOiBBUEkuc2VuZEluc3BlY3RvclN0YXRlKElOU1BFQ1RPUl9JRCk7XG4gICAgICAgIEFQSSA9PT0gbnVsbCB8fCBBUEkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEFQSS5zZW5kSW5zcGVjdG9yVHJlZShJTlNQRUNUT1JfSUQpO1xuICAgIH0sIDEwMCk7XG59LCAxMDApO1xuZnVuY3Rpb24gcmVnaXN0ZXJGb3JtV2l0aERldlRvb2xzKGZvcm0pIHtcbiAgICBjb25zdCB2bSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgIGlmICghQVBJKSB7XG4gICAgICAgIGNvbnN0IGFwcCA9IHZtID09PSBudWxsIHx8IHZtID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2bS5hcHBDb250ZXh0LmFwcDtcbiAgICAgICAgaWYgKCFhcHApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YWxsRGV2dG9vbHNQbHVnaW4oYXBwKTtcbiAgICB9XG4gICAgREVWVE9PTFNfRk9STVNbZm9ybS5mb3JtSWRdID0gT2JqZWN0LmFzc2lnbih7fSwgZm9ybSk7XG4gICAgREVWVE9PTFNfRk9STVNbZm9ybS5mb3JtSWRdLl92bSA9IHZtO1xuICAgIG9uVW5tb3VudGVkKCgpID0+IHtcbiAgICAgICAgZGVsZXRlIERFVlRPT0xTX0ZPUk1TW2Zvcm0uZm9ybUlkXTtcbiAgICAgICAgcmVmcmVzaEluc3BlY3RvcigpO1xuICAgIH0pO1xuICAgIHJlZnJlc2hJbnNwZWN0b3IoKTtcbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyU2luZ2xlRmllbGRXaXRoRGV2dG9vbHMoZmllbGQpIHtcbiAgICBjb25zdCB2bSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgIGlmICghQVBJKSB7XG4gICAgICAgIGNvbnN0IGFwcCA9IHZtID09PSBudWxsIHx8IHZtID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2bS5hcHBDb250ZXh0LmFwcDtcbiAgICAgICAgaWYgKCFhcHApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YWxsRGV2dG9vbHNQbHVnaW4oYXBwKTtcbiAgICB9XG4gICAgREVWVE9PTFNfRklFTERTW2ZpZWxkLmlkXSA9IE9iamVjdC5hc3NpZ24oe30sIGZpZWxkKTtcbiAgICBERVZUT09MU19GSUVMRFNbZmllbGQuaWRdLl92bSA9IHZtO1xuICAgIG9uVW5tb3VudGVkKCgpID0+IHtcbiAgICAgICAgZGVsZXRlIERFVlRPT0xTX0ZJRUxEU1tmaWVsZC5pZF07XG4gICAgICAgIHJlZnJlc2hJbnNwZWN0b3IoKTtcbiAgICB9KTtcbiAgICByZWZyZXNoSW5zcGVjdG9yKCk7XG59XG5jb25zdCBJTlNQRUNUT1JfSUQgPSAndmVlLXZhbGlkYXRlLWluc3BlY3Rvcic7XG5jb25zdCBDT0xPUlMgPSB7XG4gICAgZXJyb3I6IDB4YmQ0YjRiLFxuICAgIHN1Y2Nlc3M6IDB4MDZkNzdiLFxuICAgIHVua25vd246IDB4NTQ0MzZiLFxuICAgIHdoaXRlOiAweGZmZmZmZixcbiAgICBibGFjazogMHgwMDAwMDAsXG4gICAgYmx1ZTogMHgwMzUzOTcsXG4gICAgcHVycGxlOiAweGI5ODBmMCxcbiAgICBvcmFuZ2U6IDB4ZjVhOTYyLFxuICAgIGdyYXk6IDB4YmJiZmNhLFxufTtcbmxldCBTRUxFQ1RFRF9OT0RFID0gbnVsbDtcbmZ1bmN0aW9uIHNldHVwQXBpSG9va3MoYXBpKSB7XG4gICAgQVBJID0gYXBpO1xuICAgIGFwaS5hZGRJbnNwZWN0b3Ioe1xuICAgICAgICBpZDogSU5TUEVDVE9SX0lELFxuICAgICAgICBpY29uOiAncnVsZScsXG4gICAgICAgIGxhYmVsOiAndmVlLXZhbGlkYXRlJyxcbiAgICAgICAgbm9TZWxlY3Rpb25UZXh0OiAnU2VsZWN0IGEgdmVlLXZhbGlkYXRlIG5vZGUgdG8gaW5zcGVjdCcsXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpY29uOiAnZG9uZV9vdXRsaW5lJyxcbiAgICAgICAgICAgICAgICB0b29sdGlwOiAnVmFsaWRhdGUgc2VsZWN0ZWQgaXRlbScsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghU0VMRUNURURfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVGhlcmUgaXMgbm90IGEgdmFsaWQgc2VsZWN0ZWQgdmVlLXZhbGlkYXRlIG5vZGUgb3IgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgU0VMRUNURURfTk9ERS52YWxpZGF0ZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGljb246ICdkZWxldGVfc3dlZXAnLFxuICAgICAgICAgICAgICAgIHRvb2x0aXA6ICdDbGVhciB2YWxpZGF0aW9uIHN0YXRlIG9mIHRoZSBzZWxlY3RlZCBpdGVtJyxcbiAgICAgICAgICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFTRUxFQ1RFRF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUaGVyZSBpcyBub3QgYSB2YWxpZCBzZWxlY3RlZCB2ZWUtdmFsaWRhdGUgbm9kZSBvciBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoJ2lkJyBpbiBTRUxFQ1RFRF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1RFRF9OT0RFLnJlc2V0RmllbGQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBTRUxFQ1RFRF9OT0RFLnJlc2V0Rm9ybSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgIH0pO1xuICAgIGFwaS5vbi5nZXRJbnNwZWN0b3JUcmVlKHBheWxvYWQgPT4ge1xuICAgICAgICBpZiAocGF5bG9hZC5pbnNwZWN0b3JJZCAhPT0gSU5TUEVDVE9SX0lEKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9ybXMgPSBPYmplY3QudmFsdWVzKERFVlRPT0xTX0ZPUk1TKTtcbiAgICAgICAgY29uc3QgZmllbGRzID0gT2JqZWN0LnZhbHVlcyhERVZUT09MU19GSUVMRFMpO1xuICAgICAgICBwYXlsb2FkLnJvb3ROb2RlcyA9IFtcbiAgICAgICAgICAgIC4uLmZvcm1zLm1hcChtYXBGb3JtRm9yRGV2dG9vbHNJbnNwZWN0b3IpLFxuICAgICAgICAgICAgLi4uZmllbGRzLm1hcChmaWVsZCA9PiBtYXBGaWVsZEZvckRldnRvb2xzSW5zcGVjdG9yKGZpZWxkKSksXG4gICAgICAgIF07XG4gICAgfSk7XG4gICAgYXBpLm9uLmdldEluc3BlY3RvclN0YXRlKChwYXlsb2FkLCBjdHgpID0+IHtcbiAgICAgICAgaWYgKHBheWxvYWQuaW5zcGVjdG9ySWQgIT09IElOU1BFQ1RPUl9JRCB8fCBjdHguY3VycmVudFRhYiAhPT0gYGN1c3RvbS1pbnNwZWN0b3I6JHtJTlNQRUNUT1JfSUR9YCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgZm9ybSwgZmllbGQsIHR5cGUgfSA9IGRlY29kZU5vZGVJZChwYXlsb2FkLm5vZGVJZCk7XG4gICAgICAgIGlmIChmb3JtICYmIHR5cGUgPT09ICdmb3JtJykge1xuICAgICAgICAgICAgcGF5bG9hZC5zdGF0ZSA9IGJ1aWxkRm9ybVN0YXRlKGZvcm0pO1xuICAgICAgICAgICAgU0VMRUNURURfTk9ERSA9IGZvcm07XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpZWxkICYmIHR5cGUgPT09ICdmaWVsZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWQuc3RhdGUgPSBidWlsZEZpZWxkU3RhdGUoZmllbGQpO1xuICAgICAgICAgICAgU0VMRUNURURfTk9ERSA9IGZpZWxkO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFNFTEVDVEVEX05PREUgPSBudWxsO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gbWFwRm9ybUZvckRldnRvb2xzSW5zcGVjdG9yKGZvcm0pIHtcbiAgICBjb25zdCB7IHRleHRDb2xvciwgYmdDb2xvciB9ID0gZ2V0VGFnVGhlbWUoZm9ybSk7XG4gICAgY29uc3QgZm9ybVRyZWVOb2RlcyA9IHt9O1xuICAgIE9iamVjdC52YWx1ZXMoZm9ybS5maWVsZHNCeVBhdGgudmFsdWUpLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZEluc3RhbmNlID0gQXJyYXkuaXNBcnJheShmaWVsZCkgPyBmaWVsZFswXSA6IGZpZWxkO1xuICAgICAgICBpZiAoIWZpZWxkSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXRJblBhdGgoZm9ybVRyZWVOb2RlcywgdW5yZWYoZmllbGRJbnN0YW5jZS5uYW1lKSwgbWFwRmllbGRGb3JEZXZ0b29sc0luc3BlY3RvcihmaWVsZEluc3RhbmNlLCBmb3JtKSk7XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gYnVpbGRGb3JtVHJlZSh0cmVlLCBwYXRoID0gW10pIHtcbiAgICAgICAgY29uc3Qga2V5ID0gWy4uLnBhdGhdLnBvcCgpO1xuICAgICAgICBpZiAoJ2lkJyBpbiB0cmVlKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0cmVlKSwgeyBsYWJlbDoga2V5IHx8IHRyZWUubGFiZWwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzT2JqZWN0KHRyZWUpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkOiBgJHtwYXRoLmpvaW4oJy4nKX1gLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBrZXkgfHwgJycsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IE9iamVjdC5rZXlzKHRyZWUpLm1hcChrZXkgPT4gYnVpbGRGb3JtVHJlZSh0cmVlW2tleV0sIFsuLi5wYXRoLCBrZXldKSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRyZWUpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkOiBgJHtwYXRoLmpvaW4oJy4nKX1gLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBgJHtrZXl9W11gLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiB0cmVlLm1hcCgoYywgaWR4KSA9PiBidWlsZEZvcm1UcmVlKGMsIFsuLi5wYXRoLCBTdHJpbmcoaWR4KV0pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgaWQ6ICcnLCBsYWJlbDogJycsIGNoaWxkcmVuOiBbXSB9O1xuICAgIH1cbiAgICBjb25zdCB7IGNoaWxkcmVuIH0gPSBidWlsZEZvcm1UcmVlKGZvcm1UcmVlTm9kZXMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBlbmNvZGVOb2RlSWQoZm9ybSksXG4gICAgICAgIGxhYmVsOiAnRm9ybScsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICB0YWdzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdGb3JtJyxcbiAgICAgICAgICAgICAgICB0ZXh0Q29sb3IsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBiZ0NvbG9yLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogYCR7T2JqZWN0LmtleXMoZm9ybS5maWVsZHNCeVBhdGgudmFsdWUpLmxlbmd0aH0gZmllbGRzYCxcbiAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6IENPTE9SUy53aGl0ZSxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IENPTE9SUy51bmtub3duLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICB9O1xufVxuZnVuY3Rpb24gbWFwRmllbGRGb3JEZXZ0b29sc0luc3BlY3RvcihmaWVsZCwgZm9ybSkge1xuICAgIGNvbnN0IGZpZWxkSW5zdGFuY2UgPSBub3JtYWxpemVGaWVsZChmaWVsZCk7XG4gICAgY29uc3QgeyB0ZXh0Q29sb3IsIGJnQ29sb3IgfSA9IGdldFRhZ1RoZW1lKGZpZWxkSW5zdGFuY2UpO1xuICAgIGNvbnN0IGlzR3JvdXAgPSBBcnJheS5pc0FycmF5KGZpZWxkKSAmJiBmaWVsZC5sZW5ndGggPiAxO1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBlbmNvZGVOb2RlSWQoZm9ybSwgZmllbGRJbnN0YW5jZSwgIWlzR3JvdXApLFxuICAgICAgICBsYWJlbDogdW5yZWYoZmllbGRJbnN0YW5jZS5uYW1lKSxcbiAgICAgICAgY2hpbGRyZW46IEFycmF5LmlzQXJyYXkoZmllbGQpID8gZmllbGQubWFwKGZpZWxkSXRlbSA9PiBtYXBGaWVsZEZvckRldnRvb2xzSW5zcGVjdG9yKGZpZWxkSXRlbSwgZm9ybSkpIDogdW5kZWZpbmVkLFxuICAgICAgICB0YWdzOiBbXG4gICAgICAgICAgICBpc0dyb3VwXG4gICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdGaWVsZCcsXG4gICAgICAgICAgICAgICAgICAgIHRleHRDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBiZ0NvbG9yLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAhZm9ybVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1N0YW5kYWxvbmUnLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6IENPTE9SUy5ibGFjayxcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBDT0xPUlMuZ3JheSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAhaXNHcm91cCAmJiBmaWVsZEluc3RhbmNlLnR5cGUgPT09ICdjaGVja2JveCdcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdDaGVja2JveCcsXG4gICAgICAgICAgICAgICAgICAgIHRleHRDb2xvcjogQ09MT1JTLndoaXRlLFxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IENPTE9SUy5ibHVlLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICFpc0dyb3VwICYmIGZpZWxkSW5zdGFuY2UudHlwZSA9PT0gJ3JhZGlvJ1xuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1JhZGlvJyxcbiAgICAgICAgICAgICAgICAgICAgdGV4dENvbG9yOiBDT0xPUlMud2hpdGUsXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogQ09MT1JTLnB1cnBsZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBpc0dyb3VwXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnR3JvdXAnLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6IENPTE9SUy5ibGFjayxcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBDT0xPUlMub3JhbmdlLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgXS5maWx0ZXIoQm9vbGVhbiksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGVuY29kZU5vZGVJZChmb3JtLCBmaWVsZCwgZW5jb2RlSW5kZXggPSB0cnVlKSB7XG4gICAgY29uc3QgZmllbGRQYXRoID0gZm9ybSA/IHVucmVmKGZpZWxkID09PSBudWxsIHx8IGZpZWxkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaWVsZC5uYW1lKSA6IGZpZWxkID09PSBudWxsIHx8IGZpZWxkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaWVsZC5pZDtcbiAgICBjb25zdCBmaWVsZEdyb3VwID0gZmllbGRQYXRoID8gZm9ybSA9PT0gbnVsbCB8fCBmb3JtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb3JtLmZpZWxkc0J5UGF0aC52YWx1ZVtmaWVsZFBhdGhdIDogdW5kZWZpbmVkO1xuICAgIGxldCBpZHg7XG4gICAgaWYgKGVuY29kZUluZGV4ICYmIGZpZWxkICYmIEFycmF5LmlzQXJyYXkoZmllbGRHcm91cCkpIHtcbiAgICAgICAgaWR4ID0gZmllbGRHcm91cC5pbmRleE9mKGZpZWxkKTtcbiAgICB9XG4gICAgY29uc3QgaWRPYmplY3QgPSB7IGY6IGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS5mb3JtSWQsIGZmOiBmaWVsZFBhdGgsIGlkeCwgdHlwZTogZmllbGQgPyAnZmllbGQnIDogJ2Zvcm0nIH07XG4gICAgcmV0dXJuIGJ0b2EoSlNPTi5zdHJpbmdpZnkoaWRPYmplY3QpKTtcbn1cbmZ1bmN0aW9uIGRlY29kZU5vZGVJZChub2RlSWQpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBpZE9iamVjdCA9IEpTT04ucGFyc2UoYXRvYihub2RlSWQpKTtcbiAgICAgICAgY29uc3QgZm9ybSA9IERFVlRPT0xTX0ZPUk1TW2lkT2JqZWN0LmZdO1xuICAgICAgICBpZiAoIWZvcm0gJiYgaWRPYmplY3QuZmYpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gREVWVE9PTFNfRklFTERTW2lkT2JqZWN0LmZmXTtcbiAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IGlkT2JqZWN0LnR5cGUsXG4gICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghZm9ybSkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpZWxkR3JvdXAgPSBmb3JtLmZpZWxkc0J5UGF0aC52YWx1ZVtpZE9iamVjdC5mZl07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBpZE9iamVjdC50eXBlLFxuICAgICAgICAgICAgZm9ybSxcbiAgICAgICAgICAgIGZpZWxkOiBBcnJheS5pc0FycmF5KGZpZWxkR3JvdXApID8gZmllbGRHcm91cFtpZE9iamVjdC5pZHggfHwgMF0gOiBmaWVsZEdyb3VwLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoYERldnRvb2xzOiBbdmVlLXZhbGlkYXRlXSBGYWlsZWQgdG8gcGFyc2Ugbm9kZSBpZCAke25vZGVJZH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xufVxuZnVuY3Rpb24gYnVpbGRGaWVsZFN0YXRlKGZpZWxkKSB7XG4gICAgY29uc3QgeyBlcnJvcnMsIG1ldGEsIHZhbHVlIH0gPSBmaWVsZDtcbiAgICByZXR1cm4ge1xuICAgICAgICAnRmllbGQgc3RhdGUnOiBbXG4gICAgICAgICAgICB7IGtleTogJ2Vycm9ycycsIHZhbHVlOiBlcnJvcnMudmFsdWUgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6ICdpbml0aWFsVmFsdWUnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBtZXRhLmluaXRpYWxWYWx1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAga2V5OiAnY3VycmVudFZhbHVlJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUudmFsdWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogJ3RvdWNoZWQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBtZXRhLnRvdWNoZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogJ2RpcnR5JyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbWV0YS5kaXJ0eSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAga2V5OiAndmFsaWQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBtZXRhLnZhbGlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICB9O1xufVxuZnVuY3Rpb24gYnVpbGRGb3JtU3RhdGUoZm9ybSkge1xuICAgIGNvbnN0IHsgZXJyb3JCYWcsIG1ldGEsIHZhbHVlcywgaXNTdWJtaXR0aW5nLCBzdWJtaXRDb3VudCB9ID0gZm9ybTtcbiAgICByZXR1cm4ge1xuICAgICAgICAnRm9ybSBzdGF0ZSc6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6ICdzdWJtaXRDb3VudCcsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHN1Ym1pdENvdW50LnZhbHVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6ICdpc1N1Ym1pdHRpbmcnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBpc1N1Ym1pdHRpbmcudmFsdWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogJ3RvdWNoZWQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBtZXRhLnZhbHVlLnRvdWNoZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogJ2RpcnR5JyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbWV0YS52YWx1ZS5kaXJ0eSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAga2V5OiAndmFsaWQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBtZXRhLnZhbHVlLnZhbGlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6ICdpbml0aWFsVmFsdWVzJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbWV0YS52YWx1ZS5pbml0aWFsVmFsdWVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6ICdjdXJyZW50VmFsdWVzJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6ICdlcnJvcnMnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBrZXlzT2YoZXJyb3JCYWcudmFsdWUpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gKF9hID0gZXJyb3JCYWcudmFsdWVba2V5XSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjW2tleV0gPSBtZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICAgICAgfSwge30pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICB9O1xufVxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgdGFnIGNvbG9yIGJhc2VkIG9uIHRoZSBmb3JtIHN0YXRlXG4gKi9cbmZ1bmN0aW9uIGdldFRhZ1RoZW1lKGZpZWxkT3JGb3JtKSB7XG4gICAgLy8gY29uc3QgZmFsbGJhY2tDb2xvcnMgPSB7XG4gICAgLy8gICBiZ0NvbG9yOiBDT0xPUlMudW5rbm93bixcbiAgICAvLyAgIHRleHRDb2xvcjogQ09MT1JTLndoaXRlLFxuICAgIC8vIH07XG4gICAgY29uc3QgaXNWYWxpZCA9ICdpZCcgaW4gZmllbGRPckZvcm0gPyBmaWVsZE9yRm9ybS5tZXRhLnZhbGlkIDogZmllbGRPckZvcm0ubWV0YS52YWx1ZS52YWxpZDtcbiAgICByZXR1cm4ge1xuICAgICAgICBiZ0NvbG9yOiBpc1ZhbGlkID8gQ09MT1JTLnN1Y2Nlc3MgOiBDT0xPUlMuZXJyb3IsXG4gICAgICAgIHRleHRDb2xvcjogaXNWYWxpZCA/IENPTE9SUy5ibGFjayA6IENPTE9SUy53aGl0ZSxcbiAgICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmaWVsZCBjb21wb3NpdGUuXG4gKi9cbmZ1bmN0aW9uIHVzZUZpZWxkKHBhdGgsIHJ1bGVzLCBvcHRzKSB7XG4gICAgaWYgKGhhc0NoZWNrZWRBdHRyKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy50eXBlKSkge1xuICAgICAgICByZXR1cm4gdXNlQ2hlY2tib3hGaWVsZChwYXRoLCBydWxlcywgb3B0cyk7XG4gICAgfVxuICAgIHJldHVybiBfdXNlRmllbGQocGF0aCwgcnVsZXMsIG9wdHMpO1xufVxuZnVuY3Rpb24gX3VzZUZpZWxkKHBhdGgsIHJ1bGVzLCBvcHRzKSB7XG4gICAgY29uc3QgeyBpbml0aWFsVmFsdWU6IG1vZGVsVmFsdWUsIHZhbGlkYXRlT25Nb3VudCwgYmFpbHMsIHR5cGUsIGNoZWNrZWRWYWx1ZSwgbGFiZWwsIHZhbGlkYXRlT25WYWx1ZVVwZGF0ZSwgdW5jaGVja2VkVmFsdWUsIGNvbnRyb2xsZWQsIGtlZXBWYWx1ZU9uVW5tb3VudCwgbW9kZWxQcm9wTmFtZSwgc3luY1ZNb2RlbCwgZm9ybTogY29udHJvbEZvcm0sIH0gPSBub3JtYWxpemVPcHRpb25zKG9wdHMpO1xuICAgIGNvbnN0IGluamVjdGVkRm9ybSA9IGNvbnRyb2xsZWQgPyBpbmplY3RXaXRoU2VsZihGb3JtQ29udGV4dEtleSkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZm9ybSA9IGNvbnRyb2xGb3JtIHx8IGluamVjdGVkRm9ybTtcbiAgICBjb25zdCBuYW1lID0gbGF6eVRvUmVmKHBhdGgpO1xuICAgIC8vIGEgZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBmaWVsZCBpcyBhYm91dCB0byBiZSByZW1vdmVkL3VubW91bnRlZC5cbiAgICBsZXQgbWFya2VkRm9yUmVtb3ZhbCA9IGZhbHNlO1xuICAgIGNvbnN0IHsgaWQsIHZhbHVlLCBpbml0aWFsVmFsdWUsIG1ldGEsIHNldFN0YXRlLCBlcnJvcnMsIGVycm9yTWVzc2FnZSB9ID0gdXNlRmllbGRTdGF0ZShuYW1lLCB7XG4gICAgICAgIG1vZGVsVmFsdWUsXG4gICAgICAgIGZvcm0sXG4gICAgfSk7XG4gICAgaWYgKHN5bmNWTW9kZWwpIHtcbiAgICAgICAgdXNlVk1vZGVsKHsgdmFsdWUsIHByb3A6IG1vZGVsUHJvcE5hbWUsIGhhbmRsZUNoYW5nZSB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBjb21tb24gb25CbHVyIG1ldGEgdXBkYXRlXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQmx1ciA9ICgpID0+IHtcbiAgICAgICAgbWV0YS50b3VjaGVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRSdWxlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgbGV0IHJ1bGVzVmFsdWUgPSB1bnJlZihydWxlcyk7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHVucmVmKGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS5zY2hlbWEpO1xuICAgICAgICBpZiAoc2NoZW1hICYmICFpc1l1cFZhbGlkYXRvcihzY2hlbWEpICYmICFpc1R5cGVkU2NoZW1hKHNjaGVtYSkpIHtcbiAgICAgICAgICAgIHJ1bGVzVmFsdWUgPSBleHRyYWN0UnVsZUZyb21TY2hlbWEoc2NoZW1hLCB1bnJlZihuYW1lKSkgfHwgcnVsZXNWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNZdXBWYWxpZGF0b3IocnVsZXNWYWx1ZSkgfHxcbiAgICAgICAgICAgIGlzVHlwZWRTY2hlbWEocnVsZXNWYWx1ZSkgfHxcbiAgICAgICAgICAgIGlzQ2FsbGFibGUocnVsZXNWYWx1ZSkgfHxcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkocnVsZXNWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBydWxlc1ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub3JtYWxpemVSdWxlcyhydWxlc1ZhbHVlKTtcbiAgICB9KTtcbiAgICBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZUN1cnJlbnRWYWx1ZShtb2RlKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmIChmb3JtID09PSBudWxsIHx8IGZvcm0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvcm0udmFsaWRhdGVTY2hlbWEpIHtcbiAgICAgICAgICAgIHJldHVybiAoX2EgPSAoYXdhaXQgZm9ybS52YWxpZGF0ZVNjaGVtYShtb2RlKSkucmVzdWx0c1t1bnJlZihuYW1lKV0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHsgdmFsaWQ6IHRydWUsIGVycm9yczogW10gfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsaWRhdGUodmFsdWUudmFsdWUsIG5vcm1hbGl6ZWRSdWxlcy52YWx1ZSwge1xuICAgICAgICAgICAgbmFtZTogdW5yZWYobmFtZSksXG4gICAgICAgICAgICBsYWJlbDogdW5yZWYobGFiZWwpLFxuICAgICAgICAgICAgdmFsdWVzOiAoX2IgPSBmb3JtID09PSBudWxsIHx8IGZvcm0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvcm0udmFsdWVzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB7fSxcbiAgICAgICAgICAgIGJhaWxzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgdmFsaWRhdGVXaXRoU3RhdGVNdXRhdGlvbiA9IHdpdGhMYXRlc3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICBtZXRhLnBlbmRpbmcgPSB0cnVlO1xuICAgICAgICBtZXRhLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZUN1cnJlbnRWYWx1ZSgndmFsaWRhdGVkLW9ubHknKTtcbiAgICB9LCByZXN1bHQgPT4ge1xuICAgICAgICBpZiAobWFya2VkRm9yUmVtb3ZhbCkge1xuICAgICAgICAgICAgcmVzdWx0LnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBzZXRTdGF0ZSh7IGVycm9yczogcmVzdWx0LmVycm9ycyB9KTtcbiAgICAgICAgbWV0YS5wZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gICAgY29uc3QgdmFsaWRhdGVWYWxpZFN0YXRlT25seSA9IHdpdGhMYXRlc3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVDdXJyZW50VmFsdWUoJ3NpbGVudCcpO1xuICAgIH0sIHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChtYXJrZWRGb3JSZW1vdmFsKSB7XG4gICAgICAgICAgICByZXN1bHQudmFsaWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIG1ldGEudmFsaWQgPSByZXN1bHQudmFsaWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUkMShvcHRzKSB7XG4gICAgICAgIGlmICgob3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLm1vZGUpID09PSAnc2lsZW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlVmFsaWRTdGF0ZU9ubHkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsaWRhdGVXaXRoU3RhdGVNdXRhdGlvbigpO1xuICAgIH1cbiAgICAvLyBDb21tb24gaW5wdXQvY2hhbmdlIGV2ZW50IGhhbmRsZXJcbiAgICBmdW5jdGlvbiBoYW5kbGVDaGFuZ2UoZSwgc2hvdWxkVmFsaWRhdGUgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gbm9ybWFsaXplRXZlbnRWYWx1ZShlKTtcbiAgICAgICAgdmFsdWUudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgaWYgKCF2YWxpZGF0ZU9uVmFsdWVVcGRhdGUgJiYgc2hvdWxkVmFsaWRhdGUpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlV2l0aFN0YXRlTXV0YXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBSdW5zIHRoZSBpbml0aWFsIHZhbGlkYXRpb25cbiAgICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodmFsaWRhdGVPbk1vdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVXaXRoU3RhdGVNdXRhdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHZhbGlkYXRlIHNlbGYgaW5pdGlhbGx5IGlmIG5vIGZvcm0gd2FzIGhhbmRsaW5nIHRoaXNcbiAgICAgICAgLy8gZm9ybXMgc2hvdWxkIGhhdmUgdGhlaXIgb3duIGluaXRpYWwgc2lsZW50IHZhbGlkYXRpb24gcnVuIHRvIG1ha2UgdGhpbmdzIG1vcmUgZWZmaWNpZW50XG4gICAgICAgIGlmICghZm9ybSB8fCAhZm9ybS52YWxpZGF0ZVNjaGVtYSkge1xuICAgICAgICAgICAgdmFsaWRhdGVWYWxpZFN0YXRlT25seSgpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gc2V0VG91Y2hlZChpc1RvdWNoZWQpIHtcbiAgICAgICAgbWV0YS50b3VjaGVkID0gaXNUb3VjaGVkO1xuICAgIH1cbiAgICBsZXQgdW53YXRjaFZhbHVlO1xuICAgIGxldCBsYXN0V2F0Y2hlZFZhbHVlID0ga2xvbmEodmFsdWUudmFsdWUpO1xuICAgIGZ1bmN0aW9uIHdhdGNoVmFsdWUoKSB7XG4gICAgICAgIHVud2F0Y2hWYWx1ZSA9IHdhdGNoKHZhbHVlLCAodmFsLCBvbGRWYWwpID0+IHtcbiAgICAgICAgICAgIGlmIChpc0VxdWFsKHZhbCwgb2xkVmFsKSAmJiBpc0VxdWFsKHZhbCwgbGFzdFdhdGNoZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZUZuID0gdmFsaWRhdGVPblZhbHVlVXBkYXRlID8gdmFsaWRhdGVXaXRoU3RhdGVNdXRhdGlvbiA6IHZhbGlkYXRlVmFsaWRTdGF0ZU9ubHk7XG4gICAgICAgICAgICB2YWxpZGF0ZUZuKCk7XG4gICAgICAgICAgICBsYXN0V2F0Y2hlZFZhbHVlID0ga2xvbmEodmFsKTtcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdhdGNoVmFsdWUoKTtcbiAgICBmdW5jdGlvbiByZXNldEZpZWxkKHN0YXRlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdW53YXRjaFZhbHVlID09PSBudWxsIHx8IHVud2F0Y2hWYWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdW53YXRjaFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gc3RhdGUgJiYgJ3ZhbHVlJyBpbiBzdGF0ZSA/IHN0YXRlLnZhbHVlIDogaW5pdGlhbFZhbHVlLnZhbHVlO1xuICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICB2YWx1ZToga2xvbmEobmV3VmFsdWUpLFxuICAgICAgICAgICAgaW5pdGlhbFZhbHVlOiBrbG9uYShuZXdWYWx1ZSksXG4gICAgICAgICAgICB0b3VjaGVkOiAoX2EgPSBzdGF0ZSA9PT0gbnVsbCB8fCBzdGF0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RhdGUudG91Y2hlZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcnM6IChzdGF0ZSA9PT0gbnVsbCB8fCBzdGF0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RhdGUuZXJyb3JzKSB8fCBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGEucGVuZGluZyA9IGZhbHNlO1xuICAgICAgICBtZXRhLnZhbGlkYXRlZCA9IGZhbHNlO1xuICAgICAgICB2YWxpZGF0ZVZhbGlkU3RhdGVPbmx5KCk7XG4gICAgICAgIC8vIG5lZWQgdG8gd2F0Y2ggYXQgbmV4dCB0aWNrIHRvIGF2b2lkIHRyaWdnZXJpbmcgdGhlIHZhbHVlIHdhdGNoZXJcbiAgICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgd2F0Y2hWYWx1ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0VmFsdWUobmV3VmFsdWUpIHtcbiAgICAgICAgdmFsdWUudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0RXJyb3JzKGVycm9ycykge1xuICAgICAgICBzZXRTdGF0ZSh7IGVycm9yczogQXJyYXkuaXNBcnJheShlcnJvcnMpID8gZXJyb3JzIDogW2Vycm9yc10gfSk7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkID0ge1xuICAgICAgICBpZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBtZXRhLFxuICAgICAgICBlcnJvcnMsXG4gICAgICAgIGVycm9yTWVzc2FnZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgY2hlY2tlZFZhbHVlLFxuICAgICAgICB1bmNoZWNrZWRWYWx1ZSxcbiAgICAgICAgYmFpbHMsXG4gICAgICAgIGtlZXBWYWx1ZU9uVW5tb3VudCxcbiAgICAgICAgcmVzZXRGaWVsZCxcbiAgICAgICAgaGFuZGxlUmVzZXQ6ICgpID0+IHJlc2V0RmllbGQoKSxcbiAgICAgICAgdmFsaWRhdGU6IHZhbGlkYXRlJDEsXG4gICAgICAgIGhhbmRsZUNoYW5nZSxcbiAgICAgICAgaGFuZGxlQmx1cixcbiAgICAgICAgc2V0U3RhdGUsXG4gICAgICAgIHNldFRvdWNoZWQsXG4gICAgICAgIHNldEVycm9ycyxcbiAgICAgICAgc2V0VmFsdWUsXG4gICAgfTtcbiAgICBwcm92aWRlKEZpZWxkQ29udGV4dEtleSwgZmllbGQpO1xuICAgIGlmIChpc1JlZihydWxlcykgJiYgdHlwZW9mIHVucmVmKHJ1bGVzKSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXRjaChydWxlcywgKHZhbHVlLCBvbGRWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRXF1YWwodmFsdWUsIG9sZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1ldGEudmFsaWRhdGVkID8gdmFsaWRhdGVXaXRoU3RhdGVNdXRhdGlvbigpIDogdmFsaWRhdGVWYWxpZFN0YXRlT25seSgpO1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBkZWVwOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICBmaWVsZC5fdm0gPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICAgICAgd2F0Y2goKCkgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IGVycm9yczogZXJyb3JzLnZhbHVlIH0sIG1ldGEpLCB7IHZhbHVlOiB2YWx1ZS52YWx1ZSB9KSksIHJlZnJlc2hJbnNwZWN0b3IsIHtcbiAgICAgICAgICAgIGRlZXA6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWZvcm0pIHtcbiAgICAgICAgICAgIHJlZ2lzdGVyU2luZ2xlRmllbGRXaXRoRGV2dG9vbHMoZmllbGQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGlmIG5vIGFzc29jaWF0ZWQgZm9ybSByZXR1cm4gdGhlIGZpZWxkIEFQSSBpbW1lZGlhdGVseVxuICAgIGlmICghZm9ybSkge1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuICAgIC8vIGFzc29jaWF0ZSB0aGUgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gZm9ybVxuICAgIGZvcm0ucmVnaXN0ZXIoZmllbGQpO1xuICAgIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XG4gICAgICAgIG1hcmtlZEZvclJlbW92YWwgPSB0cnVlO1xuICAgICAgICBmb3JtLnVucmVnaXN0ZXIoZmllbGQpO1xuICAgIH0pO1xuICAgIC8vIGV4dHJhY3QgY3Jvc3MtZmllbGQgZGVwZW5kZW5jaWVzIGluIGEgY29tcHV0ZWQgcHJvcFxuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgcnVsZXNWYWwgPSBub3JtYWxpemVkUnVsZXMudmFsdWU7XG4gICAgICAgIC8vIGlzIGZhbHN5LCBhIGZ1bmN0aW9uIHNjaGVtYSBvciBhIHl1cCBzY2hlbWFcbiAgICAgICAgaWYgKCFydWxlc1ZhbCB8fFxuICAgICAgICAgICAgaXNDYWxsYWJsZShydWxlc1ZhbCkgfHxcbiAgICAgICAgICAgIGlzWXVwVmFsaWRhdG9yKHJ1bGVzVmFsKSB8fFxuICAgICAgICAgICAgaXNUeXBlZFNjaGVtYShydWxlc1ZhbCkgfHxcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkocnVsZXNWYWwpKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHJ1bGVzVmFsKS5yZWR1Y2UoKGFjYywgcnVsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGVwcyA9IGV4dHJhY3RMb2NhdG9ycyhydWxlc1ZhbFtydWxlXSlcbiAgICAgICAgICAgICAgICAubWFwKChkZXApID0+IGRlcC5fX2xvY2F0b3JSZWYpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgoZGVwQWNjLCBkZXBOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwVmFsdWUgPSBnZXRGcm9tUGF0aChmb3JtLnZhbHVlcywgZGVwTmFtZSkgfHwgZm9ybS52YWx1ZXNbZGVwTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKGRlcFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwQWNjW2RlcE5hbWVdID0gZGVwVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBkZXBBY2M7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGFjYywgZGVwcyk7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSk7XG4gICAgfSk7XG4gICAgLy8gQWRkcyBhIHdhdGNoZXIgdGhhdCBydW5zIHRoZSB2YWxpZGF0aW9uIHdoZW5ldmVyIGZpZWxkIGRlcGVuZGVuY2llcyBjaGFuZ2VcbiAgICB3YXRjaChkZXBlbmRlbmNpZXMsIChkZXBzLCBvbGREZXBzKSA9PiB7XG4gICAgICAgIC8vIFNraXAgaWYgbm8gZGVwZW5kZW5jaWVzIG9yIGlmIHRoZSBmaWVsZCB3YXNuJ3QgbWFuaXB1bGF0ZWRcbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhkZXBzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzaG91bGRWYWxpZGF0ZSA9ICFpc0VxdWFsKGRlcHMsIG9sZERlcHMpO1xuICAgICAgICBpZiAoc2hvdWxkVmFsaWRhdGUpIHtcbiAgICAgICAgICAgIG1ldGEudmFsaWRhdGVkID8gdmFsaWRhdGVXaXRoU3RhdGVNdXRhdGlvbigpIDogdmFsaWRhdGVWYWxpZFN0YXRlT25seSgpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpZWxkO1xufVxuLyoqXG4gKiBOb3JtYWxpemVzIHBhcnRpYWwgZmllbGQgb3B0aW9ucyB0byBpbmNsdWRlIHRoZSBmdWxsIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplT3B0aW9ucyhvcHRzKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IGRlZmF1bHRzID0gKCkgPT4gKHtcbiAgICAgICAgaW5pdGlhbFZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIHZhbGlkYXRlT25Nb3VudDogZmFsc2UsXG4gICAgICAgIGJhaWxzOiB0cnVlLFxuICAgICAgICBsYWJlbDogdW5kZWZpbmVkLFxuICAgICAgICB2YWxpZGF0ZU9uVmFsdWVVcGRhdGU6IHRydWUsXG4gICAgICAgIGtlZXBWYWx1ZU9uVW5tb3VudDogdW5kZWZpbmVkLFxuICAgICAgICBtb2RlbFByb3BOYW1lOiAnbW9kZWxWYWx1ZScsXG4gICAgICAgIHN5bmNWTW9kZWw6IHRydWUsXG4gICAgICAgIGNvbnRyb2xsZWQ6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgaXNWTW9kZWxTeW5jZWQgPSAoX2EgPSBvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMuc3luY1ZNb2RlbCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdHJ1ZTtcbiAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBpc1ZNb2RlbFN5bmNlZCAmJiAhKCdpbml0aWFsVmFsdWUnIGluIChvcHRzIHx8IHt9KSlcbiAgICAgICAgPyBnZXRDdXJyZW50TW9kZWxWYWx1ZShnZXRDdXJyZW50SW5zdGFuY2UoKSwgKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5tb2RlbFByb3BOYW1lKSB8fCAnbW9kZWxWYWx1ZScpXG4gICAgICAgIDogb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLmluaXRpYWxWYWx1ZTtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMoKSksIHsgaW5pdGlhbFZhbHVlIH0pO1xuICAgIH1cbiAgICAvLyBUT0RPOiBEZXByZWNhdGUgdGhpcyBpbiBuZXh0IG1ham9yIHJlbGVhc2VcbiAgICBjb25zdCBjaGVja2VkVmFsdWUgPSAndmFsdWVQcm9wJyBpbiBvcHRzID8gb3B0cy52YWx1ZVByb3AgOiBvcHRzLmNoZWNrZWRWYWx1ZTtcbiAgICBjb25zdCBjb250cm9sbGVkID0gJ3N0YW5kYWxvbmUnIGluIG9wdHMgPyAhb3B0cy5zdGFuZGFsb25lIDogb3B0cy5jb250cm9sbGVkO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMoKSksIChvcHRzIHx8IHt9KSksIHsgaW5pdGlhbFZhbHVlLCBjb250cm9sbGVkOiBjb250cm9sbGVkICE9PSBudWxsICYmIGNvbnRyb2xsZWQgIT09IHZvaWQgMCA/IGNvbnRyb2xsZWQgOiB0cnVlLCBjaGVja2VkVmFsdWUgfSk7XG59XG4vKipcbiAqIEV4dHJhY3RzIHRoZSB2YWxpZGF0aW9uIHJ1bGVzIGZyb20gYSBzY2hlbWFcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFJ1bGVGcm9tU2NoZW1hKHNjaGVtYSwgZmllbGROYW1lKSB7XG4gICAgLy8gbm8gc2NoZW1hIGF0IGFsbFxuICAgIGlmICghc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIHRoZXJlIGlzIGEga2V5IG9uIHRoZSBzY2hlbWEgb2JqZWN0IGZvciB0aGlzIGZpZWxkXG4gICAgcmV0dXJuIHNjaGVtYVtmaWVsZE5hbWVdO1xufVxuZnVuY3Rpb24gdXNlQ2hlY2tib3hGaWVsZChuYW1lLCBydWxlcywgb3B0cykge1xuICAgIGNvbnN0IGZvcm0gPSAhKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5zdGFuZGFsb25lKSA/IGluamVjdFdpdGhTZWxmKEZvcm1Db250ZXh0S2V5KSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjaGVja2VkVmFsdWUgPSBvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMuY2hlY2tlZFZhbHVlO1xuICAgIGNvbnN0IHVuY2hlY2tlZFZhbHVlID0gb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLnVuY2hlY2tlZFZhbHVlO1xuICAgIGZ1bmN0aW9uIHBhdGNoQ2hlY2tib3hBcGkoZmllbGQpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlQ2hhbmdlID0gZmllbGQuaGFuZGxlQ2hhbmdlO1xuICAgICAgICBjb25zdCBjaGVja2VkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdW5yZWYoZmllbGQudmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgY2hlY2tlZFZhbCA9IHVucmVmKGNoZWNrZWRWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpXG4gICAgICAgICAgICAgICAgPyBjdXJyZW50VmFsdWUuZmluZEluZGV4KHYgPT4gaXNFcXVhbCh2LCBjaGVja2VkVmFsKSkgPj0gMFxuICAgICAgICAgICAgICAgIDogaXNFcXVhbChjaGVja2VkVmFsLCBjdXJyZW50VmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlQ2hlY2tib3hDaGFuZ2UoZSwgc2hvdWxkVmFsaWRhdGUgPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBpZiAoY2hlY2tlZC52YWx1ZSA9PT0gKChfYSA9IGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS50YXJnZXQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGVja2VkKSkge1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGRWYWxpZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWxpZGF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbmV3VmFsdWUgPSBub3JtYWxpemVFdmVudFZhbHVlKGUpO1xuICAgICAgICAgICAgLy8gU2luZ2xlIGNoZWNrYm94IGZpZWxkIHdpdGhvdXQgYSBmb3JtIHRvIHRvZ2dsZSBpdCdzIHZhbHVlXG4gICAgICAgICAgICBpZiAoIWZvcm0pIHtcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IHJlc29sdmVOZXh0Q2hlY2tib3hWYWx1ZSh1bnJlZihmaWVsZC52YWx1ZSksIHVucmVmKGNoZWNrZWRWYWx1ZSksIHVucmVmKHVuY2hlY2tlZFZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGVDaGFuZ2UobmV3VmFsdWUsIHNob3VsZFZhbGlkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBmaWVsZCksIHsgY2hlY2tlZCxcbiAgICAgICAgICAgIGNoZWNrZWRWYWx1ZSxcbiAgICAgICAgICAgIHVuY2hlY2tlZFZhbHVlLCBoYW5kbGVDaGFuZ2U6IGhhbmRsZUNoZWNrYm94Q2hhbmdlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGF0Y2hDaGVja2JveEFwaShfdXNlRmllbGQobmFtZSwgcnVsZXMsIG9wdHMpKTtcbn1cbmZ1bmN0aW9uIHVzZVZNb2RlbCh7IHByb3AsIHZhbHVlLCBoYW5kbGVDaGFuZ2UgfSkge1xuICAgIGNvbnN0IHZtID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoIXZtKSB7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNldHVwIG1vZGVsIGV2ZW50cyBiZWNhdXNlIGB1c2VGaWVsZGAgd2FzIG5vdCBjYWxsZWQgaW4gc2V0dXAuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcm9wTmFtZSA9IHByb3AgfHwgJ21vZGVsVmFsdWUnO1xuICAgIGNvbnN0IGVtaXROYW1lID0gYHVwZGF0ZToke3Byb3BOYW1lfWA7XG4gICAgLy8gQ29tcG9uZW50IGRvZXNuJ3QgaGF2ZSBhIG1vZGVsIHByb3Agc2V0dXAgKG11c3QgYmUgZGVmaW5lZCBvbiB0aGUgcHJvcHMpXG4gICAgaWYgKCEocHJvcE5hbWUgaW4gdm0ucHJvcHMpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd2F0Y2godmFsdWUsIG5ld1ZhbHVlID0+IHtcbiAgICAgICAgaWYgKGlzRXF1YWwobmV3VmFsdWUsIGdldEN1cnJlbnRNb2RlbFZhbHVlKHZtLCBwcm9wTmFtZSkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdm0uZW1pdChlbWl0TmFtZSwgbmV3VmFsdWUpO1xuICAgIH0pO1xuICAgIHdhdGNoKCgpID0+IGdldEN1cnJlbnRNb2RlbFZhbHVlKHZtLCBwcm9wTmFtZSksIHByb3BWYWx1ZSA9PiB7XG4gICAgICAgIGlmIChwcm9wVmFsdWUgPT09IElTX0FCU0VOVCAmJiB2YWx1ZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBwcm9wVmFsdWUgPT09IElTX0FCU0VOVCA/IHVuZGVmaW5lZCA6IHByb3BWYWx1ZTtcbiAgICAgICAgaWYgKGlzRXF1YWwobmV3VmFsdWUsIGFwcGx5TW9kZWxNb2RpZmllcnModmFsdWUudmFsdWUsIHZtLnByb3BzLm1vZGVsTW9kaWZpZXJzKSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVDaGFuZ2UobmV3VmFsdWUpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudE1vZGVsVmFsdWUodm0sIHByb3BOYW1lKSB7XG4gICAgaWYgKCF2bSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdm0ucHJvcHNbcHJvcE5hbWVdO1xufVxuXG5jb25zdCBGaWVsZEltcGwgPSBkZWZpbmVDb21wb25lbnQoe1xuICAgIG5hbWU6ICdGaWVsZCcsXG4gICAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcbiAgICBwcm9wczoge1xuICAgICAgICBhczoge1xuICAgICAgICAgICAgdHlwZTogW1N0cmluZywgT2JqZWN0XSxcbiAgICAgICAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHJ1bGVzOiB7XG4gICAgICAgICAgICB0eXBlOiBbT2JqZWN0LCBTdHJpbmcsIEZ1bmN0aW9uXSxcbiAgICAgICAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgdmFsaWRhdGVPbk1vdW50OiB7XG4gICAgICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHZhbGlkYXRlT25CbHVyOiB7XG4gICAgICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICAgICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgICB2YWxpZGF0ZU9uQ2hhbmdlOiB7XG4gICAgICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICAgICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgICB2YWxpZGF0ZU9uSW5wdXQ6IHtcbiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgICAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIHZhbGlkYXRlT25Nb2RlbFVwZGF0ZToge1xuICAgICAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgYmFpbHM6IHtcbiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgICAgICBkZWZhdWx0OiAoKSA9PiBnZXRDb25maWcoKS5iYWlscyxcbiAgICAgICAgfSxcbiAgICAgICAgbGFiZWw6IHtcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5jaGVja2VkVmFsdWU6IHtcbiAgICAgICAgICAgIHR5cGU6IG51bGwsXG4gICAgICAgICAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIG1vZGVsVmFsdWU6IHtcbiAgICAgICAgICAgIHR5cGU6IG51bGwsXG4gICAgICAgICAgICBkZWZhdWx0OiBJU19BQlNFTlQsXG4gICAgICAgIH0sXG4gICAgICAgIG1vZGVsTW9kaWZpZXJzOiB7XG4gICAgICAgICAgICB0eXBlOiBudWxsLFxuICAgICAgICAgICAgZGVmYXVsdDogKCkgPT4gKHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgJ29uVXBkYXRlOm1vZGVsVmFsdWUnOiB7XG4gICAgICAgICAgICB0eXBlOiBudWxsLFxuICAgICAgICAgICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgICBzdGFuZGFsb25lOiB7XG4gICAgICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGtlZXBWYWx1ZToge1xuICAgICAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICAgICAgY29uc3QgcnVsZXMgPSB0b1JlZihwcm9wcywgJ3J1bGVzJyk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0b1JlZihwcm9wcywgJ25hbWUnKTtcbiAgICAgICAgY29uc3QgbGFiZWwgPSB0b1JlZihwcm9wcywgJ2xhYmVsJyk7XG4gICAgICAgIGNvbnN0IHVuY2hlY2tlZFZhbHVlID0gdG9SZWYocHJvcHMsICd1bmNoZWNrZWRWYWx1ZScpO1xuICAgICAgICBjb25zdCBrZWVwVmFsdWUgPSB0b1JlZihwcm9wcywgJ2tlZXBWYWx1ZScpO1xuICAgICAgICBjb25zdCB7IGVycm9ycywgdmFsdWUsIGVycm9yTWVzc2FnZSwgdmFsaWRhdGU6IHZhbGlkYXRlRmllbGQsIGhhbmRsZUNoYW5nZSwgaGFuZGxlQmx1ciwgc2V0VG91Y2hlZCwgcmVzZXRGaWVsZCwgaGFuZGxlUmVzZXQsIG1ldGEsIGNoZWNrZWQsIHNldEVycm9ycywgfSA9IHVzZUZpZWxkKG5hbWUsIHJ1bGVzLCB7XG4gICAgICAgICAgICB2YWxpZGF0ZU9uTW91bnQ6IHByb3BzLnZhbGlkYXRlT25Nb3VudCxcbiAgICAgICAgICAgIGJhaWxzOiBwcm9wcy5iYWlscyxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6IHByb3BzLnN0YW5kYWxvbmUsXG4gICAgICAgICAgICB0eXBlOiBjdHguYXR0cnMudHlwZSxcbiAgICAgICAgICAgIGluaXRpYWxWYWx1ZTogcmVzb2x2ZUluaXRpYWxWYWx1ZShwcm9wcywgY3R4KSxcbiAgICAgICAgICAgIC8vIE9ubHkgZm9yIGNoZWNrYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnNcbiAgICAgICAgICAgIGNoZWNrZWRWYWx1ZTogY3R4LmF0dHJzLnZhbHVlLFxuICAgICAgICAgICAgdW5jaGVja2VkVmFsdWUsXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIHZhbGlkYXRlT25WYWx1ZVVwZGF0ZTogZmFsc2UsXG4gICAgICAgICAgICBrZWVwVmFsdWVPblVubW91bnQ6IGtlZXBWYWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgdi1tb2RlbCBhcHBsaWVkIG9uIHRoZSBjb21wb25lbnQgd2UgbmVlZCB0byBlbWl0IHRoZSBgdXBkYXRlOm1vZGVsVmFsdWVgIHdoZW5ldmVyIHRoZSB2YWx1ZSBiaW5kaW5nIGNoYW5nZXNcbiAgICAgICAgY29uc3Qgb25DaGFuZ2VIYW5kbGVyID0gZnVuY3Rpb24gaGFuZGxlQ2hhbmdlV2l0aE1vZGVsKGUsIHNob3VsZFZhbGlkYXRlID0gdHJ1ZSkge1xuICAgICAgICAgICAgaGFuZGxlQ2hhbmdlKGUsIHNob3VsZFZhbGlkYXRlKTtcbiAgICAgICAgICAgIGN0eC5lbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbHVlLnZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGFuZGxlSW5wdXQgPSAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFoYXNDaGVja2VkQXR0cihjdHguYXR0cnMudHlwZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZSA9IG5vcm1hbGl6ZUV2ZW50VmFsdWUoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG9uSW5wdXRIYW5kbGVyID0gZnVuY3Rpb24gaGFuZGxlSW5wdXRXaXRoTW9kZWwoZSkge1xuICAgICAgICAgICAgaGFuZGxlSW5wdXQoZSk7XG4gICAgICAgICAgICBjdHguZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWx1ZS52YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZpZWxkUHJvcHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbGlkYXRlT25JbnB1dCwgdmFsaWRhdGVPbkNoYW5nZSwgdmFsaWRhdGVPbkJsdXIsIHZhbGlkYXRlT25Nb2RlbFVwZGF0ZSB9ID0gcmVzb2x2ZVZhbGlkYXRpb25UcmlnZ2Vycyhwcm9wcyk7XG4gICAgICAgICAgICBjb25zdCBiYXNlT25CbHVyID0gW2hhbmRsZUJsdXIsIGN0eC5hdHRycy5vbkJsdXIsIHZhbGlkYXRlT25CbHVyID8gdmFsaWRhdGVGaWVsZCA6IHVuZGVmaW5lZF0uZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICAgICAgY29uc3QgYmFzZU9uSW5wdXQgPSBbKGUpID0+IG9uQ2hhbmdlSGFuZGxlcihlLCB2YWxpZGF0ZU9uSW5wdXQpLCBjdHguYXR0cnMub25JbnB1dF0uZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICAgICAgY29uc3QgYmFzZU9uQ2hhbmdlID0gWyhlKSA9PiBvbkNoYW5nZUhhbmRsZXIoZSwgdmFsaWRhdGVPbkNoYW5nZSksIGN0eC5hdHRycy5vbkNoYW5nZV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICAgICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogcHJvcHMubmFtZSxcbiAgICAgICAgICAgICAgICBvbkJsdXI6IGJhc2VPbkJsdXIsXG4gICAgICAgICAgICAgICAgb25JbnB1dDogYmFzZU9uSW5wdXQsXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6IGJhc2VPbkNoYW5nZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhdHRyc1snb25VcGRhdGU6bW9kZWxWYWx1ZSddID0gZSA9PiBvbkNoYW5nZUhhbmRsZXIoZSwgdmFsaWRhdGVPbk1vZGVsVXBkYXRlKTtcbiAgICAgICAgICAgIGlmIChoYXNDaGVja2VkQXR0cihjdHguYXR0cnMudHlwZSkgJiYgY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIGF0dHJzLmNoZWNrZWQgPSBjaGVja2VkLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVzb2x2ZVRhZyhwcm9wcywgY3R4KTtcbiAgICAgICAgICAgIGlmIChzaG91bGRIYXZlVmFsdWVCaW5kaW5nKHRhZywgY3R4LmF0dHJzKSkge1xuICAgICAgICAgICAgICAgIGF0dHJzLnZhbHVlID0gdmFsdWUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXR0cnM7XG4gICAgICAgIH0pO1xuICAgICAgICBmdW5jdGlvbiBzbG90UHJvcHMoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZpZWxkOiBmaWVsZFByb3BzLnZhbHVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS52YWx1ZSxcbiAgICAgICAgICAgICAgICBtZXRhLFxuICAgICAgICAgICAgICAgIGVycm9yczogZXJyb3JzLnZhbHVlLFxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyb3JNZXNzYWdlLnZhbHVlLFxuICAgICAgICAgICAgICAgIHZhbGlkYXRlOiB2YWxpZGF0ZUZpZWxkLFxuICAgICAgICAgICAgICAgIHJlc2V0RmllbGQsXG4gICAgICAgICAgICAgICAgaGFuZGxlQ2hhbmdlOiBvbkNoYW5nZUhhbmRsZXIsXG4gICAgICAgICAgICAgICAgaGFuZGxlSW5wdXQ6IG9uSW5wdXRIYW5kbGVyLFxuICAgICAgICAgICAgICAgIGhhbmRsZVJlc2V0LFxuICAgICAgICAgICAgICAgIGhhbmRsZUJsdXIsXG4gICAgICAgICAgICAgICAgc2V0VG91Y2hlZCxcbiAgICAgICAgICAgICAgICBzZXRFcnJvcnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGN0eC5leHBvc2Uoe1xuICAgICAgICAgICAgc2V0RXJyb3JzLFxuICAgICAgICAgICAgc2V0VG91Y2hlZCxcbiAgICAgICAgICAgIHJlc2V0OiByZXNldEZpZWxkLFxuICAgICAgICAgICAgdmFsaWRhdGU6IHZhbGlkYXRlRmllbGQsXG4gICAgICAgICAgICBoYW5kbGVDaGFuZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQocmVzb2x2ZVRhZyhwcm9wcywgY3R4KSk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vcm1hbGl6ZUNoaWxkcmVuKHRhZywgY3R4LCBzbG90UHJvcHMpO1xuICAgICAgICAgICAgaWYgKHRhZykge1xuICAgICAgICAgICAgICAgIHJldHVybiBoKHRhZywgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjdHguYXR0cnMpLCBmaWVsZFByb3BzLnZhbHVlKSwgY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgICAgICB9O1xuICAgIH0sXG59KTtcbmZ1bmN0aW9uIHJlc29sdmVUYWcocHJvcHMsIGN0eCkge1xuICAgIGxldCB0YWcgPSBwcm9wcy5hcyB8fCAnJztcbiAgICBpZiAoIXByb3BzLmFzICYmICFjdHguc2xvdHMuZGVmYXVsdCkge1xuICAgICAgICB0YWcgPSAnaW5wdXQnO1xuICAgIH1cbiAgICByZXR1cm4gdGFnO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVZhbGlkYXRpb25UcmlnZ2Vycyhwcm9wcykge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICBjb25zdCB7IHZhbGlkYXRlT25JbnB1dCwgdmFsaWRhdGVPbkNoYW5nZSwgdmFsaWRhdGVPbkJsdXIsIHZhbGlkYXRlT25Nb2RlbFVwZGF0ZSB9ID0gZ2V0Q29uZmlnKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWRhdGVPbklucHV0OiAoX2EgPSBwcm9wcy52YWxpZGF0ZU9uSW5wdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHZhbGlkYXRlT25JbnB1dCxcbiAgICAgICAgdmFsaWRhdGVPbkNoYW5nZTogKF9iID0gcHJvcHMudmFsaWRhdGVPbkNoYW5nZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdmFsaWRhdGVPbkNoYW5nZSxcbiAgICAgICAgdmFsaWRhdGVPbkJsdXI6IChfYyA9IHByb3BzLnZhbGlkYXRlT25CbHVyKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiB2YWxpZGF0ZU9uQmx1cixcbiAgICAgICAgdmFsaWRhdGVPbk1vZGVsVXBkYXRlOiAoX2QgPSBwcm9wcy52YWxpZGF0ZU9uTW9kZWxVcGRhdGUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IHZhbGlkYXRlT25Nb2RlbFVwZGF0ZSxcbiAgICB9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZUluaXRpYWxWYWx1ZShwcm9wcywgY3R4KSB7XG4gICAgLy8gR2V0cyB0aGUgaW5pdGlhbCB2YWx1ZSBlaXRoZXIgZnJvbSBgdmFsdWVgIHByb3AvYXR0ciBvciBgdi1tb2RlbGAgYmluZGluZyAobW9kZWxWYWx1ZSlcbiAgICAvLyBGb3IgY2hlY2tib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyBpdCB3aWxsIGFsd2F5cyBiZSB0aGUgbW9kZWwgdmFsdWUgbm90IHRoZSBgdmFsdWVgIGF0dHJpYnV0ZVxuICAgIGlmICghaGFzQ2hlY2tlZEF0dHIoY3R4LmF0dHJzLnR5cGUpKSB7XG4gICAgICAgIHJldHVybiBpc1Byb3BQcmVzZW50KHByb3BzLCAnbW9kZWxWYWx1ZScpID8gcHJvcHMubW9kZWxWYWx1ZSA6IGN0eC5hdHRycy52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzUHJvcFByZXNlbnQocHJvcHMsICdtb2RlbFZhbHVlJykgPyBwcm9wcy5tb2RlbFZhbHVlIDogdW5kZWZpbmVkO1xufVxuY29uc3QgRmllbGQgPSBGaWVsZEltcGw7XG5cbmxldCBGT1JNX0NPVU5URVIgPSAwO1xuZnVuY3Rpb24gcmVzb2x2ZUluaXRpYWxWYWx1ZXMob3B0cykge1xuICAgIGNvbnN0IHByb3ZpZGVkVmFsdWVzID0gdW5yZWYob3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLmluaXRpYWxWYWx1ZXMpIHx8IHt9O1xuICAgIGNvbnN0IHNjaGVtYSA9IHVucmVmKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy52YWxpZGF0aW9uU2NoZW1hKTtcbiAgICBpZiAoc2NoZW1hICYmIGlzVHlwZWRTY2hlbWEoc2NoZW1hKSAmJiBpc0NhbGxhYmxlKHNjaGVtYS5jYXN0KSkge1xuICAgICAgICByZXR1cm4ga2xvbmEoc2NoZW1hLmNhc3QocHJvdmlkZWRWYWx1ZXMpIHx8IHt9KTtcbiAgICB9XG4gICAgcmV0dXJuIGtsb25hKHByb3ZpZGVkVmFsdWVzKTtcbn1cbmZ1bmN0aW9uIHVzZUZvcm0ob3B0cykge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBmb3JtSWQgPSBGT1JNX0NPVU5URVIrKztcbiAgICBjb25zdCBjb250cm9sbGVkTW9kZWxQYXRocyA9IG5ldyBTZXQoKTtcbiAgICAvLyBQcmV2ZW50cyBmaWVsZHMgZnJvbSBkb3VibGUgcmVzZXR0aW5nIHRoZWlyIHZhbHVlcywgd2hpY2ggY2F1c2VzIGNoZWNrYm94ZXMgdG8gdG9nZ2xlIHRoZWlyIGluaXRpYWwgdmFsdWVcbiAgICAvLyBUT0RPOiBUaGlzIHdvbid0IGJlIG5lZWRlZCBpZiB3ZSBjZW50cmFsaXplIGFsbCB0aGUgc3RhdGUgaW5zaWRlIHRoZSBgZm9ybWAgZm9yIGZvcm0gaW5wdXRzXG4gICAgbGV0IFJFU0VUX0xPQ0sgPSBmYWxzZTtcbiAgICAvLyBBIGxvb2t1cCBjb250YWluaW5nIGZpZWxkcyBvciBmaWVsZCBncm91cHNcbiAgICBjb25zdCBmaWVsZHNCeVBhdGggPSByZWYoe30pO1xuICAgIC8vIElmIHRoZSBmb3JtIGlzIGN1cnJlbnRseSBzdWJtaXR0aW5nXG4gICAgY29uc3QgaXNTdWJtaXR0aW5nID0gcmVmKGZhbHNlKTtcbiAgICAvLyBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSB1c2VyIHRyaWVkIHRvIHN1Ym1pdCB0aGUgZm9ybVxuICAgIGNvbnN0IHN1Ym1pdENvdW50ID0gcmVmKDApO1xuICAgIC8vIGZpZWxkIGFycmF5cyBtYW5hZ2VkIGJ5IHRoaXMgZm9ybVxuICAgIGNvbnN0IGZpZWxkQXJyYXlzID0gW107XG4gICAgLy8gYSBwcml2YXRlIHJlZiBmb3IgYWxsIGZvcm0gdmFsdWVzXG4gICAgY29uc3QgZm9ybVZhbHVlcyA9IHJlYWN0aXZlKHJlc29sdmVJbml0aWFsVmFsdWVzKG9wdHMpKTtcbiAgICAvLyB0aGUgc291cmNlIG9mIGVycm9ycyBmb3IgdGhlIGZvcm0gZmllbGRzXG4gICAgY29uc3QgeyBlcnJvckJhZywgc2V0RXJyb3JCYWcsIHNldEZpZWxkRXJyb3JCYWcgfSA9IHVzZUVycm9yQmFnKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5pbml0aWFsRXJyb3JzKTtcbiAgICAvLyBHZXRzIHRoZSBmaXJzdCBlcnJvciBvZiBlYWNoIGZpZWxkXG4gICAgY29uc3QgZXJyb3JzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4ga2V5c09mKGVycm9yQmFnLnZhbHVlKS5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiYWcgPSBlcnJvckJhZy52YWx1ZVtrZXldO1xuICAgICAgICAgICAgaWYgKGJhZyAmJiBiYWcubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYWNjW2tleV0gPSBiYWdbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSk7XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gZ2V0Rmlyc3RGaWVsZEF0UGF0aChwYXRoKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkT3JHcm91cCA9IGZpZWxkc0J5UGF0aC52YWx1ZVtwYXRoXTtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZmllbGRPckdyb3VwKSA/IGZpZWxkT3JHcm91cFswXSA6IGZpZWxkT3JHcm91cDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZmllbGRFeGlzdHMocGF0aCkge1xuICAgICAgICByZXR1cm4gISFmaWVsZHNCeVBhdGgudmFsdWVbcGF0aF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhvbGRzIGEgY29tcHV0ZWQgcmVmZXJlbmNlIHRvIGFsbCBmaWVsZHMgbmFtZXMgYW5kIGxhYmVsc1xuICAgICAqL1xuICAgIGNvbnN0IGZpZWxkTmFtZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiBrZXlzT2YoZmllbGRzQnlQYXRoLnZhbHVlKS5yZWR1Y2UoKG5hbWVzLCBwYXRoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldEZpcnN0RmllbGRBdFBhdGgocGF0aCk7XG4gICAgICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgICAgICBuYW1lc1twYXRoXSA9IHsgbmFtZTogdW5yZWYoZmllbGQubmFtZSkgfHwgJycsIGxhYmVsOiB1bnJlZihmaWVsZC5sYWJlbCkgfHwgJycgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuYW1lcztcbiAgICAgICAgfSwge30pO1xuICAgIH0pO1xuICAgIGNvbnN0IGZpZWxkQmFpbHNNYXAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiBrZXlzT2YoZmllbGRzQnlQYXRoLnZhbHVlKS5yZWR1Y2UoKG1hcCwgcGF0aCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXRGaXJzdEZpZWxkQXRQYXRoKHBhdGgpO1xuICAgICAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICAgICAgbWFwW3BhdGhdID0gKF9hID0gZmllbGQuYmFpbHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICB9LCB7fSk7XG4gICAgfSk7XG4gICAgLy8gbXV0YWJsZSBub24tcmVhY3RpdmUgcmVmZXJlbmNlIHRvIGluaXRpYWwgZXJyb3JzXG4gICAgLy8gd2UgbmVlZCB0aGlzIHRvIHByb2Nlc3MgaW5pdGlhbCBlcnJvcnMgdGhlbiB1bnNldCB0aGVtXG4gICAgY29uc3QgaW5pdGlhbEVycm9ycyA9IE9iamVjdC5hc3NpZ24oe30sICgob3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLmluaXRpYWxFcnJvcnMpIHx8IHt9KSk7XG4gICAgY29uc3Qga2VlcFZhbHVlc09uVW5tb3VudCA9IChfYSA9IG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5rZWVwVmFsdWVzT25Vbm1vdW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZTtcbiAgICAvLyBpbml0aWFsIGZvcm0gdmFsdWVzXG4gICAgY29uc3QgeyBpbml0aWFsVmFsdWVzLCBvcmlnaW5hbEluaXRpYWxWYWx1ZXMsIHNldEluaXRpYWxWYWx1ZXMgfSA9IHVzZUZvcm1Jbml0aWFsVmFsdWVzKGZpZWxkc0J5UGF0aCwgZm9ybVZhbHVlcywgb3B0cyk7XG4gICAgLy8gZm9ybSBtZXRhIGFnZ3JlZ2F0aW9uc1xuICAgIGNvbnN0IG1ldGEgPSB1c2VGb3JtTWV0YShmaWVsZHNCeVBhdGgsIGZvcm1WYWx1ZXMsIG9yaWdpbmFsSW5pdGlhbFZhbHVlcywgZXJyb3JzKTtcbiAgICBjb25zdCBjb250cm9sbGVkVmFsdWVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gWy4uLmNvbnRyb2xsZWRNb2RlbFBhdGhzLCAuLi5rZXlzT2YoZmllbGRzQnlQYXRoLnZhbHVlKV0ucmVkdWNlKChhY2MsIHBhdGgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0RnJvbVBhdGgoZm9ybVZhbHVlcywgcGF0aCk7XG4gICAgICAgICAgICBzZXRJblBhdGgoYWNjLCBwYXRoLCB2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2NoZW1hID0gb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLnZhbGlkYXRpb25TY2hlbWE7XG4gICAgLyoqXG4gICAgICogQmF0Y2hlcyB2YWxpZGF0aW9uIHJ1bnMgaW4gNW1zIGJhdGNoZXNcbiAgICAgKiBNdXN0IGhhdmUgdHdvIGRpc3RpbmN0IGJhdGNoIHF1ZXVlcyB0byBtYWtlIHN1cmUgdGhleSBkb24ndCBvdmVycmlkZSBlYWNoIG90aGVyIHNldHRpbmdzICMzNzgzXG4gICAgICovXG4gICAgY29uc3QgZGVib3VuY2VkU2lsZW50VmFsaWRhdGlvbiA9IGRlYm91bmNlQXN5bmMoX3ZhbGlkYXRlU2NoZW1hLCA1KTtcbiAgICBjb25zdCBkZWJvdW5jZWRWYWxpZGF0aW9uID0gZGVib3VuY2VBc3luYyhfdmFsaWRhdGVTY2hlbWEsIDUpO1xuICAgIGNvbnN0IHZhbGlkYXRlU2NoZW1hID0gd2l0aExhdGVzdChhc3luYyAobW9kZSkgPT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IG1vZGUpID09PSAnc2lsZW50JyA/IGRlYm91bmNlZFNpbGVudFZhbGlkYXRpb24oKSA6IGRlYm91bmNlZFZhbGlkYXRpb24oKTtcbiAgICB9LCAoZm9ybVJlc3VsdCwgW21vZGVdKSA9PiB7XG4gICAgICAgIC8vIGZpZWxkcyBieSBpZCBsb29rdXBcbiAgICAgICAgY29uc3QgZmllbGRzQnlJZCA9IGZvcm1DdHguZmllbGRzQnlQYXRoLnZhbHVlIHx8IHt9O1xuICAgICAgICAvLyBlcnJvcnMgZmllbGRzIG5hbWVzLCB3ZSBuZWVkIGl0IHRvIGFsc28gY2hlY2sgaWYgY3VzdG9tIGVycm9ycyBhcmUgdXBkYXRlZFxuICAgICAgICBjb25zdCBjdXJyZW50RXJyb3JzUGF0aHMgPSBrZXlzT2YoZm9ybUN0eC5lcnJvckJhZy52YWx1ZSk7XG4gICAgICAgIC8vIGNvbGxlY3QgYWxsIHRoZSBrZXlzIGZyb20gdGhlIHNjaGVtYSBhbmQgYWxsIGZpZWxkc1xuICAgICAgICAvLyB0aGlzIGVuc3VyZXMgd2UgaGF2ZSBhIGNvbXBsZXRlIGtleW1hcCBvZiBhbGwgdGhlIGZpZWxkc1xuICAgICAgICBjb25zdCBwYXRocyA9IFtcbiAgICAgICAgICAgIC4uLm5ldyBTZXQoWy4uLmtleXNPZihmb3JtUmVzdWx0LnJlc3VsdHMpLCAuLi5rZXlzT2YoZmllbGRzQnlJZCksIC4uLmN1cnJlbnRFcnJvcnNQYXRoc10pLFxuICAgICAgICBdO1xuICAgICAgICAvLyBhZ2dyZWdhdGVzIHRoZSBwYXRocyBpbnRvIGEgc2luZ2xlIHJlc3VsdCBvYmplY3Qgd2hpbGUgYXBwbHlpbmcgdGhlIHJlc3VsdHMgb24gdGhlIGZpZWxkc1xuICAgICAgICByZXR1cm4gcGF0aHMucmVkdWNlKCh2YWxpZGF0aW9uLCBwYXRoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGZpZWxkc0J5SWRbcGF0aF07XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IChmb3JtUmVzdWx0LnJlc3VsdHNbcGF0aF0gfHwgeyBlcnJvcnM6IFtdIH0pLmVycm9ycztcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkUmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIGVycm9yczogbWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgdmFsaWQ6ICFtZXNzYWdlcy5sZW5ndGgsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFsaWRhdGlvbi5yZXN1bHRzW3BhdGhdID0gZmllbGRSZXN1bHQ7XG4gICAgICAgICAgICBpZiAoIWZpZWxkUmVzdWx0LnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvbi5lcnJvcnNbcGF0aF0gPSBmaWVsZFJlc3VsdC5lcnJvcnNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmaWVsZCBub3QgcmVuZGVyZWRcbiAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICBzZXRGaWVsZEVycm9yKHBhdGgsIG1lc3NhZ2VzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFsd2F5cyB1cGRhdGUgdGhlIHZhbGlkIGZsYWcgcmVnYXJkbGVzcyBvZiB0aGUgbW9kZVxuICAgICAgICAgICAgYXBwbHlGaWVsZE11dGF0aW9uKGZpZWxkLCBmID0+IChmLm1ldGEudmFsaWQgPSBmaWVsZFJlc3VsdC52YWxpZCkpO1xuICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdzaWxlbnQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3YXNWYWxpZGF0ZWQgPSBBcnJheS5pc0FycmF5KGZpZWxkKSA/IGZpZWxkLnNvbWUoZiA9PiBmLm1ldGEudmFsaWRhdGVkKSA6IGZpZWxkLm1ldGEudmFsaWRhdGVkO1xuICAgICAgICAgICAgaWYgKG1vZGUgPT09ICd2YWxpZGF0ZWQtb25seScgJiYgIXdhc1ZhbGlkYXRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXBwbHlGaWVsZE11dGF0aW9uKGZpZWxkLCBmID0+IGYuc2V0U3RhdGUoeyBlcnJvcnM6IGZpZWxkUmVzdWx0LmVycm9ycyB9KSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvbjtcbiAgICAgICAgfSwgeyB2YWxpZDogZm9ybVJlc3VsdC52YWxpZCwgcmVzdWx0czoge30sIGVycm9yczoge30gfSk7XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gbWFrZVN1Ym1pc3Npb25GYWN0b3J5KG9ubHlDb250cm9sbGVkKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBzdWJtaXRIYW5kbGVyRmFjdG9yeShmbiwgb25WYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBzdWJtaXNzaW9uSGFuZGxlcihlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRvdWNoIGFsbCBmaWVsZHNcbiAgICAgICAgICAgICAgICBzZXRUb3VjaGVkKGtleXNPZihmaWVsZHNCeVBhdGgudmFsdWUpLnJlZHVjZSgoYWNjLCBmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhY2NbZmllbGRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgICAgICB9LCB7fSkpO1xuICAgICAgICAgICAgICAgIGlzU3VibWl0dGluZy52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3VibWl0Q291bnQudmFsdWUrKztcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGUoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBrbG9uYShmb3JtVmFsdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC52YWxpZCAmJiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZWQgPSBrbG9uYShjb250cm9sbGVkVmFsdWVzLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdWJtaXR0ZWRWYWx1ZXMgPSBvbmx5Q29udHJvbGxlZCA/IGNvbnRyb2xsZWQgOiB2YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdHRlZFZhbHVlcyA9IHJlc3VsdC52YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm4oc3VibWl0dGVkVmFsdWVzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0OiBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZWRWYWx1ZXM6IGNvbnRyb2xsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3JzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpZWxkRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG91Y2hlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGaWVsZFRvdWNoZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpZWxkVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRGb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0RmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC52YWxpZCAmJiB0eXBlb2Ygb25WYWxpZGF0aW9uRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsaWRhdGlvbkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0OiBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yczogcmVzdWx0LmVycm9ycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzOiByZXN1bHQucmVzdWx0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmV0dXJuVmFsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaXNTdWJtaXR0aW5nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWw7XG4gICAgICAgICAgICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaXNTdWJtaXR0aW5nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlLXRocm93IHRoZSBlcnIgc28gaXQgZG9lc24ndCBnbyBzaWxlbnRcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgaGFuZGxlU3VibWl0SW1wbCA9IG1ha2VTdWJtaXNzaW9uRmFjdG9yeShmYWxzZSk7XG4gICAgY29uc3QgaGFuZGxlU3VibWl0ID0gaGFuZGxlU3VibWl0SW1wbDtcbiAgICBoYW5kbGVTdWJtaXQud2l0aENvbnRyb2xsZWQgPSBtYWtlU3VibWlzc2lvbkZhY3RvcnkodHJ1ZSk7XG4gICAgY29uc3QgZm9ybUN0eCA9IHtcbiAgICAgICAgZm9ybUlkLFxuICAgICAgICBmaWVsZHNCeVBhdGgsXG4gICAgICAgIHZhbHVlczogZm9ybVZhbHVlcyxcbiAgICAgICAgY29udHJvbGxlZFZhbHVlcyxcbiAgICAgICAgZXJyb3JCYWcsXG4gICAgICAgIGVycm9ycyxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBzdWJtaXRDb3VudCxcbiAgICAgICAgbWV0YSxcbiAgICAgICAgaXNTdWJtaXR0aW5nLFxuICAgICAgICBmaWVsZEFycmF5cyxcbiAgICAgICAga2VlcFZhbHVlc09uVW5tb3VudCxcbiAgICAgICAgdmFsaWRhdGVTY2hlbWE6IHVucmVmKHNjaGVtYSkgPyB2YWxpZGF0ZVNjaGVtYSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdmFsaWRhdGUsXG4gICAgICAgIHJlZ2lzdGVyOiByZWdpc3RlckZpZWxkLFxuICAgICAgICB1bnJlZ2lzdGVyOiB1bnJlZ2lzdGVyRmllbGQsXG4gICAgICAgIHNldEZpZWxkRXJyb3JCYWcsXG4gICAgICAgIHZhbGlkYXRlRmllbGQsXG4gICAgICAgIHNldEZpZWxkVmFsdWUsXG4gICAgICAgIHNldFZhbHVlcyxcbiAgICAgICAgc2V0RXJyb3JzLFxuICAgICAgICBzZXRGaWVsZEVycm9yLFxuICAgICAgICBzZXRGaWVsZFRvdWNoZWQsXG4gICAgICAgIHNldFRvdWNoZWQsXG4gICAgICAgIHJlc2V0Rm9ybSxcbiAgICAgICAgcmVzZXRGaWVsZCxcbiAgICAgICAgaGFuZGxlU3VibWl0LFxuICAgICAgICBzdGFnZUluaXRpYWxWYWx1ZSxcbiAgICAgICAgdW5zZXRJbml0aWFsVmFsdWUsXG4gICAgICAgIHNldEZpZWxkSW5pdGlhbFZhbHVlLFxuICAgICAgICB1c2VGaWVsZE1vZGVsLFxuICAgIH07XG4gICAgZnVuY3Rpb24gaXNGaWVsZEdyb3VwKGZpZWxkT3JHcm91cCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShmaWVsZE9yR3JvdXApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhcHBseUZpZWxkTXV0YXRpb24oZmllbGRPckdyb3VwLCBtdXRhdGlvbikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZE9yR3JvdXApKSB7XG4gICAgICAgICAgICByZXR1cm4gZmllbGRPckdyb3VwLmZvckVhY2gobXV0YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtdXRhdGlvbihmaWVsZE9yR3JvdXApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtdXRhdGVBbGxGaWVsZHMobXV0YXRpb24pIHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhmaWVsZHNCeVBhdGgudmFsdWUpLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgaWYgKCFmaWVsZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGF2b2lkIHJlc2V0dGluZyB0aGUgZmllbGQgdmFsdWVzLCBiZWNhdXNlIHRoZXkgc2hvdWxkJ3ZlIGJlZW4gcmVzZXQgYWxyZWFkeS5cbiAgICAgICAgICAgIGFwcGx5RmllbGRNdXRhdGlvbihmaWVsZCwgbXV0YXRpb24pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFudWFsbHkgc2V0cyBhbiBlcnJvciBtZXNzYWdlIG9uIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRGaWVsZEVycm9yKGZpZWxkLCBtZXNzYWdlKSB7XG4gICAgICAgIHNldEZpZWxkRXJyb3JCYWcoZmllbGQsIG1lc3NhZ2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGVycm9ycyBmb3IgdGhlIGZpZWxkcyBzcGVjaWZpZWQgaW4gdGhlIG9iamVjdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldEVycm9ycyhmaWVsZHMpIHtcbiAgICAgICAgc2V0RXJyb3JCYWcoZmllbGRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHNpbmdsZSBmaWVsZCB2YWx1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldEZpZWxkVmFsdWUoZmllbGQsIHZhbHVlLCB7IGZvcmNlIH0gPSB7IGZvcmNlOiBmYWxzZSB9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgZmllbGRJbnN0YW5jZSA9IGZpZWxkc0J5UGF0aC52YWx1ZVtmaWVsZF07XG4gICAgICAgIGNvbnN0IGNsb25lZFZhbHVlID0ga2xvbmEodmFsdWUpO1xuICAgICAgICAvLyBmaWVsZCB3YXNuJ3QgZm91bmQsIGNyZWF0ZSBhIHZpcnR1YWwgZmllbGQgYXMgYSBwbGFjZWhvbGRlclxuICAgICAgICBpZiAoIWZpZWxkSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHNldEluUGF0aChmb3JtVmFsdWVzLCBmaWVsZCwgY2xvbmVkVmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0ZpZWxkR3JvdXAoZmllbGRJbnN0YW5jZSkgJiYgKChfYSA9IGZpZWxkSW5zdGFuY2VbMF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50eXBlKSA9PT0gJ2NoZWNrYm94JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIC8vIE11bHRpcGxlIGNoZWNrYm94ZXMsIGFuZCBvbmx5IG9uZSBvZiB0aGVtIGdvdCB1cGRhdGVkXG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGtsb25hKHJlc29sdmVOZXh0Q2hlY2tib3hWYWx1ZShnZXRGcm9tUGF0aChmb3JtVmFsdWVzLCBmaWVsZCkgfHwgW10sIHZhbHVlLCB1bmRlZmluZWQpKTtcbiAgICAgICAgICAgIHNldEluUGF0aChmb3JtVmFsdWVzLCBmaWVsZCwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZXdWYWx1ZSA9IGNsb25lZFZhbHVlO1xuICAgICAgICAvLyBTaW5nbGUgQ2hlY2tib3g6IHRvZ2dsZXMgdGhlIGZpZWxkIHZhbHVlIHVubGVzcyB0aGUgZmllbGQgaXMgYmVpbmcgcmVzZXQgdGhlbiBmb3JjZSBpdFxuICAgICAgICBpZiAoIWlzRmllbGRHcm91cChmaWVsZEluc3RhbmNlKSAmJiBmaWVsZEluc3RhbmNlLnR5cGUgPT09ICdjaGVja2JveCcgJiYgIWZvcmNlICYmICFSRVNFVF9MT0NLKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGtsb25hKHJlc29sdmVOZXh0Q2hlY2tib3hWYWx1ZShnZXRGcm9tUGF0aChmb3JtVmFsdWVzLCBmaWVsZCksIHZhbHVlLCB1bnJlZihmaWVsZEluc3RhbmNlLnVuY2hlY2tlZFZhbHVlKSkpO1xuICAgICAgICB9XG4gICAgICAgIHNldEluUGF0aChmb3JtVmFsdWVzLCBmaWVsZCwgbmV3VmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIG11bHRpcGxlIGZpZWxkcyB2YWx1ZXNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRWYWx1ZXMoZmllbGRzKSB7XG4gICAgICAgIC8vIGNsZWFuIHVwIG9sZCB2YWx1ZXNcbiAgICAgICAga2V5c09mKGZvcm1WYWx1ZXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBmb3JtVmFsdWVzW2tleV07XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBzZXQgdXAgbmV3IHZhbHVlc1xuICAgICAgICBrZXlzT2YoZmllbGRzKS5mb3JFYWNoKHBhdGggPT4ge1xuICAgICAgICAgICAgc2V0RmllbGRWYWx1ZShwYXRoLCBmaWVsZHNbcGF0aF0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gcmVnZW5lcmF0ZSB0aGUgYXJyYXlzIHdoZW4gdGhlIGZvcm0gdmFsdWVzIGNoYW5nZVxuICAgICAgICBmaWVsZEFycmF5cy5mb3JFYWNoKGYgPT4gZiAmJiBmLnJlc2V0KCkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVNb2RlbChwYXRoKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IF91c2VGaWVsZFZhbHVlKHBhdGgsIHVuZGVmaW5lZCwgZm9ybUN0eCk7XG4gICAgICAgIHdhdGNoKHZhbHVlLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWZpZWxkRXhpc3RzKHVucmVmKHBhdGgpKSkge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRlKHsgbW9kZTogJ3ZhbGlkYXRlZC1vbmx5JyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRyb2xsZWRNb2RlbFBhdGhzLmFkZCh1bnJlZihwYXRoKSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXNlRmllbGRNb2RlbChwYXRoKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZU1vZGVsKHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoLm1hcChjcmVhdGVNb2RlbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHRvdWNoZWQgbWV0YSBzdGF0ZSBvbiBhIGZpZWxkXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0RmllbGRUb3VjaGVkKGZpZWxkLCBpc1RvdWNoZWQpIHtcbiAgICAgICAgY29uc3QgZmllbGRJbnN0YW5jZSA9IGZpZWxkc0J5UGF0aC52YWx1ZVtmaWVsZF07XG4gICAgICAgIGlmIChmaWVsZEluc3RhbmNlKSB7XG4gICAgICAgICAgICBhcHBseUZpZWxkTXV0YXRpb24oZmllbGRJbnN0YW5jZSwgZiA9PiBmLnNldFRvdWNoZWQoaXNUb3VjaGVkKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdG91Y2hlZCBtZXRhIHN0YXRlIG9uIG11bHRpcGxlIGZpZWxkc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFRvdWNoZWQoZmllbGRzKSB7XG4gICAgICAgIGtleXNPZihmaWVsZHMpLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgc2V0RmllbGRUb3VjaGVkKGZpZWxkLCAhIWZpZWxkc1tmaWVsZF0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzZXRGaWVsZChmaWVsZCwgc3RhdGUpIHtcbiAgICAgICAgY29uc3QgZmllbGRJbnN0YW5jZSA9IGZpZWxkc0J5UGF0aC52YWx1ZVtmaWVsZF07XG4gICAgICAgIGlmIChmaWVsZEluc3RhbmNlKSB7XG4gICAgICAgICAgICBhcHBseUZpZWxkTXV0YXRpb24oZmllbGRJbnN0YW5jZSwgZiA9PiBmLnJlc2V0RmllbGQoc3RhdGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldHMgYWxsIGZpZWxkc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc2V0Rm9ybShzdGF0ZSkge1xuICAgICAgICBSRVNFVF9MT0NLID0gdHJ1ZTtcbiAgICAgICAgLy8gUmVzZXQgYWxsIGZpZWxkIHN0YXRlcyBmaXJzdFxuICAgICAgICBtdXRhdGVBbGxGaWVsZHMoZiA9PiBmLnJlc2V0RmllbGQoKSk7XG4gICAgICAgIC8vIHJlc2V0IHZhbHVlc1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSAoc3RhdGUgPT09IG51bGwgfHwgc3RhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0YXRlLnZhbHVlcykgPyBzdGF0ZS52YWx1ZXMgOiBvcmlnaW5hbEluaXRpYWxWYWx1ZXMudmFsdWU7XG4gICAgICAgIHNldEluaXRpYWxWYWx1ZXMobmV3VmFsdWVzKTtcbiAgICAgICAgc2V0VmFsdWVzKG5ld1ZhbHVlcyk7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gbnVsbCB8fCBzdGF0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RhdGUudG91Y2hlZCkge1xuICAgICAgICAgICAgc2V0VG91Y2hlZChzdGF0ZS50b3VjaGVkKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRFcnJvcnMoKHN0YXRlID09PSBudWxsIHx8IHN0YXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdGF0ZS5lcnJvcnMpIHx8IHt9KTtcbiAgICAgICAgc3VibWl0Q291bnQudmFsdWUgPSAoc3RhdGUgPT09IG51bGwgfHwgc3RhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0YXRlLnN1Ym1pdENvdW50KSB8fCAwO1xuICAgICAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICBSRVNFVF9MT0NLID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbnNlcnRGaWVsZEF0UGF0aChmaWVsZCwgcGF0aCkge1xuICAgICAgICBjb25zdCByYXdGaWVsZCA9IG1hcmtSYXcoZmllbGQpO1xuICAgICAgICBjb25zdCBmaWVsZFBhdGggPSBwYXRoO1xuICAgICAgICAvLyBmaXJzdCBmaWVsZCBhdCB0aGF0IHBhdGhcbiAgICAgICAgaWYgKCFmaWVsZHNCeVBhdGgudmFsdWVbZmllbGRQYXRoXSkge1xuICAgICAgICAgICAgZmllbGRzQnlQYXRoLnZhbHVlW2ZpZWxkUGF0aF0gPSByYXdGaWVsZDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWVsZEF0UGF0aCA9IGZpZWxkc0J5UGF0aC52YWx1ZVtmaWVsZFBhdGhdO1xuICAgICAgICBpZiAoZmllbGRBdFBhdGggJiYgIUFycmF5LmlzQXJyYXkoZmllbGRBdFBhdGgpKSB7XG4gICAgICAgICAgICBmaWVsZHNCeVBhdGgudmFsdWVbZmllbGRQYXRoXSA9IFtmaWVsZEF0UGF0aF07XG4gICAgICAgIH1cbiAgICAgICAgLy8gYWRkIHRoZSBuZXcgYXJyYXkgdG8gdGhhdCBwYXRoXG4gICAgICAgIGZpZWxkc0J5UGF0aC52YWx1ZVtmaWVsZFBhdGhdID0gWy4uLmZpZWxkc0J5UGF0aC52YWx1ZVtmaWVsZFBhdGhdLCByYXdGaWVsZF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbW92ZUZpZWxkRnJvbVBhdGgoZmllbGQsIHBhdGgpIHtcbiAgICAgICAgY29uc3QgZmllbGRQYXRoID0gcGF0aDtcbiAgICAgICAgY29uc3QgZmllbGRBdFBhdGggPSBmaWVsZHNCeVBhdGgudmFsdWVbZmllbGRQYXRoXTtcbiAgICAgICAgaWYgKCFmaWVsZEF0UGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNhbWUgZmllbGQgYXQgcGF0aFxuICAgICAgICBpZiAoIWlzRmllbGRHcm91cChmaWVsZEF0UGF0aCkgJiYgZmllbGQuaWQgPT09IGZpZWxkQXRQYXRoLmlkKSB7XG4gICAgICAgICAgICBkZWxldGUgZmllbGRzQnlQYXRoLnZhbHVlW2ZpZWxkUGF0aF07XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRmllbGRHcm91cChmaWVsZEF0UGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGZpZWxkQXRQYXRoLmZpbmRJbmRleChmID0+IGYuaWQgPT09IGZpZWxkLmlkKTtcbiAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmllbGRBdFBhdGguc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICBpZiAoIWZpZWxkQXRQYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBmaWVsZHNCeVBhdGgudmFsdWVbZmllbGRQYXRoXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWdpc3RlckZpZWxkKGZpZWxkKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkUGF0aCA9IHVucmVmKGZpZWxkLm5hbWUpO1xuICAgICAgICBpbnNlcnRGaWVsZEF0UGF0aChmaWVsZCwgZmllbGRQYXRoKTtcbiAgICAgICAgaWYgKGlzUmVmKGZpZWxkLm5hbWUpKSB7XG4gICAgICAgICAgICAvLyBlbnN1cmVzIHdoZW4gYSBmaWVsZCdzIG5hbWUgd2FzIGFscmVhZHkgdGFrZW4gdGhhdCBpdCBwcmVzZXJ2ZXMgaXRzIHNhbWUgdmFsdWVcbiAgICAgICAgICAgIC8vIG5lY2Vzc2FyeSBmb3IgZmllbGRzIGdlbmVyYXRlZCBieSBsb29wc1xuICAgICAgICAgICAgd2F0Y2goZmllbGQubmFtZSwgYXN5bmMgKG5ld1BhdGgsIG9sZFBhdGgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBjYWNoZSB0aGUgdmFsdWVcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXh0VGljaygpO1xuICAgICAgICAgICAgICAgIHJlbW92ZUZpZWxkRnJvbVBhdGgoZmllbGQsIG9sZFBhdGgpO1xuICAgICAgICAgICAgICAgIGluc2VydEZpZWxkQXRQYXRoKGZpZWxkLCBuZXdQYXRoKTtcbiAgICAgICAgICAgICAgICAvLyByZS12YWxpZGF0ZSBpZiBlaXRoZXIgcGF0aCBoYWQgZXJyb3JzIGJlZm9yZVxuICAgICAgICAgICAgICAgIGlmIChlcnJvcnMudmFsdWVbb2xkUGF0aF0gfHwgZXJyb3JzLnZhbHVlW25ld1BhdGhdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHVwIGJvdGggcGF0aHMgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgIHNldEZpZWxkRXJyb3Iob2xkUGF0aCwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVGaWVsZChuZXdQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY2xlYW4gdXAgdGhlIG9sZCBwYXRoIGlmIG5vIG90aGVyIGZpZWxkIGlzIHNoYXJpbmcgdGhhdCBuYW1lXG4gICAgICAgICAgICAgICAgLy8gIzMzMjVcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXh0VGljaygpO1xuICAgICAgICAgICAgICAgIGlmICghZmllbGRFeGlzdHMob2xkUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5zZXRQYXRoKGZvcm1WYWx1ZXMsIG9sZFBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGZpZWxkIGFscmVhZHkgaGFkIGVycm9ycyAoaW5pdGlhbCBlcnJvcnMpIHRoYXQncyBub3QgdXNlci1zZXQsIHZhbGlkYXRlIGl0IGFnYWluIHRvIGVuc3VyZSBzdGF0ZSBpcyBjb3JyZWN0XG4gICAgICAgIC8vIHRoZSBkaWZmZXJlbmNlIGJlaW5nIHRoYXQgYGluaXRpYWxFcnJvcnNgIHdpbGwgY29udGFpbiB0aGUgZXJyb3IgbWVzc2FnZSB3aGlsZSBvdGhlciBlcnJvcnMgKHByZS12YWxpZGF0ZWQgc2NoZW1hKSB3b24ndCBoYXZlIHRoZW0gYXMgaW5pdGlhbCBlcnJvcnNcbiAgICAgICAgLy8gIzMzNDJcbiAgICAgICAgY29uc3QgaW5pdGlhbEVycm9yTWVzc2FnZSA9IHVucmVmKGZpZWxkLmVycm9yTWVzc2FnZSk7XG4gICAgICAgIGlmIChpbml0aWFsRXJyb3JNZXNzYWdlICYmIChpbml0aWFsRXJyb3JzID09PSBudWxsIHx8IGluaXRpYWxFcnJvcnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGluaXRpYWxFcnJvcnNbZmllbGRQYXRoXSkgIT09IGluaXRpYWxFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRmllbGQoZmllbGRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBtYXJrcyB0aGUgaW5pdGlhbCBlcnJvciBhcyBcImNvbnN1bWVkXCIgc28gaXQgd29uJ3QgYmUgbWF0Y2hlZCBsYXRlciB3aXRoIHNhbWUgbm9uLWluaXRpYWwgZXJyb3JcbiAgICAgICAgZGVsZXRlIGluaXRpYWxFcnJvcnNbZmllbGRQYXRoXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdW5yZWdpc3RlckZpZWxkKGZpZWxkKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHVucmVmKGZpZWxkLm5hbWUpO1xuICAgICAgICBjb25zdCBmaWVsZEluc3RhbmNlID0gZmllbGRzQnlQYXRoLnZhbHVlW2ZpZWxkTmFtZV07XG4gICAgICAgIGNvbnN0IGlzR3JvdXAgPSAhIWZpZWxkSW5zdGFuY2UgJiYgaXNGaWVsZEdyb3VwKGZpZWxkSW5zdGFuY2UpO1xuICAgICAgICByZW1vdmVGaWVsZEZyb21QYXRoKGZpZWxkLCBmaWVsZE5hbWUpO1xuICAgICAgICAvLyBjbGVhcnMgYSBmaWVsZCBlcnJvciBvbiB1bm1vdW50ZWRcbiAgICAgICAgLy8gd2Ugd2FpdCB0aWxsIG5leHQgdGljayB0byBtYWtlIHN1cmUgaWYgdGhlIGZpZWxkIGlzIGNvbXBsZXRlbHkgcmVtb3ZlZCBhbmQgZG9lc24ndCBoYXZlIGFueSBzaWJsaW5ncyBsaWtlIGNoZWNrYm94ZXNcbiAgICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkS2VlcFZhbHVlID0gKF9hID0gdW5yZWYoZmllbGQua2VlcFZhbHVlT25Vbm1vdW50KSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdW5yZWYoa2VlcFZhbHVlc09uVW5tb3VudCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50R3JvdXBWYWx1ZSA9IGdldEZyb21QYXRoKGZvcm1WYWx1ZXMsIGZpZWxkTmFtZSk7XG4gICAgICAgICAgICAvLyBUaGUgYm9vbGVhbiBoZXJlIGlzIHdlIGNoZWNrIGlmIHRoZSBmaWVsZCBzdGlsbCBiZWxvbmdzIHRvIHRoZSBzYW1lIGNvbnRyb2wgZ3JvdXAgd2l0aCB0aGF0IG5hbWVcbiAgICAgICAgICAgIC8vIGlmIGFub3RoZXIgZ3JvdXAgY2xhaW1lZCB0aGUgbmFtZSwgd2Ugc2hvdWxkIGF2b2lkIGhhbmRsaW5nIGl0IHNpbmNlIGl0IGlzIG5vIGxvbmdlciB0aGUgc2FtZSBncm91cFxuICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIHdpdGggYHYtZm9yYCBvdmVyIHNvbWUgY2hlY2tib3hlcyBhbmQgZmllbGQgYXJyYXlzLlxuICAgICAgICAgICAgLy8gYWxzbyBpZiB0aGUgZ3JvdXAgbm8gbG9uZ2VyIGV4aXN0IHdlIGNhbiBhc3N1bWUgdGhpcyBncm91cCB3YXMgdGhlIGxhc3Qgb25lIHRoYXQgY29udHJvbGxlZCBpdFxuICAgICAgICAgICAgY29uc3QgaXNTYW1lR3JvdXAgPSBpc0dyb3VwICYmIChmaWVsZEluc3RhbmNlID09PSBmaWVsZHNCeVBhdGgudmFsdWVbZmllbGROYW1lXSB8fCAhZmllbGRzQnlQYXRoLnZhbHVlW2ZpZWxkTmFtZV0pO1xuICAgICAgICAgICAgLy8gZ3JvdXAgZmllbGQgdGhhdCBzdGlsbCBoYXMgYSBkYW5nbGluZyB2YWx1ZSwgdGhlIGZpZWxkIG1heSBleGlzdCBvciBub3QgYWZ0ZXIgaXQgd2FzIHJlbW92ZWQuXG4gICAgICAgICAgICAvLyBUaGlzIHVzZWQgdG8gYmUgaGFuZGxlZCBpbiB0aGUgdXNlRmllbGQgY29tcG9zYWJsZSBidXQgdGhlIGZvcm0gaGFzIGJldHRlciBjb250ZXh0IG9uIHdoZW4gaXQgc2hvdWxkL25vdCBoYXBwZW4uXG4gICAgICAgICAgICAvLyBpZiBpdCBkb2VzIGJlbG9uZyB0byBpdCB0aGF0IG1lYW5zIHRoZSBncm91cCBzdGlsbCBleGlzdHNcbiAgICAgICAgICAgIC8vICMzODQ0XG4gICAgICAgICAgICBpZiAoaXNTYW1lR3JvdXAgJiYgIXNob3VsZEtlZXBWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnRHcm91cFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZUlkeCA9IGN1cnJlbnRHcm91cFZhbHVlLmZpbmRJbmRleChpID0+IGlzRXF1YWwoaSwgdW5yZWYoZmllbGQuY2hlY2tlZFZhbHVlKSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVJZHggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsID0gWy4uLmN1cnJlbnRHcm91cFZhbHVlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbC5zcGxpY2UodmFsdWVJZHgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmllbGRWYWx1ZShmaWVsZE5hbWUsIG5ld1ZhbCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50R3JvdXBWYWx1ZSA9PT0gdW5yZWYoZmllbGQuY2hlY2tlZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZmllbGQgaWYgaXQgaXMgYSBncm91cCBidXQgZG9lcyBub3QgaGF2ZSBhbiBhcnJheSB2YWx1ZSwgbGlrZSBmb3IgcmFkaW8gaW5wdXRzICMzOTYzXG4gICAgICAgICAgICAgICAgICAgIHVuc2V0UGF0aChmb3JtVmFsdWVzLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZpZWxkIHdhcyByZW1vdmVkIGVudGlyZWx5LCB3ZSBzaG91bGQgdW5zZXQgaXRzIHBhdGhcbiAgICAgICAgICAgIC8vICMzMzg0XG4gICAgICAgICAgICBpZiAoIWZpZWxkRXhpc3RzKGZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBzZXRGaWVsZEVycm9yKGZpZWxkTmFtZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAvLyBDaGVja3MgaWYgdGhlIGZpZWxkIHdhcyBjb25maWd1cmVkIHRvIGJlIHVuc2V0IGR1cmluZyB1bm1vdW50IG9yIG5vdFxuICAgICAgICAgICAgICAgIC8vIENoZWNrcyBib3RoIHRoZSBmb3JtLWxldmVsIGNvbmZpZyBhbmQgZmllbGQtbGV2ZWwgb25lXG4gICAgICAgICAgICAgICAgLy8gRmllbGQgaGFzIHRoZSBwcmlvcml0eSBpZiBpdCBpcyBzZXQsIG90aGVyd2lzZSBpdCBnb2VzIHRvIHRoZSBmb3JtIHNldHRpbmdzXG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZEtlZXBWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIERvbid0IGFwcGx5IGVtcHR5Q29udGFpbmVyIGNoZWNrIHVubGVzcyB0aGUgY3VycmVudCBncm91cCB2YWx1ZSBpcyBhbiBhcnJheVxuICAgICAgICAgICAgICAgIGlmIChpc0dyb3VwICYmIEFycmF5LmlzQXJyYXkoY3VycmVudEdyb3VwVmFsdWUpICYmICFpc0VtcHR5Q29udGFpbmVyKGN1cnJlbnRHcm91cFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuc2V0UGF0aChmb3JtVmFsdWVzLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGUob3B0cykge1xuICAgICAgICBjb25zdCBtb2RlID0gKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5tb2RlKSB8fCAnZm9yY2UnO1xuICAgICAgICBpZiAobW9kZSA9PT0gJ2ZvcmNlJykge1xuICAgICAgICAgICAgbXV0YXRlQWxsRmllbGRzKGYgPT4gKGYubWV0YS52YWxpZGF0ZWQgPSB0cnVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1DdHgudmFsaWRhdGVTY2hlbWEpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtQ3R4LnZhbGlkYXRlU2NoZW1hKG1vZGUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIHNjaGVtYSwgZWFjaCBmaWVsZCBpcyByZXNwb25zaWJsZSB0byB2YWxpZGF0ZSBpdHNlbGZcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbnMgPSBhd2FpdCBQcm9taXNlLmFsbChPYmplY3QudmFsdWVzKGZpZWxkc0J5UGF0aC52YWx1ZSkubWFwKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkSW5zdGFuY2UgPSBBcnJheS5pc0FycmF5KGZpZWxkKSA/IGZpZWxkWzBdIDogZmllbGQ7XG4gICAgICAgICAgICBpZiAoIWZpZWxkSW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsga2V5OiAnJywgdmFsaWQ6IHRydWUsIGVycm9yczogW10gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmllbGRJbnN0YW5jZS52YWxpZGF0ZShvcHRzKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IHVucmVmKGZpZWxkSW5zdGFuY2UubmFtZSksXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkOiByZXN1bHQudmFsaWQsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yczogcmVzdWx0LmVycm9ycyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHt9O1xuICAgICAgICBjb25zdCBlcnJvcnMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB2YWxpZGF0aW9uIG9mIHZhbGlkYXRpb25zKSB7XG4gICAgICAgICAgICByZXN1bHRzW3ZhbGlkYXRpb24ua2V5XSA9IHtcbiAgICAgICAgICAgICAgICB2YWxpZDogdmFsaWRhdGlvbi52YWxpZCxcbiAgICAgICAgICAgICAgICBlcnJvcnM6IHZhbGlkYXRpb24uZXJyb3JzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnNbdmFsaWRhdGlvbi5rZXldID0gdmFsaWRhdGlvbi5lcnJvcnNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbGlkOiB2YWxpZGF0aW9ucy5ldmVyeShyID0+IHIudmFsaWQpLFxuICAgICAgICAgICAgcmVzdWx0cyxcbiAgICAgICAgICAgIGVycm9ycyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVGaWVsZChmaWVsZCkge1xuICAgICAgICBjb25zdCBmaWVsZEluc3RhbmNlID0gZmllbGRzQnlQYXRoLnZhbHVlW2ZpZWxkXTtcbiAgICAgICAgaWYgKCFmaWVsZEluc3RhbmNlKSB7XG4gICAgICAgICAgICB3YXJuJDEoYGZpZWxkIHdpdGggbmFtZSAke2ZpZWxkfSB3YXMgbm90IGZvdW5kYCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZXJyb3JzOiBbXSwgdmFsaWQ6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRJbnN0YW5jZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWVsZEluc3RhbmNlLm1hcChmID0+IGYudmFsaWRhdGUoKSlbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkSW5zdGFuY2UudmFsaWRhdGUoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdW5zZXRJbml0aWFsVmFsdWUocGF0aCkge1xuICAgICAgICB1bnNldFBhdGgoaW5pdGlhbFZhbHVlcy52YWx1ZSwgcGF0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNuZWFreSBmdW5jdGlvbiB0byBzZXQgaW5pdGlhbCBmaWVsZCB2YWx1ZXNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFnZUluaXRpYWxWYWx1ZShwYXRoLCB2YWx1ZSwgdXBkYXRlT3JpZ2luYWwgPSBmYWxzZSkge1xuICAgICAgICBzZXRJblBhdGgoZm9ybVZhbHVlcywgcGF0aCwgdmFsdWUpO1xuICAgICAgICBzZXRGaWVsZEluaXRpYWxWYWx1ZShwYXRoLCB2YWx1ZSk7XG4gICAgICAgIGlmICh1cGRhdGVPcmlnaW5hbCAmJiAhKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5pbml0aWFsVmFsdWVzKSkge1xuICAgICAgICAgICAgc2V0SW5QYXRoKG9yaWdpbmFsSW5pdGlhbFZhbHVlcy52YWx1ZSwgcGF0aCwga2xvbmEodmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRGaWVsZEluaXRpYWxWYWx1ZShwYXRoLCB2YWx1ZSkge1xuICAgICAgICBzZXRJblBhdGgoaW5pdGlhbFZhbHVlcy52YWx1ZSwgcGF0aCwga2xvbmEodmFsdWUpKTtcbiAgICB9XG4gICAgYXN5bmMgZnVuY3Rpb24gX3ZhbGlkYXRlU2NoZW1hKCkge1xuICAgICAgICBjb25zdCBzY2hlbWFWYWx1ZSA9IHVucmVmKHNjaGVtYSk7XG4gICAgICAgIGlmICghc2NoZW1hVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCByZXN1bHRzOiB7fSwgZXJyb3JzOiB7fSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvcm1SZXN1bHQgPSBpc1l1cFZhbGlkYXRvcihzY2hlbWFWYWx1ZSkgfHwgaXNUeXBlZFNjaGVtYShzY2hlbWFWYWx1ZSlcbiAgICAgICAgICAgID8gYXdhaXQgdmFsaWRhdGVUeXBlZFNjaGVtYShzY2hlbWFWYWx1ZSwgZm9ybVZhbHVlcylcbiAgICAgICAgICAgIDogYXdhaXQgdmFsaWRhdGVPYmplY3RTY2hlbWEoc2NoZW1hVmFsdWUsIGZvcm1WYWx1ZXMsIHtcbiAgICAgICAgICAgICAgICBuYW1lczogZmllbGROYW1lcy52YWx1ZSxcbiAgICAgICAgICAgICAgICBiYWlsc01hcDogZmllbGRCYWlsc01hcC52YWx1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZm9ybVJlc3VsdDtcbiAgICB9XG4gICAgY29uc3Qgc3VibWl0Rm9ybSA9IGhhbmRsZVN1Ym1pdCgoXywgeyBldnQgfSkgPT4ge1xuICAgICAgICBpZiAoaXNGb3JtU3VibWl0RXZlbnQoZXZ0KSkge1xuICAgICAgICAgICAgZXZ0LnRhcmdldC5zdWJtaXQoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFRyaWdnZXIgaW5pdGlhbCB2YWxpZGF0aW9uXG4gICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgICAgaWYgKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5pbml0aWFsRXJyb3JzKSB7XG4gICAgICAgICAgICBzZXRFcnJvcnMob3B0cy5pbml0aWFsRXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLmluaXRpYWxUb3VjaGVkKSB7XG4gICAgICAgICAgICBzZXRUb3VjaGVkKG9wdHMuaW5pdGlhbFRvdWNoZWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHZhbGlkYXRlIG9uIG1vdW50IHdhcyBlbmFibGVkXG4gICAgICAgIGlmIChvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMudmFsaWRhdGVPbk1vdW50KSB7XG4gICAgICAgICAgICB2YWxpZGF0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIG90aGVyd2lzZSBydW4gaW5pdGlhbCBzaWxlbnQgdmFsaWRhdGlvbiB0aHJvdWdoIHNjaGVtYSBpZiBhdmFpbGFibGVcbiAgICAgICAgLy8gdGhlIHVzZUZpZWxkIHNob3VsZCBza2lwIHRoZWlyIG93biBzaWxlbnQgdmFsaWRhdGlvbiBpZiBhIHl1cCBzY2hlbWEgaXMgcHJlc2VudFxuICAgICAgICBpZiAoZm9ybUN0eC52YWxpZGF0ZVNjaGVtYSkge1xuICAgICAgICAgICAgZm9ybUN0eC52YWxpZGF0ZVNjaGVtYSgnc2lsZW50Jyk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoaXNSZWYoc2NoZW1hKSkge1xuICAgICAgICB3YXRjaChzY2hlbWEsICgpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIChfYSA9IGZvcm1DdHgudmFsaWRhdGVTY2hlbWEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGZvcm1DdHgsICd2YWxpZGF0ZWQtb25seScpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gUHJvdmlkZSBpbmplY3Rpb25zXG4gICAgcHJvdmlkZShGb3JtQ29udGV4dEtleSwgZm9ybUN0eCk7XG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICByZWdpc3RlckZvcm1XaXRoRGV2VG9vbHMoZm9ybUN0eCk7XG4gICAgICAgIHdhdGNoKCgpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBlcnJvcnM6IGVycm9yQmFnLnZhbHVlIH0sIG1ldGEudmFsdWUpLCB7IHZhbHVlczogZm9ybVZhbHVlcywgaXNTdWJtaXR0aW5nOiBpc1N1Ym1pdHRpbmcudmFsdWUsIHN1Ym1pdENvdW50OiBzdWJtaXRDb3VudC52YWx1ZSB9KSksIHJlZnJlc2hJbnNwZWN0b3IsIHtcbiAgICAgICAgICAgIGRlZXA6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBmb3JtQ3R4KSwgeyBoYW5kbGVSZXNldDogKCkgPT4gcmVzZXRGb3JtKCksIHN1Ym1pdEZvcm0gfSk7XG59XG4vKipcbiAqIE1hbmFnZXMgZm9ybSBtZXRhIGFnZ3JlZ2F0aW9uXG4gKi9cbmZ1bmN0aW9uIHVzZUZvcm1NZXRhKGZpZWxkc0J5UGF0aCwgY3VycmVudFZhbHVlcywgaW5pdGlhbFZhbHVlcywgZXJyb3JzKSB7XG4gICAgY29uc3QgTUVSR0VfU1RSQVRFR0lFUyA9IHtcbiAgICAgICAgdG91Y2hlZDogJ3NvbWUnLFxuICAgICAgICBwZW5kaW5nOiAnc29tZScsXG4gICAgICAgIHZhbGlkOiAnZXZlcnknLFxuICAgIH07XG4gICAgY29uc3QgaXNEaXJ0eSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgcmV0dXJuICFpc0VxdWFsKGN1cnJlbnRWYWx1ZXMsIHVucmVmKGluaXRpYWxWYWx1ZXMpKTtcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVGbGFncygpIHtcbiAgICAgICAgY29uc3QgZmllbGRzID0gT2JqZWN0LnZhbHVlcyhmaWVsZHNCeVBhdGgudmFsdWUpLmZsYXQoMSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICByZXR1cm4ga2V5c09mKE1FUkdFX1NUUkFURUdJRVMpLnJlZHVjZSgoYWNjLCBmbGFnKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXJnZU1ldGhvZCA9IE1FUkdFX1NUUkFURUdJRVNbZmxhZ107XG4gICAgICAgICAgICBhY2NbZmxhZ10gPSBmaWVsZHNbbWVyZ2VNZXRob2RdKGZpZWxkID0+IGZpZWxkLm1ldGFbZmxhZ10pO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pO1xuICAgIH1cbiAgICBjb25zdCBmbGFncyA9IHJlYWN0aXZlKGNhbGN1bGF0ZUZsYWdzKCkpO1xuICAgIHdhdGNoRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjYWxjdWxhdGVGbGFncygpO1xuICAgICAgICBmbGFncy50b3VjaGVkID0gdmFsdWUudG91Y2hlZDtcbiAgICAgICAgZmxhZ3MudmFsaWQgPSB2YWx1ZS52YWxpZDtcbiAgICAgICAgZmxhZ3MucGVuZGluZyA9IHZhbHVlLnBlbmRpbmc7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IGluaXRpYWxWYWx1ZXM6IHVucmVmKGluaXRpYWxWYWx1ZXMpIH0sIGZsYWdzKSwgeyB2YWxpZDogZmxhZ3MudmFsaWQgJiYgIWtleXNPZihlcnJvcnMudmFsdWUpLmxlbmd0aCwgZGlydHk6IGlzRGlydHkudmFsdWUgfSk7XG4gICAgfSk7XG59XG4vKipcbiAqIE1hbmFnZXMgdGhlIGluaXRpYWwgdmFsdWVzIHByb3BcbiAqL1xuZnVuY3Rpb24gdXNlRm9ybUluaXRpYWxWYWx1ZXMoZmllbGRzLCBmb3JtVmFsdWVzLCBvcHRzKSB7XG4gICAgY29uc3QgdmFsdWVzID0gcmVzb2x2ZUluaXRpYWxWYWx1ZXMob3B0cyk7XG4gICAgY29uc3QgcHJvdmlkZWRWYWx1ZXMgPSBvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMuaW5pdGlhbFZhbHVlcztcbiAgICAvLyB0aGVzZSBhcmUgdGhlIG11dGFibGUgaW5pdGlhbCB2YWx1ZXMgYXMgdGhlIGZpZWxkcyBhcmUgbW91bnRlZC91bm1vdW50ZWRcbiAgICBjb25zdCBpbml0aWFsVmFsdWVzID0gcmVmKHZhbHVlcyk7XG4gICAgLy8gdGhlc2UgYXJlIHRoZSBvcmlnaW5hbCBpbml0aWFsIHZhbHVlIGFzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGluaXRpYWxseSwgdGhleSBkb24ndCBrZWVwIHRyYWNrIG9mIGNvbmRpdGlvbmFsIGZpZWxkc1xuICAgIC8vIHRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2Ugc29tZSBjb25kaXRpb25hbCBmaWVsZHMgd2lsbCBvdmVyd3JpdGUgdGhlIGluaXRpYWwgdmFsdWVzIGZvciBvdGhlciBmaWVsZHMgd2hvIGhhZCB0aGUgc2FtZSBuYW1lXG4gICAgLy8gbGlrZSBhcnJheSBmaWVsZHMsIGFueSBwdXNoL2luc2VydCBvcGVyYXRpb24gd2lsbCBvdmVyd3JpdGUgdGhlIGluaXRpYWwgdmFsdWVzIGJlY2F1c2UgdGhleSBcImNyZWF0ZSBuZXcgZmllbGRzXCJcbiAgICAvLyBzbyB0aGVzZSBhcmUgdGhlIHZhbHVlcyB0aGF0IHRoZSByZXNldCBmdW5jdGlvbiBzaG91bGQgdXNlXG4gICAgLy8gdGhlc2Ugb25seSBjaGFuZ2Ugd2hlbiB0aGUgdXNlciBleHBsaWNpdGx5IGNoYW5nZXMgdGhlIGluaXRpYWwgdmFsdWVzIG9yIHdoZW4gdGhlIHVzZXIgcmVzZXRzIHRoZW0gd2l0aCBuZXcgdmFsdWVzLlxuICAgIGNvbnN0IG9yaWdpbmFsSW5pdGlhbFZhbHVlcyA9IHJlZihrbG9uYSh2YWx1ZXMpKTtcbiAgICBmdW5jdGlvbiBzZXRJbml0aWFsVmFsdWVzKHZhbHVlcywgdXBkYXRlRmllbGRzID0gZmFsc2UpIHtcbiAgICAgICAgaW5pdGlhbFZhbHVlcy52YWx1ZSA9IGtsb25hKHZhbHVlcyk7XG4gICAgICAgIG9yaWdpbmFsSW5pdGlhbFZhbHVlcy52YWx1ZSA9IGtsb25hKHZhbHVlcyk7XG4gICAgICAgIGlmICghdXBkYXRlRmllbGRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBwcmlzdGluZSBub24tdG91Y2hlZCBmaWVsZHNcbiAgICAgICAgLy8gdGhvc2UgYXJlIGV4Y2x1ZGVkIGJlY2F1c2UgaXQncyB1bmxpa2VseSB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIGZvcm0gdmFsdWVzIHVzaW5nIGluaXRpYWwgdmFsdWVzXG4gICAgICAgIC8vIHdlIG1vc3RseSB3YXRjaCB0aGVtIGZvciBBUEkgcG9wdWxhdGlvbiBvciBuZXdseSBpbnNlcnRlZCBmaWVsZHNcbiAgICAgICAgLy8gaWYgdGhlIHVzZXIgQVBJIGlzIHRha2luZyB0b28gbXVjaCB0aW1lIGJlZm9yZSB1c2VyIGludGVyYWN0aW9uIHRoZXkgc2hvdWxkIGNvbnNpZGVyIGRpc2FibGluZyBvciBoaWRpbmcgdGhlaXIgaW5wdXRzIHVudGlsIHRoZSB2YWx1ZXMgYXJlIHJlYWR5XG4gICAgICAgIGtleXNPZihmaWVsZHMudmFsdWUpLmZvckVhY2goZmllbGRQYXRoID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRzLnZhbHVlW2ZpZWxkUGF0aF07XG4gICAgICAgICAgICBjb25zdCB3YXNUb3VjaGVkID0gQXJyYXkuaXNBcnJheShmaWVsZCkgPyBmaWVsZC5zb21lKGYgPT4gZi5tZXRhLnRvdWNoZWQpIDogZmllbGQgPT09IG51bGwgfHwgZmllbGQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpZWxkLm1ldGEudG91Y2hlZDtcbiAgICAgICAgICAgIGlmICghZmllbGQgfHwgd2FzVG91Y2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZ2V0RnJvbVBhdGgoaW5pdGlhbFZhbHVlcy52YWx1ZSwgZmllbGRQYXRoKTtcbiAgICAgICAgICAgIHNldEluUGF0aChmb3JtVmFsdWVzLCBmaWVsZFBhdGgsIGtsb25hKG5ld1ZhbHVlKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoaXNSZWYocHJvdmlkZWRWYWx1ZXMpKSB7XG4gICAgICAgIHdhdGNoKHByb3ZpZGVkVmFsdWVzLCB2YWx1ZSA9PiB7XG4gICAgICAgICAgICBzZXRJbml0aWFsVmFsdWVzKHZhbHVlLCB0cnVlKTtcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGluaXRpYWxWYWx1ZXMsXG4gICAgICAgIG9yaWdpbmFsSW5pdGlhbFZhbHVlcyxcbiAgICAgICAgc2V0SW5pdGlhbFZhbHVlcyxcbiAgICB9O1xufVxuZnVuY3Rpb24gdXNlRXJyb3JCYWcoaW5pdGlhbEVycm9ycykge1xuICAgIGNvbnN0IGVycm9yQmFnID0gcmVmKHt9KTtcbiAgICBmdW5jdGlvbiBub3JtYWxpemVFcnJvckl0ZW0obWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShtZXNzYWdlKSA/IG1lc3NhZ2UgOiBtZXNzYWdlID8gW21lc3NhZ2VdIDogW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1hbnVhbGx5IHNldHMgYW4gZXJyb3IgbWVzc2FnZSBvbiBhIHNwZWNpZmljIGZpZWxkXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0RmllbGRFcnJvckJhZyhmaWVsZCwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBlcnJvckJhZy52YWx1ZVtmaWVsZF07XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3JCYWcudmFsdWVbZmllbGRdID0gbm9ybWFsaXplRXJyb3JJdGVtKG1lc3NhZ2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGVycm9ycyBmb3IgdGhlIGZpZWxkcyBzcGVjaWZpZWQgaW4gdGhlIG9iamVjdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldEVycm9yQmFnKGZpZWxkcykge1xuICAgICAgICBlcnJvckJhZy52YWx1ZSA9IGtleXNPZihmaWVsZHMpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBmaWVsZHNba2V5XTtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgYWNjW2tleV0gPSBub3JtYWxpemVFcnJvckl0ZW0obWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSk7XG4gICAgfVxuICAgIGlmIChpbml0aWFsRXJyb3JzKSB7XG4gICAgICAgIHNldEVycm9yQmFnKGluaXRpYWxFcnJvcnMpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBlcnJvckJhZyxcbiAgICAgICAgc2V0RXJyb3JCYWcsXG4gICAgICAgIHNldEZpZWxkRXJyb3JCYWcsXG4gICAgfTtcbn1cblxuY29uc3QgRm9ybUltcGwgPSBkZWZpbmVDb21wb25lbnQoe1xuICAgIG5hbWU6ICdGb3JtJyxcbiAgICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuICAgIHByb3BzOiB7XG4gICAgICAgIGFzOiB7XG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgICAgICBkZWZhdWx0OiAnZm9ybScsXG4gICAgICAgIH0sXG4gICAgICAgIHZhbGlkYXRpb25TY2hlbWE6IHtcbiAgICAgICAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgICAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgaW5pdGlhbFZhbHVlczoge1xuICAgICAgICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgICAgICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgICBpbml0aWFsRXJyb3JzOiB7XG4gICAgICAgICAgICB0eXBlOiBPYmplY3QsXG4gICAgICAgICAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIGluaXRpYWxUb3VjaGVkOiB7XG4gICAgICAgICAgICB0eXBlOiBPYmplY3QsXG4gICAgICAgICAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIHZhbGlkYXRlT25Nb3VudDoge1xuICAgICAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBvblN1Ym1pdDoge1xuICAgICAgICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICAgICAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIG9uSW52YWxpZFN1Ym1pdDoge1xuICAgICAgICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICAgICAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIGtlZXBWYWx1ZXM6IHtcbiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlcyA9IHRvUmVmKHByb3BzLCAnaW5pdGlhbFZhbHVlcycpO1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uU2NoZW1hID0gdG9SZWYocHJvcHMsICd2YWxpZGF0aW9uU2NoZW1hJyk7XG4gICAgICAgIGNvbnN0IGtlZXBWYWx1ZXMgPSB0b1JlZihwcm9wcywgJ2tlZXBWYWx1ZXMnKTtcbiAgICAgICAgY29uc3QgeyBlcnJvcnMsIGVycm9yQmFnLCB2YWx1ZXMsIG1ldGEsIGlzU3VibWl0dGluZywgc3VibWl0Q291bnQsIGNvbnRyb2xsZWRWYWx1ZXMsIHZhbGlkYXRlLCB2YWxpZGF0ZUZpZWxkLCBoYW5kbGVSZXNldCwgcmVzZXRGb3JtLCBoYW5kbGVTdWJtaXQsIHNldEVycm9ycywgc2V0RmllbGRFcnJvciwgc2V0RmllbGRWYWx1ZSwgc2V0VmFsdWVzLCBzZXRGaWVsZFRvdWNoZWQsIHNldFRvdWNoZWQsIHJlc2V0RmllbGQsIH0gPSB1c2VGb3JtKHtcbiAgICAgICAgICAgIHZhbGlkYXRpb25TY2hlbWE6IHZhbGlkYXRpb25TY2hlbWEudmFsdWUgPyB2YWxpZGF0aW9uU2NoZW1hIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaW5pdGlhbFZhbHVlcyxcbiAgICAgICAgICAgIGluaXRpYWxFcnJvcnM6IHByb3BzLmluaXRpYWxFcnJvcnMsXG4gICAgICAgICAgICBpbml0aWFsVG91Y2hlZDogcHJvcHMuaW5pdGlhbFRvdWNoZWQsXG4gICAgICAgICAgICB2YWxpZGF0ZU9uTW91bnQ6IHByb3BzLnZhbGlkYXRlT25Nb3VudCxcbiAgICAgICAgICAgIGtlZXBWYWx1ZXNPblVubW91bnQ6IGtlZXBWYWx1ZXMsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzdWJtaXRGb3JtID0gaGFuZGxlU3VibWl0KChfLCB7IGV2dCB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNGb3JtU3VibWl0RXZlbnQoZXZ0KSkge1xuICAgICAgICAgICAgICAgIGV2dC50YXJnZXQuc3VibWl0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHByb3BzLm9uSW52YWxpZFN1Ym1pdCk7XG4gICAgICAgIGNvbnN0IG9uU3VibWl0ID0gcHJvcHMub25TdWJtaXQgPyBoYW5kbGVTdWJtaXQocHJvcHMub25TdWJtaXQsIHByb3BzLm9uSW52YWxpZFN1Ym1pdCkgOiBzdWJtaXRGb3JtO1xuICAgICAgICBmdW5jdGlvbiBoYW5kbGVGb3JtUmVzZXQoZSkge1xuICAgICAgICAgICAgaWYgKGlzRXZlbnQoZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGRlZmF1bHQgZm9ybSByZXNldCBiZWhhdmlvclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZVJlc2V0KCk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGN0eC5hdHRycy5vblJlc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY3R4LmF0dHJzLm9uUmVzZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVTY29wZWRTbG90U3VibWl0KGV2dCwgb25TdWJtaXQpIHtcbiAgICAgICAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IHR5cGVvZiBldnQgPT09ICdmdW5jdGlvbicgJiYgIW9uU3VibWl0ID8gZXZ0IDogb25TdWJtaXQ7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlU3VibWl0KG9uU3VjY2VzcywgcHJvcHMub25JbnZhbGlkU3VibWl0KShldnQpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGdldFZhbHVlcygpIHtcbiAgICAgICAgICAgIHJldHVybiBrbG9uYSh2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGdldE1ldGEoKSB7XG4gICAgICAgICAgICByZXR1cm4ga2xvbmEobWV0YS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ2V0RXJyb3JzKCkge1xuICAgICAgICAgICAgcmV0dXJuIGtsb25hKGVycm9ycy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2xvdFByb3BzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtZXRhOiBtZXRhLnZhbHVlLFxuICAgICAgICAgICAgICAgIGVycm9yczogZXJyb3JzLnZhbHVlLFxuICAgICAgICAgICAgICAgIGVycm9yQmFnOiBlcnJvckJhZy52YWx1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICAgICAgaXNTdWJtaXR0aW5nOiBpc1N1Ym1pdHRpbmcudmFsdWUsXG4gICAgICAgICAgICAgICAgc3VibWl0Q291bnQ6IHN1Ym1pdENvdW50LnZhbHVlLFxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZWRWYWx1ZXM6IGNvbnRyb2xsZWRWYWx1ZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgdmFsaWRhdGUsXG4gICAgICAgICAgICAgICAgdmFsaWRhdGVGaWVsZCxcbiAgICAgICAgICAgICAgICBoYW5kbGVTdWJtaXQ6IGhhbmRsZVNjb3BlZFNsb3RTdWJtaXQsXG4gICAgICAgICAgICAgICAgaGFuZGxlUmVzZXQsXG4gICAgICAgICAgICAgICAgc3VibWl0Rm9ybSxcbiAgICAgICAgICAgICAgICBzZXRFcnJvcnMsXG4gICAgICAgICAgICAgICAgc2V0RmllbGRFcnJvcixcbiAgICAgICAgICAgICAgICBzZXRGaWVsZFZhbHVlLFxuICAgICAgICAgICAgICAgIHNldFZhbHVlcyxcbiAgICAgICAgICAgICAgICBzZXRGaWVsZFRvdWNoZWQsXG4gICAgICAgICAgICAgICAgc2V0VG91Y2hlZCxcbiAgICAgICAgICAgICAgICByZXNldEZvcm0sXG4gICAgICAgICAgICAgICAgcmVzZXRGaWVsZCxcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZXMsXG4gICAgICAgICAgICAgICAgZ2V0TWV0YSxcbiAgICAgICAgICAgICAgICBnZXRFcnJvcnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIGV4cG9zZSB0aGVzZSBmdW5jdGlvbnMgYW5kIG1ldGhvZHMgYXMgcGFydCBvZiBwdWJsaWMgQVBJXG4gICAgICAgIGN0eC5leHBvc2Uoe1xuICAgICAgICAgICAgc2V0RmllbGRFcnJvcixcbiAgICAgICAgICAgIHNldEVycm9ycyxcbiAgICAgICAgICAgIHNldEZpZWxkVmFsdWUsXG4gICAgICAgICAgICBzZXRWYWx1ZXMsXG4gICAgICAgICAgICBzZXRGaWVsZFRvdWNoZWQsXG4gICAgICAgICAgICBzZXRUb3VjaGVkLFxuICAgICAgICAgICAgcmVzZXRGb3JtLFxuICAgICAgICAgICAgdmFsaWRhdGUsXG4gICAgICAgICAgICB2YWxpZGF0ZUZpZWxkLFxuICAgICAgICAgICAgcmVzZXRGaWVsZCxcbiAgICAgICAgICAgIGdldFZhbHVlcyxcbiAgICAgICAgICAgIGdldE1ldGEsXG4gICAgICAgICAgICBnZXRFcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gcmVuZGVyRm9ybSgpIHtcbiAgICAgICAgICAgIC8vIGF2b2lkIHJlc29sdmluZyB0aGUgZm9ybSBjb21wb25lbnQgYXMgaXRzZWxmXG4gICAgICAgICAgICBjb25zdCB0YWcgPSBwcm9wcy5hcyA9PT0gJ2Zvcm0nID8gcHJvcHMuYXMgOiByZXNvbHZlRHluYW1pY0NvbXBvbmVudChwcm9wcy5hcyk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vcm1hbGl6ZUNoaWxkcmVuKHRhZywgY3R4LCBzbG90UHJvcHMpO1xuICAgICAgICAgICAgaWYgKCFwcm9wcy5hcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEF0dHJpYnV0ZXMgdG8gYWRkIG9uIGEgbmF0aXZlIGBmb3JtYCB0YWdcbiAgICAgICAgICAgIGNvbnN0IGZvcm1BdHRycyA9IHByb3BzLmFzID09PSAnZm9ybSdcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZXMgbmF0aXZlIHZhbGlkYXRpb24gYXMgdmVlLXZhbGlkYXRlIHdpbGwgaGFuZGxlIGl0LlxuICAgICAgICAgICAgICAgICAgICBub3ZhbGlkYXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHt9O1xuICAgICAgICAgICAgcmV0dXJuIGgodGFnLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZm9ybUF0dHJzKSwgY3R4LmF0dHJzKSwgeyBvblN1Ym1pdCwgb25SZXNldDogaGFuZGxlRm9ybVJlc2V0IH0pLCBjaGlsZHJlbik7XG4gICAgICAgIH07XG4gICAgfSxcbn0pO1xuY29uc3QgRm9ybSA9IEZvcm1JbXBsO1xuXG5mdW5jdGlvbiB1c2VGaWVsZEFycmF5KGFycmF5UGF0aCkge1xuICAgIGNvbnN0IGZvcm0gPSBpbmplY3RXaXRoU2VsZihGb3JtQ29udGV4dEtleSwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCBmaWVsZHMgPSByZWYoW10pO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBjb25zdCBub09wID0gKCkgPT4geyB9O1xuICAgIGNvbnN0IG5vT3BBcGkgPSB7XG4gICAgICAgIGZpZWxkcyxcbiAgICAgICAgcmVtb3ZlOiBub09wLFxuICAgICAgICBwdXNoOiBub09wLFxuICAgICAgICBzd2FwOiBub09wLFxuICAgICAgICBpbnNlcnQ6IG5vT3AsXG4gICAgICAgIHVwZGF0ZTogbm9PcCxcbiAgICAgICAgcmVwbGFjZTogbm9PcCxcbiAgICAgICAgcHJlcGVuZDogbm9PcCxcbiAgICAgICAgbW92ZTogbm9PcCxcbiAgICB9O1xuICAgIGlmICghZm9ybSkge1xuICAgICAgICB3YXJuKCdGaWVsZEFycmF5IHJlcXVpcmVzIGJlaW5nIGEgY2hpbGQgb2YgYDxGb3JtLz5gIG9yIGB1c2VGb3JtYCBiZWluZyBjYWxsZWQgYmVmb3JlIGl0LiBBcnJheSBmaWVsZHMgbWF5IG5vdCB3b3JrIGNvcnJlY3RseScpO1xuICAgICAgICByZXR1cm4gbm9PcEFwaTtcbiAgICB9XG4gICAgaWYgKCF1bnJlZihhcnJheVBhdGgpKSB7XG4gICAgICAgIHdhcm4oJ0ZpZWxkQXJyYXkgcmVxdWlyZXMgYSBmaWVsZCBwYXRoIHRvIGJlIHByb3ZpZGVkLCBkaWQgeW91IGZvcmdldCB0byBwYXNzIHRoZSBgbmFtZWAgcHJvcD8nKTtcbiAgICAgICAgcmV0dXJuIG5vT3BBcGk7XG4gICAgfVxuICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBmb3JtLmZpZWxkQXJyYXlzLmZpbmQoYSA9PiB1bnJlZihhLnBhdGgpID09PSB1bnJlZihhcnJheVBhdGgpKTtcbiAgICBpZiAoYWxyZWFkeUV4aXN0cykge1xuICAgICAgICByZXR1cm4gYWxyZWFkeUV4aXN0cztcbiAgICB9XG4gICAgbGV0IGVudHJ5Q291bnRlciA9IDA7XG4gICAgZnVuY3Rpb24gZ2V0Q3VycmVudFZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIGdldEZyb21QYXRoKGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS52YWx1ZXMsIHVucmVmKGFycmF5UGF0aCksIFtdKSB8fCBbXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5pdEZpZWxkcygpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlcyA9IGdldEN1cnJlbnRWYWx1ZXMoKTtcbiAgICAgICAgZmllbGRzLnZhbHVlID0gY3VycmVudFZhbHVlcy5tYXAoY3JlYXRlRW50cnkpO1xuICAgICAgICB1cGRhdGVFbnRyeUZsYWdzKCk7XG4gICAgfVxuICAgIGluaXRGaWVsZHMoKTtcbiAgICBmdW5jdGlvbiB1cGRhdGVFbnRyeUZsYWdzKCkge1xuICAgICAgICBjb25zdCBmaWVsZHNMZW5ndGggPSBmaWVsZHMudmFsdWUubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGZpZWxkcy52YWx1ZVtpXTtcbiAgICAgICAgICAgIGVudHJ5LmlzRmlyc3QgPSBpID09PSAwO1xuICAgICAgICAgICAgZW50cnkuaXNMYXN0ID0gaSA9PT0gZmllbGRzTGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVFbnRyeSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBrZXkgPSBlbnRyeUNvdW50ZXIrKztcbiAgICAgICAgY29uc3QgZW50cnkgPSB7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZTogY29tcHV0ZWREZWVwKHtcbiAgICAgICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZXMgPSBnZXRGcm9tUGF0aChmb3JtID09PSBudWxsIHx8IGZvcm0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvcm0udmFsdWVzLCB1bnJlZihhcnJheVBhdGgpLCBbXSkgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGZpZWxkcy52YWx1ZS5maW5kSW5kZXgoZSA9PiBlLmtleSA9PT0ga2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkeCA9PT0gLTEgPyB2YWx1ZSA6IGN1cnJlbnRWYWx1ZXNbaWR4XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZHggPSBmaWVsZHMudmFsdWUuZmluZEluZGV4KGUgPT4gZS5rZXkgPT09IGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXJuKGBBdHRlbXB0aW5nIHRvIHVwZGF0ZSBhIG5vbi1leGlzdGVudCBhcnJheSBpdGVtYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlKGlkeCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGlzRmlyc3Q6IGZhbHNlLFxuICAgICAgICAgICAgaXNMYXN0OiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH1cbiAgICBmdW5jdGlvbiBhZnRlck11dGF0aW9uKCkge1xuICAgICAgICB1cGRhdGVFbnRyeUZsYWdzKCk7XG4gICAgICAgIC8vIFNob3VsZCB0cmlnZ2VyIGEgc2lsZW50IHZhbGlkYXRpb24gc2luY2UgYSBmaWVsZCBtYXkgbm90IGRvIHRoYXQgIzQwOTZcbiAgICAgICAgZm9ybSA9PT0gbnVsbCB8fCBmb3JtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb3JtLnZhbGlkYXRlKHsgbW9kZTogJ3NpbGVudCcgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbW92ZShpZHgpIHtcbiAgICAgICAgY29uc3QgcGF0aE5hbWUgPSB1bnJlZihhcnJheVBhdGgpO1xuICAgICAgICBjb25zdCBwYXRoVmFsdWUgPSBnZXRGcm9tUGF0aChmb3JtID09PSBudWxsIHx8IGZvcm0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvcm0udmFsdWVzLCBwYXRoTmFtZSk7XG4gICAgICAgIGlmICghcGF0aFZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHBhdGhWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IFsuLi5wYXRoVmFsdWVdO1xuICAgICAgICBuZXdWYWx1ZS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgZm9ybSA9PT0gbnVsbCB8fCBmb3JtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb3JtLnVuc2V0SW5pdGlhbFZhbHVlKHBhdGhOYW1lICsgYFske2lkeH1dYCk7XG4gICAgICAgIGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS5zZXRGaWVsZFZhbHVlKHBhdGhOYW1lLCBuZXdWYWx1ZSk7XG4gICAgICAgIGZpZWxkcy52YWx1ZS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgYWZ0ZXJNdXRhdGlvbigpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHBhdGhOYW1lID0gdW5yZWYoYXJyYXlQYXRoKTtcbiAgICAgICAgY29uc3QgcGF0aFZhbHVlID0gZ2V0RnJvbVBhdGgoZm9ybSA9PT0gbnVsbCB8fCBmb3JtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb3JtLnZhbHVlcywgcGF0aE5hbWUpO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkUGF0aFZhbHVlID0gaXNOdWxsT3JVbmRlZmluZWQocGF0aFZhbHVlKSA/IFtdIDogcGF0aFZhbHVlO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9ybWFsaXplZFBhdGhWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IFsuLi5ub3JtYWxpemVkUGF0aFZhbHVlXTtcbiAgICAgICAgbmV3VmFsdWUucHVzaCh2YWx1ZSk7XG4gICAgICAgIGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS5zdGFnZUluaXRpYWxWYWx1ZShwYXRoTmFtZSArIGBbJHtuZXdWYWx1ZS5sZW5ndGggLSAxfV1gLCB2YWx1ZSk7XG4gICAgICAgIGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS5zZXRGaWVsZFZhbHVlKHBhdGhOYW1lLCBuZXdWYWx1ZSk7XG4gICAgICAgIGZpZWxkcy52YWx1ZS5wdXNoKGNyZWF0ZUVudHJ5KHZhbHVlKSk7XG4gICAgICAgIGFmdGVyTXV0YXRpb24oKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3dhcChpbmRleEEsIGluZGV4Qikge1xuICAgICAgICBjb25zdCBwYXRoTmFtZSA9IHVucmVmKGFycmF5UGF0aCk7XG4gICAgICAgIGNvbnN0IHBhdGhWYWx1ZSA9IGdldEZyb21QYXRoKGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS52YWx1ZXMsIHBhdGhOYW1lKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhdGhWYWx1ZSkgfHwgIShpbmRleEEgaW4gcGF0aFZhbHVlKSB8fCAhKGluZGV4QiBpbiBwYXRoVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBbLi4ucGF0aFZhbHVlXTtcbiAgICAgICAgY29uc3QgbmV3RmllbGRzID0gWy4uLmZpZWxkcy52YWx1ZV07XG4gICAgICAgIC8vIHRoZSBvbGQgc3dpdGNoZXJvb1xuICAgICAgICBjb25zdCB0ZW1wID0gbmV3VmFsdWVbaW5kZXhBXTtcbiAgICAgICAgbmV3VmFsdWVbaW5kZXhBXSA9IG5ld1ZhbHVlW2luZGV4Ql07XG4gICAgICAgIG5ld1ZhbHVlW2luZGV4Ql0gPSB0ZW1wO1xuICAgICAgICBjb25zdCB0ZW1wRW50cnkgPSBuZXdGaWVsZHNbaW5kZXhBXTtcbiAgICAgICAgbmV3RmllbGRzW2luZGV4QV0gPSBuZXdGaWVsZHNbaW5kZXhCXTtcbiAgICAgICAgbmV3RmllbGRzW2luZGV4Ql0gPSB0ZW1wRW50cnk7XG4gICAgICAgIGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS5zZXRGaWVsZFZhbHVlKHBhdGhOYW1lLCBuZXdWYWx1ZSk7XG4gICAgICAgIGZpZWxkcy52YWx1ZSA9IG5ld0ZpZWxkcztcbiAgICAgICAgdXBkYXRlRW50cnlGbGFncygpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbnNlcnQoaWR4LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBwYXRoTmFtZSA9IHVucmVmKGFycmF5UGF0aCk7XG4gICAgICAgIGNvbnN0IHBhdGhWYWx1ZSA9IGdldEZyb21QYXRoKGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS52YWx1ZXMsIHBhdGhOYW1lKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhdGhWYWx1ZSkgfHwgcGF0aFZhbHVlLmxlbmd0aCA8IGlkeCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gWy4uLnBhdGhWYWx1ZV07XG4gICAgICAgIGNvbnN0IG5ld0ZpZWxkcyA9IFsuLi5maWVsZHMudmFsdWVdO1xuICAgICAgICBuZXdWYWx1ZS5zcGxpY2UoaWR4LCAwLCB2YWx1ZSk7XG4gICAgICAgIG5ld0ZpZWxkcy5zcGxpY2UoaWR4LCAwLCBjcmVhdGVFbnRyeSh2YWx1ZSkpO1xuICAgICAgICBmb3JtID09PSBudWxsIHx8IGZvcm0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvcm0uc2V0RmllbGRWYWx1ZShwYXRoTmFtZSwgbmV3VmFsdWUpO1xuICAgICAgICBmaWVsZHMudmFsdWUgPSBuZXdGaWVsZHM7XG4gICAgICAgIGFmdGVyTXV0YXRpb24oKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVwbGFjZShhcnIpIHtcbiAgICAgICAgY29uc3QgcGF0aE5hbWUgPSB1bnJlZihhcnJheVBhdGgpO1xuICAgICAgICBmb3JtID09PSBudWxsIHx8IGZvcm0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvcm0uc2V0RmllbGRWYWx1ZShwYXRoTmFtZSwgYXJyKTtcbiAgICAgICAgaW5pdEZpZWxkcygpO1xuICAgICAgICBhZnRlck11dGF0aW9uKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZShpZHgsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHBhdGhOYW1lID0gdW5yZWYoYXJyYXlQYXRoKTtcbiAgICAgICAgY29uc3QgcGF0aFZhbHVlID0gZ2V0RnJvbVBhdGgoZm9ybSA9PT0gbnVsbCB8fCBmb3JtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb3JtLnZhbHVlcywgcGF0aE5hbWUpO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGF0aFZhbHVlKSB8fCBwYXRoVmFsdWUubGVuZ3RoIC0gMSA8IGlkeCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS5zZXRGaWVsZFZhbHVlKGAke3BhdGhOYW1lfVske2lkeH1dYCwgdmFsdWUpO1xuICAgICAgICBmb3JtID09PSBudWxsIHx8IGZvcm0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvcm0udmFsaWRhdGUoeyBtb2RlOiAndmFsaWRhdGVkLW9ubHknIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcmVwZW5kKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHBhdGhOYW1lID0gdW5yZWYoYXJyYXlQYXRoKTtcbiAgICAgICAgY29uc3QgcGF0aFZhbHVlID0gZ2V0RnJvbVBhdGgoZm9ybSA9PT0gbnVsbCB8fCBmb3JtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb3JtLnZhbHVlcywgcGF0aE5hbWUpO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkUGF0aFZhbHVlID0gaXNOdWxsT3JVbmRlZmluZWQocGF0aFZhbHVlKSA/IFtdIDogcGF0aFZhbHVlO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9ybWFsaXplZFBhdGhWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IFt2YWx1ZSwgLi4ubm9ybWFsaXplZFBhdGhWYWx1ZV07XG4gICAgICAgIGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS5zdGFnZUluaXRpYWxWYWx1ZShwYXRoTmFtZSArIGBbJHtuZXdWYWx1ZS5sZW5ndGggLSAxfV1gLCB2YWx1ZSk7XG4gICAgICAgIGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS5zZXRGaWVsZFZhbHVlKHBhdGhOYW1lLCBuZXdWYWx1ZSk7XG4gICAgICAgIGZpZWxkcy52YWx1ZS51bnNoaWZ0KGNyZWF0ZUVudHJ5KHZhbHVlKSk7XG4gICAgICAgIGFmdGVyTXV0YXRpb24oKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbW92ZShvbGRJZHgsIG5ld0lkeCkge1xuICAgICAgICBjb25zdCBwYXRoTmFtZSA9IHVucmVmKGFycmF5UGF0aCk7XG4gICAgICAgIGNvbnN0IHBhdGhWYWx1ZSA9IGdldEZyb21QYXRoKGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS52YWx1ZXMsIHBhdGhOYW1lKTtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBpc051bGxPclVuZGVmaW5lZChwYXRoVmFsdWUpID8gW10gOiBbLi4ucGF0aFZhbHVlXTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhdGhWYWx1ZSkgfHwgIShvbGRJZHggaW4gcGF0aFZhbHVlKSB8fCAhKG5ld0lkeCBpbiBwYXRoVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3RmllbGRzID0gWy4uLmZpZWxkcy52YWx1ZV07XG4gICAgICAgIGNvbnN0IG1vdmVkSXRlbSA9IG5ld0ZpZWxkc1tvbGRJZHhdO1xuICAgICAgICBuZXdGaWVsZHMuc3BsaWNlKG9sZElkeCwgMSk7XG4gICAgICAgIG5ld0ZpZWxkcy5zcGxpY2UobmV3SWR4LCAwLCBtb3ZlZEl0ZW0pO1xuICAgICAgICBjb25zdCBtb3ZlZFZhbHVlID0gbmV3VmFsdWVbb2xkSWR4XTtcbiAgICAgICAgbmV3VmFsdWUuc3BsaWNlKG9sZElkeCwgMSk7XG4gICAgICAgIG5ld1ZhbHVlLnNwbGljZShuZXdJZHgsIDAsIG1vdmVkVmFsdWUpO1xuICAgICAgICBmb3JtID09PSBudWxsIHx8IGZvcm0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvcm0uc2V0RmllbGRWYWx1ZShwYXRoTmFtZSwgbmV3VmFsdWUpO1xuICAgICAgICBmaWVsZHMudmFsdWUgPSBuZXdGaWVsZHM7XG4gICAgICAgIGFmdGVyTXV0YXRpb24oKTtcbiAgICB9XG4gICAgY29uc3QgZmllbGRBcnJheUN0eCA9IHtcbiAgICAgICAgZmllbGRzLFxuICAgICAgICByZW1vdmUsXG4gICAgICAgIHB1c2gsXG4gICAgICAgIHN3YXAsXG4gICAgICAgIGluc2VydCxcbiAgICAgICAgdXBkYXRlLFxuICAgICAgICByZXBsYWNlLFxuICAgICAgICBwcmVwZW5kLFxuICAgICAgICBtb3ZlLFxuICAgIH07XG4gICAgZm9ybS5maWVsZEFycmF5cy5wdXNoKE9iamVjdC5hc3NpZ24oeyBwYXRoOiBhcnJheVBhdGgsIHJlc2V0OiBpbml0RmllbGRzIH0sIGZpZWxkQXJyYXlDdHgpKTtcbiAgICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgICAgICBjb25zdCBpZHggPSBmb3JtLmZpZWxkQXJyYXlzLmZpbmRJbmRleChpID0+IHVucmVmKGkucGF0aCkgPT09IHVucmVmKGFycmF5UGF0aCkpO1xuICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgIGZvcm0uZmllbGRBcnJheXMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBNYWtlcyBzdXJlIHRvIHN5bmMgdGhlIGZvcm0gdmFsdWVzIHdpdGggdGhlIGFycmF5IHZhbHVlIGlmIHRoZXkgZ28gb3V0IG9mIHN5bmNcbiAgICAvLyAjNDE1M1xuICAgIHdhdGNoKGdldEN1cnJlbnRWYWx1ZXMsIGZvcm1WYWx1ZXMgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZHNWYWx1ZXMgPSBmaWVsZHMudmFsdWUubWFwKGYgPT4gZi52YWx1ZSk7XG4gICAgICAgIC8vIElmIGZvcm0gdmFsdWVzIGFyZSBub3QgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgdmFsdWVzIHRoZW4gc29tZXRoaW5nIG92ZXJyb2RlIHRoZW0uXG4gICAgICAgIGlmICghaXNFcXVhbChmb3JtVmFsdWVzLCBmaWVsZHNWYWx1ZXMpKSB7XG4gICAgICAgICAgICBpbml0RmllbGRzKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmllbGRBcnJheUN0eDtcbn1cblxuY29uc3QgRmllbGRBcnJheUltcGwgPSBkZWZpbmVDb21wb25lbnQoe1xuICAgIG5hbWU6ICdGaWVsZEFycmF5JyxcbiAgICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuICAgIHByb3BzOiB7XG4gICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgICAgICBjb25zdCB7IHB1c2gsIHJlbW92ZSwgc3dhcCwgaW5zZXJ0LCByZXBsYWNlLCB1cGRhdGUsIHByZXBlbmQsIG1vdmUsIGZpZWxkcyB9ID0gdXNlRmllbGRBcnJheSh0b1JlZihwcm9wcywgJ25hbWUnKSk7XG4gICAgICAgIGZ1bmN0aW9uIHNsb3RQcm9wcygpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZmllbGRzOiBmaWVsZHMudmFsdWUsXG4gICAgICAgICAgICAgICAgcHVzaCxcbiAgICAgICAgICAgICAgICByZW1vdmUsXG4gICAgICAgICAgICAgICAgc3dhcCxcbiAgICAgICAgICAgICAgICBpbnNlcnQsXG4gICAgICAgICAgICAgICAgdXBkYXRlLFxuICAgICAgICAgICAgICAgIHJlcGxhY2UsXG4gICAgICAgICAgICAgICAgcHJlcGVuZCxcbiAgICAgICAgICAgICAgICBtb3ZlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjdHguZXhwb3NlKHtcbiAgICAgICAgICAgIHB1c2gsXG4gICAgICAgICAgICByZW1vdmUsXG4gICAgICAgICAgICBzd2FwLFxuICAgICAgICAgICAgaW5zZXJ0LFxuICAgICAgICAgICAgdXBkYXRlLFxuICAgICAgICAgICAgcmVwbGFjZSxcbiAgICAgICAgICAgIHByZXBlbmQsXG4gICAgICAgICAgICBtb3ZlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9ybWFsaXplQ2hpbGRyZW4odW5kZWZpbmVkLCBjdHgsIHNsb3RQcm9wcyk7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICAgIH07XG4gICAgfSxcbn0pO1xuY29uc3QgRmllbGRBcnJheSA9IEZpZWxkQXJyYXlJbXBsO1xuXG5jb25zdCBFcnJvck1lc3NhZ2VJbXBsID0gZGVmaW5lQ29tcG9uZW50KHtcbiAgICBuYW1lOiAnRXJyb3JNZXNzYWdlJyxcbiAgICBwcm9wczoge1xuICAgICAgICBhczoge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgICBuYW1lOiB7XG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICAgICAgY29uc3QgZm9ybSA9IGluamVjdChGb3JtQ29udGV4dEtleSwgdW5kZWZpbmVkKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtID09PSBudWxsIHx8IGZvcm0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvcm0uZXJyb3JzLnZhbHVlW3Byb3BzLm5hbWVdO1xuICAgICAgICB9KTtcbiAgICAgICAgZnVuY3Rpb24gc2xvdFByb3BzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLnZhbHVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVuZGVycyBub3RoaW5nIGlmIHRoZXJlIGFyZSBubyBtZXNzYWdlc1xuICAgICAgICAgICAgaWYgKCFtZXNzYWdlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IChwcm9wcy5hcyA/IHJlc29sdmVEeW5hbWljQ29tcG9uZW50KHByb3BzLmFzKSA6IHByb3BzLmFzKTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9ybWFsaXplQ2hpbGRyZW4odGFnLCBjdHgsIHNsb3RQcm9wcyk7XG4gICAgICAgICAgICBjb25zdCBhdHRycyA9IE9iamVjdC5hc3NpZ24oeyByb2xlOiAnYWxlcnQnIH0sIGN0eC5hdHRycyk7XG4gICAgICAgICAgICAvLyBJZiBubyB0YWcgd2FzIHNwZWNpZmllZCBhbmQgdGhlcmUgYXJlIGNoaWxkcmVuXG4gICAgICAgICAgICAvLyByZW5kZXIgdGhlIHNsb3QgYXMgaXMgd2l0aG91dCB3cmFwcGluZyBpdFxuICAgICAgICAgICAgaWYgKCF0YWcgJiYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pIHx8ICFjaGlsZHJlbikgJiYgKGNoaWxkcmVuID09PSBudWxsIHx8IGNoaWxkcmVuID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGlsZHJlbi5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gY2hpbGRyZW4gaW4gc2xvdFxuICAgICAgICAgICAgLy8gcmVuZGVyIHdoYXRldmVyIHNwZWNpZmllZCBhbmQgZmFsbGJhY2sgdG8gYSA8c3Bhbj4gd2l0aCB0aGUgbWVzc2FnZSBpbiBpdCdzIGNvbnRlbnRzXG4gICAgICAgICAgICBpZiAoKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pIHx8ICFjaGlsZHJlbikgJiYgIShjaGlsZHJlbiA9PT0gbnVsbCB8fCBjaGlsZHJlbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hpbGRyZW4ubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBoKHRhZyB8fCAnc3BhbicsIGF0dHJzLCBtZXNzYWdlLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoKHRhZywgYXR0cnMsIGNoaWxkcmVuKTtcbiAgICAgICAgfTtcbiAgICB9LFxufSk7XG5jb25zdCBFcnJvck1lc3NhZ2UgPSBFcnJvck1lc3NhZ2VJbXBsO1xuXG5mdW5jdGlvbiB1c2VSZXNldEZvcm0oKSB7XG4gICAgY29uc3QgZm9ybSA9IGluamVjdFdpdGhTZWxmKEZvcm1Db250ZXh0S2V5KTtcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgICAgd2FybignTm8gdmVlLXZhbGlkYXRlIDxGb3JtIC8+IG9yIGB1c2VGb3JtYCB3YXMgZGV0ZWN0ZWQgaW4gdGhlIGNvbXBvbmVudCB0cmVlJyk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiByZXNldEZvcm0oc3RhdGUpIHtcbiAgICAgICAgaWYgKCFmb3JtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm0ucmVzZXRGb3JtKHN0YXRlKTtcbiAgICB9O1xufVxuXG4vKipcbiAqIElmIGEgZmllbGQgaXMgZGlydHkgb3Igbm90XG4gKi9cbmZ1bmN0aW9uIHVzZUlzRmllbGREaXJ0eShwYXRoKSB7XG4gICAgY29uc3QgZm9ybSA9IGluamVjdFdpdGhTZWxmKEZvcm1Db250ZXh0S2V5KTtcbiAgICBsZXQgZmllbGQgPSBwYXRoID8gdW5kZWZpbmVkIDogaW5qZWN0KEZpZWxkQ29udGV4dEtleSk7XG4gICAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHBhdGgpIHtcbiAgICAgICAgICAgIGZpZWxkID0gbm9ybWFsaXplRmllbGQoZm9ybSA9PT0gbnVsbCB8fCBmb3JtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb3JtLmZpZWxkc0J5UGF0aC52YWx1ZVt1bnJlZihwYXRoKV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgIHdhcm4oYGZpZWxkIHdpdGggbmFtZSAke3VucmVmKHBhdGgpfSB3YXMgbm90IGZvdW5kYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkLm1ldGEuZGlydHk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogSWYgYSBmaWVsZCBpcyB0b3VjaGVkIG9yIG5vdFxuICovXG5mdW5jdGlvbiB1c2VJc0ZpZWxkVG91Y2hlZChwYXRoKSB7XG4gICAgY29uc3QgZm9ybSA9IGluamVjdFdpdGhTZWxmKEZvcm1Db250ZXh0S2V5KTtcbiAgICBsZXQgZmllbGQgPSBwYXRoID8gdW5kZWZpbmVkIDogaW5qZWN0KEZpZWxkQ29udGV4dEtleSk7XG4gICAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHBhdGgpIHtcbiAgICAgICAgICAgIGZpZWxkID0gbm9ybWFsaXplRmllbGQoZm9ybSA9PT0gbnVsbCB8fCBmb3JtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb3JtLmZpZWxkc0J5UGF0aC52YWx1ZVt1bnJlZihwYXRoKV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgIHdhcm4oYGZpZWxkIHdpdGggbmFtZSAke3VucmVmKHBhdGgpfSB3YXMgbm90IGZvdW5kYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkLm1ldGEudG91Y2hlZDtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBJZiBhIGZpZWxkIGlzIHZhbGlkYXRlZCBhbmQgaXMgdmFsaWRcbiAqL1xuZnVuY3Rpb24gdXNlSXNGaWVsZFZhbGlkKHBhdGgpIHtcbiAgICBjb25zdCBmb3JtID0gaW5qZWN0V2l0aFNlbGYoRm9ybUNvbnRleHRLZXkpO1xuICAgIGxldCBmaWVsZCA9IHBhdGggPyB1bmRlZmluZWQgOiBpbmplY3QoRmllbGRDb250ZXh0S2V5KTtcbiAgICByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAocGF0aCkge1xuICAgICAgICAgICAgZmllbGQgPSBub3JtYWxpemVGaWVsZChmb3JtID09PSBudWxsIHx8IGZvcm0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvcm0uZmllbGRzQnlQYXRoLnZhbHVlW3VucmVmKHBhdGgpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmaWVsZCkge1xuICAgICAgICAgICAgd2FybihgZmllbGQgd2l0aCBuYW1lICR7dW5yZWYocGF0aCl9IHdhcyBub3QgZm91bmRgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmllbGQubWV0YS52YWxpZDtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBJZiB0aGUgZm9ybSBpcyBzdWJtaXR0aW5nIG9yIG5vdFxuICovXG5mdW5jdGlvbiB1c2VJc1N1Ym1pdHRpbmcoKSB7XG4gICAgY29uc3QgZm9ybSA9IGluamVjdFdpdGhTZWxmKEZvcm1Db250ZXh0S2V5KTtcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgICAgd2FybignTm8gdmVlLXZhbGlkYXRlIDxGb3JtIC8+IG9yIGB1c2VGb3JtYCB3YXMgZGV0ZWN0ZWQgaW4gdGhlIGNvbXBvbmVudCB0cmVlJyk7XG4gICAgfVxuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS5pc1N1Ym1pdHRpbmcudmFsdWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhIHNpbmdsZSBmaWVsZFxuICovXG5mdW5jdGlvbiB1c2VWYWxpZGF0ZUZpZWxkKHBhdGgpIHtcbiAgICBjb25zdCBmb3JtID0gaW5qZWN0V2l0aFNlbGYoRm9ybUNvbnRleHRLZXkpO1xuICAgIGxldCBmaWVsZCA9IHBhdGggPyB1bmRlZmluZWQgOiBpbmplY3QoRmllbGRDb250ZXh0S2V5KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdmFsaWRhdGVGaWVsZCgpIHtcbiAgICAgICAgaWYgKHBhdGgpIHtcbiAgICAgICAgICAgIGZpZWxkID0gbm9ybWFsaXplRmllbGQoZm9ybSA9PT0gbnVsbCB8fCBmb3JtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb3JtLmZpZWxkc0J5UGF0aC52YWx1ZVt1bnJlZihwYXRoKV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgIHdhcm4oYGZpZWxkIHdpdGggbmFtZSAke3VucmVmKHBhdGgpfSB3YXMgbm90IGZvdW5kYCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkLnZhbGlkYXRlKCk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBJZiB0aGUgZm9ybSBpcyBkaXJ0eSBvciBub3RcbiAqL1xuZnVuY3Rpb24gdXNlSXNGb3JtRGlydHkoKSB7XG4gICAgY29uc3QgZm9ybSA9IGluamVjdFdpdGhTZWxmKEZvcm1Db250ZXh0S2V5KTtcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgICAgd2FybignTm8gdmVlLXZhbGlkYXRlIDxGb3JtIC8+IG9yIGB1c2VGb3JtYCB3YXMgZGV0ZWN0ZWQgaW4gdGhlIGNvbXBvbmVudCB0cmVlJyk7XG4gICAgfVxuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS5tZXRhLnZhbHVlLmRpcnR5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBJZiB0aGUgZm9ybSBpcyB0b3VjaGVkIG9yIG5vdFxuICovXG5mdW5jdGlvbiB1c2VJc0Zvcm1Ub3VjaGVkKCkge1xuICAgIGNvbnN0IGZvcm0gPSBpbmplY3RXaXRoU2VsZihGb3JtQ29udGV4dEtleSk7XG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICAgIHdhcm4oJ05vIHZlZS12YWxpZGF0ZSA8Rm9ybSAvPiBvciBgdXNlRm9ybWAgd2FzIGRldGVjdGVkIGluIHRoZSBjb21wb25lbnQgdHJlZScpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSBmb3JtID09PSBudWxsIHx8IGZvcm0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvcm0ubWV0YS52YWx1ZS50b3VjaGVkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBJZiB0aGUgZm9ybSBoYXMgYmVlbiB2YWxpZGF0ZWQgYW5kIGlzIHZhbGlkXG4gKi9cbmZ1bmN0aW9uIHVzZUlzRm9ybVZhbGlkKCkge1xuICAgIGNvbnN0IGZvcm0gPSBpbmplY3RXaXRoU2VsZihGb3JtQ29udGV4dEtleSk7XG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICAgIHdhcm4oJ05vIHZlZS12YWxpZGF0ZSA8Rm9ybSAvPiBvciBgdXNlRm9ybWAgd2FzIGRldGVjdGVkIGluIHRoZSBjb21wb25lbnQgdHJlZScpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSBmb3JtID09PSBudWxsIHx8IGZvcm0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvcm0ubWV0YS52YWx1ZS52YWxpZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2U7XG4gICAgfSk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgbXVsdGlwbGUgZmllbGRzXG4gKi9cbmZ1bmN0aW9uIHVzZVZhbGlkYXRlRm9ybSgpIHtcbiAgICBjb25zdCBmb3JtID0gaW5qZWN0V2l0aFNlbGYoRm9ybUNvbnRleHRLZXkpO1xuICAgIGlmICghZm9ybSkge1xuICAgICAgICB3YXJuKCdObyB2ZWUtdmFsaWRhdGUgPEZvcm0gLz4gb3IgYHVzZUZvcm1gIHdhcyBkZXRlY3RlZCBpbiB0aGUgY29tcG9uZW50IHRyZWUnKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHZhbGlkYXRlRmllbGQoKSB7XG4gICAgICAgIGlmICghZm9ybSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHJlc3VsdHM6IHt9LCBlcnJvcnM6IHt9LCB2YWxpZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybS52YWxpZGF0ZSgpO1xuICAgIH07XG59XG5cbi8qKlxuICogVGhlIG51bWJlciBvZiBmb3JtJ3Mgc3VibWlzc2lvbiBjb3VudFxuICovXG5mdW5jdGlvbiB1c2VTdWJtaXRDb3VudCgpIHtcbiAgICBjb25zdCBmb3JtID0gaW5qZWN0V2l0aFNlbGYoRm9ybUNvbnRleHRLZXkpO1xuICAgIGlmICghZm9ybSkge1xuICAgICAgICB3YXJuKCdObyB2ZWUtdmFsaWRhdGUgPEZvcm0gLz4gb3IgYHVzZUZvcm1gIHdhcyBkZXRlY3RlZCBpbiB0aGUgY29tcG9uZW50IHRyZWUnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gZm9ybSA9PT0gbnVsbCB8fCBmb3JtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb3JtLnN1Ym1pdENvdW50LnZhbHVlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEdpdmVzIGFjY2VzcyB0byBhIGZpZWxkJ3MgY3VycmVudCB2YWx1ZVxuICovXG5mdW5jdGlvbiB1c2VGaWVsZFZhbHVlKHBhdGgpIHtcbiAgICBjb25zdCBmb3JtID0gaW5qZWN0V2l0aFNlbGYoRm9ybUNvbnRleHRLZXkpO1xuICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gdXNlIHNlbGYgaW5qZWN0ZWQgY29udGV4dCBhcyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2VcbiAgICBjb25zdCBmaWVsZCA9IHBhdGggPyB1bmRlZmluZWQgOiBpbmplY3QoRmllbGRDb250ZXh0S2V5KTtcbiAgICByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAocGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldEZyb21QYXRoKGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS52YWx1ZXMsIHVucmVmKHBhdGgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5yZWYoZmllbGQgPT09IG51bGwgfHwgZmllbGQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpZWxkLnZhbHVlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBHaXZlcyBhY2Nlc3MgdG8gYSBmb3JtJ3MgdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIHVzZUZvcm1WYWx1ZXMoKSB7XG4gICAgY29uc3QgZm9ybSA9IGluamVjdFdpdGhTZWxmKEZvcm1Db250ZXh0S2V5KTtcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgICAgd2FybignTm8gdmVlLXZhbGlkYXRlIDxGb3JtIC8+IG9yIGB1c2VGb3JtYCB3YXMgZGV0ZWN0ZWQgaW4gdGhlIGNvbXBvbmVudCB0cmVlJyk7XG4gICAgfVxuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiAoZm9ybSA9PT0gbnVsbCB8fCBmb3JtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb3JtLnZhbHVlcykgfHwge307XG4gICAgfSk7XG59XG5cbi8qKlxuICogR2l2ZXMgYWNjZXNzIHRvIGFsbCBmb3JtIGVycm9yc1xuICovXG5mdW5jdGlvbiB1c2VGb3JtRXJyb3JzKCkge1xuICAgIGNvbnN0IGZvcm0gPSBpbmplY3RXaXRoU2VsZihGb3JtQ29udGV4dEtleSk7XG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICAgIHdhcm4oJ05vIHZlZS12YWxpZGF0ZSA8Rm9ybSAvPiBvciBgdXNlRm9ybWAgd2FzIGRldGVjdGVkIGluIHRoZSBjb21wb25lbnQgdHJlZScpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gKChmb3JtID09PSBudWxsIHx8IGZvcm0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvcm0uZXJyb3JzLnZhbHVlKSB8fCB7fSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogR2l2ZXMgYWNjZXNzIHRvIGEgc2luZ2xlIGZpZWxkIGVycm9yXG4gKi9cbmZ1bmN0aW9uIHVzZUZpZWxkRXJyb3IocGF0aCkge1xuICAgIGNvbnN0IGZvcm0gPSBpbmplY3RXaXRoU2VsZihGb3JtQ29udGV4dEtleSk7XG4gICAgLy8gV2UgZG9uJ3Qgd2FudCB0byB1c2Ugc2VsZiBpbmplY3RlZCBjb250ZXh0IGFzIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZVxuICAgIGNvbnN0IGZpZWxkID0gcGF0aCA/IHVuZGVmaW5lZCA6IGluamVjdChGaWVsZENvbnRleHRLZXkpO1xuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmIChwYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybSA9PT0gbnVsbCB8fCBmb3JtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb3JtLmVycm9ycy52YWx1ZVt1bnJlZihwYXRoKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkID09PSBudWxsIHx8IGZpZWxkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaWVsZC5lcnJvck1lc3NhZ2UudmFsdWU7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHVzZVN1Ym1pdEZvcm0oY2IpIHtcbiAgICBjb25zdCBmb3JtID0gaW5qZWN0V2l0aFNlbGYoRm9ybUNvbnRleHRLZXkpO1xuICAgIGlmICghZm9ybSkge1xuICAgICAgICB3YXJuKCdObyB2ZWUtdmFsaWRhdGUgPEZvcm0gLz4gb3IgYHVzZUZvcm1gIHdhcyBkZXRlY3RlZCBpbiB0aGUgY29tcG9uZW50IHRyZWUnKTtcbiAgICB9XG4gICAgY29uc3Qgb25TdWJtaXQgPSBmb3JtID8gZm9ybS5oYW5kbGVTdWJtaXQoY2IpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBmdW5jdGlvbiBzdWJtaXRGb3JtKGUpIHtcbiAgICAgICAgaWYgKCFvblN1Ym1pdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvblN1Ym1pdChlKTtcbiAgICB9O1xufVxuXG5leHBvcnQgeyBFcnJvck1lc3NhZ2UsIEZpZWxkLCBGaWVsZEFycmF5LCBGaWVsZENvbnRleHRLZXksIEZvcm0sIEZvcm1Db250ZXh0S2V5LCBJU19BQlNFTlQsIGNvbmZpZ3VyZSwgZGVmaW5lUnVsZSwgdXNlRmllbGQsIHVzZUZpZWxkQXJyYXksIHVzZUZpZWxkRXJyb3IsIHVzZUZpZWxkVmFsdWUsIHVzZUZvcm0sIHVzZUZvcm1FcnJvcnMsIHVzZUZvcm1WYWx1ZXMsIHVzZUlzRmllbGREaXJ0eSwgdXNlSXNGaWVsZFRvdWNoZWQsIHVzZUlzRmllbGRWYWxpZCwgdXNlSXNGb3JtRGlydHksIHVzZUlzRm9ybVRvdWNoZWQsIHVzZUlzRm9ybVZhbGlkLCB1c2VJc1N1Ym1pdHRpbmcsIHVzZVJlc2V0Rm9ybSwgdXNlU3VibWl0Q291bnQsIHVzZVN1Ym1pdEZvcm0sIHVzZVZhbGlkYXRlRmllbGQsIHVzZVZhbGlkYXRlRm9ybSwgdmFsaWRhdGUsIHZhbGlkYXRlT2JqZWN0U2NoZW1hIGFzIHZhbGlkYXRlT2JqZWN0IH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/vee-validate/dist/vee-validate.esm.js\n");

/***/ }),

/***/ "./node_modules/vue-axios/dist/vue-axios.esm.min.js":
/*!**********************************************************!*\
  !*** ./node_modules/vue-axios/dist/vue-axios.esm.min.js ***!
  \**********************************************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ plugin)\n/* harmony export */ });\n/* module decorator */ module = __webpack_require__.hmd(module);\nfunction _typeof(e){return _typeof=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},_typeof(e)}function plugin(e,n){if(!e.vueAxiosInstalled){var o=isAxiosLike(n)?migrateToMultipleInstances(n):n;if(isValidConfig(o)){var t=getVueVersion(e);if(t){var i=t<3?registerOnVue2:registerOnVue3;Object.keys(o).forEach((function(n){i(e,n,o[n])})),e.vueAxiosInstalled=!0}else console.error(\"[vue-axios] unknown Vue version\")}else console.error(\"[vue-axios] configuration is invalid, expected options are either <axios_instance> or { <registration_key>: <axios_instance> }\")}}function registerOnVue2(e,n,o){Object.defineProperty(e.prototype,n,{get:function(){return o}}),e[n]=o}function registerOnVue3(e,n,o){e.config.globalProperties[n]=o,e[n]=o}function isAxiosLike(e){return e&&\"function\"==typeof e.get&&\"function\"==typeof e.post}function migrateToMultipleInstances(e){return{axios:e,$http:e}}function isValidConfig(e){return\"object\"===_typeof(e)&&Object.keys(e).every((function(n){return isAxiosLike(e[n])}))}function getVueVersion(e){return e&&e.version&&Number(e.version.split(\".\")[0])}\"object\"==(\"undefined\"==typeof exports?\"undefined\":_typeof(exports))?module.exports=plugin:\"function\"==typeof define&&__webpack_require__.amdO?define([],(function(){return plugin})):window.Vue&&window.axios&&window.Vue.use&&Vue.use(plugin,window.axios);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdnVlLWF4aW9zL2Rpc3QvdnVlLWF4aW9zLmVzbS5taW4uanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvQkFBb0IsdUZBQXVGLGdCQUFnQixhQUFhLG9HQUFvRyxZQUFZLHFCQUFxQix5QkFBeUIscURBQXFELHFCQUFxQix1QkFBdUIsTUFBTSx3Q0FBd0Msb0NBQW9DLFlBQVksMEJBQTBCLHNEQUFzRCw0R0FBNEcsc0NBQXNDLElBQUksK0JBQStCLHFDQUFxQyxlQUFlLFVBQVUsU0FBUywrQkFBK0Isc0NBQXNDLHdCQUF3Qiw4REFBOEQsdUNBQXVDLE9BQU8saUJBQWlCLDBCQUEwQiwrREFBK0QseUJBQXlCLEdBQUcsMEJBQTBCLHFEQUFxRCxzSEFBc0gsd0JBQVUsdUJBQXVCLGNBQWMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdnVlLWF4aW9zL2Rpc3QvdnVlLWF4aW9zLmVzbS5taW4uanM/M2QzNyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfdHlwZW9mKGUpe3JldHVybiBfdHlwZW9mPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIGV9LF90eXBlb2YoZSl9ZnVuY3Rpb24gcGx1Z2luKGUsbil7aWYoIWUudnVlQXhpb3NJbnN0YWxsZWQpe3ZhciBvPWlzQXhpb3NMaWtlKG4pP21pZ3JhdGVUb011bHRpcGxlSW5zdGFuY2VzKG4pOm47aWYoaXNWYWxpZENvbmZpZyhvKSl7dmFyIHQ9Z2V0VnVlVmVyc2lvbihlKTtpZih0KXt2YXIgaT10PDM/cmVnaXN0ZXJPblZ1ZTI6cmVnaXN0ZXJPblZ1ZTM7T2JqZWN0LmtleXMobykuZm9yRWFjaCgoZnVuY3Rpb24obil7aShlLG4sb1tuXSl9KSksZS52dWVBeGlvc0luc3RhbGxlZD0hMH1lbHNlIGNvbnNvbGUuZXJyb3IoXCJbdnVlLWF4aW9zXSB1bmtub3duIFZ1ZSB2ZXJzaW9uXCIpfWVsc2UgY29uc29sZS5lcnJvcihcIlt2dWUtYXhpb3NdIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCwgZXhwZWN0ZWQgb3B0aW9ucyBhcmUgZWl0aGVyIDxheGlvc19pbnN0YW5jZT4gb3IgeyA8cmVnaXN0cmF0aW9uX2tleT46IDxheGlvc19pbnN0YW5jZT4gfVwiKX19ZnVuY3Rpb24gcmVnaXN0ZXJPblZ1ZTIoZSxuLG8pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxuLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319KSxlW25dPW99ZnVuY3Rpb24gcmVnaXN0ZXJPblZ1ZTMoZSxuLG8pe2UuY29uZmlnLmdsb2JhbFByb3BlcnRpZXNbbl09byxlW25dPW99ZnVuY3Rpb24gaXNBeGlvc0xpa2UoZSl7cmV0dXJuIGUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGUuZ2V0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLnBvc3R9ZnVuY3Rpb24gbWlncmF0ZVRvTXVsdGlwbGVJbnN0YW5jZXMoZSl7cmV0dXJue2F4aW9zOmUsJGh0dHA6ZX19ZnVuY3Rpb24gaXNWYWxpZENvbmZpZyhlKXtyZXR1cm5cIm9iamVjdFwiPT09X3R5cGVvZihlKSYmT2JqZWN0LmtleXMoZSkuZXZlcnkoKGZ1bmN0aW9uKG4pe3JldHVybiBpc0F4aW9zTGlrZShlW25dKX0pKX1mdW5jdGlvbiBnZXRWdWVWZXJzaW9uKGUpe3JldHVybiBlJiZlLnZlcnNpb24mJk51bWJlcihlLnZlcnNpb24uc3BsaXQoXCIuXCIpWzBdKX1cIm9iamVjdFwiPT0oXCJ1bmRlZmluZWRcIj09dHlwZW9mIGV4cG9ydHM/XCJ1bmRlZmluZWRcIjpfdHlwZW9mKGV4cG9ydHMpKT9tb2R1bGUuZXhwb3J0cz1wbHVnaW46XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSwoZnVuY3Rpb24oKXtyZXR1cm4gcGx1Z2lufSkpOndpbmRvdy5WdWUmJndpbmRvdy5heGlvcyYmd2luZG93LlZ1ZS51c2UmJlZ1ZS51c2UocGx1Z2luLHdpbmRvdy5heGlvcyk7ZXhwb3J0e3BsdWdpbiBhcyBkZWZhdWx0fTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/vue-axios/dist/vue-axios.esm.min.js\n");

/***/ }),

/***/ "./node_modules/vue-loader/dist/exportHelper.js":
/*!******************************************************!*\
  !*** ./node_modules/vue-loader/dist/exportHelper.js ***!
  \******************************************************/
/***/ ((__unused_webpack_module, exports) => {

"use strict";
eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\n// runtime helper for setting properties on components\n// in a tree-shakable way\nexports[\"default\"] = (sfc, props) => {\n    const target = sfc.__vccOpts || sfc;\n    for (const [key, val] of props) {\n        target[key] = val;\n    }\n    return target;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2V4cG9ydEhlbHBlci5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RDtBQUNBO0FBQ0Esa0JBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2V4cG9ydEhlbHBlci5qcz8zN2RmIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8gcnVudGltZSBoZWxwZXIgZm9yIHNldHRpbmcgcHJvcGVydGllcyBvbiBjb21wb25lbnRzXG4vLyBpbiBhIHRyZWUtc2hha2FibGUgd2F5XG5leHBvcnRzLmRlZmF1bHQgPSAoc2ZjLCBwcm9wcykgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IHNmYy5fX3ZjY09wdHMgfHwgc2ZjO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBwcm9wcykge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHZhbDtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/vue-loader/dist/exportHelper.js\n");

/***/ }),

/***/ "./resources/js/core/components/LoadingIcon.vue":
/*!******************************************************!*\
  !*** ./resources/js/core/components/LoadingIcon.vue ***!
  \******************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _LoadingIcon_vue_vue_type_template_id_474d299e_scoped_true__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./LoadingIcon.vue?vue&type=template&id=474d299e&scoped=true */ \"./resources/js/core/components/LoadingIcon.vue?vue&type=template&id=474d299e&scoped=true\");\n/* harmony import */ var _LoadingIcon_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./LoadingIcon.vue?vue&type=script&lang=js */ \"./resources/js/core/components/LoadingIcon.vue?vue&type=script&lang=js\");\n/* harmony import */ var _LoadingIcon_vue_vue_type_style_index_0_id_474d299e_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./LoadingIcon.vue?vue&type=style&index=0&id=474d299e&scoped=true&lang=css */ \"./resources/js/core/components/LoadingIcon.vue?vue&type=style&index=0&id=474d299e&scoped=true&lang=css\");\n/* harmony import */ var _Users_negarasadi_projects_acl_booking_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./node_modules/vue-loader/dist/exportHelper.js */ \"./node_modules/vue-loader/dist/exportHelper.js\");\n\n\n\n\n;\n\n\nconst __exports__ = /*#__PURE__*/(0,_Users_negarasadi_projects_acl_booking_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(_LoadingIcon_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"], [['render',_LoadingIcon_vue_vue_type_template_id_474d299e_scoped_true__WEBPACK_IMPORTED_MODULE_0__.render],['__scopeId',\"data-v-474d299e\"],['__file',\"resources/js/core/components/LoadingIcon.vue\"]])\n/* hot reload */\nif (false) {}\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__exports__);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL0xvYWRpbmdJY29uLnZ1ZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFvRjtBQUN0QjtBQUNMOztBQUV6RCxDQUFrRjs7QUFFK0I7QUFDakgsaUNBQWlDLCtIQUFlLENBQUMsZ0ZBQU0sYUFBYSw4RkFBTTtBQUMxRTtBQUNBLElBQUksS0FBVSxFQUFFLEVBY2Y7OztBQUdELGlFQUFlIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvcmUvY29tcG9uZW50cy9Mb2FkaW5nSWNvbi52dWU/NzBhYiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZW5kZXIgfSBmcm9tIFwiLi9Mb2FkaW5nSWNvbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NDc0ZDI5OWUmc2NvcGVkPXRydWVcIlxuaW1wb3J0IHNjcmlwdCBmcm9tIFwiLi9Mb2FkaW5nSWNvbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIlxuZXhwb3J0ICogZnJvbSBcIi4vTG9hZGluZ0ljb24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCJcblxuaW1wb3J0IFwiLi9Mb2FkaW5nSWNvbi52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD00NzRkMjk5ZSZzY29wZWQ9dHJ1ZSZsYW5nPWNzc1wiXG5cbmltcG9ydCBleHBvcnRDb21wb25lbnQgZnJvbSBcIi9Vc2Vycy9uZWdhcmFzYWRpL3Byb2plY3RzL2FjbC1ib29raW5nL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvZXhwb3J0SGVscGVyLmpzXCJcbmNvbnN0IF9fZXhwb3J0c19fID0gLyojX19QVVJFX18qL2V4cG9ydENvbXBvbmVudChzY3JpcHQsIFtbJ3JlbmRlcicscmVuZGVyXSxbJ19fc2NvcGVJZCcsXCJkYXRhLXYtNDc0ZDI5OWVcIl0sWydfX2ZpbGUnLFwicmVzb3VyY2VzL2pzL2NvcmUvY29tcG9uZW50cy9Mb2FkaW5nSWNvbi52dWVcIl1dKVxuLyogaG90IHJlbG9hZCAqL1xuaWYgKG1vZHVsZS5ob3QpIHtcbiAgX19leHBvcnRzX18uX19obXJJZCA9IFwiNDc0ZDI5OWVcIlxuICBjb25zdCBhcGkgPSBfX1ZVRV9ITVJfUlVOVElNRV9fXG4gIG1vZHVsZS5ob3QuYWNjZXB0KClcbiAgaWYgKCFhcGkuY3JlYXRlUmVjb3JkKCc0NzRkMjk5ZScsIF9fZXhwb3J0c19fKSkge1xuICAgIGNvbnNvbGUubG9nKCdyZWxvYWQnKVxuICAgIGFwaS5yZWxvYWQoJzQ3NGQyOTllJywgX19leHBvcnRzX18pXG4gIH1cbiAgXG4gIG1vZHVsZS5ob3QuYWNjZXB0KFwiLi9Mb2FkaW5nSWNvbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NDc0ZDI5OWUmc2NvcGVkPXRydWVcIiwgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCdyZS1yZW5kZXInKVxuICAgIGFwaS5yZXJlbmRlcignNDc0ZDI5OWUnLCByZW5kZXIpXG4gIH0pXG5cbn1cblxuXG5leHBvcnQgZGVmYXVsdCBfX2V4cG9ydHNfXyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/core/components/LoadingIcon.vue\n");

/***/ }),

/***/ "./resources/js/core/components/nav/FooterBar.vue":
/*!********************************************************!*\
  !*** ./resources/js/core/components/nav/FooterBar.vue ***!
  \********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _FooterBar_vue_vue_type_template_id_5fdfec95_scoped_true__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FooterBar.vue?vue&type=template&id=5fdfec95&scoped=true */ \"./resources/js/core/components/nav/FooterBar.vue?vue&type=template&id=5fdfec95&scoped=true\");\n/* harmony import */ var _FooterBar_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FooterBar.vue?vue&type=script&lang=js */ \"./resources/js/core/components/nav/FooterBar.vue?vue&type=script&lang=js\");\n/* harmony import */ var _FooterBar_vue_vue_type_style_index_0_id_5fdfec95_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./FooterBar.vue?vue&type=style&index=0&id=5fdfec95&scoped=true&lang=css */ \"./resources/js/core/components/nav/FooterBar.vue?vue&type=style&index=0&id=5fdfec95&scoped=true&lang=css\");\n/* harmony import */ var _Users_negarasadi_projects_acl_booking_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./node_modules/vue-loader/dist/exportHelper.js */ \"./node_modules/vue-loader/dist/exportHelper.js\");\n\n\n\n\n;\n\n\nconst __exports__ = /*#__PURE__*/(0,_Users_negarasadi_projects_acl_booking_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(_FooterBar_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"], [['render',_FooterBar_vue_vue_type_template_id_5fdfec95_scoped_true__WEBPACK_IMPORTED_MODULE_0__.render],['__scopeId',\"data-v-5fdfec95\"],['__file',\"resources/js/core/components/nav/FooterBar.vue\"]])\n/* hot reload */\nif (false) {}\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__exports__);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9Gb290ZXJCYXIudnVlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQWtGO0FBQ3RCO0FBQ0w7O0FBRXZELENBQWdGOztBQUVpQztBQUNqSCxpQ0FBaUMsK0hBQWUsQ0FBQyw4RUFBTSxhQUFhLDRGQUFNO0FBQzFFO0FBQ0EsSUFBSSxLQUFVLEVBQUUsRUFjZjs7O0FBR0QsaUVBQWUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9Gb290ZXJCYXIudnVlP2Y1NzEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSBcIi4vRm9vdGVyQmFyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01ZmRmZWM5NSZzY29wZWQ9dHJ1ZVwiXG5pbXBvcnQgc2NyaXB0IGZyb20gXCIuL0Zvb3RlckJhci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIlxuZXhwb3J0ICogZnJvbSBcIi4vRm9vdGVyQmFyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiXG5cbmltcG9ydCBcIi4vRm9vdGVyQmFyLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTVmZGZlYzk1JnNjb3BlZD10cnVlJmxhbmc9Y3NzXCJcblxuaW1wb3J0IGV4cG9ydENvbXBvbmVudCBmcm9tIFwiL1VzZXJzL25lZ2FyYXNhZGkvcHJvamVjdHMvYWNsLWJvb2tpbmcvbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9leHBvcnRIZWxwZXIuanNcIlxuY29uc3QgX19leHBvcnRzX18gPSAvKiNfX1BVUkVfXyovZXhwb3J0Q29tcG9uZW50KHNjcmlwdCwgW1sncmVuZGVyJyxyZW5kZXJdLFsnX19zY29wZUlkJyxcImRhdGEtdi01ZmRmZWM5NVwiXSxbJ19fZmlsZScsXCJyZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9Gb290ZXJCYXIudnVlXCJdXSlcbi8qIGhvdCByZWxvYWQgKi9cbmlmIChtb2R1bGUuaG90KSB7XG4gIF9fZXhwb3J0c19fLl9faG1ySWQgPSBcIjVmZGZlYzk1XCJcbiAgY29uc3QgYXBpID0gX19WVUVfSE1SX1JVTlRJTUVfX1xuICBtb2R1bGUuaG90LmFjY2VwdCgpXG4gIGlmICghYXBpLmNyZWF0ZVJlY29yZCgnNWZkZmVjOTUnLCBfX2V4cG9ydHNfXykpIHtcbiAgICBjb25zb2xlLmxvZygncmVsb2FkJylcbiAgICBhcGkucmVsb2FkKCc1ZmRmZWM5NScsIF9fZXhwb3J0c19fKVxuICB9XG4gIFxuICBtb2R1bGUuaG90LmFjY2VwdChcIi4vRm9vdGVyQmFyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01ZmRmZWM5NSZzY29wZWQ9dHJ1ZVwiLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ3JlLXJlbmRlcicpXG4gICAgYXBpLnJlcmVuZGVyKCc1ZmRmZWM5NScsIHJlbmRlcilcbiAgfSlcblxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IF9fZXhwb3J0c19fIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/core/components/nav/FooterBar.vue\n");

/***/ }),

/***/ "./resources/js/core/components/nav/SideBar.vue":
/*!******************************************************!*\
  !*** ./resources/js/core/components/nav/SideBar.vue ***!
  \******************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _SideBar_vue_vue_type_template_id_0aa712ce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./SideBar.vue?vue&type=template&id=0aa712ce */ \"./resources/js/core/components/nav/SideBar.vue?vue&type=template&id=0aa712ce\");\n/* harmony import */ var _SideBar_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./SideBar.vue?vue&type=script&lang=js */ \"./resources/js/core/components/nav/SideBar.vue?vue&type=script&lang=js\");\n/* harmony import */ var _SideBar_vue_vue_type_style_index_0_id_0aa712ce_lang_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SideBar.vue?vue&type=style&index=0&id=0aa712ce&lang=css */ \"./resources/js/core/components/nav/SideBar.vue?vue&type=style&index=0&id=0aa712ce&lang=css\");\n/* harmony import */ var _Users_negarasadi_projects_acl_booking_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./node_modules/vue-loader/dist/exportHelper.js */ \"./node_modules/vue-loader/dist/exportHelper.js\");\n\n\n\n\n;\n\n\nconst __exports__ = /*#__PURE__*/(0,_Users_negarasadi_projects_acl_booking_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(_SideBar_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"], [['render',_SideBar_vue_vue_type_template_id_0aa712ce__WEBPACK_IMPORTED_MODULE_0__.render],['__file',\"resources/js/core/components/nav/SideBar.vue\"]])\n/* hot reload */\nif (false) {}\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__exports__);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9TaWRlQmFyLnZ1ZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFvRTtBQUNWO0FBQ0w7O0FBRXJELENBQWtFOztBQUUrQztBQUNqSCxpQ0FBaUMsK0hBQWUsQ0FBQyw0RUFBTSxhQUFhLDhFQUFNO0FBQzFFO0FBQ0EsSUFBSSxLQUFVLEVBQUUsRUFjZjs7O0FBR0QsaUVBQWUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9TaWRlQmFyLnZ1ZT9jOWQ4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlciB9IGZyb20gXCIuL1NpZGVCYXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTBhYTcxMmNlXCJcbmltcG9ydCBzY3JpcHQgZnJvbSBcIi4vU2lkZUJhci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIlxuZXhwb3J0ICogZnJvbSBcIi4vU2lkZUJhci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIlxuXG5pbXBvcnQgXCIuL1NpZGVCYXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MGFhNzEyY2UmbGFuZz1jc3NcIlxuXG5pbXBvcnQgZXhwb3J0Q29tcG9uZW50IGZyb20gXCIvVXNlcnMvbmVnYXJhc2FkaS9wcm9qZWN0cy9hY2wtYm9va2luZy9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2V4cG9ydEhlbHBlci5qc1wiXG5jb25zdCBfX2V4cG9ydHNfXyA9IC8qI19fUFVSRV9fKi9leHBvcnRDb21wb25lbnQoc2NyaXB0LCBbWydyZW5kZXInLHJlbmRlcl0sWydfX2ZpbGUnLFwicmVzb3VyY2VzL2pzL2NvcmUvY29tcG9uZW50cy9uYXYvU2lkZUJhci52dWVcIl1dKVxuLyogaG90IHJlbG9hZCAqL1xuaWYgKG1vZHVsZS5ob3QpIHtcbiAgX19leHBvcnRzX18uX19obXJJZCA9IFwiMGFhNzEyY2VcIlxuICBjb25zdCBhcGkgPSBfX1ZVRV9ITVJfUlVOVElNRV9fXG4gIG1vZHVsZS5ob3QuYWNjZXB0KClcbiAgaWYgKCFhcGkuY3JlYXRlUmVjb3JkKCcwYWE3MTJjZScsIF9fZXhwb3J0c19fKSkge1xuICAgIGNvbnNvbGUubG9nKCdyZWxvYWQnKVxuICAgIGFwaS5yZWxvYWQoJzBhYTcxMmNlJywgX19leHBvcnRzX18pXG4gIH1cbiAgXG4gIG1vZHVsZS5ob3QuYWNjZXB0KFwiLi9TaWRlQmFyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wYWE3MTJjZVwiLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ3JlLXJlbmRlcicpXG4gICAgYXBpLnJlcmVuZGVyKCcwYWE3MTJjZScsIHJlbmRlcilcbiAgfSlcblxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IF9fZXhwb3J0c19fIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/core/components/nav/SideBar.vue\n");

/***/ }),

/***/ "./resources/js/core/components/nav/TopBar.vue":
/*!*****************************************************!*\
  !*** ./resources/js/core/components/nav/TopBar.vue ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _TopBar_vue_vue_type_template_id_3e41eeb1_scoped_true__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TopBar.vue?vue&type=template&id=3e41eeb1&scoped=true */ \"./resources/js/core/components/nav/TopBar.vue?vue&type=template&id=3e41eeb1&scoped=true\");\n/* harmony import */ var _TopBar_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TopBar.vue?vue&type=script&lang=js */ \"./resources/js/core/components/nav/TopBar.vue?vue&type=script&lang=js\");\n/* harmony import */ var _TopBar_vue_vue_type_style_index_0_id_3e41eeb1_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./TopBar.vue?vue&type=style&index=0&id=3e41eeb1&scoped=true&lang=css */ \"./resources/js/core/components/nav/TopBar.vue?vue&type=style&index=0&id=3e41eeb1&scoped=true&lang=css\");\n/* harmony import */ var _Users_negarasadi_projects_acl_booking_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./node_modules/vue-loader/dist/exportHelper.js */ \"./node_modules/vue-loader/dist/exportHelper.js\");\n\n\n\n\n;\n\n\nconst __exports__ = /*#__PURE__*/(0,_Users_negarasadi_projects_acl_booking_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(_TopBar_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"], [['render',_TopBar_vue_vue_type_template_id_3e41eeb1_scoped_true__WEBPACK_IMPORTED_MODULE_0__.render],['__scopeId',\"data-v-3e41eeb1\"],['__file',\"resources/js/core/components/nav/TopBar.vue\"]])\n/* hot reload */\nif (false) {}\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__exports__);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9Ub3BCYXIudnVlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQStFO0FBQ3RCO0FBQ0w7O0FBRXBELENBQTZFOztBQUVvQztBQUNqSCxpQ0FBaUMsK0hBQWUsQ0FBQywyRUFBTSxhQUFhLHlGQUFNO0FBQzFFO0FBQ0EsSUFBSSxLQUFVLEVBQUUsRUFjZjs7O0FBR0QsaUVBQWUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9Ub3BCYXIudnVlPzAyODIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSBcIi4vVG9wQmFyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zZTQxZWViMSZzY29wZWQ9dHJ1ZVwiXG5pbXBvcnQgc2NyaXB0IGZyb20gXCIuL1RvcEJhci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIlxuZXhwb3J0ICogZnJvbSBcIi4vVG9wQmFyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiXG5cbmltcG9ydCBcIi4vVG9wQmFyLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTNlNDFlZWIxJnNjb3BlZD10cnVlJmxhbmc9Y3NzXCJcblxuaW1wb3J0IGV4cG9ydENvbXBvbmVudCBmcm9tIFwiL1VzZXJzL25lZ2FyYXNhZGkvcHJvamVjdHMvYWNsLWJvb2tpbmcvbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9leHBvcnRIZWxwZXIuanNcIlxuY29uc3QgX19leHBvcnRzX18gPSAvKiNfX1BVUkVfXyovZXhwb3J0Q29tcG9uZW50KHNjcmlwdCwgW1sncmVuZGVyJyxyZW5kZXJdLFsnX19zY29wZUlkJyxcImRhdGEtdi0zZTQxZWViMVwiXSxbJ19fZmlsZScsXCJyZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9Ub3BCYXIudnVlXCJdXSlcbi8qIGhvdCByZWxvYWQgKi9cbmlmIChtb2R1bGUuaG90KSB7XG4gIF9fZXhwb3J0c19fLl9faG1ySWQgPSBcIjNlNDFlZWIxXCJcbiAgY29uc3QgYXBpID0gX19WVUVfSE1SX1JVTlRJTUVfX1xuICBtb2R1bGUuaG90LmFjY2VwdCgpXG4gIGlmICghYXBpLmNyZWF0ZVJlY29yZCgnM2U0MWVlYjEnLCBfX2V4cG9ydHNfXykpIHtcbiAgICBjb25zb2xlLmxvZygncmVsb2FkJylcbiAgICBhcGkucmVsb2FkKCczZTQxZWViMScsIF9fZXhwb3J0c19fKVxuICB9XG4gIFxuICBtb2R1bGUuaG90LmFjY2VwdChcIi4vVG9wQmFyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zZTQxZWViMSZzY29wZWQ9dHJ1ZVwiLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ3JlLXJlbmRlcicpXG4gICAgYXBpLnJlcmVuZGVyKCczZTQxZWViMScsIHJlbmRlcilcbiAgfSlcblxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IF9fZXhwb3J0c19fIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/core/components/nav/TopBar.vue\n");

/***/ }),

/***/ "./resources/js/core/components/routing/RouteTo.vue":
/*!**********************************************************!*\
  !*** ./resources/js/core/components/routing/RouteTo.vue ***!
  \**********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _RouteTo_vue_vue_type_template_id_203148a4__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./RouteTo.vue?vue&type=template&id=203148a4 */ \"./resources/js/core/components/routing/RouteTo.vue?vue&type=template&id=203148a4\");\n/* harmony import */ var _RouteTo_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./RouteTo.vue?vue&type=script&lang=js */ \"./resources/js/core/components/routing/RouteTo.vue?vue&type=script&lang=js\");\n/* harmony import */ var _Users_negarasadi_projects_acl_booking_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./node_modules/vue-loader/dist/exportHelper.js */ \"./node_modules/vue-loader/dist/exportHelper.js\");\n\n\n\n\n;\nconst __exports__ = /*#__PURE__*/(0,_Users_negarasadi_projects_acl_booking_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(_RouteTo_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"], [['render',_RouteTo_vue_vue_type_template_id_203148a4__WEBPACK_IMPORTED_MODULE_0__.render],['__file',\"resources/js/core/components/routing/RouteTo.vue\"]])\n/* hot reload */\nif (false) {}\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__exports__);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL3JvdXRpbmcvUm91dGVUby52dWUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFvRTtBQUNWO0FBQ0w7O0FBRXJELENBQWlIO0FBQ2pILGlDQUFpQywrSEFBZSxDQUFDLDRFQUFNLGFBQWEsOEVBQU07QUFDMUU7QUFDQSxJQUFJLEtBQVUsRUFBRSxFQWNmOzs7QUFHRCxpRUFBZSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvcm91dGluZy9Sb3V0ZVRvLnZ1ZT8xZjU0Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlciB9IGZyb20gXCIuL1JvdXRlVG8udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTIwMzE0OGE0XCJcbmltcG9ydCBzY3JpcHQgZnJvbSBcIi4vUm91dGVUby52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIlxuZXhwb3J0ICogZnJvbSBcIi4vUm91dGVUby52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIlxuXG5pbXBvcnQgZXhwb3J0Q29tcG9uZW50IGZyb20gXCIvVXNlcnMvbmVnYXJhc2FkaS9wcm9qZWN0cy9hY2wtYm9va2luZy9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2V4cG9ydEhlbHBlci5qc1wiXG5jb25zdCBfX2V4cG9ydHNfXyA9IC8qI19fUFVSRV9fKi9leHBvcnRDb21wb25lbnQoc2NyaXB0LCBbWydyZW5kZXInLHJlbmRlcl0sWydfX2ZpbGUnLFwicmVzb3VyY2VzL2pzL2NvcmUvY29tcG9uZW50cy9yb3V0aW5nL1JvdXRlVG8udnVlXCJdXSlcbi8qIGhvdCByZWxvYWQgKi9cbmlmIChtb2R1bGUuaG90KSB7XG4gIF9fZXhwb3J0c19fLl9faG1ySWQgPSBcIjIwMzE0OGE0XCJcbiAgY29uc3QgYXBpID0gX19WVUVfSE1SX1JVTlRJTUVfX1xuICBtb2R1bGUuaG90LmFjY2VwdCgpXG4gIGlmICghYXBpLmNyZWF0ZVJlY29yZCgnMjAzMTQ4YTQnLCBfX2V4cG9ydHNfXykpIHtcbiAgICBjb25zb2xlLmxvZygncmVsb2FkJylcbiAgICBhcGkucmVsb2FkKCcyMDMxNDhhNCcsIF9fZXhwb3J0c19fKVxuICB9XG4gIFxuICBtb2R1bGUuaG90LmFjY2VwdChcIi4vUm91dGVUby52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MjAzMTQ4YTRcIiwgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCdyZS1yZW5kZXInKVxuICAgIGFwaS5yZXJlbmRlcignMjAzMTQ4YTQnLCByZW5kZXIpXG4gIH0pXG5cbn1cblxuXG5leHBvcnQgZGVmYXVsdCBfX2V4cG9ydHNfXyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/core/components/routing/RouteTo.vue\n");

/***/ }),

/***/ "./resources/js/plugins/VueAuth.vue":
/*!******************************************!*\
  !*** ./resources/js/plugins/VueAuth.vue ***!
  \******************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _VueAuth_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./VueAuth.vue?vue&type=script&lang=js */ \"./resources/js/plugins/VueAuth.vue?vue&type=script&lang=js\");\n/* harmony import */ var _Users_negarasadi_projects_acl_booking_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./node_modules/vue-loader/dist/exportHelper.js */ \"./node_modules/vue-loader/dist/exportHelper.js\");\n\n\n\n;\nconst __exports__ = /*#__PURE__*/(0,_Users_negarasadi_projects_acl_booking_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_VueAuth_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"], [['__file',\"resources/js/plugins/VueAuth.vue\"]])\n/* hot reload */\nif (false) {}\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__exports__);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvcGx1Z2lucy9WdWVBdXRoLnZ1ZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBMEQ7QUFDTDs7QUFFckQsQ0FBaUg7QUFDakgsaUNBQWlDLCtIQUFlLENBQUMsNEVBQU07QUFDdkQ7QUFDQSxJQUFJLEtBQVUsRUFBRSxFQVNmOzs7QUFHRCxpRUFBZSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9wbHVnaW5zL1Z1ZUF1dGgudnVlPzYyNTgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNjcmlwdCBmcm9tIFwiLi9WdWVBdXRoLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9WdWVBdXRoLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiXG5cbmltcG9ydCBleHBvcnRDb21wb25lbnQgZnJvbSBcIi9Vc2Vycy9uZWdhcmFzYWRpL3Byb2plY3RzL2FjbC1ib29raW5nL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvZXhwb3J0SGVscGVyLmpzXCJcbmNvbnN0IF9fZXhwb3J0c19fID0gLyojX19QVVJFX18qL2V4cG9ydENvbXBvbmVudChzY3JpcHQsIFtbJ19fZmlsZScsXCJyZXNvdXJjZXMvanMvcGx1Z2lucy9WdWVBdXRoLnZ1ZVwiXV0pXG4vKiBob3QgcmVsb2FkICovXG5pZiAobW9kdWxlLmhvdCkge1xuICBfX2V4cG9ydHNfXy5fX2htcklkID0gXCI3YmExMzkzMVwiXG4gIGNvbnN0IGFwaSA9IF9fVlVFX0hNUl9SVU5USU1FX19cbiAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuICBpZiAoIWFwaS5jcmVhdGVSZWNvcmQoJzdiYTEzOTMxJywgX19leHBvcnRzX18pKSB7XG4gICAgY29uc29sZS5sb2coJ3JlbG9hZCcpXG4gICAgYXBpLnJlbG9hZCgnN2JhMTM5MzEnLCBfX2V4cG9ydHNfXylcbiAgfVxuICBcbn1cblxuXG5leHBvcnQgZGVmYXVsdCBfX2V4cG9ydHNfXyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/plugins/VueAuth.vue\n");

/***/ }),

/***/ "./resources/js/core/components/LoadingIcon.vue?vue&type=script&lang=js":
/*!******************************************************************************!*\
  !*** ./resources/js/core/components/LoadingIcon.vue?vue&type=script&lang=js ***!
  \******************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_LoadingIcon_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_LoadingIcon_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./LoadingIcon.vue?vue&type=script&lang=js */ \"./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/LoadingIcon.vue?vue&type=script&lang=js\");\n //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL0xvYWRpbmdJY29uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFzTiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvTG9hZGluZ0ljb24udnVlPzJmM2EiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gXCItIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTUudXNlWzBdIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvaW5kZXguanM/P3J1bGVTZXRbMF0udXNlWzBdIS4vTG9hZGluZ0ljb24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCI7IGV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTUudXNlWzBdIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvaW5kZXguanM/P3J1bGVTZXRbMF0udXNlWzBdIS4vTG9hZGluZ0ljb24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/core/components/LoadingIcon.vue?vue&type=script&lang=js\n");

/***/ }),

/***/ "./resources/js/core/components/nav/FooterBar.vue?vue&type=script&lang=js":
/*!********************************************************************************!*\
  !*** ./resources/js/core/components/nav/FooterBar.vue?vue&type=script&lang=js ***!
  \********************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_FooterBar_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_FooterBar_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./FooterBar.vue?vue&type=script&lang=js */ \"./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/FooterBar.vue?vue&type=script&lang=js\");\n //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9Gb290ZXJCYXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQTBOIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvcmUvY29tcG9uZW50cy9uYXYvRm9vdGVyQmFyLnZ1ZT9lMTVhIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tIFwiLSEuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC01LnVzZVswXSEuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2luZGV4LmpzPz9ydWxlU2V0WzBdLnVzZVswXSEuL0Zvb3RlckJhci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIjsgZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P2Nsb25lZFJ1bGVTZXQtNS51c2VbMF0hLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9pbmRleC5qcz8/cnVsZVNldFswXS51c2VbMF0hLi9Gb290ZXJCYXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/core/components/nav/FooterBar.vue?vue&type=script&lang=js\n");

/***/ }),

/***/ "./resources/js/core/components/nav/SideBar.vue?vue&type=script&lang=js":
/*!******************************************************************************!*\
  !*** ./resources/js/core/components/nav/SideBar.vue?vue&type=script&lang=js ***!
  \******************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_SideBar_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_SideBar_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./SideBar.vue?vue&type=script&lang=js */ \"./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/SideBar.vue?vue&type=script&lang=js\");\n //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9TaWRlQmFyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUF3TiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb3JlL2NvbXBvbmVudHMvbmF2L1NpZGVCYXIudnVlPzg2ZGEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gXCItIS4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTUudXNlWzBdIS4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvaW5kZXguanM/P3J1bGVTZXRbMF0udXNlWzBdIS4vU2lkZUJhci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIjsgZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P2Nsb25lZFJ1bGVTZXQtNS51c2VbMF0hLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9pbmRleC5qcz8/cnVsZVNldFswXS51c2VbMF0hLi9TaWRlQmFyLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/core/components/nav/SideBar.vue?vue&type=script&lang=js\n");

/***/ }),

/***/ "./resources/js/core/components/nav/TopBar.vue?vue&type=script&lang=js":
/*!*****************************************************************************!*\
  !*** ./resources/js/core/components/nav/TopBar.vue?vue&type=script&lang=js ***!
  \*****************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_TopBar_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_TopBar_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./TopBar.vue?vue&type=script&lang=js */ \"./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/TopBar.vue?vue&type=script&lang=js\");\n //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL25hdi9Ub3BCYXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQXVOIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvcmUvY29tcG9uZW50cy9uYXYvVG9wQmFyLnZ1ZT9mOGU5Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tIFwiLSEuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC01LnVzZVswXSEuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2luZGV4LmpzPz9ydWxlU2V0WzBdLnVzZVswXSEuL1RvcEJhci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIjsgZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P2Nsb25lZFJ1bGVTZXQtNS51c2VbMF0hLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9pbmRleC5qcz8/cnVsZVNldFswXS51c2VbMF0hLi9Ub3BCYXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/core/components/nav/TopBar.vue?vue&type=script&lang=js\n");

/***/ }),

/***/ "./resources/js/core/components/routing/RouteTo.vue?vue&type=script&lang=js":
/*!**********************************************************************************!*\
  !*** ./resources/js/core/components/routing/RouteTo.vue?vue&type=script&lang=js ***!
  \**********************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_RouteTo_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_RouteTo_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./RouteTo.vue?vue&type=script&lang=js */ \"./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/routing/RouteTo.vue?vue&type=script&lang=js\");\n //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL3JvdXRpbmcvUm91dGVUby52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBd04iLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29yZS9jb21wb25lbnRzL3JvdXRpbmcvUm91dGVUby52dWU/NGI3MSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSBcIi0hLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P2Nsb25lZFJ1bGVTZXQtNS51c2VbMF0hLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9pbmRleC5qcz8/cnVsZVNldFswXS51c2VbMF0hLi9Sb3V0ZVRvLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC01LnVzZVswXSEuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9kaXN0L2luZGV4LmpzPz9ydWxlU2V0WzBdLnVzZVswXSEuL1JvdXRlVG8udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/core/components/routing/RouteTo.vue?vue&type=script&lang=js\n");

/***/ }),

/***/ "./resources/js/plugins/VueAuth.vue?vue&type=script&lang=js":
/*!******************************************************************!*\
  !*** ./resources/js/plugins/VueAuth.vue?vue&type=script&lang=js ***!
  \******************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_VueAuth_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_VueAuth_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./VueAuth.vue?vue&type=script&lang=js */ \"./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/plugins/VueAuth.vue?vue&type=script&lang=js\");\n //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvcGx1Z2lucy9WdWVBdXRoLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUE0TSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9wbHVnaW5zL1Z1ZUF1dGgudnVlP2JiOWIiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTUudXNlWzBdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2Rpc3QvaW5kZXguanM/P3J1bGVTZXRbMF0udXNlWzBdIS4vVnVlQXV0aC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIjsgZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P2Nsb25lZFJ1bGVTZXQtNS51c2VbMF0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvZGlzdC9pbmRleC5qcz8/cnVsZVNldFswXS51c2VbMF0hLi9WdWVBdXRoLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/plugins/VueAuth.vue?vue&type=script&lang=js\n");

/***/ }),

/***/ "./resources/js/core/components/LoadingIcon.vue?vue&type=template&id=474d299e&scoped=true":
/*!************************************************************************************************!*\
  !*** ./resources/js/core/components/LoadingIcon.vue?vue&type=template&id=474d299e&scoped=true ***!
  \************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "render": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_LoadingIcon_vue_vue_type_template_id_474d299e_scoped_true__WEBPACK_IMPORTED_MODULE_0__.render)
/* harmony export */ });
/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_LoadingIcon_vue_vue_type_template_id_474d299e_scoped_true__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./LoadingIcon.vue?vue&type=template&id=474d299e&scoped=true */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/LoadingIcon.vue?vue&type=template&id=474d299e&scoped=true");


/***/ }),

/***/ "./resources/js/core/components/nav/FooterBar.vue?vue&type=template&id=5fdfec95&scoped=true":
/*!**************************************************************************************************!*\
  !*** ./resources/js/core/components/nav/FooterBar.vue?vue&type=template&id=5fdfec95&scoped=true ***!
  \**************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "render": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_FooterBar_vue_vue_type_template_id_5fdfec95_scoped_true__WEBPACK_IMPORTED_MODULE_0__.render)
/* harmony export */ });
/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_FooterBar_vue_vue_type_template_id_5fdfec95_scoped_true__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./FooterBar.vue?vue&type=template&id=5fdfec95&scoped=true */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/FooterBar.vue?vue&type=template&id=5fdfec95&scoped=true");


/***/ }),

/***/ "./resources/js/core/components/nav/SideBar.vue?vue&type=template&id=0aa712ce":
/*!************************************************************************************!*\
  !*** ./resources/js/core/components/nav/SideBar.vue?vue&type=template&id=0aa712ce ***!
  \************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "render": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_SideBar_vue_vue_type_template_id_0aa712ce__WEBPACK_IMPORTED_MODULE_0__.render)
/* harmony export */ });
/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_SideBar_vue_vue_type_template_id_0aa712ce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./SideBar.vue?vue&type=template&id=0aa712ce */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/SideBar.vue?vue&type=template&id=0aa712ce");


/***/ }),

/***/ "./resources/js/core/components/nav/TopBar.vue?vue&type=template&id=3e41eeb1&scoped=true":
/*!***********************************************************************************************!*\
  !*** ./resources/js/core/components/nav/TopBar.vue?vue&type=template&id=3e41eeb1&scoped=true ***!
  \***********************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "render": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_TopBar_vue_vue_type_template_id_3e41eeb1_scoped_true__WEBPACK_IMPORTED_MODULE_0__.render)
/* harmony export */ });
/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_TopBar_vue_vue_type_template_id_3e41eeb1_scoped_true__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./TopBar.vue?vue&type=template&id=3e41eeb1&scoped=true */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/TopBar.vue?vue&type=template&id=3e41eeb1&scoped=true");


/***/ }),

/***/ "./resources/js/core/components/routing/RouteTo.vue?vue&type=template&id=203148a4":
/*!****************************************************************************************!*\
  !*** ./resources/js/core/components/routing/RouteTo.vue?vue&type=template&id=203148a4 ***!
  \****************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "render": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_RouteTo_vue_vue_type_template_id_203148a4__WEBPACK_IMPORTED_MODULE_0__.render)
/* harmony export */ });
/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_RouteTo_vue_vue_type_template_id_203148a4__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./RouteTo.vue?vue&type=template&id=203148a4 */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/routing/RouteTo.vue?vue&type=template&id=203148a4");


/***/ }),

/***/ "./resources/js/core/components/LoadingIcon.vue?vue&type=style&index=0&id=474d299e&scoped=true&lang=css":
/*!**************************************************************************************************************!*\
  !*** ./resources/js/core/components/LoadingIcon.vue?vue&type=style&index=0&id=474d299e&scoped=true&lang=css ***!
  \**************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_LoadingIcon_vue_vue_type_style_index_0_id_474d299e_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/style-loader/dist/cjs.js!../../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./LoadingIcon.vue?vue&type=style&index=0&id=474d299e&scoped=true&lang=css */ "./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/LoadingIcon.vue?vue&type=style&index=0&id=474d299e&scoped=true&lang=css");


/***/ }),

/***/ "./resources/js/core/components/nav/FooterBar.vue?vue&type=style&index=0&id=5fdfec95&scoped=true&lang=css":
/*!****************************************************************************************************************!*\
  !*** ./resources/js/core/components/nav/FooterBar.vue?vue&type=style&index=0&id=5fdfec95&scoped=true&lang=css ***!
  \****************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_FooterBar_vue_vue_type_style_index_0_id_5fdfec95_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/style-loader/dist/cjs.js!../../../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./FooterBar.vue?vue&type=style&index=0&id=5fdfec95&scoped=true&lang=css */ "./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/FooterBar.vue?vue&type=style&index=0&id=5fdfec95&scoped=true&lang=css");


/***/ }),

/***/ "./resources/js/core/components/nav/SideBar.vue?vue&type=style&index=0&id=0aa712ce&lang=css":
/*!**************************************************************************************************!*\
  !*** ./resources/js/core/components/nav/SideBar.vue?vue&type=style&index=0&id=0aa712ce&lang=css ***!
  \**************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_SideBar_vue_vue_type_style_index_0_id_0aa712ce_lang_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/style-loader/dist/cjs.js!../../../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./SideBar.vue?vue&type=style&index=0&id=0aa712ce&lang=css */ "./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/SideBar.vue?vue&type=style&index=0&id=0aa712ce&lang=css");


/***/ }),

/***/ "./resources/js/core/components/nav/TopBar.vue?vue&type=style&index=0&id=3e41eeb1&scoped=true&lang=css":
/*!*************************************************************************************************************!*\
  !*** ./resources/js/core/components/nav/TopBar.vue?vue&type=style&index=0&id=3e41eeb1&scoped=true&lang=css ***!
  \*************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_TopBar_vue_vue_type_style_index_0_id_3e41eeb1_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/style-loader/dist/cjs.js!../../../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!../../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./TopBar.vue?vue&type=style&index=0&id=3e41eeb1&scoped=true&lang=css */ "./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/core/components/nav/TopBar.vue?vue&type=style&index=0&id=3e41eeb1&scoped=true&lang=css");


/***/ }),

/***/ "./node_modules/vue-nav-tabs/dist/vue-tabs.common.js":
/*!***********************************************************!*\
  !*** ./node_modules/vue-nav-tabs/dist/vue-tabs.common.js ***!
  \***********************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {

"use strict";
eval("/*!\n * vue-nav-tabs v0.5.7\n * (c) 2018-present cristij <joracristi@gmail.com>\n * Released under the MIT License.\n */\n\n\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar _mergeJSXProps = _interopDefault(__webpack_require__(/*! babel-helper-vue-jsx-merge-props */ \"./node_modules/babel-helper-vue-jsx-merge-props/index.js\"));\n\nvar VueTabs = {\n    name: 'vue-tabs',\n    props: {\n        activeTabColor: String,\n        activeTextColor: String,\n        disabledColor: String,\n        disabledTextColor: String,\n        /**\n         * Tab title position: center | bottom | top\n         */\n        textPosition: {\n            type: String,\n            default: 'center'\n        },\n        /**\n         * Tab type: tabs | pills\n         */\n        type: {\n            type: String,\n            default: 'tabs'\n        },\n        direction: {\n            type: String,\n            default: 'horizontal'\n        },\n        /**\n         * Centers the tabs and makes the container div full width\n         */\n        centered: Boolean,\n        value: [String, Number, Object]\n    },\n    data: function data() {\n        return {\n            activeTabIndex: 0,\n            tabs: []\n        };\n    },\n\n    computed: {\n        isTabShape: function isTabShape() {\n            return this.type === 'tabs';\n        },\n        isStacked: function isStacked() {\n            return this.direction === 'vertical';\n        },\n        classList: function classList() {\n            var navType = this.isTabShape ? 'nav-tabs' : 'nav-pills';\n            var centerClass = this.centered ? 'nav-justified' : '';\n            var isStacked = this.isStacked ? 'nav-stacked' : '';\n            return 'nav ' + navType + ' ' + centerClass + ' ' + isStacked;\n        },\n        stackedClass: function stackedClass() {\n            return this.isStacked ? 'stacked' : '';\n        },\n        activeTabStyle: function activeTabStyle() {\n            return {\n                backgroundColor: this.activeTabColor,\n                color: this.activeTextColor\n            };\n        }\n    },\n    methods: {\n        navigateToTab: function navigateToTab(index, route) {\n            this.changeTab(this.activeTabIndex, index, route);\n        },\n        activateTab: function activateTab(index) {\n            this.activeTabIndex = index;\n            var tab = this.tabs[index];\n            tab.active = true;\n            this.$emit('input', tab.title);\n        },\n        changeTab: function changeTab(oldIndex, newIndex, route) {\n            var oldTab = this.tabs[oldIndex] || {};\n            var newTab = this.tabs[newIndex];\n            if (newTab.disabled) return;\n            this.activeTabIndex = newIndex;\n            oldTab.active = false;\n            newTab.active = true;\n            this.$emit('input', this.tabs[newIndex].title);\n            this.$emit('tab-change', newIndex, newTab, oldTab);\n            this.tryChangeRoute(route);\n        },\n        tryChangeRoute: function tryChangeRoute(route) {\n            if (this.$router && route) {\n                this.$router.push(route);\n            }\n        },\n        addTab: function addTab(item) {\n            var index = this.$slots.default.indexOf(item.$vnode);\n            this.tabs.splice(index, 0, item);\n        },\n        removeTab: function removeTab(item) {\n            var tabs = this.tabs;\n            var index = tabs.indexOf(item);\n            if (index > -1) {\n                tabs.splice(index, 1);\n            }\n        },\n        getTabs: function getTabs() {\n            if (this.$slots.default) {\n                return this.$slots.default.filter(function (comp) {\n                    return comp.componentOptions;\n                });\n            }\n            return [];\n        },\n        findTabAndActivate: function findTabAndActivate(tabNameOrIndex) {\n            var indexToActivate = this.tabs.findIndex(function (tab, index) {\n                return tab.title === tabNameOrIndex || index === tabNameOrIndex;\n            });\n            if (indexToActivate === this.activeTabIndex) return;\n            if (indexToActivate !== -1) {\n                this.changeTab(this.activeTabIndex, indexToActivate);\n            } else {\n                this.changeTab(this.activeTabIndex, 0);\n            }\n        },\n        renderTabTitle: function renderTabTitle(index) {\n            var position = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n            var h = this.$createElement;\n\n            if (this.tabs.length === 0) return;\n            var tab = this.tabs[index];\n            var active = tab.active,\n                title = tab.title;\n\n            var titleStyles = { color: this.activeTabColor };\n            if (position === 'center') titleStyles.color = this.activeTextColor;\n            var simpleTitle = h(\n                'span',\n                { 'class': 'title title_' + position, style: active ? titleStyles : {} },\n                [position === 'center' && this.renderIcon(index), title]\n            );\n\n            if (tab.$slots.title) return tab.$slots.title;\n            if (tab.$scopedSlots.title) return tab.$scopedSlots.title({\n                active: active,\n                title: title,\n                position: position,\n                icon: tab.icon,\n                data: tab.tabData\n            });\n            return simpleTitle;\n        },\n        renderIcon: function renderIcon(index) {\n            var h = this.$createElement;\n\n            if (this.tabs.length === 0) return;\n            var tab = this.tabs[index];\n            var icon = tab.icon;\n\n            var simpleIcon = h(\n                'i',\n                { 'class': icon },\n                ['\\xA0']\n            );\n            if (!tab.$slots.title && icon) return simpleIcon;\n        },\n        tabStyles: function tabStyles(tab) {\n            if (tab.disabled) {\n                return {\n                    backgroundColor: this.disabledColor,\n                    color: this.disabledTextColor\n                };\n            }\n            return {};\n        },\n        renderTabs: function renderTabs() {\n            var _this = this;\n\n            var h = this.$createElement;\n\n            return this.tabs.map(function (tab, index) {\n                if (!tab) return;\n                var route = tab.route,\n                    id = tab.id,\n                    title = tab.title,\n                    icon = tab.icon,\n                    tabId = tab.tabId;\n\n                var active = _this.activeTabIndex === index;\n                return h(\n                    'li',\n                    _mergeJSXProps([{\n                        attrs: { name: 'tab',\n                            id: 't-' + tabId,\n                            'aria-selected': active,\n                            'aria-controls': 'p-' + tabId,\n                            role: 'tab' },\n\n                        'class': ['tab', { active: active }, { disabled: tab.disabled }],\n                        key: title }, {\n                        on: {\n                            'click': function click($event) {\n                                for (var _len = arguments.length, attrs = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n                                    attrs[_key - 1] = arguments[_key];\n                                }\n\n                                (function () {\n                                    return !tab.disabled && _this.navigateToTab(index, route);\n                                }).apply(undefined, [$event].concat(attrs));\n                            }\n                        }\n                    }]),\n                    [_this.textPosition === 'top' && _this.renderTabTitle(index, _this.textPosition), h(\n                        'a',\n                        _mergeJSXProps([{\n                            attrs: { href: '#',\n\n                                role: 'tab' },\n\n                            style: active ? _this.activeTabStyle : _this.tabStyles(tab),\n                            'class': [{ 'active_tab': active }, 'tabs__link'] }, {\n                            on: {\n                                'click': function click($event) {\n                                    for (var _len2 = arguments.length, attrs = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n                                        attrs[_key2 - 1] = arguments[_key2];\n                                    }\n\n                                    (function (e) {\n                                        e.preventDefault();\n                                        return false;\n                                    }).apply(undefined, [$event].concat(attrs));\n                                }\n                            }\n                        }]),\n                        [_this.textPosition !== 'center' && !tab.$slots.title && _this.renderIcon(index), _this.textPosition === 'center' && _this.renderTabTitle(index, _this.textPosition)]\n                    ), _this.textPosition === 'bottom' && _this.renderTabTitle(index, _this.textPosition)]\n                );\n            });\n        }\n    },\n    render: function render() {\n        var h = arguments[0];\n\n        var tabList = this.renderTabs();\n        return h(\n            'div',\n            { 'class': ['vue-tabs', this.stackedClass] },\n            [h(\n                'div',\n                { 'class': [{ 'nav-tabs-navigation': !this.isStacked }, { 'left-vertical-tabs': this.isStacked }] },\n                [h(\n                    'div',\n                    { 'class': ['nav-tabs-wrapper', this.stackedClass] },\n                    [h(\n                        'ul',\n                        { 'class': this.classList, attrs: { role: 'tablist' }\n                        },\n                        [tabList]\n                    )]\n                )]\n            ), h(\n                'div',\n                { 'class': ['tab-content', { 'right-text-tabs': this.isStacked }] },\n                [this.$slots.default]\n            )]\n        );\n    },\n\n    watch: {\n        tabs: function tabs(newList) {\n            if (newList.length > 0 && !this.value) {\n                if (newList.length <= this.activeTabIndex) {\n                    this.activateTab(this.activeTabIndex - 1);\n                } else {\n                    this.activateTab(this.activeTabIndex);\n                }\n            }\n            if (newList.length > 0 && this.value) {\n                this.findTabAndActivate(this.value);\n            }\n        },\n        value: function value(newVal) {\n            this.findTabAndActivate(newVal);\n        }\n    }\n};\n\nvar VTab = {\n    name: 'v-tab',\n    props: {\n        title: {\n            type: String,\n            default: ''\n        },\n        icon: {\n            type: String,\n            default: ''\n        },\n        tabData: {\n            default: null\n        },\n        /***\n         * Function to execute before tab switch. Return value must be boolean\n         * If the return result is false, tab switch is restricted\n         */\n        beforeChange: {\n            type: Function\n        },\n        id: String,\n        route: {\n            type: [String, Object]\n        },\n        disabled: Boolean,\n        transitionName: String,\n        transitionMode: String\n    },\n    computed: {\n        isValidParent: function isValidParent() {\n            return this.$parent.$options.name === 'vue-tabs';\n        },\n        hash: function hash() {\n            return '#' + this.id;\n        },\n        tabId: function tabId() {\n            return this.id ? this.id : this.title;\n        }\n    },\n    data: function data() {\n        return {\n            active: false,\n            validationError: null\n        };\n    },\n    mounted: function mounted() {\n        this.$parent.addTab(this);\n    },\n    destroyed: function destroyed() {\n        if (this.$el && this.$el.parentNode) {\n            this.$el.parentNode.removeChild(this.$el);\n        }\n        this.$parent.removeTab(this);\n    },\n    render: function render() {\n        var h = arguments[0];\n\n        return h(\n            'section',\n            { 'class': 'tab-container',\n                attrs: { id: 'p-' + this.tabId,\n                    'aria-labelledby': 't-' + this.tabId,\n                    role: 'tabpanel' },\n                directives: [{\n                    name: 'show',\n                    value: this.active\n                }]\n            },\n            [this.$slots.default]\n        );\n    }\n};\n\nvar VueTabsPlugin = {\n  install: function install(Vue) {\n    Vue.component('vue-tabs', VueTabs);\n    Vue.component('v-tab', VTab);\n  }\n};\n// Automatic installation if Vue has been added to the global scope.\nif (typeof window !== 'undefined' && window.Vue) {\n  window.Vue.use(VueTabsPlugin);\n  window.VueTabs = VueTabsPlugin;\n}\n\nexports[\"default\"] = VueTabsPlugin;\nexports.VueTabs = VueTabs;\nexports.VTab = VTab;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdnVlLW5hdi10YWJzL2Rpc3QvdnVlLXRhYnMuY29tbW9uLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDYTs7QUFFYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7O0FBRTdELGdDQUFnQzs7QUFFaEMscUNBQXFDLG1CQUFPLENBQUMsa0dBQWtDOztBQUUvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHNFQUFzRTtBQUN4RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsZUFBZTtBQUNqQztBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekMsMkNBQTJDLGdCQUFnQixJQUFJLHdCQUF3QjtBQUN2RixvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBLG9IQUFvSCxhQUFhO0FBQ2pJO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQzs7QUFFckMsNkNBQTZDOztBQUU3QztBQUNBLHdDQUF3QyxzQkFBc0IsaUJBQWlCO0FBQy9FO0FBQ0E7QUFDQSw0SEFBNEgsZUFBZTtBQUMzSTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsMENBQTBDO0FBQ3hEO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWSx3Q0FBd0MsSUFBSSxzQ0FBc0MsR0FBRztBQUNuSDtBQUNBO0FBQ0Esc0JBQXNCLGtEQUFrRDtBQUN4RTtBQUNBO0FBQ0EsMEJBQTBCLGtDQUFrQztBQUM1RCx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiwyQkFBMkIsbUNBQW1DLEdBQUc7QUFDbkY7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkLHlCQUF5QjtBQUN6QjtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCO0FBQ2xCLGVBQWU7QUFDZixZQUFZIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Z1ZS1uYXYtdGFicy9kaXN0L3Z1ZS10YWJzLmNvbW1vbi5qcz9mMDA1Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogdnVlLW5hdi10YWJzIHYwLjUuN1xuICogKGMpIDIwMTgtcHJlc2VudCBjcmlzdGlqIDxqb3JhY3Jpc3RpQGdtYWlsLmNvbT5cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGV4KSB7IHJldHVybiAoZXggJiYgKHR5cGVvZiBleCA9PT0gJ29iamVjdCcpICYmICdkZWZhdWx0JyBpbiBleCkgPyBleFsnZGVmYXVsdCddIDogZXg7IH1cblxudmFyIF9tZXJnZUpTWFByb3BzID0gX2ludGVyb3BEZWZhdWx0KHJlcXVpcmUoJ2JhYmVsLWhlbHBlci12dWUtanN4LW1lcmdlLXByb3BzJykpO1xuXG52YXIgVnVlVGFicyA9IHtcbiAgICBuYW1lOiAndnVlLXRhYnMnLFxuICAgIHByb3BzOiB7XG4gICAgICAgIGFjdGl2ZVRhYkNvbG9yOiBTdHJpbmcsXG4gICAgICAgIGFjdGl2ZVRleHRDb2xvcjogU3RyaW5nLFxuICAgICAgICBkaXNhYmxlZENvbG9yOiBTdHJpbmcsXG4gICAgICAgIGRpc2FibGVkVGV4dENvbG9yOiBTdHJpbmcsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUYWIgdGl0bGUgcG9zaXRpb246IGNlbnRlciB8IGJvdHRvbSB8IHRvcFxuICAgICAgICAgKi9cbiAgICAgICAgdGV4dFBvc2l0aW9uOiB7XG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgICAgICBkZWZhdWx0OiAnY2VudGVyJ1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGFiIHR5cGU6IHRhYnMgfCBwaWxsc1xuICAgICAgICAgKi9cbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgZGVmYXVsdDogJ3RhYnMnXG4gICAgICAgIH0sXG4gICAgICAgIGRpcmVjdGlvbjoge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgZGVmYXVsdDogJ2hvcml6b250YWwnXG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDZW50ZXJzIHRoZSB0YWJzIGFuZCBtYWtlcyB0aGUgY29udGFpbmVyIGRpdiBmdWxsIHdpZHRoXG4gICAgICAgICAqL1xuICAgICAgICBjZW50ZXJlZDogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IFtTdHJpbmcsIE51bWJlciwgT2JqZWN0XVxuICAgIH0sXG4gICAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFjdGl2ZVRhYkluZGV4OiAwLFxuICAgICAgICAgICAgdGFiczogW11cbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgaXNUYWJTaGFwZTogZnVuY3Rpb24gaXNUYWJTaGFwZSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICd0YWJzJztcbiAgICAgICAgfSxcbiAgICAgICAgaXNTdGFja2VkOiBmdW5jdGlvbiBpc1N0YWNrZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3Rpb24gPT09ICd2ZXJ0aWNhbCc7XG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzTGlzdDogZnVuY3Rpb24gY2xhc3NMaXN0KCkge1xuICAgICAgICAgICAgdmFyIG5hdlR5cGUgPSB0aGlzLmlzVGFiU2hhcGUgPyAnbmF2LXRhYnMnIDogJ25hdi1waWxscyc7XG4gICAgICAgICAgICB2YXIgY2VudGVyQ2xhc3MgPSB0aGlzLmNlbnRlcmVkID8gJ25hdi1qdXN0aWZpZWQnIDogJyc7XG4gICAgICAgICAgICB2YXIgaXNTdGFja2VkID0gdGhpcy5pc1N0YWNrZWQgPyAnbmF2LXN0YWNrZWQnIDogJyc7XG4gICAgICAgICAgICByZXR1cm4gJ25hdiAnICsgbmF2VHlwZSArICcgJyArIGNlbnRlckNsYXNzICsgJyAnICsgaXNTdGFja2VkO1xuICAgICAgICB9LFxuICAgICAgICBzdGFja2VkQ2xhc3M6IGZ1bmN0aW9uIHN0YWNrZWRDbGFzcygpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU3RhY2tlZCA/ICdzdGFja2VkJyA6ICcnO1xuICAgICAgICB9LFxuICAgICAgICBhY3RpdmVUYWJTdHlsZTogZnVuY3Rpb24gYWN0aXZlVGFiU3R5bGUoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5hY3RpdmVUYWJDb2xvcixcbiAgICAgICAgICAgICAgICBjb2xvcjogdGhpcy5hY3RpdmVUZXh0Q29sb3JcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1ldGhvZHM6IHtcbiAgICAgICAgbmF2aWdhdGVUb1RhYjogZnVuY3Rpb24gbmF2aWdhdGVUb1RhYihpbmRleCwgcm91dGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlVGFiKHRoaXMuYWN0aXZlVGFiSW5kZXgsIGluZGV4LCByb3V0ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFjdGl2YXRlVGFiOiBmdW5jdGlvbiBhY3RpdmF0ZVRhYihpbmRleCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVUYWJJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgdmFyIHRhYiA9IHRoaXMudGFic1tpbmRleF07XG4gICAgICAgICAgICB0YWIuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdGFiLnRpdGxlKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hhbmdlVGFiOiBmdW5jdGlvbiBjaGFuZ2VUYWIob2xkSW5kZXgsIG5ld0luZGV4LCByb3V0ZSkge1xuICAgICAgICAgICAgdmFyIG9sZFRhYiA9IHRoaXMudGFic1tvbGRJbmRleF0gfHwge307XG4gICAgICAgICAgICB2YXIgbmV3VGFiID0gdGhpcy50YWJzW25ld0luZGV4XTtcbiAgICAgICAgICAgIGlmIChuZXdUYWIuZGlzYWJsZWQpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlVGFiSW5kZXggPSBuZXdJbmRleDtcbiAgICAgICAgICAgIG9sZFRhYi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIG5ld1RhYi5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB0aGlzLnRhYnNbbmV3SW5kZXhdLnRpdGxlKTtcbiAgICAgICAgICAgIHRoaXMuJGVtaXQoJ3RhYi1jaGFuZ2UnLCBuZXdJbmRleCwgbmV3VGFiLCBvbGRUYWIpO1xuICAgICAgICAgICAgdGhpcy50cnlDaGFuZ2VSb3V0ZShyb3V0ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHRyeUNoYW5nZVJvdXRlOiBmdW5jdGlvbiB0cnlDaGFuZ2VSb3V0ZShyb3V0ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuJHJvdXRlciAmJiByb3V0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHJvdXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYWRkVGFiOiBmdW5jdGlvbiBhZGRUYWIoaXRlbSkge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy4kc2xvdHMuZGVmYXVsdC5pbmRleE9mKGl0ZW0uJHZub2RlKTtcbiAgICAgICAgICAgIHRoaXMudGFicy5zcGxpY2UoaW5kZXgsIDAsIGl0ZW0pO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmVUYWI6IGZ1bmN0aW9uIHJlbW92ZVRhYihpdGVtKSB7XG4gICAgICAgICAgICB2YXIgdGFicyA9IHRoaXMudGFicztcbiAgICAgICAgICAgIHZhciBpbmRleCA9IHRhYnMuaW5kZXhPZihpdGVtKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdGFicy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXRUYWJzOiBmdW5jdGlvbiBnZXRUYWJzKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuJHNsb3RzLmRlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kc2xvdHMuZGVmYXVsdC5maWx0ZXIoZnVuY3Rpb24gKGNvbXApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXAuY29tcG9uZW50T3B0aW9ucztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSxcbiAgICAgICAgZmluZFRhYkFuZEFjdGl2YXRlOiBmdW5jdGlvbiBmaW5kVGFiQW5kQWN0aXZhdGUodGFiTmFtZU9ySW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBpbmRleFRvQWN0aXZhdGUgPSB0aGlzLnRhYnMuZmluZEluZGV4KGZ1bmN0aW9uICh0YWIsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhYi50aXRsZSA9PT0gdGFiTmFtZU9ySW5kZXggfHwgaW5kZXggPT09IHRhYk5hbWVPckluZGV4O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaW5kZXhUb0FjdGl2YXRlID09PSB0aGlzLmFjdGl2ZVRhYkluZGV4KSByZXR1cm47XG4gICAgICAgICAgICBpZiAoaW5kZXhUb0FjdGl2YXRlICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlVGFiKHRoaXMuYWN0aXZlVGFiSW5kZXgsIGluZGV4VG9BY3RpdmF0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlVGFiKHRoaXMuYWN0aXZlVGFiSW5kZXgsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZW5kZXJUYWJUaXRsZTogZnVuY3Rpb24gcmVuZGVyVGFiVGl0bGUoaW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBwb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJ3RvcCc7XG4gICAgICAgICAgICB2YXIgaCA9IHRoaXMuJGNyZWF0ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnRhYnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICB2YXIgdGFiID0gdGhpcy50YWJzW2luZGV4XTtcbiAgICAgICAgICAgIHZhciBhY3RpdmUgPSB0YWIuYWN0aXZlLFxuICAgICAgICAgICAgICAgIHRpdGxlID0gdGFiLnRpdGxlO1xuXG4gICAgICAgICAgICB2YXIgdGl0bGVTdHlsZXMgPSB7IGNvbG9yOiB0aGlzLmFjdGl2ZVRhYkNvbG9yIH07XG4gICAgICAgICAgICBpZiAocG9zaXRpb24gPT09ICdjZW50ZXInKSB0aXRsZVN0eWxlcy5jb2xvciA9IHRoaXMuYWN0aXZlVGV4dENvbG9yO1xuICAgICAgICAgICAgdmFyIHNpbXBsZVRpdGxlID0gaChcbiAgICAgICAgICAgICAgICAnc3BhbicsXG4gICAgICAgICAgICAgICAgeyAnY2xhc3MnOiAndGl0bGUgdGl0bGVfJyArIHBvc2l0aW9uLCBzdHlsZTogYWN0aXZlID8gdGl0bGVTdHlsZXMgOiB7fSB9LFxuICAgICAgICAgICAgICAgIFtwb3NpdGlvbiA9PT0gJ2NlbnRlcicgJiYgdGhpcy5yZW5kZXJJY29uKGluZGV4KSwgdGl0bGVdXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAodGFiLiRzbG90cy50aXRsZSkgcmV0dXJuIHRhYi4kc2xvdHMudGl0bGU7XG4gICAgICAgICAgICBpZiAodGFiLiRzY29wZWRTbG90cy50aXRsZSkgcmV0dXJuIHRhYi4kc2NvcGVkU2xvdHMudGl0bGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgaWNvbjogdGFiLmljb24sXG4gICAgICAgICAgICAgICAgZGF0YTogdGFiLnRhYkRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHNpbXBsZVRpdGxlO1xuICAgICAgICB9LFxuICAgICAgICByZW5kZXJJY29uOiBmdW5jdGlvbiByZW5kZXJJY29uKGluZGV4KSB7XG4gICAgICAgICAgICB2YXIgaCA9IHRoaXMuJGNyZWF0ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnRhYnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICB2YXIgdGFiID0gdGhpcy50YWJzW2luZGV4XTtcbiAgICAgICAgICAgIHZhciBpY29uID0gdGFiLmljb247XG5cbiAgICAgICAgICAgIHZhciBzaW1wbGVJY29uID0gaChcbiAgICAgICAgICAgICAgICAnaScsXG4gICAgICAgICAgICAgICAgeyAnY2xhc3MnOiBpY29uIH0sXG4gICAgICAgICAgICAgICAgWydcXHhBMCddXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCF0YWIuJHNsb3RzLnRpdGxlICYmIGljb24pIHJldHVybiBzaW1wbGVJY29uO1xuICAgICAgICB9LFxuICAgICAgICB0YWJTdHlsZXM6IGZ1bmN0aW9uIHRhYlN0eWxlcyh0YWIpIHtcbiAgICAgICAgICAgIGlmICh0YWIuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuZGlzYWJsZWRDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6IHRoaXMuZGlzYWJsZWRUZXh0Q29sb3JcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9LFxuICAgICAgICByZW5kZXJUYWJzOiBmdW5jdGlvbiByZW5kZXJUYWJzKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdmFyIGggPSB0aGlzLiRjcmVhdGVFbGVtZW50O1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YWJzLm1hcChmdW5jdGlvbiAodGFiLCBpbmRleCkge1xuICAgICAgICAgICAgICAgIGlmICghdGFiKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdmFyIHJvdXRlID0gdGFiLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICBpZCA9IHRhYi5pZCxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0YWIudGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIGljb24gPSB0YWIuaWNvbixcbiAgICAgICAgICAgICAgICAgICAgdGFiSWQgPSB0YWIudGFiSWQ7XG5cbiAgICAgICAgICAgICAgICB2YXIgYWN0aXZlID0gX3RoaXMuYWN0aXZlVGFiSW5kZXggPT09IGluZGV4O1xuICAgICAgICAgICAgICAgIHJldHVybiBoKFxuICAgICAgICAgICAgICAgICAgICAnbGknLFxuICAgICAgICAgICAgICAgICAgICBfbWVyZ2VKU1hQcm9wcyhbe1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgbmFtZTogJ3RhYicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICd0LScgKyB0YWJJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1zZWxlY3RlZCc6IGFjdGl2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1jb250cm9scyc6ICdwLScgKyB0YWJJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlOiAndGFiJyB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAnY2xhc3MnOiBbJ3RhYicsIHsgYWN0aXZlOiBhY3RpdmUgfSwgeyBkaXNhYmxlZDogdGFiLmRpc2FibGVkIH1dLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB0aXRsZSB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbGljayc6IGZ1bmN0aW9uIGNsaWNrKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXR0cnMgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0YWIuZGlzYWJsZWQgJiYgX3RoaXMubmF2aWdhdGVUb1RhYihpbmRleCwgcm91dGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5hcHBseSh1bmRlZmluZWQsIFskZXZlbnRdLmNvbmNhdChhdHRycykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfV0pLFxuICAgICAgICAgICAgICAgICAgICBbX3RoaXMudGV4dFBvc2l0aW9uID09PSAndG9wJyAmJiBfdGhpcy5yZW5kZXJUYWJUaXRsZShpbmRleCwgX3RoaXMudGV4dFBvc2l0aW9uKSwgaChcbiAgICAgICAgICAgICAgICAgICAgICAgICdhJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9tZXJnZUpTWFByb3BzKFt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgaHJlZjogJyMnLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU6ICd0YWInIH0sXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogYWN0aXZlID8gX3RoaXMuYWN0aXZlVGFiU3R5bGUgOiBfdGhpcy50YWJTdHlsZXModGFiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2xhc3MnOiBbeyAnYWN0aXZlX3RhYic6IGFjdGl2ZSB9LCAndGFic19fbGluayddIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2xpY2snOiBmdW5jdGlvbiBjbGljaygkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXR0cnMgPSBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5hcHBseSh1bmRlZmluZWQsIFskZXZlbnRdLmNvbmNhdChhdHRycykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgW190aGlzLnRleHRQb3NpdGlvbiAhPT0gJ2NlbnRlcicgJiYgIXRhYi4kc2xvdHMudGl0bGUgJiYgX3RoaXMucmVuZGVySWNvbihpbmRleCksIF90aGlzLnRleHRQb3NpdGlvbiA9PT0gJ2NlbnRlcicgJiYgX3RoaXMucmVuZGVyVGFiVGl0bGUoaW5kZXgsIF90aGlzLnRleHRQb3NpdGlvbildXG4gICAgICAgICAgICAgICAgICAgICksIF90aGlzLnRleHRQb3NpdGlvbiA9PT0gJ2JvdHRvbScgJiYgX3RoaXMucmVuZGVyVGFiVGl0bGUoaW5kZXgsIF90aGlzLnRleHRQb3NpdGlvbildXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgdmFyIGggPSBhcmd1bWVudHNbMF07XG5cbiAgICAgICAgdmFyIHRhYkxpc3QgPSB0aGlzLnJlbmRlclRhYnMoKTtcbiAgICAgICAgcmV0dXJuIGgoXG4gICAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICAgIHsgJ2NsYXNzJzogWyd2dWUtdGFicycsIHRoaXMuc3RhY2tlZENsYXNzXSB9LFxuICAgICAgICAgICAgW2goXG4gICAgICAgICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgICAgICAgeyAnY2xhc3MnOiBbeyAnbmF2LXRhYnMtbmF2aWdhdGlvbic6ICF0aGlzLmlzU3RhY2tlZCB9LCB7ICdsZWZ0LXZlcnRpY2FsLXRhYnMnOiB0aGlzLmlzU3RhY2tlZCB9XSB9LFxuICAgICAgICAgICAgICAgIFtoKFxuICAgICAgICAgICAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICAgICAgICAgICAgeyAnY2xhc3MnOiBbJ25hdi10YWJzLXdyYXBwZXInLCB0aGlzLnN0YWNrZWRDbGFzc10gfSxcbiAgICAgICAgICAgICAgICAgICAgW2goXG4gICAgICAgICAgICAgICAgICAgICAgICAndWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgeyAnY2xhc3MnOiB0aGlzLmNsYXNzTGlzdCwgYXR0cnM6IHsgcm9sZTogJ3RhYmxpc3QnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGFiTGlzdF1cbiAgICAgICAgICAgICAgICAgICAgKV1cbiAgICAgICAgICAgICAgICApXVxuICAgICAgICAgICAgKSwgaChcbiAgICAgICAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICAgICAgICB7ICdjbGFzcyc6IFsndGFiLWNvbnRlbnQnLCB7ICdyaWdodC10ZXh0LXRhYnMnOiB0aGlzLmlzU3RhY2tlZCB9XSB9LFxuICAgICAgICAgICAgICAgIFt0aGlzLiRzbG90cy5kZWZhdWx0XVxuICAgICAgICAgICAgKV1cbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgd2F0Y2g6IHtcbiAgICAgICAgdGFiczogZnVuY3Rpb24gdGFicyhuZXdMaXN0KSB7XG4gICAgICAgICAgICBpZiAobmV3TGlzdC5sZW5ndGggPiAwICYmICF0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0xpc3QubGVuZ3RoIDw9IHRoaXMuYWN0aXZlVGFiSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVRhYih0aGlzLmFjdGl2ZVRhYkluZGV4IC0gMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVRhYih0aGlzLmFjdGl2ZVRhYkluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmV3TGlzdC5sZW5ndGggPiAwICYmIHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmRUYWJBbmRBY3RpdmF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKG5ld1ZhbCkge1xuICAgICAgICAgICAgdGhpcy5maW5kVGFiQW5kQWN0aXZhdGUobmV3VmFsKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbnZhciBWVGFiID0ge1xuICAgIG5hbWU6ICd2LXRhYicsXG4gICAgcHJvcHM6IHtcbiAgICAgICAgdGl0bGU6IHtcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgICAgIGRlZmF1bHQ6ICcnXG4gICAgICAgIH0sXG4gICAgICAgIGljb246IHtcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgICAgIGRlZmF1bHQ6ICcnXG4gICAgICAgIH0sXG4gICAgICAgIHRhYkRhdGE6IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6IG51bGxcbiAgICAgICAgfSxcbiAgICAgICAgLyoqKlxuICAgICAgICAgKiBGdW5jdGlvbiB0byBleGVjdXRlIGJlZm9yZSB0YWIgc3dpdGNoLiBSZXR1cm4gdmFsdWUgbXVzdCBiZSBib29sZWFuXG4gICAgICAgICAqIElmIHRoZSByZXR1cm4gcmVzdWx0IGlzIGZhbHNlLCB0YWIgc3dpdGNoIGlzIHJlc3RyaWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIGJlZm9yZUNoYW5nZToge1xuICAgICAgICAgICAgdHlwZTogRnVuY3Rpb25cbiAgICAgICAgfSxcbiAgICAgICAgaWQ6IFN0cmluZyxcbiAgICAgICAgcm91dGU6IHtcbiAgICAgICAgICAgIHR5cGU6IFtTdHJpbmcsIE9iamVjdF1cbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZWQ6IEJvb2xlYW4sXG4gICAgICAgIHRyYW5zaXRpb25OYW1lOiBTdHJpbmcsXG4gICAgICAgIHRyYW5zaXRpb25Nb2RlOiBTdHJpbmdcbiAgICB9LFxuICAgIGNvbXB1dGVkOiB7XG4gICAgICAgIGlzVmFsaWRQYXJlbnQ6IGZ1bmN0aW9uIGlzVmFsaWRQYXJlbnQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LiRvcHRpb25zLm5hbWUgPT09ICd2dWUtdGFicyc7XG4gICAgICAgIH0sXG4gICAgICAgIGhhc2g6IGZ1bmN0aW9uIGhhc2goKSB7XG4gICAgICAgICAgICByZXR1cm4gJyMnICsgdGhpcy5pZDtcbiAgICAgICAgfSxcbiAgICAgICAgdGFiSWQ6IGZ1bmN0aW9uIHRhYklkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWQgPyB0aGlzLmlkIDogdGhpcy50aXRsZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3I6IG51bGxcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgICAgIHRoaXMuJHBhcmVudC5hZGRUYWIodGhpcyk7XG4gICAgfSxcbiAgICBkZXN0cm95ZWQ6IGZ1bmN0aW9uIGRlc3Ryb3llZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuJGVsICYmIHRoaXMuJGVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuJGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy4kZWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuJHBhcmVudC5yZW1vdmVUYWIodGhpcyk7XG4gICAgfSxcbiAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgdmFyIGggPSBhcmd1bWVudHNbMF07XG5cbiAgICAgICAgcmV0dXJuIGgoXG4gICAgICAgICAgICAnc2VjdGlvbicsXG4gICAgICAgICAgICB7ICdjbGFzcyc6ICd0YWItY29udGFpbmVyJyxcbiAgICAgICAgICAgICAgICBhdHRyczogeyBpZDogJ3AtJyArIHRoaXMudGFiSWQsXG4gICAgICAgICAgICAgICAgICAgICdhcmlhLWxhYmVsbGVkYnknOiAndC0nICsgdGhpcy50YWJJZCxcbiAgICAgICAgICAgICAgICAgICAgcm9sZTogJ3RhYnBhbmVsJyB9LFxuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFt7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzaG93JyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuYWN0aXZlXG4gICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbdGhpcy4kc2xvdHMuZGVmYXVsdF1cbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG52YXIgVnVlVGFic1BsdWdpbiA9IHtcbiAgaW5zdGFsbDogZnVuY3Rpb24gaW5zdGFsbChWdWUpIHtcbiAgICBWdWUuY29tcG9uZW50KCd2dWUtdGFicycsIFZ1ZVRhYnMpO1xuICAgIFZ1ZS5jb21wb25lbnQoJ3YtdGFiJywgVlRhYik7XG4gIH1cbn07XG4vLyBBdXRvbWF0aWMgaW5zdGFsbGF0aW9uIGlmIFZ1ZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgZ2xvYmFsIHNjb3BlLlxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5WdWUpIHtcbiAgd2luZG93LlZ1ZS51c2UoVnVlVGFic1BsdWdpbik7XG4gIHdpbmRvdy5WdWVUYWJzID0gVnVlVGFic1BsdWdpbjtcbn1cblxuZXhwb3J0c1snZGVmYXVsdCddID0gVnVlVGFic1BsdWdpbjtcbmV4cG9ydHMuVnVlVGFicyA9IFZ1ZVRhYnM7XG5leHBvcnRzLlZUYWIgPSBWVGFiO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/vue-nav-tabs/dist/vue-tabs.common.js\n");

/***/ }),

/***/ "./node_modules/vue-sidebar-menu/dist/vue-sidebar-menu.esm.js":
/*!********************************************************************!*\
  !*** ./node_modules/vue-sidebar-menu/dist/vue-sidebar-menu.esm.js ***!
  \********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"SidebarMenu\": () => (/* binding */ script),\n/* harmony export */   \"default\": () => (/* binding */ index)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n\n\nvar initSidebar = function initSidebar(props, context) {\n  var _toRefs = (0,vue__WEBPACK_IMPORTED_MODULE_0__.toRefs)(props),\n      collapsed = _toRefs.collapsed,\n      relative = _toRefs.relative,\n      width = _toRefs.width,\n      widthCollapsed = _toRefs.widthCollapsed,\n      rtl = _toRefs.rtl;\n\n  var sidebarRef = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(null);\n  var isCollapsed = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(collapsed.value);\n  var activeShow = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(null);\n  var mobileItem = (0,vue__WEBPACK_IMPORTED_MODULE_0__.reactive)({\n    item: null,\n    rect: {\n      top: 0,\n      height: 0,\n      padding: '',\n      maxHeight: 0,\n      maxWidth: 0\n    },\n    timeout: null\n  });\n  var getMobileItem = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {\n    return mobileItem.item;\n  });\n  var getMobileItemRect = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {\n    return mobileItem.rect;\n  });\n  var currentRoute = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(window.location.pathname + window.location.search + window.location.hash);\n\n  var updateIsCollapsed = function updateIsCollapsed(val) {\n    isCollapsed.value = val;\n  };\n\n  var updateActiveShow = function updateActiveShow(id) {\n    activeShow.value = id;\n  };\n\n  var setMobileItem = function setMobileItem(_ref) {\n    var item = _ref.item,\n        itemEl = _ref.itemEl;\n    clearMobileItemTimeout();\n    var linkEl = itemEl.children[0];\n\n    var _linkEl$getBoundingCl = linkEl.getBoundingClientRect(),\n        linkTop = _linkEl$getBoundingCl.top,\n        linkBottom = _linkEl$getBoundingCl.bottom,\n        linkHeight = _linkEl$getBoundingCl.height;\n\n    var _sidebarRef$value$get = sidebarRef.value.getBoundingClientRect(),\n        sidebarLeft = _sidebarRef$value$get.left,\n        sidebarRight = _sidebarRef$value$get.right;\n\n    var offsetParentTop = linkEl.offsetParent.getBoundingClientRect().top;\n    var parentHeight = window.innerHeight;\n    var parentWidth = window.innerWidth;\n    var parentTop = 0;\n    var parentRight = parentWidth;\n    var maxWidth = parseInt(width.value) - parseInt(widthCollapsed.value);\n\n    if (relative.value) {\n      var parent = sidebarRef.value.parentElement;\n      parentHeight = parent.clientHeight;\n      parentWidth = parent.clientWidth;\n      parentTop = parent.getBoundingClientRect().top;\n      parentRight = parent.getBoundingClientRect().right;\n    }\n\n    var rectWidth = rtl.value ? parentWidth - (parentRight - sidebarLeft) : parentRight - sidebarRight;\n    updateMobileItem(item);\n    updateMobileItemRect({\n      top: linkTop - offsetParentTop,\n      height: linkHeight,\n      padding: window.getComputedStyle(linkEl).paddingRight,\n      maxWidth: rectWidth <= maxWidth ? rectWidth : maxWidth,\n      maxHeight: parentHeight - (linkBottom - parentTop)\n    });\n  };\n\n  var unsetMobileItem = function unsetMobileItem() {\n    var immediate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n    var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 800;\n    if (!getMobileItem.value) return;\n    clearMobileItemTimeout();\n\n    if (immediate) {\n      updateMobileItem(null);\n      return;\n    }\n\n    mobileItem.timeout = setTimeout(function () {\n      updateMobileItem(null);\n    }, delay);\n  };\n\n  var clearMobileItemTimeout = function clearMobileItemTimeout() {\n    if (mobileItem.timeout) clearTimeout(mobileItem.timeout);\n  };\n\n  var updateMobileItem = function updateMobileItem(item) {\n    mobileItem.item = item;\n  };\n\n  var updateMobileItemRect = function updateMobileItemRect(_ref2) {\n    var top = _ref2.top,\n        height = _ref2.height,\n        padding = _ref2.padding,\n        maxWidth = _ref2.maxWidth,\n        maxHeight = _ref2.maxHeight;\n    mobileItem.rect.top = top;\n    mobileItem.rect.height = height;\n    mobileItem.rect.padding = padding;\n    mobileItem.rect.maxWidth = maxWidth;\n    mobileItem.rect.maxHeight = maxHeight;\n  };\n\n  var updateCurrentRoute = function updateCurrentRoute() {\n    var route = window.location.pathname + window.location.search + window.location.hash;\n    currentRoute.value = route;\n  };\n\n  var onItemClick = function onItemClick(event, item) {\n    context.emit('item-click', event, item);\n  };\n\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)('vsmProps', props);\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)('getSidebarRef', sidebarRef);\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)('getIsCollapsed', isCollapsed);\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)('getActiveShow', activeShow);\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)('getMobileItem', getMobileItem);\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)('getMobileItemRect', getMobileItemRect);\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)('getCurrentRoute', currentRoute);\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)('updateIsCollapsed', updateIsCollapsed);\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)('updateActiveShow', updateActiveShow);\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)('setMobileItem', setMobileItem);\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)('unsetMobileItem', unsetMobileItem);\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)('clearMobileItemTimeout', clearMobileItemTimeout);\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)('onRouteChange', updateCurrentRoute);\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)('emitItemClick', onItemClick);\n  return {\n    getSidebarRef: sidebarRef,\n    getIsCollapsed: isCollapsed,\n    getActiveShow: activeShow,\n    getMobileItem: getMobileItem,\n    getMobileItemRect: getMobileItemRect,\n    getCurrentRoute: currentRoute,\n    updateIsCollapsed: updateIsCollapsed,\n    updateActiveShow: updateActiveShow,\n    setMobileItem: setMobileItem,\n    unsetMobileItem: unsetMobileItem,\n    clearMobileItemTimeout: clearMobileItemTimeout,\n    updateCurrentRoute: updateCurrentRoute,\n    onItemClick: onItemClick\n  };\n};\nvar useSidebar = function useSidebar() {\n  return {\n    getSidebarProps: (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)('vsmProps'),\n    getSidebarRef: (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)('getSidebarRef'),\n    getIsCollapsed: (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)('getIsCollapsed'),\n    getActiveShow: (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)('getActiveShow'),\n    getMobileItem: (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)('getMobileItem'),\n    getMobileItemRect: (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)('getMobileItemRect'),\n    getCurrentRoute: (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)('getCurrentRoute'),\n    updateIsCollapsed: (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)('updateIsCollapsed'),\n    updateActiveShow: (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)('updateActiveShow'),\n    setMobileItem: (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)('setMobileItem'),\n    unsetMobileItem: (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)('unsetMobileItem'),\n    clearMobileItemTimeout: (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)('clearMobileItemTimeout'),\n    onRouteChange: (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)('onRouteChange'),\n    emitItemClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)('emitItemClick')\n  };\n};\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n\n    if (enumerableOnly) {\n      symbols = symbols.filter(function (sym) {\n        return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n      });\n    }\n\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}\n\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function (obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function (obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\n// Adapted from vue-router-next\n// See: https://github.com/vuejs/vue-router-next/blob/master/src/RouterLink.ts\nfunction activeRecordIndex(route, currentRoute) {\n  var matched = route.matched;\n  var length = matched.length;\n  var routeMatched = matched[length - 1];\n  var currentMatched = currentRoute.matched;\n  if (!routeMatched || !currentMatched.length) return -1;\n  var index = currentMatched.findIndex(isSameRouteRecord.bind(null, routeMatched));\n  if (index > -1) return index;\n  var parentRecordPath = getOriginalPath(matched[length - 2]);\n  return length > 1 && getOriginalPath(routeMatched) === parentRecordPath && currentMatched[currentMatched.length - 1].path !== parentRecordPath ? currentMatched.findIndex(isSameRouteRecord.bind(null, matched[length - 2])) : index;\n}\nfunction isSameRouteLocationParams(a, b) {\n  if (Object.keys(a).length !== Object.keys(b).length) return false;\n\n  for (var key in a) {\n    if (!isSameRouteLocationParamsValue(a[key], b[key])) return false;\n  }\n\n  return true;\n}\nfunction includesParams(outer, inner) {\n  var _loop = function _loop(key) {\n    var innerValue = inner[key];\n    var outerValue = outer[key];\n\n    if (typeof innerValue === 'string') {\n      if (innerValue !== outerValue) return {\n        v: false\n      };\n    } else {\n      if (!Array.isArray(outerValue) || outerValue.length !== innerValue.length || innerValue.some(function (value, i) {\n        return value !== outerValue[i];\n      })) {\n        return {\n          v: false\n        };\n      }\n    }\n  };\n\n  for (var key in inner) {\n    var _ret = _loop(key);\n\n    if (_typeof(_ret) === \"object\") return _ret.v;\n  }\n\n  return true;\n}\n\nfunction getOriginalPath(record) {\n  return record ? record.aliasOf ? record.aliasOf.path : record.path : '';\n}\n\nfunction isSameRouteRecord(a, b) {\n  return (a.aliasOf || a) === (b.aliasOf || b);\n}\n\nfunction isSameRouteLocationParamsValue(a, b) {\n  return Array.isArray(a) ? isEquivalentArray(a, b) : Array.isArray(b) ? isEquivalentArray(b, a) : a === b;\n}\n\nfunction isEquivalentArray(a, b) {\n  return Array.isArray(b) ? a.length === b.length && a.every(function (value, i) {\n    return value === b[i];\n  }) : a.length === 1 && a[0] === b;\n}\n\nfunction useItem(props) {\n  var router = (0,vue__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)().appContext.config.globalProperties.$router;\n\n  var _useSidebar = useSidebar(),\n      sidebarProps = _useSidebar.getSidebarProps,\n      isCollapsed = _useSidebar.getIsCollapsed,\n      activeShow = _useSidebar.getActiveShow,\n      mobileItem = _useSidebar.getMobileItem,\n      mobileItemRect = _useSidebar.getMobileItemRect,\n      currentRoute = _useSidebar.getCurrentRoute,\n      updateActiveShow = _useSidebar.updateActiveShow,\n      setMobileItem = _useSidebar.setMobileItem,\n      unsetMobileItem = _useSidebar.unsetMobileItem,\n      clearMobileItemTimeout = _useSidebar.clearMobileItemTimeout,\n      emitItemClick = _useSidebar.emitItemClick;\n\n  var emitScrollUpdate = (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)('emitScrollUpdate');\n  var itemShow = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(false);\n  var itemHover = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(false);\n  var active = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {\n    return isLinkActive(props.item) || isChildActive(props.item.child);\n  });\n  var exactActive = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {\n    return isLinkActive(props.item, true);\n  });\n\n  var isLinkActive = function isLinkActive(item, exact) {\n    if (!item.href || item.external) return false;\n\n    if (router) {\n      var route = router.resolve(item.href);\n      var routerCurrentRoute = router.currentRoute.value;\n      var activeIndex = activeRecordIndex(route, routerCurrentRoute);\n\n      if (exact || item.exact) {\n        return activeIndex > -1 && activeIndex === routerCurrentRoute.matched.length - 1 && isSameRouteLocationParams(routerCurrentRoute.params, route.params);\n      }\n\n      return activeIndex > -1 && includesParams(routerCurrentRoute.params, route.params);\n    } else {\n      return item.href === currentRoute.value;\n    }\n  };\n\n  var isChildActive = function isChildActive(child) {\n    if (!child) return false;\n    return child.some(function (item) {\n      return isLinkActive(item) || isChildActive(item.child);\n    });\n  };\n\n  var onLinkClick = function onLinkClick(event) {\n    if (!props.item.href || props.item.disabled) {\n      event.preventDefault();\n      if (props.item.disabled) return;\n    }\n\n    emitMobileItem(event, event.currentTarget.parentElement);\n\n    if (hasChild.value) {\n      if (!props.item.href || active.value) {\n        show.value = !show.value;\n      }\n    }\n\n    emitItemClick(event, props.item);\n  };\n\n  var onMouseOver = function onMouseOver(event) {\n    if (props.item.disabled) return;\n    event.stopPropagation();\n    itemHover.value = true;\n  };\n\n  var onMouseOut = function onMouseOut(event) {\n    event.stopPropagation();\n    itemHover.value = false;\n  };\n\n  var onMouseEnter = function onMouseEnter(event) {\n    if (props.item.disabled) return;\n\n    if (sidebarProps.disableHover) {\n      if (isMobileItem.value && hasChild.value) {\n        clearMobileItemTimeout();\n      }\n    } else {\n      clearMobileItemTimeout();\n      emitMobileItem(event, event.currentTarget);\n    }\n  };\n\n  var onMouseLeave = function onMouseLeave() {\n    if (sidebarProps.disableHover && !hasChild.value) return;\n\n    if (isMobileItem.value) {\n      unsetMobileItem(false, !sidebarProps.disableHover ? 300 : undefined);\n    }\n  };\n\n  var emitMobileItem = function emitMobileItem(event, itemEl) {\n    if (isMobileItem.value) return;\n\n    if (isCollapsed.value) {\n      setTimeout(function () {\n        if (isFirstLevel.value) {\n          if (!isMobileItem.value) {\n            setMobileItem({\n              item: props.item,\n              itemEl: itemEl\n            });\n          }\n        }\n\n        if (event.type === 'click' && !hasChild.value) {\n          unsetMobileItem(false, !isFirstLevel.value ? 300 : undefined);\n        }\n      }, 0);\n    }\n  };\n\n  var onExpandEnter = function onExpandEnter(el) {\n    el.style.height = el.scrollHeight + 'px';\n  };\n\n  var onExpandAfterEnter = function onExpandAfterEnter(el) {\n    el.style.height = 'auto';\n\n    if (!isCollapsed.value) {\n      emitScrollUpdate();\n    }\n  };\n\n  var onExpandBeforeLeave = function onExpandBeforeLeave(el) {\n    if (isCollapsed.value && isFirstLevel.value) {\n      el.style.display = 'none';\n      return;\n    }\n\n    el.style.height = el.scrollHeight + 'px';\n  };\n\n  var onExpandAfterLeave = function onExpandAfterLeave() {\n    if (!isCollapsed.value) {\n      emitScrollUpdate();\n    }\n  };\n\n  var show = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)({\n    get: function get() {\n      if (!hasChild.value) return false;\n      if (isCollapsed.value && isFirstLevel.value) return hover.value;\n      if (sidebarProps.showChild) return true;\n      return sidebarProps.showOneChild && isFirstLevel.value ? props.item.id === activeShow.value : itemShow.value;\n    },\n    set: function set(show) {\n      if (sidebarProps.showOneChild && isFirstLevel.value) {\n        show ? updateActiveShow(props.item.id) : updateActiveShow(null);\n      }\n\n      itemShow.value = show;\n    }\n  });\n  var hover = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {\n    return isCollapsed.value && isFirstLevel.value ? isMobileItem.value : itemHover.value;\n  });\n  var isFirstLevel = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {\n    return props.level === 1;\n  });\n  var isHidden = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {\n    if (isCollapsed.value) {\n      if (props.item.hidden && props.item.hiddenOnCollapse === undefined) {\n        return true;\n      } else {\n        return props.item.hiddenOnCollapse === true;\n      }\n    } else {\n      return props.item.hidden === true;\n    }\n  });\n  var hasChild = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {\n    return !!(props.item.child && props.item.child.length > 0);\n  });\n  var linkClass = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {\n    return ['vsm--link', \"vsm--link_level-\".concat(props.level), {\n      'vsm--link_mobile': isMobileItem.value\n    }, {\n      'vsm--link_hover': hover.value\n    }, {\n      'vsm--link_active': active.value\n    }, {\n      'vsm--link_disabled': props.item.disabled\n    }, {\n      'vsm--link_open': show.value\n    }, props.item.class];\n  });\n  var linkAttrs = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {\n    var href = props.item.href ? props.item.href : '#';\n    var target = props.item.external ? '_blank' : '_self';\n    var tabindex = props.item.disabled ? -1 : null;\n    var ariaCurrent = exactActive.value ? 'page' : null;\n    var ariaHaspopup = hasChild.value ? true : null;\n    var ariaExpanded = hasChild.value ? show.value : null;\n    return _objectSpread2({\n      href: href,\n      target: target,\n      tabindex: tabindex,\n      'aria-current': ariaCurrent,\n      'aria-haspopup': ariaHaspopup,\n      'aria-expanded': ariaExpanded\n    }, props.item.attributes);\n  });\n  var itemClass = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {\n    return ['vsm--item', {\n      'vsm--item_mobile': isMobileItem.value\n    }];\n  });\n  var isMobileItem = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {\n    var _mobileItem$value;\n\n    return props.item.id === ((_mobileItem$value = mobileItem.value) === null || _mobileItem$value === void 0 ? void 0 : _mobileItem$value.id);\n  });\n  var mobileItemDropdownStyle = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {\n    return [{\n      position: 'absolute'\n    }, {\n      top: \"\".concat(mobileItemRect.value.top + mobileItemRect.value.height, \"px\")\n    }, !sidebarProps.rtl ? {\n      left: sidebarProps.widthCollapsed\n    } : {\n      right: sidebarProps.widthCollapsed\n    }, {\n      width: \"\".concat(mobileItemRect.value.maxWidth, \"px\")\n    }, {\n      'max-height': \"\".concat(mobileItemRect.value.maxHeight, \"px\")\n    }, {\n      'overflow-y': 'auto'\n    }];\n  });\n  var mobileItemStyle = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {\n    return [{\n      position: 'absolute'\n    }, {\n      top: \"\".concat(mobileItemRect.value.top, \"px\")\n    }, !sidebarProps.rtl ? {\n      left: sidebarProps.widthCollapsed\n    } : {\n      right: sidebarProps.widthCollapsed\n    }, {\n      width: \"\".concat(mobileItemRect.value.maxWidth, \"px\")\n    }, {\n      height: \"\".concat(mobileItemRect.value.height, \"px\")\n    }, {\n      'padding-right': \"\".concat(mobileItemRect.value.padding)\n    }, {\n      'padding-left': \"\".concat(mobileItemRect.value.padding)\n    }, {\n      'z-index': '20'\n    }];\n  });\n  var mobileItemBackgroundStyle = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {\n    return [{\n      position: 'absolute'\n    }, {\n      top: \"\".concat(mobileItemRect.value.top, \"px\")\n    }, !sidebarProps.rtl ? {\n      left: '0px'\n    } : {\n      right: '0px'\n    }, {\n      width: \"\".concat(mobileItemRect.value.maxWidth + parseInt(sidebarProps.widthCollapsed), \"px\")\n    }, {\n      height: \"\".concat(mobileItemRect.value.height, \"px\")\n    }, {\n      'z-index': '10'\n    }];\n  });\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(function () {\n    return active.value;\n  }, function () {\n    if (active.value) {\n      show.value = true;\n    }\n  }, {\n    immediate: true\n  });\n  return {\n    active: active,\n    exactActive: exactActive,\n    show: show,\n    hover: hover,\n    isFirstLevel: isFirstLevel,\n    isHidden: isHidden,\n    hasChild: hasChild,\n    linkClass: linkClass,\n    linkAttrs: linkAttrs,\n    itemClass: itemClass,\n    isMobileItem: isMobileItem,\n    mobileItemDropdownStyle: mobileItemDropdownStyle,\n    mobileItemStyle: mobileItemStyle,\n    mobileItemBackgroundStyle: mobileItemBackgroundStyle,\n    onLinkClick: onLinkClick,\n    onMouseOver: onMouseOver,\n    onMouseOut: onMouseOut,\n    onMouseEnter: onMouseEnter,\n    onMouseLeave: onMouseLeave,\n    onExpandEnter: onExpandEnter,\n    onExpandAfterEnter: onExpandAfterEnter,\n    onExpandBeforeLeave: onExpandBeforeLeave,\n    onExpandAfterLeave: onExpandAfterLeave\n  };\n}\n\nvar script$5 = {\r\n  name: 'SidebarMenuLink',\r\n  inheritAttrs: false,\r\n  props: {\r\n    item: {\r\n      type: Object,\r\n      required: true\r\n    }\r\n  },\r\n  data () {\r\n    return {\r\n      router: false\r\n    }\r\n  },\r\n  computed: {\r\n    isHyperLink () {\r\n      return !!(!this.item.href || this.item.external || !this.router)\r\n    }\r\n  },\r\n  mounted () {\r\n    this.router = !!this.$router;\r\n  }\r\n};\n\nconst _hoisted_1$3 = [\"href\", \"onClick\"];\n\nfunction render$5(_ctx, _cache, $props, $setup, $data, $options) {\n  const _component_router_link = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"router-link\");\n\n  return ($options.isHyperLink)\n    ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"a\", (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeProps)((0,vue__WEBPACK_IMPORTED_MODULE_0__.mergeProps)({ key: 0 }, _ctx.$attrs)), [\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"default\")\n      ], 16 /* FULL_PROPS */))\n    : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_router_link, {\n        key: 1,\n        custom: \"\",\n        to: _ctx.$attrs.href\n      }, {\n        default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(({ href, navigate }) => [\n          (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"a\", (0,vue__WEBPACK_IMPORTED_MODULE_0__.mergeProps)(_ctx.$attrs, {\n            href: href,\n            onClick: navigate\n          }), [\n            (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"default\")\n          ], 16 /* FULL_PROPS */, _hoisted_1$3)\n        ]),\n        _: 3 /* FORWARDED */\n      }, 8 /* PROPS */, [\"to\"]))\n}\n\nscript$5.render = render$5;\nscript$5.__file = \"src/components/SidebarMenuLink.vue\";\n\nvar script$4 = {\r\n  name: 'SidebarMenuIcon',\r\n  props: {\r\n    icon: {\r\n      type: [String, Object],\r\n      default: ''\r\n    }\r\n  }\r\n};\n\nfunction render$4(_ctx, _cache, $props, $setup, $data, $options) {\n  return ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)((0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent)($props.icon.element ? $props.icon.element : 'i'), (0,vue__WEBPACK_IMPORTED_MODULE_0__.mergeProps)({\n    class: [\"vsm--icon\", typeof $props.icon === 'string' || ($props.icon instanceof String) ? $props.icon : $props.icon.class],\n    \"aria-hidden\": \"true\"\n  }, $props.icon.attributes), {\n    default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [\n      (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)((0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.icon.text), 1 /* TEXT */)\n    ]),\n    _: 1 /* STABLE */\n  }, 16 /* FULL_PROPS */, [\"class\"]))\n}\n\nscript$4.render = render$4;\nscript$4.__file = \"src/components/SidebarMenuIcon.vue\";\n\nvar script$3 = {\r\n  name: 'SidebarMenuBadge',\r\n  props: {\r\n    badge: {\r\n      type: Object,\r\n      default: () => {}\r\n    }\r\n  }\r\n};\n\nfunction render$3(_ctx, _cache, $props, $setup, $data, $options) {\n  return ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)((0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent)($props.badge.element ? $props.badge.element : 'span'), (0,vue__WEBPACK_IMPORTED_MODULE_0__.mergeProps)({\n    class: [\"vsm--badge\", $props.badge.class]\n  }, $props.badge.attributes), {\n    default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [\n      (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)((0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.badge.text), 1 /* TEXT */)\n    ]),\n    _: 1 /* STABLE */\n  }, 16 /* FULL_PROPS */, [\"class\"]))\n}\n\nscript$3.render = render$3;\nscript$3.__file = \"src/components/SidebarMenuBadge.vue\";\n\nvar script$2 = {\r\n  name: 'SidebarMenuItem',\r\n  components: {\r\n    SidebarMenuLink: script$5,\r\n    SidebarMenuIcon: script$4,\r\n    SidebarMenuBadge: script$3\r\n  },\r\n  props: {\r\n    item: {\r\n      type: Object,\r\n      required: true\r\n    },\r\n    level: {\r\n      type: Number,\r\n      default: 1\r\n    }\r\n  },\r\n  setup (props) {\r\n    const {\r\n      getSidebarProps,\r\n      getIsCollapsed: isCollapsed\r\n    } = useSidebar();\r\n    const { linkComponentName } = (0,vue__WEBPACK_IMPORTED_MODULE_0__.toRefs)(getSidebarProps);\r\n\r\n    const {\r\n      active,\r\n      exactActive,\r\n      show,\r\n      hover,\r\n      isFirstLevel,\r\n      isHidden,\r\n      hasChild,\r\n      linkClass,\r\n      linkAttrs,\r\n      itemClass,\r\n      isMobileItem,\r\n      mobileItemStyle,\r\n      mobileItemDropdownStyle,\r\n      mobileItemBackgroundStyle,\r\n      onLinkClick,\r\n      onMouseOver,\r\n      onMouseOut,\r\n      onMouseEnter,\r\n      onMouseLeave,\r\n      onExpandEnter,\r\n      onExpandAfterEnter,\r\n      onExpandBeforeLeave,\r\n      onExpandAfterLeave\r\n    } = useItem(props);\r\n\r\n    return {\r\n      isCollapsed,\r\n      linkComponentName,\r\n      active,\r\n      exactActive,\r\n      isMobileItem,\r\n      mobileItemStyle,\r\n      mobileItemDropdownStyle,\r\n      mobileItemBackgroundStyle,\r\n      show,\r\n      hover,\r\n      isFirstLevel,\r\n      isHidden,\r\n      hasChild,\r\n      linkClass,\r\n      linkAttrs,\r\n      itemClass,\r\n      onLinkClick,\r\n      onMouseOver,\r\n      onMouseOut,\r\n      onMouseEnter,\r\n      onMouseLeave,\r\n      onExpandEnter,\r\n      onExpandAfterEnter,\r\n      onExpandBeforeLeave,\r\n      onExpandAfterLeave\r\n    }\r\n  }\r\n};\n\nconst _hoisted_1$2 = { key: 0 };\nconst _hoisted_2$2 = { class: \"vsm--dropdown\" };\n\nfunction render$2(_ctx, _cache, $props, $setup, $data, $options) {\n  const _component_sidebar_menu_icon = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"sidebar-menu-icon\");\n  const _component_sidebar_menu_badge = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"sidebar-menu-badge\");\n  const _component_sidebar_menu_item = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"sidebar-menu-item\", true);\n\n  return ($props.item.component && !$setup.isHidden)\n    ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"li\", _hoisted_1$2, [\n        ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)((0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent)($props.item.component), (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeProps)((0,vue__WEBPACK_IMPORTED_MODULE_0__.guardReactiveProps)($props.item.props)), null, 16 /* FULL_PROPS */))\n      ]))\n    : ($props.item.header && !$setup.isHidden)\n      ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"li\", (0,vue__WEBPACK_IMPORTED_MODULE_0__.mergeProps)({\n          key: 1,\n          class: [\"vsm--header\", $props.item.class]\n        }, $props.item.attributes), (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.item.header), 17 /* TEXT, FULL_PROPS */))\n      : (!$setup.isHidden)\n        ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"li\", (0,vue__WEBPACK_IMPORTED_MODULE_0__.mergeProps)({\n            key: 2,\n            class: $setup.itemClass,\n            onMouseover: _cache[0] || (_cache[0] = (...args) => ($setup.onMouseOver && $setup.onMouseOver(...args))),\n            onMouseout: _cache[1] || (_cache[1] = (...args) => ($setup.onMouseOut && $setup.onMouseOut(...args)))\n          }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toHandlers)(($setup.isCollapsed && $setup.isFirstLevel) ? { mouseenter: $setup.onMouseEnter, mouseleave: $setup.onMouseLeave} : {}, true)), [\n            ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)((0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent)($setup.linkComponentName ? $setup.linkComponentName : 'SidebarMenuLink'), (0,vue__WEBPACK_IMPORTED_MODULE_0__.mergeProps)({\n              item: $props.item,\n              class: $setup.linkClass\n            }, $setup.linkAttrs, { onClick: $setup.onLinkClick }), {\n              default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [\n                ($setup.isCollapsed && $setup.isFirstLevel)\n                  ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Transition, {\n                      key: 0,\n                      name: \"slide-animation\"\n                    }, {\n                      default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [\n                        ($setup.hover)\n                          ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n                              key: 0,\n                              class: \"vsm--mobile-bg\",\n                              style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)($setup.mobileItemBackgroundStyle)\n                            }, null, 4 /* STYLE */))\n                          : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)\n                      ]),\n                      _: 1 /* STABLE */\n                    }))\n                  : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true),\n                ($props.item.icon)\n                  ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_sidebar_menu_icon, {\n                      key: 1,\n                      icon: $props.item.icon\n                    }, null, 8 /* PROPS */, [\"icon\"]))\n                  : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true),\n                (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n                  class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"vsm--title\", ($setup.isCollapsed && $setup.isFirstLevel) && !$setup.isMobileItem && 'vsm--title_hidden']),\n                  style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)($setup.isMobileItem && $setup.mobileItemStyle)\n                }, [\n                  (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.item.title), 1 /* TEXT */),\n                  ($props.item.badge)\n                    ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_sidebar_menu_badge, {\n                        key: 0,\n                        badge: $props.item.badge\n                      }, null, 8 /* PROPS */, [\"badge\"]))\n                    : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true),\n                  ($setup.hasChild)\n                    ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n                        key: 1,\n                        class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"vsm--arrow\", {'vsm--arrow_open' : $setup.show}])\n                      }, [\n                        (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"dropdown-icon\", (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeProps)((0,vue__WEBPACK_IMPORTED_MODULE_0__.guardReactiveProps)({ isOpen: $setup.show })))\n                      ], 2 /* CLASS */))\n                    : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)\n                ], 6 /* CLASS, STYLE */)\n              ]),\n              _: 3 /* FORWARDED */\n            }, 16 /* FULL_PROPS */, [\"item\", \"class\", \"onClick\"])),\n            ($setup.hasChild)\n              ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Transition, {\n                  key: 0,\n                  appear: $setup.isMobileItem,\n                  name: \"expand\",\n                  onEnter: $setup.onExpandEnter,\n                  onAfterEnter: $setup.onExpandAfterEnter,\n                  onBeforeLeave: $setup.onExpandBeforeLeave,\n                  onAfterLeave: $setup.onExpandAfterLeave\n                }, {\n                  default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [\n                    ($setup.show)\n                      ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n                          key: 0,\n                          class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"vsm--child\", $setup.isMobileItem && 'vsm--child_mobile']),\n                          style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)($setup.isMobileItem && $setup.mobileItemDropdownStyle)\n                        }, [\n                          (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"ul\", _hoisted_2$2, [\n                            ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($props.item.child, (subItem) => {\n                              return ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_sidebar_menu_item, {\n                                key: subItem.id,\n                                item: subItem,\n                                level: $props.level+1\n                              }, {\n                                \"dropdown-icon\": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(({ isOpen }) => [\n                                  (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"dropdown-icon\", (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeProps)((0,vue__WEBPACK_IMPORTED_MODULE_0__.guardReactiveProps)({ isOpen })))\n                                ]),\n                                _: 2 /* DYNAMIC */\n                              }, 1032 /* PROPS, DYNAMIC_SLOTS */, [\"item\", \"level\"]))\n                            }), 128 /* KEYED_FRAGMENT */))\n                          ])\n                        ], 6 /* CLASS, STYLE */))\n                      : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)\n                  ]),\n                  _: 3 /* FORWARDED */\n                }, 8 /* PROPS */, [\"appear\", \"onEnter\", \"onAfterEnter\", \"onBeforeLeave\", \"onAfterLeave\"]))\n              : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)\n          ], 16 /* FULL_PROPS */))\n        : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)\n}\n\nscript$2.render = render$2;\nscript$2.__file = \"src/components/SidebarMenuItem.vue\";\n\nvar script$1 = {\r\n  name: 'SidebarMenuScroll',\r\n  setup () {\r\n    const { getIsCollapsed: isCollapsed } = useSidebar();\r\n\r\n    const scrollRef = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(null);\r\n    const scrollBarRef = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(null);\r\n    const scrollThumbRef = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(null);\r\n\r\n    let cursorY = 0;\r\n    let cursorDown = false;\r\n\r\n    const onScrollUpdate = () => {\r\n      if (!scrollRef.value) return\r\n      ;(0,vue__WEBPACK_IMPORTED_MODULE_0__.nextTick)(() => {\r\n        updateThumb();\r\n      });\r\n    };\r\n\r\n    const onScroll = () => {\r\n      requestAnimationFrame(onScrollUpdate);\r\n    };\r\n\r\n    const onClick = (e) => {\r\n      const offset = Math.abs(scrollBarRef.value.getBoundingClientRect().y - e.clientY);\r\n      const thumbHalf = scrollThumbRef.value.offsetHeight / 2;\r\n      updateScrollTop(offset - thumbHalf);\r\n    };\r\n\r\n    const onMouseDown = (e) => {\r\n      e.stopImmediatePropagation();\r\n      cursorDown = true;\r\n      window.addEventListener('mousemove', onMouseMove);\r\n      window.addEventListener('mouseup', onMouseUp);\r\n      cursorY = scrollThumbRef.value.offsetHeight - (e.clientY - scrollThumbRef.value.getBoundingClientRect().y);\r\n    };\r\n\r\n    const onMouseMove = (e) => {\r\n      if (!cursorDown) return\r\n      const offset = e.clientY - scrollBarRef.value.getBoundingClientRect().y;\r\n      const thumbClickPosition = scrollThumbRef.value.offsetHeight - cursorY;\r\n      updateScrollTop(offset - thumbClickPosition);\r\n    };\r\n\r\n    const onMouseUp = (e) => {\r\n      cursorDown = false;\r\n      cursorY = 0;\r\n      window.removeEventListener('mousemove', onMouseMove);\r\n      window.removeEventListener('mouseup', onMouseUp);\r\n    };\r\n\r\n    const updateThumb = () => {\r\n      const heightPerc = scrollRef.value.clientHeight * 100 / scrollRef.value.scrollHeight;\r\n      const thumbHeightPerc = heightPerc < 100 ? heightPerc : 0;\r\n      const thumbYPerc = scrollRef.value.scrollTop * 100 / scrollRef.value.clientHeight || 0;\r\n\r\n      scrollThumbRef.value.style.height = `${thumbHeightPerc}%`;\r\n      scrollThumbRef.value.style.transform = `translateY(${thumbYPerc}%)`;\r\n    };\r\n\r\n    const updateScrollTop = (y) => {\r\n      const scrollPerc = y * 100 / scrollBarRef.value.offsetHeight;\r\n      scrollRef.value.scrollTop = scrollPerc * scrollRef.value.scrollHeight / 100;\r\n    };\r\n\r\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(() => isCollapsed.value, () => {\r\n      onScrollUpdate();\r\n    });\r\n\r\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.onMounted)(() => {\r\n      onScrollUpdate();\r\n      window.addEventListener('resize', onScrollUpdate);\r\n    });\r\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.onUnmounted)(() => {\r\n      window.removeEventListener('resize', onScrollUpdate);\r\n    });\r\n\r\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)('emitScrollUpdate', onScrollUpdate);\r\n\r\n    return {\r\n      scrollRef,\r\n      scrollBarRef,\r\n      scrollThumbRef,\r\n      onScroll,\r\n      onClick,\r\n      onMouseDown\r\n    }\r\n  }\r\n};\n\nconst _hoisted_1$1 = { class: \"vsm--scroll-wrapper\" };\nconst _hoisted_2$1 = { class: \"vsm--scroll-overflow\" };\n\nfunction render$1(_ctx, _cache, $props, $setup, $data, $options) {\n  return ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_1$1, [\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_2$1, [\n      (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n        ref: \"scrollRef\",\n        class: \"vsm--scroll\",\n        onScroll: _cache[0] || (_cache[0] = (...args) => ($setup.onScroll && $setup.onScroll(...args)))\n      }, [\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"default\")\n      ], 544 /* HYDRATE_EVENTS, NEED_PATCH */),\n      (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n        ref: \"scrollBarRef\",\n        class: \"vsm--scroll-bar\",\n        onMousedown: _cache[2] || (_cache[2] = (...args) => ($setup.onClick && $setup.onClick(...args)))\n      }, [\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n          ref: \"scrollThumbRef\",\n          class: \"vsm--scroll-thumb\",\n          onMousedown: _cache[1] || (_cache[1] = (...args) => ($setup.onMouseDown && $setup.onMouseDown(...args)))\n        }, null, 544 /* HYDRATE_EVENTS, NEED_PATCH */)\n      ], 544 /* HYDRATE_EVENTS, NEED_PATCH */)\n    ])\n  ]))\n}\n\nscript$1.render = render$1;\nscript$1.__file = \"src/components/SidebarMenuScroll.vue\";\n\nvar script = {\r\n  name: 'SidebarMenu',\r\n  components: {\r\n    SidebarMenuItem: script$2,\r\n    SidebarMenuScroll: script$1\r\n  },\r\n  props: {\r\n    menu: {\r\n      type: Array,\r\n      required: true\r\n    },\r\n    collapsed: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    width: {\r\n      type: String,\r\n      default: '290px'\r\n    },\r\n    widthCollapsed: {\r\n      type: String,\r\n      default: '65px'\r\n    },\r\n    showChild: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    theme: {\r\n      type: String,\r\n      default: ''\r\n    },\r\n    showOneChild: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    rtl: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    relative: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    hideToggle: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    disableHover: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    linkComponentName: {\r\n      type: String,\r\n      default: undefined\r\n    }\r\n  },\r\n  emits: {\r\n    'item-click' (event, item) {\r\n      return !!(event && item)\r\n    },\r\n    'update:collapsed' (collapsed) {\r\n      return !!(typeof collapsed === 'boolean')\r\n    }\r\n  },\r\n  setup (props, context) {\r\n    const {\r\n      getSidebarRef: sidebarMenuRef,\r\n      getIsCollapsed: isCollapsed,\r\n      updateIsCollapsed,\r\n      unsetMobileItem,\r\n      updateCurrentRoute\r\n    } = initSidebar(props, context);\r\n\r\n    const computedMenu = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\r\n      let id = 0;\r\n      function transformItems (items) {\r\n        function randomId () {\r\n          return `${Date.now() + '' + id++}`\r\n        }\r\n        return items.map(item => {\r\n          return { id: randomId(), ...item, ...(item.child && { child: transformItems(item.child) }) }\r\n        })\r\n      }\r\n      return transformItems(props.menu)\r\n    });\r\n\r\n    const sidebarWidth = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\r\n      return isCollapsed.value ? props.widthCollapsed : props.width\r\n    });\r\n\r\n    const sidebarClass = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\r\n      return [\r\n        !isCollapsed.value ? 'vsm_expanded' : 'vsm_collapsed',\r\n        props.theme ? `vsm_${props.theme}` : '',\r\n        props.rtl ? 'vsm_rtl' : '',\r\n        props.relative ? 'vsm_relative' : ''\r\n      ]\r\n    });\r\n\r\n    const onToggleClick = () => {\r\n      unsetMobileItem();\r\n      updateIsCollapsed(!isCollapsed.value);\r\n      context.emit('update:collapsed', isCollapsed.value);\r\n    };\r\n\r\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(() => props.collapsed, (currentCollapsed) => {\r\n      unsetMobileItem();\r\n      updateIsCollapsed(currentCollapsed);\r\n    });\r\n\r\n    const router = (0,vue__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)().appContext.config.globalProperties.$router;\r\n    if (!router) {\r\n      (0,vue__WEBPACK_IMPORTED_MODULE_0__.onMounted)(() => {\r\n        window.addEventListener('hashchange', updateCurrentRoute);\r\n      });\r\n      (0,vue__WEBPACK_IMPORTED_MODULE_0__.onUnmounted)(() => {\r\n        window.removeEventListener('hashchange', updateCurrentRoute);\r\n      });\r\n    }\r\n\r\n    return {\r\n      sidebarMenuRef,\r\n      isCollapsed,\r\n      computedMenu,\r\n      sidebarWidth,\r\n      sidebarClass,\r\n      onToggleClick,\r\n      onRouteChange: updateCurrentRoute\r\n    }\r\n  }\r\n};\n\nconst _hoisted_1 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", { class: \"vsm--arrow_default\" }, null, -1 /* HOISTED */);\nconst _hoisted_2 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", { class: \"vsm--toggle-btn_default\" }, null, -1 /* HOISTED */);\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n  const _component_sidebar_menu_item = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"sidebar-menu-item\");\n  const _component_sidebar_menu_scroll = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"sidebar-menu-scroll\");\n\n  return ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n    ref: \"sidebarMenuRef\",\n    class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"v-sidebar-menu\", $setup.sidebarClass]),\n    style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)({'max-width': $setup.sidebarWidth})\n  }, [\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"header\"),\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_sidebar_menu_scroll, null, {\n      default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"ul\", {\n          class: \"vsm--menu\",\n          style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)({'width': $setup.sidebarWidth})\n        }, [\n          ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.computedMenu, (item) => {\n            return ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_sidebar_menu_item, {\n              key: item.id,\n              item: item\n            }, {\n              \"dropdown-icon\": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(({ isOpen }) => [\n                (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"dropdown-icon\", (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeProps)((0,vue__WEBPACK_IMPORTED_MODULE_0__.guardReactiveProps)({ isOpen })), () => [\n                  _hoisted_1\n                ])\n              ]),\n              _: 2 /* DYNAMIC */\n            }, 1032 /* PROPS, DYNAMIC_SLOTS */, [\"item\"]))\n          }), 128 /* KEYED_FRAGMENT */))\n        ], 4 /* STYLE */)\n      ]),\n      _: 3 /* FORWARDED */\n    }),\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"footer\"),\n    (!$props.hideToggle)\n      ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n          key: 0,\n          class: \"vsm--toggle-btn\",\n          onClick: _cache[0] || (_cache[0] = (...args) => ($setup.onToggleClick && $setup.onToggleClick(...args)))\n        }, [\n          (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"toggle-icon\", {}, () => [\n            _hoisted_2\n          ])\n        ]))\n      : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)\n  ], 6 /* CLASS, STYLE */))\n}\n\nscript.render = render;\nscript.__file = \"src/components/SidebarMenu.vue\";\n\nvar index = {\n  install: function install(Vue) {\n    Vue.component('SidebarMenu', script);\n  }\n};\n\n\n//# sourceMappingURL=vue-sidebar-menu.esm.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdnVlLXNpZGViYXItbWVudS9kaXN0L3Z1ZS1zaWRlYmFyLW1lbnUuZXNtLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFxYzs7QUFFcmM7QUFDQSxnQkFBZ0IsMkNBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsd0NBQUc7QUFDdEIsb0JBQW9CLHdDQUFHO0FBQ3ZCLG1CQUFtQix3Q0FBRztBQUN0QixtQkFBbUIsNkNBQVE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0gsc0JBQXNCLDZDQUFRO0FBQzlCO0FBQ0EsR0FBRztBQUNILDBCQUEwQiw2Q0FBUTtBQUNsQztBQUNBLEdBQUc7QUFDSCxxQkFBcUIsd0NBQUc7O0FBRXhCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxFQUFFLDRDQUFPO0FBQ1QsRUFBRSw0Q0FBTztBQUNULEVBQUUsNENBQU87QUFDVCxFQUFFLDRDQUFPO0FBQ1QsRUFBRSw0Q0FBTztBQUNULEVBQUUsNENB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QVcsbURBQWM7QUFDekIsV0FBVyxtREFBYyxFQUFFLGlDQUFpQztBQUM1RCxHQUFHO0FBQ0gsSUFBSSwrQ0FBVTtBQUNkLElBQUksZ0RBQVc7QUFDZixlQUFlLDRDQUFPO0FBQ3RCLFFBQVEsdURBQWtCO0FBQzFCO0FBQ0EsaUJBQWlCLG1EQUFjLEVBQUUsNkJBQTZCO0FBQzlELFNBQVM7QUFDVCxXQUFXLDhDQUFTLFFBQVEsdURBQWtCLENBQUMseUNBQVEsUUFBUSwrQ0FBVTtBQUN6RSxvQkFBb0IsOENBQVMsSUFBSSxnREFBVztBQUM1QztBQUNBO0FBQ0EsYUFBYTtBQUNiLCtCQUErQiw0Q0FBTyxJQUFJLFFBQVE7QUFDbEQsZ0JBQWdCLCtDQUFVLCtCQUErQixtREFBYyxDQUFDLHVEQUFrQixHQUFHLFFBQVE7QUFDckc7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJLCtDQUFVO0FBQ2Q7QUFDQSxTQUFTLDhDQUFTLElBQUksdURBQWtCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxVQUFVLCtDQUFVLCtCQUErQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQSxRQUFRLHVEQUFrQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFbUQ7QUFDbkQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdnVlLXNpZGViYXItbWVudS9kaXN0L3Z1ZS1zaWRlYmFyLW1lbnUuZXNtLmpzPzI5MGQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCB0b1JlZnMsIHJlZiwgcmVhY3RpdmUsIGNvbXB1dGVkLCBwcm92aWRlLCBnZXRDdXJyZW50SW5zdGFuY2UsIHdhdGNoLCByZXNvbHZlQ29tcG9uZW50LCBvcGVuQmxvY2ssIGNyZWF0ZUVsZW1lbnRCbG9jaywgbm9ybWFsaXplUHJvcHMsIG1lcmdlUHJvcHMsIHJlbmRlclNsb3QsIGNyZWF0ZUJsb2NrLCB3aXRoQ3R4LCBjcmVhdGVFbGVtZW50Vk5vZGUsIHJlc29sdmVEeW5hbWljQ29tcG9uZW50LCBjcmVhdGVUZXh0Vk5vZGUsIHRvRGlzcGxheVN0cmluZywgZ3VhcmRSZWFjdGl2ZVByb3BzLCB0b0hhbmRsZXJzLCBUcmFuc2l0aW9uLCBub3JtYWxpemVTdHlsZSwgY3JlYXRlQ29tbWVudFZOb2RlLCBub3JtYWxpemVDbGFzcywgRnJhZ21lbnQsIHJlbmRlckxpc3QsIG9uTW91bnRlZCwgb25Vbm1vdW50ZWQsIG5leHRUaWNrLCBjcmVhdGVWTm9kZSB9IGZyb20gJ3Z1ZSc7XG5cbnZhciBpbml0U2lkZWJhciA9IGZ1bmN0aW9uIGluaXRTaWRlYmFyKHByb3BzLCBjb250ZXh0KSB7XG4gIHZhciBfdG9SZWZzID0gdG9SZWZzKHByb3BzKSxcbiAgICAgIGNvbGxhcHNlZCA9IF90b1JlZnMuY29sbGFwc2VkLFxuICAgICAgcmVsYXRpdmUgPSBfdG9SZWZzLnJlbGF0aXZlLFxuICAgICAgd2lkdGggPSBfdG9SZWZzLndpZHRoLFxuICAgICAgd2lkdGhDb2xsYXBzZWQgPSBfdG9SZWZzLndpZHRoQ29sbGFwc2VkLFxuICAgICAgcnRsID0gX3RvUmVmcy5ydGw7XG5cbiAgdmFyIHNpZGViYXJSZWYgPSByZWYobnVsbCk7XG4gIHZhciBpc0NvbGxhcHNlZCA9IHJlZihjb2xsYXBzZWQudmFsdWUpO1xuICB2YXIgYWN0aXZlU2hvdyA9IHJlZihudWxsKTtcbiAgdmFyIG1vYmlsZUl0ZW0gPSByZWFjdGl2ZSh7XG4gICAgaXRlbTogbnVsbCxcbiAgICByZWN0OiB7XG4gICAgICB0b3A6IDAsXG4gICAgICBoZWlnaHQ6IDAsXG4gICAgICBwYWRkaW5nOiAnJyxcbiAgICAgIG1heEhlaWdodDogMCxcbiAgICAgIG1heFdpZHRoOiAwXG4gICAgfSxcbiAgICB0aW1lb3V0OiBudWxsXG4gIH0pO1xuICB2YXIgZ2V0TW9iaWxlSXRlbSA9IGNvbXB1dGVkKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbW9iaWxlSXRlbS5pdGVtO1xuICB9KTtcbiAgdmFyIGdldE1vYmlsZUl0ZW1SZWN0ID0gY29tcHV0ZWQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBtb2JpbGVJdGVtLnJlY3Q7XG4gIH0pO1xuICB2YXIgY3VycmVudFJvdXRlID0gcmVmKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggKyB3aW5kb3cubG9jYXRpb24uaGFzaCk7XG5cbiAgdmFyIHVwZGF0ZUlzQ29sbGFwc2VkID0gZnVuY3Rpb24gdXBkYXRlSXNDb2xsYXBzZWQodmFsKSB7XG4gICAgaXNDb2xsYXBzZWQudmFsdWUgPSB2YWw7XG4gIH07XG5cbiAgdmFyIHVwZGF0ZUFjdGl2ZVNob3cgPSBmdW5jdGlvbiB1cGRhdGVBY3RpdmVTaG93KGlkKSB7XG4gICAgYWN0aXZlU2hvdy52YWx1ZSA9IGlkO1xuICB9O1xuXG4gIHZhciBzZXRNb2JpbGVJdGVtID0gZnVuY3Rpb24gc2V0TW9iaWxlSXRlbShfcmVmKSB7XG4gICAgdmFyIGl0ZW0gPSBfcmVmLml0ZW0sXG4gICAgICAgIGl0ZW1FbCA9IF9yZWYuaXRlbUVsO1xuICAgIGNsZWFyTW9iaWxlSXRlbVRpbWVvdXQoKTtcbiAgICB2YXIgbGlua0VsID0gaXRlbUVsLmNoaWxkcmVuWzBdO1xuXG4gICAgdmFyIF9saW5rRWwkZ2V0Qm91bmRpbmdDbCA9IGxpbmtFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgbGlua1RvcCA9IF9saW5rRWwkZ2V0Qm91bmRpbmdDbC50b3AsXG4gICAgICAgIGxpbmtCb3R0b20gPSBfbGlua0VsJGdldEJvdW5kaW5nQ2wuYm90dG9tLFxuICAgICAgICBsaW5rSGVpZ2h0ID0gX2xpbmtFbCRnZXRCb3VuZGluZ0NsLmhlaWdodDtcblxuICAgIHZhciBfc2lkZWJhclJlZiR2YWx1ZSRnZXQgPSBzaWRlYmFyUmVmLnZhbHVlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICBzaWRlYmFyTGVmdCA9IF9zaWRlYmFyUmVmJHZhbHVlJGdldC5sZWZ0LFxuICAgICAgICBzaWRlYmFyUmlnaHQgPSBfc2lkZWJhclJlZiR2YWx1ZSRnZXQucmlnaHQ7XG5cbiAgICB2YXIgb2Zmc2V0UGFyZW50VG9wID0gbGlua0VsLm9mZnNldFBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgdmFyIHBhcmVudEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICB2YXIgcGFyZW50V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICB2YXIgcGFyZW50VG9wID0gMDtcbiAgICB2YXIgcGFyZW50UmlnaHQgPSBwYXJlbnRXaWR0aDtcbiAgICB2YXIgbWF4V2lkdGggPSBwYXJzZUludCh3aWR0aC52YWx1ZSkgLSBwYXJzZUludCh3aWR0aENvbGxhcHNlZC52YWx1ZSk7XG5cbiAgICBpZiAocmVsYXRpdmUudmFsdWUpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBzaWRlYmFyUmVmLnZhbHVlLnBhcmVudEVsZW1lbnQ7XG4gICAgICBwYXJlbnRIZWlnaHQgPSBwYXJlbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgcGFyZW50V2lkdGggPSBwYXJlbnQuY2xpZW50V2lkdGg7XG4gICAgICBwYXJlbnRUb3AgPSBwYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgcGFyZW50UmlnaHQgPSBwYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ7XG4gICAgfVxuXG4gICAgdmFyIHJlY3RXaWR0aCA9IHJ0bC52YWx1ZSA/IHBhcmVudFdpZHRoIC0gKHBhcmVudFJpZ2h0IC0gc2lkZWJhckxlZnQpIDogcGFyZW50UmlnaHQgLSBzaWRlYmFyUmlnaHQ7XG4gICAgdXBkYXRlTW9iaWxlSXRlbShpdGVtKTtcbiAgICB1cGRhdGVNb2JpbGVJdGVtUmVjdCh7XG4gICAgICB0b3A6IGxpbmtUb3AgLSBvZmZzZXRQYXJlbnRUb3AsXG4gICAgICBoZWlnaHQ6IGxpbmtIZWlnaHQsXG4gICAgICBwYWRkaW5nOiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShsaW5rRWwpLnBhZGRpbmdSaWdodCxcbiAgICAgIG1heFdpZHRoOiByZWN0V2lkdGggPD0gbWF4V2lkdGggPyByZWN0V2lkdGggOiBtYXhXaWR0aCxcbiAgICAgIG1heEhlaWdodDogcGFyZW50SGVpZ2h0IC0gKGxpbmtCb3R0b20gLSBwYXJlbnRUb3ApXG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHVuc2V0TW9iaWxlSXRlbSA9IGZ1bmN0aW9uIHVuc2V0TW9iaWxlSXRlbSgpIHtcbiAgICB2YXIgaW1tZWRpYXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICAgIHZhciBkZWxheSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogODAwO1xuICAgIGlmICghZ2V0TW9iaWxlSXRlbS52YWx1ZSkgcmV0dXJuO1xuICAgIGNsZWFyTW9iaWxlSXRlbVRpbWVvdXQoKTtcblxuICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgIHVwZGF0ZU1vYmlsZUl0ZW0obnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbW9iaWxlSXRlbS50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVNb2JpbGVJdGVtKG51bGwpO1xuICAgIH0sIGRlbGF5KTtcbiAgfTtcblxuICB2YXIgY2xlYXJNb2JpbGVJdGVtVGltZW91dCA9IGZ1bmN0aW9uIGNsZWFyTW9iaWxlSXRlbVRpbWVvdXQoKSB7XG4gICAgaWYgKG1vYmlsZUl0ZW0udGltZW91dCkgY2xlYXJUaW1lb3V0KG1vYmlsZUl0ZW0udGltZW91dCk7XG4gIH07XG5cbiAgdmFyIHVwZGF0ZU1vYmlsZUl0ZW0gPSBmdW5jdGlvbiB1cGRhdGVNb2JpbGVJdGVtKGl0ZW0pIHtcbiAgICBtb2JpbGVJdGVtLml0ZW0gPSBpdGVtO1xuICB9O1xuXG4gIHZhciB1cGRhdGVNb2JpbGVJdGVtUmVjdCA9IGZ1bmN0aW9uIHVwZGF0ZU1vYmlsZUl0ZW1SZWN0KF9yZWYyKSB7XG4gICAgdmFyIHRvcCA9IF9yZWYyLnRvcCxcbiAgICAgICAgaGVpZ2h0ID0gX3JlZjIuaGVpZ2h0LFxuICAgICAgICBwYWRkaW5nID0gX3JlZjIucGFkZGluZyxcbiAgICAgICAgbWF4V2lkdGggPSBfcmVmMi5tYXhXaWR0aCxcbiAgICAgICAgbWF4SGVpZ2h0ID0gX3JlZjIubWF4SGVpZ2h0O1xuICAgIG1vYmlsZUl0ZW0ucmVjdC50b3AgPSB0b3A7XG4gICAgbW9iaWxlSXRlbS5yZWN0LmhlaWdodCA9IGhlaWdodDtcbiAgICBtb2JpbGVJdGVtLnJlY3QucGFkZGluZyA9IHBhZGRpbmc7XG4gICAgbW9iaWxlSXRlbS5yZWN0Lm1heFdpZHRoID0gbWF4V2lkdGg7XG4gICAgbW9iaWxlSXRlbS5yZWN0Lm1heEhlaWdodCA9IG1heEhlaWdodDtcbiAgfTtcblxuICB2YXIgdXBkYXRlQ3VycmVudFJvdXRlID0gZnVuY3Rpb24gdXBkYXRlQ3VycmVudFJvdXRlKCkge1xuICAgIHZhciByb3V0ZSA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggKyB3aW5kb3cubG9jYXRpb24uaGFzaDtcbiAgICBjdXJyZW50Um91dGUudmFsdWUgPSByb3V0ZTtcbiAgfTtcblxuICB2YXIgb25JdGVtQ2xpY2sgPSBmdW5jdGlvbiBvbkl0ZW1DbGljayhldmVudCwgaXRlbSkge1xuICAgIGNvbnRleHQuZW1pdCgnaXRlbS1jbGljaycsIGV2ZW50LCBpdGVtKTtcbiAgfTtcblxuICBwcm92aWRlKCd2c21Qcm9wcycsIHByb3BzKTtcbiAgcHJvdmlkZSgnZ2V0U2lkZWJhclJlZicsIHNpZGViYXJSZWYpO1xuICBwcm92aWRlKCdnZXRJc0NvbGxhcHNlZCcsIGlzQ29sbGFwc2VkKTtcbiAgcHJvdmlkZSgnZ2V0QWN0aXZlU2hvdycsIGFjdGl2ZVNob3cpO1xuICBwcm92aWRlKCdnZXRNb2JpbGVJdGVtJywgZ2V0TW9iaWxlSXRlbSk7XG4gIHByb3ZpZGUoJ2dldE1vYmlsZUl0ZW1SZWN0JywgZ2V0TW9iaWxlSXRlbVJlY3QpO1xuICBwcm92aWRlKCdnZXRDdXJyZW50Um91dGUnLCBjdXJyZW50Um91dGUpO1xuICBwcm92aWRlKCd1cGRhdGVJc0NvbGxhcHNlZCcsIHVwZGF0ZUlzQ29sbGFwc2VkKTtcbiAgcHJvdmlkZSgndXBkYXRlQWN0aXZlU2hvdycsIHVwZGF0ZUFjdGl2ZVNob3cpO1xuICBwcm92aWRlKCdzZXRNb2JpbGVJdGVtJywgc2V0TW9iaWxlSXRlbSk7XG4gIHByb3ZpZGUoJ3Vuc2V0TW9iaWxlSXRlbScsIHVuc2V0TW9iaWxlSXRlbSk7XG4gIHByb3ZpZGUoJ2NsZWFyTW9iaWxlSXRlbVRpbWVvdXQnLCBjbGVhck1vYmlsZUl0ZW1UaW1lb3V0KTtcbiAgcHJvdmlkZSgnb25Sb3V0ZUNoYW5nZScsIHVwZGF0ZUN1cnJlbnRSb3V0ZSk7XG4gIHByb3ZpZGUoJ2VtaXRJdGVtQ2xpY2snLCBvbkl0ZW1DbGljayk7XG4gIHJldHVybiB7XG4gICAgZ2V0U2lkZWJhclJlZjogc2lkZWJhclJlZixcbiAgICBnZXRJc0NvbGxhcHNlZDogaXNDb2xsYXBzZWQsXG4gICAgZ2V0QWN0aXZlU2hvdzogYWN0aXZlU2hvdyxcbiAgICBnZXRNb2JpbGVJdGVtOiBnZXRNb2JpbGVJdGVtLFxuICAgIGdldE1vYmlsZUl0ZW1SZWN0OiBnZXRNb2JpbGVJdGVtUmVjdCxcbiAgICBnZXRDdXJyZW50Um91dGU6IGN1cnJlbnRSb3V0ZSxcbiAgICB1cGRhdGVJc0NvbGxhcHNlZDogdXBkYXRlSXNDb2xsYXBzZWQsXG4gICAgdXBkYXRlQWN0aXZlU2hvdzogdXBkYXRlQWN0aXZlU2hvdyxcbiAgICBzZXRNb2JpbGVJdGVtOiBzZXRNb2JpbGVJdGVtLFxuICAgIHVuc2V0TW9iaWxlSXRlbTogdW5zZXRNb2JpbGVJdGVtLFxuICAgIGNsZWFyTW9iaWxlSXRlbVRpbWVvdXQ6IGNsZWFyTW9iaWxlSXRlbVRpbWVvdXQsXG4gICAgdXBkYXRlQ3VycmVudFJvdXRlOiB1cGRhdGVDdXJyZW50Um91dGUsXG4gICAgb25JdGVtQ2xpY2s6IG9uSXRlbUNsaWNrXG4gIH07XG59O1xudmFyIHVzZVNpZGViYXIgPSBmdW5jdGlvbiB1c2VTaWRlYmFyKCkge1xuICByZXR1cm4ge1xuICAgIGdldFNpZGViYXJQcm9wczogaW5qZWN0KCd2c21Qcm9wcycpLFxuICAgIGdldFNpZGViYXJSZWY6IGluamVjdCgnZ2V0U2lkZWJhclJlZicpLFxuICAgIGdldElzQ29sbGFwc2VkOiBpbmplY3QoJ2dldElzQ29sbGFwc2VkJyksXG4gICAgZ2V0QWN0aXZlU2hvdzogaW5qZWN0KCdnZXRBY3RpdmVTaG93JyksXG4gICAgZ2V0TW9iaWxlSXRlbTogaW5qZWN0KCdnZXRNb2JpbGVJdGVtJyksXG4gICAgZ2V0TW9iaWxlSXRlbVJlY3Q6IGluamVjdCgnZ2V0TW9iaWxlSXRlbVJlY3QnKSxcbiAgICBnZXRDdXJyZW50Um91dGU6IGluamVjdCgnZ2V0Q3VycmVudFJvdXRlJyksXG4gICAgdXBkYXRlSXNDb2xsYXBzZWQ6IGluamVjdCgndXBkYXRlSXNDb2xsYXBzZWQnKSxcbiAgICB1cGRhdGVBY3RpdmVTaG93OiBpbmplY3QoJ3VwZGF0ZUFjdGl2ZVNob3cnKSxcbiAgICBzZXRNb2JpbGVJdGVtOiBpbmplY3QoJ3NldE1vYmlsZUl0ZW0nKSxcbiAgICB1bnNldE1vYmlsZUl0ZW06IGluamVjdCgndW5zZXRNb2JpbGVJdGVtJyksXG4gICAgY2xlYXJNb2JpbGVJdGVtVGltZW91dDogaW5qZWN0KCdjbGVhck1vYmlsZUl0ZW1UaW1lb3V0JyksXG4gICAgb25Sb3V0ZUNoYW5nZTogaW5qZWN0KCdvblJvdXRlQ2hhbmdlJyksXG4gICAgZW1pdEl0ZW1DbGljazogaW5qZWN0KCdlbWl0SXRlbUNsaWNrJylcbiAgfTtcbn07XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcblxuICAgIGlmIChlbnVtZXJhYmxlT25seSkge1xuICAgICAgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG4vLyBBZGFwdGVkIGZyb20gdnVlLXJvdXRlci1uZXh0XG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtcm91dGVyLW5leHQvYmxvYi9tYXN0ZXIvc3JjL1JvdXRlckxpbmsudHNcbmZ1bmN0aW9uIGFjdGl2ZVJlY29yZEluZGV4KHJvdXRlLCBjdXJyZW50Um91dGUpIHtcbiAgdmFyIG1hdGNoZWQgPSByb3V0ZS5tYXRjaGVkO1xuICB2YXIgbGVuZ3RoID0gbWF0Y2hlZC5sZW5ndGg7XG4gIHZhciByb3V0ZU1hdGNoZWQgPSBtYXRjaGVkW2xlbmd0aCAtIDFdO1xuICB2YXIgY3VycmVudE1hdGNoZWQgPSBjdXJyZW50Um91dGUubWF0Y2hlZDtcbiAgaWYgKCFyb3V0ZU1hdGNoZWQgfHwgIWN1cnJlbnRNYXRjaGVkLmxlbmd0aCkgcmV0dXJuIC0xO1xuICB2YXIgaW5kZXggPSBjdXJyZW50TWF0Y2hlZC5maW5kSW5kZXgoaXNTYW1lUm91dGVSZWNvcmQuYmluZChudWxsLCByb3V0ZU1hdGNoZWQpKTtcbiAgaWYgKGluZGV4ID4gLTEpIHJldHVybiBpbmRleDtcbiAgdmFyIHBhcmVudFJlY29yZFBhdGggPSBnZXRPcmlnaW5hbFBhdGgobWF0Y2hlZFtsZW5ndGggLSAyXSk7XG4gIHJldHVybiBsZW5ndGggPiAxICYmIGdldE9yaWdpbmFsUGF0aChyb3V0ZU1hdGNoZWQpID09PSBwYXJlbnRSZWNvcmRQYXRoICYmIGN1cnJlbnRNYXRjaGVkW2N1cnJlbnRNYXRjaGVkLmxlbmd0aCAtIDFdLnBhdGggIT09IHBhcmVudFJlY29yZFBhdGggPyBjdXJyZW50TWF0Y2hlZC5maW5kSW5kZXgoaXNTYW1lUm91dGVSZWNvcmQuYmluZChudWxsLCBtYXRjaGVkW2xlbmd0aCAtIDJdKSkgOiBpbmRleDtcbn1cbmZ1bmN0aW9uIGlzU2FtZVJvdXRlTG9jYXRpb25QYXJhbXMoYSwgYikge1xuICBpZiAoT2JqZWN0LmtleXMoYSkubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKHZhciBrZXkgaW4gYSkge1xuICAgIGlmICghaXNTYW1lUm91dGVMb2NhdGlvblBhcmFtc1ZhbHVlKGFba2V5XSwgYltrZXldKSkgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBpbmNsdWRlc1BhcmFtcyhvdXRlciwgaW5uZXIpIHtcbiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3Aoa2V5KSB7XG4gICAgdmFyIGlubmVyVmFsdWUgPSBpbm5lcltrZXldO1xuICAgIHZhciBvdXRlclZhbHVlID0gb3V0ZXJba2V5XTtcblxuICAgIGlmICh0eXBlb2YgaW5uZXJWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChpbm5lclZhbHVlICE9PSBvdXRlclZhbHVlKSByZXR1cm4ge1xuICAgICAgICB2OiBmYWxzZVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG91dGVyVmFsdWUpIHx8IG91dGVyVmFsdWUubGVuZ3RoICE9PSBpbm5lclZhbHVlLmxlbmd0aCB8fCBpbm5lclZhbHVlLnNvbWUoZnVuY3Rpb24gKHZhbHVlLCBpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gb3V0ZXJWYWx1ZVtpXTtcbiAgICAgIH0pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdjogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgZm9yICh2YXIga2V5IGluIGlubmVyKSB7XG4gICAgdmFyIF9yZXQgPSBfbG9vcChrZXkpO1xuXG4gICAgaWYgKF90eXBlb2YoX3JldCkgPT09IFwib2JqZWN0XCIpIHJldHVybiBfcmV0LnY7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0T3JpZ2luYWxQYXRoKHJlY29yZCkge1xuICByZXR1cm4gcmVjb3JkID8gcmVjb3JkLmFsaWFzT2YgPyByZWNvcmQuYWxpYXNPZi5wYXRoIDogcmVjb3JkLnBhdGggOiAnJztcbn1cblxuZnVuY3Rpb24gaXNTYW1lUm91dGVSZWNvcmQoYSwgYikge1xuICByZXR1cm4gKGEuYWxpYXNPZiB8fCBhKSA9PT0gKGIuYWxpYXNPZiB8fCBiKTtcbn1cblxuZnVuY3Rpb24gaXNTYW1lUm91dGVMb2NhdGlvblBhcmFtc1ZhbHVlKGEsIGIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYSkgPyBpc0VxdWl2YWxlbnRBcnJheShhLCBiKSA6IEFycmF5LmlzQXJyYXkoYikgPyBpc0VxdWl2YWxlbnRBcnJheShiLCBhKSA6IGEgPT09IGI7XG59XG5cbmZ1bmN0aW9uIGlzRXF1aXZhbGVudEFycmF5KGEsIGIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYikgPyBhLmxlbmd0aCA9PT0gYi5sZW5ndGggJiYgYS5ldmVyeShmdW5jdGlvbiAodmFsdWUsIGkpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IGJbaV07XG4gIH0pIDogYS5sZW5ndGggPT09IDEgJiYgYVswXSA9PT0gYjtcbn1cblxuZnVuY3Rpb24gdXNlSXRlbShwcm9wcykge1xuICB2YXIgcm91dGVyID0gZ2V0Q3VycmVudEluc3RhbmNlKCkuYXBwQ29udGV4dC5jb25maWcuZ2xvYmFsUHJvcGVydGllcy4kcm91dGVyO1xuXG4gIHZhciBfdXNlU2lkZWJhciA9IHVzZVNpZGViYXIoKSxcbiAgICAgIHNpZGViYXJQcm9wcyA9IF91c2VTaWRlYmFyLmdldFNpZGViYXJQcm9wcyxcbiAgICAgIGlzQ29sbGFwc2VkID0gX3VzZVNpZGViYXIuZ2V0SXNDb2xsYXBzZWQsXG4gICAgICBhY3RpdmVTaG93ID0gX3VzZVNpZGViYXIuZ2V0QWN0aXZlU2hvdyxcbiAgICAgIG1vYmlsZUl0ZW0gPSBfdXNlU2lkZWJhci5nZXRNb2JpbGVJdGVtLFxuICAgICAgbW9iaWxlSXRlbVJlY3QgPSBfdXNlU2lkZWJhci5nZXRNb2JpbGVJdGVtUmVjdCxcbiAgICAgIGN1cnJlbnRSb3V0ZSA9IF91c2VTaWRlYmFyLmdldEN1cnJlbnRSb3V0ZSxcbiAgICAgIHVwZGF0ZUFjdGl2ZVNob3cgPSBfdXNlU2lkZWJhci51cGRhdGVBY3RpdmVTaG93LFxuICAgICAgc2V0TW9iaWxlSXRlbSA9IF91c2VTaWRlYmFyLnNldE1vYmlsZUl0ZW0sXG4gICAgICB1bnNldE1vYmlsZUl0ZW0gPSBfdXNlU2lkZWJhci51bnNldE1vYmlsZUl0ZW0sXG4gICAgICBjbGVhck1vYmlsZUl0ZW1UaW1lb3V0ID0gX3VzZVNpZGViYXIuY2xlYXJNb2JpbGVJdGVtVGltZW91dCxcbiAgICAgIGVtaXRJdGVtQ2xpY2sgPSBfdXNlU2lkZWJhci5lbWl0SXRlbUNsaWNrO1xuXG4gIHZhciBlbWl0U2Nyb2xsVXBkYXRlID0gaW5qZWN0KCdlbWl0U2Nyb2xsVXBkYXRlJyk7XG4gIHZhciBpdGVtU2hvdyA9IHJlZihmYWxzZSk7XG4gIHZhciBpdGVtSG92ZXIgPSByZWYoZmFsc2UpO1xuICB2YXIgYWN0aXZlID0gY29tcHV0ZWQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpc0xpbmtBY3RpdmUocHJvcHMuaXRlbSkgfHwgaXNDaGlsZEFjdGl2ZShwcm9wcy5pdGVtLmNoaWxkKTtcbiAgfSk7XG4gIHZhciBleGFjdEFjdGl2ZSA9IGNvbXB1dGVkKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaXNMaW5rQWN0aXZlKHByb3BzLml0ZW0sIHRydWUpO1xuICB9KTtcblxuICB2YXIgaXNMaW5rQWN0aXZlID0gZnVuY3Rpb24gaXNMaW5rQWN0aXZlKGl0ZW0sIGV4YWN0KSB7XG4gICAgaWYgKCFpdGVtLmhyZWYgfHwgaXRlbS5leHRlcm5hbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHJvdXRlcikge1xuICAgICAgdmFyIHJvdXRlID0gcm91dGVyLnJlc29sdmUoaXRlbS5ocmVmKTtcbiAgICAgIHZhciByb3V0ZXJDdXJyZW50Um91dGUgPSByb3V0ZXIuY3VycmVudFJvdXRlLnZhbHVlO1xuICAgICAgdmFyIGFjdGl2ZUluZGV4ID0gYWN0aXZlUmVjb3JkSW5kZXgocm91dGUsIHJvdXRlckN1cnJlbnRSb3V0ZSk7XG5cbiAgICAgIGlmIChleGFjdCB8fCBpdGVtLmV4YWN0KSB7XG4gICAgICAgIHJldHVybiBhY3RpdmVJbmRleCA+IC0xICYmIGFjdGl2ZUluZGV4ID09PSByb3V0ZXJDdXJyZW50Um91dGUubWF0Y2hlZC5sZW5ndGggLSAxICYmIGlzU2FtZVJvdXRlTG9jYXRpb25QYXJhbXMocm91dGVyQ3VycmVudFJvdXRlLnBhcmFtcywgcm91dGUucGFyYW1zKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjdGl2ZUluZGV4ID4gLTEgJiYgaW5jbHVkZXNQYXJhbXMocm91dGVyQ3VycmVudFJvdXRlLnBhcmFtcywgcm91dGUucGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGl0ZW0uaHJlZiA9PT0gY3VycmVudFJvdXRlLnZhbHVlO1xuICAgIH1cbiAgfTtcblxuICB2YXIgaXNDaGlsZEFjdGl2ZSA9IGZ1bmN0aW9uIGlzQ2hpbGRBY3RpdmUoY2hpbGQpIHtcbiAgICBpZiAoIWNoaWxkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGNoaWxkLnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpc0xpbmtBY3RpdmUoaXRlbSkgfHwgaXNDaGlsZEFjdGl2ZShpdGVtLmNoaWxkKTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgb25MaW5rQ2xpY2sgPSBmdW5jdGlvbiBvbkxpbmtDbGljayhldmVudCkge1xuICAgIGlmICghcHJvcHMuaXRlbS5ocmVmIHx8IHByb3BzLml0ZW0uZGlzYWJsZWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAocHJvcHMuaXRlbS5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIH1cblxuICAgIGVtaXRNb2JpbGVJdGVtKGV2ZW50LCBldmVudC5jdXJyZW50VGFyZ2V0LnBhcmVudEVsZW1lbnQpO1xuXG4gICAgaWYgKGhhc0NoaWxkLnZhbHVlKSB7XG4gICAgICBpZiAoIXByb3BzLml0ZW0uaHJlZiB8fCBhY3RpdmUudmFsdWUpIHtcbiAgICAgICAgc2hvdy52YWx1ZSA9ICFzaG93LnZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVtaXRJdGVtQ2xpY2soZXZlbnQsIHByb3BzLml0ZW0pO1xuICB9O1xuXG4gIHZhciBvbk1vdXNlT3ZlciA9IGZ1bmN0aW9uIG9uTW91c2VPdmVyKGV2ZW50KSB7XG4gICAgaWYgKHByb3BzLml0ZW0uZGlzYWJsZWQpIHJldHVybjtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpdGVtSG92ZXIudmFsdWUgPSB0cnVlO1xuICB9O1xuXG4gIHZhciBvbk1vdXNlT3V0ID0gZnVuY3Rpb24gb25Nb3VzZU91dChldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGl0ZW1Ib3Zlci52YWx1ZSA9IGZhbHNlO1xuICB9O1xuXG4gIHZhciBvbk1vdXNlRW50ZXIgPSBmdW5jdGlvbiBvbk1vdXNlRW50ZXIoZXZlbnQpIHtcbiAgICBpZiAocHJvcHMuaXRlbS5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgaWYgKHNpZGViYXJQcm9wcy5kaXNhYmxlSG92ZXIpIHtcbiAgICAgIGlmIChpc01vYmlsZUl0ZW0udmFsdWUgJiYgaGFzQ2hpbGQudmFsdWUpIHtcbiAgICAgICAgY2xlYXJNb2JpbGVJdGVtVGltZW91dCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjbGVhck1vYmlsZUl0ZW1UaW1lb3V0KCk7XG4gICAgICBlbWl0TW9iaWxlSXRlbShldmVudCwgZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBvbk1vdXNlTGVhdmUgPSBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoKSB7XG4gICAgaWYgKHNpZGViYXJQcm9wcy5kaXNhYmxlSG92ZXIgJiYgIWhhc0NoaWxkLnZhbHVlKSByZXR1cm47XG5cbiAgICBpZiAoaXNNb2JpbGVJdGVtLnZhbHVlKSB7XG4gICAgICB1bnNldE1vYmlsZUl0ZW0oZmFsc2UsICFzaWRlYmFyUHJvcHMuZGlzYWJsZUhvdmVyID8gMzAwIDogdW5kZWZpbmVkKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGVtaXRNb2JpbGVJdGVtID0gZnVuY3Rpb24gZW1pdE1vYmlsZUl0ZW0oZXZlbnQsIGl0ZW1FbCkge1xuICAgIGlmIChpc01vYmlsZUl0ZW0udmFsdWUpIHJldHVybjtcblxuICAgIGlmIChpc0NvbGxhcHNlZC52YWx1ZSkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc0ZpcnN0TGV2ZWwudmFsdWUpIHtcbiAgICAgICAgICBpZiAoIWlzTW9iaWxlSXRlbS52YWx1ZSkge1xuICAgICAgICAgICAgc2V0TW9iaWxlSXRlbSh7XG4gICAgICAgICAgICAgIGl0ZW06IHByb3BzLml0ZW0sXG4gICAgICAgICAgICAgIGl0ZW1FbDogaXRlbUVsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJyAmJiAhaGFzQ2hpbGQudmFsdWUpIHtcbiAgICAgICAgICB1bnNldE1vYmlsZUl0ZW0oZmFsc2UsICFpc0ZpcnN0TGV2ZWwudmFsdWUgPyAzMDAgOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIG9uRXhwYW5kRW50ZXIgPSBmdW5jdGlvbiBvbkV4cGFuZEVudGVyKGVsKSB7XG4gICAgZWwuc3R5bGUuaGVpZ2h0ID0gZWwuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcbiAgfTtcblxuICB2YXIgb25FeHBhbmRBZnRlckVudGVyID0gZnVuY3Rpb24gb25FeHBhbmRBZnRlckVudGVyKGVsKSB7XG4gICAgZWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuXG4gICAgaWYgKCFpc0NvbGxhcHNlZC52YWx1ZSkge1xuICAgICAgZW1pdFNjcm9sbFVwZGF0ZSgpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgb25FeHBhbmRCZWZvcmVMZWF2ZSA9IGZ1bmN0aW9uIG9uRXhwYW5kQmVmb3JlTGVhdmUoZWwpIHtcbiAgICBpZiAoaXNDb2xsYXBzZWQudmFsdWUgJiYgaXNGaXJzdExldmVsLnZhbHVlKSB7XG4gICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVsLnN0eWxlLmhlaWdodCA9IGVsLnNjcm9sbEhlaWdodCArICdweCc7XG4gIH07XG5cbiAgdmFyIG9uRXhwYW5kQWZ0ZXJMZWF2ZSA9IGZ1bmN0aW9uIG9uRXhwYW5kQWZ0ZXJMZWF2ZSgpIHtcbiAgICBpZiAoIWlzQ29sbGFwc2VkLnZhbHVlKSB7XG4gICAgICBlbWl0U2Nyb2xsVXBkYXRlKCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBzaG93ID0gY29tcHV0ZWQoe1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKCFoYXNDaGlsZC52YWx1ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGlzQ29sbGFwc2VkLnZhbHVlICYmIGlzRmlyc3RMZXZlbC52YWx1ZSkgcmV0dXJuIGhvdmVyLnZhbHVlO1xuICAgICAgaWYgKHNpZGViYXJQcm9wcy5zaG93Q2hpbGQpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIHNpZGViYXJQcm9wcy5zaG93T25lQ2hpbGQgJiYgaXNGaXJzdExldmVsLnZhbHVlID8gcHJvcHMuaXRlbS5pZCA9PT0gYWN0aXZlU2hvdy52YWx1ZSA6IGl0ZW1TaG93LnZhbHVlO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoc2hvdykge1xuICAgICAgaWYgKHNpZGViYXJQcm9wcy5zaG93T25lQ2hpbGQgJiYgaXNGaXJzdExldmVsLnZhbHVlKSB7XG4gICAgICAgIHNob3cgPyB1cGRhdGVBY3RpdmVTaG93KHByb3BzLml0ZW0uaWQpIDogdXBkYXRlQWN0aXZlU2hvdyhudWxsKTtcbiAgICAgIH1cblxuICAgICAgaXRlbVNob3cudmFsdWUgPSBzaG93O1xuICAgIH1cbiAgfSk7XG4gIHZhciBob3ZlciA9IGNvbXB1dGVkKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaXNDb2xsYXBzZWQudmFsdWUgJiYgaXNGaXJzdExldmVsLnZhbHVlID8gaXNNb2JpbGVJdGVtLnZhbHVlIDogaXRlbUhvdmVyLnZhbHVlO1xuICB9KTtcbiAgdmFyIGlzRmlyc3RMZXZlbCA9IGNvbXB1dGVkKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcHJvcHMubGV2ZWwgPT09IDE7XG4gIH0pO1xuICB2YXIgaXNIaWRkZW4gPSBjb21wdXRlZChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGlzQ29sbGFwc2VkLnZhbHVlKSB7XG4gICAgICBpZiAocHJvcHMuaXRlbS5oaWRkZW4gJiYgcHJvcHMuaXRlbS5oaWRkZW5PbkNvbGxhcHNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcHJvcHMuaXRlbS5oaWRkZW5PbkNvbGxhcHNlID09PSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJvcHMuaXRlbS5oaWRkZW4gPT09IHRydWU7XG4gICAgfVxuICB9KTtcbiAgdmFyIGhhc0NoaWxkID0gY29tcHV0ZWQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIShwcm9wcy5pdGVtLmNoaWxkICYmIHByb3BzLml0ZW0uY2hpbGQubGVuZ3RoID4gMCk7XG4gIH0pO1xuICB2YXIgbGlua0NsYXNzID0gY29tcHV0ZWQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBbJ3ZzbS0tbGluaycsIFwidnNtLS1saW5rX2xldmVsLVwiLmNvbmNhdChwcm9wcy5sZXZlbCksIHtcbiAgICAgICd2c20tLWxpbmtfbW9iaWxlJzogaXNNb2JpbGVJdGVtLnZhbHVlXG4gICAgfSwge1xuICAgICAgJ3ZzbS0tbGlua19ob3Zlcic6IGhvdmVyLnZhbHVlXG4gICAgfSwge1xuICAgICAgJ3ZzbS0tbGlua19hY3RpdmUnOiBhY3RpdmUudmFsdWVcbiAgICB9LCB7XG4gICAgICAndnNtLS1saW5rX2Rpc2FibGVkJzogcHJvcHMuaXRlbS5kaXNhYmxlZFxuICAgIH0sIHtcbiAgICAgICd2c20tLWxpbmtfb3Blbic6IHNob3cudmFsdWVcbiAgICB9LCBwcm9wcy5pdGVtLmNsYXNzXTtcbiAgfSk7XG4gIHZhciBsaW5rQXR0cnMgPSBjb21wdXRlZChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhyZWYgPSBwcm9wcy5pdGVtLmhyZWYgPyBwcm9wcy5pdGVtLmhyZWYgOiAnIyc7XG4gICAgdmFyIHRhcmdldCA9IHByb3BzLml0ZW0uZXh0ZXJuYWwgPyAnX2JsYW5rJyA6ICdfc2VsZic7XG4gICAgdmFyIHRhYmluZGV4ID0gcHJvcHMuaXRlbS5kaXNhYmxlZCA/IC0xIDogbnVsbDtcbiAgICB2YXIgYXJpYUN1cnJlbnQgPSBleGFjdEFjdGl2ZS52YWx1ZSA/ICdwYWdlJyA6IG51bGw7XG4gICAgdmFyIGFyaWFIYXNwb3B1cCA9IGhhc0NoaWxkLnZhbHVlID8gdHJ1ZSA6IG51bGw7XG4gICAgdmFyIGFyaWFFeHBhbmRlZCA9IGhhc0NoaWxkLnZhbHVlID8gc2hvdy52YWx1ZSA6IG51bGw7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQyKHtcbiAgICAgIGhyZWY6IGhyZWYsXG4gICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgIHRhYmluZGV4OiB0YWJpbmRleCxcbiAgICAgICdhcmlhLWN1cnJlbnQnOiBhcmlhQ3VycmVudCxcbiAgICAgICdhcmlhLWhhc3BvcHVwJzogYXJpYUhhc3BvcHVwLFxuICAgICAgJ2FyaWEtZXhwYW5kZWQnOiBhcmlhRXhwYW5kZWRcbiAgICB9LCBwcm9wcy5pdGVtLmF0dHJpYnV0ZXMpO1xuICB9KTtcbiAgdmFyIGl0ZW1DbGFzcyA9IGNvbXB1dGVkKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gWyd2c20tLWl0ZW0nLCB7XG4gICAgICAndnNtLS1pdGVtX21vYmlsZSc6IGlzTW9iaWxlSXRlbS52YWx1ZVxuICAgIH1dO1xuICB9KTtcbiAgdmFyIGlzTW9iaWxlSXRlbSA9IGNvbXB1dGVkKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX21vYmlsZUl0ZW0kdmFsdWU7XG5cbiAgICByZXR1cm4gcHJvcHMuaXRlbS5pZCA9PT0gKChfbW9iaWxlSXRlbSR2YWx1ZSA9IG1vYmlsZUl0ZW0udmFsdWUpID09PSBudWxsIHx8IF9tb2JpbGVJdGVtJHZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbW9iaWxlSXRlbSR2YWx1ZS5pZCk7XG4gIH0pO1xuICB2YXIgbW9iaWxlSXRlbURyb3Bkb3duU3R5bGUgPSBjb21wdXRlZChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFt7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sIHtcbiAgICAgIHRvcDogXCJcIi5jb25jYXQobW9iaWxlSXRlbVJlY3QudmFsdWUudG9wICsgbW9iaWxlSXRlbVJlY3QudmFsdWUuaGVpZ2h0LCBcInB4XCIpXG4gICAgfSwgIXNpZGViYXJQcm9wcy5ydGwgPyB7XG4gICAgICBsZWZ0OiBzaWRlYmFyUHJvcHMud2lkdGhDb2xsYXBzZWRcbiAgICB9IDoge1xuICAgICAgcmlnaHQ6IHNpZGViYXJQcm9wcy53aWR0aENvbGxhcHNlZFxuICAgIH0sIHtcbiAgICAgIHdpZHRoOiBcIlwiLmNvbmNhdChtb2JpbGVJdGVtUmVjdC52YWx1ZS5tYXhXaWR0aCwgXCJweFwiKVxuICAgIH0sIHtcbiAgICAgICdtYXgtaGVpZ2h0JzogXCJcIi5jb25jYXQobW9iaWxlSXRlbVJlY3QudmFsdWUubWF4SGVpZ2h0LCBcInB4XCIpXG4gICAgfSwge1xuICAgICAgJ292ZXJmbG93LXknOiAnYXV0bydcbiAgICB9XTtcbiAgfSk7XG4gIHZhciBtb2JpbGVJdGVtU3R5bGUgPSBjb21wdXRlZChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFt7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sIHtcbiAgICAgIHRvcDogXCJcIi5jb25jYXQobW9iaWxlSXRlbVJlY3QudmFsdWUudG9wLCBcInB4XCIpXG4gICAgfSwgIXNpZGViYXJQcm9wcy5ydGwgPyB7XG4gICAgICBsZWZ0OiBzaWRlYmFyUHJvcHMud2lkdGhDb2xsYXBzZWRcbiAgICB9IDoge1xuICAgICAgcmlnaHQ6IHNpZGViYXJQcm9wcy53aWR0aENvbGxhcHNlZFxuICAgIH0sIHtcbiAgICAgIHdpZHRoOiBcIlwiLmNvbmNhdChtb2JpbGVJdGVtUmVjdC52YWx1ZS5tYXhXaWR0aCwgXCJweFwiKVxuICAgIH0sIHtcbiAgICAgIGhlaWdodDogXCJcIi5jb25jYXQobW9iaWxlSXRlbVJlY3QudmFsdWUuaGVpZ2h0LCBcInB4XCIpXG4gICAgfSwge1xuICAgICAgJ3BhZGRpbmctcmlnaHQnOiBcIlwiLmNvbmNhdChtb2JpbGVJdGVtUmVjdC52YWx1ZS5wYWRkaW5nKVxuICAgIH0sIHtcbiAgICAgICdwYWRkaW5nLWxlZnQnOiBcIlwiLmNvbmNhdChtb2JpbGVJdGVtUmVjdC52YWx1ZS5wYWRkaW5nKVxuICAgIH0sIHtcbiAgICAgICd6LWluZGV4JzogJzIwJ1xuICAgIH1dO1xuICB9KTtcbiAgdmFyIG1vYmlsZUl0ZW1CYWNrZ3JvdW5kU3R5bGUgPSBjb21wdXRlZChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFt7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sIHtcbiAgICAgIHRvcDogXCJcIi5jb25jYXQobW9iaWxlSXRlbVJlY3QudmFsdWUudG9wLCBcInB4XCIpXG4gICAgfSwgIXNpZGViYXJQcm9wcy5ydGwgPyB7XG4gICAgICBsZWZ0OiAnMHB4J1xuICAgIH0gOiB7XG4gICAgICByaWdodDogJzBweCdcbiAgICB9LCB7XG4gICAgICB3aWR0aDogXCJcIi5jb25jYXQobW9iaWxlSXRlbVJlY3QudmFsdWUubWF4V2lkdGggKyBwYXJzZUludChzaWRlYmFyUHJvcHMud2lkdGhDb2xsYXBzZWQpLCBcInB4XCIpXG4gICAgfSwge1xuICAgICAgaGVpZ2h0OiBcIlwiLmNvbmNhdChtb2JpbGVJdGVtUmVjdC52YWx1ZS5oZWlnaHQsIFwicHhcIilcbiAgICB9LCB7XG4gICAgICAnei1pbmRleCc6ICcxMCdcbiAgICB9XTtcbiAgfSk7XG4gIHdhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYWN0aXZlLnZhbHVlO1xuICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGFjdGl2ZS52YWx1ZSkge1xuICAgICAgc2hvdy52YWx1ZSA9IHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAgaW1tZWRpYXRlOiB0cnVlXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgIGV4YWN0QWN0aXZlOiBleGFjdEFjdGl2ZSxcbiAgICBzaG93OiBzaG93LFxuICAgIGhvdmVyOiBob3ZlcixcbiAgICBpc0ZpcnN0TGV2ZWw6IGlzRmlyc3RMZXZlbCxcbiAgICBpc0hpZGRlbjogaXNIaWRkZW4sXG4gICAgaGFzQ2hpbGQ6IGhhc0NoaWxkLFxuICAgIGxpbmtDbGFzczogbGlua0NsYXNzLFxuICAgIGxpbmtBdHRyczogbGlua0F0dHJzLFxuICAgIGl0ZW1DbGFzczogaXRlbUNsYXNzLFxuICAgIGlzTW9iaWxlSXRlbTogaXNNb2JpbGVJdGVtLFxuICAgIG1vYmlsZUl0ZW1Ecm9wZG93blN0eWxlOiBtb2JpbGVJdGVtRHJvcGRvd25TdHlsZSxcbiAgICBtb2JpbGVJdGVtU3R5bGU6IG1vYmlsZUl0ZW1TdHlsZSxcbiAgICBtb2JpbGVJdGVtQmFja2dyb3VuZFN0eWxlOiBtb2JpbGVJdGVtQmFja2dyb3VuZFN0eWxlLFxuICAgIG9uTGlua0NsaWNrOiBvbkxpbmtDbGljayxcbiAgICBvbk1vdXNlT3Zlcjogb25Nb3VzZU92ZXIsXG4gICAgb25Nb3VzZU91dDogb25Nb3VzZU91dCxcbiAgICBvbk1vdXNlRW50ZXI6IG9uTW91c2VFbnRlcixcbiAgICBvbk1vdXNlTGVhdmU6IG9uTW91c2VMZWF2ZSxcbiAgICBvbkV4cGFuZEVudGVyOiBvbkV4cGFuZEVudGVyLFxuICAgIG9uRXhwYW5kQWZ0ZXJFbnRlcjogb25FeHBhbmRBZnRlckVudGVyLFxuICAgIG9uRXhwYW5kQmVmb3JlTGVhdmU6IG9uRXhwYW5kQmVmb3JlTGVhdmUsXG4gICAgb25FeHBhbmRBZnRlckxlYXZlOiBvbkV4cGFuZEFmdGVyTGVhdmVcbiAgfTtcbn1cblxudmFyIHNjcmlwdCQ1ID0ge1xyXG4gIG5hbWU6ICdTaWRlYmFyTWVudUxpbmsnLFxyXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXHJcbiAgcHJvcHM6IHtcclxuICAgIGl0ZW06IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgZGF0YSAoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByb3V0ZXI6IGZhbHNlXHJcbiAgICB9XHJcbiAgfSxcclxuICBjb21wdXRlZDoge1xyXG4gICAgaXNIeXBlckxpbmsgKCkge1xyXG4gICAgICByZXR1cm4gISEoIXRoaXMuaXRlbS5ocmVmIHx8IHRoaXMuaXRlbS5leHRlcm5hbCB8fCAhdGhpcy5yb3V0ZXIpXHJcbiAgICB9XHJcbiAgfSxcclxuICBtb3VudGVkICgpIHtcclxuICAgIHRoaXMucm91dGVyID0gISF0aGlzLiRyb3V0ZXI7XHJcbiAgfVxyXG59O1xuXG5jb25zdCBfaG9pc3RlZF8xJDMgPSBbXCJocmVmXCIsIFwib25DbGlja1wiXTtcblxuZnVuY3Rpb24gcmVuZGVyJDUoX2N0eCwgX2NhY2hlLCAkcHJvcHMsICRzZXR1cCwgJGRhdGEsICRvcHRpb25zKSB7XG4gIGNvbnN0IF9jb21wb25lbnRfcm91dGVyX2xpbmsgPSByZXNvbHZlQ29tcG9uZW50KFwicm91dGVyLWxpbmtcIik7XG5cbiAgcmV0dXJuICgkb3B0aW9ucy5pc0h5cGVyTGluaylcbiAgICA/IChvcGVuQmxvY2soKSwgY3JlYXRlRWxlbWVudEJsb2NrKFwiYVwiLCBub3JtYWxpemVQcm9wcyhtZXJnZVByb3BzKHsga2V5OiAwIH0sIF9jdHguJGF0dHJzKSksIFtcbiAgICAgICAgcmVuZGVyU2xvdChfY3R4LiRzbG90cywgXCJkZWZhdWx0XCIpXG4gICAgICBdLCAxNiAvKiBGVUxMX1BST1BTICovKSlcbiAgICA6IChvcGVuQmxvY2soKSwgY3JlYXRlQmxvY2soX2NvbXBvbmVudF9yb3V0ZXJfbGluaywge1xuICAgICAgICBrZXk6IDEsXG4gICAgICAgIGN1c3RvbTogXCJcIixcbiAgICAgICAgdG86IF9jdHguJGF0dHJzLmhyZWZcbiAgICAgIH0sIHtcbiAgICAgICAgZGVmYXVsdDogd2l0aEN0eCgoeyBocmVmLCBuYXZpZ2F0ZSB9KSA9PiBbXG4gICAgICAgICAgY3JlYXRlRWxlbWVudFZOb2RlKFwiYVwiLCBtZXJnZVByb3BzKF9jdHguJGF0dHJzLCB7XG4gICAgICAgICAgICBocmVmOiBocmVmLFxuICAgICAgICAgICAgb25DbGljazogbmF2aWdhdGVcbiAgICAgICAgICB9KSwgW1xuICAgICAgICAgICAgcmVuZGVyU2xvdChfY3R4LiRzbG90cywgXCJkZWZhdWx0XCIpXG4gICAgICAgICAgXSwgMTYgLyogRlVMTF9QUk9QUyAqLywgX2hvaXN0ZWRfMSQzKVxuICAgICAgICBdKSxcbiAgICAgICAgXzogMyAvKiBGT1JXQVJERUQgKi9cbiAgICAgIH0sIDggLyogUFJPUFMgKi8sIFtcInRvXCJdKSlcbn1cblxuc2NyaXB0JDUucmVuZGVyID0gcmVuZGVyJDU7XG5zY3JpcHQkNS5fX2ZpbGUgPSBcInNyYy9jb21wb25lbnRzL1NpZGViYXJNZW51TGluay52dWVcIjtcblxudmFyIHNjcmlwdCQ0ID0ge1xyXG4gIG5hbWU6ICdTaWRlYmFyTWVudUljb24nLFxyXG4gIHByb3BzOiB7XHJcbiAgICBpY29uOiB7XHJcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sXHJcbiAgICAgIGRlZmF1bHQ6ICcnXHJcbiAgICB9XHJcbiAgfVxyXG59O1xuXG5mdW5jdGlvbiByZW5kZXIkNChfY3R4LCBfY2FjaGUsICRwcm9wcywgJHNldHVwLCAkZGF0YSwgJG9wdGlvbnMpIHtcbiAgcmV0dXJuIChvcGVuQmxvY2soKSwgY3JlYXRlQmxvY2socmVzb2x2ZUR5bmFtaWNDb21wb25lbnQoJHByb3BzLmljb24uZWxlbWVudCA/ICRwcm9wcy5pY29uLmVsZW1lbnQgOiAnaScpLCBtZXJnZVByb3BzKHtcbiAgICBjbGFzczogW1widnNtLS1pY29uXCIsIHR5cGVvZiAkcHJvcHMuaWNvbiA9PT0gJ3N0cmluZycgfHwgKCRwcm9wcy5pY29uIGluc3RhbmNlb2YgU3RyaW5nKSA/ICRwcm9wcy5pY29uIDogJHByb3BzLmljb24uY2xhc3NdLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcbiAgfSwgJHByb3BzLmljb24uYXR0cmlidXRlcyksIHtcbiAgICBkZWZhdWx0OiB3aXRoQ3R4KCgpID0+IFtcbiAgICAgIGNyZWF0ZVRleHRWTm9kZSh0b0Rpc3BsYXlTdHJpbmcoJHByb3BzLmljb24udGV4dCksIDEgLyogVEVYVCAqLylcbiAgICBdKSxcbiAgICBfOiAxIC8qIFNUQUJMRSAqL1xuICB9LCAxNiAvKiBGVUxMX1BST1BTICovLCBbXCJjbGFzc1wiXSkpXG59XG5cbnNjcmlwdCQ0LnJlbmRlciA9IHJlbmRlciQ0O1xuc2NyaXB0JDQuX19maWxlID0gXCJzcmMvY29tcG9uZW50cy9TaWRlYmFyTWVudUljb24udnVlXCI7XG5cbnZhciBzY3JpcHQkMyA9IHtcclxuICBuYW1lOiAnU2lkZWJhck1lbnVCYWRnZScsXHJcbiAgcHJvcHM6IHtcclxuICAgIGJhZGdlOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgZGVmYXVsdDogKCkgPT4ge31cclxuICAgIH1cclxuICB9XHJcbn07XG5cbmZ1bmN0aW9uIHJlbmRlciQzKF9jdHgsIF9jYWNoZSwgJHByb3BzLCAkc2V0dXAsICRkYXRhLCAkb3B0aW9ucykge1xuICByZXR1cm4gKG9wZW5CbG9jaygpLCBjcmVhdGVCbG9jayhyZXNvbHZlRHluYW1pY0NvbXBvbmVudCgkcHJvcHMuYmFkZ2UuZWxlbWVudCA/ICRwcm9wcy5iYWRnZS5lbGVtZW50IDogJ3NwYW4nKSwgbWVyZ2VQcm9wcyh7XG4gICAgY2xhc3M6IFtcInZzbS0tYmFkZ2VcIiwgJHByb3BzLmJhZGdlLmNsYXNzXVxuICB9LCAkcHJvcHMuYmFkZ2UuYXR0cmlidXRlcyksIHtcbiAgICBkZWZhdWx0OiB3aXRoQ3R4KCgpID0+IFtcbiAgICAgIGNyZWF0ZVRleHRWTm9kZSh0b0Rpc3BsYXlTdHJpbmcoJHByb3BzLmJhZGdlLnRleHQpLCAxIC8qIFRFWFQgKi8pXG4gICAgXSksXG4gICAgXzogMSAvKiBTVEFCTEUgKi9cbiAgfSwgMTYgLyogRlVMTF9QUk9QUyAqLywgW1wiY2xhc3NcIl0pKVxufVxuXG5zY3JpcHQkMy5yZW5kZXIgPSByZW5kZXIkMztcbnNjcmlwdCQzLl9fZmlsZSA9IFwic3JjL2NvbXBvbmVudHMvU2lkZWJhck1lbnVCYWRnZS52dWVcIjtcblxudmFyIHNjcmlwdCQyID0ge1xyXG4gIG5hbWU6ICdTaWRlYmFyTWVudUl0ZW0nLFxyXG4gIGNvbXBvbmVudHM6IHtcclxuICAgIFNpZGViYXJNZW51TGluazogc2NyaXB0JDUsXHJcbiAgICBTaWRlYmFyTWVudUljb246IHNjcmlwdCQ0LFxyXG4gICAgU2lkZWJhck1lbnVCYWRnZTogc2NyaXB0JDNcclxuICB9LFxyXG4gIHByb3BzOiB7XHJcbiAgICBpdGVtOiB7XHJcbiAgICAgIHR5cGU6IE9iamVjdCxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICBsZXZlbDoge1xyXG4gICAgICB0eXBlOiBOdW1iZXIsXHJcbiAgICAgIGRlZmF1bHQ6IDFcclxuICAgIH1cclxuICB9LFxyXG4gIHNldHVwIChwcm9wcykge1xyXG4gICAgY29uc3Qge1xyXG4gICAgICBnZXRTaWRlYmFyUHJvcHMsXHJcbiAgICAgIGdldElzQ29sbGFwc2VkOiBpc0NvbGxhcHNlZFxyXG4gICAgfSA9IHVzZVNpZGViYXIoKTtcclxuICAgIGNvbnN0IHsgbGlua0NvbXBvbmVudE5hbWUgfSA9IHRvUmVmcyhnZXRTaWRlYmFyUHJvcHMpO1xyXG5cclxuICAgIGNvbnN0IHtcclxuICAgICAgYWN0aXZlLFxyXG4gICAgICBleGFjdEFjdGl2ZSxcclxuICAgICAgc2hvdyxcclxuICAgICAgaG92ZXIsXHJcbiAgICAgIGlzRmlyc3RMZXZlbCxcclxuICAgICAgaXNIaWRkZW4sXHJcbiAgICAgIGhhc0NoaWxkLFxyXG4gICAgICBsaW5rQ2xhc3MsXHJcbiAgICAgIGxpbmtBdHRycyxcclxuICAgICAgaXRlbUNsYXNzLFxyXG4gICAgICBpc01vYmlsZUl0ZW0sXHJcbiAgICAgIG1vYmlsZUl0ZW1TdHlsZSxcclxuICAgICAgbW9iaWxlSXRlbURyb3Bkb3duU3R5bGUsXHJcbiAgICAgIG1vYmlsZUl0ZW1CYWNrZ3JvdW5kU3R5bGUsXHJcbiAgICAgIG9uTGlua0NsaWNrLFxyXG4gICAgICBvbk1vdXNlT3ZlcixcclxuICAgICAgb25Nb3VzZU91dCxcclxuICAgICAgb25Nb3VzZUVudGVyLFxyXG4gICAgICBvbk1vdXNlTGVhdmUsXHJcbiAgICAgIG9uRXhwYW5kRW50ZXIsXHJcbiAgICAgIG9uRXhwYW5kQWZ0ZXJFbnRlcixcclxuICAgICAgb25FeHBhbmRCZWZvcmVMZWF2ZSxcclxuICAgICAgb25FeHBhbmRBZnRlckxlYXZlXHJcbiAgICB9ID0gdXNlSXRlbShwcm9wcyk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaXNDb2xsYXBzZWQsXHJcbiAgICAgIGxpbmtDb21wb25lbnROYW1lLFxyXG4gICAgICBhY3RpdmUsXHJcbiAgICAgIGV4YWN0QWN0aXZlLFxyXG4gICAgICBpc01vYmlsZUl0ZW0sXHJcbiAgICAgIG1vYmlsZUl0ZW1TdHlsZSxcclxuICAgICAgbW9iaWxlSXRlbURyb3Bkb3duU3R5bGUsXHJcbiAgICAgIG1vYmlsZUl0ZW1CYWNrZ3JvdW5kU3R5bGUsXHJcbiAgICAgIHNob3csXHJcbiAgICAgIGhvdmVyLFxyXG4gICAgICBpc0ZpcnN0TGV2ZWwsXHJcbiAgICAgIGlzSGlkZGVuLFxyXG4gICAgICBoYXNDaGlsZCxcclxuICAgICAgbGlua0NsYXNzLFxyXG4gICAgICBsaW5rQXR0cnMsXHJcbiAgICAgIGl0ZW1DbGFzcyxcclxuICAgICAgb25MaW5rQ2xpY2ssXHJcbiAgICAgIG9uTW91c2VPdmVyLFxyXG4gICAgICBvbk1vdXNlT3V0LFxyXG4gICAgICBvbk1vdXNlRW50ZXIsXHJcbiAgICAgIG9uTW91c2VMZWF2ZSxcclxuICAgICAgb25FeHBhbmRFbnRlcixcclxuICAgICAgb25FeHBhbmRBZnRlckVudGVyLFxyXG4gICAgICBvbkV4cGFuZEJlZm9yZUxlYXZlLFxyXG4gICAgICBvbkV4cGFuZEFmdGVyTGVhdmVcclxuICAgIH1cclxuICB9XHJcbn07XG5cbmNvbnN0IF9ob2lzdGVkXzEkMiA9IHsga2V5OiAwIH07XG5jb25zdCBfaG9pc3RlZF8yJDIgPSB7IGNsYXNzOiBcInZzbS0tZHJvcGRvd25cIiB9O1xuXG5mdW5jdGlvbiByZW5kZXIkMihfY3R4LCBfY2FjaGUsICRwcm9wcywgJHNldHVwLCAkZGF0YSwgJG9wdGlvbnMpIHtcbiAgY29uc3QgX2NvbXBvbmVudF9zaWRlYmFyX21lbnVfaWNvbiA9IHJlc29sdmVDb21wb25lbnQoXCJzaWRlYmFyLW1lbnUtaWNvblwiKTtcbiAgY29uc3QgX2NvbXBvbmVudF9zaWRlYmFyX21lbnVfYmFkZ2UgPSByZXNvbHZlQ29tcG9uZW50KFwic2lkZWJhci1tZW51LWJhZGdlXCIpO1xuICBjb25zdCBfY29tcG9uZW50X3NpZGViYXJfbWVudV9pdGVtID0gcmVzb2x2ZUNvbXBvbmVudChcInNpZGViYXItbWVudS1pdGVtXCIsIHRydWUpO1xuXG4gIHJldHVybiAoJHByb3BzLml0ZW0uY29tcG9uZW50ICYmICEkc2V0dXAuaXNIaWRkZW4pXG4gICAgPyAob3BlbkJsb2NrKCksIGNyZWF0ZUVsZW1lbnRCbG9jayhcImxpXCIsIF9ob2lzdGVkXzEkMiwgW1xuICAgICAgICAob3BlbkJsb2NrKCksIGNyZWF0ZUJsb2NrKHJlc29sdmVEeW5hbWljQ29tcG9uZW50KCRwcm9wcy5pdGVtLmNvbXBvbmVudCksIG5vcm1hbGl6ZVByb3BzKGd1YXJkUmVhY3RpdmVQcm9wcygkcHJvcHMuaXRlbS5wcm9wcykpLCBudWxsLCAxNiAvKiBGVUxMX1BST1BTICovKSlcbiAgICAgIF0pKVxuICAgIDogKCRwcm9wcy5pdGVtLmhlYWRlciAmJiAhJHNldHVwLmlzSGlkZGVuKVxuICAgICAgPyAob3BlbkJsb2NrKCksIGNyZWF0ZUVsZW1lbnRCbG9jayhcImxpXCIsIG1lcmdlUHJvcHMoe1xuICAgICAgICAgIGtleTogMSxcbiAgICAgICAgICBjbGFzczogW1widnNtLS1oZWFkZXJcIiwgJHByb3BzLml0ZW0uY2xhc3NdXG4gICAgICAgIH0sICRwcm9wcy5pdGVtLmF0dHJpYnV0ZXMpLCB0b0Rpc3BsYXlTdHJpbmcoJHByb3BzLml0ZW0uaGVhZGVyKSwgMTcgLyogVEVYVCwgRlVMTF9QUk9QUyAqLykpXG4gICAgICA6ICghJHNldHVwLmlzSGlkZGVuKVxuICAgICAgICA/IChvcGVuQmxvY2soKSwgY3JlYXRlRWxlbWVudEJsb2NrKFwibGlcIiwgbWVyZ2VQcm9wcyh7XG4gICAgICAgICAgICBrZXk6IDIsXG4gICAgICAgICAgICBjbGFzczogJHNldHVwLml0ZW1DbGFzcyxcbiAgICAgICAgICAgIG9uTW91c2VvdmVyOiBfY2FjaGVbMF0gfHwgKF9jYWNoZVswXSA9ICguLi5hcmdzKSA9PiAoJHNldHVwLm9uTW91c2VPdmVyICYmICRzZXR1cC5vbk1vdXNlT3ZlciguLi5hcmdzKSkpLFxuICAgICAgICAgICAgb25Nb3VzZW91dDogX2NhY2hlWzFdIHx8IChfY2FjaGVbMV0gPSAoLi4uYXJncykgPT4gKCRzZXR1cC5vbk1vdXNlT3V0ICYmICRzZXR1cC5vbk1vdXNlT3V0KC4uLmFyZ3MpKSlcbiAgICAgICAgICB9LCB0b0hhbmRsZXJzKCgkc2V0dXAuaXNDb2xsYXBzZWQgJiYgJHNldHVwLmlzRmlyc3RMZXZlbCkgPyB7IG1vdXNlZW50ZXI6ICRzZXR1cC5vbk1vdXNlRW50ZXIsIG1vdXNlbGVhdmU6ICRzZXR1cC5vbk1vdXNlTGVhdmV9IDoge30sIHRydWUpKSwgW1xuICAgICAgICAgICAgKG9wZW5CbG9jaygpLCBjcmVhdGVCbG9jayhyZXNvbHZlRHluYW1pY0NvbXBvbmVudCgkc2V0dXAubGlua0NvbXBvbmVudE5hbWUgPyAkc2V0dXAubGlua0NvbXBvbmVudE5hbWUgOiAnU2lkZWJhck1lbnVMaW5rJyksIG1lcmdlUHJvcHMoe1xuICAgICAgICAgICAgICBpdGVtOiAkcHJvcHMuaXRlbSxcbiAgICAgICAgICAgICAgY2xhc3M6ICRzZXR1cC5saW5rQ2xhc3NcbiAgICAgICAgICAgIH0sICRzZXR1cC5saW5rQXR0cnMsIHsgb25DbGljazogJHNldHVwLm9uTGlua0NsaWNrIH0pLCB7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6IHdpdGhDdHgoKCkgPT4gW1xuICAgICAgICAgICAgICAgICgkc2V0dXAuaXNDb2xsYXBzZWQgJiYgJHNldHVwLmlzRmlyc3RMZXZlbClcbiAgICAgICAgICAgICAgICAgID8gKG9wZW5CbG9jaygpLCBjcmVhdGVCbG9jayhUcmFuc2l0aW9uLCB7XG4gICAgICAgICAgICAgICAgICAgICAga2V5OiAwLFxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2xpZGUtYW5pbWF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHdpdGhDdHgoKCkgPT4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgKCRzZXR1cC5ob3ZlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAob3BlbkJsb2NrKCksIGNyZWF0ZUVsZW1lbnRCbG9jayhcImRpdlwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogXCJ2c20tLW1vYmlsZS1iZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG5vcm1hbGl6ZVN0eWxlKCRzZXR1cC5tb2JpbGVJdGVtQmFja2dyb3VuZFN0eWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwsIDQgLyogU1RZTEUgKi8pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNyZWF0ZUNvbW1lbnRWTm9kZShcInYtaWZcIiwgdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgICAgICBfOiAxIC8qIFNUQUJMRSAqL1xuICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgIDogY3JlYXRlQ29tbWVudFZOb2RlKFwidi1pZlwiLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAoJHByb3BzLml0ZW0uaWNvbilcbiAgICAgICAgICAgICAgICAgID8gKG9wZW5CbG9jaygpLCBjcmVhdGVCbG9jayhfY29tcG9uZW50X3NpZGViYXJfbWVudV9pY29uLCB7XG4gICAgICAgICAgICAgICAgICAgICAga2V5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgIGljb246ICRwcm9wcy5pdGVtLmljb25cbiAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCwgOCAvKiBQUk9QUyAqLywgW1wiaWNvblwiXSkpXG4gICAgICAgICAgICAgICAgICA6IGNyZWF0ZUNvbW1lbnRWTm9kZShcInYtaWZcIiwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgY3JlYXRlRWxlbWVudFZOb2RlKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICAgIGNsYXNzOiBub3JtYWxpemVDbGFzcyhbXCJ2c20tLXRpdGxlXCIsICgkc2V0dXAuaXNDb2xsYXBzZWQgJiYgJHNldHVwLmlzRmlyc3RMZXZlbCkgJiYgISRzZXR1cC5pc01vYmlsZUl0ZW0gJiYgJ3ZzbS0tdGl0bGVfaGlkZGVuJ10pLFxuICAgICAgICAgICAgICAgICAgc3R5bGU6IG5vcm1hbGl6ZVN0eWxlKCRzZXR1cC5pc01vYmlsZUl0ZW0gJiYgJHNldHVwLm1vYmlsZUl0ZW1TdHlsZSlcbiAgICAgICAgICAgICAgICB9LCBbXG4gICAgICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50Vk5vZGUoXCJzcGFuXCIsIG51bGwsIHRvRGlzcGxheVN0cmluZygkcHJvcHMuaXRlbS50aXRsZSksIDEgLyogVEVYVCAqLyksXG4gICAgICAgICAgICAgICAgICAoJHByb3BzLml0ZW0uYmFkZ2UpXG4gICAgICAgICAgICAgICAgICAgID8gKG9wZW5CbG9jaygpLCBjcmVhdGVCbG9jayhfY29tcG9uZW50X3NpZGViYXJfbWVudV9iYWRnZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFkZ2U6ICRwcm9wcy5pdGVtLmJhZGdlXG4gICAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCwgOCAvKiBQUk9QUyAqLywgW1wiYmFkZ2VcIl0pKVxuICAgICAgICAgICAgICAgICAgICA6IGNyZWF0ZUNvbW1lbnRWTm9kZShcInYtaWZcIiwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAoJHNldHVwLmhhc0NoaWxkKVxuICAgICAgICAgICAgICAgICAgICA/IChvcGVuQmxvY2soKSwgY3JlYXRlRWxlbWVudEJsb2NrKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBub3JtYWxpemVDbGFzcyhbXCJ2c20tLWFycm93XCIsIHsndnNtLS1hcnJvd19vcGVuJyA6ICRzZXR1cC5zaG93fV0pXG4gICAgICAgICAgICAgICAgICAgICAgfSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyU2xvdChfY3R4LiRzbG90cywgXCJkcm9wZG93bi1pY29uXCIsIG5vcm1hbGl6ZVByb3BzKGd1YXJkUmVhY3RpdmVQcm9wcyh7IGlzT3BlbjogJHNldHVwLnNob3cgfSkpKVxuICAgICAgICAgICAgICAgICAgICAgIF0sIDIgLyogQ0xBU1MgKi8pKVxuICAgICAgICAgICAgICAgICAgICA6IGNyZWF0ZUNvbW1lbnRWTm9kZShcInYtaWZcIiwgdHJ1ZSlcbiAgICAgICAgICAgICAgICBdLCA2IC8qIENMQVNTLCBTVFlMRSAqLylcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgIF86IDMgLyogRk9SV0FSREVEICovXG4gICAgICAgICAgICB9LCAxNiAvKiBGVUxMX1BST1BTICovLCBbXCJpdGVtXCIsIFwiY2xhc3NcIiwgXCJvbkNsaWNrXCJdKSksXG4gICAgICAgICAgICAoJHNldHVwLmhhc0NoaWxkKVxuICAgICAgICAgICAgICA/IChvcGVuQmxvY2soKSwgY3JlYXRlQmxvY2soVHJhbnNpdGlvbiwge1xuICAgICAgICAgICAgICAgICAga2V5OiAwLFxuICAgICAgICAgICAgICAgICAgYXBwZWFyOiAkc2V0dXAuaXNNb2JpbGVJdGVtLFxuICAgICAgICAgICAgICAgICAgbmFtZTogXCJleHBhbmRcIixcbiAgICAgICAgICAgICAgICAgIG9uRW50ZXI6ICRzZXR1cC5vbkV4cGFuZEVudGVyLFxuICAgICAgICAgICAgICAgICAgb25BZnRlckVudGVyOiAkc2V0dXAub25FeHBhbmRBZnRlckVudGVyLFxuICAgICAgICAgICAgICAgICAgb25CZWZvcmVMZWF2ZTogJHNldHVwLm9uRXhwYW5kQmVmb3JlTGVhdmUsXG4gICAgICAgICAgICAgICAgICBvbkFmdGVyTGVhdmU6ICRzZXR1cC5vbkV4cGFuZEFmdGVyTGVhdmVcbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OiB3aXRoQ3R4KCgpID0+IFtcbiAgICAgICAgICAgICAgICAgICAgKCRzZXR1cC5zaG93KVxuICAgICAgICAgICAgICAgICAgICAgID8gKG9wZW5CbG9jaygpLCBjcmVhdGVFbGVtZW50QmxvY2soXCJkaXZcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBub3JtYWxpemVDbGFzcyhbXCJ2c20tLWNoaWxkXCIsICRzZXR1cC5pc01vYmlsZUl0ZW0gJiYgJ3ZzbS0tY2hpbGRfbW9iaWxlJ10pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogbm9ybWFsaXplU3R5bGUoJHNldHVwLmlzTW9iaWxlSXRlbSAmJiAkc2V0dXAubW9iaWxlSXRlbURyb3Bkb3duU3R5bGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnRWTm9kZShcInVsXCIsIF9ob2lzdGVkXzIkMiwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuQmxvY2sodHJ1ZSksIGNyZWF0ZUVsZW1lbnRCbG9jayhGcmFnbWVudCwgbnVsbCwgcmVuZGVyTGlzdCgkcHJvcHMuaXRlbS5jaGlsZCwgKHN1Ykl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob3BlbkJsb2NrKCksIGNyZWF0ZUJsb2NrKF9jb21wb25lbnRfc2lkZWJhcl9tZW51X2l0ZW0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBzdWJJdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiBzdWJJdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogJHByb3BzLmxldmVsKzFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkcm9wZG93bi1pY29uXCI6IHdpdGhDdHgoKHsgaXNPcGVuIH0pID0+IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJTbG90KF9jdHguJHNsb3RzLCBcImRyb3Bkb3duLWljb25cIiwgbm9ybWFsaXplUHJvcHMoZ3VhcmRSZWFjdGl2ZVByb3BzKHsgaXNPcGVuIH0pKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF86IDIgLyogRFlOQU1JQyAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAzMiAvKiBQUk9QUywgRFlOQU1JQ19TTE9UUyAqLywgW1wiaXRlbVwiLCBcImxldmVsXCJdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgMTI4IC8qIEtFWUVEX0ZSQUdNRU5UICovKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sIDYgLyogQ0xBU1MsIFNUWUxFICovKSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGNyZWF0ZUNvbW1lbnRWTm9kZShcInYtaWZcIiwgdHJ1ZSlcbiAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICAgXzogMyAvKiBGT1JXQVJERUQgKi9cbiAgICAgICAgICAgICAgICB9LCA4IC8qIFBST1BTICovLCBbXCJhcHBlYXJcIiwgXCJvbkVudGVyXCIsIFwib25BZnRlckVudGVyXCIsIFwib25CZWZvcmVMZWF2ZVwiLCBcIm9uQWZ0ZXJMZWF2ZVwiXSkpXG4gICAgICAgICAgICAgIDogY3JlYXRlQ29tbWVudFZOb2RlKFwidi1pZlwiLCB0cnVlKVxuICAgICAgICAgIF0sIDE2IC8qIEZVTExfUFJPUFMgKi8pKVxuICAgICAgICA6IGNyZWF0ZUNvbW1lbnRWTm9kZShcInYtaWZcIiwgdHJ1ZSlcbn1cblxuc2NyaXB0JDIucmVuZGVyID0gcmVuZGVyJDI7XG5zY3JpcHQkMi5fX2ZpbGUgPSBcInNyYy9jb21wb25lbnRzL1NpZGViYXJNZW51SXRlbS52dWVcIjtcblxudmFyIHNjcmlwdCQxID0ge1xyXG4gIG5hbWU6ICdTaWRlYmFyTWVudVNjcm9sbCcsXHJcbiAgc2V0dXAgKCkge1xyXG4gICAgY29uc3QgeyBnZXRJc0NvbGxhcHNlZDogaXNDb2xsYXBzZWQgfSA9IHVzZVNpZGViYXIoKTtcclxuXHJcbiAgICBjb25zdCBzY3JvbGxSZWYgPSByZWYobnVsbCk7XHJcbiAgICBjb25zdCBzY3JvbGxCYXJSZWYgPSByZWYobnVsbCk7XHJcbiAgICBjb25zdCBzY3JvbGxUaHVtYlJlZiA9IHJlZihudWxsKTtcclxuXHJcbiAgICBsZXQgY3Vyc29yWSA9IDA7XHJcbiAgICBsZXQgY3Vyc29yRG93biA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IG9uU2Nyb2xsVXBkYXRlID0gKCkgPT4ge1xyXG4gICAgICBpZiAoIXNjcm9sbFJlZi52YWx1ZSkgcmV0dXJuXHJcbiAgICAgIG5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICB1cGRhdGVUaHVtYigpO1xyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3Qgb25TY3JvbGwgPSAoKSA9PiB7XHJcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShvblNjcm9sbFVwZGF0ZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IG9uQ2xpY2sgPSAoZSkgPT4ge1xyXG4gICAgICBjb25zdCBvZmZzZXQgPSBNYXRoLmFicyhzY3JvbGxCYXJSZWYudmFsdWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkueSAtIGUuY2xpZW50WSk7XHJcbiAgICAgIGNvbnN0IHRodW1iSGFsZiA9IHNjcm9sbFRodW1iUmVmLnZhbHVlLm9mZnNldEhlaWdodCAvIDI7XHJcbiAgICAgIHVwZGF0ZVNjcm9sbFRvcChvZmZzZXQgLSB0aHVtYkhhbGYpO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBvbk1vdXNlRG93biA9IChlKSA9PiB7XHJcbiAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIGN1cnNvckRvd24gPSB0cnVlO1xyXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xyXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XHJcbiAgICAgIGN1cnNvclkgPSBzY3JvbGxUaHVtYlJlZi52YWx1ZS5vZmZzZXRIZWlnaHQgLSAoZS5jbGllbnRZIC0gc2Nyb2xsVGh1bWJSZWYudmFsdWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkueSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gKGUpID0+IHtcclxuICAgICAgaWYgKCFjdXJzb3JEb3duKSByZXR1cm5cclxuICAgICAgY29uc3Qgb2Zmc2V0ID0gZS5jbGllbnRZIC0gc2Nyb2xsQmFyUmVmLnZhbHVlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnk7XHJcbiAgICAgIGNvbnN0IHRodW1iQ2xpY2tQb3NpdGlvbiA9IHNjcm9sbFRodW1iUmVmLnZhbHVlLm9mZnNldEhlaWdodCAtIGN1cnNvclk7XHJcbiAgICAgIHVwZGF0ZVNjcm9sbFRvcChvZmZzZXQgLSB0aHVtYkNsaWNrUG9zaXRpb24pO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBvbk1vdXNlVXAgPSAoZSkgPT4ge1xyXG4gICAgICBjdXJzb3JEb3duID0gZmFsc2U7XHJcbiAgICAgIGN1cnNvclkgPSAwO1xyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZVRodW1iID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBoZWlnaHRQZXJjID0gc2Nyb2xsUmVmLnZhbHVlLmNsaWVudEhlaWdodCAqIDEwMCAvIHNjcm9sbFJlZi52YWx1ZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgIGNvbnN0IHRodW1iSGVpZ2h0UGVyYyA9IGhlaWdodFBlcmMgPCAxMDAgPyBoZWlnaHRQZXJjIDogMDtcclxuICAgICAgY29uc3QgdGh1bWJZUGVyYyA9IHNjcm9sbFJlZi52YWx1ZS5zY3JvbGxUb3AgKiAxMDAgLyBzY3JvbGxSZWYudmFsdWUuY2xpZW50SGVpZ2h0IHx8IDA7XHJcblxyXG4gICAgICBzY3JvbGxUaHVtYlJlZi52YWx1ZS5zdHlsZS5oZWlnaHQgPSBgJHt0aHVtYkhlaWdodFBlcmN9JWA7XHJcbiAgICAgIHNjcm9sbFRodW1iUmVmLnZhbHVlLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGh1bWJZUGVyY30lKWA7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZVNjcm9sbFRvcCA9ICh5KSA9PiB7XHJcbiAgICAgIGNvbnN0IHNjcm9sbFBlcmMgPSB5ICogMTAwIC8gc2Nyb2xsQmFyUmVmLnZhbHVlLm9mZnNldEhlaWdodDtcclxuICAgICAgc2Nyb2xsUmVmLnZhbHVlLnNjcm9sbFRvcCA9IHNjcm9sbFBlcmMgKiBzY3JvbGxSZWYudmFsdWUuc2Nyb2xsSGVpZ2h0IC8gMTAwO1xyXG4gICAgfTtcclxuXHJcbiAgICB3YXRjaCgoKSA9PiBpc0NvbGxhcHNlZC52YWx1ZSwgKCkgPT4ge1xyXG4gICAgICBvblNjcm9sbFVwZGF0ZSgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgb25Nb3VudGVkKCgpID0+IHtcclxuICAgICAgb25TY3JvbGxVcGRhdGUoKTtcclxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uU2Nyb2xsVXBkYXRlKTtcclxuICAgIH0pO1xyXG4gICAgb25Vbm1vdW50ZWQoKCkgPT4ge1xyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgb25TY3JvbGxVcGRhdGUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcHJvdmlkZSgnZW1pdFNjcm9sbFVwZGF0ZScsIG9uU2Nyb2xsVXBkYXRlKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzY3JvbGxSZWYsXHJcbiAgICAgIHNjcm9sbEJhclJlZixcclxuICAgICAgc2Nyb2xsVGh1bWJSZWYsXHJcbiAgICAgIG9uU2Nyb2xsLFxyXG4gICAgICBvbkNsaWNrLFxyXG4gICAgICBvbk1vdXNlRG93blxyXG4gICAgfVxyXG4gIH1cclxufTtcblxuY29uc3QgX2hvaXN0ZWRfMSQxID0geyBjbGFzczogXCJ2c20tLXNjcm9sbC13cmFwcGVyXCIgfTtcbmNvbnN0IF9ob2lzdGVkXzIkMSA9IHsgY2xhc3M6IFwidnNtLS1zY3JvbGwtb3ZlcmZsb3dcIiB9O1xuXG5mdW5jdGlvbiByZW5kZXIkMShfY3R4LCBfY2FjaGUsICRwcm9wcywgJHNldHVwLCAkZGF0YSwgJG9wdGlvbnMpIHtcbiAgcmV0dXJuIChvcGVuQmxvY2soKSwgY3JlYXRlRWxlbWVudEJsb2NrKFwiZGl2XCIsIF9ob2lzdGVkXzEkMSwgW1xuICAgIGNyZWF0ZUVsZW1lbnRWTm9kZShcImRpdlwiLCBfaG9pc3RlZF8yJDEsIFtcbiAgICAgIGNyZWF0ZUVsZW1lbnRWTm9kZShcImRpdlwiLCB7XG4gICAgICAgIHJlZjogXCJzY3JvbGxSZWZcIixcbiAgICAgICAgY2xhc3M6IFwidnNtLS1zY3JvbGxcIixcbiAgICAgICAgb25TY3JvbGw6IF9jYWNoZVswXSB8fCAoX2NhY2hlWzBdID0gKC4uLmFyZ3MpID0+ICgkc2V0dXAub25TY3JvbGwgJiYgJHNldHVwLm9uU2Nyb2xsKC4uLmFyZ3MpKSlcbiAgICAgIH0sIFtcbiAgICAgICAgcmVuZGVyU2xvdChfY3R4LiRzbG90cywgXCJkZWZhdWx0XCIpXG4gICAgICBdLCA1NDQgLyogSFlEUkFURV9FVkVOVFMsIE5FRURfUEFUQ0ggKi8pLFxuICAgICAgY3JlYXRlRWxlbWVudFZOb2RlKFwiZGl2XCIsIHtcbiAgICAgICAgcmVmOiBcInNjcm9sbEJhclJlZlwiLFxuICAgICAgICBjbGFzczogXCJ2c20tLXNjcm9sbC1iYXJcIixcbiAgICAgICAgb25Nb3VzZWRvd246IF9jYWNoZVsyXSB8fCAoX2NhY2hlWzJdID0gKC4uLmFyZ3MpID0+ICgkc2V0dXAub25DbGljayAmJiAkc2V0dXAub25DbGljayguLi5hcmdzKSkpXG4gICAgICB9LCBbXG4gICAgICAgIGNyZWF0ZUVsZW1lbnRWTm9kZShcImRpdlwiLCB7XG4gICAgICAgICAgcmVmOiBcInNjcm9sbFRodW1iUmVmXCIsXG4gICAgICAgICAgY2xhc3M6IFwidnNtLS1zY3JvbGwtdGh1bWJcIixcbiAgICAgICAgICBvbk1vdXNlZG93bjogX2NhY2hlWzFdIHx8IChfY2FjaGVbMV0gPSAoLi4uYXJncykgPT4gKCRzZXR1cC5vbk1vdXNlRG93biAmJiAkc2V0dXAub25Nb3VzZURvd24oLi4uYXJncykpKVxuICAgICAgICB9LCBudWxsLCA1NDQgLyogSFlEUkFURV9FVkVOVFMsIE5FRURfUEFUQ0ggKi8pXG4gICAgICBdLCA1NDQgLyogSFlEUkFURV9FVkVOVFMsIE5FRURfUEFUQ0ggKi8pXG4gICAgXSlcbiAgXSkpXG59XG5cbnNjcmlwdCQxLnJlbmRlciA9IHJlbmRlciQxO1xuc2NyaXB0JDEuX19maWxlID0gXCJzcmMvY29tcG9uZW50cy9TaWRlYmFyTWVudVNjcm9sbC52dWVcIjtcblxudmFyIHNjcmlwdCA9IHtcclxuICBuYW1lOiAnU2lkZWJhck1lbnUnLFxyXG4gIGNvbXBvbmVudHM6IHtcclxuICAgIFNpZGViYXJNZW51SXRlbTogc2NyaXB0JDIsXHJcbiAgICBTaWRlYmFyTWVudVNjcm9sbDogc2NyaXB0JDFcclxuICB9LFxyXG4gIHByb3BzOiB7XHJcbiAgICBtZW51OiB7XHJcbiAgICAgIHR5cGU6IEFycmF5LFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIGNvbGxhcHNlZDoge1xyXG4gICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICBkZWZhdWx0OiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHdpZHRoOiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgZGVmYXVsdDogJzI5MHB4J1xyXG4gICAgfSxcclxuICAgIHdpZHRoQ29sbGFwc2VkOiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgZGVmYXVsdDogJzY1cHgnXHJcbiAgICB9LFxyXG4gICAgc2hvd0NoaWxkOiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAgdGhlbWU6IHtcclxuICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICBkZWZhdWx0OiAnJ1xyXG4gICAgfSxcclxuICAgIHNob3dPbmVDaGlsZDoge1xyXG4gICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICBkZWZhdWx0OiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHJ0bDoge1xyXG4gICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICBkZWZhdWx0OiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHJlbGF0aXZlOiB7XHJcbiAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAgaGlkZVRvZ2dsZToge1xyXG4gICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICBkZWZhdWx0OiBmYWxzZVxyXG4gICAgfSxcclxuICAgIGRpc2FibGVIb3Zlcjoge1xyXG4gICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICBkZWZhdWx0OiBmYWxzZVxyXG4gICAgfSxcclxuICAgIGxpbmtDb21wb25lbnROYW1lOiB7XHJcbiAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXHJcbiAgICB9XHJcbiAgfSxcclxuICBlbWl0czoge1xyXG4gICAgJ2l0ZW0tY2xpY2snIChldmVudCwgaXRlbSkge1xyXG4gICAgICByZXR1cm4gISEoZXZlbnQgJiYgaXRlbSlcclxuICAgIH0sXHJcbiAgICAndXBkYXRlOmNvbGxhcHNlZCcgKGNvbGxhcHNlZCkge1xyXG4gICAgICByZXR1cm4gISEodHlwZW9mIGNvbGxhcHNlZCA9PT0gJ2Jvb2xlYW4nKVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgc2V0dXAgKHByb3BzLCBjb250ZXh0KSB7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgIGdldFNpZGViYXJSZWY6IHNpZGViYXJNZW51UmVmLFxyXG4gICAgICBnZXRJc0NvbGxhcHNlZDogaXNDb2xsYXBzZWQsXHJcbiAgICAgIHVwZGF0ZUlzQ29sbGFwc2VkLFxyXG4gICAgICB1bnNldE1vYmlsZUl0ZW0sXHJcbiAgICAgIHVwZGF0ZUN1cnJlbnRSb3V0ZVxyXG4gICAgfSA9IGluaXRTaWRlYmFyKHByb3BzLCBjb250ZXh0KTtcclxuXHJcbiAgICBjb25zdCBjb21wdXRlZE1lbnUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgIGxldCBpZCA9IDA7XHJcbiAgICAgIGZ1bmN0aW9uIHRyYW5zZm9ybUl0ZW1zIChpdGVtcykge1xyXG4gICAgICAgIGZ1bmN0aW9uIHJhbmRvbUlkICgpIHtcclxuICAgICAgICAgIHJldHVybiBgJHtEYXRlLm5vdygpICsgJycgKyBpZCsrfWBcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgIHJldHVybiB7IGlkOiByYW5kb21JZCgpLCAuLi5pdGVtLCAuLi4oaXRlbS5jaGlsZCAmJiB7IGNoaWxkOiB0cmFuc2Zvcm1JdGVtcyhpdGVtLmNoaWxkKSB9KSB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdHJhbnNmb3JtSXRlbXMocHJvcHMubWVudSlcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHNpZGViYXJXaWR0aCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgcmV0dXJuIGlzQ29sbGFwc2VkLnZhbHVlID8gcHJvcHMud2lkdGhDb2xsYXBzZWQgOiBwcm9wcy53aWR0aFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc2lkZWJhckNsYXNzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICByZXR1cm4gW1xyXG4gICAgICAgICFpc0NvbGxhcHNlZC52YWx1ZSA/ICd2c21fZXhwYW5kZWQnIDogJ3ZzbV9jb2xsYXBzZWQnLFxyXG4gICAgICAgIHByb3BzLnRoZW1lID8gYHZzbV8ke3Byb3BzLnRoZW1lfWAgOiAnJyxcclxuICAgICAgICBwcm9wcy5ydGwgPyAndnNtX3J0bCcgOiAnJyxcclxuICAgICAgICBwcm9wcy5yZWxhdGl2ZSA/ICd2c21fcmVsYXRpdmUnIDogJydcclxuICAgICAgXVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgb25Ub2dnbGVDbGljayA9ICgpID0+IHtcclxuICAgICAgdW5zZXRNb2JpbGVJdGVtKCk7XHJcbiAgICAgIHVwZGF0ZUlzQ29sbGFwc2VkKCFpc0NvbGxhcHNlZC52YWx1ZSk7XHJcbiAgICAgIGNvbnRleHQuZW1pdCgndXBkYXRlOmNvbGxhcHNlZCcsIGlzQ29sbGFwc2VkLnZhbHVlKTtcclxuICAgIH07XHJcblxyXG4gICAgd2F0Y2goKCkgPT4gcHJvcHMuY29sbGFwc2VkLCAoY3VycmVudENvbGxhcHNlZCkgPT4ge1xyXG4gICAgICB1bnNldE1vYmlsZUl0ZW0oKTtcclxuICAgICAgdXBkYXRlSXNDb2xsYXBzZWQoY3VycmVudENvbGxhcHNlZCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCByb3V0ZXIgPSBnZXRDdXJyZW50SW5zdGFuY2UoKS5hcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLiRyb3V0ZXI7XHJcbiAgICBpZiAoIXJvdXRlcikge1xyXG4gICAgICBvbk1vdW50ZWQoKCkgPT4ge1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgdXBkYXRlQ3VycmVudFJvdXRlKTtcclxuICAgICAgfSk7XHJcbiAgICAgIG9uVW5tb3VudGVkKCgpID0+IHtcclxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHVwZGF0ZUN1cnJlbnRSb3V0ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHNpZGViYXJNZW51UmVmLFxyXG4gICAgICBpc0NvbGxhcHNlZCxcclxuICAgICAgY29tcHV0ZWRNZW51LFxyXG4gICAgICBzaWRlYmFyV2lkdGgsXHJcbiAgICAgIHNpZGViYXJDbGFzcyxcclxuICAgICAgb25Ub2dnbGVDbGljayxcclxuICAgICAgb25Sb3V0ZUNoYW5nZTogdXBkYXRlQ3VycmVudFJvdXRlXHJcbiAgICB9XHJcbiAgfVxyXG59O1xuXG5jb25zdCBfaG9pc3RlZF8xID0gLyojX19QVVJFX18qL2NyZWF0ZUVsZW1lbnRWTm9kZShcInNwYW5cIiwgeyBjbGFzczogXCJ2c20tLWFycm93X2RlZmF1bHRcIiB9LCBudWxsLCAtMSAvKiBIT0lTVEVEICovKTtcbmNvbnN0IF9ob2lzdGVkXzIgPSAvKiNfX1BVUkVfXyovY3JlYXRlRWxlbWVudFZOb2RlKFwic3BhblwiLCB7IGNsYXNzOiBcInZzbS0tdG9nZ2xlLWJ0bl9kZWZhdWx0XCIgfSwgbnVsbCwgLTEgLyogSE9JU1RFRCAqLyk7XG5cbmZ1bmN0aW9uIHJlbmRlcihfY3R4LCBfY2FjaGUsICRwcm9wcywgJHNldHVwLCAkZGF0YSwgJG9wdGlvbnMpIHtcbiAgY29uc3QgX2NvbXBvbmVudF9zaWRlYmFyX21lbnVfaXRlbSA9IHJlc29sdmVDb21wb25lbnQoXCJzaWRlYmFyLW1lbnUtaXRlbVwiKTtcbiAgY29uc3QgX2NvbXBvbmVudF9zaWRlYmFyX21lbnVfc2Nyb2xsID0gcmVzb2x2ZUNvbXBvbmVudChcInNpZGViYXItbWVudS1zY3JvbGxcIik7XG5cbiAgcmV0dXJuIChvcGVuQmxvY2soKSwgY3JlYXRlRWxlbWVudEJsb2NrKFwiZGl2XCIsIHtcbiAgICByZWY6IFwic2lkZWJhck1lbnVSZWZcIixcbiAgICBjbGFzczogbm9ybWFsaXplQ2xhc3MoW1widi1zaWRlYmFyLW1lbnVcIiwgJHNldHVwLnNpZGViYXJDbGFzc10pLFxuICAgIHN0eWxlOiBub3JtYWxpemVTdHlsZSh7J21heC13aWR0aCc6ICRzZXR1cC5zaWRlYmFyV2lkdGh9KVxuICB9LCBbXG4gICAgcmVuZGVyU2xvdChfY3R4LiRzbG90cywgXCJoZWFkZXJcIiksXG4gICAgY3JlYXRlVk5vZGUoX2NvbXBvbmVudF9zaWRlYmFyX21lbnVfc2Nyb2xsLCBudWxsLCB7XG4gICAgICBkZWZhdWx0OiB3aXRoQ3R4KCgpID0+IFtcbiAgICAgICAgY3JlYXRlRWxlbWVudFZOb2RlKFwidWxcIiwge1xuICAgICAgICAgIGNsYXNzOiBcInZzbS0tbWVudVwiLFxuICAgICAgICAgIHN0eWxlOiBub3JtYWxpemVTdHlsZSh7J3dpZHRoJzogJHNldHVwLnNpZGViYXJXaWR0aH0pXG4gICAgICAgIH0sIFtcbiAgICAgICAgICAob3BlbkJsb2NrKHRydWUpLCBjcmVhdGVFbGVtZW50QmxvY2soRnJhZ21lbnQsIG51bGwsIHJlbmRlckxpc3QoJHNldHVwLmNvbXB1dGVkTWVudSwgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiAob3BlbkJsb2NrKCksIGNyZWF0ZUJsb2NrKF9jb21wb25lbnRfc2lkZWJhcl9tZW51X2l0ZW0sIHtcbiAgICAgICAgICAgICAga2V5OiBpdGVtLmlkLFxuICAgICAgICAgICAgICBpdGVtOiBpdGVtXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIFwiZHJvcGRvd24taWNvblwiOiB3aXRoQ3R4KCh7IGlzT3BlbiB9KSA9PiBbXG4gICAgICAgICAgICAgICAgcmVuZGVyU2xvdChfY3R4LiRzbG90cywgXCJkcm9wZG93bi1pY29uXCIsIG5vcm1hbGl6ZVByb3BzKGd1YXJkUmVhY3RpdmVQcm9wcyh7IGlzT3BlbiB9KSksICgpID0+IFtcbiAgICAgICAgICAgICAgICAgIF9ob2lzdGVkXzFcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgXzogMiAvKiBEWU5BTUlDICovXG4gICAgICAgICAgICB9LCAxMDMyIC8qIFBST1BTLCBEWU5BTUlDX1NMT1RTICovLCBbXCJpdGVtXCJdKSlcbiAgICAgICAgICB9KSwgMTI4IC8qIEtFWUVEX0ZSQUdNRU5UICovKSlcbiAgICAgICAgXSwgNCAvKiBTVFlMRSAqLylcbiAgICAgIF0pLFxuICAgICAgXzogMyAvKiBGT1JXQVJERUQgKi9cbiAgICB9KSxcbiAgICByZW5kZXJTbG90KF9jdHguJHNsb3RzLCBcImZvb3RlclwiKSxcbiAgICAoISRwcm9wcy5oaWRlVG9nZ2xlKVxuICAgICAgPyAob3BlbkJsb2NrKCksIGNyZWF0ZUVsZW1lbnRCbG9jayhcImJ1dHRvblwiLCB7XG4gICAgICAgICAga2V5OiAwLFxuICAgICAgICAgIGNsYXNzOiBcInZzbS0tdG9nZ2xlLWJ0blwiLFxuICAgICAgICAgIG9uQ2xpY2s6IF9jYWNoZVswXSB8fCAoX2NhY2hlWzBdID0gKC4uLmFyZ3MpID0+ICgkc2V0dXAub25Ub2dnbGVDbGljayAmJiAkc2V0dXAub25Ub2dnbGVDbGljayguLi5hcmdzKSkpXG4gICAgICAgIH0sIFtcbiAgICAgICAgICByZW5kZXJTbG90KF9jdHguJHNsb3RzLCBcInRvZ2dsZS1pY29uXCIsIHt9LCAoKSA9PiBbXG4gICAgICAgICAgICBfaG9pc3RlZF8yXG4gICAgICAgICAgXSlcbiAgICAgICAgXSkpXG4gICAgICA6IGNyZWF0ZUNvbW1lbnRWTm9kZShcInYtaWZcIiwgdHJ1ZSlcbiAgXSwgNiAvKiBDTEFTUywgU1RZTEUgKi8pKVxufVxuXG5zY3JpcHQucmVuZGVyID0gcmVuZGVyO1xuc2NyaXB0Ll9fZmlsZSA9IFwic3JjL2NvbXBvbmVudHMvU2lkZWJhck1lbnUudnVlXCI7XG5cbnZhciBpbmRleCA9IHtcbiAgaW5zdGFsbDogZnVuY3Rpb24gaW5zdGFsbChWdWUpIHtcbiAgICBWdWUuY29tcG9uZW50KCdTaWRlYmFyTWVudScsIHNjcmlwdCk7XG4gIH1cbn07XG5cbmV4cG9ydCB7IHNjcmlwdCBhcyBTaWRlYmFyTWVudSwgaW5kZXggYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dnVlLXNpZGViYXItbWVudS5lc20uanMubWFwXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/vue-sidebar-menu/dist/vue-sidebar-menu.esm.js\n");

/***/ }),

/***/ "./node_modules/vue/dist/vue.esm-bundler.js":
/*!**************************************************!*\
  !*** ./node_modules/vue/dist/vue.esm-bundler.js ***!
  \**************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"BaseTransition\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.BaseTransition),\n/* harmony export */   \"Comment\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Comment),\n/* harmony export */   \"EffectScope\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.EffectScope),\n/* harmony export */   \"Fragment\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Fragment),\n/* harmony export */   \"KeepAlive\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.KeepAlive),\n/* harmony export */   \"ReactiveEffect\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ReactiveEffect),\n/* harmony export */   \"Static\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Static),\n/* harmony export */   \"Suspense\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Suspense),\n/* harmony export */   \"Teleport\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Teleport),\n/* harmony export */   \"Text\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Text),\n/* harmony export */   \"Transition\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Transition),\n/* harmony export */   \"TransitionGroup\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.TransitionGroup),\n/* harmony export */   \"VueElement\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.VueElement),\n/* harmony export */   \"assertNumber\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.assertNumber),\n/* harmony export */   \"callWithAsyncErrorHandling\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.callWithAsyncErrorHandling),\n/* harmony export */   \"callWithErrorHandling\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.callWithErrorHandling),\n/* harmony export */   \"camelize\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.camelize),\n/* harmony export */   \"capitalize\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.capitalize),\n/* harmony export */   \"cloneVNode\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.cloneVNode),\n/* harmony export */   \"compatUtils\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.compatUtils),\n/* harmony export */   \"compile\": () => (/* binding */ compileToFunction),\n/* harmony export */   \"computed\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.computed),\n/* harmony export */   \"createApp\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createApp),\n/* harmony export */   \"createBlock\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createBlock),\n/* harmony export */   \"createCommentVNode\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode),\n/* harmony export */   \"createElementBlock\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createElementBlock),\n/* harmony export */   \"createElementVNode\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createElementVNode),\n/* harmony export */   \"createHydrationRenderer\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createHydrationRenderer),\n/* harmony export */   \"createPropsRestProxy\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createPropsRestProxy),\n/* harmony export */   \"createRenderer\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createRenderer),\n/* harmony export */   \"createSSRApp\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createSSRApp),\n/* harmony export */   \"createSlots\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createSlots),\n/* harmony export */   \"createStaticVNode\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createStaticVNode),\n/* harmony export */   \"createTextVNode\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createTextVNode),\n/* harmony export */   \"createVNode\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createVNode),\n/* harmony export */   \"customRef\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.customRef),\n/* harmony export */   \"defineAsyncComponent\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineAsyncComponent),\n/* harmony export */   \"defineComponent\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineComponent),\n/* harmony export */   \"defineCustomElement\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineCustomElement),\n/* harmony export */   \"defineEmits\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineEmits),\n/* harmony export */   \"defineExpose\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineExpose),\n/* harmony export */   \"defineProps\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineProps),\n/* harmony export */   \"defineSSRCustomElement\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineSSRCustomElement),\n/* harmony export */   \"devtools\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.devtools),\n/* harmony export */   \"effect\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.effect),\n/* harmony export */   \"effectScope\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.effectScope),\n/* harmony export */   \"getCurrentInstance\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance),\n/* harmony export */   \"getCurrentScope\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.getCurrentScope),\n/* harmony export */   \"getTransitionRawChildren\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.getTransitionRawChildren),\n/* harmony export */   \"guardReactiveProps\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.guardReactiveProps),\n/* harmony export */   \"h\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.h),\n/* harmony export */   \"handleError\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.handleError),\n/* harmony export */   \"hydrate\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.hydrate),\n/* harmony export */   \"initCustomFormatter\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.initCustomFormatter),\n/* harmony export */   \"initDirectivesForSSR\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.initDirectivesForSSR),\n/* harmony export */   \"inject\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.inject),\n/* harmony export */   \"isMemoSame\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isMemoSame),\n/* harmony export */   \"isProxy\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isProxy),\n/* harmony export */   \"isReactive\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isReactive),\n/* harmony export */   \"isReadonly\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isReadonly),\n/* harmony export */   \"isRef\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isRef),\n/* harmony export */   \"isRuntimeOnly\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isRuntimeOnly),\n/* harmony export */   \"isShallow\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isShallow),\n/* harmony export */   \"isVNode\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isVNode),\n/* harmony export */   \"markRaw\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.markRaw),\n/* harmony export */   \"mergeDefaults\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.mergeDefaults),\n/* harmony export */   \"mergeProps\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.mergeProps),\n/* harmony export */   \"nextTick\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.nextTick),\n/* harmony export */   \"normalizeClass\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.normalizeClass),\n/* harmony export */   \"normalizeProps\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.normalizeProps),\n/* harmony export */   \"normalizeStyle\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle),\n/* harmony export */   \"onActivated\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onActivated),\n/* harmony export */   \"onBeforeMount\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onBeforeMount),\n/* harmony export */   \"onBeforeUnmount\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onBeforeUnmount),\n/* harmony export */   \"onBeforeUpdate\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onBeforeUpdate),\n/* harmony export */   \"onDeactivated\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onDeactivated),\n/* harmony export */   \"onErrorCaptured\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onErrorCaptured),\n/* harmony export */   \"onMounted\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onMounted),\n/* harmony export */   \"onRenderTracked\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onRenderTracked),\n/* harmony export */   \"onRenderTriggered\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onRenderTriggered),\n/* harmony export */   \"onScopeDispose\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onScopeDispose),\n/* harmony export */   \"onServerPrefetch\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onServerPrefetch),\n/* harmony export */   \"onUnmounted\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onUnmounted),\n/* harmony export */   \"onUpdated\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onUpdated),\n/* harmony export */   \"openBlock\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.openBlock),\n/* harmony export */   \"popScopeId\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.popScopeId),\n/* harmony export */   \"provide\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.provide),\n/* harmony export */   \"proxyRefs\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.proxyRefs),\n/* harmony export */   \"pushScopeId\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.pushScopeId),\n/* harmony export */   \"queuePostFlushCb\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.queuePostFlushCb),\n/* harmony export */   \"reactive\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.reactive),\n/* harmony export */   \"readonly\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.readonly),\n/* harmony export */   \"ref\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ref),\n/* harmony export */   \"registerRuntimeCompiler\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.registerRuntimeCompiler),\n/* harmony export */   \"render\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.render),\n/* harmony export */   \"renderList\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.renderList),\n/* harmony export */   \"renderSlot\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.renderSlot),\n/* harmony export */   \"resolveComponent\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveComponent),\n/* harmony export */   \"resolveDirective\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveDirective),\n/* harmony export */   \"resolveDynamicComponent\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent),\n/* harmony export */   \"resolveFilter\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveFilter),\n/* harmony export */   \"resolveTransitionHooks\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveTransitionHooks),\n/* harmony export */   \"setBlockTracking\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.setBlockTracking),\n/* harmony export */   \"setDevtoolsHook\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.setDevtoolsHook),\n/* harmony export */   \"setTransitionHooks\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.setTransitionHooks),\n/* harmony export */   \"shallowReactive\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.shallowReactive),\n/* harmony export */   \"shallowReadonly\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly),\n/* harmony export */   \"shallowRef\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.shallowRef),\n/* harmony export */   \"ssrContextKey\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ssrContextKey),\n/* harmony export */   \"ssrUtils\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ssrUtils),\n/* harmony export */   \"stop\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.stop),\n/* harmony export */   \"toDisplayString\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toDisplayString),\n/* harmony export */   \"toHandlerKey\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toHandlerKey),\n/* harmony export */   \"toHandlers\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toHandlers),\n/* harmony export */   \"toRaw\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toRaw),\n/* harmony export */   \"toRef\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toRef),\n/* harmony export */   \"toRefs\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toRefs),\n/* harmony export */   \"transformVNodeArgs\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.transformVNodeArgs),\n/* harmony export */   \"triggerRef\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.triggerRef),\n/* harmony export */   \"unref\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.unref),\n/* harmony export */   \"useAttrs\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useAttrs),\n/* harmony export */   \"useCssModule\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useCssModule),\n/* harmony export */   \"useCssVars\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useCssVars),\n/* harmony export */   \"useSSRContext\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useSSRContext),\n/* harmony export */   \"useSlots\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useSlots),\n/* harmony export */   \"useTransitionState\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useTransitionState),\n/* harmony export */   \"vModelCheckbox\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelCheckbox),\n/* harmony export */   \"vModelDynamic\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelDynamic),\n/* harmony export */   \"vModelRadio\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelRadio),\n/* harmony export */   \"vModelSelect\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelSelect),\n/* harmony export */   \"vModelText\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelText),\n/* harmony export */   \"vShow\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vShow),\n/* harmony export */   \"version\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.version),\n/* harmony export */   \"warn\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.warn),\n/* harmony export */   \"watch\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.watch),\n/* harmony export */   \"watchEffect\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.watchEffect),\n/* harmony export */   \"watchPostEffect\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.watchPostEffect),\n/* harmony export */   \"watchSyncEffect\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.watchSyncEffect),\n/* harmony export */   \"withAsyncContext\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withAsyncContext),\n/* harmony export */   \"withCtx\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withCtx),\n/* harmony export */   \"withDefaults\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withDefaults),\n/* harmony export */   \"withDirectives\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withDirectives),\n/* harmony export */   \"withKeys\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withKeys),\n/* harmony export */   \"withMemo\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withMemo),\n/* harmony export */   \"withModifiers\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withModifiers),\n/* harmony export */   \"withScopeId\": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withScopeId)\n/* harmony export */ });\n/* harmony import */ var _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/runtime-dom */ \"./node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js\");\n/* harmony import */ var _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/runtime-dom */ \"./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js\");\n/* harmony import */ var _vue_compiler_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @vue/compiler-dom */ \"./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js\");\n/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @vue/shared */ \"./node_modules/@vue/shared/dist/shared.esm-bundler.js\");\n\n\n\n\n\n\nfunction initDev() {\n    {\n        (0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__.initCustomFormatter)();\n    }\n}\n\n// This entry is the \"full-build\" that includes both the runtime\nif ((true)) {\n    initDev();\n}\nconst compileCache = Object.create(null);\nfunction compileToFunction(template, options) {\n    if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_2__.isString)(template)) {\n        if (template.nodeType) {\n            template = template.innerHTML;\n        }\n        else {\n            ( true) && (0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__.warn)(`invalid template option: `, template);\n            return _vue_shared__WEBPACK_IMPORTED_MODULE_2__.NOOP;\n        }\n    }\n    const key = template;\n    const cached = compileCache[key];\n    if (cached) {\n        return cached;\n    }\n    if (template[0] === '#') {\n        const el = document.querySelector(template);\n        if (( true) && !el) {\n            (0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__.warn)(`Template element not found or is empty: ${template}`);\n        }\n        // __UNSAFE__\n        // Reason: potential execution of JS expressions in in-DOM template.\n        // The user must make sure the in-DOM template is trusted. If it's rendered\n        // by the server, the template should not contain any user data.\n        template = el ? el.innerHTML : ``;\n    }\n    const opts = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_2__.extend)({\n        hoistStatic: true,\n        onError: ( true) ? onError : 0,\n        onWarn: ( true) ? e => onError(e, true) : 0\n    }, options);\n    if (!opts.isCustomElement && typeof customElements !== 'undefined') {\n        opts.isCustomElement = tag => !!customElements.get(tag);\n    }\n    const { code } = (0,_vue_compiler_dom__WEBPACK_IMPORTED_MODULE_3__.compile)(template, opts);\n    function onError(err, asWarning = false) {\n        const message = asWarning\n            ? err.message\n            : `Template compilation error: ${err.message}`;\n        const codeFrame = err.loc &&\n            (0,_vue_shared__WEBPACK_IMPORTED_MODULE_2__.generateCodeFrame)(template, err.loc.start.offset, err.loc.end.offset);\n        (0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__.warn)(codeFrame ? `${message}\\n${codeFrame}` : message);\n    }\n    // The wildcard import results in a huge object with every export\n    // with keys that cannot be mangled, and can be quite heavy size-wise.\n    // In the global build we know `Vue` is available globally so we can avoid\n    // the wildcard object.\n    const render = (new Function('Vue', code)(_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__));\n    render._rc = true;\n    return (compileCache[key] = render);\n}\n(0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__.registerRuntimeCompiler)(compileToFunction);\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdnVlL2Rpc3QvdnVlLmVzbS1idW5kbGVyLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUErQztBQUN1QztBQUNyRDtBQUNXO0FBQzRCOztBQUV4RTtBQUNBO0FBQ0EsUUFBUSxxRUFBbUI7QUFDM0I7QUFDQTs7QUFFQTtBQUNBLEtBQUssSUFBcUM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHFEQUFRO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFxQyxLQUFLLHNEQUFJO0FBQzNELG1CQUFtQiw2Q0FBSTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQXFDO0FBQ2xELFlBQVksc0RBQUksNENBQTRDLFNBQVM7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsbURBQU07QUFDdkI7QUFDQSxrQkFBa0IsS0FBcUMsY0FBYyxDQUFTO0FBQzlFLGlCQUFpQixLQUFxQyw0QkFBNEIsQ0FBSTtBQUN0RixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPLEVBQUUsMERBQU87QUFDNUI7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFlBQVk7QUFDekQ7QUFDQSxZQUFZLDhEQUFpQjtBQUM3QixRQUFRLHNEQUFJLGdCQUFnQixRQUFRLElBQUksVUFBVTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLDZDQUFVO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBLHlFQUF1Qjs7QUFFaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdnVlL2Rpc3QvdnVlLmVzbS1idW5kbGVyLmpzPzViMTYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcnVudGltZURvbSBmcm9tICdAdnVlL3J1bnRpbWUtZG9tJztcbmltcG9ydCB7IGluaXRDdXN0b21Gb3JtYXR0ZXIsIHJlZ2lzdGVyUnVudGltZUNvbXBpbGVyLCB3YXJuIH0gZnJvbSAnQHZ1ZS9ydW50aW1lLWRvbSc7XG5leHBvcnQgKiBmcm9tICdAdnVlL3J1bnRpbWUtZG9tJztcbmltcG9ydCB7IGNvbXBpbGUgfSBmcm9tICdAdnVlL2NvbXBpbGVyLWRvbSc7XG5pbXBvcnQgeyBpc1N0cmluZywgTk9PUCwgZXh0ZW5kLCBnZW5lcmF0ZUNvZGVGcmFtZSB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuZnVuY3Rpb24gaW5pdERldigpIHtcbiAgICB7XG4gICAgICAgIGluaXRDdXN0b21Gb3JtYXR0ZXIoKTtcbiAgICB9XG59XG5cbi8vIFRoaXMgZW50cnkgaXMgdGhlIFwiZnVsbC1idWlsZFwiIHRoYXQgaW5jbHVkZXMgYm90aCB0aGUgcnVudGltZVxuaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgIGluaXREZXYoKTtcbn1cbmNvbnN0IGNvbXBpbGVDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5mdW5jdGlvbiBjb21waWxlVG9GdW5jdGlvbih0ZW1wbGF0ZSwgb3B0aW9ucykge1xuICAgIGlmICghaXNTdHJpbmcodGVtcGxhdGUpKSB7XG4gICAgICAgIGlmICh0ZW1wbGF0ZS5ub2RlVHlwZSkge1xuICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5pbm5lckhUTUw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgd2FybihgaW52YWxpZCB0ZW1wbGF0ZSBvcHRpb246IGAsIHRlbXBsYXRlKTtcbiAgICAgICAgICAgIHJldHVybiBOT09QO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHRlbXBsYXRlO1xuICAgIGNvbnN0IGNhY2hlZCA9IGNvbXBpbGVDYWNoZVtrZXldO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgaWYgKHRlbXBsYXRlWzBdID09PSAnIycpIHtcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRlbXBsYXRlKTtcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhZWwpIHtcbiAgICAgICAgICAgIHdhcm4oYFRlbXBsYXRlIGVsZW1lbnQgbm90IGZvdW5kIG9yIGlzIGVtcHR5OiAke3RlbXBsYXRlfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIF9fVU5TQUZFX19cbiAgICAgICAgLy8gUmVhc29uOiBwb3RlbnRpYWwgZXhlY3V0aW9uIG9mIEpTIGV4cHJlc3Npb25zIGluIGluLURPTSB0ZW1wbGF0ZS5cbiAgICAgICAgLy8gVGhlIHVzZXIgbXVzdCBtYWtlIHN1cmUgdGhlIGluLURPTSB0ZW1wbGF0ZSBpcyB0cnVzdGVkLiBJZiBpdCdzIHJlbmRlcmVkXG4gICAgICAgIC8vIGJ5IHRoZSBzZXJ2ZXIsIHRoZSB0ZW1wbGF0ZSBzaG91bGQgbm90IGNvbnRhaW4gYW55IHVzZXIgZGF0YS5cbiAgICAgICAgdGVtcGxhdGUgPSBlbCA/IGVsLmlubmVySFRNTCA6IGBgO1xuICAgIH1cbiAgICBjb25zdCBvcHRzID0gZXh0ZW5kKHtcbiAgICAgICAgaG9pc3RTdGF0aWM6IHRydWUsXG4gICAgICAgIG9uRXJyb3I6IChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IG9uRXJyb3IgOiB1bmRlZmluZWQsXG4gICAgICAgIG9uV2FybjogKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gZSA9PiBvbkVycm9yKGUsIHRydWUpIDogTk9PUFxuICAgIH0sIG9wdGlvbnMpO1xuICAgIGlmICghb3B0cy5pc0N1c3RvbUVsZW1lbnQgJiYgdHlwZW9mIGN1c3RvbUVsZW1lbnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvcHRzLmlzQ3VzdG9tRWxlbWVudCA9IHRhZyA9PiAhIWN1c3RvbUVsZW1lbnRzLmdldCh0YWcpO1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUgfSA9IGNvbXBpbGUodGVtcGxhdGUsIG9wdHMpO1xuICAgIGZ1bmN0aW9uIG9uRXJyb3IoZXJyLCBhc1dhcm5pbmcgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYXNXYXJuaW5nXG4gICAgICAgICAgICA/IGVyci5tZXNzYWdlXG4gICAgICAgICAgICA6IGBUZW1wbGF0ZSBjb21waWxhdGlvbiBlcnJvcjogJHtlcnIubWVzc2FnZX1gO1xuICAgICAgICBjb25zdCBjb2RlRnJhbWUgPSBlcnIubG9jICYmXG4gICAgICAgICAgICBnZW5lcmF0ZUNvZGVGcmFtZSh0ZW1wbGF0ZSwgZXJyLmxvYy5zdGFydC5vZmZzZXQsIGVyci5sb2MuZW5kLm9mZnNldCk7XG4gICAgICAgIHdhcm4oY29kZUZyYW1lID8gYCR7bWVzc2FnZX1cXG4ke2NvZGVGcmFtZX1gIDogbWVzc2FnZSk7XG4gICAgfVxuICAgIC8vIFRoZSB3aWxkY2FyZCBpbXBvcnQgcmVzdWx0cyBpbiBhIGh1Z2Ugb2JqZWN0IHdpdGggZXZlcnkgZXhwb3J0XG4gICAgLy8gd2l0aCBrZXlzIHRoYXQgY2Fubm90IGJlIG1hbmdsZWQsIGFuZCBjYW4gYmUgcXVpdGUgaGVhdnkgc2l6ZS13aXNlLlxuICAgIC8vIEluIHRoZSBnbG9iYWwgYnVpbGQgd2Uga25vdyBgVnVlYCBpcyBhdmFpbGFibGUgZ2xvYmFsbHkgc28gd2UgY2FuIGF2b2lkXG4gICAgLy8gdGhlIHdpbGRjYXJkIG9iamVjdC5cbiAgICBjb25zdCByZW5kZXIgPSAobmV3IEZ1bmN0aW9uKCdWdWUnLCBjb2RlKShydW50aW1lRG9tKSk7XG4gICAgcmVuZGVyLl9yYyA9IHRydWU7XG4gICAgcmV0dXJuIChjb21waWxlQ2FjaGVba2V5XSA9IHJlbmRlcik7XG59XG5yZWdpc3RlclJ1bnRpbWVDb21waWxlcihjb21waWxlVG9GdW5jdGlvbik7XG5cbmV4cG9ydCB7IGNvbXBpbGVUb0Z1bmN0aW9uIGFzIGNvbXBpbGUgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/vue/dist/vue.esm-bundler.js\n");

/***/ }),

/***/ "./node_modules/vuex-persistedstate/dist/vuex-persistedstate.es.js":
/*!*************************************************************************!*\
  !*** ./node_modules/vuex-persistedstate/dist/vuex-persistedstate.es.js ***!
  \*************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nvar r=function(r){return function(r){return!!r&&\"object\"==typeof r}(r)&&!function(r){var t=Object.prototype.toString.call(r);return\"[object RegExp]\"===t||\"[object Date]\"===t||function(r){return r.$$typeof===e}(r)}(r)},e=\"function\"==typeof Symbol&&Symbol.for?Symbol.for(\"react.element\"):60103;function t(r,e){return!1!==e.clone&&e.isMergeableObject(r)?u(Array.isArray(r)?[]:{},r,e):r}function n(r,e,n){return r.concat(e).map(function(r){return t(r,n)})}function o(r){return Object.keys(r).concat(function(r){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(r).filter(function(e){return r.propertyIsEnumerable(e)}):[]}(r))}function c(r,e){try{return e in r}catch(r){return!1}}function u(e,i,a){(a=a||{}).arrayMerge=a.arrayMerge||n,a.isMergeableObject=a.isMergeableObject||r,a.cloneUnlessOtherwiseSpecified=t;var f=Array.isArray(i);return f===Array.isArray(e)?f?a.arrayMerge(e,i,a):function(r,e,n){var i={};return n.isMergeableObject(r)&&o(r).forEach(function(e){i[e]=t(r[e],n)}),o(e).forEach(function(o){(function(r,e){return c(r,e)&&!(Object.hasOwnProperty.call(r,e)&&Object.propertyIsEnumerable.call(r,e))})(r,o)||(i[o]=c(r,o)&&n.isMergeableObject(e[o])?function(r,e){if(!e.customMerge)return u;var t=e.customMerge(r);return\"function\"==typeof t?t:u}(o,n)(r[o],e[o],n):t(e[o],n))}),i}(e,i,a):t(i,a)}u.all=function(r,e){if(!Array.isArray(r))throw new Error(\"first argument should be an array\");return r.reduce(function(r,t){return u(r,t,e)},{})};var i=u;function a(r){var e=(r=r||{}).storage||window&&window.localStorage,t=r.key||\"vuex\";function n(r,e){var t=e.getItem(r);try{return\"string\"==typeof t?JSON.parse(t):\"object\"==typeof t?t:void 0}catch(r){}}function o(){return!0}function c(r,e,t){return t.setItem(r,JSON.stringify(e))}function u(r,e){return Array.isArray(e)?e.reduce(function(e,t){return function(r,e,t,n){return!/^(__proto__|constructor|prototype)$/.test(e)&&((e=e.split?e.split(\".\"):e.slice(0)).slice(0,-1).reduce(function(r,e){return r[e]=r[e]||{}},r)[e.pop()]=t),r}(e,t,(n=r,void 0===(n=((o=t).split?o.split(\".\"):o).reduce(function(r,e){return r&&r[e]},n))?void 0:n));var n,o},{}):r}function a(r){return function(e){return r.subscribe(e)}}(r.assertStorage||function(){e.setItem(\"@@\",1),e.removeItem(\"@@\")})(e);var f,s=function(){return(r.getState||n)(t,e)};return r.fetchBeforeUse&&(f=s()),function(n){r.fetchBeforeUse||(f=s()),\"object\"==typeof f&&null!==f&&(n.replaceState(r.overwrite?f:i(n.state,f,{arrayMerge:r.arrayMerger||function(r,e){return e},clone:!1})),(r.rehydrated||function(){})(n)),(r.subscriber||a)(n)(function(n,i){(r.filter||o)(n)&&(r.setState||c)(t,(r.reducer||u)(i,r.paths),e)})}}/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (a);\n//# sourceMappingURL=vuex-persistedstate.es.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdnVleC1wZXJzaXN0ZWRzdGF0ZS9kaXN0L3Z1ZXgtcGVyc2lzdGVkc3RhdGUuZXMuanMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGtCQUFrQixtQkFBbUIsOEJBQThCLGtCQUFrQix3Q0FBd0MsOERBQThELHNCQUFzQixJQUFJLElBQUksMkVBQTJFLGdCQUFnQixtRUFBbUUsUUFBUSxrQkFBa0IsbUNBQW1DLGNBQWMsRUFBRSxjQUFjLHlDQUF5Qyx1RkFBdUYsaUNBQWlDLEtBQUssS0FBSyxnQkFBZ0IsSUFBSSxjQUFjLFNBQVMsVUFBVSxrQkFBa0IsUUFBUSwwR0FBMEcsdUJBQXVCLGtFQUFrRSxTQUFTLHdEQUF3RCxlQUFlLDJCQUEyQixlQUFlLHlGQUF5Riw4REFBOEQsMkJBQTJCLHVCQUF1QiwrQkFBK0IsOEJBQThCLElBQUksZUFBZSxvQkFBb0IsMEVBQTBFLDhCQUE4QixnQkFBZ0IsR0FBRyxHQUFHLFFBQVEsY0FBYyxjQUFjLHVEQUF1RCxnQkFBZ0IsbUJBQW1CLElBQUksbUVBQW1FLFdBQVcsYUFBYSxTQUFTLGtCQUFrQixzQ0FBc0MsZ0JBQWdCLCtDQUErQyx5QkFBeUIsNEhBQTRILHFCQUFxQixrQkFBa0Isd0VBQXdFLGVBQWUsZ0JBQWdCLFFBQVEsR0FBRyxJQUFJLGNBQWMsbUJBQW1CLHVCQUF1Qiw2QkFBNkIscUNBQXFDLEtBQUssbUJBQW1CLDRCQUE0Qiw2Q0FBNkMsbUdBQW1HLHdDQUF3QyxTQUFTLFVBQVUsOEJBQThCLHlDQUF5QyxpRUFBaUUsR0FBRyxpRUFBZSxDQUFDLEVBQUM7QUFDeGxGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Z1ZXgtcGVyc2lzdGVkc3RhdGUvZGlzdC92dWV4LXBlcnNpc3RlZHN0YXRlLmVzLmpzPzhlMzMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHI9ZnVuY3Rpb24ocil7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiEhciYmXCJvYmplY3RcIj09dHlwZW9mIHJ9KHIpJiYhZnVuY3Rpb24ocil7dmFyIHQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpO3JldHVyblwiW29iamVjdCBSZWdFeHBdXCI9PT10fHxcIltvYmplY3QgRGF0ZV1cIj09PXR8fGZ1bmN0aW9uKHIpe3JldHVybiByLiQkdHlwZW9mPT09ZX0ocil9KHIpfSxlPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLmZvcj9TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKTo2MDEwMztmdW5jdGlvbiB0KHIsZSl7cmV0dXJuITEhPT1lLmNsb25lJiZlLmlzTWVyZ2VhYmxlT2JqZWN0KHIpP3UoQXJyYXkuaXNBcnJheShyKT9bXTp7fSxyLGUpOnJ9ZnVuY3Rpb24gbihyLGUsbil7cmV0dXJuIHIuY29uY2F0KGUpLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gdChyLG4pfSl9ZnVuY3Rpb24gbyhyKXtyZXR1cm4gT2JqZWN0LmtleXMocikuY29uY2F0KGZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP09iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocikuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiByLnByb3BlcnR5SXNFbnVtZXJhYmxlKGUpfSk6W119KHIpKX1mdW5jdGlvbiBjKHIsZSl7dHJ5e3JldHVybiBlIGluIHJ9Y2F0Y2gocil7cmV0dXJuITF9fWZ1bmN0aW9uIHUoZSxpLGEpeyhhPWF8fHt9KS5hcnJheU1lcmdlPWEuYXJyYXlNZXJnZXx8bixhLmlzTWVyZ2VhYmxlT2JqZWN0PWEuaXNNZXJnZWFibGVPYmplY3R8fHIsYS5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZD10O3ZhciBmPUFycmF5LmlzQXJyYXkoaSk7cmV0dXJuIGY9PT1BcnJheS5pc0FycmF5KGUpP2Y/YS5hcnJheU1lcmdlKGUsaSxhKTpmdW5jdGlvbihyLGUsbil7dmFyIGk9e307cmV0dXJuIG4uaXNNZXJnZWFibGVPYmplY3QocikmJm8ocikuZm9yRWFjaChmdW5jdGlvbihlKXtpW2VdPXQocltlXSxuKX0pLG8oZSkuZm9yRWFjaChmdW5jdGlvbihvKXsoZnVuY3Rpb24ocixlKXtyZXR1cm4gYyhyLGUpJiYhKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsZSkmJk9iamVjdC5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHIsZSkpfSkocixvKXx8KGlbb109YyhyLG8pJiZuLmlzTWVyZ2VhYmxlT2JqZWN0KGVbb10pP2Z1bmN0aW9uKHIsZSl7aWYoIWUuY3VzdG9tTWVyZ2UpcmV0dXJuIHU7dmFyIHQ9ZS5jdXN0b21NZXJnZShyKTtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3Q6dX0obyxuKShyW29dLGVbb10sbik6dChlW29dLG4pKX0pLGl9KGUsaSxhKTp0KGksYSl9dS5hbGw9ZnVuY3Rpb24ocixlKXtpZighQXJyYXkuaXNBcnJheShyKSl0aHJvdyBuZXcgRXJyb3IoXCJmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYW4gYXJyYXlcIik7cmV0dXJuIHIucmVkdWNlKGZ1bmN0aW9uKHIsdCl7cmV0dXJuIHUocix0LGUpfSx7fSl9O3ZhciBpPXU7ZnVuY3Rpb24gYShyKXt2YXIgZT0ocj1yfHx7fSkuc3RvcmFnZXx8d2luZG93JiZ3aW5kb3cubG9jYWxTdG9yYWdlLHQ9ci5rZXl8fFwidnVleFwiO2Z1bmN0aW9uIG4ocixlKXt2YXIgdD1lLmdldEl0ZW0ocik7dHJ5e3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiB0P0pTT04ucGFyc2UodCk6XCJvYmplY3RcIj09dHlwZW9mIHQ/dDp2b2lkIDB9Y2F0Y2gocil7fX1mdW5jdGlvbiBvKCl7cmV0dXJuITB9ZnVuY3Rpb24gYyhyLGUsdCl7cmV0dXJuIHQuc2V0SXRlbShyLEpTT04uc3RyaW5naWZ5KGUpKX1mdW5jdGlvbiB1KHIsZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24ocixlLHQsbil7cmV0dXJuIS9eKF9fcHJvdG9fX3xjb25zdHJ1Y3Rvcnxwcm90b3R5cGUpJC8udGVzdChlKSYmKChlPWUuc3BsaXQ/ZS5zcGxpdChcIi5cIik6ZS5zbGljZSgwKSkuc2xpY2UoMCwtMSkucmVkdWNlKGZ1bmN0aW9uKHIsZSl7cmV0dXJuIHJbZV09cltlXXx8e319LHIpW2UucG9wKCldPXQpLHJ9KGUsdCwobj1yLHZvaWQgMD09PShuPSgobz10KS5zcGxpdD9vLnNwbGl0KFwiLlwiKTpvKS5yZWR1Y2UoZnVuY3Rpb24ocixlKXtyZXR1cm4gciYmcltlXX0sbikpP3ZvaWQgMDpuKSk7dmFyIG4sb30se30pOnJ9ZnVuY3Rpb24gYShyKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHIuc3Vic2NyaWJlKGUpfX0oci5hc3NlcnRTdG9yYWdlfHxmdW5jdGlvbigpe2Uuc2V0SXRlbShcIkBAXCIsMSksZS5yZW1vdmVJdGVtKFwiQEBcIil9KShlKTt2YXIgZixzPWZ1bmN0aW9uKCl7cmV0dXJuKHIuZ2V0U3RhdGV8fG4pKHQsZSl9O3JldHVybiByLmZldGNoQmVmb3JlVXNlJiYoZj1zKCkpLGZ1bmN0aW9uKG4pe3IuZmV0Y2hCZWZvcmVVc2V8fChmPXMoKSksXCJvYmplY3RcIj09dHlwZW9mIGYmJm51bGwhPT1mJiYobi5yZXBsYWNlU3RhdGUoci5vdmVyd3JpdGU/ZjppKG4uc3RhdGUsZix7YXJyYXlNZXJnZTpyLmFycmF5TWVyZ2VyfHxmdW5jdGlvbihyLGUpe3JldHVybiBlfSxjbG9uZTohMX0pKSwoci5yZWh5ZHJhdGVkfHxmdW5jdGlvbigpe30pKG4pKSwoci5zdWJzY3JpYmVyfHxhKShuKShmdW5jdGlvbihuLGkpeyhyLmZpbHRlcnx8bykobikmJihyLnNldFN0YXRlfHxjKSh0LChyLnJlZHVjZXJ8fHUpKGksci5wYXRocyksZSl9KX19ZXhwb3J0IGRlZmF1bHQgYTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZ1ZXgtcGVyc2lzdGVkc3RhdGUuZXMuanMubWFwXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/vuex-persistedstate/dist/vuex-persistedstate.es.js\n");

/***/ }),

/***/ "./node_modules/vuex/dist/vuex.esm-bundler.js":
/*!****************************************************!*\
  !*** ./node_modules/vuex/dist/vuex.esm-bundler.js ***!
  \****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"Store\": () => (/* binding */ Store),\n/* harmony export */   \"createLogger\": () => (/* binding */ createLogger),\n/* harmony export */   \"createNamespacedHelpers\": () => (/* binding */ createNamespacedHelpers),\n/* harmony export */   \"createStore\": () => (/* binding */ createStore),\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */   \"mapActions\": () => (/* binding */ mapActions),\n/* harmony export */   \"mapGetters\": () => (/* binding */ mapGetters),\n/* harmony export */   \"mapMutations\": () => (/* binding */ mapMutations),\n/* harmony export */   \"mapState\": () => (/* binding */ mapState),\n/* harmony export */   \"storeKey\": () => (/* binding */ storeKey),\n/* harmony export */   \"useStore\": () => (/* binding */ useStore)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n/* harmony import */ var _vue_devtools_api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/devtools-api */ \"./node_modules/@vue/devtools-api/lib/esm/index.js\");\n/*!\n * vuex v4.1.0\n * (c) 2022 Evan You\n * @license MIT\n */\n\n\n\nvar storeKey = 'store';\n\nfunction useStore (key) {\n  if ( key === void 0 ) key = null;\n\n  return (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(key !== null ? key : storeKey)\n}\n\n/**\n * Get the first item that pass the test\n * by second argument function\n *\n * @param {Array} list\n * @param {Function} f\n * @return {*}\n */\nfunction find (list, f) {\n  return list.filter(f)[0]\n}\n\n/**\n * Deep copy the given object considering circular structure.\n * This function caches all nested objects and its copies.\n * If it detects circular structure, use cached copy to avoid infinite loop.\n *\n * @param {*} obj\n * @param {Array<Object>} cache\n * @return {*}\n */\nfunction deepCopy (obj, cache) {\n  if ( cache === void 0 ) cache = [];\n\n  // just return if obj is immutable value\n  if (obj === null || typeof obj !== 'object') {\n    return obj\n  }\n\n  // if obj is hit, it is in circular structure\n  var hit = find(cache, function (c) { return c.original === obj; });\n  if (hit) {\n    return hit.copy\n  }\n\n  var copy = Array.isArray(obj) ? [] : {};\n  // put the copy into cache at first\n  // because we want to refer it in recursive deepCopy\n  cache.push({\n    original: obj,\n    copy: copy\n  });\n\n  Object.keys(obj).forEach(function (key) {\n    copy[key] = deepCopy(obj[key], cache);\n  });\n\n  return copy\n}\n\n/**\n * forEach for object\n */\nfunction forEachValue (obj, fn) {\n  Object.keys(obj).forEach(function (key) { return fn(obj[key], key); });\n}\n\nfunction isObject (obj) {\n  return obj !== null && typeof obj === 'object'\n}\n\nfunction isPromise (val) {\n  return val && typeof val.then === 'function'\n}\n\nfunction assert (condition, msg) {\n  if (!condition) { throw new Error((\"[vuex] \" + msg)) }\n}\n\nfunction partial (fn, arg) {\n  return function () {\n    return fn(arg)\n  }\n}\n\nfunction genericSubscribe (fn, subs, options) {\n  if (subs.indexOf(fn) < 0) {\n    options && options.prepend\n      ? subs.unshift(fn)\n      : subs.push(fn);\n  }\n  return function () {\n    var i = subs.indexOf(fn);\n    if (i > -1) {\n      subs.splice(i, 1);\n    }\n  }\n}\n\nfunction resetStore (store, hot) {\n  store._actions = Object.create(null);\n  store._mutations = Object.create(null);\n  store._wrappedGetters = Object.create(null);\n  store._modulesNamespaceMap = Object.create(null);\n  var state = store.state;\n  // init all modules\n  installModule(store, state, [], store._modules.root, true);\n  // reset state\n  resetStoreState(store, state, hot);\n}\n\nfunction resetStoreState (store, state, hot) {\n  var oldState = store._state;\n  var oldScope = store._scope;\n\n  // bind store public getters\n  store.getters = {};\n  // reset local getters cache\n  store._makeLocalGettersCache = Object.create(null);\n  var wrappedGetters = store._wrappedGetters;\n  var computedObj = {};\n  var computedCache = {};\n\n  // create a new effect scope and create computed object inside it to avoid\n  // getters (computed) getting destroyed on component unmount.\n  var scope = (0,vue__WEBPACK_IMPORTED_MODULE_0__.effectScope)(true);\n\n  scope.run(function () {\n    forEachValue(wrappedGetters, function (fn, key) {\n      // use computed to leverage its lazy-caching mechanism\n      // direct inline function use will lead to closure preserving oldState.\n      // using partial to return function with only arguments preserved in closure environment.\n      computedObj[key] = partial(fn, store);\n      computedCache[key] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () { return computedObj[key](); });\n      Object.defineProperty(store.getters, key, {\n        get: function () { return computedCache[key].value; },\n        enumerable: true // for local getters\n      });\n    });\n  });\n\n  store._state = (0,vue__WEBPACK_IMPORTED_MODULE_0__.reactive)({\n    data: state\n  });\n\n  // register the newly created effect scope to the store so that we can\n  // dispose the effects when this method runs again in the future.\n  store._scope = scope;\n\n  // enable strict mode for new state\n  if (store.strict) {\n    enableStrictMode(store);\n  }\n\n  if (oldState) {\n    if (hot) {\n      // dispatch changes in all subscribed watchers\n      // to force getter re-evaluation for hot reloading.\n      store._withCommit(function () {\n        oldState.data = null;\n      });\n    }\n  }\n\n  // dispose previously registered effect scope if there is one.\n  if (oldScope) {\n    oldScope.stop();\n  }\n}\n\nfunction installModule (store, rootState, path, module, hot) {\n  var isRoot = !path.length;\n  var namespace = store._modules.getNamespace(path);\n\n  // register in namespace map\n  if (module.namespaced) {\n    if (store._modulesNamespaceMap[namespace] && (\"development\" !== 'production')) {\n      console.error((\"[vuex] duplicate namespace \" + namespace + \" for the namespaced module \" + (path.join('/'))));\n    }\n    store._modulesNamespaceMap[namespace] = module;\n  }\n\n  // set state\n  if (!isRoot && !hot) {\n    var parentState = getNestedState(rootState, path.slice(0, -1));\n    var moduleName = path[path.length - 1];\n    store._withCommit(function () {\n      if ((true)) {\n        if (moduleName in parentState) {\n          console.warn(\n            (\"[vuex] state field \\\"\" + moduleName + \"\\\" was overridden by a module with the same name at \\\"\" + (path.join('.')) + \"\\\"\")\n          );\n        }\n      }\n      parentState[moduleName] = module.state;\n    });\n  }\n\n  var local = module.context = makeLocalContext(store, namespace, path);\n\n  module.forEachMutation(function (mutation, key) {\n    var namespacedType = namespace + key;\n    registerMutation(store, namespacedType, mutation, local);\n  });\n\n  module.forEachAction(function (action, key) {\n    var type = action.root ? key : namespace + key;\n    var handler = action.handler || action;\n    registerAction(store, type, handler, local);\n  });\n\n  module.forEachGetter(function (getter, key) {\n    var namespacedType = namespace + key;\n    registerGetter(store, namespacedType, getter, local);\n  });\n\n  module.forEachChild(function (child, key) {\n    installModule(store, rootState, path.concat(key), child, hot);\n  });\n}\n\n/**\n * make localized dispatch, commit, getters and state\n * if there is no namespace, just use root ones\n */\nfunction makeLocalContext (store, namespace, path) {\n  var noNamespace = namespace === '';\n\n  var local = {\n    dispatch: noNamespace ? store.dispatch : function (_type, _payload, _options) {\n      var args = unifyObjectStyle(_type, _payload, _options);\n      var payload = args.payload;\n      var options = args.options;\n      var type = args.type;\n\n      if (!options || !options.root) {\n        type = namespace + type;\n        if (( true) && !store._actions[type]) {\n          console.error((\"[vuex] unknown local action type: \" + (args.type) + \", global type: \" + type));\n          return\n        }\n      }\n\n      return store.dispatch(type, payload)\n    },\n\n    commit: noNamespace ? store.commit : function (_type, _payload, _options) {\n      var args = unifyObjectStyle(_type, _payload, _options);\n      var payload = args.payload;\n      var options = args.options;\n      var type = args.type;\n\n      if (!options || !options.root) {\n        type = namespace + type;\n        if (( true) && !store._mutations[type]) {\n          console.error((\"[vuex] unknown local mutation type: \" + (args.type) + \", global type: \" + type));\n          return\n        }\n      }\n\n      store.commit(type, payload, options);\n    }\n  };\n\n  // getters and state object must be gotten lazily\n  // because they will be changed by state update\n  Object.defineProperties(local, {\n    getters: {\n      get: noNamespace\n        ? function () { return store.getters; }\n        : function () { return makeLocalGetters(store, namespace); }\n    },\n    state: {\n      get: function () { return getNestedState(store.state, path); }\n    }\n  });\n\n  return local\n}\n\nfunction makeLocalGetters (store, namespace) {\n  if (!store._makeLocalGettersCache[namespace]) {\n    var gettersProxy = {};\n    var splitPos = namespace.length;\n    Object.keys(store.getters).forEach(function (type) {\n      // skip if the target getter is not match this namespace\n      if (type.slice(0, splitPos) !== namespace) { return }\n\n      // extract local getter type\n      var localType = type.slice(splitPos);\n\n      // Add a port to the getters proxy.\n      // Define as getter property because\n      // we do not want to evaluate the getters in this time.\n      Object.defineProperty(gettersProxy, localType, {\n        get: function () { return store.getters[type]; },\n        enumerable: true\n      });\n    });\n    store._makeLocalGettersCache[namespace] = gettersProxy;\n  }\n\n  return store._makeLocalGettersCache[namespace]\n}\n\nfunction registerMutation (store, type, handler, local) {\n  var entry = store._mutations[type] || (store._mutations[type] = []);\n  entry.push(function wrappedMutationHandler (payload) {\n    handler.call(store, local.state, payload);\n  });\n}\n\nfunction registerAction (store, type, handler, local) {\n  var entry = store._actions[type] || (store._actions[type] = []);\n  entry.push(function wrappedActionHandler (payload) {\n    var res = handler.call(store, {\n      dispatch: local.dispatch,\n      commit: local.commit,\n      getters: local.getters,\n      state: local.state,\n      rootGetters: store.getters,\n      rootState: store.state\n    }, payload);\n    if (!isPromise(res)) {\n      res = Promise.resolve(res);\n    }\n    if (store._devtoolHook) {\n      return res.catch(function (err) {\n        store._devtoolHook.emit('vuex:error', err);\n        throw err\n      })\n    } else {\n      return res\n    }\n  });\n}\n\nfunction registerGetter (store, type, rawGetter, local) {\n  if (store._wrappedGetters[type]) {\n    if ((true)) {\n      console.error((\"[vuex] duplicate getter key: \" + type));\n    }\n    return\n  }\n  store._wrappedGetters[type] = function wrappedGetter (store) {\n    return rawGetter(\n      local.state, // local state\n      local.getters, // local getters\n      store.state, // root state\n      store.getters // root getters\n    )\n  };\n}\n\nfunction enableStrictMode (store) {\n  (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(function () { return store._state.data; }, function () {\n    if ((true)) {\n      assert(store._committing, \"do not mutate vuex store state outside mutation handlers.\");\n    }\n  }, { deep: true, flush: 'sync' });\n}\n\nfunction getNestedState (state, path) {\n  return path.reduce(function (state, key) { return state[key]; }, state)\n}\n\nfunction unifyObjectStyle (type, payload, options) {\n  if (isObject(type) && type.type) {\n    options = payload;\n    payload = type;\n    type = type.type;\n  }\n\n  if ((true)) {\n    assert(typeof type === 'string', (\"expects string as the type, but found \" + (typeof type) + \".\"));\n  }\n\n  return { type: type, payload: payload, options: options }\n}\n\nvar LABEL_VUEX_BINDINGS = 'vuex bindings';\nvar MUTATIONS_LAYER_ID = 'vuex:mutations';\nvar ACTIONS_LAYER_ID = 'vuex:actions';\nvar INSPECTOR_ID = 'vuex';\n\nvar actionId = 0;\n\nfunction addDevtools (app, store) {\n  (0,_vue_devtools_api__WEBPACK_IMPORTED_MODULE_1__.setupDevtoolsPlugin)(\n    {\n      id: 'org.vuejs.vuex',\n      app: app,\n      label: 'Vuex',\n      homepage: 'https://next.vuex.vuejs.org/',\n      logo: 'https://vuejs.org/images/icons/favicon-96x96.png',\n      packageName: 'vuex',\n      componentStateTypes: [LABEL_VUEX_BINDINGS]\n    },\n    function (api) {\n      api.addTimelineLayer({\n        id: MUTATIONS_LAYER_ID,\n        label: 'Vuex Mutations',\n        color: COLOR_LIME_500\n      });\n\n      api.addTimelineLayer({\n        id: ACTIONS_LAYER_ID,\n        label: 'Vuex Actions',\n        color: COLOR_LIME_500\n      });\n\n      api.addInspector({\n        id: INSPECTOR_ID,\n        label: 'Vuex',\n        icon: 'storage',\n        treeFilterPlaceholder: 'Filter stores...'\n      });\n\n      api.on.getInspectorTree(function (payload) {\n        if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {\n          if (payload.filter) {\n            var nodes = [];\n            flattenStoreForInspectorTree(nodes, store._modules.root, payload.filter, '');\n            payload.rootNodes = nodes;\n          } else {\n            payload.rootNodes = [\n              formatStoreForInspectorTree(store._modules.root, '')\n            ];\n          }\n        }\n      });\n\n      api.on.getInspectorState(function (payload) {\n        if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {\n          var modulePath = payload.nodeId;\n          makeLocalGetters(store, modulePath);\n          payload.state = formatStoreForInspectorState(\n            getStoreModule(store._modules, modulePath),\n            modulePath === 'root' ? store.getters : store._makeLocalGettersCache,\n            modulePath\n          );\n        }\n      });\n\n      api.on.editInspectorState(function (payload) {\n        if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {\n          var modulePath = payload.nodeId;\n          var path = payload.path;\n          if (modulePath !== 'root') {\n            path = modulePath.split('/').filter(Boolean).concat( path);\n          }\n          store._withCommit(function () {\n            payload.set(store._state.data, path, payload.state.value);\n          });\n        }\n      });\n\n      store.subscribe(function (mutation, state) {\n        var data = {};\n\n        if (mutation.payload) {\n          data.payload = mutation.payload;\n        }\n\n        data.state = state;\n\n        api.notifyComponentUpdate();\n        api.sendInspectorTree(INSPECTOR_ID);\n        api.sendInspectorState(INSPECTOR_ID);\n\n        api.addTimelineEvent({\n          layerId: MUTATIONS_LAYER_ID,\n          event: {\n            time: Date.now(),\n            title: mutation.type,\n            data: data\n          }\n        });\n      });\n\n      store.subscribeAction({\n        before: function (action, state) {\n          var data = {};\n          if (action.payload) {\n            data.payload = action.payload;\n          }\n          action._id = actionId++;\n          action._time = Date.now();\n          data.state = state;\n\n          api.addTimelineEvent({\n            layerId: ACTIONS_LAYER_ID,\n            event: {\n              time: action._time,\n              title: action.type,\n              groupId: action._id,\n              subtitle: 'start',\n              data: data\n            }\n          });\n        },\n        after: function (action, state) {\n          var data = {};\n          var duration = Date.now() - action._time;\n          data.duration = {\n            _custom: {\n              type: 'duration',\n              display: (duration + \"ms\"),\n              tooltip: 'Action duration',\n              value: duration\n            }\n          };\n          if (action.payload) {\n            data.payload = action.payload;\n          }\n          data.state = state;\n\n          api.addTimelineEvent({\n            layerId: ACTIONS_LAYER_ID,\n            event: {\n              time: Date.now(),\n              title: action.type,\n              groupId: action._id,\n              subtitle: 'end',\n              data: data\n            }\n          });\n        }\n      });\n    }\n  );\n}\n\n// extracted from tailwind palette\nvar COLOR_LIME_500 = 0x84cc16;\nvar COLOR_DARK = 0x666666;\nvar COLOR_WHITE = 0xffffff;\n\nvar TAG_NAMESPACED = {\n  label: 'namespaced',\n  textColor: COLOR_WHITE,\n  backgroundColor: COLOR_DARK\n};\n\n/**\n * @param {string} path\n */\nfunction extractNameFromPath (path) {\n  return path && path !== 'root' ? path.split('/').slice(-2, -1)[0] : 'Root'\n}\n\n/**\n * @param {*} module\n * @return {import('@vue/devtools-api').CustomInspectorNode}\n */\nfunction formatStoreForInspectorTree (module, path) {\n  return {\n    id: path || 'root',\n    // all modules end with a `/`, we want the last segment only\n    // cart/ -> cart\n    // nested/cart/ -> cart\n    label: extractNameFromPath(path),\n    tags: module.namespaced ? [TAG_NAMESPACED] : [],\n    children: Object.keys(module._children).map(function (moduleName) { return formatStoreForInspectorTree(\n        module._children[moduleName],\n        path + moduleName + '/'\n      ); }\n    )\n  }\n}\n\n/**\n * @param {import('@vue/devtools-api').CustomInspectorNode[]} result\n * @param {*} module\n * @param {string} filter\n * @param {string} path\n */\nfunction flattenStoreForInspectorTree (result, module, filter, path) {\n  if (path.includes(filter)) {\n    result.push({\n      id: path || 'root',\n      label: path.endsWith('/') ? path.slice(0, path.length - 1) : path || 'Root',\n      tags: module.namespaced ? [TAG_NAMESPACED] : []\n    });\n  }\n  Object.keys(module._children).forEach(function (moduleName) {\n    flattenStoreForInspectorTree(result, module._children[moduleName], filter, path + moduleName + '/');\n  });\n}\n\n/**\n * @param {*} module\n * @return {import('@vue/devtools-api').CustomInspectorState}\n */\nfunction formatStoreForInspectorState (module, getters, path) {\n  getters = path === 'root' ? getters : getters[path];\n  var gettersKeys = Object.keys(getters);\n  var storeState = {\n    state: Object.keys(module.state).map(function (key) { return ({\n      key: key,\n      editable: true,\n      value: module.state[key]\n    }); })\n  };\n\n  if (gettersKeys.length) {\n    var tree = transformPathsToObjectTree(getters);\n    storeState.getters = Object.keys(tree).map(function (key) { return ({\n      key: key.endsWith('/') ? extractNameFromPath(key) : key,\n      editable: false,\n      value: canThrow(function () { return tree[key]; })\n    }); });\n  }\n\n  return storeState\n}\n\nfunction transformPathsToObjectTree (getters) {\n  var result = {};\n  Object.keys(getters).forEach(function (key) {\n    var path = key.split('/');\n    if (path.length > 1) {\n      var target = result;\n      var leafKey = path.pop();\n      path.forEach(function (p) {\n        if (!target[p]) {\n          target[p] = {\n            _custom: {\n              value: {},\n              display: p,\n              tooltip: 'Module',\n              abstract: true\n            }\n          };\n        }\n        target = target[p]._custom.value;\n      });\n      target[leafKey] = canThrow(function () { return getters[key]; });\n    } else {\n      result[key] = canThrow(function () { return getters[key]; });\n    }\n  });\n  return result\n}\n\nfunction getStoreModule (moduleMap, path) {\n  var names = path.split('/').filter(function (n) { return n; });\n  return names.reduce(\n    function (module, moduleName, i) {\n      var child = module[moduleName];\n      if (!child) {\n        throw new Error((\"Missing module \\\"\" + moduleName + \"\\\" for path \\\"\" + path + \"\\\".\"))\n      }\n      return i === names.length - 1 ? child : child._children\n    },\n    path === 'root' ? moduleMap : moduleMap.root._children\n  )\n}\n\nfunction canThrow (cb) {\n  try {\n    return cb()\n  } catch (e) {\n    return e\n  }\n}\n\n// Base data struct for store's module, package with some attribute and method\nvar Module = function Module (rawModule, runtime) {\n  this.runtime = runtime;\n  // Store some children item\n  this._children = Object.create(null);\n  // Store the origin module object which passed by programmer\n  this._rawModule = rawModule;\n  var rawState = rawModule.state;\n\n  // Store the origin module's state\n  this.state = (typeof rawState === 'function' ? rawState() : rawState) || {};\n};\n\nvar prototypeAccessors$1 = { namespaced: { configurable: true } };\n\nprototypeAccessors$1.namespaced.get = function () {\n  return !!this._rawModule.namespaced\n};\n\nModule.prototype.addChild = function addChild (key, module) {\n  this._children[key] = module;\n};\n\nModule.prototype.removeChild = function removeChild (key) {\n  delete this._children[key];\n};\n\nModule.prototype.getChild = function getChild (key) {\n  return this._children[key]\n};\n\nModule.prototype.hasChild = function hasChild (key) {\n  return key in this._children\n};\n\nModule.prototype.update = function update (rawModule) {\n  this._rawModule.namespaced = rawModule.namespaced;\n  if (rawModule.actions) {\n    this._rawModule.actions = rawModule.actions;\n  }\n  if (rawModule.mutations) {\n    this._rawModule.mutations = rawModule.mutations;\n  }\n  if (rawModule.getters) {\n    this._rawModule.getters = rawModule.getters;\n  }\n};\n\nModule.prototype.forEachChild = function forEachChild (fn) {\n  forEachValue(this._children, fn);\n};\n\nModule.prototype.forEachGetter = function forEachGetter (fn) {\n  if (this._rawModule.getters) {\n    forEachValue(this._rawModule.getters, fn);\n  }\n};\n\nModule.prototype.forEachAction = function forEachAction (fn) {\n  if (this._rawModule.actions) {\n    forEachValue(this._rawModule.actions, fn);\n  }\n};\n\nModule.prototype.forEachMutation = function forEachMutation (fn) {\n  if (this._rawModule.mutations) {\n    forEachValue(this._rawModule.mutations, fn);\n  }\n};\n\nObject.defineProperties( Module.prototype, prototypeAccessors$1 );\n\nvar ModuleCollection = function ModuleCollection (rawRootModule) {\n  // register root module (Vuex.Store options)\n  this.register([], rawRootModule, false);\n};\n\nModuleCollection.prototype.get = function get (path) {\n  return path.reduce(function (module, key) {\n    return module.getChild(key)\n  }, this.root)\n};\n\nModuleCollection.prototype.getNamespace = function getNamespace (path) {\n  var module = this.root;\n  return path.reduce(function (namespace, key) {\n    module = module.getChild(key);\n    return namespace + (module.namespaced ? key + '/' : '')\n  }, '')\n};\n\nModuleCollection.prototype.update = function update$1 (rawRootModule) {\n  update([], this.root, rawRootModule);\n};\n\nModuleCollection.prototype.register = function register (path, rawModule, runtime) {\n    var this$1$1 = this;\n    if ( runtime === void 0 ) runtime = true;\n\n  if ((true)) {\n    assertRawModule(path, rawModule);\n  }\n\n  var newModule = new Module(rawModule, runtime);\n  if (path.length === 0) {\n    this.root = newModule;\n  } else {\n    var parent = this.get(path.slice(0, -1));\n    parent.addChild(path[path.length - 1], newModule);\n  }\n\n  // register nested modules\n  if (rawModule.modules) {\n    forEachValue(rawModule.modules, function (rawChildModule, key) {\n      this$1$1.register(path.concat(key), rawChildModule, runtime);\n    });\n  }\n};\n\nModuleCollection.prototype.unregister = function unregister (path) {\n  var parent = this.get(path.slice(0, -1));\n  var key = path[path.length - 1];\n  var child = parent.getChild(key);\n\n  if (!child) {\n    if ((true)) {\n      console.warn(\n        \"[vuex] trying to unregister module '\" + key + \"', which is \" +\n        \"not registered\"\n      );\n    }\n    return\n  }\n\n  if (!child.runtime) {\n    return\n  }\n\n  parent.removeChild(key);\n};\n\nModuleCollection.prototype.isRegistered = function isRegistered (path) {\n  var parent = this.get(path.slice(0, -1));\n  var key = path[path.length - 1];\n\n  if (parent) {\n    return parent.hasChild(key)\n  }\n\n  return false\n};\n\nfunction update (path, targetModule, newModule) {\n  if ((true)) {\n    assertRawModule(path, newModule);\n  }\n\n  // update target module\n  targetModule.update(newModule);\n\n  // update nested modules\n  if (newModule.modules) {\n    for (var key in newModule.modules) {\n      if (!targetModule.getChild(key)) {\n        if ((true)) {\n          console.warn(\n            \"[vuex] trying to add a new module '\" + key + \"' on hot reloading, \" +\n            'manual reload is needed'\n          );\n        }\n        return\n      }\n      update(\n        path.concat(key),\n        targetModule.getChild(key),\n        newModule.modules[key]\n      );\n    }\n  }\n}\n\nvar functionAssert = {\n  assert: function (value) { return typeof value === 'function'; },\n  expected: 'function'\n};\n\nvar objectAssert = {\n  assert: function (value) { return typeof value === 'function' ||\n    (typeof value === 'object' && typeof value.handler === 'function'); },\n  expected: 'function or object with \"handler\" function'\n};\n\nvar assertTypes = {\n  getters: functionAssert,\n  mutations: functionAssert,\n  actions: objectAssert\n};\n\nfunction assertRawModule (path, rawModule) {\n  Object.keys(assertTypes).forEach(function (key) {\n    if (!rawModule[key]) { return }\n\n    var assertOptions = assertTypes[key];\n\n    forEachValue(rawModule[key], function (value, type) {\n      assert(\n        assertOptions.assert(value),\n        makeAssertionMessage(path, key, type, value, assertOptions.expected)\n      );\n    });\n  });\n}\n\nfunction makeAssertionMessage (path, key, type, value, expected) {\n  var buf = key + \" should be \" + expected + \" but \\\"\" + key + \".\" + type + \"\\\"\";\n  if (path.length > 0) {\n    buf += \" in module \\\"\" + (path.join('.')) + \"\\\"\";\n  }\n  buf += \" is \" + (JSON.stringify(value)) + \".\";\n  return buf\n}\n\nfunction createStore (options) {\n  return new Store(options)\n}\n\nvar Store = function Store (options) {\n  var this$1$1 = this;\n  if ( options === void 0 ) options = {};\n\n  if ((true)) {\n    assert(typeof Promise !== 'undefined', \"vuex requires a Promise polyfill in this browser.\");\n    assert(this instanceof Store, \"store must be called with the new operator.\");\n  }\n\n  var plugins = options.plugins; if ( plugins === void 0 ) plugins = [];\n  var strict = options.strict; if ( strict === void 0 ) strict = false;\n  var devtools = options.devtools;\n\n  // store internal state\n  this._committing = false;\n  this._actions = Object.create(null);\n  this._actionSubscribers = [];\n  this._mutations = Object.create(null);\n  this._wrappedGetters = Object.create(null);\n  this._modules = new ModuleCollection(options);\n  this._modulesNamespaceMap = Object.create(null);\n  this._subscribers = [];\n  this._makeLocalGettersCache = Object.create(null);\n\n  // EffectScope instance. when registering new getters, we wrap them inside\n  // EffectScope so that getters (computed) would not be destroyed on\n  // component unmount.\n  this._scope = null;\n\n  this._devtools = devtools;\n\n  // bind commit and dispatch to self\n  var store = this;\n  var ref = this;\n  var dispatch = ref.dispatch;\n  var commit = ref.commit;\n  this.dispatch = function boundDispatch (type, payload) {\n    return dispatch.call(store, type, payload)\n  };\n  this.commit = function boundCommit (type, payload, options) {\n    return commit.call(store, type, payload, options)\n  };\n\n  // strict mode\n  this.strict = strict;\n\n  var state = this._modules.root.state;\n\n  // init root module.\n  // this also recursively registers all sub-modules\n  // and collects all module getters inside this._wrappedGetters\n  installModule(this, state, [], this._modules.root);\n\n  // initialize the store state, which is responsible for the reactivity\n  // (also registers _wrappedGetters as computed properties)\n  resetStoreState(this, state);\n\n  // apply plugins\n  plugins.forEach(function (plugin) { return plugin(this$1$1); });\n};\n\nvar prototypeAccessors = { state: { configurable: true } };\n\nStore.prototype.install = function install (app, injectKey) {\n  app.provide(injectKey || storeKey, this);\n  app.config.globalProperties.$store = this;\n\n  var useDevtools = this._devtools !== undefined\n    ? this._devtools\n    : ( true) || 0;\n\n  if (useDevtools) {\n    addDevtools(app, this);\n  }\n};\n\nprototypeAccessors.state.get = function () {\n  return this._state.data\n};\n\nprototypeAccessors.state.set = function (v) {\n  if ((true)) {\n    assert(false, \"use store.replaceState() to explicit replace store state.\");\n  }\n};\n\nStore.prototype.commit = function commit (_type, _payload, _options) {\n    var this$1$1 = this;\n\n  // check object-style commit\n  var ref = unifyObjectStyle(_type, _payload, _options);\n    var type = ref.type;\n    var payload = ref.payload;\n    var options = ref.options;\n\n  var mutation = { type: type, payload: payload };\n  var entry = this._mutations[type];\n  if (!entry) {\n    if ((true)) {\n      console.error((\"[vuex] unknown mutation type: \" + type));\n    }\n    return\n  }\n  this._withCommit(function () {\n    entry.forEach(function commitIterator (handler) {\n      handler(payload);\n    });\n  });\n\n  this._subscribers\n    .slice() // shallow copy to prevent iterator invalidation if subscriber synchronously calls unsubscribe\n    .forEach(function (sub) { return sub(mutation, this$1$1.state); });\n\n  if (\n    ( true) &&\n    options && options.silent\n  ) {\n    console.warn(\n      \"[vuex] mutation type: \" + type + \". Silent option has been removed. \" +\n      'Use the filter functionality in the vue-devtools'\n    );\n  }\n};\n\nStore.prototype.dispatch = function dispatch (_type, _payload) {\n    var this$1$1 = this;\n\n  // check object-style dispatch\n  var ref = unifyObjectStyle(_type, _payload);\n    var type = ref.type;\n    var payload = ref.payload;\n\n  var action = { type: type, payload: payload };\n  var entry = this._actions[type];\n  if (!entry) {\n    if ((true)) {\n      console.error((\"[vuex] unknown action type: \" + type));\n    }\n    return\n  }\n\n  try {\n    this._actionSubscribers\n      .slice() // shallow copy to prevent iterator invalidation if subscriber synchronously calls unsubscribe\n      .filter(function (sub) { return sub.before; })\n      .forEach(function (sub) { return sub.before(action, this$1$1.state); });\n  } catch (e) {\n    if ((true)) {\n      console.warn(\"[vuex] error in before action subscribers: \");\n      console.error(e);\n    }\n  }\n\n  var result = entry.length > 1\n    ? Promise.all(entry.map(function (handler) { return handler(payload); }))\n    : entry[0](payload);\n\n  return new Promise(function (resolve, reject) {\n    result.then(function (res) {\n      try {\n        this$1$1._actionSubscribers\n          .filter(function (sub) { return sub.after; })\n          .forEach(function (sub) { return sub.after(action, this$1$1.state); });\n      } catch (e) {\n        if ((true)) {\n          console.warn(\"[vuex] error in after action subscribers: \");\n          console.error(e);\n        }\n      }\n      resolve(res);\n    }, function (error) {\n      try {\n        this$1$1._actionSubscribers\n          .filter(function (sub) { return sub.error; })\n          .forEach(function (sub) { return sub.error(action, this$1$1.state, error); });\n      } catch (e) {\n        if ((true)) {\n          console.warn(\"[vuex] error in error action subscribers: \");\n          console.error(e);\n        }\n      }\n      reject(error);\n    });\n  })\n};\n\nStore.prototype.subscribe = function subscribe (fn, options) {\n  return genericSubscribe(fn, this._subscribers, options)\n};\n\nStore.prototype.subscribeAction = function subscribeAction (fn, options) {\n  var subs = typeof fn === 'function' ? { before: fn } : fn;\n  return genericSubscribe(subs, this._actionSubscribers, options)\n};\n\nStore.prototype.watch = function watch$1 (getter, cb, options) {\n    var this$1$1 = this;\n\n  if ((true)) {\n    assert(typeof getter === 'function', \"store.watch only accepts a function.\");\n  }\n  return (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(function () { return getter(this$1$1.state, this$1$1.getters); }, cb, Object.assign({}, options))\n};\n\nStore.prototype.replaceState = function replaceState (state) {\n    var this$1$1 = this;\n\n  this._withCommit(function () {\n    this$1$1._state.data = state;\n  });\n};\n\nStore.prototype.registerModule = function registerModule (path, rawModule, options) {\n    if ( options === void 0 ) options = {};\n\n  if (typeof path === 'string') { path = [path]; }\n\n  if ((true)) {\n    assert(Array.isArray(path), \"module path must be a string or an Array.\");\n    assert(path.length > 0, 'cannot register the root module by using registerModule.');\n  }\n\n  this._modules.register(path, rawModule);\n  installModule(this, this.state, path, this._modules.get(path), options.preserveState);\n  // reset store to update getters...\n  resetStoreState(this, this.state);\n};\n\nStore.prototype.unregisterModule = function unregisterModule (path) {\n    var this$1$1 = this;\n\n  if (typeof path === 'string') { path = [path]; }\n\n  if ((true)) {\n    assert(Array.isArray(path), \"module path must be a string or an Array.\");\n  }\n\n  this._modules.unregister(path);\n  this._withCommit(function () {\n    var parentState = getNestedState(this$1$1.state, path.slice(0, -1));\n    delete parentState[path[path.length - 1]];\n  });\n  resetStore(this);\n};\n\nStore.prototype.hasModule = function hasModule (path) {\n  if (typeof path === 'string') { path = [path]; }\n\n  if ((true)) {\n    assert(Array.isArray(path), \"module path must be a string or an Array.\");\n  }\n\n  return this._modules.isRegistered(path)\n};\n\nStore.prototype.hotUpdate = function hotUpdate (newOptions) {\n  this._modules.update(newOptions);\n  resetStore(this, true);\n};\n\nStore.prototype._withCommit = function _withCommit (fn) {\n  var committing = this._committing;\n  this._committing = true;\n  fn();\n  this._committing = committing;\n};\n\nObject.defineProperties( Store.prototype, prototypeAccessors );\n\n/**\n * Reduce the code which written in Vue.js for getting the state.\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} states # Object's item can be a function which accept state and getters for param, you can do something for state and getters in it.\n * @param {Object}\n */\nvar mapState = normalizeNamespace(function (namespace, states) {\n  var res = {};\n  if (( true) && !isValidMap(states)) {\n    console.error('[vuex] mapState: mapper parameter must be either an Array or an Object');\n  }\n  normalizeMap(states).forEach(function (ref) {\n    var key = ref.key;\n    var val = ref.val;\n\n    res[key] = function mappedState () {\n      var state = this.$store.state;\n      var getters = this.$store.getters;\n      if (namespace) {\n        var module = getModuleByNamespace(this.$store, 'mapState', namespace);\n        if (!module) {\n          return\n        }\n        state = module.context.state;\n        getters = module.context.getters;\n      }\n      return typeof val === 'function'\n        ? val.call(this, state, getters)\n        : state[val]\n    };\n    // mark vuex getter for devtools\n    res[key].vuex = true;\n  });\n  return res\n});\n\n/**\n * Reduce the code which written in Vue.js for committing the mutation\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} mutations # Object's item can be a function which accept `commit` function as the first param, it can accept another params. You can commit mutation and do any other things in this function. specially, You need to pass anthor params from the mapped function.\n * @return {Object}\n */\nvar mapMutations = normalizeNamespace(function (namespace, mutations) {\n  var res = {};\n  if (( true) && !isValidMap(mutations)) {\n    console.error('[vuex] mapMutations: mapper parameter must be either an Array or an Object');\n  }\n  normalizeMap(mutations).forEach(function (ref) {\n    var key = ref.key;\n    var val = ref.val;\n\n    res[key] = function mappedMutation () {\n      var args = [], len = arguments.length;\n      while ( len-- ) args[ len ] = arguments[ len ];\n\n      // Get the commit method from store\n      var commit = this.$store.commit;\n      if (namespace) {\n        var module = getModuleByNamespace(this.$store, 'mapMutations', namespace);\n        if (!module) {\n          return\n        }\n        commit = module.context.commit;\n      }\n      return typeof val === 'function'\n        ? val.apply(this, [commit].concat(args))\n        : commit.apply(this.$store, [val].concat(args))\n    };\n  });\n  return res\n});\n\n/**\n * Reduce the code which written in Vue.js for getting the getters\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} getters\n * @return {Object}\n */\nvar mapGetters = normalizeNamespace(function (namespace, getters) {\n  var res = {};\n  if (( true) && !isValidMap(getters)) {\n    console.error('[vuex] mapGetters: mapper parameter must be either an Array or an Object');\n  }\n  normalizeMap(getters).forEach(function (ref) {\n    var key = ref.key;\n    var val = ref.val;\n\n    // The namespace has been mutated by normalizeNamespace\n    val = namespace + val;\n    res[key] = function mappedGetter () {\n      if (namespace && !getModuleByNamespace(this.$store, 'mapGetters', namespace)) {\n        return\n      }\n      if (( true) && !(val in this.$store.getters)) {\n        console.error((\"[vuex] unknown getter: \" + val));\n        return\n      }\n      return this.$store.getters[val]\n    };\n    // mark vuex getter for devtools\n    res[key].vuex = true;\n  });\n  return res\n});\n\n/**\n * Reduce the code which written in Vue.js for dispatch the action\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} actions # Object's item can be a function which accept `dispatch` function as the first param, it can accept anthor params. You can dispatch action and do any other things in this function. specially, You need to pass anthor params from the mapped function.\n * @return {Object}\n */\nvar mapActions = normalizeNamespace(function (namespace, actions) {\n  var res = {};\n  if (( true) && !isValidMap(actions)) {\n    console.error('[vuex] mapActions: mapper parameter must be either an Array or an Object');\n  }\n  normalizeMap(actions).forEach(function (ref) {\n    var key = ref.key;\n    var val = ref.val;\n\n    res[key] = function mappedAction () {\n      var args = [], len = arguments.length;\n      while ( len-- ) args[ len ] = arguments[ len ];\n\n      // get dispatch function from store\n      var dispatch = this.$store.dispatch;\n      if (namespace) {\n        var module = getModuleByNamespace(this.$store, 'mapActions', namespace);\n        if (!module) {\n          return\n        }\n        dispatch = module.context.dispatch;\n      }\n      return typeof val === 'function'\n        ? val.apply(this, [dispatch].concat(args))\n        : dispatch.apply(this.$store, [val].concat(args))\n    };\n  });\n  return res\n});\n\n/**\n * Rebinding namespace param for mapXXX function in special scoped, and return them by simple object\n * @param {String} namespace\n * @return {Object}\n */\nvar createNamespacedHelpers = function (namespace) { return ({\n  mapState: mapState.bind(null, namespace),\n  mapGetters: mapGetters.bind(null, namespace),\n  mapMutations: mapMutations.bind(null, namespace),\n  mapActions: mapActions.bind(null, namespace)\n}); };\n\n/**\n * Normalize the map\n * normalizeMap([1, 2, 3]) => [ { key: 1, val: 1 }, { key: 2, val: 2 }, { key: 3, val: 3 } ]\n * normalizeMap({a: 1, b: 2, c: 3}) => [ { key: 'a', val: 1 }, { key: 'b', val: 2 }, { key: 'c', val: 3 } ]\n * @param {Array|Object} map\n * @return {Object}\n */\nfunction normalizeMap (map) {\n  if (!isValidMap(map)) {\n    return []\n  }\n  return Array.isArray(map)\n    ? map.map(function (key) { return ({ key: key, val: key }); })\n    : Object.keys(map).map(function (key) { return ({ key: key, val: map[key] }); })\n}\n\n/**\n * Validate whether given map is valid or not\n * @param {*} map\n * @return {Boolean}\n */\nfunction isValidMap (map) {\n  return Array.isArray(map) || isObject(map)\n}\n\n/**\n * Return a function expect two param contains namespace and map. it will normalize the namespace and then the param's function will handle the new namespace and the map.\n * @param {Function} fn\n * @return {Function}\n */\nfunction normalizeNamespace (fn) {\n  return function (namespace, map) {\n    if (typeof namespace !== 'string') {\n      map = namespace;\n      namespace = '';\n    } else if (namespace.charAt(namespace.length - 1) !== '/') {\n      namespace += '/';\n    }\n    return fn(namespace, map)\n  }\n}\n\n/**\n * Search a special module from store by namespace. if module not exist, print error message.\n * @param {Object} store\n * @param {String} helper\n * @param {String} namespace\n * @return {Object}\n */\nfunction getModuleByNamespace (store, helper, namespace) {\n  var module = store._modulesNamespaceMap[namespace];\n  if (( true) && !module) {\n    console.error((\"[vuex] module namespace not found in \" + helper + \"(): \" + namespace));\n  }\n  return module\n}\n\n// Credits: borrowed code from fcomb/redux-logger\n\nfunction createLogger (ref) {\n  if ( ref === void 0 ) ref = {};\n  var collapsed = ref.collapsed; if ( collapsed === void 0 ) collapsed = true;\n  var filter = ref.filter; if ( filter === void 0 ) filter = function (mutation, stateBefore, stateAfter) { return true; };\n  var transformer = ref.transformer; if ( transformer === void 0 ) transformer = function (state) { return state; };\n  var mutationTransformer = ref.mutationTransformer; if ( mutationTransformer === void 0 ) mutationTransformer = function (mut) { return mut; };\n  var actionFilter = ref.actionFilter; if ( actionFilter === void 0 ) actionFilter = function (action, state) { return true; };\n  var actionTransformer = ref.actionTransformer; if ( actionTransformer === void 0 ) actionTransformer = function (act) { return act; };\n  var logMutations = ref.logMutations; if ( logMutations === void 0 ) logMutations = true;\n  var logActions = ref.logActions; if ( logActions === void 0 ) logActions = true;\n  var logger = ref.logger; if ( logger === void 0 ) logger = console;\n\n  return function (store) {\n    var prevState = deepCopy(store.state);\n\n    if (typeof logger === 'undefined') {\n      return\n    }\n\n    if (logMutations) {\n      store.subscribe(function (mutation, state) {\n        var nextState = deepCopy(state);\n\n        if (filter(mutation, prevState, nextState)) {\n          var formattedTime = getFormattedTime();\n          var formattedMutation = mutationTransformer(mutation);\n          var message = \"mutation \" + (mutation.type) + formattedTime;\n\n          startMessage(logger, message, collapsed);\n          logger.log('%c prev state', 'color: #9E9E9E; font-weight: bold', transformer(prevState));\n          logger.log('%c mutation', 'color: #03A9F4; font-weight: bold', formattedMutation);\n          logger.log('%c next state', 'color: #4CAF50; font-weight: bold', transformer(nextState));\n          endMessage(logger);\n        }\n\n        prevState = nextState;\n      });\n    }\n\n    if (logActions) {\n      store.subscribeAction(function (action, state) {\n        if (actionFilter(action, state)) {\n          var formattedTime = getFormattedTime();\n          var formattedAction = actionTransformer(action);\n          var message = \"action \" + (action.type) + formattedTime;\n\n          startMessage(logger, message, collapsed);\n          logger.log('%c action', 'color: #03A9F4; font-weight: bold', formattedAction);\n          endMessage(logger);\n        }\n      });\n    }\n  }\n}\n\nfunction startMessage (logger, message, collapsed) {\n  var startMessage = collapsed\n    ? logger.groupCollapsed\n    : logger.group;\n\n  // render\n  try {\n    startMessage.call(logger, message);\n  } catch (e) {\n    logger.log(message);\n  }\n}\n\nfunction endMessage (logger) {\n  try {\n    logger.groupEnd();\n  } catch (e) {\n    logger.log('—— log end ——');\n  }\n}\n\nfunction getFormattedTime () {\n  var time = new Date();\n  return (\" @ \" + (pad(time.getHours(), 2)) + \":\" + (pad(time.getMinutes(), 2)) + \":\" + (pad(time.getSeconds(), 2)) + \".\" + (pad(time.getMilliseconds(), 3)))\n}\n\nfunction repeat (str, times) {\n  return (new Array(times + 1)).join(str)\n}\n\nfunction pad (num, maxLength) {\n  return repeat('0', maxLength - num.toString().length) + num\n}\n\nvar index = {\n  version: '4.1.0',\n  Store: Store,\n  storeKey: storeKey,\n  createStore: createStore,\n  useStore: useStore,\n  mapState: mapState,\n  mapMutations: mapMutations,\n  mapGetters: mapGetters,\n  mapActions: mapActions,\n  createNamespacedHelpers: createNamespacedHelpers,\n  createLogger: createLogger\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (index);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdnVleC9kaXN0L3Z1ZXguZXNtLWJ1bmRsZXIuanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDcUU7QUFDYjs7QUFFeEQ7O0FBRUE7QUFDQTs7QUFFQSxTQUFTLDJDQUFNO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxVQUFVO0FBQ3JCLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxlQUFlO0FBQzFCLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUMsNEJBQTRCO0FBQ25FO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsMkJBQTJCO0FBQ3ZFOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0I7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyxnREFBVzs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDZDQUFRLGVBQWUsNEJBQTRCO0FBQzlFO0FBQ0EsMkJBQTJCLGtDQUFrQztBQUM3RDtBQUNB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Q0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDLDJCQUEyQixpRkFBaUY7QUFDNUcscUNBQXFDLCtEQUErRDtBQUNwRyxxREFBcUQsNkVBQTZFO0FBQ2xJLHVDQUF1Qyx5RUFBeUU7QUFDaEgsaURBQWlELHlFQUF5RTtBQUMxSCx1Q0FBdUM7QUFDdkMsbUNBQW1DO0FBQ25DLDJCQUEyQjs7QUFFM0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdURBQXVEO0FBQ3ZELHFEQUFxRDtBQUNyRCx1REFBdUQ7QUFDdkQ7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUVBQWUsS0FBSyxFQUFDO0FBQ29IIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Z1ZXgvZGlzdC92dWV4LmVzbS1idW5kbGVyLmpzPzAzYzkiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiB2dWV4IHY0LjEuMFxuICogKGMpIDIwMjIgRXZhbiBZb3VcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5pbXBvcnQgeyBpbmplY3QsIGVmZmVjdFNjb3BlLCByZWFjdGl2ZSwgd2F0Y2gsIGNvbXB1dGVkIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IHNldHVwRGV2dG9vbHNQbHVnaW4gfSBmcm9tICdAdnVlL2RldnRvb2xzLWFwaSc7XG5cbnZhciBzdG9yZUtleSA9ICdzdG9yZSc7XG5cbmZ1bmN0aW9uIHVzZVN0b3JlIChrZXkpIHtcbiAgaWYgKCBrZXkgPT09IHZvaWQgMCApIGtleSA9IG51bGw7XG5cbiAgcmV0dXJuIGluamVjdChrZXkgIT09IG51bGwgPyBrZXkgOiBzdG9yZUtleSlcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGZpcnN0IGl0ZW0gdGhhdCBwYXNzIHRoZSB0ZXN0XG4gKiBieSBzZWNvbmQgYXJndW1lbnQgZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmXG4gKiBAcmV0dXJuIHsqfVxuICovXG5mdW5jdGlvbiBmaW5kIChsaXN0LCBmKSB7XG4gIHJldHVybiBsaXN0LmZpbHRlcihmKVswXVxufVxuXG4vKipcbiAqIERlZXAgY29weSB0aGUgZ2l2ZW4gb2JqZWN0IGNvbnNpZGVyaW5nIGNpcmN1bGFyIHN0cnVjdHVyZS5cbiAqIFRoaXMgZnVuY3Rpb24gY2FjaGVzIGFsbCBuZXN0ZWQgb2JqZWN0cyBhbmQgaXRzIGNvcGllcy5cbiAqIElmIGl0IGRldGVjdHMgY2lyY3VsYXIgc3RydWN0dXJlLCB1c2UgY2FjaGVkIGNvcHkgdG8gYXZvaWQgaW5maW5pdGUgbG9vcC5cbiAqXG4gKiBAcGFyYW0geyp9IG9ialxuICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBjYWNoZVxuICogQHJldHVybiB7Kn1cbiAqL1xuZnVuY3Rpb24gZGVlcENvcHkgKG9iaiwgY2FjaGUpIHtcbiAgaWYgKCBjYWNoZSA9PT0gdm9pZCAwICkgY2FjaGUgPSBbXTtcblxuICAvLyBqdXN0IHJldHVybiBpZiBvYmogaXMgaW1tdXRhYmxlIHZhbHVlXG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICAvLyBpZiBvYmogaXMgaGl0LCBpdCBpcyBpbiBjaXJjdWxhciBzdHJ1Y3R1cmVcbiAgdmFyIGhpdCA9IGZpbmQoY2FjaGUsIGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLm9yaWdpbmFsID09PSBvYmo7IH0pO1xuICBpZiAoaGl0KSB7XG4gICAgcmV0dXJuIGhpdC5jb3B5XG4gIH1cblxuICB2YXIgY29weSA9IEFycmF5LmlzQXJyYXkob2JqKSA/IFtdIDoge307XG4gIC8vIHB1dCB0aGUgY29weSBpbnRvIGNhY2hlIGF0IGZpcnN0XG4gIC8vIGJlY2F1c2Ugd2Ugd2FudCB0byByZWZlciBpdCBpbiByZWN1cnNpdmUgZGVlcENvcHlcbiAgY2FjaGUucHVzaCh7XG4gICAgb3JpZ2luYWw6IG9iaixcbiAgICBjb3B5OiBjb3B5XG4gIH0pO1xuXG4gIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgY29weVtrZXldID0gZGVlcENvcHkob2JqW2tleV0sIGNhY2hlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvcHlcbn1cblxuLyoqXG4gKiBmb3JFYWNoIGZvciBvYmplY3RcbiAqL1xuZnVuY3Rpb24gZm9yRWFjaFZhbHVlIChvYmosIGZuKSB7XG4gIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBmbihvYmpba2V5XSwga2V5KTsgfSk7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0J1xufVxuXG5mdW5jdGlvbiBpc1Byb21pc2UgKHZhbCkge1xuICByZXR1cm4gdmFsICYmIHR5cGVvZiB2YWwudGhlbiA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG5mdW5jdGlvbiBhc3NlcnQgKGNvbmRpdGlvbiwgbXNnKSB7XG4gIGlmICghY29uZGl0aW9uKSB7IHRocm93IG5ldyBFcnJvcigoXCJbdnVleF0gXCIgKyBtc2cpKSB9XG59XG5cbmZ1bmN0aW9uIHBhcnRpYWwgKGZuLCBhcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZm4oYXJnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyaWNTdWJzY3JpYmUgKGZuLCBzdWJzLCBvcHRpb25zKSB7XG4gIGlmIChzdWJzLmluZGV4T2YoZm4pIDwgMCkge1xuICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5wcmVwZW5kXG4gICAgICA/IHN1YnMudW5zaGlmdChmbilcbiAgICAgIDogc3Vicy5wdXNoKGZuKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBpID0gc3Vicy5pbmRleE9mKGZuKTtcbiAgICBpZiAoaSA+IC0xKSB7XG4gICAgICBzdWJzLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRTdG9yZSAoc3RvcmUsIGhvdCkge1xuICBzdG9yZS5fYWN0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHN0b3JlLl9tdXRhdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBzdG9yZS5fd3JhcHBlZEdldHRlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBzdG9yZS5fbW9kdWxlc05hbWVzcGFjZU1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZhciBzdGF0ZSA9IHN0b3JlLnN0YXRlO1xuICAvLyBpbml0IGFsbCBtb2R1bGVzXG4gIGluc3RhbGxNb2R1bGUoc3RvcmUsIHN0YXRlLCBbXSwgc3RvcmUuX21vZHVsZXMucm9vdCwgdHJ1ZSk7XG4gIC8vIHJlc2V0IHN0YXRlXG4gIHJlc2V0U3RvcmVTdGF0ZShzdG9yZSwgc3RhdGUsIGhvdCk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0U3RvcmVTdGF0ZSAoc3RvcmUsIHN0YXRlLCBob3QpIHtcbiAgdmFyIG9sZFN0YXRlID0gc3RvcmUuX3N0YXRlO1xuICB2YXIgb2xkU2NvcGUgPSBzdG9yZS5fc2NvcGU7XG5cbiAgLy8gYmluZCBzdG9yZSBwdWJsaWMgZ2V0dGVyc1xuICBzdG9yZS5nZXR0ZXJzID0ge307XG4gIC8vIHJlc2V0IGxvY2FsIGdldHRlcnMgY2FjaGVcbiAgc3RvcmUuX21ha2VMb2NhbEdldHRlcnNDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZhciB3cmFwcGVkR2V0dGVycyA9IHN0b3JlLl93cmFwcGVkR2V0dGVycztcbiAgdmFyIGNvbXB1dGVkT2JqID0ge307XG4gIHZhciBjb21wdXRlZENhY2hlID0ge307XG5cbiAgLy8gY3JlYXRlIGEgbmV3IGVmZmVjdCBzY29wZSBhbmQgY3JlYXRlIGNvbXB1dGVkIG9iamVjdCBpbnNpZGUgaXQgdG8gYXZvaWRcbiAgLy8gZ2V0dGVycyAoY29tcHV0ZWQpIGdldHRpbmcgZGVzdHJveWVkIG9uIGNvbXBvbmVudCB1bm1vdW50LlxuICB2YXIgc2NvcGUgPSBlZmZlY3RTY29wZSh0cnVlKTtcblxuICBzY29wZS5ydW4oZnVuY3Rpb24gKCkge1xuICAgIGZvckVhY2hWYWx1ZSh3cmFwcGVkR2V0dGVycywgZnVuY3Rpb24gKGZuLCBrZXkpIHtcbiAgICAgIC8vIHVzZSBjb21wdXRlZCB0byBsZXZlcmFnZSBpdHMgbGF6eS1jYWNoaW5nIG1lY2hhbmlzbVxuICAgICAgLy8gZGlyZWN0IGlubGluZSBmdW5jdGlvbiB1c2Ugd2lsbCBsZWFkIHRvIGNsb3N1cmUgcHJlc2VydmluZyBvbGRTdGF0ZS5cbiAgICAgIC8vIHVzaW5nIHBhcnRpYWwgdG8gcmV0dXJuIGZ1bmN0aW9uIHdpdGggb25seSBhcmd1bWVudHMgcHJlc2VydmVkIGluIGNsb3N1cmUgZW52aXJvbm1lbnQuXG4gICAgICBjb21wdXRlZE9ialtrZXldID0gcGFydGlhbChmbiwgc3RvcmUpO1xuICAgICAgY29tcHV0ZWRDYWNoZVtrZXldID0gY29tcHV0ZWQoZnVuY3Rpb24gKCkgeyByZXR1cm4gY29tcHV0ZWRPYmpba2V5XSgpOyB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdG9yZS5nZXR0ZXJzLCBrZXksIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb21wdXRlZENhY2hlW2tleV0udmFsdWU7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUgLy8gZm9yIGxvY2FsIGdldHRlcnNcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBzdG9yZS5fc3RhdGUgPSByZWFjdGl2ZSh7XG4gICAgZGF0YTogc3RhdGVcbiAgfSk7XG5cbiAgLy8gcmVnaXN0ZXIgdGhlIG5ld2x5IGNyZWF0ZWQgZWZmZWN0IHNjb3BlIHRvIHRoZSBzdG9yZSBzbyB0aGF0IHdlIGNhblxuICAvLyBkaXNwb3NlIHRoZSBlZmZlY3RzIHdoZW4gdGhpcyBtZXRob2QgcnVucyBhZ2FpbiBpbiB0aGUgZnV0dXJlLlxuICBzdG9yZS5fc2NvcGUgPSBzY29wZTtcblxuICAvLyBlbmFibGUgc3RyaWN0IG1vZGUgZm9yIG5ldyBzdGF0ZVxuICBpZiAoc3RvcmUuc3RyaWN0KSB7XG4gICAgZW5hYmxlU3RyaWN0TW9kZShzdG9yZSk7XG4gIH1cblxuICBpZiAob2xkU3RhdGUpIHtcbiAgICBpZiAoaG90KSB7XG4gICAgICAvLyBkaXNwYXRjaCBjaGFuZ2VzIGluIGFsbCBzdWJzY3JpYmVkIHdhdGNoZXJzXG4gICAgICAvLyB0byBmb3JjZSBnZXR0ZXIgcmUtZXZhbHVhdGlvbiBmb3IgaG90IHJlbG9hZGluZy5cbiAgICAgIHN0b3JlLl93aXRoQ29tbWl0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb2xkU3RhdGUuZGF0YSA9IG51bGw7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBkaXNwb3NlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBlZmZlY3Qgc2NvcGUgaWYgdGhlcmUgaXMgb25lLlxuICBpZiAob2xkU2NvcGUpIHtcbiAgICBvbGRTY29wZS5zdG9wKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbE1vZHVsZSAoc3RvcmUsIHJvb3RTdGF0ZSwgcGF0aCwgbW9kdWxlLCBob3QpIHtcbiAgdmFyIGlzUm9vdCA9ICFwYXRoLmxlbmd0aDtcbiAgdmFyIG5hbWVzcGFjZSA9IHN0b3JlLl9tb2R1bGVzLmdldE5hbWVzcGFjZShwYXRoKTtcblxuICAvLyByZWdpc3RlciBpbiBuYW1lc3BhY2UgbWFwXG4gIGlmIChtb2R1bGUubmFtZXNwYWNlZCkge1xuICAgIGlmIChzdG9yZS5fbW9kdWxlc05hbWVzcGFjZU1hcFtuYW1lc3BhY2VdICYmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgY29uc29sZS5lcnJvcigoXCJbdnVleF0gZHVwbGljYXRlIG5hbWVzcGFjZSBcIiArIG5hbWVzcGFjZSArIFwiIGZvciB0aGUgbmFtZXNwYWNlZCBtb2R1bGUgXCIgKyAocGF0aC5qb2luKCcvJykpKSk7XG4gICAgfVxuICAgIHN0b3JlLl9tb2R1bGVzTmFtZXNwYWNlTWFwW25hbWVzcGFjZV0gPSBtb2R1bGU7XG4gIH1cblxuICAvLyBzZXQgc3RhdGVcbiAgaWYgKCFpc1Jvb3QgJiYgIWhvdCkge1xuICAgIHZhciBwYXJlbnRTdGF0ZSA9IGdldE5lc3RlZFN0YXRlKHJvb3RTdGF0ZSwgcGF0aC5zbGljZSgwLCAtMSkpO1xuICAgIHZhciBtb2R1bGVOYW1lID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgIHN0b3JlLl93aXRoQ29tbWl0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgaWYgKG1vZHVsZU5hbWUgaW4gcGFyZW50U3RhdGUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAoXCJbdnVleF0gc3RhdGUgZmllbGQgXFxcIlwiICsgbW9kdWxlTmFtZSArIFwiXFxcIiB3YXMgb3ZlcnJpZGRlbiBieSBhIG1vZHVsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXQgXFxcIlwiICsgKHBhdGguam9pbignLicpKSArIFwiXFxcIlwiKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBhcmVudFN0YXRlW21vZHVsZU5hbWVdID0gbW9kdWxlLnN0YXRlO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGxvY2FsID0gbW9kdWxlLmNvbnRleHQgPSBtYWtlTG9jYWxDb250ZXh0KHN0b3JlLCBuYW1lc3BhY2UsIHBhdGgpO1xuXG4gIG1vZHVsZS5mb3JFYWNoTXV0YXRpb24oZnVuY3Rpb24gKG11dGF0aW9uLCBrZXkpIHtcbiAgICB2YXIgbmFtZXNwYWNlZFR5cGUgPSBuYW1lc3BhY2UgKyBrZXk7XG4gICAgcmVnaXN0ZXJNdXRhdGlvbihzdG9yZSwgbmFtZXNwYWNlZFR5cGUsIG11dGF0aW9uLCBsb2NhbCk7XG4gIH0pO1xuXG4gIG1vZHVsZS5mb3JFYWNoQWN0aW9uKGZ1bmN0aW9uIChhY3Rpb24sIGtleSkge1xuICAgIHZhciB0eXBlID0gYWN0aW9uLnJvb3QgPyBrZXkgOiBuYW1lc3BhY2UgKyBrZXk7XG4gICAgdmFyIGhhbmRsZXIgPSBhY3Rpb24uaGFuZGxlciB8fCBhY3Rpb247XG4gICAgcmVnaXN0ZXJBY3Rpb24oc3RvcmUsIHR5cGUsIGhhbmRsZXIsIGxvY2FsKTtcbiAgfSk7XG5cbiAgbW9kdWxlLmZvckVhY2hHZXR0ZXIoZnVuY3Rpb24gKGdldHRlciwga2V5KSB7XG4gICAgdmFyIG5hbWVzcGFjZWRUeXBlID0gbmFtZXNwYWNlICsga2V5O1xuICAgIHJlZ2lzdGVyR2V0dGVyKHN0b3JlLCBuYW1lc3BhY2VkVHlwZSwgZ2V0dGVyLCBsb2NhbCk7XG4gIH0pO1xuXG4gIG1vZHVsZS5mb3JFYWNoQ2hpbGQoZnVuY3Rpb24gKGNoaWxkLCBrZXkpIHtcbiAgICBpbnN0YWxsTW9kdWxlKHN0b3JlLCByb290U3RhdGUsIHBhdGguY29uY2F0KGtleSksIGNoaWxkLCBob3QpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBtYWtlIGxvY2FsaXplZCBkaXNwYXRjaCwgY29tbWl0LCBnZXR0ZXJzIGFuZCBzdGF0ZVxuICogaWYgdGhlcmUgaXMgbm8gbmFtZXNwYWNlLCBqdXN0IHVzZSByb290IG9uZXNcbiAqL1xuZnVuY3Rpb24gbWFrZUxvY2FsQ29udGV4dCAoc3RvcmUsIG5hbWVzcGFjZSwgcGF0aCkge1xuICB2YXIgbm9OYW1lc3BhY2UgPSBuYW1lc3BhY2UgPT09ICcnO1xuXG4gIHZhciBsb2NhbCA9IHtcbiAgICBkaXNwYXRjaDogbm9OYW1lc3BhY2UgPyBzdG9yZS5kaXNwYXRjaCA6IGZ1bmN0aW9uIChfdHlwZSwgX3BheWxvYWQsIF9vcHRpb25zKSB7XG4gICAgICB2YXIgYXJncyA9IHVuaWZ5T2JqZWN0U3R5bGUoX3R5cGUsIF9wYXlsb2FkLCBfb3B0aW9ucyk7XG4gICAgICB2YXIgcGF5bG9hZCA9IGFyZ3MucGF5bG9hZDtcbiAgICAgIHZhciBvcHRpb25zID0gYXJncy5vcHRpb25zO1xuICAgICAgdmFyIHR5cGUgPSBhcmdzLnR5cGU7XG5cbiAgICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5yb290KSB7XG4gICAgICAgIHR5cGUgPSBuYW1lc3BhY2UgKyB0eXBlO1xuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmICFzdG9yZS5fYWN0aW9uc1t0eXBlXSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoKFwiW3Z1ZXhdIHVua25vd24gbG9jYWwgYWN0aW9uIHR5cGU6IFwiICsgKGFyZ3MudHlwZSkgKyBcIiwgZ2xvYmFsIHR5cGU6IFwiICsgdHlwZSkpO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdG9yZS5kaXNwYXRjaCh0eXBlLCBwYXlsb2FkKVxuICAgIH0sXG5cbiAgICBjb21taXQ6IG5vTmFtZXNwYWNlID8gc3RvcmUuY29tbWl0IDogZnVuY3Rpb24gKF90eXBlLCBfcGF5bG9hZCwgX29wdGlvbnMpIHtcbiAgICAgIHZhciBhcmdzID0gdW5pZnlPYmplY3RTdHlsZShfdHlwZSwgX3BheWxvYWQsIF9vcHRpb25zKTtcbiAgICAgIHZhciBwYXlsb2FkID0gYXJncy5wYXlsb2FkO1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmdzLm9wdGlvbnM7XG4gICAgICB2YXIgdHlwZSA9IGFyZ3MudHlwZTtcblxuICAgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLnJvb3QpIHtcbiAgICAgICAgdHlwZSA9IG5hbWVzcGFjZSArIHR5cGU7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIXN0b3JlLl9tdXRhdGlvbnNbdHlwZV0pIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKChcIlt2dWV4XSB1bmtub3duIGxvY2FsIG11dGF0aW9uIHR5cGU6IFwiICsgKGFyZ3MudHlwZSkgKyBcIiwgZ2xvYmFsIHR5cGU6IFwiICsgdHlwZSkpO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN0b3JlLmNvbW1pdCh0eXBlLCBwYXlsb2FkLCBvcHRpb25zKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gZ2V0dGVycyBhbmQgc3RhdGUgb2JqZWN0IG11c3QgYmUgZ290dGVuIGxhemlseVxuICAvLyBiZWNhdXNlIHRoZXkgd2lsbCBiZSBjaGFuZ2VkIGJ5IHN0YXRlIHVwZGF0ZVxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsb2NhbCwge1xuICAgIGdldHRlcnM6IHtcbiAgICAgIGdldDogbm9OYW1lc3BhY2VcbiAgICAgICAgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBzdG9yZS5nZXR0ZXJzOyB9XG4gICAgICAgIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWFrZUxvY2FsR2V0dGVycyhzdG9yZSwgbmFtZXNwYWNlKTsgfVxuICAgIH0sXG4gICAgc3RhdGU6IHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2V0TmVzdGVkU3RhdGUoc3RvcmUuc3RhdGUsIHBhdGgpOyB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gbG9jYWxcbn1cblxuZnVuY3Rpb24gbWFrZUxvY2FsR2V0dGVycyAoc3RvcmUsIG5hbWVzcGFjZSkge1xuICBpZiAoIXN0b3JlLl9tYWtlTG9jYWxHZXR0ZXJzQ2FjaGVbbmFtZXNwYWNlXSkge1xuICAgIHZhciBnZXR0ZXJzUHJveHkgPSB7fTtcbiAgICB2YXIgc3BsaXRQb3MgPSBuYW1lc3BhY2UubGVuZ3RoO1xuICAgIE9iamVjdC5rZXlzKHN0b3JlLmdldHRlcnMpLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIC8vIHNraXAgaWYgdGhlIHRhcmdldCBnZXR0ZXIgaXMgbm90IG1hdGNoIHRoaXMgbmFtZXNwYWNlXG4gICAgICBpZiAodHlwZS5zbGljZSgwLCBzcGxpdFBvcykgIT09IG5hbWVzcGFjZSkgeyByZXR1cm4gfVxuXG4gICAgICAvLyBleHRyYWN0IGxvY2FsIGdldHRlciB0eXBlXG4gICAgICB2YXIgbG9jYWxUeXBlID0gdHlwZS5zbGljZShzcGxpdFBvcyk7XG5cbiAgICAgIC8vIEFkZCBhIHBvcnQgdG8gdGhlIGdldHRlcnMgcHJveHkuXG4gICAgICAvLyBEZWZpbmUgYXMgZ2V0dGVyIHByb3BlcnR5IGJlY2F1c2VcbiAgICAgIC8vIHdlIGRvIG5vdCB3YW50IHRvIGV2YWx1YXRlIHRoZSBnZXR0ZXJzIGluIHRoaXMgdGltZS5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnZXR0ZXJzUHJveHksIGxvY2FsVHlwZSwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0b3JlLmdldHRlcnNbdHlwZV07IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHN0b3JlLl9tYWtlTG9jYWxHZXR0ZXJzQ2FjaGVbbmFtZXNwYWNlXSA9IGdldHRlcnNQcm94eTtcbiAgfVxuXG4gIHJldHVybiBzdG9yZS5fbWFrZUxvY2FsR2V0dGVyc0NhY2hlW25hbWVzcGFjZV1cbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJNdXRhdGlvbiAoc3RvcmUsIHR5cGUsIGhhbmRsZXIsIGxvY2FsKSB7XG4gIHZhciBlbnRyeSA9IHN0b3JlLl9tdXRhdGlvbnNbdHlwZV0gfHwgKHN0b3JlLl9tdXRhdGlvbnNbdHlwZV0gPSBbXSk7XG4gIGVudHJ5LnB1c2goZnVuY3Rpb24gd3JhcHBlZE11dGF0aW9uSGFuZGxlciAocGF5bG9hZCkge1xuICAgIGhhbmRsZXIuY2FsbChzdG9yZSwgbG9jYWwuc3RhdGUsIHBheWxvYWQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJBY3Rpb24gKHN0b3JlLCB0eXBlLCBoYW5kbGVyLCBsb2NhbCkge1xuICB2YXIgZW50cnkgPSBzdG9yZS5fYWN0aW9uc1t0eXBlXSB8fCAoc3RvcmUuX2FjdGlvbnNbdHlwZV0gPSBbXSk7XG4gIGVudHJ5LnB1c2goZnVuY3Rpb24gd3JhcHBlZEFjdGlvbkhhbmRsZXIgKHBheWxvYWQpIHtcbiAgICB2YXIgcmVzID0gaGFuZGxlci5jYWxsKHN0b3JlLCB7XG4gICAgICBkaXNwYXRjaDogbG9jYWwuZGlzcGF0Y2gsXG4gICAgICBjb21taXQ6IGxvY2FsLmNvbW1pdCxcbiAgICAgIGdldHRlcnM6IGxvY2FsLmdldHRlcnMsXG4gICAgICBzdGF0ZTogbG9jYWwuc3RhdGUsXG4gICAgICByb290R2V0dGVyczogc3RvcmUuZ2V0dGVycyxcbiAgICAgIHJvb3RTdGF0ZTogc3RvcmUuc3RhdGVcbiAgICB9LCBwYXlsb2FkKTtcbiAgICBpZiAoIWlzUHJvbWlzZShyZXMpKSB7XG4gICAgICByZXMgPSBQcm9taXNlLnJlc29sdmUocmVzKTtcbiAgICB9XG4gICAgaWYgKHN0b3JlLl9kZXZ0b29sSG9vaykge1xuICAgICAgcmV0dXJuIHJlcy5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHN0b3JlLl9kZXZ0b29sSG9vay5lbWl0KCd2dWV4OmVycm9yJywgZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJHZXR0ZXIgKHN0b3JlLCB0eXBlLCByYXdHZXR0ZXIsIGxvY2FsKSB7XG4gIGlmIChzdG9yZS5fd3JhcHBlZEdldHRlcnNbdHlwZV0pIHtcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKChcIlt2dWV4XSBkdXBsaWNhdGUgZ2V0dGVyIGtleTogXCIgKyB0eXBlKSk7XG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIHN0b3JlLl93cmFwcGVkR2V0dGVyc1t0eXBlXSA9IGZ1bmN0aW9uIHdyYXBwZWRHZXR0ZXIgKHN0b3JlKSB7XG4gICAgcmV0dXJuIHJhd0dldHRlcihcbiAgICAgIGxvY2FsLnN0YXRlLCAvLyBsb2NhbCBzdGF0ZVxuICAgICAgbG9jYWwuZ2V0dGVycywgLy8gbG9jYWwgZ2V0dGVyc1xuICAgICAgc3RvcmUuc3RhdGUsIC8vIHJvb3Qgc3RhdGVcbiAgICAgIHN0b3JlLmdldHRlcnMgLy8gcm9vdCBnZXR0ZXJzXG4gICAgKVxuICB9O1xufVxuXG5mdW5jdGlvbiBlbmFibGVTdHJpY3RNb2RlIChzdG9yZSkge1xuICB3YXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBzdG9yZS5fc3RhdGUuZGF0YTsgfSwgZnVuY3Rpb24gKCkge1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgIGFzc2VydChzdG9yZS5fY29tbWl0dGluZywgXCJkbyBub3QgbXV0YXRlIHZ1ZXggc3RvcmUgc3RhdGUgb3V0c2lkZSBtdXRhdGlvbiBoYW5kbGVycy5cIik7XG4gICAgfVxuICB9LCB7IGRlZXA6IHRydWUsIGZsdXNoOiAnc3luYycgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE5lc3RlZFN0YXRlIChzdGF0ZSwgcGF0aCkge1xuICByZXR1cm4gcGF0aC5yZWR1Y2UoZnVuY3Rpb24gKHN0YXRlLCBrZXkpIHsgcmV0dXJuIHN0YXRlW2tleV07IH0sIHN0YXRlKVxufVxuXG5mdW5jdGlvbiB1bmlmeU9iamVjdFN0eWxlICh0eXBlLCBwYXlsb2FkLCBvcHRpb25zKSB7XG4gIGlmIChpc09iamVjdCh0eXBlKSAmJiB0eXBlLnR5cGUpIHtcbiAgICBvcHRpb25zID0gcGF5bG9hZDtcbiAgICBwYXlsb2FkID0gdHlwZTtcbiAgICB0eXBlID0gdHlwZS50eXBlO1xuICB9XG5cbiAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgIGFzc2VydCh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycsIChcImV4cGVjdHMgc3RyaW5nIGFzIHRoZSB0eXBlLCBidXQgZm91bmQgXCIgKyAodHlwZW9mIHR5cGUpICsgXCIuXCIpKTtcbiAgfVxuXG4gIHJldHVybiB7IHR5cGU6IHR5cGUsIHBheWxvYWQ6IHBheWxvYWQsIG9wdGlvbnM6IG9wdGlvbnMgfVxufVxuXG52YXIgTEFCRUxfVlVFWF9CSU5ESU5HUyA9ICd2dWV4IGJpbmRpbmdzJztcbnZhciBNVVRBVElPTlNfTEFZRVJfSUQgPSAndnVleDptdXRhdGlvbnMnO1xudmFyIEFDVElPTlNfTEFZRVJfSUQgPSAndnVleDphY3Rpb25zJztcbnZhciBJTlNQRUNUT1JfSUQgPSAndnVleCc7XG5cbnZhciBhY3Rpb25JZCA9IDA7XG5cbmZ1bmN0aW9uIGFkZERldnRvb2xzIChhcHAsIHN0b3JlKSB7XG4gIHNldHVwRGV2dG9vbHNQbHVnaW4oXG4gICAge1xuICAgICAgaWQ6ICdvcmcudnVlanMudnVleCcsXG4gICAgICBhcHA6IGFwcCxcbiAgICAgIGxhYmVsOiAnVnVleCcsXG4gICAgICBob21lcGFnZTogJ2h0dHBzOi8vbmV4dC52dWV4LnZ1ZWpzLm9yZy8nLFxuICAgICAgbG9nbzogJ2h0dHBzOi8vdnVlanMub3JnL2ltYWdlcy9pY29ucy9mYXZpY29uLTk2eDk2LnBuZycsXG4gICAgICBwYWNrYWdlTmFtZTogJ3Z1ZXgnLFxuICAgICAgY29tcG9uZW50U3RhdGVUeXBlczogW0xBQkVMX1ZVRVhfQklORElOR1NdXG4gICAgfSxcbiAgICBmdW5jdGlvbiAoYXBpKSB7XG4gICAgICBhcGkuYWRkVGltZWxpbmVMYXllcih7XG4gICAgICAgIGlkOiBNVVRBVElPTlNfTEFZRVJfSUQsXG4gICAgICAgIGxhYmVsOiAnVnVleCBNdXRhdGlvbnMnLFxuICAgICAgICBjb2xvcjogQ09MT1JfTElNRV81MDBcbiAgICAgIH0pO1xuXG4gICAgICBhcGkuYWRkVGltZWxpbmVMYXllcih7XG4gICAgICAgIGlkOiBBQ1RJT05TX0xBWUVSX0lELFxuICAgICAgICBsYWJlbDogJ1Z1ZXggQWN0aW9ucycsXG4gICAgICAgIGNvbG9yOiBDT0xPUl9MSU1FXzUwMFxuICAgICAgfSk7XG5cbiAgICAgIGFwaS5hZGRJbnNwZWN0b3Ioe1xuICAgICAgICBpZDogSU5TUEVDVE9SX0lELFxuICAgICAgICBsYWJlbDogJ1Z1ZXgnLFxuICAgICAgICBpY29uOiAnc3RvcmFnZScsXG4gICAgICAgIHRyZWVGaWx0ZXJQbGFjZWhvbGRlcjogJ0ZpbHRlciBzdG9yZXMuLi4nXG4gICAgICB9KTtcblxuICAgICAgYXBpLm9uLmdldEluc3BlY3RvclRyZWUoZnVuY3Rpb24gKHBheWxvYWQpIHtcbiAgICAgICAgaWYgKHBheWxvYWQuYXBwID09PSBhcHAgJiYgcGF5bG9hZC5pbnNwZWN0b3JJZCA9PT0gSU5TUEVDVE9SX0lEKSB7XG4gICAgICAgICAgaWYgKHBheWxvYWQuZmlsdGVyKSB7XG4gICAgICAgICAgICB2YXIgbm9kZXMgPSBbXTtcbiAgICAgICAgICAgIGZsYXR0ZW5TdG9yZUZvckluc3BlY3RvclRyZWUobm9kZXMsIHN0b3JlLl9tb2R1bGVzLnJvb3QsIHBheWxvYWQuZmlsdGVyLCAnJyk7XG4gICAgICAgICAgICBwYXlsb2FkLnJvb3ROb2RlcyA9IG5vZGVzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXlsb2FkLnJvb3ROb2RlcyA9IFtcbiAgICAgICAgICAgICAgZm9ybWF0U3RvcmVGb3JJbnNwZWN0b3JUcmVlKHN0b3JlLl9tb2R1bGVzLnJvb3QsICcnKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBhcGkub24uZ2V0SW5zcGVjdG9yU3RhdGUoZnVuY3Rpb24gKHBheWxvYWQpIHtcbiAgICAgICAgaWYgKHBheWxvYWQuYXBwID09PSBhcHAgJiYgcGF5bG9hZC5pbnNwZWN0b3JJZCA9PT0gSU5TUEVDVE9SX0lEKSB7XG4gICAgICAgICAgdmFyIG1vZHVsZVBhdGggPSBwYXlsb2FkLm5vZGVJZDtcbiAgICAgICAgICBtYWtlTG9jYWxHZXR0ZXJzKHN0b3JlLCBtb2R1bGVQYXRoKTtcbiAgICAgICAgICBwYXlsb2FkLnN0YXRlID0gZm9ybWF0U3RvcmVGb3JJbnNwZWN0b3JTdGF0ZShcbiAgICAgICAgICAgIGdldFN0b3JlTW9kdWxlKHN0b3JlLl9tb2R1bGVzLCBtb2R1bGVQYXRoKSxcbiAgICAgICAgICAgIG1vZHVsZVBhdGggPT09ICdyb290JyA/IHN0b3JlLmdldHRlcnMgOiBzdG9yZS5fbWFrZUxvY2FsR2V0dGVyc0NhY2hlLFxuICAgICAgICAgICAgbW9kdWxlUGF0aFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBhcGkub24uZWRpdEluc3BlY3RvclN0YXRlKGZ1bmN0aW9uIChwYXlsb2FkKSB7XG4gICAgICAgIGlmIChwYXlsb2FkLmFwcCA9PT0gYXBwICYmIHBheWxvYWQuaW5zcGVjdG9ySWQgPT09IElOU1BFQ1RPUl9JRCkge1xuICAgICAgICAgIHZhciBtb2R1bGVQYXRoID0gcGF5bG9hZC5ub2RlSWQ7XG4gICAgICAgICAgdmFyIHBhdGggPSBwYXlsb2FkLnBhdGg7XG4gICAgICAgICAgaWYgKG1vZHVsZVBhdGggIT09ICdyb290Jykge1xuICAgICAgICAgICAgcGF0aCA9IG1vZHVsZVBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbikuY29uY2F0KCBwYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RvcmUuX3dpdGhDb21taXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcGF5bG9hZC5zZXQoc3RvcmUuX3N0YXRlLmRhdGEsIHBhdGgsIHBheWxvYWQuc3RhdGUudmFsdWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgc3RvcmUuc3Vic2NyaWJlKGZ1bmN0aW9uIChtdXRhdGlvbiwgc3RhdGUpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB7fTtcblxuICAgICAgICBpZiAobXV0YXRpb24ucGF5bG9hZCkge1xuICAgICAgICAgIGRhdGEucGF5bG9hZCA9IG11dGF0aW9uLnBheWxvYWQ7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLnN0YXRlID0gc3RhdGU7XG5cbiAgICAgICAgYXBpLm5vdGlmeUNvbXBvbmVudFVwZGF0ZSgpO1xuICAgICAgICBhcGkuc2VuZEluc3BlY3RvclRyZWUoSU5TUEVDVE9SX0lEKTtcbiAgICAgICAgYXBpLnNlbmRJbnNwZWN0b3JTdGF0ZShJTlNQRUNUT1JfSUQpO1xuXG4gICAgICAgIGFwaS5hZGRUaW1lbGluZUV2ZW50KHtcbiAgICAgICAgICBsYXllcklkOiBNVVRBVElPTlNfTEFZRVJfSUQsXG4gICAgICAgICAgZXZlbnQ6IHtcbiAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICB0aXRsZTogbXV0YXRpb24udHlwZSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHN0b3JlLnN1YnNjcmliZUFjdGlvbih7XG4gICAgICAgIGJlZm9yZTogZnVuY3Rpb24gKGFjdGlvbiwgc3RhdGUpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IHt9O1xuICAgICAgICAgIGlmIChhY3Rpb24ucGF5bG9hZCkge1xuICAgICAgICAgICAgZGF0YS5wYXlsb2FkID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGlvbi5faWQgPSBhY3Rpb25JZCsrO1xuICAgICAgICAgIGFjdGlvbi5fdGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgZGF0YS5zdGF0ZSA9IHN0YXRlO1xuXG4gICAgICAgICAgYXBpLmFkZFRpbWVsaW5lRXZlbnQoe1xuICAgICAgICAgICAgbGF5ZXJJZDogQUNUSU9OU19MQVlFUl9JRCxcbiAgICAgICAgICAgIGV2ZW50OiB7XG4gICAgICAgICAgICAgIHRpbWU6IGFjdGlvbi5fdGltZSxcbiAgICAgICAgICAgICAgdGl0bGU6IGFjdGlvbi50eXBlLFxuICAgICAgICAgICAgICBncm91cElkOiBhY3Rpb24uX2lkLFxuICAgICAgICAgICAgICBzdWJ0aXRsZTogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBhZnRlcjogZnVuY3Rpb24gKGFjdGlvbiwgc3RhdGUpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IHt9O1xuICAgICAgICAgIHZhciBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBhY3Rpb24uX3RpbWU7XG4gICAgICAgICAgZGF0YS5kdXJhdGlvbiA9IHtcbiAgICAgICAgICAgIF9jdXN0b206IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2R1cmF0aW9uJyxcbiAgICAgICAgICAgICAgZGlzcGxheTogKGR1cmF0aW9uICsgXCJtc1wiKSxcbiAgICAgICAgICAgICAgdG9vbHRpcDogJ0FjdGlvbiBkdXJhdGlvbicsXG4gICAgICAgICAgICAgIHZhbHVlOiBkdXJhdGlvblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkKSB7XG4gICAgICAgICAgICBkYXRhLnBheWxvYWQgPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGF0YS5zdGF0ZSA9IHN0YXRlO1xuXG4gICAgICAgICAgYXBpLmFkZFRpbWVsaW5lRXZlbnQoe1xuICAgICAgICAgICAgbGF5ZXJJZDogQUNUSU9OU19MQVlFUl9JRCxcbiAgICAgICAgICAgIGV2ZW50OiB7XG4gICAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICAgIHRpdGxlOiBhY3Rpb24udHlwZSxcbiAgICAgICAgICAgICAgZ3JvdXBJZDogYWN0aW9uLl9pZCxcbiAgICAgICAgICAgICAgc3VidGl0bGU6ICdlbmQnLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgKTtcbn1cblxuLy8gZXh0cmFjdGVkIGZyb20gdGFpbHdpbmQgcGFsZXR0ZVxudmFyIENPTE9SX0xJTUVfNTAwID0gMHg4NGNjMTY7XG52YXIgQ09MT1JfREFSSyA9IDB4NjY2NjY2O1xudmFyIENPTE9SX1dISVRFID0gMHhmZmZmZmY7XG5cbnZhciBUQUdfTkFNRVNQQUNFRCA9IHtcbiAgbGFiZWw6ICduYW1lc3BhY2VkJyxcbiAgdGV4dENvbG9yOiBDT0xPUl9XSElURSxcbiAgYmFja2dyb3VuZENvbG9yOiBDT0xPUl9EQVJLXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3ROYW1lRnJvbVBhdGggKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGggJiYgcGF0aCAhPT0gJ3Jvb3QnID8gcGF0aC5zcGxpdCgnLycpLnNsaWNlKC0yLCAtMSlbMF0gOiAnUm9vdCdcbn1cblxuLyoqXG4gKiBAcGFyYW0geyp9IG1vZHVsZVxuICogQHJldHVybiB7aW1wb3J0KCdAdnVlL2RldnRvb2xzLWFwaScpLkN1c3RvbUluc3BlY3Rvck5vZGV9XG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFN0b3JlRm9ySW5zcGVjdG9yVHJlZSAobW9kdWxlLCBwYXRoKSB7XG4gIHJldHVybiB7XG4gICAgaWQ6IHBhdGggfHwgJ3Jvb3QnLFxuICAgIC8vIGFsbCBtb2R1bGVzIGVuZCB3aXRoIGEgYC9gLCB3ZSB3YW50IHRoZSBsYXN0IHNlZ21lbnQgb25seVxuICAgIC8vIGNhcnQvIC0+IGNhcnRcbiAgICAvLyBuZXN0ZWQvY2FydC8gLT4gY2FydFxuICAgIGxhYmVsOiBleHRyYWN0TmFtZUZyb21QYXRoKHBhdGgpLFxuICAgIHRhZ3M6IG1vZHVsZS5uYW1lc3BhY2VkID8gW1RBR19OQU1FU1BBQ0VEXSA6IFtdLFxuICAgIGNoaWxkcmVuOiBPYmplY3Qua2V5cyhtb2R1bGUuX2NoaWxkcmVuKS5tYXAoZnVuY3Rpb24gKG1vZHVsZU5hbWUpIHsgcmV0dXJuIGZvcm1hdFN0b3JlRm9ySW5zcGVjdG9yVHJlZShcbiAgICAgICAgbW9kdWxlLl9jaGlsZHJlblttb2R1bGVOYW1lXSxcbiAgICAgICAgcGF0aCArIG1vZHVsZU5hbWUgKyAnLydcbiAgICAgICk7IH1cbiAgICApXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnQHZ1ZS9kZXZ0b29scy1hcGknKS5DdXN0b21JbnNwZWN0b3JOb2RlW119IHJlc3VsdFxuICogQHBhcmFtIHsqfSBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWx0ZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5TdG9yZUZvckluc3BlY3RvclRyZWUgKHJlc3VsdCwgbW9kdWxlLCBmaWx0ZXIsIHBhdGgpIHtcbiAgaWYgKHBhdGguaW5jbHVkZXMoZmlsdGVyKSkge1xuICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgIGlkOiBwYXRoIHx8ICdyb290JyxcbiAgICAgIGxhYmVsOiBwYXRoLmVuZHNXaXRoKCcvJykgPyBwYXRoLnNsaWNlKDAsIHBhdGgubGVuZ3RoIC0gMSkgOiBwYXRoIHx8ICdSb290JyxcbiAgICAgIHRhZ3M6IG1vZHVsZS5uYW1lc3BhY2VkID8gW1RBR19OQU1FU1BBQ0VEXSA6IFtdXG4gICAgfSk7XG4gIH1cbiAgT2JqZWN0LmtleXMobW9kdWxlLl9jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbiAobW9kdWxlTmFtZSkge1xuICAgIGZsYXR0ZW5TdG9yZUZvckluc3BlY3RvclRyZWUocmVzdWx0LCBtb2R1bGUuX2NoaWxkcmVuW21vZHVsZU5hbWVdLCBmaWx0ZXIsIHBhdGggKyBtb2R1bGVOYW1lICsgJy8nKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHsqfSBtb2R1bGVcbiAqIEByZXR1cm4ge2ltcG9ydCgnQHZ1ZS9kZXZ0b29scy1hcGknKS5DdXN0b21JbnNwZWN0b3JTdGF0ZX1cbiAqL1xuZnVuY3Rpb24gZm9ybWF0U3RvcmVGb3JJbnNwZWN0b3JTdGF0ZSAobW9kdWxlLCBnZXR0ZXJzLCBwYXRoKSB7XG4gIGdldHRlcnMgPSBwYXRoID09PSAncm9vdCcgPyBnZXR0ZXJzIDogZ2V0dGVyc1twYXRoXTtcbiAgdmFyIGdldHRlcnNLZXlzID0gT2JqZWN0LmtleXMoZ2V0dGVycyk7XG4gIHZhciBzdG9yZVN0YXRlID0ge1xuICAgIHN0YXRlOiBPYmplY3Qua2V5cyhtb2R1bGUuc3RhdGUpLm1hcChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiAoe1xuICAgICAga2V5OiBrZXksXG4gICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBtb2R1bGUuc3RhdGVba2V5XVxuICAgIH0pOyB9KVxuICB9O1xuXG4gIGlmIChnZXR0ZXJzS2V5cy5sZW5ndGgpIHtcbiAgICB2YXIgdHJlZSA9IHRyYW5zZm9ybVBhdGhzVG9PYmplY3RUcmVlKGdldHRlcnMpO1xuICAgIHN0b3JlU3RhdGUuZ2V0dGVycyA9IE9iamVjdC5rZXlzKHRyZWUpLm1hcChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiAoe1xuICAgICAga2V5OiBrZXkuZW5kc1dpdGgoJy8nKSA/IGV4dHJhY3ROYW1lRnJvbVBhdGgoa2V5KSA6IGtleSxcbiAgICAgIGVkaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBjYW5UaHJvdyhmdW5jdGlvbiAoKSB7IHJldHVybiB0cmVlW2tleV07IH0pXG4gICAgfSk7IH0pO1xuICB9XG5cbiAgcmV0dXJuIHN0b3JlU3RhdGVcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtUGF0aHNUb09iamVjdFRyZWUgKGdldHRlcnMpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBPYmplY3Qua2V5cyhnZXR0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcGF0aCA9IGtleS5zcGxpdCgnLycpO1xuICAgIGlmIChwYXRoLmxlbmd0aCA+IDEpIHtcbiAgICAgIHZhciB0YXJnZXQgPSByZXN1bHQ7XG4gICAgICB2YXIgbGVhZktleSA9IHBhdGgucG9wKCk7XG4gICAgICBwYXRoLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgaWYgKCF0YXJnZXRbcF0pIHtcbiAgICAgICAgICB0YXJnZXRbcF0gPSB7XG4gICAgICAgICAgICBfY3VzdG9tOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiB7fSxcbiAgICAgICAgICAgICAgZGlzcGxheTogcCxcbiAgICAgICAgICAgICAgdG9vbHRpcDogJ01vZHVsZScsXG4gICAgICAgICAgICAgIGFic3RyYWN0OiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSB0YXJnZXRbcF0uX2N1c3RvbS52YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgdGFyZ2V0W2xlYWZLZXldID0gY2FuVGhyb3coZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2V0dGVyc1trZXldOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSBjYW5UaHJvdyhmdW5jdGlvbiAoKSB7IHJldHVybiBnZXR0ZXJzW2tleV07IH0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gZ2V0U3RvcmVNb2R1bGUgKG1vZHVsZU1hcCwgcGF0aCkge1xuICB2YXIgbmFtZXMgPSBwYXRoLnNwbGl0KCcvJykuZmlsdGVyKGZ1bmN0aW9uIChuKSB7IHJldHVybiBuOyB9KTtcbiAgcmV0dXJuIG5hbWVzLnJlZHVjZShcbiAgICBmdW5jdGlvbiAobW9kdWxlLCBtb2R1bGVOYW1lLCBpKSB7XG4gICAgICB2YXIgY2hpbGQgPSBtb2R1bGVbbW9kdWxlTmFtZV07XG4gICAgICBpZiAoIWNoaWxkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigoXCJNaXNzaW5nIG1vZHVsZSBcXFwiXCIgKyBtb2R1bGVOYW1lICsgXCJcXFwiIGZvciBwYXRoIFxcXCJcIiArIHBhdGggKyBcIlxcXCIuXCIpKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGkgPT09IG5hbWVzLmxlbmd0aCAtIDEgPyBjaGlsZCA6IGNoaWxkLl9jaGlsZHJlblxuICAgIH0sXG4gICAgcGF0aCA9PT0gJ3Jvb3QnID8gbW9kdWxlTWFwIDogbW9kdWxlTWFwLnJvb3QuX2NoaWxkcmVuXG4gIClcbn1cblxuZnVuY3Rpb24gY2FuVGhyb3cgKGNiKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGNiKClcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBlXG4gIH1cbn1cblxuLy8gQmFzZSBkYXRhIHN0cnVjdCBmb3Igc3RvcmUncyBtb2R1bGUsIHBhY2thZ2Ugd2l0aCBzb21lIGF0dHJpYnV0ZSBhbmQgbWV0aG9kXG52YXIgTW9kdWxlID0gZnVuY3Rpb24gTW9kdWxlIChyYXdNb2R1bGUsIHJ1bnRpbWUpIHtcbiAgdGhpcy5ydW50aW1lID0gcnVudGltZTtcbiAgLy8gU3RvcmUgc29tZSBjaGlsZHJlbiBpdGVtXG4gIHRoaXMuX2NoaWxkcmVuID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgLy8gU3RvcmUgdGhlIG9yaWdpbiBtb2R1bGUgb2JqZWN0IHdoaWNoIHBhc3NlZCBieSBwcm9ncmFtbWVyXG4gIHRoaXMuX3Jhd01vZHVsZSA9IHJhd01vZHVsZTtcbiAgdmFyIHJhd1N0YXRlID0gcmF3TW9kdWxlLnN0YXRlO1xuXG4gIC8vIFN0b3JlIHRoZSBvcmlnaW4gbW9kdWxlJ3Mgc3RhdGVcbiAgdGhpcy5zdGF0ZSA9ICh0eXBlb2YgcmF3U3RhdGUgPT09ICdmdW5jdGlvbicgPyByYXdTdGF0ZSgpIDogcmF3U3RhdGUpIHx8IHt9O1xufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyQxID0geyBuYW1lc3BhY2VkOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbnByb3RvdHlwZUFjY2Vzc29ycyQxLm5hbWVzcGFjZWQuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gISF0aGlzLl9yYXdNb2R1bGUubmFtZXNwYWNlZFxufTtcblxuTW9kdWxlLnByb3RvdHlwZS5hZGRDaGlsZCA9IGZ1bmN0aW9uIGFkZENoaWxkIChrZXksIG1vZHVsZSkge1xuICB0aGlzLl9jaGlsZHJlbltrZXldID0gbW9kdWxlO1xufTtcblxuTW9kdWxlLnByb3RvdHlwZS5yZW1vdmVDaGlsZCA9IGZ1bmN0aW9uIHJlbW92ZUNoaWxkIChrZXkpIHtcbiAgZGVsZXRlIHRoaXMuX2NoaWxkcmVuW2tleV07XG59O1xuXG5Nb2R1bGUucHJvdG90eXBlLmdldENoaWxkID0gZnVuY3Rpb24gZ2V0Q2hpbGQgKGtleSkge1xuICByZXR1cm4gdGhpcy5fY2hpbGRyZW5ba2V5XVxufTtcblxuTW9kdWxlLnByb3RvdHlwZS5oYXNDaGlsZCA9IGZ1bmN0aW9uIGhhc0NoaWxkIChrZXkpIHtcbiAgcmV0dXJuIGtleSBpbiB0aGlzLl9jaGlsZHJlblxufTtcblxuTW9kdWxlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKHJhd01vZHVsZSkge1xuICB0aGlzLl9yYXdNb2R1bGUubmFtZXNwYWNlZCA9IHJhd01vZHVsZS5uYW1lc3BhY2VkO1xuICBpZiAocmF3TW9kdWxlLmFjdGlvbnMpIHtcbiAgICB0aGlzLl9yYXdNb2R1bGUuYWN0aW9ucyA9IHJhd01vZHVsZS5hY3Rpb25zO1xuICB9XG4gIGlmIChyYXdNb2R1bGUubXV0YXRpb25zKSB7XG4gICAgdGhpcy5fcmF3TW9kdWxlLm11dGF0aW9ucyA9IHJhd01vZHVsZS5tdXRhdGlvbnM7XG4gIH1cbiAgaWYgKHJhd01vZHVsZS5nZXR0ZXJzKSB7XG4gICAgdGhpcy5fcmF3TW9kdWxlLmdldHRlcnMgPSByYXdNb2R1bGUuZ2V0dGVycztcbiAgfVxufTtcblxuTW9kdWxlLnByb3RvdHlwZS5mb3JFYWNoQ2hpbGQgPSBmdW5jdGlvbiBmb3JFYWNoQ2hpbGQgKGZuKSB7XG4gIGZvckVhY2hWYWx1ZSh0aGlzLl9jaGlsZHJlbiwgZm4pO1xufTtcblxuTW9kdWxlLnByb3RvdHlwZS5mb3JFYWNoR2V0dGVyID0gZnVuY3Rpb24gZm9yRWFjaEdldHRlciAoZm4pIHtcbiAgaWYgKHRoaXMuX3Jhd01vZHVsZS5nZXR0ZXJzKSB7XG4gICAgZm9yRWFjaFZhbHVlKHRoaXMuX3Jhd01vZHVsZS5nZXR0ZXJzLCBmbik7XG4gIH1cbn07XG5cbk1vZHVsZS5wcm90b3R5cGUuZm9yRWFjaEFjdGlvbiA9IGZ1bmN0aW9uIGZvckVhY2hBY3Rpb24gKGZuKSB7XG4gIGlmICh0aGlzLl9yYXdNb2R1bGUuYWN0aW9ucykge1xuICAgIGZvckVhY2hWYWx1ZSh0aGlzLl9yYXdNb2R1bGUuYWN0aW9ucywgZm4pO1xuICB9XG59O1xuXG5Nb2R1bGUucHJvdG90eXBlLmZvckVhY2hNdXRhdGlvbiA9IGZ1bmN0aW9uIGZvckVhY2hNdXRhdGlvbiAoZm4pIHtcbiAgaWYgKHRoaXMuX3Jhd01vZHVsZS5tdXRhdGlvbnMpIHtcbiAgICBmb3JFYWNoVmFsdWUodGhpcy5fcmF3TW9kdWxlLm11dGF0aW9ucywgZm4pO1xuICB9XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggTW9kdWxlLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzJDEgKTtcblxudmFyIE1vZHVsZUNvbGxlY3Rpb24gPSBmdW5jdGlvbiBNb2R1bGVDb2xsZWN0aW9uIChyYXdSb290TW9kdWxlKSB7XG4gIC8vIHJlZ2lzdGVyIHJvb3QgbW9kdWxlIChWdWV4LlN0b3JlIG9wdGlvbnMpXG4gIHRoaXMucmVnaXN0ZXIoW10sIHJhd1Jvb3RNb2R1bGUsIGZhbHNlKTtcbn07XG5cbk1vZHVsZUNvbGxlY3Rpb24ucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAocGF0aCkge1xuICByZXR1cm4gcGF0aC5yZWR1Y2UoZnVuY3Rpb24gKG1vZHVsZSwga2V5KSB7XG4gICAgcmV0dXJuIG1vZHVsZS5nZXRDaGlsZChrZXkpXG4gIH0sIHRoaXMucm9vdClcbn07XG5cbk1vZHVsZUNvbGxlY3Rpb24ucHJvdG90eXBlLmdldE5hbWVzcGFjZSA9IGZ1bmN0aW9uIGdldE5hbWVzcGFjZSAocGF0aCkge1xuICB2YXIgbW9kdWxlID0gdGhpcy5yb290O1xuICByZXR1cm4gcGF0aC5yZWR1Y2UoZnVuY3Rpb24gKG5hbWVzcGFjZSwga2V5KSB7XG4gICAgbW9kdWxlID0gbW9kdWxlLmdldENoaWxkKGtleSk7XG4gICAgcmV0dXJuIG5hbWVzcGFjZSArIChtb2R1bGUubmFtZXNwYWNlZCA/IGtleSArICcvJyA6ICcnKVxuICB9LCAnJylcbn07XG5cbk1vZHVsZUNvbGxlY3Rpb24ucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSQxIChyYXdSb290TW9kdWxlKSB7XG4gIHVwZGF0ZShbXSwgdGhpcy5yb290LCByYXdSb290TW9kdWxlKTtcbn07XG5cbk1vZHVsZUNvbGxlY3Rpb24ucHJvdG90eXBlLnJlZ2lzdGVyID0gZnVuY3Rpb24gcmVnaXN0ZXIgKHBhdGgsIHJhd01vZHVsZSwgcnVudGltZSkge1xuICAgIHZhciB0aGlzJDEkMSA9IHRoaXM7XG4gICAgaWYgKCBydW50aW1lID09PSB2b2lkIDAgKSBydW50aW1lID0gdHJ1ZTtcblxuICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgYXNzZXJ0UmF3TW9kdWxlKHBhdGgsIHJhd01vZHVsZSk7XG4gIH1cblxuICB2YXIgbmV3TW9kdWxlID0gbmV3IE1vZHVsZShyYXdNb2R1bGUsIHJ1bnRpbWUpO1xuICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICB0aGlzLnJvb3QgPSBuZXdNb2R1bGU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMuZ2V0KHBhdGguc2xpY2UoMCwgLTEpKTtcbiAgICBwYXJlbnQuYWRkQ2hpbGQocGF0aFtwYXRoLmxlbmd0aCAtIDFdLCBuZXdNb2R1bGUpO1xuICB9XG5cbiAgLy8gcmVnaXN0ZXIgbmVzdGVkIG1vZHVsZXNcbiAgaWYgKHJhd01vZHVsZS5tb2R1bGVzKSB7XG4gICAgZm9yRWFjaFZhbHVlKHJhd01vZHVsZS5tb2R1bGVzLCBmdW5jdGlvbiAocmF3Q2hpbGRNb2R1bGUsIGtleSkge1xuICAgICAgdGhpcyQxJDEucmVnaXN0ZXIocGF0aC5jb25jYXQoa2V5KSwgcmF3Q2hpbGRNb2R1bGUsIHJ1bnRpbWUpO1xuICAgIH0pO1xuICB9XG59O1xuXG5Nb2R1bGVDb2xsZWN0aW9uLnByb3RvdHlwZS51bnJlZ2lzdGVyID0gZnVuY3Rpb24gdW5yZWdpc3RlciAocGF0aCkge1xuICB2YXIgcGFyZW50ID0gdGhpcy5nZXQocGF0aC5zbGljZSgwLCAtMSkpO1xuICB2YXIga2V5ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICB2YXIgY2hpbGQgPSBwYXJlbnQuZ2V0Q2hpbGQoa2V5KTtcblxuICBpZiAoIWNoaWxkKSB7XG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIlt2dWV4XSB0cnlpbmcgdG8gdW5yZWdpc3RlciBtb2R1bGUgJ1wiICsga2V5ICsgXCInLCB3aGljaCBpcyBcIiArXG4gICAgICAgIFwibm90IHJlZ2lzdGVyZWRcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoIWNoaWxkLnJ1bnRpbWUpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHBhcmVudC5yZW1vdmVDaGlsZChrZXkpO1xufTtcblxuTW9kdWxlQ29sbGVjdGlvbi5wcm90b3R5cGUuaXNSZWdpc3RlcmVkID0gZnVuY3Rpb24gaXNSZWdpc3RlcmVkIChwYXRoKSB7XG4gIHZhciBwYXJlbnQgPSB0aGlzLmdldChwYXRoLnNsaWNlKDAsIC0xKSk7XG4gIHZhciBrZXkgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG5cbiAgaWYgKHBhcmVudCkge1xuICAgIHJldHVybiBwYXJlbnQuaGFzQ2hpbGQoa2V5KVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG5mdW5jdGlvbiB1cGRhdGUgKHBhdGgsIHRhcmdldE1vZHVsZSwgbmV3TW9kdWxlKSB7XG4gIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICBhc3NlcnRSYXdNb2R1bGUocGF0aCwgbmV3TW9kdWxlKTtcbiAgfVxuXG4gIC8vIHVwZGF0ZSB0YXJnZXQgbW9kdWxlXG4gIHRhcmdldE1vZHVsZS51cGRhdGUobmV3TW9kdWxlKTtcblxuICAvLyB1cGRhdGUgbmVzdGVkIG1vZHVsZXNcbiAgaWYgKG5ld01vZHVsZS5tb2R1bGVzKSB7XG4gICAgZm9yICh2YXIga2V5IGluIG5ld01vZHVsZS5tb2R1bGVzKSB7XG4gICAgICBpZiAoIXRhcmdldE1vZHVsZS5nZXRDaGlsZChrZXkpKSB7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcIlt2dWV4XSB0cnlpbmcgdG8gYWRkIGEgbmV3IG1vZHVsZSAnXCIgKyBrZXkgKyBcIicgb24gaG90IHJlbG9hZGluZywgXCIgK1xuICAgICAgICAgICAgJ21hbnVhbCByZWxvYWQgaXMgbmVlZGVkJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB1cGRhdGUoXG4gICAgICAgIHBhdGguY29uY2F0KGtleSksXG4gICAgICAgIHRhcmdldE1vZHVsZS5nZXRDaGlsZChrZXkpLFxuICAgICAgICBuZXdNb2R1bGUubW9kdWxlc1trZXldXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZnVuY3Rpb25Bc3NlcnQgPSB7XG4gIGFzc2VydDogZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7IH0sXG4gIGV4cGVjdGVkOiAnZnVuY3Rpb24nXG59O1xuXG52YXIgb2JqZWN0QXNzZXJ0ID0ge1xuICBhc3NlcnQ6IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nIHx8XG4gICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlLmhhbmRsZXIgPT09ICdmdW5jdGlvbicpOyB9LFxuICBleHBlY3RlZDogJ2Z1bmN0aW9uIG9yIG9iamVjdCB3aXRoIFwiaGFuZGxlclwiIGZ1bmN0aW9uJ1xufTtcblxudmFyIGFzc2VydFR5cGVzID0ge1xuICBnZXR0ZXJzOiBmdW5jdGlvbkFzc2VydCxcbiAgbXV0YXRpb25zOiBmdW5jdGlvbkFzc2VydCxcbiAgYWN0aW9uczogb2JqZWN0QXNzZXJ0XG59O1xuXG5mdW5jdGlvbiBhc3NlcnRSYXdNb2R1bGUgKHBhdGgsIHJhd01vZHVsZSkge1xuICBPYmplY3Qua2V5cyhhc3NlcnRUeXBlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFyYXdNb2R1bGVba2V5XSkgeyByZXR1cm4gfVxuXG4gICAgdmFyIGFzc2VydE9wdGlvbnMgPSBhc3NlcnRUeXBlc1trZXldO1xuXG4gICAgZm9yRWFjaFZhbHVlKHJhd01vZHVsZVtrZXldLCBmdW5jdGlvbiAodmFsdWUsIHR5cGUpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgYXNzZXJ0T3B0aW9ucy5hc3NlcnQodmFsdWUpLFxuICAgICAgICBtYWtlQXNzZXJ0aW9uTWVzc2FnZShwYXRoLCBrZXksIHR5cGUsIHZhbHVlLCBhc3NlcnRPcHRpb25zLmV4cGVjdGVkKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1ha2VBc3NlcnRpb25NZXNzYWdlIChwYXRoLCBrZXksIHR5cGUsIHZhbHVlLCBleHBlY3RlZCkge1xuICB2YXIgYnVmID0ga2V5ICsgXCIgc2hvdWxkIGJlIFwiICsgZXhwZWN0ZWQgKyBcIiBidXQgXFxcIlwiICsga2V5ICsgXCIuXCIgKyB0eXBlICsgXCJcXFwiXCI7XG4gIGlmIChwYXRoLmxlbmd0aCA+IDApIHtcbiAgICBidWYgKz0gXCIgaW4gbW9kdWxlIFxcXCJcIiArIChwYXRoLmpvaW4oJy4nKSkgKyBcIlxcXCJcIjtcbiAgfVxuICBidWYgKz0gXCIgaXMgXCIgKyAoSlNPTi5zdHJpbmdpZnkodmFsdWUpKSArIFwiLlwiO1xuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgU3RvcmUob3B0aW9ucylcbn1cblxudmFyIFN0b3JlID0gZnVuY3Rpb24gU3RvcmUgKG9wdGlvbnMpIHtcbiAgdmFyIHRoaXMkMSQxID0gdGhpcztcbiAgaWYgKCBvcHRpb25zID09PSB2b2lkIDAgKSBvcHRpb25zID0ge307XG5cbiAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgIGFzc2VydCh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcsIFwidnVleCByZXF1aXJlcyBhIFByb21pc2UgcG9seWZpbGwgaW4gdGhpcyBicm93c2VyLlwiKTtcbiAgICBhc3NlcnQodGhpcyBpbnN0YW5jZW9mIFN0b3JlLCBcInN0b3JlIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvci5cIik7XG4gIH1cblxuICB2YXIgcGx1Z2lucyA9IG9wdGlvbnMucGx1Z2luczsgaWYgKCBwbHVnaW5zID09PSB2b2lkIDAgKSBwbHVnaW5zID0gW107XG4gIHZhciBzdHJpY3QgPSBvcHRpb25zLnN0cmljdDsgaWYgKCBzdHJpY3QgPT09IHZvaWQgMCApIHN0cmljdCA9IGZhbHNlO1xuICB2YXIgZGV2dG9vbHMgPSBvcHRpb25zLmRldnRvb2xzO1xuXG4gIC8vIHN0b3JlIGludGVybmFsIHN0YXRlXG4gIHRoaXMuX2NvbW1pdHRpbmcgPSBmYWxzZTtcbiAgdGhpcy5fYWN0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHRoaXMuX2FjdGlvblN1YnNjcmliZXJzID0gW107XG4gIHRoaXMuX211dGF0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHRoaXMuX3dyYXBwZWRHZXR0ZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdGhpcy5fbW9kdWxlcyA9IG5ldyBNb2R1bGVDb2xsZWN0aW9uKG9wdGlvbnMpO1xuICB0aGlzLl9tb2R1bGVzTmFtZXNwYWNlTWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdGhpcy5fc3Vic2NyaWJlcnMgPSBbXTtcbiAgdGhpcy5fbWFrZUxvY2FsR2V0dGVyc0NhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAvLyBFZmZlY3RTY29wZSBpbnN0YW5jZS4gd2hlbiByZWdpc3RlcmluZyBuZXcgZ2V0dGVycywgd2Ugd3JhcCB0aGVtIGluc2lkZVxuICAvLyBFZmZlY3RTY29wZSBzbyB0aGF0IGdldHRlcnMgKGNvbXB1dGVkKSB3b3VsZCBub3QgYmUgZGVzdHJveWVkIG9uXG4gIC8vIGNvbXBvbmVudCB1bm1vdW50LlxuICB0aGlzLl9zY29wZSA9IG51bGw7XG5cbiAgdGhpcy5fZGV2dG9vbHMgPSBkZXZ0b29scztcblxuICAvLyBiaW5kIGNvbW1pdCBhbmQgZGlzcGF0Y2ggdG8gc2VsZlxuICB2YXIgc3RvcmUgPSB0aGlzO1xuICB2YXIgcmVmID0gdGhpcztcbiAgdmFyIGRpc3BhdGNoID0gcmVmLmRpc3BhdGNoO1xuICB2YXIgY29tbWl0ID0gcmVmLmNvbW1pdDtcbiAgdGhpcy5kaXNwYXRjaCA9IGZ1bmN0aW9uIGJvdW5kRGlzcGF0Y2ggKHR5cGUsIHBheWxvYWQpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2guY2FsbChzdG9yZSwgdHlwZSwgcGF5bG9hZClcbiAgfTtcbiAgdGhpcy5jb21taXQgPSBmdW5jdGlvbiBib3VuZENvbW1pdCAodHlwZSwgcGF5bG9hZCwgb3B0aW9ucykge1xuICAgIHJldHVybiBjb21taXQuY2FsbChzdG9yZSwgdHlwZSwgcGF5bG9hZCwgb3B0aW9ucylcbiAgfTtcblxuICAvLyBzdHJpY3QgbW9kZVxuICB0aGlzLnN0cmljdCA9IHN0cmljdDtcblxuICB2YXIgc3RhdGUgPSB0aGlzLl9tb2R1bGVzLnJvb3Quc3RhdGU7XG5cbiAgLy8gaW5pdCByb290IG1vZHVsZS5cbiAgLy8gdGhpcyBhbHNvIHJlY3Vyc2l2ZWx5IHJlZ2lzdGVycyBhbGwgc3ViLW1vZHVsZXNcbiAgLy8gYW5kIGNvbGxlY3RzIGFsbCBtb2R1bGUgZ2V0dGVycyBpbnNpZGUgdGhpcy5fd3JhcHBlZEdldHRlcnNcbiAgaW5zdGFsbE1vZHVsZSh0aGlzLCBzdGF0ZSwgW10sIHRoaXMuX21vZHVsZXMucm9vdCk7XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgc3RvcmUgc3RhdGUsIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgcmVhY3Rpdml0eVxuICAvLyAoYWxzbyByZWdpc3RlcnMgX3dyYXBwZWRHZXR0ZXJzIGFzIGNvbXB1dGVkIHByb3BlcnRpZXMpXG4gIHJlc2V0U3RvcmVTdGF0ZSh0aGlzLCBzdGF0ZSk7XG5cbiAgLy8gYXBwbHkgcGx1Z2luc1xuICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikgeyByZXR1cm4gcGx1Z2luKHRoaXMkMSQxKTsgfSk7XG59O1xuXG52YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBzdGF0ZTogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG5TdG9yZS5wcm90b3R5cGUuaW5zdGFsbCA9IGZ1bmN0aW9uIGluc3RhbGwgKGFwcCwgaW5qZWN0S2V5KSB7XG4gIGFwcC5wcm92aWRlKGluamVjdEtleSB8fCBzdG9yZUtleSwgdGhpcyk7XG4gIGFwcC5jb25maWcuZ2xvYmFsUHJvcGVydGllcy4kc3RvcmUgPSB0aGlzO1xuXG4gIHZhciB1c2VEZXZ0b29scyA9IHRoaXMuX2RldnRvb2xzICE9PSB1bmRlZmluZWRcbiAgICA/IHRoaXMuX2RldnRvb2xzXG4gICAgOiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fO1xuXG4gIGlmICh1c2VEZXZ0b29scykge1xuICAgIGFkZERldnRvb2xzKGFwcCwgdGhpcyk7XG4gIH1cbn07XG5cbnByb3RvdHlwZUFjY2Vzc29ycy5zdGF0ZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9zdGF0ZS5kYXRhXG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMuc3RhdGUuc2V0ID0gZnVuY3Rpb24gKHYpIHtcbiAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgIGFzc2VydChmYWxzZSwgXCJ1c2Ugc3RvcmUucmVwbGFjZVN0YXRlKCkgdG8gZXhwbGljaXQgcmVwbGFjZSBzdG9yZSBzdGF0ZS5cIik7XG4gIH1cbn07XG5cblN0b3JlLnByb3RvdHlwZS5jb21taXQgPSBmdW5jdGlvbiBjb21taXQgKF90eXBlLCBfcGF5bG9hZCwgX29wdGlvbnMpIHtcbiAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gIC8vIGNoZWNrIG9iamVjdC1zdHlsZSBjb21taXRcbiAgdmFyIHJlZiA9IHVuaWZ5T2JqZWN0U3R5bGUoX3R5cGUsIF9wYXlsb2FkLCBfb3B0aW9ucyk7XG4gICAgdmFyIHR5cGUgPSByZWYudHlwZTtcbiAgICB2YXIgcGF5bG9hZCA9IHJlZi5wYXlsb2FkO1xuICAgIHZhciBvcHRpb25zID0gcmVmLm9wdGlvbnM7XG5cbiAgdmFyIG11dGF0aW9uID0geyB0eXBlOiB0eXBlLCBwYXlsb2FkOiBwYXlsb2FkIH07XG4gIHZhciBlbnRyeSA9IHRoaXMuX211dGF0aW9uc1t0eXBlXTtcbiAgaWYgKCFlbnRyeSkge1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoKFwiW3Z1ZXhdIHVua25vd24gbXV0YXRpb24gdHlwZTogXCIgKyB0eXBlKSk7XG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIHRoaXMuX3dpdGhDb21taXQoZnVuY3Rpb24gKCkge1xuICAgIGVudHJ5LmZvckVhY2goZnVuY3Rpb24gY29tbWl0SXRlcmF0b3IgKGhhbmRsZXIpIHtcbiAgICAgIGhhbmRsZXIocGF5bG9hZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHRoaXMuX3N1YnNjcmliZXJzXG4gICAgLnNsaWNlKCkgLy8gc2hhbGxvdyBjb3B5IHRvIHByZXZlbnQgaXRlcmF0b3IgaW52YWxpZGF0aW9uIGlmIHN1YnNjcmliZXIgc3luY2hyb25vdXNseSBjYWxscyB1bnN1YnNjcmliZVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChzdWIpIHsgcmV0dXJuIHN1YihtdXRhdGlvbiwgdGhpcyQxJDEuc3RhdGUpOyB9KTtcblxuICBpZiAoXG4gICAgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmXG4gICAgb3B0aW9ucyAmJiBvcHRpb25zLnNpbGVudFxuICApIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIlt2dWV4XSBtdXRhdGlvbiB0eXBlOiBcIiArIHR5cGUgKyBcIi4gU2lsZW50IG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLiBcIiArXG4gICAgICAnVXNlIHRoZSBmaWx0ZXIgZnVuY3Rpb25hbGl0eSBpbiB0aGUgdnVlLWRldnRvb2xzJ1xuICAgICk7XG4gIH1cbn07XG5cblN0b3JlLnByb3RvdHlwZS5kaXNwYXRjaCA9IGZ1bmN0aW9uIGRpc3BhdGNoIChfdHlwZSwgX3BheWxvYWQpIHtcbiAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gIC8vIGNoZWNrIG9iamVjdC1zdHlsZSBkaXNwYXRjaFxuICB2YXIgcmVmID0gdW5pZnlPYmplY3RTdHlsZShfdHlwZSwgX3BheWxvYWQpO1xuICAgIHZhciB0eXBlID0gcmVmLnR5cGU7XG4gICAgdmFyIHBheWxvYWQgPSByZWYucGF5bG9hZDtcblxuICB2YXIgYWN0aW9uID0geyB0eXBlOiB0eXBlLCBwYXlsb2FkOiBwYXlsb2FkIH07XG4gIHZhciBlbnRyeSA9IHRoaXMuX2FjdGlvbnNbdHlwZV07XG4gIGlmICghZW50cnkpIHtcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKChcIlt2dWV4XSB1bmtub3duIGFjdGlvbiB0eXBlOiBcIiArIHR5cGUpKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICB0cnkge1xuICAgIHRoaXMuX2FjdGlvblN1YnNjcmliZXJzXG4gICAgICAuc2xpY2UoKSAvLyBzaGFsbG93IGNvcHkgdG8gcHJldmVudCBpdGVyYXRvciBpbnZhbGlkYXRpb24gaWYgc3Vic2NyaWJlciBzeW5jaHJvbm91c2x5IGNhbGxzIHVuc3Vic2NyaWJlXG4gICAgICAuZmlsdGVyKGZ1bmN0aW9uIChzdWIpIHsgcmV0dXJuIHN1Yi5iZWZvcmU7IH0pXG4gICAgICAuZm9yRWFjaChmdW5jdGlvbiAoc3ViKSB7IHJldHVybiBzdWIuYmVmb3JlKGFjdGlvbiwgdGhpcyQxJDEuc3RhdGUpOyB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIlt2dWV4XSBlcnJvciBpbiBiZWZvcmUgYWN0aW9uIHN1YnNjcmliZXJzOiBcIik7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZXN1bHQgPSBlbnRyeS5sZW5ndGggPiAxXG4gICAgPyBQcm9taXNlLmFsbChlbnRyeS5tYXAoZnVuY3Rpb24gKGhhbmRsZXIpIHsgcmV0dXJuIGhhbmRsZXIocGF5bG9hZCk7IH0pKVxuICAgIDogZW50cnlbMF0ocGF5bG9hZCk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZXN1bHQudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzJDEkMS5fYWN0aW9uU3Vic2NyaWJlcnNcbiAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChzdWIpIHsgcmV0dXJuIHN1Yi5hZnRlcjsgfSlcbiAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoc3ViKSB7IHJldHVybiBzdWIuYWZ0ZXIoYWN0aW9uLCB0aGlzJDEkMS5zdGF0ZSk7IH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW3Z1ZXhdIGVycm9yIGluIGFmdGVyIGFjdGlvbiBzdWJzY3JpYmVyczogXCIpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlc29sdmUocmVzKTtcbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMkMSQxLl9hY3Rpb25TdWJzY3JpYmVyc1xuICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHN1YikgeyByZXR1cm4gc3ViLmVycm9yOyB9KVxuICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChzdWIpIHsgcmV0dXJuIHN1Yi5lcnJvcihhY3Rpb24sIHRoaXMkMSQxLnN0YXRlLCBlcnJvcik7IH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW3Z1ZXhdIGVycm9yIGluIGVycm9yIGFjdGlvbiBzdWJzY3JpYmVyczogXCIpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfSk7XG4gIH0pXG59O1xuXG5TdG9yZS5wcm90b3R5cGUuc3Vic2NyaWJlID0gZnVuY3Rpb24gc3Vic2NyaWJlIChmbiwgb3B0aW9ucykge1xuICByZXR1cm4gZ2VuZXJpY1N1YnNjcmliZShmbiwgdGhpcy5fc3Vic2NyaWJlcnMsIG9wdGlvbnMpXG59O1xuXG5TdG9yZS5wcm90b3R5cGUuc3Vic2NyaWJlQWN0aW9uID0gZnVuY3Rpb24gc3Vic2NyaWJlQWN0aW9uIChmbiwgb3B0aW9ucykge1xuICB2YXIgc3VicyA9IHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyA/IHsgYmVmb3JlOiBmbiB9IDogZm47XG4gIHJldHVybiBnZW5lcmljU3Vic2NyaWJlKHN1YnMsIHRoaXMuX2FjdGlvblN1YnNjcmliZXJzLCBvcHRpb25zKVxufTtcblxuU3RvcmUucHJvdG90eXBlLndhdGNoID0gZnVuY3Rpb24gd2F0Y2gkMSAoZ2V0dGVyLCBjYiwgb3B0aW9ucykge1xuICAgIHZhciB0aGlzJDEkMSA9IHRoaXM7XG5cbiAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgIGFzc2VydCh0eXBlb2YgZ2V0dGVyID09PSAnZnVuY3Rpb24nLCBcInN0b3JlLndhdGNoIG9ubHkgYWNjZXB0cyBhIGZ1bmN0aW9uLlwiKTtcbiAgfVxuICByZXR1cm4gd2F0Y2goZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2V0dGVyKHRoaXMkMSQxLnN0YXRlLCB0aGlzJDEkMS5nZXR0ZXJzKTsgfSwgY2IsIE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpKVxufTtcblxuU3RvcmUucHJvdG90eXBlLnJlcGxhY2VTdGF0ZSA9IGZ1bmN0aW9uIHJlcGxhY2VTdGF0ZSAoc3RhdGUpIHtcbiAgICB2YXIgdGhpcyQxJDEgPSB0aGlzO1xuXG4gIHRoaXMuX3dpdGhDb21taXQoZnVuY3Rpb24gKCkge1xuICAgIHRoaXMkMSQxLl9zdGF0ZS5kYXRhID0gc3RhdGU7XG4gIH0pO1xufTtcblxuU3RvcmUucHJvdG90eXBlLnJlZ2lzdGVyTW9kdWxlID0gZnVuY3Rpb24gcmVnaXN0ZXJNb2R1bGUgKHBhdGgsIHJhd01vZHVsZSwgb3B0aW9ucykge1xuICAgIGlmICggb3B0aW9ucyA9PT0gdm9pZCAwICkgb3B0aW9ucyA9IHt9O1xuXG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpIHsgcGF0aCA9IFtwYXRoXTsgfVxuXG4gIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheShwYXRoKSwgXCJtb2R1bGUgcGF0aCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuIEFycmF5LlwiKTtcbiAgICBhc3NlcnQocGF0aC5sZW5ndGggPiAwLCAnY2Fubm90IHJlZ2lzdGVyIHRoZSByb290IG1vZHVsZSBieSB1c2luZyByZWdpc3Rlck1vZHVsZS4nKTtcbiAgfVxuXG4gIHRoaXMuX21vZHVsZXMucmVnaXN0ZXIocGF0aCwgcmF3TW9kdWxlKTtcbiAgaW5zdGFsbE1vZHVsZSh0aGlzLCB0aGlzLnN0YXRlLCBwYXRoLCB0aGlzLl9tb2R1bGVzLmdldChwYXRoKSwgb3B0aW9ucy5wcmVzZXJ2ZVN0YXRlKTtcbiAgLy8gcmVzZXQgc3RvcmUgdG8gdXBkYXRlIGdldHRlcnMuLi5cbiAgcmVzZXRTdG9yZVN0YXRlKHRoaXMsIHRoaXMuc3RhdGUpO1xufTtcblxuU3RvcmUucHJvdG90eXBlLnVucmVnaXN0ZXJNb2R1bGUgPSBmdW5jdGlvbiB1bnJlZ2lzdGVyTW9kdWxlIChwYXRoKSB7XG4gICAgdmFyIHRoaXMkMSQxID0gdGhpcztcblxuICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7IHBhdGggPSBbcGF0aF07IH1cblxuICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkocGF0aCksIFwibW9kdWxlIHBhdGggbXVzdCBiZSBhIHN0cmluZyBvciBhbiBBcnJheS5cIik7XG4gIH1cblxuICB0aGlzLl9tb2R1bGVzLnVucmVnaXN0ZXIocGF0aCk7XG4gIHRoaXMuX3dpdGhDb21taXQoZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnRTdGF0ZSA9IGdldE5lc3RlZFN0YXRlKHRoaXMkMSQxLnN0YXRlLCBwYXRoLnNsaWNlKDAsIC0xKSk7XG4gICAgZGVsZXRlIHBhcmVudFN0YXRlW3BhdGhbcGF0aC5sZW5ndGggLSAxXV07XG4gIH0pO1xuICByZXNldFN0b3JlKHRoaXMpO1xufTtcblxuU3RvcmUucHJvdG90eXBlLmhhc01vZHVsZSA9IGZ1bmN0aW9uIGhhc01vZHVsZSAocGF0aCkge1xuICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7IHBhdGggPSBbcGF0aF07IH1cblxuICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkocGF0aCksIFwibW9kdWxlIHBhdGggbXVzdCBiZSBhIHN0cmluZyBvciBhbiBBcnJheS5cIik7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fbW9kdWxlcy5pc1JlZ2lzdGVyZWQocGF0aClcbn07XG5cblN0b3JlLnByb3RvdHlwZS5ob3RVcGRhdGUgPSBmdW5jdGlvbiBob3RVcGRhdGUgKG5ld09wdGlvbnMpIHtcbiAgdGhpcy5fbW9kdWxlcy51cGRhdGUobmV3T3B0aW9ucyk7XG4gIHJlc2V0U3RvcmUodGhpcywgdHJ1ZSk7XG59O1xuXG5TdG9yZS5wcm90b3R5cGUuX3dpdGhDb21taXQgPSBmdW5jdGlvbiBfd2l0aENvbW1pdCAoZm4pIHtcbiAgdmFyIGNvbW1pdHRpbmcgPSB0aGlzLl9jb21taXR0aW5nO1xuICB0aGlzLl9jb21taXR0aW5nID0gdHJ1ZTtcbiAgZm4oKTtcbiAgdGhpcy5fY29tbWl0dGluZyA9IGNvbW1pdHRpbmc7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggU3RvcmUucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxuLyoqXG4gKiBSZWR1Y2UgdGhlIGNvZGUgd2hpY2ggd3JpdHRlbiBpbiBWdWUuanMgZm9yIGdldHRpbmcgdGhlIHN0YXRlLlxuICogQHBhcmFtIHtTdHJpbmd9IFtuYW1lc3BhY2VdIC0gTW9kdWxlJ3MgbmFtZXNwYWNlXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gc3RhdGVzICMgT2JqZWN0J3MgaXRlbSBjYW4gYmUgYSBmdW5jdGlvbiB3aGljaCBhY2NlcHQgc3RhdGUgYW5kIGdldHRlcnMgZm9yIHBhcmFtLCB5b3UgY2FuIGRvIHNvbWV0aGluZyBmb3Igc3RhdGUgYW5kIGdldHRlcnMgaW4gaXQuXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqL1xudmFyIG1hcFN0YXRlID0gbm9ybWFsaXplTmFtZXNwYWNlKGZ1bmN0aW9uIChuYW1lc3BhY2UsIHN0YXRlcykge1xuICB2YXIgcmVzID0ge307XG4gIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIWlzVmFsaWRNYXAoc3RhdGVzKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1t2dWV4XSBtYXBTdGF0ZTogbWFwcGVyIHBhcmFtZXRlciBtdXN0IGJlIGVpdGhlciBhbiBBcnJheSBvciBhbiBPYmplY3QnKTtcbiAgfVxuICBub3JtYWxpemVNYXAoc3RhdGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHtcbiAgICB2YXIga2V5ID0gcmVmLmtleTtcbiAgICB2YXIgdmFsID0gcmVmLnZhbDtcblxuICAgIHJlc1trZXldID0gZnVuY3Rpb24gbWFwcGVkU3RhdGUgKCkge1xuICAgICAgdmFyIHN0YXRlID0gdGhpcy4kc3RvcmUuc3RhdGU7XG4gICAgICB2YXIgZ2V0dGVycyA9IHRoaXMuJHN0b3JlLmdldHRlcnM7XG4gICAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICAgIHZhciBtb2R1bGUgPSBnZXRNb2R1bGVCeU5hbWVzcGFjZSh0aGlzLiRzdG9yZSwgJ21hcFN0YXRlJywgbmFtZXNwYWNlKTtcbiAgICAgICAgaWYgKCFtb2R1bGUpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBzdGF0ZSA9IG1vZHVsZS5jb250ZXh0LnN0YXRlO1xuICAgICAgICBnZXR0ZXJzID0gbW9kdWxlLmNvbnRleHQuZ2V0dGVycztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gdmFsLmNhbGwodGhpcywgc3RhdGUsIGdldHRlcnMpXG4gICAgICAgIDogc3RhdGVbdmFsXVxuICAgIH07XG4gICAgLy8gbWFyayB2dWV4IGdldHRlciBmb3IgZGV2dG9vbHNcbiAgICByZXNba2V5XS52dWV4ID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiByZXNcbn0pO1xuXG4vKipcbiAqIFJlZHVjZSB0aGUgY29kZSB3aGljaCB3cml0dGVuIGluIFZ1ZS5qcyBmb3IgY29tbWl0dGluZyB0aGUgbXV0YXRpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBbbmFtZXNwYWNlXSAtIE1vZHVsZSdzIG5hbWVzcGFjZVxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG11dGF0aW9ucyAjIE9iamVjdCdzIGl0ZW0gY2FuIGJlIGEgZnVuY3Rpb24gd2hpY2ggYWNjZXB0IGBjb21taXRgIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBwYXJhbSwgaXQgY2FuIGFjY2VwdCBhbm90aGVyIHBhcmFtcy4gWW91IGNhbiBjb21taXQgbXV0YXRpb24gYW5kIGRvIGFueSBvdGhlciB0aGluZ3MgaW4gdGhpcyBmdW5jdGlvbi4gc3BlY2lhbGx5LCBZb3UgbmVlZCB0byBwYXNzIGFudGhvciBwYXJhbXMgZnJvbSB0aGUgbWFwcGVkIGZ1bmN0aW9uLlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG52YXIgbWFwTXV0YXRpb25zID0gbm9ybWFsaXplTmFtZXNwYWNlKGZ1bmN0aW9uIChuYW1lc3BhY2UsIG11dGF0aW9ucykge1xuICB2YXIgcmVzID0ge307XG4gIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIWlzVmFsaWRNYXAobXV0YXRpb25zKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1t2dWV4XSBtYXBNdXRhdGlvbnM6IG1hcHBlciBwYXJhbWV0ZXIgbXVzdCBiZSBlaXRoZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0Jyk7XG4gIH1cbiAgbm9ybWFsaXplTWFwKG11dGF0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7XG4gICAgdmFyIGtleSA9IHJlZi5rZXk7XG4gICAgdmFyIHZhbCA9IHJlZi52YWw7XG5cbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uIG1hcHBlZE11dGF0aW9uICgpIHtcbiAgICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgICAvLyBHZXQgdGhlIGNvbW1pdCBtZXRob2QgZnJvbSBzdG9yZVxuICAgICAgdmFyIGNvbW1pdCA9IHRoaXMuJHN0b3JlLmNvbW1pdDtcbiAgICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgICAgdmFyIG1vZHVsZSA9IGdldE1vZHVsZUJ5TmFtZXNwYWNlKHRoaXMuJHN0b3JlLCAnbWFwTXV0YXRpb25zJywgbmFtZXNwYWNlKTtcbiAgICAgICAgaWYgKCFtb2R1bGUpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb21taXQgPSBtb2R1bGUuY29udGV4dC5jb21taXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHZhbC5hcHBseSh0aGlzLCBbY29tbWl0XS5jb25jYXQoYXJncykpXG4gICAgICAgIDogY29tbWl0LmFwcGx5KHRoaXMuJHN0b3JlLCBbdmFsXS5jb25jYXQoYXJncykpXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiByZXNcbn0pO1xuXG4vKipcbiAqIFJlZHVjZSB0aGUgY29kZSB3aGljaCB3cml0dGVuIGluIFZ1ZS5qcyBmb3IgZ2V0dGluZyB0aGUgZ2V0dGVyc1xuICogQHBhcmFtIHtTdHJpbmd9IFtuYW1lc3BhY2VdIC0gTW9kdWxlJ3MgbmFtZXNwYWNlXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gZ2V0dGVyc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG52YXIgbWFwR2V0dGVycyA9IG5vcm1hbGl6ZU5hbWVzcGFjZShmdW5jdGlvbiAobmFtZXNwYWNlLCBnZXR0ZXJzKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhaXNWYWxpZE1hcChnZXR0ZXJzKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1t2dWV4XSBtYXBHZXR0ZXJzOiBtYXBwZXIgcGFyYW1ldGVyIG11c3QgYmUgZWl0aGVyIGFuIEFycmF5IG9yIGFuIE9iamVjdCcpO1xuICB9XG4gIG5vcm1hbGl6ZU1hcChnZXR0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHtcbiAgICB2YXIga2V5ID0gcmVmLmtleTtcbiAgICB2YXIgdmFsID0gcmVmLnZhbDtcblxuICAgIC8vIFRoZSBuYW1lc3BhY2UgaGFzIGJlZW4gbXV0YXRlZCBieSBub3JtYWxpemVOYW1lc3BhY2VcbiAgICB2YWwgPSBuYW1lc3BhY2UgKyB2YWw7XG4gICAgcmVzW2tleV0gPSBmdW5jdGlvbiBtYXBwZWRHZXR0ZXIgKCkge1xuICAgICAgaWYgKG5hbWVzcGFjZSAmJiAhZ2V0TW9kdWxlQnlOYW1lc3BhY2UodGhpcy4kc3RvcmUsICdtYXBHZXR0ZXJzJywgbmFtZXNwYWNlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgISh2YWwgaW4gdGhpcy4kc3RvcmUuZ2V0dGVycykpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigoXCJbdnVleF0gdW5rbm93biBnZXR0ZXI6IFwiICsgdmFsKSk7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnNbdmFsXVxuICAgIH07XG4gICAgLy8gbWFyayB2dWV4IGdldHRlciBmb3IgZGV2dG9vbHNcbiAgICByZXNba2V5XS52dWV4ID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiByZXNcbn0pO1xuXG4vKipcbiAqIFJlZHVjZSB0aGUgY29kZSB3aGljaCB3cml0dGVuIGluIFZ1ZS5qcyBmb3IgZGlzcGF0Y2ggdGhlIGFjdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IFtuYW1lc3BhY2VdIC0gTW9kdWxlJ3MgbmFtZXNwYWNlXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gYWN0aW9ucyAjIE9iamVjdCdzIGl0ZW0gY2FuIGJlIGEgZnVuY3Rpb24gd2hpY2ggYWNjZXB0IGBkaXNwYXRjaGAgZnVuY3Rpb24gYXMgdGhlIGZpcnN0IHBhcmFtLCBpdCBjYW4gYWNjZXB0IGFudGhvciBwYXJhbXMuIFlvdSBjYW4gZGlzcGF0Y2ggYWN0aW9uIGFuZCBkbyBhbnkgb3RoZXIgdGhpbmdzIGluIHRoaXMgZnVuY3Rpb24uIHNwZWNpYWxseSwgWW91IG5lZWQgdG8gcGFzcyBhbnRob3IgcGFyYW1zIGZyb20gdGhlIG1hcHBlZCBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xudmFyIG1hcEFjdGlvbnMgPSBub3JtYWxpemVOYW1lc3BhY2UoZnVuY3Rpb24gKG5hbWVzcGFjZSwgYWN0aW9ucykge1xuICB2YXIgcmVzID0ge307XG4gIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIWlzVmFsaWRNYXAoYWN0aW9ucykpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbdnVleF0gbWFwQWN0aW9uczogbWFwcGVyIHBhcmFtZXRlciBtdXN0IGJlIGVpdGhlciBhbiBBcnJheSBvciBhbiBPYmplY3QnKTtcbiAgfVxuICBub3JtYWxpemVNYXAoYWN0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7XG4gICAgdmFyIGtleSA9IHJlZi5rZXk7XG4gICAgdmFyIHZhbCA9IHJlZi52YWw7XG5cbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uIG1hcHBlZEFjdGlvbiAoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICAgICAgLy8gZ2V0IGRpc3BhdGNoIGZ1bmN0aW9uIGZyb20gc3RvcmVcbiAgICAgIHZhciBkaXNwYXRjaCA9IHRoaXMuJHN0b3JlLmRpc3BhdGNoO1xuICAgICAgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgICB2YXIgbW9kdWxlID0gZ2V0TW9kdWxlQnlOYW1lc3BhY2UodGhpcy4kc3RvcmUsICdtYXBBY3Rpb25zJywgbmFtZXNwYWNlKTtcbiAgICAgICAgaWYgKCFtb2R1bGUpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBkaXNwYXRjaCA9IG1vZHVsZS5jb250ZXh0LmRpc3BhdGNoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyB2YWwuYXBwbHkodGhpcywgW2Rpc3BhdGNoXS5jb25jYXQoYXJncykpXG4gICAgICAgIDogZGlzcGF0Y2guYXBwbHkodGhpcy4kc3RvcmUsIFt2YWxdLmNvbmNhdChhcmdzKSlcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIHJlc1xufSk7XG5cbi8qKlxuICogUmViaW5kaW5nIG5hbWVzcGFjZSBwYXJhbSBmb3IgbWFwWFhYIGZ1bmN0aW9uIGluIHNwZWNpYWwgc2NvcGVkLCBhbmQgcmV0dXJuIHRoZW0gYnkgc2ltcGxlIG9iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG52YXIgY3JlYXRlTmFtZXNwYWNlZEhlbHBlcnMgPSBmdW5jdGlvbiAobmFtZXNwYWNlKSB7IHJldHVybiAoe1xuICBtYXBTdGF0ZTogbWFwU3RhdGUuYmluZChudWxsLCBuYW1lc3BhY2UpLFxuICBtYXBHZXR0ZXJzOiBtYXBHZXR0ZXJzLmJpbmQobnVsbCwgbmFtZXNwYWNlKSxcbiAgbWFwTXV0YXRpb25zOiBtYXBNdXRhdGlvbnMuYmluZChudWxsLCBuYW1lc3BhY2UpLFxuICBtYXBBY3Rpb25zOiBtYXBBY3Rpb25zLmJpbmQobnVsbCwgbmFtZXNwYWNlKVxufSk7IH07XG5cbi8qKlxuICogTm9ybWFsaXplIHRoZSBtYXBcbiAqIG5vcm1hbGl6ZU1hcChbMSwgMiwgM10pID0+IFsgeyBrZXk6IDEsIHZhbDogMSB9LCB7IGtleTogMiwgdmFsOiAyIH0sIHsga2V5OiAzLCB2YWw6IDMgfSBdXG4gKiBub3JtYWxpemVNYXAoe2E6IDEsIGI6IDIsIGM6IDN9KSA9PiBbIHsga2V5OiAnYScsIHZhbDogMSB9LCB7IGtleTogJ2InLCB2YWw6IDIgfSwgeyBrZXk6ICdjJywgdmFsOiAzIH0gXVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IG1hcFxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVNYXAgKG1hcCkge1xuICBpZiAoIWlzVmFsaWRNYXAobWFwKSkge1xuICAgIHJldHVybiBbXVxuICB9XG4gIHJldHVybiBBcnJheS5pc0FycmF5KG1hcClcbiAgICA/IG1hcC5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gKHsga2V5OiBrZXksIHZhbDoga2V5IH0pOyB9KVxuICAgIDogT2JqZWN0LmtleXMobWFwKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gKHsga2V5OiBrZXksIHZhbDogbWFwW2tleV0gfSk7IH0pXG59XG5cbi8qKlxuICogVmFsaWRhdGUgd2hldGhlciBnaXZlbiBtYXAgaXMgdmFsaWQgb3Igbm90XG4gKiBAcGFyYW0geyp9IG1hcFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZE1hcCAobWFwKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KG1hcCkgfHwgaXNPYmplY3QobWFwKVxufVxuXG4vKipcbiAqIFJldHVybiBhIGZ1bmN0aW9uIGV4cGVjdCB0d28gcGFyYW0gY29udGFpbnMgbmFtZXNwYWNlIGFuZCBtYXAuIGl0IHdpbGwgbm9ybWFsaXplIHRoZSBuYW1lc3BhY2UgYW5kIHRoZW4gdGhlIHBhcmFtJ3MgZnVuY3Rpb24gd2lsbCBoYW5kbGUgdGhlIG5ldyBuYW1lc3BhY2UgYW5kIHRoZSBtYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5hbWVzcGFjZSAoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1hcCkge1xuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlICE9PSAnc3RyaW5nJykge1xuICAgICAgbWFwID0gbmFtZXNwYWNlO1xuICAgICAgbmFtZXNwYWNlID0gJyc7XG4gICAgfSBlbHNlIGlmIChuYW1lc3BhY2UuY2hhckF0KG5hbWVzcGFjZS5sZW5ndGggLSAxKSAhPT0gJy8nKSB7XG4gICAgICBuYW1lc3BhY2UgKz0gJy8nO1xuICAgIH1cbiAgICByZXR1cm4gZm4obmFtZXNwYWNlLCBtYXApXG4gIH1cbn1cblxuLyoqXG4gKiBTZWFyY2ggYSBzcGVjaWFsIG1vZHVsZSBmcm9tIHN0b3JlIGJ5IG5hbWVzcGFjZS4gaWYgbW9kdWxlIG5vdCBleGlzdCwgcHJpbnQgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdG9yZVxuICogQHBhcmFtIHtTdHJpbmd9IGhlbHBlclxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRNb2R1bGVCeU5hbWVzcGFjZSAoc3RvcmUsIGhlbHBlciwgbmFtZXNwYWNlKSB7XG4gIHZhciBtb2R1bGUgPSBzdG9yZS5fbW9kdWxlc05hbWVzcGFjZU1hcFtuYW1lc3BhY2VdO1xuICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmICFtb2R1bGUpIHtcbiAgICBjb25zb2xlLmVycm9yKChcIlt2dWV4XSBtb2R1bGUgbmFtZXNwYWNlIG5vdCBmb3VuZCBpbiBcIiArIGhlbHBlciArIFwiKCk6IFwiICsgbmFtZXNwYWNlKSk7XG4gIH1cbiAgcmV0dXJuIG1vZHVsZVxufVxuXG4vLyBDcmVkaXRzOiBib3Jyb3dlZCBjb2RlIGZyb20gZmNvbWIvcmVkdXgtbG9nZ2VyXG5cbmZ1bmN0aW9uIGNyZWF0ZUxvZ2dlciAocmVmKSB7XG4gIGlmICggcmVmID09PSB2b2lkIDAgKSByZWYgPSB7fTtcbiAgdmFyIGNvbGxhcHNlZCA9IHJlZi5jb2xsYXBzZWQ7IGlmICggY29sbGFwc2VkID09PSB2b2lkIDAgKSBjb2xsYXBzZWQgPSB0cnVlO1xuICB2YXIgZmlsdGVyID0gcmVmLmZpbHRlcjsgaWYgKCBmaWx0ZXIgPT09IHZvaWQgMCApIGZpbHRlciA9IGZ1bmN0aW9uIChtdXRhdGlvbiwgc3RhdGVCZWZvcmUsIHN0YXRlQWZ0ZXIpIHsgcmV0dXJuIHRydWU7IH07XG4gIHZhciB0cmFuc2Zvcm1lciA9IHJlZi50cmFuc2Zvcm1lcjsgaWYgKCB0cmFuc2Zvcm1lciA9PT0gdm9pZCAwICkgdHJhbnNmb3JtZXIgPSBmdW5jdGlvbiAoc3RhdGUpIHsgcmV0dXJuIHN0YXRlOyB9O1xuICB2YXIgbXV0YXRpb25UcmFuc2Zvcm1lciA9IHJlZi5tdXRhdGlvblRyYW5zZm9ybWVyOyBpZiAoIG11dGF0aW9uVHJhbnNmb3JtZXIgPT09IHZvaWQgMCApIG11dGF0aW9uVHJhbnNmb3JtZXIgPSBmdW5jdGlvbiAobXV0KSB7IHJldHVybiBtdXQ7IH07XG4gIHZhciBhY3Rpb25GaWx0ZXIgPSByZWYuYWN0aW9uRmlsdGVyOyBpZiAoIGFjdGlvbkZpbHRlciA9PT0gdm9pZCAwICkgYWN0aW9uRmlsdGVyID0gZnVuY3Rpb24gKGFjdGlvbiwgc3RhdGUpIHsgcmV0dXJuIHRydWU7IH07XG4gIHZhciBhY3Rpb25UcmFuc2Zvcm1lciA9IHJlZi5hY3Rpb25UcmFuc2Zvcm1lcjsgaWYgKCBhY3Rpb25UcmFuc2Zvcm1lciA9PT0gdm9pZCAwICkgYWN0aW9uVHJhbnNmb3JtZXIgPSBmdW5jdGlvbiAoYWN0KSB7IHJldHVybiBhY3Q7IH07XG4gIHZhciBsb2dNdXRhdGlvbnMgPSByZWYubG9nTXV0YXRpb25zOyBpZiAoIGxvZ011dGF0aW9ucyA9PT0gdm9pZCAwICkgbG9nTXV0YXRpb25zID0gdHJ1ZTtcbiAgdmFyIGxvZ0FjdGlvbnMgPSByZWYubG9nQWN0aW9uczsgaWYgKCBsb2dBY3Rpb25zID09PSB2b2lkIDAgKSBsb2dBY3Rpb25zID0gdHJ1ZTtcbiAgdmFyIGxvZ2dlciA9IHJlZi5sb2dnZXI7IGlmICggbG9nZ2VyID09PSB2b2lkIDAgKSBsb2dnZXIgPSBjb25zb2xlO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoc3RvcmUpIHtcbiAgICB2YXIgcHJldlN0YXRlID0gZGVlcENvcHkoc3RvcmUuc3RhdGUpO1xuXG4gICAgaWYgKHR5cGVvZiBsb2dnZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobG9nTXV0YXRpb25zKSB7XG4gICAgICBzdG9yZS5zdWJzY3JpYmUoZnVuY3Rpb24gKG11dGF0aW9uLCBzdGF0ZSkge1xuICAgICAgICB2YXIgbmV4dFN0YXRlID0gZGVlcENvcHkoc3RhdGUpO1xuXG4gICAgICAgIGlmIChmaWx0ZXIobXV0YXRpb24sIHByZXZTdGF0ZSwgbmV4dFN0YXRlKSkge1xuICAgICAgICAgIHZhciBmb3JtYXR0ZWRUaW1lID0gZ2V0Rm9ybWF0dGVkVGltZSgpO1xuICAgICAgICAgIHZhciBmb3JtYXR0ZWRNdXRhdGlvbiA9IG11dGF0aW9uVHJhbnNmb3JtZXIobXV0YXRpb24pO1xuICAgICAgICAgIHZhciBtZXNzYWdlID0gXCJtdXRhdGlvbiBcIiArIChtdXRhdGlvbi50eXBlKSArIGZvcm1hdHRlZFRpbWU7XG5cbiAgICAgICAgICBzdGFydE1lc3NhZ2UobG9nZ2VyLCBtZXNzYWdlLCBjb2xsYXBzZWQpO1xuICAgICAgICAgIGxvZ2dlci5sb2coJyVjIHByZXYgc3RhdGUnLCAnY29sb3I6ICM5RTlFOUU7IGZvbnQtd2VpZ2h0OiBib2xkJywgdHJhbnNmb3JtZXIocHJldlN0YXRlKSk7XG4gICAgICAgICAgbG9nZ2VyLmxvZygnJWMgbXV0YXRpb24nLCAnY29sb3I6ICMwM0E5RjQ7IGZvbnQtd2VpZ2h0OiBib2xkJywgZm9ybWF0dGVkTXV0YXRpb24pO1xuICAgICAgICAgIGxvZ2dlci5sb2coJyVjIG5leHQgc3RhdGUnLCAnY29sb3I6ICM0Q0FGNTA7IGZvbnQtd2VpZ2h0OiBib2xkJywgdHJhbnNmb3JtZXIobmV4dFN0YXRlKSk7XG4gICAgICAgICAgZW5kTWVzc2FnZShsb2dnZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldlN0YXRlID0gbmV4dFN0YXRlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGxvZ0FjdGlvbnMpIHtcbiAgICAgIHN0b3JlLnN1YnNjcmliZUFjdGlvbihmdW5jdGlvbiAoYWN0aW9uLCBzdGF0ZSkge1xuICAgICAgICBpZiAoYWN0aW9uRmlsdGVyKGFjdGlvbiwgc3RhdGUpKSB7XG4gICAgICAgICAgdmFyIGZvcm1hdHRlZFRpbWUgPSBnZXRGb3JtYXR0ZWRUaW1lKCk7XG4gICAgICAgICAgdmFyIGZvcm1hdHRlZEFjdGlvbiA9IGFjdGlvblRyYW5zZm9ybWVyKGFjdGlvbik7XG4gICAgICAgICAgdmFyIG1lc3NhZ2UgPSBcImFjdGlvbiBcIiArIChhY3Rpb24udHlwZSkgKyBmb3JtYXR0ZWRUaW1lO1xuXG4gICAgICAgICAgc3RhcnRNZXNzYWdlKGxvZ2dlciwgbWVzc2FnZSwgY29sbGFwc2VkKTtcbiAgICAgICAgICBsb2dnZXIubG9nKCclYyBhY3Rpb24nLCAnY29sb3I6ICMwM0E5RjQ7IGZvbnQtd2VpZ2h0OiBib2xkJywgZm9ybWF0dGVkQWN0aW9uKTtcbiAgICAgICAgICBlbmRNZXNzYWdlKGxvZ2dlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydE1lc3NhZ2UgKGxvZ2dlciwgbWVzc2FnZSwgY29sbGFwc2VkKSB7XG4gIHZhciBzdGFydE1lc3NhZ2UgPSBjb2xsYXBzZWRcbiAgICA/IGxvZ2dlci5ncm91cENvbGxhcHNlZFxuICAgIDogbG9nZ2VyLmdyb3VwO1xuXG4gIC8vIHJlbmRlclxuICB0cnkge1xuICAgIHN0YXJ0TWVzc2FnZS5jYWxsKGxvZ2dlciwgbWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIubG9nKG1lc3NhZ2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuZE1lc3NhZ2UgKGxvZ2dlcikge1xuICB0cnkge1xuICAgIGxvZ2dlci5ncm91cEVuZCgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLmxvZygn4oCU4oCUIGxvZyBlbmQg4oCU4oCUJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkVGltZSAoKSB7XG4gIHZhciB0aW1lID0gbmV3IERhdGUoKTtcbiAgcmV0dXJuIChcIiBAIFwiICsgKHBhZCh0aW1lLmdldEhvdXJzKCksIDIpKSArIFwiOlwiICsgKHBhZCh0aW1lLmdldE1pbnV0ZXMoKSwgMikpICsgXCI6XCIgKyAocGFkKHRpbWUuZ2V0U2Vjb25kcygpLCAyKSkgKyBcIi5cIiArIChwYWQodGltZS5nZXRNaWxsaXNlY29uZHMoKSwgMykpKVxufVxuXG5mdW5jdGlvbiByZXBlYXQgKHN0ciwgdGltZXMpIHtcbiAgcmV0dXJuIChuZXcgQXJyYXkodGltZXMgKyAxKSkuam9pbihzdHIpXG59XG5cbmZ1bmN0aW9uIHBhZCAobnVtLCBtYXhMZW5ndGgpIHtcbiAgcmV0dXJuIHJlcGVhdCgnMCcsIG1heExlbmd0aCAtIG51bS50b1N0cmluZygpLmxlbmd0aCkgKyBudW1cbn1cblxudmFyIGluZGV4ID0ge1xuICB2ZXJzaW9uOiAnNC4xLjAnLFxuICBTdG9yZTogU3RvcmUsXG4gIHN0b3JlS2V5OiBzdG9yZUtleSxcbiAgY3JlYXRlU3RvcmU6IGNyZWF0ZVN0b3JlLFxuICB1c2VTdG9yZTogdXNlU3RvcmUsXG4gIG1hcFN0YXRlOiBtYXBTdGF0ZSxcbiAgbWFwTXV0YXRpb25zOiBtYXBNdXRhdGlvbnMsXG4gIG1hcEdldHRlcnM6IG1hcEdldHRlcnMsXG4gIG1hcEFjdGlvbnM6IG1hcEFjdGlvbnMsXG4gIGNyZWF0ZU5hbWVzcGFjZWRIZWxwZXJzOiBjcmVhdGVOYW1lc3BhY2VkSGVscGVycyxcbiAgY3JlYXRlTG9nZ2VyOiBjcmVhdGVMb2dnZXJcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGluZGV4O1xuZXhwb3J0IHsgU3RvcmUsIGNyZWF0ZUxvZ2dlciwgY3JlYXRlTmFtZXNwYWNlZEhlbHBlcnMsIGNyZWF0ZVN0b3JlLCBtYXBBY3Rpb25zLCBtYXBHZXR0ZXJzLCBtYXBNdXRhdGlvbnMsIG1hcFN0YXRlLCBzdG9yZUtleSwgdXNlU3RvcmUgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/vuex/dist/vuex.esm-bundler.js\n");

/***/ }),

/***/ "./node_modules/vue-router/dist/vue-router.mjs":
/*!*****************************************************!*\
  !*** ./node_modules/vue-router/dist/vue-router.mjs ***!
  \*****************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"NavigationFailureType\": () => (/* binding */ NavigationFailureType),\n/* harmony export */   \"RouterLink\": () => (/* binding */ RouterLink),\n/* harmony export */   \"RouterView\": () => (/* binding */ RouterView),\n/* harmony export */   \"START_LOCATION\": () => (/* binding */ START_LOCATION_NORMALIZED),\n/* harmony export */   \"createMemoryHistory\": () => (/* binding */ createMemoryHistory),\n/* harmony export */   \"createRouter\": () => (/* binding */ createRouter),\n/* harmony export */   \"createRouterMatcher\": () => (/* binding */ createRouterMatcher),\n/* harmony export */   \"createWebHashHistory\": () => (/* binding */ createWebHashHistory),\n/* harmony export */   \"createWebHistory\": () => (/* binding */ createWebHistory),\n/* harmony export */   \"isNavigationFailure\": () => (/* binding */ isNavigationFailure),\n/* harmony export */   \"loadRouteLocation\": () => (/* binding */ loadRouteLocation),\n/* harmony export */   \"matchedRouteKey\": () => (/* binding */ matchedRouteKey),\n/* harmony export */   \"onBeforeRouteLeave\": () => (/* binding */ onBeforeRouteLeave),\n/* harmony export */   \"onBeforeRouteUpdate\": () => (/* binding */ onBeforeRouteUpdate),\n/* harmony export */   \"parseQuery\": () => (/* binding */ parseQuery),\n/* harmony export */   \"routeLocationKey\": () => (/* binding */ routeLocationKey),\n/* harmony export */   \"routerKey\": () => (/* binding */ routerKey),\n/* harmony export */   \"routerViewLocationKey\": () => (/* binding */ routerViewLocationKey),\n/* harmony export */   \"stringifyQuery\": () => (/* binding */ stringifyQuery),\n/* harmony export */   \"useLink\": () => (/* binding */ useLink),\n/* harmony export */   \"useRoute\": () => (/* binding */ useRoute),\n/* harmony export */   \"useRouter\": () => (/* binding */ useRouter),\n/* harmony export */   \"viewDepthKey\": () => (/* binding */ viewDepthKey)\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n/* harmony import */ var _vue_devtools_api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/devtools-api */ \"./node_modules/@vue/devtools-api/lib/esm/index.js\");\n/*!\n  * vue-router v4.1.6\n  * (c) 2022 Eduardo San Martin Morote\n  * @license MIT\n  */\n\n\n\nconst isBrowser = typeof window !== 'undefined';\n\nfunction isESModule(obj) {\r\n    return obj.__esModule || obj[Symbol.toStringTag] === 'Module';\r\n}\r\nconst assign = Object.assign;\r\nfunction applyToParams(fn, params) {\r\n    const newParams = {};\r\n    for (const key in params) {\r\n        const value = params[key];\r\n        newParams[key] = isArray(value)\r\n            ? value.map(fn)\r\n            : fn(value);\r\n    }\r\n    return newParams;\r\n}\r\nconst noop = () => { };\r\n/**\r\n * Typesafe alternative to Array.isArray\r\n * https://github.com/microsoft/TypeScript/pull/48228\r\n */\r\nconst isArray = Array.isArray;\n\nfunction warn(msg) {\r\n    // avoid using ...args as it breaks in older Edge builds\r\n    const args = Array.from(arguments).slice(1);\r\n    console.warn.apply(console, ['[Vue Router warn]: ' + msg].concat(args));\r\n}\n\nconst TRAILING_SLASH_RE = /\\/$/;\r\nconst removeTrailingSlash = (path) => path.replace(TRAILING_SLASH_RE, '');\r\n/**\r\n * Transforms a URI into a normalized history location\r\n *\r\n * @param parseQuery\r\n * @param location - URI to normalize\r\n * @param currentLocation - current absolute location. Allows resolving relative\r\n * paths. Must start with `/`. Defaults to `/`\r\n * @returns a normalized history location\r\n */\r\nfunction parseURL(parseQuery, location, currentLocation = '/') {\r\n    let path, query = {}, searchString = '', hash = '';\r\n    // Could use URL and URLSearchParams but IE 11 doesn't support it\r\n    // TODO: move to new URL()\r\n    const hashPos = location.indexOf('#');\r\n    let searchPos = location.indexOf('?');\r\n    // the hash appears before the search, so it's not part of the search string\r\n    if (hashPos < searchPos && hashPos >= 0) {\r\n        searchPos = -1;\r\n    }\r\n    if (searchPos > -1) {\r\n        path = location.slice(0, searchPos);\r\n        searchString = location.slice(searchPos + 1, hashPos > -1 ? hashPos : location.length);\r\n        query = parseQuery(searchString);\r\n    }\r\n    if (hashPos > -1) {\r\n        path = path || location.slice(0, hashPos);\r\n        // keep the # character\r\n        hash = location.slice(hashPos, location.length);\r\n    }\r\n    // no search and no query\r\n    path = resolveRelativePath(path != null ? path : location, currentLocation);\r\n    // empty path means a relative query or hash `?foo=f`, `#thing`\r\n    return {\r\n        fullPath: path + (searchString && '?') + searchString + hash,\r\n        path,\r\n        query,\r\n        hash,\r\n    };\r\n}\r\n/**\r\n * Stringifies a URL object\r\n *\r\n * @param stringifyQuery\r\n * @param location\r\n */\r\nfunction stringifyURL(stringifyQuery, location) {\r\n    const query = location.query ? stringifyQuery(location.query) : '';\r\n    return location.path + (query && '?') + query + (location.hash || '');\r\n}\r\n/**\r\n * Strips off the base from the beginning of a location.pathname in a non-case-sensitive way.\r\n *\r\n * @param pathname - location.pathname\r\n * @param base - base to strip off\r\n */\r\nfunction stripBase(pathname, base) {\r\n    // no base or base is not found at the beginning\r\n    if (!base || !pathname.toLowerCase().startsWith(base.toLowerCase()))\r\n        return pathname;\r\n    return pathname.slice(base.length) || '/';\r\n}\r\n/**\r\n * Checks if two RouteLocation are equal. This means that both locations are\r\n * pointing towards the same {@link RouteRecord} and that all `params`, `query`\r\n * parameters and `hash` are the same\r\n *\r\n * @param a - first {@link RouteLocation}\r\n * @param b - second {@link RouteLocation}\r\n */\r\nfunction isSameRouteLocation(stringifyQuery, a, b) {\r\n    const aLastIndex = a.matched.length - 1;\r\n    const bLastIndex = b.matched.length - 1;\r\n    return (aLastIndex > -1 &&\r\n        aLastIndex === bLastIndex &&\r\n        isSameRouteRecord(a.matched[aLastIndex], b.matched[bLastIndex]) &&\r\n        isSameRouteLocationParams(a.params, b.params) &&\r\n        stringifyQuery(a.query) === stringifyQuery(b.query) &&\r\n        a.hash === b.hash);\r\n}\r\n/**\r\n * Check if two `RouteRecords` are equal. Takes into account aliases: they are\r\n * considered equal to the `RouteRecord` they are aliasing.\r\n *\r\n * @param a - first {@link RouteRecord}\r\n * @param b - second {@link RouteRecord}\r\n */\r\nfunction isSameRouteRecord(a, b) {\r\n    // since the original record has an undefined value for aliasOf\r\n    // but all aliases point to the original record, this will always compare\r\n    // the original record\r\n    return (a.aliasOf || a) === (b.aliasOf || b);\r\n}\r\nfunction isSameRouteLocationParams(a, b) {\r\n    if (Object.keys(a).length !== Object.keys(b).length)\r\n        return false;\r\n    for (const key in a) {\r\n        if (!isSameRouteLocationParamsValue(a[key], b[key]))\r\n            return false;\r\n    }\r\n    return true;\r\n}\r\nfunction isSameRouteLocationParamsValue(a, b) {\r\n    return isArray(a)\r\n        ? isEquivalentArray(a, b)\r\n        : isArray(b)\r\n            ? isEquivalentArray(b, a)\r\n            : a === b;\r\n}\r\n/**\r\n * Check if two arrays are the same or if an array with one single entry is the\r\n * same as another primitive value. Used to check query and parameters\r\n *\r\n * @param a - array of values\r\n * @param b - array of values or a single value\r\n */\r\nfunction isEquivalentArray(a, b) {\r\n    return isArray(b)\r\n        ? a.length === b.length && a.every((value, i) => value === b[i])\r\n        : a.length === 1 && a[0] === b;\r\n}\r\n/**\r\n * Resolves a relative path that starts with `.`.\r\n *\r\n * @param to - path location we are resolving\r\n * @param from - currentLocation.path, should start with `/`\r\n */\r\nfunction resolveRelativePath(to, from) {\r\n    if (to.startsWith('/'))\r\n        return to;\r\n    if (( true) && !from.startsWith('/')) {\r\n        warn(`Cannot resolve a relative location without an absolute path. Trying to resolve \"${to}\" from \"${from}\". It should look like \"/${from}\".`);\r\n        return to;\r\n    }\r\n    if (!to)\r\n        return from;\r\n    const fromSegments = from.split('/');\r\n    const toSegments = to.split('/');\r\n    let position = fromSegments.length - 1;\r\n    let toPosition;\r\n    let segment;\r\n    for (toPosition = 0; toPosition < toSegments.length; toPosition++) {\r\n        segment = toSegments[toPosition];\r\n        // we stay on the same position\r\n        if (segment === '.')\r\n            continue;\r\n        // go up in the from array\r\n        if (segment === '..') {\r\n            // we can't go below zero, but we still need to increment toPosition\r\n            if (position > 1)\r\n                position--;\r\n            // continue\r\n        }\r\n        // we reached a non-relative path, we stop here\r\n        else\r\n            break;\r\n    }\r\n    return (fromSegments.slice(0, position).join('/') +\r\n        '/' +\r\n        toSegments\r\n            // ensure we use at least the last element in the toSegments\r\n            .slice(toPosition - (toPosition === toSegments.length ? 1 : 0))\r\n            .join('/'));\r\n}\n\nvar NavigationType;\r\n(function (NavigationType) {\r\n    NavigationType[\"pop\"] = \"pop\";\r\n    NavigationType[\"push\"] = \"push\";\r\n})(NavigationType || (NavigationType = {}));\r\nvar NavigationDirection;\r\n(function (NavigationDirection) {\r\n    NavigationDirection[\"back\"] = \"back\";\r\n    NavigationDirection[\"forward\"] = \"forward\";\r\n    NavigationDirection[\"unknown\"] = \"\";\r\n})(NavigationDirection || (NavigationDirection = {}));\r\n/**\r\n * Starting location for Histories\r\n */\r\nconst START = '';\r\n// Generic utils\r\n/**\r\n * Normalizes a base by removing any trailing slash and reading the base tag if\r\n * present.\r\n *\r\n * @param base - base to normalize\r\n */\r\nfunction normalizeBase(base) {\r\n    if (!base) {\r\n        if (isBrowser) {\r\n            // respect <base> tag\r\n            const baseEl = document.querySelector('base');\r\n            base = (baseEl && baseEl.getAttribute('href')) || '/';\r\n            // strip full URL origin\r\n            base = base.replace(/^\\w+:\\/\\/[^\\/]+/, '');\r\n        }\r\n        else {\r\n            base = '/';\r\n        }\r\n    }\r\n    // ensure leading slash when it was removed by the regex above avoid leading\r\n    // slash with hash because the file could be read from the disk like file://\r\n    // and the leading slash would cause problems\r\n    if (base[0] !== '/' && base[0] !== '#')\r\n        base = '/' + base;\r\n    // remove the trailing slash so all other method can just do `base + fullPath`\r\n    // to build an href\r\n    return removeTrailingSlash(base);\r\n}\r\n// remove any character before the hash\r\nconst BEFORE_HASH_RE = /^[^#]+#/;\r\nfunction createHref(base, location) {\r\n    return base.replace(BEFORE_HASH_RE, '#') + location;\r\n}\n\nfunction getElementPosition(el, offset) {\r\n    const docRect = document.documentElement.getBoundingClientRect();\r\n    const elRect = el.getBoundingClientRect();\r\n    return {\r\n        behavior: offset.behavior,\r\n        left: elRect.left - docRect.left - (offset.left || 0),\r\n        top: elRect.top - docRect.top - (offset.top || 0),\r\n    };\r\n}\r\nconst computeScrollPosition = () => ({\r\n    left: window.pageXOffset,\r\n    top: window.pageYOffset,\r\n});\r\nfunction scrollToPosition(position) {\r\n    let scrollToOptions;\r\n    if ('el' in position) {\r\n        const positionEl = position.el;\r\n        const isIdSelector = typeof positionEl === 'string' && positionEl.startsWith('#');\r\n        /**\r\n         * `id`s can accept pretty much any characters, including CSS combinators\r\n         * like `>` or `~`. It's still possible to retrieve elements using\r\n         * `document.getElementById('~')` but it needs to be escaped when using\r\n         * `document.querySelector('#\\\\~')` for it to be valid. The only\r\n         * requirements for `id`s are them to be unique on the page and to not be\r\n         * empty (`id=\"\"`). Because of that, when passing an id selector, it should\r\n         * be properly escaped for it to work with `querySelector`. We could check\r\n         * for the id selector to be simple (no CSS combinators `+ >~`) but that\r\n         * would make things inconsistent since they are valid characters for an\r\n         * `id` but would need to be escaped when using `querySelector`, breaking\r\n         * their usage and ending up in no selector returned. Selectors need to be\r\n         * escaped:\r\n         *\r\n         * - `#1-thing` becomes `#\\31 -thing`\r\n         * - `#with~symbols` becomes `#with\\\\~symbols`\r\n         *\r\n         * - More information about  the topic can be found at\r\n         *   https://mathiasbynens.be/notes/html5-id-class.\r\n         * - Practical example: https://mathiasbynens.be/demo/html5-id\r\n         */\r\n        if (( true) && typeof position.el === 'string') {\r\n            if (!isIdSelector || !document.getElementById(position.el.slice(1))) {\r\n                try {\r\n                    const foundEl = document.querySelector(position.el);\r\n                    if (isIdSelector && foundEl) {\r\n                        warn(`The selector \"${position.el}\" should be passed as \"el: document.querySelector('${position.el}')\" because it starts with \"#\".`);\r\n                        // return to avoid other warnings\r\n                        return;\r\n                    }\r\n                }\r\n                catch (err) {\r\n                    warn(`The selector \"${position.el}\" is invalid. If you are using an id selector, make sure to escape it. You can find more information about escaping characters in selectors at https://mathiasbynens.be/notes/css-escapes or use CSS.escape (https://developer.mozilla.org/en-US/docs/Web/API/CSS/escape).`);\r\n                    // return to avoid other warnings\r\n                    return;\r\n                }\r\n            }\r\n        }\r\n        const el = typeof positionEl === 'string'\r\n            ? isIdSelector\r\n                ? document.getElementById(positionEl.slice(1))\r\n                : document.querySelector(positionEl)\r\n            : positionEl;\r\n        if (!el) {\r\n            ( true) &&\r\n                warn(`Couldn't find element using selector \"${position.el}\" returned by scrollBehavior.`);\r\n            return;\r\n        }\r\n        scrollToOptions = getElementPosition(el, position);\r\n    }\r\n    else {\r\n        scrollToOptions = position;\r\n    }\r\n    if ('scrollBehavior' in document.documentElement.style)\r\n        window.scrollTo(scrollToOptions);\r\n    else {\r\n        window.scrollTo(scrollToOptions.left != null ? scrollToOptions.left : window.pageXOffset, scrollToOptions.top != null ? scrollToOptions.top : window.pageYOffset);\r\n    }\r\n}\r\nfunction getScrollKey(path, delta) {\r\n    const position = history.state ? history.state.position - delta : -1;\r\n    return position + path;\r\n}\r\nconst scrollPositions = new Map();\r\nfunction saveScrollPosition(key, scrollPosition) {\r\n    scrollPositions.set(key, scrollPosition);\r\n}\r\nfunction getSavedScrollPosition(key) {\r\n    const scroll = scrollPositions.get(key);\r\n    // consume it so it's not used again\r\n    scrollPositions.delete(key);\r\n    return scroll;\r\n}\r\n// TODO: RFC about how to save scroll position\r\n/**\r\n * ScrollBehavior instance used by the router to compute and restore the scroll\r\n * position when navigating.\r\n */\r\n// export interface ScrollHandler<ScrollPositionEntry extends HistoryStateValue, ScrollPosition extends ScrollPositionEntry> {\r\n//   // returns a scroll position that can be saved in history\r\n//   compute(): ScrollPositionEntry\r\n//   // can take an extended ScrollPositionEntry\r\n//   scroll(position: ScrollPosition): void\r\n// }\r\n// export const scrollHandler: ScrollHandler<ScrollPosition> = {\r\n//   compute: computeScroll,\r\n//   scroll: scrollToPosition,\r\n// }\n\nlet createBaseLocation = () => location.protocol + '//' + location.host;\r\n/**\r\n * Creates a normalized history location from a window.location object\r\n * @param location -\r\n */\r\nfunction createCurrentLocation(base, location) {\r\n    const { pathname, search, hash } = location;\r\n    // allows hash bases like #, /#, #/, #!, #!/, /#!/, or even /folder#end\r\n    const hashPos = base.indexOf('#');\r\n    if (hashPos > -1) {\r\n        let slicePos = hash.includes(base.slice(hashPos))\r\n            ? base.slice(hashPos).length\r\n            : 1;\r\n        let pathFromHash = hash.slice(slicePos);\r\n        // prepend the starting slash to hash so the url starts with /#\r\n        if (pathFromHash[0] !== '/')\r\n            pathFromHash = '/' + pathFromHash;\r\n        return stripBase(pathFromHash, '');\r\n    }\r\n    const path = stripBase(pathname, base);\r\n    return path + search + hash;\r\n}\r\nfunction useHistoryListeners(base, historyState, currentLocation, replace) {\r\n    let listeners = [];\r\n    let teardowns = [];\r\n    // TODO: should it be a stack? a Dict. Check if the popstate listener\r\n    // can trigger twice\r\n    let pauseState = null;\r\n    const popStateHandler = ({ state, }) => {\r\n        const to = createCurrentLocation(base, location);\r\n        const from = currentLocation.value;\r\n        const fromState = historyState.value;\r\n        let delta = 0;\r\n        if (state) {\r\n            currentLocation.value = to;\r\n            historyState.value = state;\r\n            // ignore the popstate and reset the pauseState\r\n            if (pauseState && pauseState === from) {\r\n                pauseState = null;\r\n                return;\r\n            }\r\n            delta = fromState ? state.position - fromState.position : 0;\r\n        }\r\n        else {\r\n            replace(to);\r\n        }\r\n        // console.log({ deltaFromCurrent })\r\n        // Here we could also revert the navigation by calling history.go(-delta)\r\n        // this listener will have to be adapted to not trigger again and to wait for the url\r\n        // to be updated before triggering the listeners. Some kind of validation function would also\r\n        // need to be passed to the listeners so the navigation can be accepted\r\n        // call all listeners\r\n        listeners.forEach(listener => {\r\n            listener(currentLocation.value, from, {\r\n                delta,\r\n                type: NavigationType.pop,\r\n                direction: delta\r\n                    ? delta > 0\r\n                        ? NavigationDirection.forward\r\n                        : NavigationDirection.back\r\n                    : NavigationDirection.unknown,\r\n            });\r\n        });\r\n    };\r\n    function pauseListeners() {\r\n        pauseState = currentLocation.value;\r\n    }\r\n    function listen(callback) {\r\n        // set up the listener and prepare teardown callbacks\r\n        listeners.push(callback);\r\n        const teardown = () => {\r\n            const index = listeners.indexOf(callback);\r\n            if (index > -1)\r\n                listeners.splice(index, 1);\r\n        };\r\n        teardowns.push(teardown);\r\n        return teardown;\r\n    }\r\n    function beforeUnloadListener() {\r\n        const { history } = window;\r\n        if (!history.state)\r\n            return;\r\n        history.replaceState(assign({}, history.state, { scroll: computeScrollPosition() }), '');\r\n    }\r\n    function destroy() {\r\n        for (const teardown of teardowns)\r\n            teardown();\r\n        teardowns = [];\r\n        window.removeEventListener('popstate', popStateHandler);\r\n        window.removeEventListener('beforeunload', beforeUnloadListener);\r\n    }\r\n    // set up the listeners and prepare teardown callbacks\r\n    window.addEventListener('popstate', popStateHandler);\r\n    window.addEventListener('beforeunload', beforeUnloadListener);\r\n    return {\r\n        pauseListeners,\r\n        listen,\r\n        destroy,\r\n    };\r\n}\r\n/**\r\n * Creates a state object\r\n */\r\nfunction buildState(back, current, forward, replaced = false, computeScroll = false) {\r\n    return {\r\n        back,\r\n        current,\r\n        forward,\r\n        replaced,\r\n        position: window.history.length,\r\n        scroll: computeScroll ? computeScrollPosition() : null,\r\n    };\r\n}\r\nfunction useHistoryStateNavigation(base) {\r\n    const { history, location } = window;\r\n    // private variables\r\n    const currentLocation = {\r\n        value: createCurrentLocation(base, location),\r\n    };\r\n    const historyState = { value: history.state };\r\n    // build current history entry as this is a fresh navigation\r\n    if (!historyState.value) {\r\n        changeLocation(currentLocation.value, {\r\n            back: null,\r\n            current: currentLocation.value,\r\n            forward: null,\r\n            // the length is off by one, we need to decrease it\r\n            position: history.length - 1,\r\n            replaced: true,\r\n            // don't add a scroll as the user may have an anchor, and we want\r\n            // scrollBehavior to be triggered without a saved position\r\n            scroll: null,\r\n        }, true);\r\n    }\r\n    function changeLocation(to, state, replace) {\r\n        /**\r\n         * if a base tag is provided, and we are on a normal domain, we have to\r\n         * respect the provided `base` attribute because pushState() will use it and\r\n         * potentially erase anything before the `#` like at\r\n         * https://github.com/vuejs/router/issues/685 where a base of\r\n         * `/folder/#` but a base of `/` would erase the `/folder/` section. If\r\n         * there is no host, the `<base>` tag makes no sense and if there isn't a\r\n         * base tag we can just use everything after the `#`.\r\n         */\r\n        const hashIndex = base.indexOf('#');\r\n        const url = hashIndex > -1\r\n            ? (location.host && document.querySelector('base')\r\n                ? base\r\n                : base.slice(hashIndex)) + to\r\n            : createBaseLocation() + base + to;\r\n        try {\r\n            // BROWSER QUIRK\r\n            // NOTE: Safari throws a SecurityError when calling this function 100 times in 30 seconds\r\n            history[replace ? 'replaceState' : 'pushState'](state, '', url);\r\n            historyState.value = state;\r\n        }\r\n        catch (err) {\r\n            if ((true)) {\r\n                warn('Error with push/replace State', err);\r\n            }\r\n            else {}\r\n            // Force the navigation, this also resets the call count\r\n            location[replace ? 'replace' : 'assign'](url);\r\n        }\r\n    }\r\n    function replace(to, data) {\r\n        const state = assign({}, history.state, buildState(historyState.value.back, \r\n        // keep back and forward entries but override current position\r\n        to, historyState.value.forward, true), data, { position: historyState.value.position });\r\n        changeLocation(to, state, true);\r\n        currentLocation.value = to;\r\n    }\r\n    function push(to, data) {\r\n        // Add to current entry the information of where we are going\r\n        // as well as saving the current position\r\n        const currentState = assign({}, \r\n        // use current history state to gracefully handle a wrong call to\r\n        // history.replaceState\r\n        // https://github.com/vuejs/router/issues/366\r\n        historyState.value, history.state, {\r\n            forward: to,\r\n            scroll: computeScrollPosition(),\r\n        });\r\n        if (( true) && !history.state) {\r\n            warn(`history.state seems to have been manually replaced without preserving the necessary values. Make sure to preserve existing history state if you are manually calling history.replaceState:\\n\\n` +\r\n                `history.replaceState(history.state, '', url)\\n\\n` +\r\n                `You can find more information at https://next.router.vuejs.org/guide/migration/#usage-of-history-state.`);\r\n        }\r\n        changeLocation(currentState.current, currentState, true);\r\n        const state = assign({}, buildState(currentLocation.value, to, null), { position: currentState.position + 1 }, data);\r\n        changeLocation(to, state, false);\r\n        currentLocation.value = to;\r\n    }\r\n    return {\r\n        location: currentLocation,\r\n        state: historyState,\r\n        push,\r\n        replace,\r\n    };\r\n}\r\n/**\r\n * Creates an HTML5 history. Most common history for single page applications.\r\n *\r\n * @param base -\r\n */\r\nfunction createWebHistory(base) {\r\n    base = normalizeBase(base);\r\n    const historyNavigation = useHistoryStateNavigation(base);\r\n    const historyListeners = useHistoryListeners(base, historyNavigation.state, historyNavigation.location, historyNavigation.replace);\r\n    function go(delta, triggerListeners = true) {\r\n        if (!triggerListeners)\r\n            historyListeners.pauseListeners();\r\n        history.go(delta);\r\n    }\r\n    const routerHistory = assign({\r\n        // it's overridden right after\r\n        location: '',\r\n        base,\r\n        go,\r\n        createHref: createHref.bind(null, base),\r\n    }, historyNavigation, historyListeners);\r\n    Object.defineProperty(routerHistory, 'location', {\r\n        enumerable: true,\r\n        get: () => historyNavigation.location.value,\r\n    });\r\n    Object.defineProperty(routerHistory, 'state', {\r\n        enumerable: true,\r\n        get: () => historyNavigation.state.value,\r\n    });\r\n    return routerHistory;\r\n}\n\n/**\r\n * Creates an in-memory based history. The main purpose of this history is to handle SSR. It starts in a special location that is nowhere.\r\n * It's up to the user to replace that location with the starter location by either calling `router.push` or `router.replace`.\r\n *\r\n * @param base - Base applied to all urls, defaults to '/'\r\n * @returns a history object that can be passed to the router constructor\r\n */\r\nfunction createMemoryHistory(base = '') {\r\n    let listeners = [];\r\n    let queue = [START];\r\n    let position = 0;\r\n    base = normalizeBase(base);\r\n    function setLocation(location) {\r\n        position++;\r\n        if (position === queue.length) {\r\n            // we are at the end, we can simply append a new entry\r\n            queue.push(location);\r\n        }\r\n        else {\r\n            // we are in the middle, we remove everything from here in the queue\r\n            queue.splice(position);\r\n            queue.push(location);\r\n        }\r\n    }\r\n    function triggerListeners(to, from, { direction, delta }) {\r\n        const info = {\r\n            direction,\r\n            delta,\r\n            type: NavigationType.pop,\r\n        };\r\n        for (const callback of listeners) {\r\n            callback(to, from, info);\r\n        }\r\n    }\r\n    const routerHistory = {\r\n        // rewritten by Object.defineProperty\r\n        location: START,\r\n        // TODO: should be kept in queue\r\n        state: {},\r\n        base,\r\n        createHref: createHref.bind(null, base),\r\n        replace(to) {\r\n            // remove current entry and decrement position\r\n            queue.splice(position--, 1);\r\n            setLocation(to);\r\n        },\r\n        push(to, data) {\r\n            setLocation(to);\r\n        },\r\n        listen(callback) {\r\n            listeners.push(callback);\r\n            return () => {\r\n                const index = listeners.indexOf(callback);\r\n                if (index > -1)\r\n                    listeners.splice(index, 1);\r\n            };\r\n        },\r\n        destroy() {\r\n            listeners = [];\r\n            queue = [START];\r\n            position = 0;\r\n        },\r\n        go(delta, shouldTrigger = true) {\r\n            const from = this.location;\r\n            const direction = \r\n            // we are considering delta === 0 going forward, but in abstract mode\r\n            // using 0 for the delta doesn't make sense like it does in html5 where\r\n            // it reloads the page\r\n            delta < 0 ? NavigationDirection.back : NavigationDirection.forward;\r\n            position = Math.max(0, Math.min(position + delta, queue.length - 1));\r\n            if (shouldTrigger) {\r\n                triggerListeners(this.location, from, {\r\n                    direction,\r\n                    delta,\r\n                });\r\n            }\r\n        },\r\n    };\r\n    Object.defineProperty(routerHistory, 'location', {\r\n        enumerable: true,\r\n        get: () => queue[position],\r\n    });\r\n    return routerHistory;\r\n}\n\n/**\r\n * Creates a hash history. Useful for web applications with no host (e.g. `file://`) or when configuring a server to\r\n * handle any URL is not possible.\r\n *\r\n * @param base - optional base to provide. Defaults to `location.pathname + location.search` If there is a `<base>` tag\r\n * in the `head`, its value will be ignored in favor of this parameter **but note it affects all the history.pushState()\r\n * calls**, meaning that if you use a `<base>` tag, it's `href` value **has to match this parameter** (ignoring anything\r\n * after the `#`).\r\n *\r\n * @example\r\n * ```js\r\n * // at https://example.com/folder\r\n * createWebHashHistory() // gives a url of `https://example.com/folder#`\r\n * createWebHashHistory('/folder/') // gives a url of `https://example.com/folder/#`\r\n * // if the `#` is provided in the base, it won't be added by `createWebHashHistory`\r\n * createWebHashHistory('/folder/#/app/') // gives a url of `https://example.com/folder/#/app/`\r\n * // you should avoid doing this because it changes the original url and breaks copying urls\r\n * createWebHashHistory('/other-folder/') // gives a url of `https://example.com/other-folder/#`\r\n *\r\n * // at file:///usr/etc/folder/index.html\r\n * // for locations with no `host`, the base is ignored\r\n * createWebHashHistory('/iAmIgnored') // gives a url of `file:///usr/etc/folder/index.html#`\r\n * ```\r\n */\r\nfunction createWebHashHistory(base) {\r\n    // Make sure this implementation is fine in terms of encoding, specially for IE11\r\n    // for `file://`, directly use the pathname and ignore the base\r\n    // location.pathname contains an initial `/` even at the root: `https://example.com`\r\n    base = location.host ? base || location.pathname + location.search : '';\r\n    // allow the user to provide a `#` in the middle: `/base/#/app`\r\n    if (!base.includes('#'))\r\n        base += '#';\r\n    if (( true) && !base.endsWith('#/') && !base.endsWith('#')) {\r\n        warn(`A hash base must end with a \"#\":\\n\"${base}\" should be \"${base.replace(/#.*$/, '#')}\".`);\r\n    }\r\n    return createWebHistory(base);\r\n}\n\nfunction isRouteLocation(route) {\r\n    return typeof route === 'string' || (route && typeof route === 'object');\r\n}\r\nfunction isRouteName(name) {\r\n    return typeof name === 'string' || typeof name === 'symbol';\r\n}\n\n/**\r\n * Initial route location where the router is. Can be used in navigation guards\r\n * to differentiate the initial navigation.\r\n *\r\n * @example\r\n * ```js\r\n * import { START_LOCATION } from 'vue-router'\r\n *\r\n * router.beforeEach((to, from) => {\r\n *   if (from === START_LOCATION) {\r\n *     // initial navigation\r\n *   }\r\n * })\r\n * ```\r\n */\r\nconst START_LOCATION_NORMALIZED = {\r\n    path: '/',\r\n    name: undefined,\r\n    params: {},\r\n    query: {},\r\n    hash: '',\r\n    fullPath: '/',\r\n    matched: [],\r\n    meta: {},\r\n    redirectedFrom: undefined,\r\n};\n\nconst NavigationFailureSymbol = Symbol(( true) ? 'navigation failure' : 0);\r\n/**\r\n * Enumeration with all possible types for navigation failures. Can be passed to\r\n * {@link isNavigationFailure} to check for specific failures.\r\n */\r\nvar NavigationFailureType;\r\n(function (NavigationFailureType) {\r\n    /**\r\n     * An aborted navigation is a navigation that failed because a navigation\r\n     * guard returned `false` or called `next(false)`\r\n     */\r\n    NavigationFailureType[NavigationFailureType[\"aborted\"] = 4] = \"aborted\";\r\n    /**\r\n     * A cancelled navigation is a navigation that failed because a more recent\r\n     * navigation finished started (not necessarily finished).\r\n     */\r\n    NavigationFailureType[NavigationFailureType[\"cancelled\"] = 8] = \"cancelled\";\r\n    /**\r\n     * A duplicated navigation is a navigation that failed because it was\r\n     * initiated while already being at the exact same location.\r\n     */\r\n    NavigationFailureType[NavigationFailureType[\"duplicated\"] = 16] = \"duplicated\";\r\n})(NavigationFailureType || (NavigationFailureType = {}));\r\n// DEV only debug messages\r\nconst ErrorTypeMessages = {\r\n    [1 /* ErrorTypes.MATCHER_NOT_FOUND */]({ location, currentLocation }) {\r\n        return `No match for\\n ${JSON.stringify(location)}${currentLocation\r\n            ? '\\nwhile being at\\n' + JSON.stringify(currentLocation)\r\n            : ''}`;\r\n    },\r\n    [2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */]({ from, to, }) {\r\n        return `Redirected from \"${from.fullPath}\" to \"${stringifyRoute(to)}\" via a navigation guard.`;\r\n    },\r\n    [4 /* ErrorTypes.NAVIGATION_ABORTED */]({ from, to }) {\r\n        return `Navigation aborted from \"${from.fullPath}\" to \"${to.fullPath}\" via a navigation guard.`;\r\n    },\r\n    [8 /* ErrorTypes.NAVIGATION_CANCELLED */]({ from, to }) {\r\n        return `Navigation cancelled from \"${from.fullPath}\" to \"${to.fullPath}\" with a new navigation.`;\r\n    },\r\n    [16 /* ErrorTypes.NAVIGATION_DUPLICATED */]({ from, to }) {\r\n        return `Avoided redundant navigation to current location: \"${from.fullPath}\".`;\r\n    },\r\n};\r\nfunction createRouterError(type, params) {\r\n    // keep full error messages in cjs versions\r\n    if (true) {\r\n        return assign(new Error(ErrorTypeMessages[type](params)), {\r\n            type,\r\n            [NavigationFailureSymbol]: true,\r\n        }, params);\r\n    }\r\n    else {}\r\n}\r\nfunction isNavigationFailure(error, type) {\r\n    return (error instanceof Error &&\r\n        NavigationFailureSymbol in error &&\r\n        (type == null || !!(error.type & type)));\r\n}\r\nconst propertiesToLog = ['params', 'query', 'hash'];\r\nfunction stringifyRoute(to) {\r\n    if (typeof to === 'string')\r\n        return to;\r\n    if ('path' in to)\r\n        return to.path;\r\n    const location = {};\r\n    for (const key of propertiesToLog) {\r\n        if (key in to)\r\n            location[key] = to[key];\r\n    }\r\n    return JSON.stringify(location, null, 2);\r\n}\n\n// default pattern for a param: non-greedy everything but /\r\nconst BASE_PARAM_PATTERN = '[^/]+?';\r\nconst BASE_PATH_PARSER_OPTIONS = {\r\n    sensitive: false,\r\n    strict: false,\r\n    start: true,\r\n    end: true,\r\n};\r\n// Special Regex characters that must be escaped in static tokens\r\nconst REGEX_CHARS_RE = /[.+*?^${}()[\\]/\\\\]/g;\r\n/**\r\n * Creates a path parser from an array of Segments (a segment is an array of Tokens)\r\n *\r\n * @param segments - array of segments returned by tokenizePath\r\n * @param extraOptions - optional options for the regexp\r\n * @returns a PathParser\r\n */\r\nfunction tokensToParser(segments, extraOptions) {\r\n    const options = assign({}, BASE_PATH_PARSER_OPTIONS, extraOptions);\r\n    // the amount of scores is the same as the length of segments except for the root segment \"/\"\r\n    const score = [];\r\n    // the regexp as a string\r\n    let pattern = options.start ? '^' : '';\r\n    // extracted keys\r\n    const keys = [];\r\n    for (const segment of segments) {\r\n        // the root segment needs special treatment\r\n        const segmentScores = segment.length ? [] : [90 /* PathScore.Root */];\r\n        // allow trailing slash\r\n        if (options.strict && !segment.length)\r\n            pattern += '/';\r\n        for (let tokenIndex = 0; tokenIndex < segment.length; tokenIndex++) {\r\n            const token = segment[tokenIndex];\r\n            // resets the score if we are inside a sub-segment /:a-other-:b\r\n            let subSegmentScore = 40 /* PathScore.Segment */ +\r\n                (options.sensitive ? 0.25 /* PathScore.BonusCaseSensitive */ : 0);\r\n            if (token.type === 0 /* TokenType.Static */) {\r\n                // prepend the slash if we are starting a new segment\r\n                if (!tokenIndex)\r\n                    pattern += '/';\r\n                pattern += token.value.replace(REGEX_CHARS_RE, '\\\\$&');\r\n                subSegmentScore += 40 /* PathScore.Static */;\r\n            }\r\n            else if (token.type === 1 /* TokenType.Param */) {\r\n                const { value, repeatable, optional, regexp } = token;\r\n                keys.push({\r\n                    name: value,\r\n                    repeatable,\r\n                    optional,\r\n                });\r\n                const re = regexp ? regexp : BASE_PARAM_PATTERN;\r\n                // the user provided a custom regexp /:id(\\\\d+)\r\n                if (re !== BASE_PARAM_PATTERN) {\r\n                    subSegmentScore += 10 /* PathScore.BonusCustomRegExp */;\r\n                    // make sure the regexp is valid before using it\r\n                    try {\r\n                        new RegExp(`(${re})`);\r\n                    }\r\n                    catch (err) {\r\n                        throw new Error(`Invalid custom RegExp for param \"${value}\" (${re}): ` +\r\n                            err.message);\r\n                    }\r\n                }\r\n                // when we repeat we must take care of the repeating leading slash\r\n                let subPattern = repeatable ? `((?:${re})(?:/(?:${re}))*)` : `(${re})`;\r\n                // prepend the slash if we are starting a new segment\r\n                if (!tokenIndex)\r\n                    subPattern =\r\n                        // avoid an optional / if there are more segments e.g. /:p?-static\r\n                        // or /:p?-:p2\r\n                        optional && segment.length < 2\r\n                            ? `(?:/${subPattern})`\r\n                            : '/' + subPattern;\r\n                if (optional)\r\n                    subPattern += '?';\r\n                pattern += subPattern;\r\n                subSegmentScore += 20 /* PathScore.Dynamic */;\r\n                if (optional)\r\n                    subSegmentScore += -8 /* PathScore.BonusOptional */;\r\n                if (repeatable)\r\n                    subSegmentScore += -20 /* PathScore.BonusRepeatable */;\r\n                if (re === '.*')\r\n                    subSegmentScore += -50 /* PathScore.BonusWildcard */;\r\n            }\r\n            segmentScores.push(subSegmentScore);\r\n        }\r\n        // an empty array like /home/ -> [[{home}], []]\r\n        // if (!segment.length) pattern += '/'\r\n        score.push(segmentScores);\r\n    }\r\n    // only apply the strict bonus to the last score\r\n    if (options.strict && options.end) {\r\n        const i = score.length - 1;\r\n        score[i][score[i].length - 1] += 0.7000000000000001 /* PathScore.BonusStrict */;\r\n    }\r\n    // TODO: dev only warn double trailing slash\r\n    if (!options.strict)\r\n        pattern += '/?';\r\n    if (options.end)\r\n        pattern += '$';\r\n    // allow paths like /dynamic to only match dynamic or dynamic/... but not dynamic_something_else\r\n    else if (options.strict)\r\n        pattern += '(?:/|$)';\r\n    const re = new RegExp(pattern, options.sensitive ? '' : 'i');\r\n    function parse(path) {\r\n        const match = path.match(re);\r\n        const params = {};\r\n        if (!match)\r\n            return null;\r\n        for (let i = 1; i < match.length; i++) {\r\n            const value = match[i] || '';\r\n            const key = keys[i - 1];\r\n            params[key.name] = value && key.repeatable ? value.split('/') : value;\r\n        }\r\n        return params;\r\n    }\r\n    function stringify(params) {\r\n        let path = '';\r\n        // for optional parameters to allow to be empty\r\n        let avoidDuplicatedSlash = false;\r\n        for (const segment of segments) {\r\n            if (!avoidDuplicatedSlash || !path.endsWith('/'))\r\n                path += '/';\r\n            avoidDuplicatedSlash = false;\r\n            for (const token of segment) {\r\n                if (token.type === 0 /* TokenType.Static */) {\r\n                    path += token.value;\r\n                }\r\n                else if (token.type === 1 /* TokenType.Param */) {\r\n                    const { value, repeatable, optional } = token;\r\n                    const param = value in params ? params[value] : '';\r\n                    if (isArray(param) && !repeatable) {\r\n                        throw new Error(`Provided param \"${value}\" is an array but it is not repeatable (* or + modifiers)`);\r\n                    }\r\n                    const text = isArray(param)\r\n                        ? param.join('/')\r\n                        : param;\r\n                    if (!text) {\r\n                        if (optional) {\r\n                            // if we have more than one optional param like /:a?-static we don't need to care about the optional param\r\n                            if (segment.length < 2) {\r\n                                // remove the last slash as we could be at the end\r\n                                if (path.endsWith('/'))\r\n                                    path = path.slice(0, -1);\r\n                                // do not append a slash on the next iteration\r\n                                else\r\n                                    avoidDuplicatedSlash = true;\r\n                            }\r\n                        }\r\n                        else\r\n                            throw new Error(`Missing required param \"${value}\"`);\r\n                    }\r\n                    path += text;\r\n                }\r\n            }\r\n        }\r\n        // avoid empty path when we have multiple optional params\r\n        return path || '/';\r\n    }\r\n    return {\r\n        re,\r\n        score,\r\n        keys,\r\n        parse,\r\n        stringify,\r\n    };\r\n}\r\n/**\r\n * Compares an array of numbers as used in PathParser.score and returns a\r\n * number. This function can be used to `sort` an array\r\n *\r\n * @param a - first array of numbers\r\n * @param b - second array of numbers\r\n * @returns 0 if both are equal, < 0 if a should be sorted first, > 0 if b\r\n * should be sorted first\r\n */\r\nfunction compareScoreArray(a, b) {\r\n    let i = 0;\r\n    while (i < a.length && i < b.length) {\r\n        const diff = b[i] - a[i];\r\n        // only keep going if diff === 0\r\n        if (diff)\r\n            return diff;\r\n        i++;\r\n    }\r\n    // if the last subsegment was Static, the shorter segments should be sorted first\r\n    // otherwise sort the longest segment first\r\n    if (a.length < b.length) {\r\n        return a.length === 1 && a[0] === 40 /* PathScore.Static */ + 40 /* PathScore.Segment */\r\n            ? -1\r\n            : 1;\r\n    }\r\n    else if (a.length > b.length) {\r\n        return b.length === 1 && b[0] === 40 /* PathScore.Static */ + 40 /* PathScore.Segment */\r\n            ? 1\r\n            : -1;\r\n    }\r\n    return 0;\r\n}\r\n/**\r\n * Compare function that can be used with `sort` to sort an array of PathParser\r\n *\r\n * @param a - first PathParser\r\n * @param b - second PathParser\r\n * @returns 0 if both are equal, < 0 if a should be sorted first, > 0 if b\r\n */\r\nfunction comparePathParserScore(a, b) {\r\n    let i = 0;\r\n    const aScore = a.score;\r\n    const bScore = b.score;\r\n    while (i < aScore.length && i < bScore.length) {\r\n        const comp = compareScoreArray(aScore[i], bScore[i]);\r\n        // do not return if both are equal\r\n        if (comp)\r\n            return comp;\r\n        i++;\r\n    }\r\n    if (Math.abs(bScore.length - aScore.length) === 1) {\r\n        if (isLastScoreNegative(aScore))\r\n            return 1;\r\n        if (isLastScoreNegative(bScore))\r\n            return -1;\r\n    }\r\n    // if a and b share the same score entries but b has more, sort b first\r\n    return bScore.length - aScore.length;\r\n    // this is the ternary version\r\n    // return aScore.length < bScore.length\r\n    //   ? 1\r\n    //   : aScore.length > bScore.length\r\n    //   ? -1\r\n    //   : 0\r\n}\r\n/**\r\n * This allows detecting splats at the end of a path: /home/:id(.*)*\r\n *\r\n * @param score - score to check\r\n * @returns true if the last entry is negative\r\n */\r\nfunction isLastScoreNegative(score) {\r\n    const last = score[score.length - 1];\r\n    return score.length > 0 && last[last.length - 1] < 0;\r\n}\n\nconst ROOT_TOKEN = {\r\n    type: 0 /* TokenType.Static */,\r\n    value: '',\r\n};\r\nconst VALID_PARAM_RE = /[a-zA-Z0-9_]/;\r\n// After some profiling, the cache seems to be unnecessary because tokenizePath\r\n// (the slowest part of adding a route) is very fast\r\n// const tokenCache = new Map<string, Token[][]>()\r\nfunction tokenizePath(path) {\r\n    if (!path)\r\n        return [[]];\r\n    if (path === '/')\r\n        return [[ROOT_TOKEN]];\r\n    if (!path.startsWith('/')) {\r\n        throw new Error(( true)\r\n            ? `Route paths should start with a \"/\": \"${path}\" should be \"/${path}\".`\r\n            : 0);\r\n    }\r\n    // if (tokenCache.has(path)) return tokenCache.get(path)!\r\n    function crash(message) {\r\n        throw new Error(`ERR (${state})/\"${buffer}\": ${message}`);\r\n    }\r\n    let state = 0 /* TokenizerState.Static */;\r\n    let previousState = state;\r\n    const tokens = [];\r\n    // the segment will always be valid because we get into the initial state\r\n    // with the leading /\r\n    let segment;\r\n    function finalizeSegment() {\r\n        if (segment)\r\n            tokens.push(segment);\r\n        segment = [];\r\n    }\r\n    // index on the path\r\n    let i = 0;\r\n    // char at index\r\n    let char;\r\n    // buffer of the value read\r\n    let buffer = '';\r\n    // custom regexp for a param\r\n    let customRe = '';\r\n    function consumeBuffer() {\r\n        if (!buffer)\r\n            return;\r\n        if (state === 0 /* TokenizerState.Static */) {\r\n            segment.push({\r\n                type: 0 /* TokenType.Static */,\r\n                value: buffer,\r\n            });\r\n        }\r\n        else if (state === 1 /* TokenizerState.Param */ ||\r\n            state === 2 /* TokenizerState.ParamRegExp */ ||\r\n            state === 3 /* TokenizerState.ParamRegExpEnd */) {\r\n            if (segment.length > 1 && (char === '*' || char === '+'))\r\n                crash(`A repeatable param (${buffer}) must be alone in its segment. eg: '/:ids+.`);\r\n            segment.push({\r\n                type: 1 /* TokenType.Param */,\r\n                value: buffer,\r\n                regexp: customRe,\r\n                repeatable: char === '*' || char === '+',\r\n                optional: char === '*' || char === '?',\r\n            });\r\n        }\r\n        else {\r\n            crash('Invalid state to consume buffer');\r\n        }\r\n        buffer = '';\r\n    }\r\n    function addCharToBuffer() {\r\n        buffer += char;\r\n    }\r\n    while (i < path.length) {\r\n        char = path[i++];\r\n        if (char === '\\\\' && state !== 2 /* TokenizerState.ParamRegExp */) {\r\n            previousState = state;\r\n            state = 4 /* TokenizerState.EscapeNext */;\r\n            continue;\r\n        }\r\n        switch (state) {\r\n            case 0 /* TokenizerState.Static */:\r\n                if (char === '/') {\r\n                    if (buffer) {\r\n                        consumeBuffer();\r\n                    }\r\n                    finalizeSegment();\r\n                }\r\n                else if (char === ':') {\r\n                    consumeBuffer();\r\n                    state = 1 /* TokenizerState.Param */;\r\n                }\r\n                else {\r\n                    addCharToBuffer();\r\n                }\r\n                break;\r\n            case 4 /* TokenizerState.EscapeNext */:\r\n                addCharToBuffer();\r\n                state = previousState;\r\n                break;\r\n            case 1 /* TokenizerState.Param */:\r\n                if (char === '(') {\r\n                    state = 2 /* TokenizerState.ParamRegExp */;\r\n                }\r\n                else if (VALID_PARAM_RE.test(char)) {\r\n                    addCharToBuffer();\r\n                }\r\n                else {\r\n                    consumeBuffer();\r\n                    state = 0 /* TokenizerState.Static */;\r\n                    // go back one character if we were not modifying\r\n                    if (char !== '*' && char !== '?' && char !== '+')\r\n                        i--;\r\n                }\r\n                break;\r\n            case 2 /* TokenizerState.ParamRegExp */:\r\n                // TODO: is it worth handling nested regexp? like :p(?:prefix_([^/]+)_suffix)\r\n                // it already works by escaping the closing )\r\n                // https://paths.esm.dev/?p=AAMeJbiAwQEcDKbAoAAkP60PG2R6QAvgNaA6AFACM2ABuQBB#\r\n                // is this really something people need since you can also write\r\n                // /prefix_:p()_suffix\r\n                if (char === ')') {\r\n                    // handle the escaped )\r\n                    if (customRe[customRe.length - 1] == '\\\\')\r\n                        customRe = customRe.slice(0, -1) + char;\r\n                    else\r\n                        state = 3 /* TokenizerState.ParamRegExpEnd */;\r\n                }\r\n                else {\r\n                    customRe += char;\r\n                }\r\n                break;\r\n            case 3 /* TokenizerState.ParamRegExpEnd */:\r\n                // same as finalizing a param\r\n                consumeBuffer();\r\n                state = 0 /* TokenizerState.Static */;\r\n                // go back one character if we were not modifying\r\n                if (char !== '*' && char !== '?' && char !== '+')\r\n                    i--;\r\n                customRe = '';\r\n                break;\r\n            default:\r\n                crash('Unknown state');\r\n                break;\r\n        }\r\n    }\r\n    if (state === 2 /* TokenizerState.ParamRegExp */)\r\n        crash(`Unfinished custom RegExp for param \"${buffer}\"`);\r\n    consumeBuffer();\r\n    finalizeSegment();\r\n    // tokenCache.set(path, tokens)\r\n    return tokens;\r\n}\n\nfunction createRouteRecordMatcher(record, parent, options) {\r\n    const parser = tokensToParser(tokenizePath(record.path), options);\r\n    // warn against params with the same name\r\n    if ((true)) {\r\n        const existingKeys = new Set();\r\n        for (const key of parser.keys) {\r\n            if (existingKeys.has(key.name))\r\n                warn(`Found duplicated params with name \"${key.name}\" for path \"${record.path}\". Only the last one will be available on \"$route.params\".`);\r\n            existingKeys.add(key.name);\r\n        }\r\n    }\r\n    const matcher = assign(parser, {\r\n        record,\r\n        parent,\r\n        // these needs to be populated by the parent\r\n        children: [],\r\n        alias: [],\r\n    });\r\n    if (parent) {\r\n        // both are aliases or both are not aliases\r\n        // we don't want to mix them because the order is used when\r\n        // passing originalRecord in Matcher.addRoute\r\n        if (!matcher.record.aliasOf === !parent.record.aliasOf)\r\n            parent.children.push(matcher);\r\n    }\r\n    return matcher;\r\n}\n\n/**\r\n * Creates a Router Matcher.\r\n *\r\n * @internal\r\n * @param routes - array of initial routes\r\n * @param globalOptions - global route options\r\n */\r\nfunction createRouterMatcher(routes, globalOptions) {\r\n    // normalized ordered array of matchers\r\n    const matchers = [];\r\n    const matcherMap = new Map();\r\n    globalOptions = mergeOptions({ strict: false, end: true, sensitive: false }, globalOptions);\r\n    function getRecordMatcher(name) {\r\n        return matcherMap.get(name);\r\n    }\r\n    function addRoute(record, parent, originalRecord) {\r\n        // used later on to remove by name\r\n        const isRootAdd = !originalRecord;\r\n        const mainNormalizedRecord = normalizeRouteRecord(record);\r\n        if ((true)) {\r\n            checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent);\r\n        }\r\n        // we might be the child of an alias\r\n        mainNormalizedRecord.aliasOf = originalRecord && originalRecord.record;\r\n        const options = mergeOptions(globalOptions, record);\r\n        // generate an array of records to correctly handle aliases\r\n        const normalizedRecords = [\r\n            mainNormalizedRecord,\r\n        ];\r\n        if ('alias' in record) {\r\n            const aliases = typeof record.alias === 'string' ? [record.alias] : record.alias;\r\n            for (const alias of aliases) {\r\n                normalizedRecords.push(assign({}, mainNormalizedRecord, {\r\n                    // this allows us to hold a copy of the `components` option\r\n                    // so that async components cache is hold on the original record\r\n                    components: originalRecord\r\n                        ? originalRecord.record.components\r\n                        : mainNormalizedRecord.components,\r\n                    path: alias,\r\n                    // we might be the child of an alias\r\n                    aliasOf: originalRecord\r\n                        ? originalRecord.record\r\n                        : mainNormalizedRecord,\r\n                    // the aliases are always of the same kind as the original since they\r\n                    // are defined on the same record\r\n                }));\r\n            }\r\n        }\r\n        let matcher;\r\n        let originalMatcher;\r\n        for (const normalizedRecord of normalizedRecords) {\r\n            const { path } = normalizedRecord;\r\n            // Build up the path for nested routes if the child isn't an absolute\r\n            // route. Only add the / delimiter if the child path isn't empty and if the\r\n            // parent path doesn't have a trailing slash\r\n            if (parent && path[0] !== '/') {\r\n                const parentPath = parent.record.path;\r\n                const connectingSlash = parentPath[parentPath.length - 1] === '/' ? '' : '/';\r\n                normalizedRecord.path =\r\n                    parent.record.path + (path && connectingSlash + path);\r\n            }\r\n            if (( true) && normalizedRecord.path === '*') {\r\n                throw new Error('Catch all routes (\"*\") must now be defined using a param with a custom regexp.\\n' +\r\n                    'See more at https://next.router.vuejs.org/guide/migration/#removed-star-or-catch-all-routes.');\r\n            }\r\n            // create the object beforehand, so it can be passed to children\r\n            matcher = createRouteRecordMatcher(normalizedRecord, parent, options);\r\n            if (( true) && parent && path[0] === '/')\r\n                checkMissingParamsInAbsolutePath(matcher, parent);\r\n            // if we are an alias we must tell the original record that we exist,\r\n            // so we can be removed\r\n            if (originalRecord) {\r\n                originalRecord.alias.push(matcher);\r\n                if ((true)) {\r\n                    checkSameParams(originalRecord, matcher);\r\n                }\r\n            }\r\n            else {\r\n                // otherwise, the first record is the original and others are aliases\r\n                originalMatcher = originalMatcher || matcher;\r\n                if (originalMatcher !== matcher)\r\n                    originalMatcher.alias.push(matcher);\r\n                // remove the route if named and only for the top record (avoid in nested calls)\r\n                // this works because the original record is the first one\r\n                if (isRootAdd && record.name && !isAliasRecord(matcher))\r\n                    removeRoute(record.name);\r\n            }\r\n            if (mainNormalizedRecord.children) {\r\n                const children = mainNormalizedRecord.children;\r\n                for (let i = 0; i < children.length; i++) {\r\n                    addRoute(children[i], matcher, originalRecord && originalRecord.children[i]);\r\n                }\r\n            }\r\n            // if there was no original record, then the first one was not an alias and all\r\n            // other aliases (if any) need to reference this record when adding children\r\n            originalRecord = originalRecord || matcher;\r\n            // TODO: add normalized records for more flexibility\r\n            // if (parent && isAliasRecord(originalRecord)) {\r\n            //   parent.children.push(originalRecord)\r\n            // }\r\n            // Avoid adding a record that doesn't display anything. This allows passing through records without a component to\r\n            // not be reached and pass through the catch all route\r\n            if ((matcher.record.components &&\r\n                Object.keys(matcher.record.components).length) ||\r\n                matcher.record.name ||\r\n                matcher.record.redirect) {\r\n                insertMatcher(matcher);\r\n            }\r\n        }\r\n        return originalMatcher\r\n            ? () => {\r\n                // since other matchers are aliases, they should be removed by the original matcher\r\n                removeRoute(originalMatcher);\r\n            }\r\n            : noop;\r\n    }\r\n    function removeRoute(matcherRef) {\r\n        if (isRouteName(matcherRef)) {\r\n            const matcher = matcherMap.get(matcherRef);\r\n            if (matcher) {\r\n                matcherMap.delete(matcherRef);\r\n                matchers.splice(matchers.indexOf(matcher), 1);\r\n                matcher.children.forEach(removeRoute);\r\n                matcher.alias.forEach(removeRoute);\r\n            }\r\n        }\r\n        else {\r\n            const index = matchers.indexOf(matcherRef);\r\n            if (index > -1) {\r\n                matchers.splice(index, 1);\r\n                if (matcherRef.record.name)\r\n                    matcherMap.delete(matcherRef.record.name);\r\n                matcherRef.children.forEach(removeRoute);\r\n                matcherRef.alias.forEach(removeRoute);\r\n            }\r\n        }\r\n    }\r\n    function getRoutes() {\r\n        return matchers;\r\n    }\r\n    function insertMatcher(matcher) {\r\n        let i = 0;\r\n        while (i < matchers.length &&\r\n            comparePathParserScore(matcher, matchers[i]) >= 0 &&\r\n            // Adding children with empty path should still appear before the parent\r\n            // https://github.com/vuejs/router/issues/1124\r\n            (matcher.record.path !== matchers[i].record.path ||\r\n                !isRecordChildOf(matcher, matchers[i])))\r\n            i++;\r\n        matchers.splice(i, 0, matcher);\r\n        // only add the original record to the name map\r\n        if (matcher.record.name && !isAliasRecord(matcher))\r\n            matcherMap.set(matcher.record.name, matcher);\r\n    }\r\n    function resolve(location, currentLocation) {\r\n        let matcher;\r\n        let params = {};\r\n        let path;\r\n        let name;\r\n        if ('name' in location && location.name) {\r\n            matcher = matcherMap.get(location.name);\r\n            if (!matcher)\r\n                throw createRouterError(1 /* ErrorTypes.MATCHER_NOT_FOUND */, {\r\n                    location,\r\n                });\r\n            // warn if the user is passing invalid params so they can debug it better when they get removed\r\n            if ((true)) {\r\n                const invalidParams = Object.keys(location.params || {}).filter(paramName => !matcher.keys.find(k => k.name === paramName));\r\n                if (invalidParams.length) {\r\n                    warn(`Discarded invalid param(s) \"${invalidParams.join('\", \"')}\" when navigating. See https://github.com/vuejs/router/blob/main/packages/router/CHANGELOG.md#414-2022-08-22 for more details.`);\r\n                }\r\n            }\r\n            name = matcher.record.name;\r\n            params = assign(\r\n            // paramsFromLocation is a new object\r\n            paramsFromLocation(currentLocation.params, \r\n            // only keep params that exist in the resolved location\r\n            // TODO: only keep optional params coming from a parent record\r\n            matcher.keys.filter(k => !k.optional).map(k => k.name)), \r\n            // discard any existing params in the current location that do not exist here\r\n            // #1497 this ensures better active/exact matching\r\n            location.params &&\r\n                paramsFromLocation(location.params, matcher.keys.map(k => k.name)));\r\n            // throws if cannot be stringified\r\n            path = matcher.stringify(params);\r\n        }\r\n        else if ('path' in location) {\r\n            // no need to resolve the path with the matcher as it was provided\r\n            // this also allows the user to control the encoding\r\n            path = location.path;\r\n            if (( true) && !path.startsWith('/')) {\r\n                warn(`The Matcher cannot resolve relative paths but received \"${path}\". Unless you directly called \\`matcher.resolve(\"${path}\")\\`, this is probably a bug in vue-router. Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/router.`);\r\n            }\r\n            matcher = matchers.find(m => m.re.test(path));\r\n            // matcher should have a value after the loop\r\n            if (matcher) {\r\n                // we know the matcher works because we tested the regexp\r\n                params = matcher.parse(path);\r\n                name = matcher.record.name;\r\n            }\r\n            // location is a relative path\r\n        }\r\n        else {\r\n            // match by name or path of current route\r\n            matcher = currentLocation.name\r\n                ? matcherMap.get(currentLocation.name)\r\n                : matchers.find(m => m.re.test(currentLocation.path));\r\n            if (!matcher)\r\n                throw createRouterError(1 /* ErrorTypes.MATCHER_NOT_FOUND */, {\r\n                    location,\r\n                    currentLocation,\r\n                });\r\n            name = matcher.record.name;\r\n            // since we are navigating to the same location, we don't need to pick the\r\n            // params like when `name` is provided\r\n            params = assign({}, currentLocation.params, location.params);\r\n            path = matcher.stringify(params);\r\n        }\r\n        const matched = [];\r\n        let parentMatcher = matcher;\r\n        while (parentMatcher) {\r\n            // reversed order so parents are at the beginning\r\n            matched.unshift(parentMatcher.record);\r\n            parentMatcher = parentMatcher.parent;\r\n        }\r\n        return {\r\n            name,\r\n            path,\r\n            params,\r\n            matched,\r\n            meta: mergeMetaFields(matched),\r\n        };\r\n    }\r\n    // add initial routes\r\n    routes.forEach(route => addRoute(route));\r\n    return { addRoute, resolve, removeRoute, getRoutes, getRecordMatcher };\r\n}\r\nfunction paramsFromLocation(params, keys) {\r\n    const newParams = {};\r\n    for (const key of keys) {\r\n        if (key in params)\r\n            newParams[key] = params[key];\r\n    }\r\n    return newParams;\r\n}\r\n/**\r\n * Normalizes a RouteRecordRaw. Creates a copy\r\n *\r\n * @param record\r\n * @returns the normalized version\r\n */\r\nfunction normalizeRouteRecord(record) {\r\n    return {\r\n        path: record.path,\r\n        redirect: record.redirect,\r\n        name: record.name,\r\n        meta: record.meta || {},\r\n        aliasOf: undefined,\r\n        beforeEnter: record.beforeEnter,\r\n        props: normalizeRecordProps(record),\r\n        children: record.children || [],\r\n        instances: {},\r\n        leaveGuards: new Set(),\r\n        updateGuards: new Set(),\r\n        enterCallbacks: {},\r\n        components: 'components' in record\r\n            ? record.components || null\r\n            : record.component && { default: record.component },\r\n    };\r\n}\r\n/**\r\n * Normalize the optional `props` in a record to always be an object similar to\r\n * components. Also accept a boolean for components.\r\n * @param record\r\n */\r\nfunction normalizeRecordProps(record) {\r\n    const propsObject = {};\r\n    // props does not exist on redirect records, but we can set false directly\r\n    const props = record.props || false;\r\n    if ('component' in record) {\r\n        propsObject.default = props;\r\n    }\r\n    else {\r\n        // NOTE: we could also allow a function to be applied to every component.\r\n        // Would need user feedback for use cases\r\n        for (const name in record.components)\r\n            propsObject[name] = typeof props === 'boolean' ? props : props[name];\r\n    }\r\n    return propsObject;\r\n}\r\n/**\r\n * Checks if a record or any of its parent is an alias\r\n * @param record\r\n */\r\nfunction isAliasRecord(record) {\r\n    while (record) {\r\n        if (record.record.aliasOf)\r\n            return true;\r\n        record = record.parent;\r\n    }\r\n    return false;\r\n}\r\n/**\r\n * Merge meta fields of an array of records\r\n *\r\n * @param matched - array of matched records\r\n */\r\nfunction mergeMetaFields(matched) {\r\n    return matched.reduce((meta, record) => assign(meta, record.meta), {});\r\n}\r\nfunction mergeOptions(defaults, partialOptions) {\r\n    const options = {};\r\n    for (const key in defaults) {\r\n        options[key] = key in partialOptions ? partialOptions[key] : defaults[key];\r\n    }\r\n    return options;\r\n}\r\nfunction isSameParam(a, b) {\r\n    return (a.name === b.name &&\r\n        a.optional === b.optional &&\r\n        a.repeatable === b.repeatable);\r\n}\r\n/**\r\n * Check if a path and its alias have the same required params\r\n *\r\n * @param a - original record\r\n * @param b - alias record\r\n */\r\nfunction checkSameParams(a, b) {\r\n    for (const key of a.keys) {\r\n        if (!key.optional && !b.keys.find(isSameParam.bind(null, key)))\r\n            return warn(`Alias \"${b.record.path}\" and the original record: \"${a.record.path}\" must have the exact same param named \"${key.name}\"`);\r\n    }\r\n    for (const key of b.keys) {\r\n        if (!key.optional && !a.keys.find(isSameParam.bind(null, key)))\r\n            return warn(`Alias \"${b.record.path}\" and the original record: \"${a.record.path}\" must have the exact same param named \"${key.name}\"`);\r\n    }\r\n}\r\n/**\r\n * A route with a name and a child with an empty path without a name should warn when adding the route\r\n *\r\n * @param mainNormalizedRecord - RouteRecordNormalized\r\n * @param parent - RouteRecordMatcher\r\n */\r\nfunction checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent) {\r\n    if (parent &&\r\n        parent.record.name &&\r\n        !mainNormalizedRecord.name &&\r\n        !mainNormalizedRecord.path) {\r\n        warn(`The route named \"${String(parent.record.name)}\" has a child without a name and an empty path. Using that name won't render the empty path child so you probably want to move the name to the child instead. If this is intentional, add a name to the child route to remove the warning.`);\r\n    }\r\n}\r\nfunction checkMissingParamsInAbsolutePath(record, parent) {\r\n    for (const key of parent.keys) {\r\n        if (!record.keys.find(isSameParam.bind(null, key)))\r\n            return warn(`Absolute path \"${record.record.path}\" must have the exact same param named \"${key.name}\" as its parent \"${parent.record.path}\".`);\r\n    }\r\n}\r\nfunction isRecordChildOf(record, parent) {\r\n    return parent.children.some(child => child === record || isRecordChildOf(record, child));\r\n}\n\n/**\r\n * Encoding Rules ␣ = Space Path: ␣ \" < > # ? { } Query: ␣ \" < > # & = Hash: ␣ \"\r\n * < > `\r\n *\r\n * On top of that, the RFC3986 (https://tools.ietf.org/html/rfc3986#section-2.2)\r\n * defines some extra characters to be encoded. Most browsers do not encode them\r\n * in encodeURI https://github.com/whatwg/url/issues/369, so it may be safer to\r\n * also encode `!'()*`. Leaving un-encoded only ASCII alphanumeric(`a-zA-Z0-9`)\r\n * plus `-._~`. This extra safety should be applied to query by patching the\r\n * string returned by encodeURIComponent encodeURI also encodes `[\\]^`. `\\`\r\n * should be encoded to avoid ambiguity. Browsers (IE, FF, C) transform a `\\`\r\n * into a `/` if directly typed in. The _backtick_ (`````) should also be\r\n * encoded everywhere because some browsers like FF encode it when directly\r\n * written while others don't. Safari and IE don't encode ``\"<>{}``` in hash.\r\n */\r\n// const EXTRA_RESERVED_RE = /[!'()*]/g\r\n// const encodeReservedReplacer = (c: string) => '%' + c.charCodeAt(0).toString(16)\r\nconst HASH_RE = /#/g; // %23\r\nconst AMPERSAND_RE = /&/g; // %26\r\nconst SLASH_RE = /\\//g; // %2F\r\nconst EQUAL_RE = /=/g; // %3D\r\nconst IM_RE = /\\?/g; // %3F\r\nconst PLUS_RE = /\\+/g; // %2B\r\n/**\r\n * NOTE: It's not clear to me if we should encode the + symbol in queries, it\r\n * seems to be less flexible than not doing so and I can't find out the legacy\r\n * systems requiring this for regular requests like text/html. In the standard,\r\n * the encoding of the plus character is only mentioned for\r\n * application/x-www-form-urlencoded\r\n * (https://url.spec.whatwg.org/#urlencoded-parsing) and most browsers seems lo\r\n * leave the plus character as is in queries. To be more flexible, we allow the\r\n * plus character on the query, but it can also be manually encoded by the user.\r\n *\r\n * Resources:\r\n * - https://url.spec.whatwg.org/#urlencoded-parsing\r\n * - https://stackoverflow.com/questions/1634271/url-encoding-the-space-character-or-20\r\n */\r\nconst ENC_BRACKET_OPEN_RE = /%5B/g; // [\r\nconst ENC_BRACKET_CLOSE_RE = /%5D/g; // ]\r\nconst ENC_CARET_RE = /%5E/g; // ^\r\nconst ENC_BACKTICK_RE = /%60/g; // `\r\nconst ENC_CURLY_OPEN_RE = /%7B/g; // {\r\nconst ENC_PIPE_RE = /%7C/g; // |\r\nconst ENC_CURLY_CLOSE_RE = /%7D/g; // }\r\nconst ENC_SPACE_RE = /%20/g; // }\r\n/**\r\n * Encode characters that need to be encoded on the path, search and hash\r\n * sections of the URL.\r\n *\r\n * @internal\r\n * @param text - string to encode\r\n * @returns encoded string\r\n */\r\nfunction commonEncode(text) {\r\n    return encodeURI('' + text)\r\n        .replace(ENC_PIPE_RE, '|')\r\n        .replace(ENC_BRACKET_OPEN_RE, '[')\r\n        .replace(ENC_BRACKET_CLOSE_RE, ']');\r\n}\r\n/**\r\n * Encode characters that need to be encoded on the hash section of the URL.\r\n *\r\n * @param text - string to encode\r\n * @returns encoded string\r\n */\r\nfunction encodeHash(text) {\r\n    return commonEncode(text)\r\n        .replace(ENC_CURLY_OPEN_RE, '{')\r\n        .replace(ENC_CURLY_CLOSE_RE, '}')\r\n        .replace(ENC_CARET_RE, '^');\r\n}\r\n/**\r\n * Encode characters that need to be encoded query values on the query\r\n * section of the URL.\r\n *\r\n * @param text - string to encode\r\n * @returns encoded string\r\n */\r\nfunction encodeQueryValue(text) {\r\n    return (commonEncode(text)\r\n        // Encode the space as +, encode the + to differentiate it from the space\r\n        .replace(PLUS_RE, '%2B')\r\n        .replace(ENC_SPACE_RE, '+')\r\n        .replace(HASH_RE, '%23')\r\n        .replace(AMPERSAND_RE, '%26')\r\n        .replace(ENC_BACKTICK_RE, '`')\r\n        .replace(ENC_CURLY_OPEN_RE, '{')\r\n        .replace(ENC_CURLY_CLOSE_RE, '}')\r\n        .replace(ENC_CARET_RE, '^'));\r\n}\r\n/**\r\n * Like `encodeQueryValue` but also encodes the `=` character.\r\n *\r\n * @param text - string to encode\r\n */\r\nfunction encodeQueryKey(text) {\r\n    return encodeQueryValue(text).replace(EQUAL_RE, '%3D');\r\n}\r\n/**\r\n * Encode characters that need to be encoded on the path section of the URL.\r\n *\r\n * @param text - string to encode\r\n * @returns encoded string\r\n */\r\nfunction encodePath(text) {\r\n    return commonEncode(text).replace(HASH_RE, '%23').replace(IM_RE, '%3F');\r\n}\r\n/**\r\n * Encode characters that need to be encoded on the path section of the URL as a\r\n * param. This function encodes everything {@link encodePath} does plus the\r\n * slash (`/`) character. If `text` is `null` or `undefined`, returns an empty\r\n * string instead.\r\n *\r\n * @param text - string to encode\r\n * @returns encoded string\r\n */\r\nfunction encodeParam(text) {\r\n    return text == null ? '' : encodePath(text).replace(SLASH_RE, '%2F');\r\n}\r\n/**\r\n * Decode text using `decodeURIComponent`. Returns the original text if it\r\n * fails.\r\n *\r\n * @param text - string to decode\r\n * @returns decoded string\r\n */\r\nfunction decode(text) {\r\n    try {\r\n        return decodeURIComponent('' + text);\r\n    }\r\n    catch (err) {\r\n        ( true) && warn(`Error decoding \"${text}\". Using original value`);\r\n    }\r\n    return '' + text;\r\n}\n\n/**\r\n * Transforms a queryString into a {@link LocationQuery} object. Accept both, a\r\n * version with the leading `?` and without Should work as URLSearchParams\r\n\n * @internal\r\n *\r\n * @param search - search string to parse\r\n * @returns a query object\r\n */\r\nfunction parseQuery(search) {\r\n    const query = {};\r\n    // avoid creating an object with an empty key and empty value\r\n    // because of split('&')\r\n    if (search === '' || search === '?')\r\n        return query;\r\n    const hasLeadingIM = search[0] === '?';\r\n    const searchParams = (hasLeadingIM ? search.slice(1) : search).split('&');\r\n    for (let i = 0; i < searchParams.length; ++i) {\r\n        // pre decode the + into space\r\n        const searchParam = searchParams[i].replace(PLUS_RE, ' ');\r\n        // allow the = character\r\n        const eqPos = searchParam.indexOf('=');\r\n        const key = decode(eqPos < 0 ? searchParam : searchParam.slice(0, eqPos));\r\n        const value = eqPos < 0 ? null : decode(searchParam.slice(eqPos + 1));\r\n        if (key in query) {\r\n            // an extra variable for ts types\r\n            let currentValue = query[key];\r\n            if (!isArray(currentValue)) {\r\n                currentValue = query[key] = [currentValue];\r\n            }\r\n            currentValue.push(value);\r\n        }\r\n        else {\r\n            query[key] = value;\r\n        }\r\n    }\r\n    return query;\r\n}\r\n/**\r\n * Stringifies a {@link LocationQueryRaw} object. Like `URLSearchParams`, it\r\n * doesn't prepend a `?`\r\n *\r\n * @internal\r\n *\r\n * @param query - query object to stringify\r\n * @returns string version of the query without the leading `?`\r\n */\r\nfunction stringifyQuery(query) {\r\n    let search = '';\r\n    for (let key in query) {\r\n        const value = query[key];\r\n        key = encodeQueryKey(key);\r\n        if (value == null) {\r\n            // only null adds the value\r\n            if (value !== undefined) {\r\n                search += (search.length ? '&' : '') + key;\r\n            }\r\n            continue;\r\n        }\r\n        // keep null values\r\n        const values = isArray(value)\r\n            ? value.map(v => v && encodeQueryValue(v))\r\n            : [value && encodeQueryValue(value)];\r\n        values.forEach(value => {\r\n            // skip undefined values in arrays as if they were not present\r\n            // smaller code than using filter\r\n            if (value !== undefined) {\r\n                // only append & with non-empty search\r\n                search += (search.length ? '&' : '') + key;\r\n                if (value != null)\r\n                    search += '=' + value;\r\n            }\r\n        });\r\n    }\r\n    return search;\r\n}\r\n/**\r\n * Transforms a {@link LocationQueryRaw} into a {@link LocationQuery} by casting\r\n * numbers into strings, removing keys with an undefined value and replacing\r\n * undefined with null in arrays\r\n *\r\n * @param query - query object to normalize\r\n * @returns a normalized query object\r\n */\r\nfunction normalizeQuery(query) {\r\n    const normalizedQuery = {};\r\n    for (const key in query) {\r\n        const value = query[key];\r\n        if (value !== undefined) {\r\n            normalizedQuery[key] = isArray(value)\r\n                ? value.map(v => (v == null ? null : '' + v))\r\n                : value == null\r\n                    ? value\r\n                    : '' + value;\r\n        }\r\n    }\r\n    return normalizedQuery;\r\n}\n\n/**\r\n * RouteRecord being rendered by the closest ancestor Router View. Used for\r\n * `onBeforeRouteUpdate` and `onBeforeRouteLeave`. rvlm stands for Router View\r\n * Location Matched\r\n *\r\n * @internal\r\n */\r\nconst matchedRouteKey = Symbol(( true) ? 'router view location matched' : 0);\r\n/**\r\n * Allows overriding the router view depth to control which component in\r\n * `matched` is rendered. rvd stands for Router View Depth\r\n *\r\n * @internal\r\n */\r\nconst viewDepthKey = Symbol(( true) ? 'router view depth' : 0);\r\n/**\r\n * Allows overriding the router instance returned by `useRouter` in tests. r\r\n * stands for router\r\n *\r\n * @internal\r\n */\r\nconst routerKey = Symbol(( true) ? 'router' : 0);\r\n/**\r\n * Allows overriding the current route returned by `useRoute` in tests. rl\r\n * stands for route location\r\n *\r\n * @internal\r\n */\r\nconst routeLocationKey = Symbol(( true) ? 'route location' : 0);\r\n/**\r\n * Allows overriding the current route used by router-view. Internally this is\r\n * used when the `route` prop is passed.\r\n *\r\n * @internal\r\n */\r\nconst routerViewLocationKey = Symbol(( true) ? 'router view location' : 0);\n\n/**\r\n * Create a list of callbacks that can be reset. Used to create before and after navigation guards list\r\n */\r\nfunction useCallbacks() {\r\n    let handlers = [];\r\n    function add(handler) {\r\n        handlers.push(handler);\r\n        return () => {\r\n            const i = handlers.indexOf(handler);\r\n            if (i > -1)\r\n                handlers.splice(i, 1);\r\n        };\r\n    }\r\n    function reset() {\r\n        handlers = [];\r\n    }\r\n    return {\r\n        add,\r\n        list: () => handlers,\r\n        reset,\r\n    };\r\n}\n\nfunction registerGuard(record, name, guard) {\r\n    const removeFromList = () => {\r\n        record[name].delete(guard);\r\n    };\r\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.onUnmounted)(removeFromList);\r\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.onDeactivated)(removeFromList);\r\n    (0,vue__WEBPACK_IMPORTED_MODULE_0__.onActivated)(() => {\r\n        record[name].add(guard);\r\n    });\r\n    record[name].add(guard);\r\n}\r\n/**\r\n * Add a navigation guard that triggers whenever the component for the current\r\n * location is about to be left. Similar to {@link beforeRouteLeave} but can be\r\n * used in any component. The guard is removed when the component is unmounted.\r\n *\r\n * @param leaveGuard - {@link NavigationGuard}\r\n */\r\nfunction onBeforeRouteLeave(leaveGuard) {\r\n    if (( true) && !(0,vue__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)()) {\r\n        warn('getCurrentInstance() returned null. onBeforeRouteLeave() must be called at the top of a setup function');\r\n        return;\r\n    }\r\n    const activeRecord = (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(matchedRouteKey, \r\n    // to avoid warning\r\n    {}).value;\r\n    if (!activeRecord) {\r\n        ( true) &&\r\n            warn('No active route record was found when calling `onBeforeRouteLeave()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?');\r\n        return;\r\n    }\r\n    registerGuard(activeRecord, 'leaveGuards', leaveGuard);\r\n}\r\n/**\r\n * Add a navigation guard that triggers whenever the current location is about\r\n * to be updated. Similar to {@link beforeRouteUpdate} but can be used in any\r\n * component. The guard is removed when the component is unmounted.\r\n *\r\n * @param updateGuard - {@link NavigationGuard}\r\n */\r\nfunction onBeforeRouteUpdate(updateGuard) {\r\n    if (( true) && !(0,vue__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)()) {\r\n        warn('getCurrentInstance() returned null. onBeforeRouteUpdate() must be called at the top of a setup function');\r\n        return;\r\n    }\r\n    const activeRecord = (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(matchedRouteKey, \r\n    // to avoid warning\r\n    {}).value;\r\n    if (!activeRecord) {\r\n        ( true) &&\r\n            warn('No active route record was found when calling `onBeforeRouteUpdate()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?');\r\n        return;\r\n    }\r\n    registerGuard(activeRecord, 'updateGuards', updateGuard);\r\n}\r\nfunction guardToPromiseFn(guard, to, from, record, name) {\r\n    // keep a reference to the enterCallbackArray to prevent pushing callbacks if a new navigation took place\r\n    const enterCallbackArray = record &&\r\n        // name is defined if record is because of the function overload\r\n        (record.enterCallbacks[name] = record.enterCallbacks[name] || []);\r\n    return () => new Promise((resolve, reject) => {\r\n        const next = (valid) => {\r\n            if (valid === false) {\r\n                reject(createRouterError(4 /* ErrorTypes.NAVIGATION_ABORTED */, {\r\n                    from,\r\n                    to,\r\n                }));\r\n            }\r\n            else if (valid instanceof Error) {\r\n                reject(valid);\r\n            }\r\n            else if (isRouteLocation(valid)) {\r\n                reject(createRouterError(2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */, {\r\n                    from: to,\r\n                    to: valid,\r\n                }));\r\n            }\r\n            else {\r\n                if (enterCallbackArray &&\r\n                    // since enterCallbackArray is truthy, both record and name also are\r\n                    record.enterCallbacks[name] === enterCallbackArray &&\r\n                    typeof valid === 'function') {\r\n                    enterCallbackArray.push(valid);\r\n                }\r\n                resolve();\r\n            }\r\n        };\r\n        // wrapping with Promise.resolve allows it to work with both async and sync guards\r\n        const guardReturn = guard.call(record && record.instances[name], to, from, ( true) ? canOnlyBeCalledOnce(next, to, from) : 0);\r\n        let guardCall = Promise.resolve(guardReturn);\r\n        if (guard.length < 3)\r\n            guardCall = guardCall.then(next);\r\n        if (( true) && guard.length > 2) {\r\n            const message = `The \"next\" callback was never called inside of ${guard.name ? '\"' + guard.name + '\"' : ''}:\\n${guard.toString()}\\n. If you are returning a value instead of calling \"next\", make sure to remove the \"next\" parameter from your function.`;\r\n            if (typeof guardReturn === 'object' && 'then' in guardReturn) {\r\n                guardCall = guardCall.then(resolvedValue => {\r\n                    // @ts-expect-error: _called is added at canOnlyBeCalledOnce\r\n                    if (!next._called) {\r\n                        warn(message);\r\n                        return Promise.reject(new Error('Invalid navigation guard'));\r\n                    }\r\n                    return resolvedValue;\r\n                });\r\n            }\r\n            else if (guardReturn !== undefined) {\r\n                // @ts-expect-error: _called is added at canOnlyBeCalledOnce\r\n                if (!next._called) {\r\n                    warn(message);\r\n                    reject(new Error('Invalid navigation guard'));\r\n                    return;\r\n                }\r\n            }\r\n        }\r\n        guardCall.catch(err => reject(err));\r\n    });\r\n}\r\nfunction canOnlyBeCalledOnce(next, to, from) {\r\n    let called = 0;\r\n    return function () {\r\n        if (called++ === 1)\r\n            warn(`The \"next\" callback was called more than once in one navigation guard when going from \"${from.fullPath}\" to \"${to.fullPath}\". It should be called exactly one time in each navigation guard. This will fail in production.`);\r\n        // @ts-expect-error: we put it in the original one because it's easier to check\r\n        next._called = true;\r\n        if (called === 1)\r\n            next.apply(null, arguments);\r\n    };\r\n}\r\nfunction extractComponentsGuards(matched, guardType, to, from) {\r\n    const guards = [];\r\n    for (const record of matched) {\r\n        if (( true) && !record.components && !record.children.length) {\r\n            warn(`Record with path \"${record.path}\" is either missing a \"component(s)\"` +\r\n                ` or \"children\" property.`);\r\n        }\r\n        for (const name in record.components) {\r\n            let rawComponent = record.components[name];\r\n            if ((true)) {\r\n                if (!rawComponent ||\r\n                    (typeof rawComponent !== 'object' &&\r\n                        typeof rawComponent !== 'function')) {\r\n                    warn(`Component \"${name}\" in record with path \"${record.path}\" is not` +\r\n                        ` a valid component. Received \"${String(rawComponent)}\".`);\r\n                    // throw to ensure we stop here but warn to ensure the message isn't\r\n                    // missed by the user\r\n                    throw new Error('Invalid route component');\r\n                }\r\n                else if ('then' in rawComponent) {\r\n                    // warn if user wrote import('/component.vue') instead of () =>\r\n                    // import('./component.vue')\r\n                    warn(`Component \"${name}\" in record with path \"${record.path}\" is a ` +\r\n                        `Promise instead of a function that returns a Promise. Did you ` +\r\n                        `write \"import('./MyPage.vue')\" instead of ` +\r\n                        `\"() => import('./MyPage.vue')\" ? This will break in ` +\r\n                        `production if not fixed.`);\r\n                    const promise = rawComponent;\r\n                    rawComponent = () => promise;\r\n                }\r\n                else if (rawComponent.__asyncLoader &&\r\n                    // warn only once per component\r\n                    !rawComponent.__warnedDefineAsync) {\r\n                    rawComponent.__warnedDefineAsync = true;\r\n                    warn(`Component \"${name}\" in record with path \"${record.path}\" is defined ` +\r\n                        `using \"defineAsyncComponent()\". ` +\r\n                        `Write \"() => import('./MyPage.vue')\" instead of ` +\r\n                        `\"defineAsyncComponent(() => import('./MyPage.vue'))\".`);\r\n                }\r\n            }\r\n            // skip update and leave guards if the route component is not mounted\r\n            if (guardType !== 'beforeRouteEnter' && !record.instances[name])\r\n                continue;\r\n            if (isRouteComponent(rawComponent)) {\r\n                // __vccOpts is added by vue-class-component and contain the regular options\r\n                const options = rawComponent.__vccOpts || rawComponent;\r\n                const guard = options[guardType];\r\n                guard && guards.push(guardToPromiseFn(guard, to, from, record, name));\r\n            }\r\n            else {\r\n                // start requesting the chunk already\r\n                let componentPromise = rawComponent();\r\n                if (( true) && !('catch' in componentPromise)) {\r\n                    warn(`Component \"${name}\" in record with path \"${record.path}\" is a function that does not return a Promise. If you were passing a functional component, make sure to add a \"displayName\" to the component. This will break in production if not fixed.`);\r\n                    componentPromise = Promise.resolve(componentPromise);\r\n                }\r\n                guards.push(() => componentPromise.then(resolved => {\r\n                    if (!resolved)\r\n                        return Promise.reject(new Error(`Couldn't resolve component \"${name}\" at \"${record.path}\"`));\r\n                    const resolvedComponent = isESModule(resolved)\r\n                        ? resolved.default\r\n                        : resolved;\r\n                    // replace the function with the resolved component\r\n                    // cannot be null or undefined because we went into the for loop\r\n                    record.components[name] = resolvedComponent;\r\n                    // __vccOpts is added by vue-class-component and contain the regular options\r\n                    const options = resolvedComponent.__vccOpts || resolvedComponent;\r\n                    const guard = options[guardType];\r\n                    return guard && guardToPromiseFn(guard, to, from, record, name)();\r\n                }));\r\n            }\r\n        }\r\n    }\r\n    return guards;\r\n}\r\n/**\r\n * Allows differentiating lazy components from functional components and vue-class-component\r\n * @internal\r\n *\r\n * @param component\r\n */\r\nfunction isRouteComponent(component) {\r\n    return (typeof component === 'object' ||\r\n        'displayName' in component ||\r\n        'props' in component ||\r\n        '__vccOpts' in component);\r\n}\r\n/**\r\n * Ensures a route is loaded, so it can be passed as o prop to `<RouterView>`.\r\n *\r\n * @param route - resolved route to load\r\n */\r\nfunction loadRouteLocation(route) {\r\n    return route.matched.every(record => record.redirect)\r\n        ? Promise.reject(new Error('Cannot load a route that redirects.'))\r\n        : Promise.all(route.matched.map(record => record.components &&\r\n            Promise.all(Object.keys(record.components).reduce((promises, name) => {\r\n                const rawComponent = record.components[name];\r\n                if (typeof rawComponent === 'function' &&\r\n                    !('displayName' in rawComponent)) {\r\n                    promises.push(rawComponent().then(resolved => {\r\n                        if (!resolved)\r\n                            return Promise.reject(new Error(`Couldn't resolve component \"${name}\" at \"${record.path}\". Ensure you passed a function that returns a promise.`));\r\n                        const resolvedComponent = isESModule(resolved)\r\n                            ? resolved.default\r\n                            : resolved;\r\n                        // replace the function with the resolved component\r\n                        // cannot be null or undefined because we went into the for loop\r\n                        record.components[name] = resolvedComponent;\r\n                        return;\r\n                    }));\r\n                }\r\n                return promises;\r\n            }, [])))).then(() => route);\r\n}\n\n// TODO: we could allow currentRoute as a prop to expose `isActive` and\r\n// `isExactActive` behavior should go through an RFC\r\nfunction useLink(props) {\r\n    const router = (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(routerKey);\r\n    const currentRoute = (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(routeLocationKey);\r\n    const route = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => router.resolve((0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(props.to)));\r\n    const activeRecordIndex = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\r\n        const { matched } = route.value;\r\n        const { length } = matched;\r\n        const routeMatched = matched[length - 1];\r\n        const currentMatched = currentRoute.matched;\r\n        if (!routeMatched || !currentMatched.length)\r\n            return -1;\r\n        const index = currentMatched.findIndex(isSameRouteRecord.bind(null, routeMatched));\r\n        if (index > -1)\r\n            return index;\r\n        // possible parent record\r\n        const parentRecordPath = getOriginalPath(matched[length - 2]);\r\n        return (\r\n        // we are dealing with nested routes\r\n        length > 1 &&\r\n            // if the parent and matched route have the same path, this link is\r\n            // referring to the empty child. Or we currently are on a different\r\n            // child of the same parent\r\n            getOriginalPath(routeMatched) === parentRecordPath &&\r\n            // avoid comparing the child with its parent\r\n            currentMatched[currentMatched.length - 1].path !== parentRecordPath\r\n            ? currentMatched.findIndex(isSameRouteRecord.bind(null, matched[length - 2]))\r\n            : index);\r\n    });\r\n    const isActive = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => activeRecordIndex.value > -1 &&\r\n        includesParams(currentRoute.params, route.value.params));\r\n    const isExactActive = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => activeRecordIndex.value > -1 &&\r\n        activeRecordIndex.value === currentRoute.matched.length - 1 &&\r\n        isSameRouteLocationParams(currentRoute.params, route.value.params));\r\n    function navigate(e = {}) {\r\n        if (guardEvent(e)) {\r\n            return router[(0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(props.replace) ? 'replace' : 'push']((0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(props.to)\r\n            // avoid uncaught errors are they are logged anyway\r\n            ).catch(noop);\r\n        }\r\n        return Promise.resolve();\r\n    }\r\n    // devtools only\r\n    if (( true) && isBrowser) {\r\n        const instance = (0,vue__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)();\r\n        if (instance) {\r\n            const linkContextDevtools = {\r\n                route: route.value,\r\n                isActive: isActive.value,\r\n                isExactActive: isExactActive.value,\r\n            };\r\n            // @ts-expect-error: this is internal\r\n            instance.__vrl_devtools = instance.__vrl_devtools || [];\r\n            // @ts-expect-error: this is internal\r\n            instance.__vrl_devtools.push(linkContextDevtools);\r\n            (0,vue__WEBPACK_IMPORTED_MODULE_0__.watchEffect)(() => {\r\n                linkContextDevtools.route = route.value;\r\n                linkContextDevtools.isActive = isActive.value;\r\n                linkContextDevtools.isExactActive = isExactActive.value;\r\n            }, { flush: 'post' });\r\n        }\r\n    }\r\n    /**\r\n     * NOTE: update {@link _RouterLinkI}'s `$slots` type when updating this\r\n     */\r\n    return {\r\n        route,\r\n        href: (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => route.value.href),\r\n        isActive,\r\n        isExactActive,\r\n        navigate,\r\n    };\r\n}\r\nconst RouterLinkImpl = /*#__PURE__*/ (0,vue__WEBPACK_IMPORTED_MODULE_0__.defineComponent)({\r\n    name: 'RouterLink',\r\n    compatConfig: { MODE: 3 },\r\n    props: {\r\n        to: {\r\n            type: [String, Object],\r\n            required: true,\r\n        },\r\n        replace: Boolean,\r\n        activeClass: String,\r\n        // inactiveClass: String,\r\n        exactActiveClass: String,\r\n        custom: Boolean,\r\n        ariaCurrentValue: {\r\n            type: String,\r\n            default: 'page',\r\n        },\r\n    },\r\n    useLink,\r\n    setup(props, { slots }) {\r\n        const link = (0,vue__WEBPACK_IMPORTED_MODULE_0__.reactive)(useLink(props));\r\n        const { options } = (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(routerKey);\r\n        const elClass = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => ({\r\n            [getLinkClass(props.activeClass, options.linkActiveClass, 'router-link-active')]: link.isActive,\r\n            // [getLinkClass(\r\n            //   props.inactiveClass,\r\n            //   options.linkInactiveClass,\r\n            //   'router-link-inactive'\r\n            // )]: !link.isExactActive,\r\n            [getLinkClass(props.exactActiveClass, options.linkExactActiveClass, 'router-link-exact-active')]: link.isExactActive,\r\n        }));\r\n        return () => {\r\n            const children = slots.default && slots.default(link);\r\n            return props.custom\r\n                ? children\r\n                : (0,vue__WEBPACK_IMPORTED_MODULE_0__.h)('a', {\r\n                    'aria-current': link.isExactActive\r\n                        ? props.ariaCurrentValue\r\n                        : null,\r\n                    href: link.href,\r\n                    // this would override user added attrs but Vue will still add\r\n                    // the listener, so we end up triggering both\r\n                    onClick: link.navigate,\r\n                    class: elClass.value,\r\n                }, children);\r\n        };\r\n    },\r\n});\r\n// export the public type for h/tsx inference\r\n// also to avoid inline import() in generated d.ts files\r\n/**\r\n * Component to render a link that triggers a navigation on click.\r\n */\r\nconst RouterLink = RouterLinkImpl;\r\nfunction guardEvent(e) {\r\n    // don't redirect with control keys\r\n    if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)\r\n        return;\r\n    // don't redirect when preventDefault called\r\n    if (e.defaultPrevented)\r\n        return;\r\n    // don't redirect on right click\r\n    if (e.button !== undefined && e.button !== 0)\r\n        return;\r\n    // don't redirect if `target=\"_blank\"`\r\n    // @ts-expect-error getAttribute does exist\r\n    if (e.currentTarget && e.currentTarget.getAttribute) {\r\n        // @ts-expect-error getAttribute exists\r\n        const target = e.currentTarget.getAttribute('target');\r\n        if (/\\b_blank\\b/i.test(target))\r\n            return;\r\n    }\r\n    // this may be a Weex event which doesn't have this method\r\n    if (e.preventDefault)\r\n        e.preventDefault();\r\n    return true;\r\n}\r\nfunction includesParams(outer, inner) {\r\n    for (const key in inner) {\r\n        const innerValue = inner[key];\r\n        const outerValue = outer[key];\r\n        if (typeof innerValue === 'string') {\r\n            if (innerValue !== outerValue)\r\n                return false;\r\n        }\r\n        else {\r\n            if (!isArray(outerValue) ||\r\n                outerValue.length !== innerValue.length ||\r\n                innerValue.some((value, i) => value !== outerValue[i]))\r\n                return false;\r\n        }\r\n    }\r\n    return true;\r\n}\r\n/**\r\n * Get the original path value of a record by following its aliasOf\r\n * @param record\r\n */\r\nfunction getOriginalPath(record) {\r\n    return record ? (record.aliasOf ? record.aliasOf.path : record.path) : '';\r\n}\r\n/**\r\n * Utility class to get the active class based on defaults.\r\n * @param propClass\r\n * @param globalClass\r\n * @param defaultClass\r\n */\r\nconst getLinkClass = (propClass, globalClass, defaultClass) => propClass != null\r\n    ? propClass\r\n    : globalClass != null\r\n        ? globalClass\r\n        : defaultClass;\n\nconst RouterViewImpl = /*#__PURE__*/ (0,vue__WEBPACK_IMPORTED_MODULE_0__.defineComponent)({\r\n    name: 'RouterView',\r\n    // #674 we manually inherit them\r\n    inheritAttrs: false,\r\n    props: {\r\n        name: {\r\n            type: String,\r\n            default: 'default',\r\n        },\r\n        route: Object,\r\n    },\r\n    // Better compat for @vue/compat users\r\n    // https://github.com/vuejs/router/issues/1315\r\n    compatConfig: { MODE: 3 },\r\n    setup(props, { attrs, slots }) {\r\n        ( true) && warnDeprecatedUsage();\r\n        const injectedRoute = (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(routerViewLocationKey);\r\n        const routeToDisplay = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => props.route || injectedRoute.value);\r\n        const injectedDepth = (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(viewDepthKey, 0);\r\n        // The depth changes based on empty components option, which allows passthrough routes e.g. routes with children\r\n        // that are used to reuse the `path` property\r\n        const depth = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\r\n            let initialDepth = (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(injectedDepth);\r\n            const { matched } = routeToDisplay.value;\r\n            let matchedRoute;\r\n            while ((matchedRoute = matched[initialDepth]) &&\r\n                !matchedRoute.components) {\r\n                initialDepth++;\r\n            }\r\n            return initialDepth;\r\n        });\r\n        const matchedRouteRef = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => routeToDisplay.value.matched[depth.value]);\r\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)(viewDepthKey, (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => depth.value + 1));\r\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)(matchedRouteKey, matchedRouteRef);\r\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.provide)(routerViewLocationKey, routeToDisplay);\r\n        const viewRef = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)();\r\n        // watch at the same time the component instance, the route record we are\r\n        // rendering, and the name\r\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(() => [viewRef.value, matchedRouteRef.value, props.name], ([instance, to, name], [oldInstance, from, oldName]) => {\r\n            // copy reused instances\r\n            if (to) {\r\n                // this will update the instance for new instances as well as reused\r\n                // instances when navigating to a new route\r\n                to.instances[name] = instance;\r\n                // the component instance is reused for a different route or name, so\r\n                // we copy any saved update or leave guards. With async setup, the\r\n                // mounting component will mount before the matchedRoute changes,\r\n                // making instance === oldInstance, so we check if guards have been\r\n                // added before. This works because we remove guards when\r\n                // unmounting/deactivating components\r\n                if (from && from !== to && instance && instance === oldInstance) {\r\n                    if (!to.leaveGuards.size) {\r\n                        to.leaveGuards = from.leaveGuards;\r\n                    }\r\n                    if (!to.updateGuards.size) {\r\n                        to.updateGuards = from.updateGuards;\r\n                    }\r\n                }\r\n            }\r\n            // trigger beforeRouteEnter next callbacks\r\n            if (instance &&\r\n                to &&\r\n                // if there is no instance but to and from are the same this might be\r\n                // the first visit\r\n                (!from || !isSameRouteRecord(to, from) || !oldInstance)) {\r\n                (to.enterCallbacks[name] || []).forEach(callback => callback(instance));\r\n            }\r\n        }, { flush: 'post' });\r\n        return () => {\r\n            const route = routeToDisplay.value;\r\n            // we need the value at the time we render because when we unmount, we\r\n            // navigated to a different location so the value is different\r\n            const currentName = props.name;\r\n            const matchedRoute = matchedRouteRef.value;\r\n            const ViewComponent = matchedRoute && matchedRoute.components[currentName];\r\n            if (!ViewComponent) {\r\n                return normalizeSlot(slots.default, { Component: ViewComponent, route });\r\n            }\r\n            // props from route configuration\r\n            const routePropsOption = matchedRoute.props[currentName];\r\n            const routeProps = routePropsOption\r\n                ? routePropsOption === true\r\n                    ? route.params\r\n                    : typeof routePropsOption === 'function'\r\n                        ? routePropsOption(route)\r\n                        : routePropsOption\r\n                : null;\r\n            const onVnodeUnmounted = vnode => {\r\n                // remove the instance reference to prevent leak\r\n                if (vnode.component.isUnmounted) {\r\n                    matchedRoute.instances[currentName] = null;\r\n                }\r\n            };\r\n            const component = (0,vue__WEBPACK_IMPORTED_MODULE_0__.h)(ViewComponent, assign({}, routeProps, attrs, {\r\n                onVnodeUnmounted,\r\n                ref: viewRef,\r\n            }));\r\n            if (( true) &&\r\n                isBrowser &&\r\n                component.ref) {\r\n                // TODO: can display if it's an alias, its props\r\n                const info = {\r\n                    depth: depth.value,\r\n                    name: matchedRoute.name,\r\n                    path: matchedRoute.path,\r\n                    meta: matchedRoute.meta,\r\n                };\r\n                const internalInstances = isArray(component.ref)\r\n                    ? component.ref.map(r => r.i)\r\n                    : [component.ref.i];\r\n                internalInstances.forEach(instance => {\r\n                    // @ts-expect-error\r\n                    instance.__vrv_devtools = info;\r\n                });\r\n            }\r\n            return (\r\n            // pass the vnode to the slot as a prop.\r\n            // h and <component :is=\"...\"> both accept vnodes\r\n            normalizeSlot(slots.default, { Component: component, route }) ||\r\n                component);\r\n        };\r\n    },\r\n});\r\nfunction normalizeSlot(slot, data) {\r\n    if (!slot)\r\n        return null;\r\n    const slotContent = slot(data);\r\n    return slotContent.length === 1 ? slotContent[0] : slotContent;\r\n}\r\n// export the public type for h/tsx inference\r\n// also to avoid inline import() in generated d.ts files\r\n/**\r\n * Component to display the current route the user is at.\r\n */\r\nconst RouterView = RouterViewImpl;\r\n// warn against deprecated usage with <transition> & <keep-alive>\r\n// due to functional component being no longer eager in Vue 3\r\nfunction warnDeprecatedUsage() {\r\n    const instance = (0,vue__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)();\r\n    const parentName = instance.parent && instance.parent.type.name;\r\n    if (parentName &&\r\n        (parentName === 'KeepAlive' || parentName.includes('Transition'))) {\r\n        const comp = parentName === 'KeepAlive' ? 'keep-alive' : 'transition';\r\n        warn(`<router-view> can no longer be used directly inside <transition> or <keep-alive>.\\n` +\r\n            `Use slot props instead:\\n\\n` +\r\n            `<router-view v-slot=\"{ Component }\">\\n` +\r\n            `  <${comp}>\\n` +\r\n            `    <component :is=\"Component\" />\\n` +\r\n            `  </${comp}>\\n` +\r\n            `</router-view>`);\r\n    }\r\n}\n\n/**\r\n * Copies a route location and removes any problematic properties that cannot be shown in devtools (e.g. Vue instances).\r\n *\r\n * @param routeLocation - routeLocation to format\r\n * @param tooltip - optional tooltip\r\n * @returns a copy of the routeLocation\r\n */\r\nfunction formatRouteLocation(routeLocation, tooltip) {\r\n    const copy = assign({}, routeLocation, {\r\n        // remove variables that can contain vue instances\r\n        matched: routeLocation.matched.map(matched => omit(matched, ['instances', 'children', 'aliasOf'])),\r\n    });\r\n    return {\r\n        _custom: {\r\n            type: null,\r\n            readOnly: true,\r\n            display: routeLocation.fullPath,\r\n            tooltip,\r\n            value: copy,\r\n        },\r\n    };\r\n}\r\nfunction formatDisplay(display) {\r\n    return {\r\n        _custom: {\r\n            display,\r\n        },\r\n    };\r\n}\r\n// to support multiple router instances\r\nlet routerId = 0;\r\nfunction addDevtools(app, router, matcher) {\r\n    // Take over router.beforeEach and afterEach\r\n    // make sure we are not registering the devtool twice\r\n    if (router.__hasDevtools)\r\n        return;\r\n    router.__hasDevtools = true;\r\n    // increment to support multiple router instances\r\n    const id = routerId++;\r\n    (0,_vue_devtools_api__WEBPACK_IMPORTED_MODULE_1__.setupDevtoolsPlugin)({\r\n        id: 'org.vuejs.router' + (id ? '.' + id : ''),\r\n        label: 'Vue Router',\r\n        packageName: 'vue-router',\r\n        homepage: 'https://router.vuejs.org',\r\n        logo: 'https://router.vuejs.org/logo.png',\r\n        componentStateTypes: ['Routing'],\r\n        app,\r\n    }, api => {\r\n        if (typeof api.now !== 'function') {\r\n            console.warn('[Vue Router]: You seem to be using an outdated version of Vue Devtools. Are you still using the Beta release instead of the stable one? You can find the links at https://devtools.vuejs.org/guide/installation.html.');\r\n        }\r\n        // display state added by the router\r\n        api.on.inspectComponent((payload, ctx) => {\r\n            if (payload.instanceData) {\r\n                payload.instanceData.state.push({\r\n                    type: 'Routing',\r\n                    key: '$route',\r\n                    editable: false,\r\n                    value: formatRouteLocation(router.currentRoute.value, 'Current Route'),\r\n                });\r\n            }\r\n        });\r\n        // mark router-link as active and display tags on router views\r\n        api.on.visitComponentTree(({ treeNode: node, componentInstance }) => {\r\n            if (componentInstance.__vrv_devtools) {\r\n                const info = componentInstance.__vrv_devtools;\r\n                node.tags.push({\r\n                    label: (info.name ? `${info.name.toString()}: ` : '') + info.path,\r\n                    textColor: 0,\r\n                    tooltip: 'This component is rendered by &lt;router-view&gt;',\r\n                    backgroundColor: PINK_500,\r\n                });\r\n            }\r\n            // if multiple useLink are used\r\n            if (isArray(componentInstance.__vrl_devtools)) {\r\n                componentInstance.__devtoolsApi = api;\r\n                componentInstance.__vrl_devtools.forEach(devtoolsData => {\r\n                    let backgroundColor = ORANGE_400;\r\n                    let tooltip = '';\r\n                    if (devtoolsData.isExactActive) {\r\n                        backgroundColor = LIME_500;\r\n                        tooltip = 'This is exactly active';\r\n                    }\r\n                    else if (devtoolsData.isActive) {\r\n                        backgroundColor = BLUE_600;\r\n                        tooltip = 'This link is active';\r\n                    }\r\n                    node.tags.push({\r\n                        label: devtoolsData.route.path,\r\n                        textColor: 0,\r\n                        tooltip,\r\n                        backgroundColor,\r\n                    });\r\n                });\r\n            }\r\n        });\r\n        (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(router.currentRoute, () => {\r\n            // refresh active state\r\n            refreshRoutesView();\r\n            api.notifyComponentUpdate();\r\n            api.sendInspectorTree(routerInspectorId);\r\n            api.sendInspectorState(routerInspectorId);\r\n        });\r\n        const navigationsLayerId = 'router:navigations:' + id;\r\n        api.addTimelineLayer({\r\n            id: navigationsLayerId,\r\n            label: `Router${id ? ' ' + id : ''} Navigations`,\r\n            color: 0x40a8c4,\r\n        });\r\n        // const errorsLayerId = 'router:errors'\r\n        // api.addTimelineLayer({\r\n        //   id: errorsLayerId,\r\n        //   label: 'Router Errors',\r\n        //   color: 0xea5455,\r\n        // })\r\n        router.onError((error, to) => {\r\n            api.addTimelineEvent({\r\n                layerId: navigationsLayerId,\r\n                event: {\r\n                    title: 'Error during Navigation',\r\n                    subtitle: to.fullPath,\r\n                    logType: 'error',\r\n                    time: api.now(),\r\n                    data: { error },\r\n                    groupId: to.meta.__navigationId,\r\n                },\r\n            });\r\n        });\r\n        // attached to `meta` and used to group events\r\n        let navigationId = 0;\r\n        router.beforeEach((to, from) => {\r\n            const data = {\r\n                guard: formatDisplay('beforeEach'),\r\n                from: formatRouteLocation(from, 'Current Location during this navigation'),\r\n                to: formatRouteLocation(to, 'Target location'),\r\n            };\r\n            // Used to group navigations together, hide from devtools\r\n            Object.defineProperty(to.meta, '__navigationId', {\r\n                value: navigationId++,\r\n            });\r\n            api.addTimelineEvent({\r\n                layerId: navigationsLayerId,\r\n                event: {\r\n                    time: api.now(),\r\n                    title: 'Start of navigation',\r\n                    subtitle: to.fullPath,\r\n                    data,\r\n                    groupId: to.meta.__navigationId,\r\n                },\r\n            });\r\n        });\r\n        router.afterEach((to, from, failure) => {\r\n            const data = {\r\n                guard: formatDisplay('afterEach'),\r\n            };\r\n            if (failure) {\r\n                data.failure = {\r\n                    _custom: {\r\n                        type: Error,\r\n                        readOnly: true,\r\n                        display: failure ? failure.message : '',\r\n                        tooltip: 'Navigation Failure',\r\n                        value: failure,\r\n                    },\r\n                };\r\n                data.status = formatDisplay('❌');\r\n            }\r\n            else {\r\n                data.status = formatDisplay('✅');\r\n            }\r\n            // we set here to have the right order\r\n            data.from = formatRouteLocation(from, 'Current Location during this navigation');\r\n            data.to = formatRouteLocation(to, 'Target location');\r\n            api.addTimelineEvent({\r\n                layerId: navigationsLayerId,\r\n                event: {\r\n                    title: 'End of navigation',\r\n                    subtitle: to.fullPath,\r\n                    time: api.now(),\r\n                    data,\r\n                    logType: failure ? 'warning' : 'default',\r\n                    groupId: to.meta.__navigationId,\r\n                },\r\n            });\r\n        });\r\n        /**\r\n         * Inspector of Existing routes\r\n         */\r\n        const routerInspectorId = 'router-inspector:' + id;\r\n        api.addInspector({\r\n            id: routerInspectorId,\r\n            label: 'Routes' + (id ? ' ' + id : ''),\r\n            icon: 'book',\r\n            treeFilterPlaceholder: 'Search routes',\r\n        });\r\n        function refreshRoutesView() {\r\n            // the routes view isn't active\r\n            if (!activeRoutesPayload)\r\n                return;\r\n            const payload = activeRoutesPayload;\r\n            // children routes will appear as nested\r\n            let routes = matcher.getRoutes().filter(route => !route.parent);\r\n            // reset match state to false\r\n            routes.forEach(resetMatchStateOnRouteRecord);\r\n            // apply a match state if there is a payload\r\n            if (payload.filter) {\r\n                routes = routes.filter(route => \r\n                // save matches state based on the payload\r\n                isRouteMatching(route, payload.filter.toLowerCase()));\r\n            }\r\n            // mark active routes\r\n            routes.forEach(route => markRouteRecordActive(route, router.currentRoute.value));\r\n            payload.rootNodes = routes.map(formatRouteRecordForInspector);\r\n        }\r\n        let activeRoutesPayload;\r\n        api.on.getInspectorTree(payload => {\r\n            activeRoutesPayload = payload;\r\n            if (payload.app === app && payload.inspectorId === routerInspectorId) {\r\n                refreshRoutesView();\r\n            }\r\n        });\r\n        /**\r\n         * Display information about the currently selected route record\r\n         */\r\n        api.on.getInspectorState(payload => {\r\n            if (payload.app === app && payload.inspectorId === routerInspectorId) {\r\n                const routes = matcher.getRoutes();\r\n                const route = routes.find(route => route.record.__vd_id === payload.nodeId);\r\n                if (route) {\r\n                    payload.state = {\r\n                        options: formatRouteRecordMatcherForStateInspector(route),\r\n                    };\r\n                }\r\n            }\r\n        });\r\n        api.sendInspectorTree(routerInspectorId);\r\n        api.sendInspectorState(routerInspectorId);\r\n    });\r\n}\r\nfunction modifierForKey(key) {\r\n    if (key.optional) {\r\n        return key.repeatable ? '*' : '?';\r\n    }\r\n    else {\r\n        return key.repeatable ? '+' : '';\r\n    }\r\n}\r\nfunction formatRouteRecordMatcherForStateInspector(route) {\r\n    const { record } = route;\r\n    const fields = [\r\n        { editable: false, key: 'path', value: record.path },\r\n    ];\r\n    if (record.name != null) {\r\n        fields.push({\r\n            editable: false,\r\n            key: 'name',\r\n            value: record.name,\r\n        });\r\n    }\r\n    fields.push({ editable: false, key: 'regexp', value: route.re });\r\n    if (route.keys.length) {\r\n        fields.push({\r\n            editable: false,\r\n            key: 'keys',\r\n            value: {\r\n                _custom: {\r\n                    type: null,\r\n                    readOnly: true,\r\n                    display: route.keys\r\n                        .map(key => `${key.name}${modifierForKey(key)}`)\r\n                        .join(' '),\r\n                    tooltip: 'Param keys',\r\n                    value: route.keys,\r\n                },\r\n            },\r\n        });\r\n    }\r\n    if (record.redirect != null) {\r\n        fields.push({\r\n            editable: false,\r\n            key: 'redirect',\r\n            value: record.redirect,\r\n        });\r\n    }\r\n    if (route.alias.length) {\r\n        fields.push({\r\n            editable: false,\r\n            key: 'aliases',\r\n            value: route.alias.map(alias => alias.record.path),\r\n        });\r\n    }\r\n    if (Object.keys(route.record.meta).length) {\r\n        fields.push({\r\n            editable: false,\r\n            key: 'meta',\r\n            value: route.record.meta,\r\n        });\r\n    }\r\n    fields.push({\r\n        key: 'score',\r\n        editable: false,\r\n        value: {\r\n            _custom: {\r\n                type: null,\r\n                readOnly: true,\r\n                display: route.score.map(score => score.join(', ')).join(' | '),\r\n                tooltip: 'Score used to sort routes',\r\n                value: route.score,\r\n            },\r\n        },\r\n    });\r\n    return fields;\r\n}\r\n/**\r\n * Extracted from tailwind palette\r\n */\r\nconst PINK_500 = 0xec4899;\r\nconst BLUE_600 = 0x2563eb;\r\nconst LIME_500 = 0x84cc16;\r\nconst CYAN_400 = 0x22d3ee;\r\nconst ORANGE_400 = 0xfb923c;\r\n// const GRAY_100 = 0xf4f4f5\r\nconst DARK = 0x666666;\r\nfunction formatRouteRecordForInspector(route) {\r\n    const tags = [];\r\n    const { record } = route;\r\n    if (record.name != null) {\r\n        tags.push({\r\n            label: String(record.name),\r\n            textColor: 0,\r\n            backgroundColor: CYAN_400,\r\n        });\r\n    }\r\n    if (record.aliasOf) {\r\n        tags.push({\r\n            label: 'alias',\r\n            textColor: 0,\r\n            backgroundColor: ORANGE_400,\r\n        });\r\n    }\r\n    if (route.__vd_match) {\r\n        tags.push({\r\n            label: 'matches',\r\n            textColor: 0,\r\n            backgroundColor: PINK_500,\r\n        });\r\n    }\r\n    if (route.__vd_exactActive) {\r\n        tags.push({\r\n            label: 'exact',\r\n            textColor: 0,\r\n            backgroundColor: LIME_500,\r\n        });\r\n    }\r\n    if (route.__vd_active) {\r\n        tags.push({\r\n            label: 'active',\r\n            textColor: 0,\r\n            backgroundColor: BLUE_600,\r\n        });\r\n    }\r\n    if (record.redirect) {\r\n        tags.push({\r\n            label: typeof record.redirect === 'string'\r\n                ? `redirect: ${record.redirect}`\r\n                : 'redirects',\r\n            textColor: 0xffffff,\r\n            backgroundColor: DARK,\r\n        });\r\n    }\r\n    // add an id to be able to select it. Using the `path` is not possible because\r\n    // empty path children would collide with their parents\r\n    let id = record.__vd_id;\r\n    if (id == null) {\r\n        id = String(routeRecordId++);\r\n        record.__vd_id = id;\r\n    }\r\n    return {\r\n        id,\r\n        label: record.path,\r\n        tags,\r\n        children: route.children.map(formatRouteRecordForInspector),\r\n    };\r\n}\r\n//  incremental id for route records and inspector state\r\nlet routeRecordId = 0;\r\nconst EXTRACT_REGEXP_RE = /^\\/(.*)\\/([a-z]*)$/;\r\nfunction markRouteRecordActive(route, currentRoute) {\r\n    // no route will be active if matched is empty\r\n    // reset the matching state\r\n    const isExactActive = currentRoute.matched.length &&\r\n        isSameRouteRecord(currentRoute.matched[currentRoute.matched.length - 1], route.record);\r\n    route.__vd_exactActive = route.__vd_active = isExactActive;\r\n    if (!isExactActive) {\r\n        route.__vd_active = currentRoute.matched.some(match => isSameRouteRecord(match, route.record));\r\n    }\r\n    route.children.forEach(childRoute => markRouteRecordActive(childRoute, currentRoute));\r\n}\r\nfunction resetMatchStateOnRouteRecord(route) {\r\n    route.__vd_match = false;\r\n    route.children.forEach(resetMatchStateOnRouteRecord);\r\n}\r\nfunction isRouteMatching(route, filter) {\r\n    const found = String(route.re).match(EXTRACT_REGEXP_RE);\r\n    route.__vd_match = false;\r\n    if (!found || found.length < 3) {\r\n        return false;\r\n    }\r\n    // use a regexp without $ at the end to match nested routes better\r\n    const nonEndingRE = new RegExp(found[1].replace(/\\$$/, ''), found[2]);\r\n    if (nonEndingRE.test(filter)) {\r\n        // mark children as matches\r\n        route.children.forEach(child => isRouteMatching(child, filter));\r\n        // exception case: `/`\r\n        if (route.record.path !== '/' || filter === '/') {\r\n            route.__vd_match = route.re.test(filter);\r\n            return true;\r\n        }\r\n        // hide the / route\r\n        return false;\r\n    }\r\n    const path = route.record.path.toLowerCase();\r\n    const decodedPath = decode(path);\r\n    // also allow partial matching on the path\r\n    if (!filter.startsWith('/') &&\r\n        (decodedPath.includes(filter) || path.includes(filter)))\r\n        return true;\r\n    if (decodedPath.startsWith(filter) || path.startsWith(filter))\r\n        return true;\r\n    if (route.record.name && String(route.record.name).includes(filter))\r\n        return true;\r\n    return route.children.some(child => isRouteMatching(child, filter));\r\n}\r\nfunction omit(obj, keys) {\r\n    const ret = {};\r\n    for (const key in obj) {\r\n        if (!keys.includes(key)) {\r\n            // @ts-expect-error\r\n            ret[key] = obj[key];\r\n        }\r\n    }\r\n    return ret;\r\n}\n\n/**\r\n * Creates a Router instance that can be used by a Vue app.\r\n *\r\n * @param options - {@link RouterOptions}\r\n */\r\nfunction createRouter(options) {\r\n    const matcher = createRouterMatcher(options.routes, options);\r\n    const parseQuery$1 = options.parseQuery || parseQuery;\r\n    const stringifyQuery$1 = options.stringifyQuery || stringifyQuery;\r\n    const routerHistory = options.history;\r\n    if (( true) && !routerHistory)\r\n        throw new Error('Provide the \"history\" option when calling \"createRouter()\":' +\r\n            ' https://next.router.vuejs.org/api/#history.');\r\n    const beforeGuards = useCallbacks();\r\n    const beforeResolveGuards = useCallbacks();\r\n    const afterGuards = useCallbacks();\r\n    const currentRoute = (0,vue__WEBPACK_IMPORTED_MODULE_0__.shallowRef)(START_LOCATION_NORMALIZED);\r\n    let pendingLocation = START_LOCATION_NORMALIZED;\r\n    // leave the scrollRestoration if no scrollBehavior is provided\r\n    if (isBrowser && options.scrollBehavior && 'scrollRestoration' in history) {\r\n        history.scrollRestoration = 'manual';\r\n    }\r\n    const normalizeParams = applyToParams.bind(null, paramValue => '' + paramValue);\r\n    const encodeParams = applyToParams.bind(null, encodeParam);\r\n    const decodeParams = \r\n    // @ts-expect-error: intentionally avoid the type check\r\n    applyToParams.bind(null, decode);\r\n    function addRoute(parentOrRoute, route) {\r\n        let parent;\r\n        let record;\r\n        if (isRouteName(parentOrRoute)) {\r\n            parent = matcher.getRecordMatcher(parentOrRoute);\r\n            record = route;\r\n        }\r\n        else {\r\n            record = parentOrRoute;\r\n        }\r\n        return matcher.addRoute(record, parent);\r\n    }\r\n    function removeRoute(name) {\r\n        const recordMatcher = matcher.getRecordMatcher(name);\r\n        if (recordMatcher) {\r\n            matcher.removeRoute(recordMatcher);\r\n        }\r\n        else if ((true)) {\r\n            warn(`Cannot remove non-existent route \"${String(name)}\"`);\r\n        }\r\n    }\r\n    function getRoutes() {\r\n        return matcher.getRoutes().map(routeMatcher => routeMatcher.record);\r\n    }\r\n    function hasRoute(name) {\r\n        return !!matcher.getRecordMatcher(name);\r\n    }\r\n    function resolve(rawLocation, currentLocation) {\r\n        // const objectLocation = routerLocationAsObject(rawLocation)\r\n        // we create a copy to modify it later\r\n        currentLocation = assign({}, currentLocation || currentRoute.value);\r\n        if (typeof rawLocation === 'string') {\r\n            const locationNormalized = parseURL(parseQuery$1, rawLocation, currentLocation.path);\r\n            const matchedRoute = matcher.resolve({ path: locationNormalized.path }, currentLocation);\r\n            const href = routerHistory.createHref(locationNormalized.fullPath);\r\n            if ((true)) {\r\n                if (href.startsWith('//'))\r\n                    warn(`Location \"${rawLocation}\" resolved to \"${href}\". A resolved location cannot start with multiple slashes.`);\r\n                else if (!matchedRoute.matched.length) {\r\n                    warn(`No match found for location with path \"${rawLocation}\"`);\r\n                }\r\n            }\r\n            // locationNormalized is always a new object\r\n            return assign(locationNormalized, matchedRoute, {\r\n                params: decodeParams(matchedRoute.params),\r\n                hash: decode(locationNormalized.hash),\r\n                redirectedFrom: undefined,\r\n                href,\r\n            });\r\n        }\r\n        let matcherLocation;\r\n        // path could be relative in object as well\r\n        if ('path' in rawLocation) {\r\n            if (( true) &&\r\n                'params' in rawLocation &&\r\n                !('name' in rawLocation) &&\r\n                // @ts-expect-error: the type is never\r\n                Object.keys(rawLocation.params).length) {\r\n                warn(`Path \"${\r\n                // @ts-expect-error: the type is never\r\n                rawLocation.path}\" was passed with params but they will be ignored. Use a named route alongside params instead.`);\r\n            }\r\n            matcherLocation = assign({}, rawLocation, {\r\n                path: parseURL(parseQuery$1, rawLocation.path, currentLocation.path).path,\r\n            });\r\n        }\r\n        else {\r\n            // remove any nullish param\r\n            const targetParams = assign({}, rawLocation.params);\r\n            for (const key in targetParams) {\r\n                if (targetParams[key] == null) {\r\n                    delete targetParams[key];\r\n                }\r\n            }\r\n            // pass encoded values to the matcher, so it can produce encoded path and fullPath\r\n            matcherLocation = assign({}, rawLocation, {\r\n                params: encodeParams(rawLocation.params),\r\n            });\r\n            // current location params are decoded, we need to encode them in case the\r\n            // matcher merges the params\r\n            currentLocation.params = encodeParams(currentLocation.params);\r\n        }\r\n        const matchedRoute = matcher.resolve(matcherLocation, currentLocation);\r\n        const hash = rawLocation.hash || '';\r\n        if (( true) && hash && !hash.startsWith('#')) {\r\n            warn(`A \\`hash\\` should always start with the character \"#\". Replace \"${hash}\" with \"#${hash}\".`);\r\n        }\r\n        // the matcher might have merged current location params, so\r\n        // we need to run the decoding again\r\n        matchedRoute.params = normalizeParams(decodeParams(matchedRoute.params));\r\n        const fullPath = stringifyURL(stringifyQuery$1, assign({}, rawLocation, {\r\n            hash: encodeHash(hash),\r\n            path: matchedRoute.path,\r\n        }));\r\n        const href = routerHistory.createHref(fullPath);\r\n        if ((true)) {\r\n            if (href.startsWith('//')) {\r\n                warn(`Location \"${rawLocation}\" resolved to \"${href}\". A resolved location cannot start with multiple slashes.`);\r\n            }\r\n            else if (!matchedRoute.matched.length) {\r\n                warn(`No match found for location with path \"${'path' in rawLocation ? rawLocation.path : rawLocation}\"`);\r\n            }\r\n        }\r\n        return assign({\r\n            fullPath,\r\n            // keep the hash encoded so fullPath is effectively path + encodedQuery +\r\n            // hash\r\n            hash,\r\n            query: \r\n            // if the user is using a custom query lib like qs, we might have\r\n            // nested objects, so we keep the query as is, meaning it can contain\r\n            // numbers at `$route.query`, but at the point, the user will have to\r\n            // use their own type anyway.\r\n            // https://github.com/vuejs/router/issues/328#issuecomment-649481567\r\n            stringifyQuery$1 === stringifyQuery\r\n                ? normalizeQuery(rawLocation.query)\r\n                : (rawLocation.query || {}),\r\n        }, matchedRoute, {\r\n            redirectedFrom: undefined,\r\n            href,\r\n        });\r\n    }\r\n    function locationAsObject(to) {\r\n        return typeof to === 'string'\r\n            ? parseURL(parseQuery$1, to, currentRoute.value.path)\r\n            : assign({}, to);\r\n    }\r\n    function checkCanceledNavigation(to, from) {\r\n        if (pendingLocation !== to) {\r\n            return createRouterError(8 /* ErrorTypes.NAVIGATION_CANCELLED */, {\r\n                from,\r\n                to,\r\n            });\r\n        }\r\n    }\r\n    function push(to) {\r\n        return pushWithRedirect(to);\r\n    }\r\n    function replace(to) {\r\n        return push(assign(locationAsObject(to), { replace: true }));\r\n    }\r\n    function handleRedirectRecord(to) {\r\n        const lastMatched = to.matched[to.matched.length - 1];\r\n        if (lastMatched && lastMatched.redirect) {\r\n            const { redirect } = lastMatched;\r\n            let newTargetLocation = typeof redirect === 'function' ? redirect(to) : redirect;\r\n            if (typeof newTargetLocation === 'string') {\r\n                newTargetLocation =\r\n                    newTargetLocation.includes('?') || newTargetLocation.includes('#')\r\n                        ? (newTargetLocation = locationAsObject(newTargetLocation))\r\n                        : // force empty params\r\n                            { path: newTargetLocation };\r\n                // @ts-expect-error: force empty params when a string is passed to let\r\n                // the router parse them again\r\n                newTargetLocation.params = {};\r\n            }\r\n            if (( true) &&\r\n                !('path' in newTargetLocation) &&\r\n                !('name' in newTargetLocation)) {\r\n                warn(`Invalid redirect found:\\n${JSON.stringify(newTargetLocation, null, 2)}\\n when navigating to \"${to.fullPath}\". A redirect must contain a name or path. This will break in production.`);\r\n                throw new Error('Invalid redirect');\r\n            }\r\n            return assign({\r\n                query: to.query,\r\n                hash: to.hash,\r\n                // avoid transferring params if the redirect has a path\r\n                params: 'path' in newTargetLocation ? {} : to.params,\r\n            }, newTargetLocation);\r\n        }\r\n    }\r\n    function pushWithRedirect(to, redirectedFrom) {\r\n        const targetLocation = (pendingLocation = resolve(to));\r\n        const from = currentRoute.value;\r\n        const data = to.state;\r\n        const force = to.force;\r\n        // to could be a string where `replace` is a function\r\n        const replace = to.replace === true;\r\n        const shouldRedirect = handleRedirectRecord(targetLocation);\r\n        if (shouldRedirect)\r\n            return pushWithRedirect(assign(locationAsObject(shouldRedirect), {\r\n                state: typeof shouldRedirect === 'object'\r\n                    ? assign({}, data, shouldRedirect.state)\r\n                    : data,\r\n                force,\r\n                replace,\r\n            }), \r\n            // keep original redirectedFrom if it exists\r\n            redirectedFrom || targetLocation);\r\n        // if it was a redirect we already called `pushWithRedirect` above\r\n        const toLocation = targetLocation;\r\n        toLocation.redirectedFrom = redirectedFrom;\r\n        let failure;\r\n        if (!force && isSameRouteLocation(stringifyQuery$1, from, targetLocation)) {\r\n            failure = createRouterError(16 /* ErrorTypes.NAVIGATION_DUPLICATED */, { to: toLocation, from });\r\n            // trigger scroll to allow scrolling to the same anchor\r\n            handleScroll(from, from, \r\n            // this is a push, the only way for it to be triggered from a\r\n            // history.listen is with a redirect, which makes it become a push\r\n            true, \r\n            // This cannot be the first navigation because the initial location\r\n            // cannot be manually navigated to\r\n            false);\r\n        }\r\n        return (failure ? Promise.resolve(failure) : navigate(toLocation, from))\r\n            .catch((error) => isNavigationFailure(error)\r\n            ? // navigation redirects still mark the router as ready\r\n                isNavigationFailure(error, 2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)\r\n                    ? error\r\n                    : markAsReady(error) // also returns the error\r\n            : // reject any unknown error\r\n                triggerError(error, toLocation, from))\r\n            .then((failure) => {\r\n            if (failure) {\r\n                if (isNavigationFailure(failure, 2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)) {\r\n                    if (( true) &&\r\n                        // we are redirecting to the same location we were already at\r\n                        isSameRouteLocation(stringifyQuery$1, resolve(failure.to), toLocation) &&\r\n                        // and we have done it a couple of times\r\n                        redirectedFrom &&\r\n                        // @ts-expect-error: added only in dev\r\n                        (redirectedFrom._count = redirectedFrom._count\r\n                            ? // @ts-expect-error\r\n                                redirectedFrom._count + 1\r\n                            : 1) > 10) {\r\n                        warn(`Detected an infinite redirection in a navigation guard when going from \"${from.fullPath}\" to \"${toLocation.fullPath}\". Aborting to avoid a Stack Overflow. This will break in production if not fixed.`);\r\n                        return Promise.reject(new Error('Infinite redirect in navigation guard'));\r\n                    }\r\n                    return pushWithRedirect(\r\n                    // keep options\r\n                    assign({\r\n                        // preserve an existing replacement but allow the redirect to override it\r\n                        replace,\r\n                    }, locationAsObject(failure.to), {\r\n                        state: typeof failure.to === 'object'\r\n                            ? assign({}, data, failure.to.state)\r\n                            : data,\r\n                        force,\r\n                    }), \r\n                    // preserve the original redirectedFrom if any\r\n                    redirectedFrom || toLocation);\r\n                }\r\n            }\r\n            else {\r\n                // if we fail we don't finalize the navigation\r\n                failure = finalizeNavigation(toLocation, from, true, replace, data);\r\n            }\r\n            triggerAfterEach(toLocation, from, failure);\r\n            return failure;\r\n        });\r\n    }\r\n    /**\r\n     * Helper to reject and skip all navigation guards if a new navigation happened\r\n     * @param to\r\n     * @param from\r\n     */\r\n    function checkCanceledNavigationAndReject(to, from) {\r\n        const error = checkCanceledNavigation(to, from);\r\n        return error ? Promise.reject(error) : Promise.resolve();\r\n    }\r\n    // TODO: refactor the whole before guards by internally using router.beforeEach\r\n    function navigate(to, from) {\r\n        let guards;\r\n        const [leavingRecords, updatingRecords, enteringRecords] = extractChangingRecords(to, from);\r\n        // all components here have been resolved once because we are leaving\r\n        guards = extractComponentsGuards(leavingRecords.reverse(), 'beforeRouteLeave', to, from);\r\n        // leavingRecords is already reversed\r\n        for (const record of leavingRecords) {\r\n            record.leaveGuards.forEach(guard => {\r\n                guards.push(guardToPromiseFn(guard, to, from));\r\n            });\r\n        }\r\n        const canceledNavigationCheck = checkCanceledNavigationAndReject.bind(null, to, from);\r\n        guards.push(canceledNavigationCheck);\r\n        // run the queue of per route beforeRouteLeave guards\r\n        return (runGuardQueue(guards)\r\n            .then(() => {\r\n            // check global guards beforeEach\r\n            guards = [];\r\n            for (const guard of beforeGuards.list()) {\r\n                guards.push(guardToPromiseFn(guard, to, from));\r\n            }\r\n            guards.push(canceledNavigationCheck);\r\n            return runGuardQueue(guards);\r\n        })\r\n            .then(() => {\r\n            // check in components beforeRouteUpdate\r\n            guards = extractComponentsGuards(updatingRecords, 'beforeRouteUpdate', to, from);\r\n            for (const record of updatingRecords) {\r\n                record.updateGuards.forEach(guard => {\r\n                    guards.push(guardToPromiseFn(guard, to, from));\r\n                });\r\n            }\r\n            guards.push(canceledNavigationCheck);\r\n            // run the queue of per route beforeEnter guards\r\n            return runGuardQueue(guards);\r\n        })\r\n            .then(() => {\r\n            // check the route beforeEnter\r\n            guards = [];\r\n            for (const record of to.matched) {\r\n                // do not trigger beforeEnter on reused views\r\n                if (record.beforeEnter && !from.matched.includes(record)) {\r\n                    if (isArray(record.beforeEnter)) {\r\n                        for (const beforeEnter of record.beforeEnter)\r\n                            guards.push(guardToPromiseFn(beforeEnter, to, from));\r\n                    }\r\n                    else {\r\n                        guards.push(guardToPromiseFn(record.beforeEnter, to, from));\r\n                    }\r\n                }\r\n            }\r\n            guards.push(canceledNavigationCheck);\r\n            // run the queue of per route beforeEnter guards\r\n            return runGuardQueue(guards);\r\n        })\r\n            .then(() => {\r\n            // NOTE: at this point to.matched is normalized and does not contain any () => Promise<Component>\r\n            // clear existing enterCallbacks, these are added by extractComponentsGuards\r\n            to.matched.forEach(record => (record.enterCallbacks = {}));\r\n            // check in-component beforeRouteEnter\r\n            guards = extractComponentsGuards(enteringRecords, 'beforeRouteEnter', to, from);\r\n            guards.push(canceledNavigationCheck);\r\n            // run the queue of per route beforeEnter guards\r\n            return runGuardQueue(guards);\r\n        })\r\n            .then(() => {\r\n            // check global guards beforeResolve\r\n            guards = [];\r\n            for (const guard of beforeResolveGuards.list()) {\r\n                guards.push(guardToPromiseFn(guard, to, from));\r\n            }\r\n            guards.push(canceledNavigationCheck);\r\n            return runGuardQueue(guards);\r\n        })\r\n            // catch any navigation canceled\r\n            .catch(err => isNavigationFailure(err, 8 /* ErrorTypes.NAVIGATION_CANCELLED */)\r\n            ? err\r\n            : Promise.reject(err)));\r\n    }\r\n    function triggerAfterEach(to, from, failure) {\r\n        // navigation is confirmed, call afterGuards\r\n        // TODO: wrap with error handlers\r\n        for (const guard of afterGuards.list())\r\n            guard(to, from, failure);\r\n    }\r\n    /**\r\n     * - Cleans up any navigation guards\r\n     * - Changes the url if necessary\r\n     * - Calls the scrollBehavior\r\n     */\r\n    function finalizeNavigation(toLocation, from, isPush, replace, data) {\r\n        // a more recent navigation took place\r\n        const error = checkCanceledNavigation(toLocation, from);\r\n        if (error)\r\n            return error;\r\n        // only consider as push if it's not the first navigation\r\n        const isFirstNavigation = from === START_LOCATION_NORMALIZED;\r\n        const state = !isBrowser ? {} : history.state;\r\n        // change URL only if the user did a push/replace and if it's not the initial navigation because\r\n        // it's just reflecting the url\r\n        if (isPush) {\r\n            // on the initial navigation, we want to reuse the scroll position from\r\n            // history state if it exists\r\n            if (replace || isFirstNavigation)\r\n                routerHistory.replace(toLocation.fullPath, assign({\r\n                    scroll: isFirstNavigation && state && state.scroll,\r\n                }, data));\r\n            else\r\n                routerHistory.push(toLocation.fullPath, data);\r\n        }\r\n        // accept current navigation\r\n        currentRoute.value = toLocation;\r\n        handleScroll(toLocation, from, isPush, isFirstNavigation);\r\n        markAsReady();\r\n    }\r\n    let removeHistoryListener;\r\n    // attach listener to history to trigger navigations\r\n    function setupListeners() {\r\n        // avoid setting up listeners twice due to an invalid first navigation\r\n        if (removeHistoryListener)\r\n            return;\r\n        removeHistoryListener = routerHistory.listen((to, _from, info) => {\r\n            if (!router.listening)\r\n                return;\r\n            // cannot be a redirect route because it was in history\r\n            const toLocation = resolve(to);\r\n            // due to dynamic routing, and to hash history with manual navigation\r\n            // (manually changing the url or calling history.hash = '#/somewhere'),\r\n            // there could be a redirect record in history\r\n            const shouldRedirect = handleRedirectRecord(toLocation);\r\n            if (shouldRedirect) {\r\n                pushWithRedirect(assign(shouldRedirect, { replace: true }), toLocation).catch(noop);\r\n                return;\r\n            }\r\n            pendingLocation = toLocation;\r\n            const from = currentRoute.value;\r\n            // TODO: should be moved to web history?\r\n            if (isBrowser) {\r\n                saveScrollPosition(getScrollKey(from.fullPath, info.delta), computeScrollPosition());\r\n            }\r\n            navigate(toLocation, from)\r\n                .catch((error) => {\r\n                if (isNavigationFailure(error, 4 /* ErrorTypes.NAVIGATION_ABORTED */ | 8 /* ErrorTypes.NAVIGATION_CANCELLED */)) {\r\n                    return error;\r\n                }\r\n                if (isNavigationFailure(error, 2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)) {\r\n                    // Here we could call if (info.delta) routerHistory.go(-info.delta,\r\n                    // false) but this is bug prone as we have no way to wait the\r\n                    // navigation to be finished before calling pushWithRedirect. Using\r\n                    // a setTimeout of 16ms seems to work but there is no guarantee for\r\n                    // it to work on every browser. So instead we do not restore the\r\n                    // history entry and trigger a new navigation as requested by the\r\n                    // navigation guard.\r\n                    // the error is already handled by router.push we just want to avoid\r\n                    // logging the error\r\n                    pushWithRedirect(error.to, toLocation\r\n                    // avoid an uncaught rejection, let push call triggerError\r\n                    )\r\n                        .then(failure => {\r\n                        // manual change in hash history #916 ending up in the URL not\r\n                        // changing, but it was changed by the manual url change, so we\r\n                        // need to manually change it ourselves\r\n                        if (isNavigationFailure(failure, 4 /* ErrorTypes.NAVIGATION_ABORTED */ |\r\n                            16 /* ErrorTypes.NAVIGATION_DUPLICATED */) &&\r\n                            !info.delta &&\r\n                            info.type === NavigationType.pop) {\r\n                            routerHistory.go(-1, false);\r\n                        }\r\n                    })\r\n                        .catch(noop);\r\n                    // avoid the then branch\r\n                    return Promise.reject();\r\n                }\r\n                // do not restore history on unknown direction\r\n                if (info.delta) {\r\n                    routerHistory.go(-info.delta, false);\r\n                }\r\n                // unrecognized error, transfer to the global handler\r\n                return triggerError(error, toLocation, from);\r\n            })\r\n                .then((failure) => {\r\n                failure =\r\n                    failure ||\r\n                        finalizeNavigation(\r\n                        // after navigation, all matched components are resolved\r\n                        toLocation, from, false);\r\n                // revert the navigation\r\n                if (failure) {\r\n                    if (info.delta &&\r\n                        // a new navigation has been triggered, so we do not want to revert, that will change the current history\r\n                        // entry while a different route is displayed\r\n                        !isNavigationFailure(failure, 8 /* ErrorTypes.NAVIGATION_CANCELLED */)) {\r\n                        routerHistory.go(-info.delta, false);\r\n                    }\r\n                    else if (info.type === NavigationType.pop &&\r\n                        isNavigationFailure(failure, 4 /* ErrorTypes.NAVIGATION_ABORTED */ | 16 /* ErrorTypes.NAVIGATION_DUPLICATED */)) {\r\n                        // manual change in hash history #916\r\n                        // it's like a push but lacks the information of the direction\r\n                        routerHistory.go(-1, false);\r\n                    }\r\n                }\r\n                triggerAfterEach(toLocation, from, failure);\r\n            })\r\n                .catch(noop);\r\n        });\r\n    }\r\n    // Initialization and Errors\r\n    let readyHandlers = useCallbacks();\r\n    let errorHandlers = useCallbacks();\r\n    let ready;\r\n    /**\r\n     * Trigger errorHandlers added via onError and throws the error as well\r\n     *\r\n     * @param error - error to throw\r\n     * @param to - location we were navigating to when the error happened\r\n     * @param from - location we were navigating from when the error happened\r\n     * @returns the error as a rejected promise\r\n     */\r\n    function triggerError(error, to, from) {\r\n        markAsReady(error);\r\n        const list = errorHandlers.list();\r\n        if (list.length) {\r\n            list.forEach(handler => handler(error, to, from));\r\n        }\r\n        else {\r\n            if ((true)) {\r\n                warn('uncaught error during route navigation:');\r\n            }\r\n            console.error(error);\r\n        }\r\n        return Promise.reject(error);\r\n    }\r\n    function isReady() {\r\n        if (ready && currentRoute.value !== START_LOCATION_NORMALIZED)\r\n            return Promise.resolve();\r\n        return new Promise((resolve, reject) => {\r\n            readyHandlers.add([resolve, reject]);\r\n        });\r\n    }\r\n    function markAsReady(err) {\r\n        if (!ready) {\r\n            // still not ready if an error happened\r\n            ready = !err;\r\n            setupListeners();\r\n            readyHandlers\r\n                .list()\r\n                .forEach(([resolve, reject]) => (err ? reject(err) : resolve()));\r\n            readyHandlers.reset();\r\n        }\r\n        return err;\r\n    }\r\n    // Scroll behavior\r\n    function handleScroll(to, from, isPush, isFirstNavigation) {\r\n        const { scrollBehavior } = options;\r\n        if (!isBrowser || !scrollBehavior)\r\n            return Promise.resolve();\r\n        const scrollPosition = (!isPush && getSavedScrollPosition(getScrollKey(to.fullPath, 0))) ||\r\n            ((isFirstNavigation || !isPush) &&\r\n                history.state &&\r\n                history.state.scroll) ||\r\n            null;\r\n        return (0,vue__WEBPACK_IMPORTED_MODULE_0__.nextTick)()\r\n            .then(() => scrollBehavior(to, from, scrollPosition))\r\n            .then(position => position && scrollToPosition(position))\r\n            .catch(err => triggerError(err, to, from));\r\n    }\r\n    const go = (delta) => routerHistory.go(delta);\r\n    let started;\r\n    const installedApps = new Set();\r\n    const router = {\r\n        currentRoute,\r\n        listening: true,\r\n        addRoute,\r\n        removeRoute,\r\n        hasRoute,\r\n        getRoutes,\r\n        resolve,\r\n        options,\r\n        push,\r\n        replace,\r\n        go,\r\n        back: () => go(-1),\r\n        forward: () => go(1),\r\n        beforeEach: beforeGuards.add,\r\n        beforeResolve: beforeResolveGuards.add,\r\n        afterEach: afterGuards.add,\r\n        onError: errorHandlers.add,\r\n        isReady,\r\n        install(app) {\r\n            const router = this;\r\n            app.component('RouterLink', RouterLink);\r\n            app.component('RouterView', RouterView);\r\n            app.config.globalProperties.$router = router;\r\n            Object.defineProperty(app.config.globalProperties, '$route', {\r\n                enumerable: true,\r\n                get: () => (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(currentRoute),\r\n            });\r\n            // this initial navigation is only necessary on client, on server it doesn't\r\n            // make sense because it will create an extra unnecessary navigation and could\r\n            // lead to problems\r\n            if (isBrowser &&\r\n                // used for the initial navigation client side to avoid pushing\r\n                // multiple times when the router is used in multiple apps\r\n                !started &&\r\n                currentRoute.value === START_LOCATION_NORMALIZED) {\r\n                // see above\r\n                started = true;\r\n                push(routerHistory.location).catch(err => {\r\n                    if ((true))\r\n                        warn('Unexpected error when starting the router:', err);\r\n                });\r\n            }\r\n            const reactiveRoute = {};\r\n            for (const key in START_LOCATION_NORMALIZED) {\r\n                // @ts-expect-error: the key matches\r\n                reactiveRoute[key] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => currentRoute.value[key]);\r\n            }\r\n            app.provide(routerKey, router);\r\n            app.provide(routeLocationKey, (0,vue__WEBPACK_IMPORTED_MODULE_0__.reactive)(reactiveRoute));\r\n            app.provide(routerViewLocationKey, currentRoute);\r\n            const unmountApp = app.unmount;\r\n            installedApps.add(app);\r\n            app.unmount = function () {\r\n                installedApps.delete(app);\r\n                // the router is not attached to an app anymore\r\n                if (installedApps.size < 1) {\r\n                    // invalidate the current navigation\r\n                    pendingLocation = START_LOCATION_NORMALIZED;\r\n                    removeHistoryListener && removeHistoryListener();\r\n                    removeHistoryListener = null;\r\n                    currentRoute.value = START_LOCATION_NORMALIZED;\r\n                    started = false;\r\n                    ready = false;\r\n                }\r\n                unmountApp();\r\n            };\r\n            // TODO: this probably needs to be updated so it can be used by vue-termui\r\n            if (( true) && isBrowser) {\r\n                addDevtools(app, router, matcher);\r\n            }\r\n        },\r\n    };\r\n    return router;\r\n}\r\nfunction runGuardQueue(guards) {\r\n    return guards.reduce((promise, guard) => promise.then(() => guard()), Promise.resolve());\r\n}\r\nfunction extractChangingRecords(to, from) {\r\n    const leavingRecords = [];\r\n    const updatingRecords = [];\r\n    const enteringRecords = [];\r\n    const len = Math.max(from.matched.length, to.matched.length);\r\n    for (let i = 0; i < len; i++) {\r\n        const recordFrom = from.matched[i];\r\n        if (recordFrom) {\r\n            if (to.matched.find(record => isSameRouteRecord(record, recordFrom)))\r\n                updatingRecords.push(recordFrom);\r\n            else\r\n                leavingRecords.push(recordFrom);\r\n        }\r\n        const recordTo = to.matched[i];\r\n        if (recordTo) {\r\n            // the type doesn't matter because we are comparing per reference\r\n            if (!from.matched.find(record => isSameRouteRecord(record, recordTo))) {\r\n                enteringRecords.push(recordTo);\r\n            }\r\n        }\r\n    }\r\n    return [leavingRecords, updatingRecords, enteringRecords];\r\n}\n\n/**\r\n * Returns the router instance. Equivalent to using `$router` inside\r\n * templates.\r\n */\r\nfunction useRouter() {\r\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(routerKey);\r\n}\r\n/**\r\n * Returns the current route location. Equivalent to using `$route` inside\r\n * templates.\r\n */\r\nfunction useRoute() {\r\n    return (0,vue__WEBPACK_IMPORTED_MODULE_0__.inject)(routeLocationKey);\r\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdnVlLXJvdXRlci9kaXN0L3Z1ZS1yb3V0ZXIubWpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2lNO0FBQ3pJOztBQUV4RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLG1CQUFtQjtBQUNqRDtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0Esb0VBQW9FO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBELGVBQWU7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsSUFBcUM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsaUJBQWlCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSw2Q0FBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsMENBQUs7QUFDaEMsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsSUFBcUM7QUFDOUQ7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsNkNBQVE7QUFDN0M7QUFDQTtBQUNBLDBDQUEwQyw2Q0FBUTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsS0FBZ0U7QUFDakY7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVywyQ0FBTTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDJDQUFNO0FBQ2pCOztBQUVvYSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy92dWUtcm91dGVyL2Rpc3QvdnVlLXJvdXRlci5tanM/ZjI1MyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAgKiB2dWUtcm91dGVyIHY0LjEuNlxuICAqIChjKSAyMDIyIEVkdWFyZG8gU2FuIE1hcnRpbiBNb3JvdGVcbiAgKiBAbGljZW5zZSBNSVRcbiAgKi9cbmltcG9ydCB7IGdldEN1cnJlbnRJbnN0YW5jZSwgaW5qZWN0LCBvblVubW91bnRlZCwgb25EZWFjdGl2YXRlZCwgb25BY3RpdmF0ZWQsIGNvbXB1dGVkLCB1bnJlZiwgd2F0Y2hFZmZlY3QsIGRlZmluZUNvbXBvbmVudCwgcmVhY3RpdmUsIGgsIHByb3ZpZGUsIHJlZiwgd2F0Y2gsIHNoYWxsb3dSZWYsIG5leHRUaWNrIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IHNldHVwRGV2dG9vbHNQbHVnaW4gfSBmcm9tICdAdnVlL2RldnRvb2xzLWFwaSc7XG5cbmNvbnN0IGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xuXG5mdW5jdGlvbiBpc0VTTW9kdWxlKG9iaikge1xyXG4gICAgcmV0dXJuIG9iai5fX2VzTW9kdWxlIHx8IG9ialtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnTW9kdWxlJztcclxufVxyXG5jb25zdCBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xyXG5mdW5jdGlvbiBhcHBseVRvUGFyYW1zKGZuLCBwYXJhbXMpIHtcclxuICAgIGNvbnN0IG5ld1BhcmFtcyA9IHt9O1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gcGFyYW1zKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbXNba2V5XTtcclxuICAgICAgICBuZXdQYXJhbXNba2V5XSA9IGlzQXJyYXkodmFsdWUpXHJcbiAgICAgICAgICAgID8gdmFsdWUubWFwKGZuKVxyXG4gICAgICAgICAgICA6IGZuKHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdQYXJhbXM7XHJcbn1cclxuY29uc3Qgbm9vcCA9ICgpID0+IHsgfTtcclxuLyoqXHJcbiAqIFR5cGVzYWZlIGFsdGVybmF0aXZlIHRvIEFycmF5LmlzQXJyYXlcclxuICogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L3B1bGwvNDgyMjhcclxuICovXHJcbmNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5mdW5jdGlvbiB3YXJuKG1zZykge1xyXG4gICAgLy8gYXZvaWQgdXNpbmcgLi4uYXJncyBhcyBpdCBicmVha3MgaW4gb2xkZXIgRWRnZSBidWlsZHNcclxuICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5mcm9tKGFyZ3VtZW50cykuc2xpY2UoMSk7XHJcbiAgICBjb25zb2xlLndhcm4uYXBwbHkoY29uc29sZSwgWydbVnVlIFJvdXRlciB3YXJuXTogJyArIG1zZ10uY29uY2F0KGFyZ3MpKTtcclxufVxuXG5jb25zdCBUUkFJTElOR19TTEFTSF9SRSA9IC9cXC8kLztcclxuY29uc3QgcmVtb3ZlVHJhaWxpbmdTbGFzaCA9IChwYXRoKSA9PiBwYXRoLnJlcGxhY2UoVFJBSUxJTkdfU0xBU0hfUkUsICcnKTtcclxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgYSBVUkkgaW50byBhIG5vcm1hbGl6ZWQgaGlzdG9yeSBsb2NhdGlvblxyXG4gKlxyXG4gKiBAcGFyYW0gcGFyc2VRdWVyeVxyXG4gKiBAcGFyYW0gbG9jYXRpb24gLSBVUkkgdG8gbm9ybWFsaXplXHJcbiAqIEBwYXJhbSBjdXJyZW50TG9jYXRpb24gLSBjdXJyZW50IGFic29sdXRlIGxvY2F0aW9uLiBBbGxvd3MgcmVzb2x2aW5nIHJlbGF0aXZlXHJcbiAqIHBhdGhzLiBNdXN0IHN0YXJ0IHdpdGggYC9gLiBEZWZhdWx0cyB0byBgL2BcclxuICogQHJldHVybnMgYSBub3JtYWxpemVkIGhpc3RvcnkgbG9jYXRpb25cclxuICovXHJcbmZ1bmN0aW9uIHBhcnNlVVJMKHBhcnNlUXVlcnksIGxvY2F0aW9uLCBjdXJyZW50TG9jYXRpb24gPSAnLycpIHtcclxuICAgIGxldCBwYXRoLCBxdWVyeSA9IHt9LCBzZWFyY2hTdHJpbmcgPSAnJywgaGFzaCA9ICcnO1xyXG4gICAgLy8gQ291bGQgdXNlIFVSTCBhbmQgVVJMU2VhcmNoUGFyYW1zIGJ1dCBJRSAxMSBkb2Vzbid0IHN1cHBvcnQgaXRcclxuICAgIC8vIFRPRE86IG1vdmUgdG8gbmV3IFVSTCgpXHJcbiAgICBjb25zdCBoYXNoUG9zID0gbG9jYXRpb24uaW5kZXhPZignIycpO1xyXG4gICAgbGV0IHNlYXJjaFBvcyA9IGxvY2F0aW9uLmluZGV4T2YoJz8nKTtcclxuICAgIC8vIHRoZSBoYXNoIGFwcGVhcnMgYmVmb3JlIHRoZSBzZWFyY2gsIHNvIGl0J3Mgbm90IHBhcnQgb2YgdGhlIHNlYXJjaCBzdHJpbmdcclxuICAgIGlmIChoYXNoUG9zIDwgc2VhcmNoUG9zICYmIGhhc2hQb3MgPj0gMCkge1xyXG4gICAgICAgIHNlYXJjaFBvcyA9IC0xO1xyXG4gICAgfVxyXG4gICAgaWYgKHNlYXJjaFBvcyA+IC0xKSB7XHJcbiAgICAgICAgcGF0aCA9IGxvY2F0aW9uLnNsaWNlKDAsIHNlYXJjaFBvcyk7XHJcbiAgICAgICAgc2VhcmNoU3RyaW5nID0gbG9jYXRpb24uc2xpY2Uoc2VhcmNoUG9zICsgMSwgaGFzaFBvcyA+IC0xID8gaGFzaFBvcyA6IGxvY2F0aW9uLmxlbmd0aCk7XHJcbiAgICAgICAgcXVlcnkgPSBwYXJzZVF1ZXJ5KHNlYXJjaFN0cmluZyk7XHJcbiAgICB9XHJcbiAgICBpZiAoaGFzaFBvcyA+IC0xKSB7XHJcbiAgICAgICAgcGF0aCA9IHBhdGggfHwgbG9jYXRpb24uc2xpY2UoMCwgaGFzaFBvcyk7XHJcbiAgICAgICAgLy8ga2VlcCB0aGUgIyBjaGFyYWN0ZXJcclxuICAgICAgICBoYXNoID0gbG9jYXRpb24uc2xpY2UoaGFzaFBvcywgbG9jYXRpb24ubGVuZ3RoKTtcclxuICAgIH1cclxuICAgIC8vIG5vIHNlYXJjaCBhbmQgbm8gcXVlcnlcclxuICAgIHBhdGggPSByZXNvbHZlUmVsYXRpdmVQYXRoKHBhdGggIT0gbnVsbCA/IHBhdGggOiBsb2NhdGlvbiwgY3VycmVudExvY2F0aW9uKTtcclxuICAgIC8vIGVtcHR5IHBhdGggbWVhbnMgYSByZWxhdGl2ZSBxdWVyeSBvciBoYXNoIGA/Zm9vPWZgLCBgI3RoaW5nYFxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBmdWxsUGF0aDogcGF0aCArIChzZWFyY2hTdHJpbmcgJiYgJz8nKSArIHNlYXJjaFN0cmluZyArIGhhc2gsXHJcbiAgICAgICAgcGF0aCxcclxuICAgICAgICBxdWVyeSxcclxuICAgICAgICBoYXNoLFxyXG4gICAgfTtcclxufVxyXG4vKipcclxuICogU3RyaW5naWZpZXMgYSBVUkwgb2JqZWN0XHJcbiAqXHJcbiAqIEBwYXJhbSBzdHJpbmdpZnlRdWVyeVxyXG4gKiBAcGFyYW0gbG9jYXRpb25cclxuICovXHJcbmZ1bmN0aW9uIHN0cmluZ2lmeVVSTChzdHJpbmdpZnlRdWVyeSwgbG9jYXRpb24pIHtcclxuICAgIGNvbnN0IHF1ZXJ5ID0gbG9jYXRpb24ucXVlcnkgPyBzdHJpbmdpZnlRdWVyeShsb2NhdGlvbi5xdWVyeSkgOiAnJztcclxuICAgIHJldHVybiBsb2NhdGlvbi5wYXRoICsgKHF1ZXJ5ICYmICc/JykgKyBxdWVyeSArIChsb2NhdGlvbi5oYXNoIHx8ICcnKTtcclxufVxyXG4vKipcclxuICogU3RyaXBzIG9mZiB0aGUgYmFzZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYSBsb2NhdGlvbi5wYXRobmFtZSBpbiBhIG5vbi1jYXNlLXNlbnNpdGl2ZSB3YXkuXHJcbiAqXHJcbiAqIEBwYXJhbSBwYXRobmFtZSAtIGxvY2F0aW9uLnBhdGhuYW1lXHJcbiAqIEBwYXJhbSBiYXNlIC0gYmFzZSB0byBzdHJpcCBvZmZcclxuICovXHJcbmZ1bmN0aW9uIHN0cmlwQmFzZShwYXRobmFtZSwgYmFzZSkge1xyXG4gICAgLy8gbm8gYmFzZSBvciBiYXNlIGlzIG5vdCBmb3VuZCBhdCB0aGUgYmVnaW5uaW5nXHJcbiAgICBpZiAoIWJhc2UgfHwgIXBhdGhuYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChiYXNlLnRvTG93ZXJDYXNlKCkpKVxyXG4gICAgICAgIHJldHVybiBwYXRobmFtZTtcclxuICAgIHJldHVybiBwYXRobmFtZS5zbGljZShiYXNlLmxlbmd0aCkgfHwgJy8nO1xyXG59XHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdHdvIFJvdXRlTG9jYXRpb24gYXJlIGVxdWFsLiBUaGlzIG1lYW5zIHRoYXQgYm90aCBsb2NhdGlvbnMgYXJlXHJcbiAqIHBvaW50aW5nIHRvd2FyZHMgdGhlIHNhbWUge0BsaW5rIFJvdXRlUmVjb3JkfSBhbmQgdGhhdCBhbGwgYHBhcmFtc2AsIGBxdWVyeWBcclxuICogcGFyYW1ldGVycyBhbmQgYGhhc2hgIGFyZSB0aGUgc2FtZVxyXG4gKlxyXG4gKiBAcGFyYW0gYSAtIGZpcnN0IHtAbGluayBSb3V0ZUxvY2F0aW9ufVxyXG4gKiBAcGFyYW0gYiAtIHNlY29uZCB7QGxpbmsgUm91dGVMb2NhdGlvbn1cclxuICovXHJcbmZ1bmN0aW9uIGlzU2FtZVJvdXRlTG9jYXRpb24oc3RyaW5naWZ5UXVlcnksIGEsIGIpIHtcclxuICAgIGNvbnN0IGFMYXN0SW5kZXggPSBhLm1hdGNoZWQubGVuZ3RoIC0gMTtcclxuICAgIGNvbnN0IGJMYXN0SW5kZXggPSBiLm1hdGNoZWQubGVuZ3RoIC0gMTtcclxuICAgIHJldHVybiAoYUxhc3RJbmRleCA+IC0xICYmXHJcbiAgICAgICAgYUxhc3RJbmRleCA9PT0gYkxhc3RJbmRleCAmJlxyXG4gICAgICAgIGlzU2FtZVJvdXRlUmVjb3JkKGEubWF0Y2hlZFthTGFzdEluZGV4XSwgYi5tYXRjaGVkW2JMYXN0SW5kZXhdKSAmJlxyXG4gICAgICAgIGlzU2FtZVJvdXRlTG9jYXRpb25QYXJhbXMoYS5wYXJhbXMsIGIucGFyYW1zKSAmJlxyXG4gICAgICAgIHN0cmluZ2lmeVF1ZXJ5KGEucXVlcnkpID09PSBzdHJpbmdpZnlRdWVyeShiLnF1ZXJ5KSAmJlxyXG4gICAgICAgIGEuaGFzaCA9PT0gYi5oYXNoKTtcclxufVxyXG4vKipcclxuICogQ2hlY2sgaWYgdHdvIGBSb3V0ZVJlY29yZHNgIGFyZSBlcXVhbC4gVGFrZXMgaW50byBhY2NvdW50IGFsaWFzZXM6IHRoZXkgYXJlXHJcbiAqIGNvbnNpZGVyZWQgZXF1YWwgdG8gdGhlIGBSb3V0ZVJlY29yZGAgdGhleSBhcmUgYWxpYXNpbmcuXHJcbiAqXHJcbiAqIEBwYXJhbSBhIC0gZmlyc3Qge0BsaW5rIFJvdXRlUmVjb3JkfVxyXG4gKiBAcGFyYW0gYiAtIHNlY29uZCB7QGxpbmsgUm91dGVSZWNvcmR9XHJcbiAqL1xyXG5mdW5jdGlvbiBpc1NhbWVSb3V0ZVJlY29yZChhLCBiKSB7XHJcbiAgICAvLyBzaW5jZSB0aGUgb3JpZ2luYWwgcmVjb3JkIGhhcyBhbiB1bmRlZmluZWQgdmFsdWUgZm9yIGFsaWFzT2ZcclxuICAgIC8vIGJ1dCBhbGwgYWxpYXNlcyBwb2ludCB0byB0aGUgb3JpZ2luYWwgcmVjb3JkLCB0aGlzIHdpbGwgYWx3YXlzIGNvbXBhcmVcclxuICAgIC8vIHRoZSBvcmlnaW5hbCByZWNvcmRcclxuICAgIHJldHVybiAoYS5hbGlhc09mIHx8IGEpID09PSAoYi5hbGlhc09mIHx8IGIpO1xyXG59XHJcbmZ1bmN0aW9uIGlzU2FtZVJvdXRlTG9jYXRpb25QYXJhbXMoYSwgYikge1xyXG4gICAgaWYgKE9iamVjdC5rZXlzKGEpLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIGEpIHtcclxuICAgICAgICBpZiAoIWlzU2FtZVJvdXRlTG9jYXRpb25QYXJhbXNWYWx1ZShhW2tleV0sIGJba2V5XSkpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbmZ1bmN0aW9uIGlzU2FtZVJvdXRlTG9jYXRpb25QYXJhbXNWYWx1ZShhLCBiKSB7XHJcbiAgICByZXR1cm4gaXNBcnJheShhKVxyXG4gICAgICAgID8gaXNFcXVpdmFsZW50QXJyYXkoYSwgYilcclxuICAgICAgICA6IGlzQXJyYXkoYilcclxuICAgICAgICAgICAgPyBpc0VxdWl2YWxlbnRBcnJheShiLCBhKVxyXG4gICAgICAgICAgICA6IGEgPT09IGI7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrIGlmIHR3byBhcnJheXMgYXJlIHRoZSBzYW1lIG9yIGlmIGFuIGFycmF5IHdpdGggb25lIHNpbmdsZSBlbnRyeSBpcyB0aGVcclxuICogc2FtZSBhcyBhbm90aGVyIHByaW1pdGl2ZSB2YWx1ZS4gVXNlZCB0byBjaGVjayBxdWVyeSBhbmQgcGFyYW1ldGVyc1xyXG4gKlxyXG4gKiBAcGFyYW0gYSAtIGFycmF5IG9mIHZhbHVlc1xyXG4gKiBAcGFyYW0gYiAtIGFycmF5IG9mIHZhbHVlcyBvciBhIHNpbmdsZSB2YWx1ZVxyXG4gKi9cclxuZnVuY3Rpb24gaXNFcXVpdmFsZW50QXJyYXkoYSwgYikge1xyXG4gICAgcmV0dXJuIGlzQXJyYXkoYilcclxuICAgICAgICA/IGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KCh2YWx1ZSwgaSkgPT4gdmFsdWUgPT09IGJbaV0pXHJcbiAgICAgICAgOiBhLmxlbmd0aCA9PT0gMSAmJiBhWzBdID09PSBiO1xyXG59XHJcbi8qKlxyXG4gKiBSZXNvbHZlcyBhIHJlbGF0aXZlIHBhdGggdGhhdCBzdGFydHMgd2l0aCBgLmAuXHJcbiAqXHJcbiAqIEBwYXJhbSB0byAtIHBhdGggbG9jYXRpb24gd2UgYXJlIHJlc29sdmluZ1xyXG4gKiBAcGFyYW0gZnJvbSAtIGN1cnJlbnRMb2NhdGlvbi5wYXRoLCBzaG91bGQgc3RhcnQgd2l0aCBgL2BcclxuICovXHJcbmZ1bmN0aW9uIHJlc29sdmVSZWxhdGl2ZVBhdGgodG8sIGZyb20pIHtcclxuICAgIGlmICh0by5zdGFydHNXaXRoKCcvJykpXHJcbiAgICAgICAgcmV0dXJuIHRvO1xyXG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhZnJvbS5zdGFydHNXaXRoKCcvJykpIHtcclxuICAgICAgICB3YXJuKGBDYW5ub3QgcmVzb2x2ZSBhIHJlbGF0aXZlIGxvY2F0aW9uIHdpdGhvdXQgYW4gYWJzb2x1dGUgcGF0aC4gVHJ5aW5nIHRvIHJlc29sdmUgXCIke3RvfVwiIGZyb20gXCIke2Zyb219XCIuIEl0IHNob3VsZCBsb29rIGxpa2UgXCIvJHtmcm9tfVwiLmApO1xyXG4gICAgICAgIHJldHVybiB0bztcclxuICAgIH1cclxuICAgIGlmICghdG8pXHJcbiAgICAgICAgcmV0dXJuIGZyb207XHJcbiAgICBjb25zdCBmcm9tU2VnbWVudHMgPSBmcm9tLnNwbGl0KCcvJyk7XHJcbiAgICBjb25zdCB0b1NlZ21lbnRzID0gdG8uc3BsaXQoJy8nKTtcclxuICAgIGxldCBwb3NpdGlvbiA9IGZyb21TZWdtZW50cy5sZW5ndGggLSAxO1xyXG4gICAgbGV0IHRvUG9zaXRpb247XHJcbiAgICBsZXQgc2VnbWVudDtcclxuICAgIGZvciAodG9Qb3NpdGlvbiA9IDA7IHRvUG9zaXRpb24gPCB0b1NlZ21lbnRzLmxlbmd0aDsgdG9Qb3NpdGlvbisrKSB7XHJcbiAgICAgICAgc2VnbWVudCA9IHRvU2VnbWVudHNbdG9Qb3NpdGlvbl07XHJcbiAgICAgICAgLy8gd2Ugc3RheSBvbiB0aGUgc2FtZSBwb3NpdGlvblxyXG4gICAgICAgIGlmIChzZWdtZW50ID09PSAnLicpXHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIC8vIGdvIHVwIGluIHRoZSBmcm9tIGFycmF5XHJcbiAgICAgICAgaWYgKHNlZ21lbnQgPT09ICcuLicpIHtcclxuICAgICAgICAgICAgLy8gd2UgY2FuJ3QgZ28gYmVsb3cgemVybywgYnV0IHdlIHN0aWxsIG5lZWQgdG8gaW5jcmVtZW50IHRvUG9zaXRpb25cclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uID4gMSlcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uLS07XHJcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHdlIHJlYWNoZWQgYSBub24tcmVsYXRpdmUgcGF0aCwgd2Ugc3RvcCBoZXJlXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiAoZnJvbVNlZ21lbnRzLnNsaWNlKDAsIHBvc2l0aW9uKS5qb2luKCcvJykgK1xyXG4gICAgICAgICcvJyArXHJcbiAgICAgICAgdG9TZWdtZW50c1xyXG4gICAgICAgICAgICAvLyBlbnN1cmUgd2UgdXNlIGF0IGxlYXN0IHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIHRvU2VnbWVudHNcclxuICAgICAgICAgICAgLnNsaWNlKHRvUG9zaXRpb24gLSAodG9Qb3NpdGlvbiA9PT0gdG9TZWdtZW50cy5sZW5ndGggPyAxIDogMCkpXHJcbiAgICAgICAgICAgIC5qb2luKCcvJykpO1xyXG59XG5cbnZhciBOYXZpZ2F0aW9uVHlwZTtcclxuKGZ1bmN0aW9uIChOYXZpZ2F0aW9uVHlwZSkge1xyXG4gICAgTmF2aWdhdGlvblR5cGVbXCJwb3BcIl0gPSBcInBvcFwiO1xyXG4gICAgTmF2aWdhdGlvblR5cGVbXCJwdXNoXCJdID0gXCJwdXNoXCI7XHJcbn0pKE5hdmlnYXRpb25UeXBlIHx8IChOYXZpZ2F0aW9uVHlwZSA9IHt9KSk7XHJcbnZhciBOYXZpZ2F0aW9uRGlyZWN0aW9uO1xyXG4oZnVuY3Rpb24gKE5hdmlnYXRpb25EaXJlY3Rpb24pIHtcclxuICAgIE5hdmlnYXRpb25EaXJlY3Rpb25bXCJiYWNrXCJdID0gXCJiYWNrXCI7XHJcbiAgICBOYXZpZ2F0aW9uRGlyZWN0aW9uW1wiZm9yd2FyZFwiXSA9IFwiZm9yd2FyZFwiO1xyXG4gICAgTmF2aWdhdGlvbkRpcmVjdGlvbltcInVua25vd25cIl0gPSBcIlwiO1xyXG59KShOYXZpZ2F0aW9uRGlyZWN0aW9uIHx8IChOYXZpZ2F0aW9uRGlyZWN0aW9uID0ge30pKTtcclxuLyoqXHJcbiAqIFN0YXJ0aW5nIGxvY2F0aW9uIGZvciBIaXN0b3JpZXNcclxuICovXHJcbmNvbnN0IFNUQVJUID0gJyc7XHJcbi8vIEdlbmVyaWMgdXRpbHNcclxuLyoqXHJcbiAqIE5vcm1hbGl6ZXMgYSBiYXNlIGJ5IHJlbW92aW5nIGFueSB0cmFpbGluZyBzbGFzaCBhbmQgcmVhZGluZyB0aGUgYmFzZSB0YWcgaWZcclxuICogcHJlc2VudC5cclxuICpcclxuICogQHBhcmFtIGJhc2UgLSBiYXNlIHRvIG5vcm1hbGl6ZVxyXG4gKi9cclxuZnVuY3Rpb24gbm9ybWFsaXplQmFzZShiYXNlKSB7XHJcbiAgICBpZiAoIWJhc2UpIHtcclxuICAgICAgICBpZiAoaXNCcm93c2VyKSB7XHJcbiAgICAgICAgICAgIC8vIHJlc3BlY3QgPGJhc2U+IHRhZ1xyXG4gICAgICAgICAgICBjb25zdCBiYXNlRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdiYXNlJyk7XHJcbiAgICAgICAgICAgIGJhc2UgPSAoYmFzZUVsICYmIGJhc2VFbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkgfHwgJy8nO1xyXG4gICAgICAgICAgICAvLyBzdHJpcCBmdWxsIFVSTCBvcmlnaW5cclxuICAgICAgICAgICAgYmFzZSA9IGJhc2UucmVwbGFjZSgvXlxcdys6XFwvXFwvW15cXC9dKy8sICcnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGJhc2UgPSAnLyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gZW5zdXJlIGxlYWRpbmcgc2xhc2ggd2hlbiBpdCB3YXMgcmVtb3ZlZCBieSB0aGUgcmVnZXggYWJvdmUgYXZvaWQgbGVhZGluZ1xyXG4gICAgLy8gc2xhc2ggd2l0aCBoYXNoIGJlY2F1c2UgdGhlIGZpbGUgY291bGQgYmUgcmVhZCBmcm9tIHRoZSBkaXNrIGxpa2UgZmlsZTovL1xyXG4gICAgLy8gYW5kIHRoZSBsZWFkaW5nIHNsYXNoIHdvdWxkIGNhdXNlIHByb2JsZW1zXHJcbiAgICBpZiAoYmFzZVswXSAhPT0gJy8nICYmIGJhc2VbMF0gIT09ICcjJylcclxuICAgICAgICBiYXNlID0gJy8nICsgYmFzZTtcclxuICAgIC8vIHJlbW92ZSB0aGUgdHJhaWxpbmcgc2xhc2ggc28gYWxsIG90aGVyIG1ldGhvZCBjYW4ganVzdCBkbyBgYmFzZSArIGZ1bGxQYXRoYFxyXG4gICAgLy8gdG8gYnVpbGQgYW4gaHJlZlxyXG4gICAgcmV0dXJuIHJlbW92ZVRyYWlsaW5nU2xhc2goYmFzZSk7XHJcbn1cclxuLy8gcmVtb3ZlIGFueSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBoYXNoXHJcbmNvbnN0IEJFRk9SRV9IQVNIX1JFID0gL15bXiNdKyMvO1xyXG5mdW5jdGlvbiBjcmVhdGVIcmVmKGJhc2UsIGxvY2F0aW9uKSB7XHJcbiAgICByZXR1cm4gYmFzZS5yZXBsYWNlKEJFRk9SRV9IQVNIX1JFLCAnIycpICsgbG9jYXRpb247XHJcbn1cblxuZnVuY3Rpb24gZ2V0RWxlbWVudFBvc2l0aW9uKGVsLCBvZmZzZXQpIHtcclxuICAgIGNvbnN0IGRvY1JlY3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBlbFJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgYmVoYXZpb3I6IG9mZnNldC5iZWhhdmlvcixcclxuICAgICAgICBsZWZ0OiBlbFJlY3QubGVmdCAtIGRvY1JlY3QubGVmdCAtIChvZmZzZXQubGVmdCB8fCAwKSxcclxuICAgICAgICB0b3A6IGVsUmVjdC50b3AgLSBkb2NSZWN0LnRvcCAtIChvZmZzZXQudG9wIHx8IDApLFxyXG4gICAgfTtcclxufVxyXG5jb25zdCBjb21wdXRlU2Nyb2xsUG9zaXRpb24gPSAoKSA9PiAoe1xyXG4gICAgbGVmdDogd2luZG93LnBhZ2VYT2Zmc2V0LFxyXG4gICAgdG9wOiB3aW5kb3cucGFnZVlPZmZzZXQsXHJcbn0pO1xyXG5mdW5jdGlvbiBzY3JvbGxUb1Bvc2l0aW9uKHBvc2l0aW9uKSB7XHJcbiAgICBsZXQgc2Nyb2xsVG9PcHRpb25zO1xyXG4gICAgaWYgKCdlbCcgaW4gcG9zaXRpb24pIHtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbkVsID0gcG9zaXRpb24uZWw7XHJcbiAgICAgICAgY29uc3QgaXNJZFNlbGVjdG9yID0gdHlwZW9mIHBvc2l0aW9uRWwgPT09ICdzdHJpbmcnICYmIHBvc2l0aW9uRWwuc3RhcnRzV2l0aCgnIycpO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIGBpZGBzIGNhbiBhY2NlcHQgcHJldHR5IG11Y2ggYW55IGNoYXJhY3RlcnMsIGluY2x1ZGluZyBDU1MgY29tYmluYXRvcnNcclxuICAgICAgICAgKiBsaWtlIGA+YCBvciBgfmAuIEl0J3Mgc3RpbGwgcG9zc2libGUgdG8gcmV0cmlldmUgZWxlbWVudHMgdXNpbmdcclxuICAgICAgICAgKiBgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ34nKWAgYnV0IGl0IG5lZWRzIHRvIGJlIGVzY2FwZWQgd2hlbiB1c2luZ1xyXG4gICAgICAgICAqIGBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjXFxcXH4nKWAgZm9yIGl0IHRvIGJlIHZhbGlkLiBUaGUgb25seVxyXG4gICAgICAgICAqIHJlcXVpcmVtZW50cyBmb3IgYGlkYHMgYXJlIHRoZW0gdG8gYmUgdW5pcXVlIG9uIHRoZSBwYWdlIGFuZCB0byBub3QgYmVcclxuICAgICAgICAgKiBlbXB0eSAoYGlkPVwiXCJgKS4gQmVjYXVzZSBvZiB0aGF0LCB3aGVuIHBhc3NpbmcgYW4gaWQgc2VsZWN0b3IsIGl0IHNob3VsZFxyXG4gICAgICAgICAqIGJlIHByb3Blcmx5IGVzY2FwZWQgZm9yIGl0IHRvIHdvcmsgd2l0aCBgcXVlcnlTZWxlY3RvcmAuIFdlIGNvdWxkIGNoZWNrXHJcbiAgICAgICAgICogZm9yIHRoZSBpZCBzZWxlY3RvciB0byBiZSBzaW1wbGUgKG5vIENTUyBjb21iaW5hdG9ycyBgKyA+fmApIGJ1dCB0aGF0XHJcbiAgICAgICAgICogd291bGQgbWFrZSB0aGluZ3MgaW5jb25zaXN0ZW50IHNpbmNlIHRoZXkgYXJlIHZhbGlkIGNoYXJhY3RlcnMgZm9yIGFuXHJcbiAgICAgICAgICogYGlkYCBidXQgd291bGQgbmVlZCB0byBiZSBlc2NhcGVkIHdoZW4gdXNpbmcgYHF1ZXJ5U2VsZWN0b3JgLCBicmVha2luZ1xyXG4gICAgICAgICAqIHRoZWlyIHVzYWdlIGFuZCBlbmRpbmcgdXAgaW4gbm8gc2VsZWN0b3IgcmV0dXJuZWQuIFNlbGVjdG9ycyBuZWVkIHRvIGJlXHJcbiAgICAgICAgICogZXNjYXBlZDpcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIC0gYCMxLXRoaW5nYCBiZWNvbWVzIGAjXFwzMSAtdGhpbmdgXHJcbiAgICAgICAgICogLSBgI3dpdGh+c3ltYm9sc2AgYmVjb21lcyBgI3dpdGhcXFxcfnN5bWJvbHNgXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiAtIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgIHRoZSB0b3BpYyBjYW4gYmUgZm91bmQgYXRcclxuICAgICAgICAgKiAgIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9odG1sNS1pZC1jbGFzcy5cclxuICAgICAgICAgKiAtIFByYWN0aWNhbCBleGFtcGxlOiBodHRwczovL21hdGhpYXNieW5lbnMuYmUvZGVtby9odG1sNS1pZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgdHlwZW9mIHBvc2l0aW9uLmVsID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAoIWlzSWRTZWxlY3RvciB8fCAhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocG9zaXRpb24uZWwuc2xpY2UoMSkpKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHBvc2l0aW9uLmVsKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNJZFNlbGVjdG9yICYmIGZvdW5kRWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2FybihgVGhlIHNlbGVjdG9yIFwiJHtwb3NpdGlvbi5lbH1cIiBzaG91bGQgYmUgcGFzc2VkIGFzIFwiZWw6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyR7cG9zaXRpb24uZWx9JylcIiBiZWNhdXNlIGl0IHN0YXJ0cyB3aXRoIFwiI1wiLmApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdG8gYXZvaWQgb3RoZXIgd2FybmluZ3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICB3YXJuKGBUaGUgc2VsZWN0b3IgXCIke3Bvc2l0aW9uLmVsfVwiIGlzIGludmFsaWQuIElmIHlvdSBhcmUgdXNpbmcgYW4gaWQgc2VsZWN0b3IsIG1ha2Ugc3VyZSB0byBlc2NhcGUgaXQuIFlvdSBjYW4gZmluZCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGVzY2FwaW5nIGNoYXJhY3RlcnMgaW4gc2VsZWN0b3JzIGF0IGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9jc3MtZXNjYXBlcyBvciB1c2UgQ1NTLmVzY2FwZSAoaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NTUy9lc2NhcGUpLmApO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0byBhdm9pZCBvdGhlciB3YXJuaW5nc1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBlbCA9IHR5cGVvZiBwb3NpdGlvbkVsID09PSAnc3RyaW5nJ1xyXG4gICAgICAgICAgICA/IGlzSWRTZWxlY3RvclxyXG4gICAgICAgICAgICAgICAgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwb3NpdGlvbkVsLnNsaWNlKDEpKVxyXG4gICAgICAgICAgICAgICAgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHBvc2l0aW9uRWwpXHJcbiAgICAgICAgICAgIDogcG9zaXRpb25FbDtcclxuICAgICAgICBpZiAoIWVsKSB7XHJcbiAgICAgICAgICAgIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJlxyXG4gICAgICAgICAgICAgICAgd2FybihgQ291bGRuJ3QgZmluZCBlbGVtZW50IHVzaW5nIHNlbGVjdG9yIFwiJHtwb3NpdGlvbi5lbH1cIiByZXR1cm5lZCBieSBzY3JvbGxCZWhhdmlvci5gKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzY3JvbGxUb09wdGlvbnMgPSBnZXRFbGVtZW50UG9zaXRpb24oZWwsIHBvc2l0aW9uKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHNjcm9sbFRvT3B0aW9ucyA9IHBvc2l0aW9uO1xyXG4gICAgfVxyXG4gICAgaWYgKCdzY3JvbGxCZWhhdmlvcicgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlKVxyXG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbyhzY3JvbGxUb09wdGlvbnMpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKHNjcm9sbFRvT3B0aW9ucy5sZWZ0ICE9IG51bGwgPyBzY3JvbGxUb09wdGlvbnMubGVmdCA6IHdpbmRvdy5wYWdlWE9mZnNldCwgc2Nyb2xsVG9PcHRpb25zLnRvcCAhPSBudWxsID8gc2Nyb2xsVG9PcHRpb25zLnRvcCA6IHdpbmRvdy5wYWdlWU9mZnNldCk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gZ2V0U2Nyb2xsS2V5KHBhdGgsIGRlbHRhKSB7XHJcbiAgICBjb25zdCBwb3NpdGlvbiA9IGhpc3Rvcnkuc3RhdGUgPyBoaXN0b3J5LnN0YXRlLnBvc2l0aW9uIC0gZGVsdGEgOiAtMTtcclxuICAgIHJldHVybiBwb3NpdGlvbiArIHBhdGg7XHJcbn1cclxuY29uc3Qgc2Nyb2xsUG9zaXRpb25zID0gbmV3IE1hcCgpO1xyXG5mdW5jdGlvbiBzYXZlU2Nyb2xsUG9zaXRpb24oa2V5LCBzY3JvbGxQb3NpdGlvbikge1xyXG4gICAgc2Nyb2xsUG9zaXRpb25zLnNldChrZXksIHNjcm9sbFBvc2l0aW9uKTtcclxufVxyXG5mdW5jdGlvbiBnZXRTYXZlZFNjcm9sbFBvc2l0aW9uKGtleSkge1xyXG4gICAgY29uc3Qgc2Nyb2xsID0gc2Nyb2xsUG9zaXRpb25zLmdldChrZXkpO1xyXG4gICAgLy8gY29uc3VtZSBpdCBzbyBpdCdzIG5vdCB1c2VkIGFnYWluXHJcbiAgICBzY3JvbGxQb3NpdGlvbnMuZGVsZXRlKGtleSk7XHJcbiAgICByZXR1cm4gc2Nyb2xsO1xyXG59XHJcbi8vIFRPRE86IFJGQyBhYm91dCBob3cgdG8gc2F2ZSBzY3JvbGwgcG9zaXRpb25cclxuLyoqXHJcbiAqIFNjcm9sbEJlaGF2aW9yIGluc3RhbmNlIHVzZWQgYnkgdGhlIHJvdXRlciB0byBjb21wdXRlIGFuZCByZXN0b3JlIHRoZSBzY3JvbGxcclxuICogcG9zaXRpb24gd2hlbiBuYXZpZ2F0aW5nLlxyXG4gKi9cclxuLy8gZXhwb3J0IGludGVyZmFjZSBTY3JvbGxIYW5kbGVyPFNjcm9sbFBvc2l0aW9uRW50cnkgZXh0ZW5kcyBIaXN0b3J5U3RhdGVWYWx1ZSwgU2Nyb2xsUG9zaXRpb24gZXh0ZW5kcyBTY3JvbGxQb3NpdGlvbkVudHJ5PiB7XHJcbi8vICAgLy8gcmV0dXJucyBhIHNjcm9sbCBwb3NpdGlvbiB0aGF0IGNhbiBiZSBzYXZlZCBpbiBoaXN0b3J5XHJcbi8vICAgY29tcHV0ZSgpOiBTY3JvbGxQb3NpdGlvbkVudHJ5XHJcbi8vICAgLy8gY2FuIHRha2UgYW4gZXh0ZW5kZWQgU2Nyb2xsUG9zaXRpb25FbnRyeVxyXG4vLyAgIHNjcm9sbChwb3NpdGlvbjogU2Nyb2xsUG9zaXRpb24pOiB2b2lkXHJcbi8vIH1cclxuLy8gZXhwb3J0IGNvbnN0IHNjcm9sbEhhbmRsZXI6IFNjcm9sbEhhbmRsZXI8U2Nyb2xsUG9zaXRpb24+ID0ge1xyXG4vLyAgIGNvbXB1dGU6IGNvbXB1dGVTY3JvbGwsXHJcbi8vICAgc2Nyb2xsOiBzY3JvbGxUb1Bvc2l0aW9uLFxyXG4vLyB9XG5cbmxldCBjcmVhdGVCYXNlTG9jYXRpb24gPSAoKSA9PiBsb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyBsb2NhdGlvbi5ob3N0O1xyXG4vKipcclxuICogQ3JlYXRlcyBhIG5vcm1hbGl6ZWQgaGlzdG9yeSBsb2NhdGlvbiBmcm9tIGEgd2luZG93LmxvY2F0aW9uIG9iamVjdFxyXG4gKiBAcGFyYW0gbG9jYXRpb24gLVxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlQ3VycmVudExvY2F0aW9uKGJhc2UsIGxvY2F0aW9uKSB7XHJcbiAgICBjb25zdCB7IHBhdGhuYW1lLCBzZWFyY2gsIGhhc2ggfSA9IGxvY2F0aW9uO1xyXG4gICAgLy8gYWxsb3dzIGhhc2ggYmFzZXMgbGlrZSAjLCAvIywgIy8sICMhLCAjIS8sIC8jIS8sIG9yIGV2ZW4gL2ZvbGRlciNlbmRcclxuICAgIGNvbnN0IGhhc2hQb3MgPSBiYXNlLmluZGV4T2YoJyMnKTtcclxuICAgIGlmIChoYXNoUG9zID4gLTEpIHtcclxuICAgICAgICBsZXQgc2xpY2VQb3MgPSBoYXNoLmluY2x1ZGVzKGJhc2Uuc2xpY2UoaGFzaFBvcykpXHJcbiAgICAgICAgICAgID8gYmFzZS5zbGljZShoYXNoUG9zKS5sZW5ndGhcclxuICAgICAgICAgICAgOiAxO1xyXG4gICAgICAgIGxldCBwYXRoRnJvbUhhc2ggPSBoYXNoLnNsaWNlKHNsaWNlUG9zKTtcclxuICAgICAgICAvLyBwcmVwZW5kIHRoZSBzdGFydGluZyBzbGFzaCB0byBoYXNoIHNvIHRoZSB1cmwgc3RhcnRzIHdpdGggLyNcclxuICAgICAgICBpZiAocGF0aEZyb21IYXNoWzBdICE9PSAnLycpXHJcbiAgICAgICAgICAgIHBhdGhGcm9tSGFzaCA9ICcvJyArIHBhdGhGcm9tSGFzaDtcclxuICAgICAgICByZXR1cm4gc3RyaXBCYXNlKHBhdGhGcm9tSGFzaCwgJycpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGF0aCA9IHN0cmlwQmFzZShwYXRobmFtZSwgYmFzZSk7XHJcbiAgICByZXR1cm4gcGF0aCArIHNlYXJjaCArIGhhc2g7XHJcbn1cclxuZnVuY3Rpb24gdXNlSGlzdG9yeUxpc3RlbmVycyhiYXNlLCBoaXN0b3J5U3RhdGUsIGN1cnJlbnRMb2NhdGlvbiwgcmVwbGFjZSkge1xyXG4gICAgbGV0IGxpc3RlbmVycyA9IFtdO1xyXG4gICAgbGV0IHRlYXJkb3ducyA9IFtdO1xyXG4gICAgLy8gVE9ETzogc2hvdWxkIGl0IGJlIGEgc3RhY2s/IGEgRGljdC4gQ2hlY2sgaWYgdGhlIHBvcHN0YXRlIGxpc3RlbmVyXHJcbiAgICAvLyBjYW4gdHJpZ2dlciB0d2ljZVxyXG4gICAgbGV0IHBhdXNlU3RhdGUgPSBudWxsO1xyXG4gICAgY29uc3QgcG9wU3RhdGVIYW5kbGVyID0gKHsgc3RhdGUsIH0pID0+IHtcclxuICAgICAgICBjb25zdCB0byA9IGNyZWF0ZUN1cnJlbnRMb2NhdGlvbihiYXNlLCBsb2NhdGlvbik7XHJcbiAgICAgICAgY29uc3QgZnJvbSA9IGN1cnJlbnRMb2NhdGlvbi52YWx1ZTtcclxuICAgICAgICBjb25zdCBmcm9tU3RhdGUgPSBoaXN0b3J5U3RhdGUudmFsdWU7XHJcbiAgICAgICAgbGV0IGRlbHRhID0gMDtcclxuICAgICAgICBpZiAoc3RhdGUpIHtcclxuICAgICAgICAgICAgY3VycmVudExvY2F0aW9uLnZhbHVlID0gdG87XHJcbiAgICAgICAgICAgIGhpc3RvcnlTdGF0ZS52YWx1ZSA9IHN0YXRlO1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHBvcHN0YXRlIGFuZCByZXNldCB0aGUgcGF1c2VTdGF0ZVxyXG4gICAgICAgICAgICBpZiAocGF1c2VTdGF0ZSAmJiBwYXVzZVN0YXRlID09PSBmcm9tKSB7XHJcbiAgICAgICAgICAgICAgICBwYXVzZVN0YXRlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZWx0YSA9IGZyb21TdGF0ZSA/IHN0YXRlLnBvc2l0aW9uIC0gZnJvbVN0YXRlLnBvc2l0aW9uIDogMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlcGxhY2UodG8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh7IGRlbHRhRnJvbUN1cnJlbnQgfSlcclxuICAgICAgICAvLyBIZXJlIHdlIGNvdWxkIGFsc28gcmV2ZXJ0IHRoZSBuYXZpZ2F0aW9uIGJ5IGNhbGxpbmcgaGlzdG9yeS5nbygtZGVsdGEpXHJcbiAgICAgICAgLy8gdGhpcyBsaXN0ZW5lciB3aWxsIGhhdmUgdG8gYmUgYWRhcHRlZCB0byBub3QgdHJpZ2dlciBhZ2FpbiBhbmQgdG8gd2FpdCBmb3IgdGhlIHVybFxyXG4gICAgICAgIC8vIHRvIGJlIHVwZGF0ZWQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIGxpc3RlbmVycy4gU29tZSBraW5kIG9mIHZhbGlkYXRpb24gZnVuY3Rpb24gd291bGQgYWxzb1xyXG4gICAgICAgIC8vIG5lZWQgdG8gYmUgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lcnMgc28gdGhlIG5hdmlnYXRpb24gY2FuIGJlIGFjY2VwdGVkXHJcbiAgICAgICAgLy8gY2FsbCBhbGwgbGlzdGVuZXJzXHJcbiAgICAgICAgbGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4ge1xyXG4gICAgICAgICAgICBsaXN0ZW5lcihjdXJyZW50TG9jYXRpb24udmFsdWUsIGZyb20sIHtcclxuICAgICAgICAgICAgICAgIGRlbHRhLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogTmF2aWdhdGlvblR5cGUucG9wLFxyXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBkZWx0YVxyXG4gICAgICAgICAgICAgICAgICAgID8gZGVsdGEgPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gTmF2aWdhdGlvbkRpcmVjdGlvbi5mb3J3YXJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogTmF2aWdhdGlvbkRpcmVjdGlvbi5iYWNrXHJcbiAgICAgICAgICAgICAgICAgICAgOiBOYXZpZ2F0aW9uRGlyZWN0aW9uLnVua25vd24sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIGZ1bmN0aW9uIHBhdXNlTGlzdGVuZXJzKCkge1xyXG4gICAgICAgIHBhdXNlU3RhdGUgPSBjdXJyZW50TG9jYXRpb24udmFsdWU7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBsaXN0ZW4oY2FsbGJhY2spIHtcclxuICAgICAgICAvLyBzZXQgdXAgdGhlIGxpc3RlbmVyIGFuZCBwcmVwYXJlIHRlYXJkb3duIGNhbGxiYWNrc1xyXG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGNhbGxiYWNrKTtcclxuICAgICAgICBjb25zdCB0ZWFyZG93biA9ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKVxyXG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0ZWFyZG93bnMucHVzaCh0ZWFyZG93bik7XHJcbiAgICAgICAgcmV0dXJuIHRlYXJkb3duO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYmVmb3JlVW5sb2FkTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgY29uc3QgeyBoaXN0b3J5IH0gPSB3aW5kb3c7XHJcbiAgICAgICAgaWYgKCFoaXN0b3J5LnN0YXRlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoYXNzaWduKHt9LCBoaXN0b3J5LnN0YXRlLCB7IHNjcm9sbDogY29tcHV0ZVNjcm9sbFBvc2l0aW9uKCkgfSksICcnKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCB0ZWFyZG93biBvZiB0ZWFyZG93bnMpXHJcbiAgICAgICAgICAgIHRlYXJkb3duKCk7XHJcbiAgICAgICAgdGVhcmRvd25zID0gW107XHJcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvcHN0YXRlJywgcG9wU3RhdGVIYW5kbGVyKTtcclxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgYmVmb3JlVW5sb2FkTGlzdGVuZXIpO1xyXG4gICAgfVxyXG4gICAgLy8gc2V0IHVwIHRoZSBsaXN0ZW5lcnMgYW5kIHByZXBhcmUgdGVhcmRvd24gY2FsbGJhY2tzXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBwb3BTdGF0ZUhhbmRsZXIpO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIGJlZm9yZVVubG9hZExpc3RlbmVyKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgcGF1c2VMaXN0ZW5lcnMsXHJcbiAgICAgICAgbGlzdGVuLFxyXG4gICAgICAgIGRlc3Ryb3ksXHJcbiAgICB9O1xyXG59XHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgc3RhdGUgb2JqZWN0XHJcbiAqL1xyXG5mdW5jdGlvbiBidWlsZFN0YXRlKGJhY2ssIGN1cnJlbnQsIGZvcndhcmQsIHJlcGxhY2VkID0gZmFsc2UsIGNvbXB1dGVTY3JvbGwgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBiYWNrLFxyXG4gICAgICAgIGN1cnJlbnQsXHJcbiAgICAgICAgZm9yd2FyZCxcclxuICAgICAgICByZXBsYWNlZCxcclxuICAgICAgICBwb3NpdGlvbjogd2luZG93Lmhpc3RvcnkubGVuZ3RoLFxyXG4gICAgICAgIHNjcm9sbDogY29tcHV0ZVNjcm9sbCA/IGNvbXB1dGVTY3JvbGxQb3NpdGlvbigpIDogbnVsbCxcclxuICAgIH07XHJcbn1cclxuZnVuY3Rpb24gdXNlSGlzdG9yeVN0YXRlTmF2aWdhdGlvbihiYXNlKSB7XHJcbiAgICBjb25zdCB7IGhpc3RvcnksIGxvY2F0aW9uIH0gPSB3aW5kb3c7XHJcbiAgICAvLyBwcml2YXRlIHZhcmlhYmxlc1xyXG4gICAgY29uc3QgY3VycmVudExvY2F0aW9uID0ge1xyXG4gICAgICAgIHZhbHVlOiBjcmVhdGVDdXJyZW50TG9jYXRpb24oYmFzZSwgbG9jYXRpb24pLFxyXG4gICAgfTtcclxuICAgIGNvbnN0IGhpc3RvcnlTdGF0ZSA9IHsgdmFsdWU6IGhpc3Rvcnkuc3RhdGUgfTtcclxuICAgIC8vIGJ1aWxkIGN1cnJlbnQgaGlzdG9yeSBlbnRyeSBhcyB0aGlzIGlzIGEgZnJlc2ggbmF2aWdhdGlvblxyXG4gICAgaWYgKCFoaXN0b3J5U3RhdGUudmFsdWUpIHtcclxuICAgICAgICBjaGFuZ2VMb2NhdGlvbihjdXJyZW50TG9jYXRpb24udmFsdWUsIHtcclxuICAgICAgICAgICAgYmFjazogbnVsbCxcclxuICAgICAgICAgICAgY3VycmVudDogY3VycmVudExvY2F0aW9uLnZhbHVlLFxyXG4gICAgICAgICAgICBmb3J3YXJkOiBudWxsLFxyXG4gICAgICAgICAgICAvLyB0aGUgbGVuZ3RoIGlzIG9mZiBieSBvbmUsIHdlIG5lZWQgdG8gZGVjcmVhc2UgaXRcclxuICAgICAgICAgICAgcG9zaXRpb246IGhpc3RvcnkubGVuZ3RoIC0gMSxcclxuICAgICAgICAgICAgcmVwbGFjZWQ6IHRydWUsXHJcbiAgICAgICAgICAgIC8vIGRvbid0IGFkZCBhIHNjcm9sbCBhcyB0aGUgdXNlciBtYXkgaGF2ZSBhbiBhbmNob3IsIGFuZCB3ZSB3YW50XHJcbiAgICAgICAgICAgIC8vIHNjcm9sbEJlaGF2aW9yIHRvIGJlIHRyaWdnZXJlZCB3aXRob3V0IGEgc2F2ZWQgcG9zaXRpb25cclxuICAgICAgICAgICAgc2Nyb2xsOiBudWxsLFxyXG4gICAgICAgIH0sIHRydWUpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gY2hhbmdlTG9jYXRpb24odG8sIHN0YXRlLCByZXBsYWNlKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogaWYgYSBiYXNlIHRhZyBpcyBwcm92aWRlZCwgYW5kIHdlIGFyZSBvbiBhIG5vcm1hbCBkb21haW4sIHdlIGhhdmUgdG9cclxuICAgICAgICAgKiByZXNwZWN0IHRoZSBwcm92aWRlZCBgYmFzZWAgYXR0cmlidXRlIGJlY2F1c2UgcHVzaFN0YXRlKCkgd2lsbCB1c2UgaXQgYW5kXHJcbiAgICAgICAgICogcG90ZW50aWFsbHkgZXJhc2UgYW55dGhpbmcgYmVmb3JlIHRoZSBgI2AgbGlrZSBhdFxyXG4gICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy9yb3V0ZXIvaXNzdWVzLzY4NSB3aGVyZSBhIGJhc2Ugb2ZcclxuICAgICAgICAgKiBgL2ZvbGRlci8jYCBidXQgYSBiYXNlIG9mIGAvYCB3b3VsZCBlcmFzZSB0aGUgYC9mb2xkZXIvYCBzZWN0aW9uLiBJZlxyXG4gICAgICAgICAqIHRoZXJlIGlzIG5vIGhvc3QsIHRoZSBgPGJhc2U+YCB0YWcgbWFrZXMgbm8gc2Vuc2UgYW5kIGlmIHRoZXJlIGlzbid0IGFcclxuICAgICAgICAgKiBiYXNlIHRhZyB3ZSBjYW4ganVzdCB1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgYCNgLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGhhc2hJbmRleCA9IGJhc2UuaW5kZXhPZignIycpO1xyXG4gICAgICAgIGNvbnN0IHVybCA9IGhhc2hJbmRleCA+IC0xXHJcbiAgICAgICAgICAgID8gKGxvY2F0aW9uLmhvc3QgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYmFzZScpXHJcbiAgICAgICAgICAgICAgICA/IGJhc2VcclxuICAgICAgICAgICAgICAgIDogYmFzZS5zbGljZShoYXNoSW5kZXgpKSArIHRvXHJcbiAgICAgICAgICAgIDogY3JlYXRlQmFzZUxvY2F0aW9uKCkgKyBiYXNlICsgdG87XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gQlJPV1NFUiBRVUlSS1xyXG4gICAgICAgICAgICAvLyBOT1RFOiBTYWZhcmkgdGhyb3dzIGEgU2VjdXJpdHlFcnJvciB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAxMDAgdGltZXMgaW4gMzAgc2Vjb25kc1xyXG4gICAgICAgICAgICBoaXN0b3J5W3JlcGxhY2UgPyAncmVwbGFjZVN0YXRlJyA6ICdwdXNoU3RhdGUnXShzdGF0ZSwgJycsIHVybCk7XHJcbiAgICAgICAgICAgIGhpc3RvcnlTdGF0ZS52YWx1ZSA9IHN0YXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcclxuICAgICAgICAgICAgICAgIHdhcm4oJ0Vycm9yIHdpdGggcHVzaC9yZXBsYWNlIFN0YXRlJywgZXJyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBGb3JjZSB0aGUgbmF2aWdhdGlvbiwgdGhpcyBhbHNvIHJlc2V0cyB0aGUgY2FsbCBjb3VudFxyXG4gICAgICAgICAgICBsb2NhdGlvbltyZXBsYWNlID8gJ3JlcGxhY2UnIDogJ2Fzc2lnbiddKHVybCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcmVwbGFjZSh0bywgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IHN0YXRlID0gYXNzaWduKHt9LCBoaXN0b3J5LnN0YXRlLCBidWlsZFN0YXRlKGhpc3RvcnlTdGF0ZS52YWx1ZS5iYWNrLCBcclxuICAgICAgICAvLyBrZWVwIGJhY2sgYW5kIGZvcndhcmQgZW50cmllcyBidXQgb3ZlcnJpZGUgY3VycmVudCBwb3NpdGlvblxyXG4gICAgICAgIHRvLCBoaXN0b3J5U3RhdGUudmFsdWUuZm9yd2FyZCwgdHJ1ZSksIGRhdGEsIHsgcG9zaXRpb246IGhpc3RvcnlTdGF0ZS52YWx1ZS5wb3NpdGlvbiB9KTtcclxuICAgICAgICBjaGFuZ2VMb2NhdGlvbih0bywgc3RhdGUsIHRydWUpO1xyXG4gICAgICAgIGN1cnJlbnRMb2NhdGlvbi52YWx1ZSA9IHRvO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcHVzaCh0bywgZGF0YSkge1xyXG4gICAgICAgIC8vIEFkZCB0byBjdXJyZW50IGVudHJ5IHRoZSBpbmZvcm1hdGlvbiBvZiB3aGVyZSB3ZSBhcmUgZ29pbmdcclxuICAgICAgICAvLyBhcyB3ZWxsIGFzIHNhdmluZyB0aGUgY3VycmVudCBwb3NpdGlvblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGFzc2lnbih7fSwgXHJcbiAgICAgICAgLy8gdXNlIGN1cnJlbnQgaGlzdG9yeSBzdGF0ZSB0byBncmFjZWZ1bGx5IGhhbmRsZSBhIHdyb25nIGNhbGwgdG9cclxuICAgICAgICAvLyBoaXN0b3J5LnJlcGxhY2VTdGF0ZVxyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy9yb3V0ZXIvaXNzdWVzLzM2NlxyXG4gICAgICAgIGhpc3RvcnlTdGF0ZS52YWx1ZSwgaGlzdG9yeS5zdGF0ZSwge1xyXG4gICAgICAgICAgICBmb3J3YXJkOiB0byxcclxuICAgICAgICAgICAgc2Nyb2xsOiBjb21wdXRlU2Nyb2xsUG9zaXRpb24oKSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmICFoaXN0b3J5LnN0YXRlKSB7XHJcbiAgICAgICAgICAgIHdhcm4oYGhpc3Rvcnkuc3RhdGUgc2VlbXMgdG8gaGF2ZSBiZWVuIG1hbnVhbGx5IHJlcGxhY2VkIHdpdGhvdXQgcHJlc2VydmluZyB0aGUgbmVjZXNzYXJ5IHZhbHVlcy4gTWFrZSBzdXJlIHRvIHByZXNlcnZlIGV4aXN0aW5nIGhpc3Rvcnkgc3RhdGUgaWYgeW91IGFyZSBtYW51YWxseSBjYWxsaW5nIGhpc3RvcnkucmVwbGFjZVN0YXRlOlxcblxcbmAgK1xyXG4gICAgICAgICAgICAgICAgYGhpc3RvcnkucmVwbGFjZVN0YXRlKGhpc3Rvcnkuc3RhdGUsICcnLCB1cmwpXFxuXFxuYCArXHJcbiAgICAgICAgICAgICAgICBgWW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gYXQgaHR0cHM6Ly9uZXh0LnJvdXRlci52dWVqcy5vcmcvZ3VpZGUvbWlncmF0aW9uLyN1c2FnZS1vZi1oaXN0b3J5LXN0YXRlLmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjaGFuZ2VMb2NhdGlvbihjdXJyZW50U3RhdGUuY3VycmVudCwgY3VycmVudFN0YXRlLCB0cnVlKTtcclxuICAgICAgICBjb25zdCBzdGF0ZSA9IGFzc2lnbih7fSwgYnVpbGRTdGF0ZShjdXJyZW50TG9jYXRpb24udmFsdWUsIHRvLCBudWxsKSwgeyBwb3NpdGlvbjogY3VycmVudFN0YXRlLnBvc2l0aW9uICsgMSB9LCBkYXRhKTtcclxuICAgICAgICBjaGFuZ2VMb2NhdGlvbih0bywgc3RhdGUsIGZhbHNlKTtcclxuICAgICAgICBjdXJyZW50TG9jYXRpb24udmFsdWUgPSB0bztcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbG9jYXRpb246IGN1cnJlbnRMb2NhdGlvbixcclxuICAgICAgICBzdGF0ZTogaGlzdG9yeVN0YXRlLFxyXG4gICAgICAgIHB1c2gsXHJcbiAgICAgICAgcmVwbGFjZSxcclxuICAgIH07XHJcbn1cclxuLyoqXHJcbiAqIENyZWF0ZXMgYW4gSFRNTDUgaGlzdG9yeS4gTW9zdCBjb21tb24gaGlzdG9yeSBmb3Igc2luZ2xlIHBhZ2UgYXBwbGljYXRpb25zLlxyXG4gKlxyXG4gKiBAcGFyYW0gYmFzZSAtXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVXZWJIaXN0b3J5KGJhc2UpIHtcclxuICAgIGJhc2UgPSBub3JtYWxpemVCYXNlKGJhc2UpO1xyXG4gICAgY29uc3QgaGlzdG9yeU5hdmlnYXRpb24gPSB1c2VIaXN0b3J5U3RhdGVOYXZpZ2F0aW9uKGJhc2UpO1xyXG4gICAgY29uc3QgaGlzdG9yeUxpc3RlbmVycyA9IHVzZUhpc3RvcnlMaXN0ZW5lcnMoYmFzZSwgaGlzdG9yeU5hdmlnYXRpb24uc3RhdGUsIGhpc3RvcnlOYXZpZ2F0aW9uLmxvY2F0aW9uLCBoaXN0b3J5TmF2aWdhdGlvbi5yZXBsYWNlKTtcclxuICAgIGZ1bmN0aW9uIGdvKGRlbHRhLCB0cmlnZ2VyTGlzdGVuZXJzID0gdHJ1ZSkge1xyXG4gICAgICAgIGlmICghdHJpZ2dlckxpc3RlbmVycylcclxuICAgICAgICAgICAgaGlzdG9yeUxpc3RlbmVycy5wYXVzZUxpc3RlbmVycygpO1xyXG4gICAgICAgIGhpc3RvcnkuZ28oZGVsdGEpO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgcm91dGVySGlzdG9yeSA9IGFzc2lnbih7XHJcbiAgICAgICAgLy8gaXQncyBvdmVycmlkZGVuIHJpZ2h0IGFmdGVyXHJcbiAgICAgICAgbG9jYXRpb246ICcnLFxyXG4gICAgICAgIGJhc2UsXHJcbiAgICAgICAgZ28sXHJcbiAgICAgICAgY3JlYXRlSHJlZjogY3JlYXRlSHJlZi5iaW5kKG51bGwsIGJhc2UpLFxyXG4gICAgfSwgaGlzdG9yeU5hdmlnYXRpb24sIGhpc3RvcnlMaXN0ZW5lcnMpO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJvdXRlckhpc3RvcnksICdsb2NhdGlvbicsIHtcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGdldDogKCkgPT4gaGlzdG9yeU5hdmlnYXRpb24ubG9jYXRpb24udmFsdWUsXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyb3V0ZXJIaXN0b3J5LCAnc3RhdGUnLCB7XHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBnZXQ6ICgpID0+IGhpc3RvcnlOYXZpZ2F0aW9uLnN0YXRlLnZhbHVlLFxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcm91dGVySGlzdG9yeTtcclxufVxuXG4vKipcclxuICogQ3JlYXRlcyBhbiBpbi1tZW1vcnkgYmFzZWQgaGlzdG9yeS4gVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGhpc3RvcnkgaXMgdG8gaGFuZGxlIFNTUi4gSXQgc3RhcnRzIGluIGEgc3BlY2lhbCBsb2NhdGlvbiB0aGF0IGlzIG5vd2hlcmUuXHJcbiAqIEl0J3MgdXAgdG8gdGhlIHVzZXIgdG8gcmVwbGFjZSB0aGF0IGxvY2F0aW9uIHdpdGggdGhlIHN0YXJ0ZXIgbG9jYXRpb24gYnkgZWl0aGVyIGNhbGxpbmcgYHJvdXRlci5wdXNoYCBvciBgcm91dGVyLnJlcGxhY2VgLlxyXG4gKlxyXG4gKiBAcGFyYW0gYmFzZSAtIEJhc2UgYXBwbGllZCB0byBhbGwgdXJscywgZGVmYXVsdHMgdG8gJy8nXHJcbiAqIEByZXR1cm5zIGEgaGlzdG9yeSBvYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSByb3V0ZXIgY29uc3RydWN0b3JcclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZU1lbW9yeUhpc3RvcnkoYmFzZSA9ICcnKSB7XHJcbiAgICBsZXQgbGlzdGVuZXJzID0gW107XHJcbiAgICBsZXQgcXVldWUgPSBbU1RBUlRdO1xyXG4gICAgbGV0IHBvc2l0aW9uID0gMDtcclxuICAgIGJhc2UgPSBub3JtYWxpemVCYXNlKGJhc2UpO1xyXG4gICAgZnVuY3Rpb24gc2V0TG9jYXRpb24obG9jYXRpb24pIHtcclxuICAgICAgICBwb3NpdGlvbisrO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gcXVldWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIC8vIHdlIGFyZSBhdCB0aGUgZW5kLCB3ZSBjYW4gc2ltcGx5IGFwcGVuZCBhIG5ldyBlbnRyeVxyXG4gICAgICAgICAgICBxdWV1ZS5wdXNoKGxvY2F0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHdlIGFyZSBpbiB0aGUgbWlkZGxlLCB3ZSByZW1vdmUgZXZlcnl0aGluZyBmcm9tIGhlcmUgaW4gdGhlIHF1ZXVlXHJcbiAgICAgICAgICAgIHF1ZXVlLnNwbGljZShwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIHF1ZXVlLnB1c2gobG9jYXRpb24pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHRyaWdnZXJMaXN0ZW5lcnModG8sIGZyb20sIHsgZGlyZWN0aW9uLCBkZWx0YSB9KSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IHtcclxuICAgICAgICAgICAgZGlyZWN0aW9uLFxyXG4gICAgICAgICAgICBkZWx0YSxcclxuICAgICAgICAgICAgdHlwZTogTmF2aWdhdGlvblR5cGUucG9wLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiBsaXN0ZW5lcnMpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2sodG8sIGZyb20sIGluZm8pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IHJvdXRlckhpc3RvcnkgPSB7XHJcbiAgICAgICAgLy8gcmV3cml0dGVuIGJ5IE9iamVjdC5kZWZpbmVQcm9wZXJ0eVxyXG4gICAgICAgIGxvY2F0aW9uOiBTVEFSVCxcclxuICAgICAgICAvLyBUT0RPOiBzaG91bGQgYmUga2VwdCBpbiBxdWV1ZVxyXG4gICAgICAgIHN0YXRlOiB7fSxcclxuICAgICAgICBiYXNlLFxyXG4gICAgICAgIGNyZWF0ZUhyZWY6IGNyZWF0ZUhyZWYuYmluZChudWxsLCBiYXNlKSxcclxuICAgICAgICByZXBsYWNlKHRvKSB7XHJcbiAgICAgICAgICAgIC8vIHJlbW92ZSBjdXJyZW50IGVudHJ5IGFuZCBkZWNyZW1lbnQgcG9zaXRpb25cclxuICAgICAgICAgICAgcXVldWUuc3BsaWNlKHBvc2l0aW9uLS0sIDEpO1xyXG4gICAgICAgICAgICBzZXRMb2NhdGlvbih0byk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBwdXNoKHRvLCBkYXRhKSB7XHJcbiAgICAgICAgICAgIHNldExvY2F0aW9uKHRvKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGxpc3RlbihjYWxsYmFjaykge1xyXG4gICAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKVxyXG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZGVzdHJveSgpIHtcclxuICAgICAgICAgICAgbGlzdGVuZXJzID0gW107XHJcbiAgICAgICAgICAgIHF1ZXVlID0gW1NUQVJUXTtcclxuICAgICAgICAgICAgcG9zaXRpb24gPSAwO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ28oZGVsdGEsIHNob3VsZFRyaWdnZXIgPSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZyb20gPSB0aGlzLmxvY2F0aW9uO1xyXG4gICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBcclxuICAgICAgICAgICAgLy8gd2UgYXJlIGNvbnNpZGVyaW5nIGRlbHRhID09PSAwIGdvaW5nIGZvcndhcmQsIGJ1dCBpbiBhYnN0cmFjdCBtb2RlXHJcbiAgICAgICAgICAgIC8vIHVzaW5nIDAgZm9yIHRoZSBkZWx0YSBkb2Vzbid0IG1ha2Ugc2Vuc2UgbGlrZSBpdCBkb2VzIGluIGh0bWw1IHdoZXJlXHJcbiAgICAgICAgICAgIC8vIGl0IHJlbG9hZHMgdGhlIHBhZ2VcclxuICAgICAgICAgICAgZGVsdGEgPCAwID8gTmF2aWdhdGlvbkRpcmVjdGlvbi5iYWNrIDogTmF2aWdhdGlvbkRpcmVjdGlvbi5mb3J3YXJkO1xyXG4gICAgICAgICAgICBwb3NpdGlvbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBvc2l0aW9uICsgZGVsdGEsIHF1ZXVlLmxlbmd0aCAtIDEpKTtcclxuICAgICAgICAgICAgaWYgKHNob3VsZFRyaWdnZXIpIHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJMaXN0ZW5lcnModGhpcy5sb2NhdGlvbiwgZnJvbSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBkZWx0YSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocm91dGVySGlzdG9yeSwgJ2xvY2F0aW9uJywge1xyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgZ2V0OiAoKSA9PiBxdWV1ZVtwb3NpdGlvbl0sXHJcbiAgICB9KTtcclxuICAgIHJldHVybiByb3V0ZXJIaXN0b3J5O1xyXG59XG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgaGFzaCBoaXN0b3J5LiBVc2VmdWwgZm9yIHdlYiBhcHBsaWNhdGlvbnMgd2l0aCBubyBob3N0IChlLmcuIGBmaWxlOi8vYCkgb3Igd2hlbiBjb25maWd1cmluZyBhIHNlcnZlciB0b1xyXG4gKiBoYW5kbGUgYW55IFVSTCBpcyBub3QgcG9zc2libGUuXHJcbiAqXHJcbiAqIEBwYXJhbSBiYXNlIC0gb3B0aW9uYWwgYmFzZSB0byBwcm92aWRlLiBEZWZhdWx0cyB0byBgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hgIElmIHRoZXJlIGlzIGEgYDxiYXNlPmAgdGFnXHJcbiAqIGluIHRoZSBgaGVhZGAsIGl0cyB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQgaW4gZmF2b3Igb2YgdGhpcyBwYXJhbWV0ZXIgKipidXQgbm90ZSBpdCBhZmZlY3RzIGFsbCB0aGUgaGlzdG9yeS5wdXNoU3RhdGUoKVxyXG4gKiBjYWxscyoqLCBtZWFuaW5nIHRoYXQgaWYgeW91IHVzZSBhIGA8YmFzZT5gIHRhZywgaXQncyBgaHJlZmAgdmFsdWUgKipoYXMgdG8gbWF0Y2ggdGhpcyBwYXJhbWV0ZXIqKiAoaWdub3JpbmcgYW55dGhpbmdcclxuICogYWZ0ZXIgdGhlIGAjYCkuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGpzXHJcbiAqIC8vIGF0IGh0dHBzOi8vZXhhbXBsZS5jb20vZm9sZGVyXHJcbiAqIGNyZWF0ZVdlYkhhc2hIaXN0b3J5KCkgLy8gZ2l2ZXMgYSB1cmwgb2YgYGh0dHBzOi8vZXhhbXBsZS5jb20vZm9sZGVyI2BcclxuICogY3JlYXRlV2ViSGFzaEhpc3RvcnkoJy9mb2xkZXIvJykgLy8gZ2l2ZXMgYSB1cmwgb2YgYGh0dHBzOi8vZXhhbXBsZS5jb20vZm9sZGVyLyNgXHJcbiAqIC8vIGlmIHRoZSBgI2AgaXMgcHJvdmlkZWQgaW4gdGhlIGJhc2UsIGl0IHdvbid0IGJlIGFkZGVkIGJ5IGBjcmVhdGVXZWJIYXNoSGlzdG9yeWBcclxuICogY3JlYXRlV2ViSGFzaEhpc3RvcnkoJy9mb2xkZXIvIy9hcHAvJykgLy8gZ2l2ZXMgYSB1cmwgb2YgYGh0dHBzOi8vZXhhbXBsZS5jb20vZm9sZGVyLyMvYXBwL2BcclxuICogLy8geW91IHNob3VsZCBhdm9pZCBkb2luZyB0aGlzIGJlY2F1c2UgaXQgY2hhbmdlcyB0aGUgb3JpZ2luYWwgdXJsIGFuZCBicmVha3MgY29weWluZyB1cmxzXHJcbiAqIGNyZWF0ZVdlYkhhc2hIaXN0b3J5KCcvb3RoZXItZm9sZGVyLycpIC8vIGdpdmVzIGEgdXJsIG9mIGBodHRwczovL2V4YW1wbGUuY29tL290aGVyLWZvbGRlci8jYFxyXG4gKlxyXG4gKiAvLyBhdCBmaWxlOi8vL3Vzci9ldGMvZm9sZGVyL2luZGV4Lmh0bWxcclxuICogLy8gZm9yIGxvY2F0aW9ucyB3aXRoIG5vIGBob3N0YCwgdGhlIGJhc2UgaXMgaWdub3JlZFxyXG4gKiBjcmVhdGVXZWJIYXNoSGlzdG9yeSgnL2lBbUlnbm9yZWQnKSAvLyBnaXZlcyBhIHVybCBvZiBgZmlsZTovLy91c3IvZXRjL2ZvbGRlci9pbmRleC5odG1sI2BcclxuICogYGBgXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVXZWJIYXNoSGlzdG9yeShiYXNlKSB7XHJcbiAgICAvLyBNYWtlIHN1cmUgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBmaW5lIGluIHRlcm1zIG9mIGVuY29kaW5nLCBzcGVjaWFsbHkgZm9yIElFMTFcclxuICAgIC8vIGZvciBgZmlsZTovL2AsIGRpcmVjdGx5IHVzZSB0aGUgcGF0aG5hbWUgYW5kIGlnbm9yZSB0aGUgYmFzZVxyXG4gICAgLy8gbG9jYXRpb24ucGF0aG5hbWUgY29udGFpbnMgYW4gaW5pdGlhbCBgL2AgZXZlbiBhdCB0aGUgcm9vdDogYGh0dHBzOi8vZXhhbXBsZS5jb21gXHJcbiAgICBiYXNlID0gbG9jYXRpb24uaG9zdCA/IGJhc2UgfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2ggOiAnJztcclxuICAgIC8vIGFsbG93IHRoZSB1c2VyIHRvIHByb3ZpZGUgYSBgI2AgaW4gdGhlIG1pZGRsZTogYC9iYXNlLyMvYXBwYFxyXG4gICAgaWYgKCFiYXNlLmluY2x1ZGVzKCcjJykpXHJcbiAgICAgICAgYmFzZSArPSAnIyc7XHJcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmICFiYXNlLmVuZHNXaXRoKCcjLycpICYmICFiYXNlLmVuZHNXaXRoKCcjJykpIHtcclxuICAgICAgICB3YXJuKGBBIGhhc2ggYmFzZSBtdXN0IGVuZCB3aXRoIGEgXCIjXCI6XFxuXCIke2Jhc2V9XCIgc2hvdWxkIGJlIFwiJHtiYXNlLnJlcGxhY2UoLyMuKiQvLCAnIycpfVwiLmApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNyZWF0ZVdlYkhpc3RvcnkoYmFzZSk7XHJcbn1cblxuZnVuY3Rpb24gaXNSb3V0ZUxvY2F0aW9uKHJvdXRlKSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHJvdXRlID09PSAnc3RyaW5nJyB8fCAocm91dGUgJiYgdHlwZW9mIHJvdXRlID09PSAnb2JqZWN0Jyk7XHJcbn1cclxuZnVuY3Rpb24gaXNSb3V0ZU5hbWUobmFtZSkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmFtZSA9PT0gJ3N5bWJvbCc7XHJcbn1cblxuLyoqXHJcbiAqIEluaXRpYWwgcm91dGUgbG9jYXRpb24gd2hlcmUgdGhlIHJvdXRlciBpcy4gQ2FuIGJlIHVzZWQgaW4gbmF2aWdhdGlvbiBndWFyZHNcclxuICogdG8gZGlmZmVyZW50aWF0ZSB0aGUgaW5pdGlhbCBuYXZpZ2F0aW9uLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqc1xyXG4gKiBpbXBvcnQgeyBTVEFSVF9MT0NBVElPTiB9IGZyb20gJ3Z1ZS1yb3V0ZXInXHJcbiAqXHJcbiAqIHJvdXRlci5iZWZvcmVFYWNoKCh0bywgZnJvbSkgPT4ge1xyXG4gKiAgIGlmIChmcm9tID09PSBTVEFSVF9MT0NBVElPTikge1xyXG4gKiAgICAgLy8gaW5pdGlhbCBuYXZpZ2F0aW9uXHJcbiAqICAgfVxyXG4gKiB9KVxyXG4gKiBgYGBcclxuICovXHJcbmNvbnN0IFNUQVJUX0xPQ0FUSU9OX05PUk1BTElaRUQgPSB7XHJcbiAgICBwYXRoOiAnLycsXHJcbiAgICBuYW1lOiB1bmRlZmluZWQsXHJcbiAgICBwYXJhbXM6IHt9LFxyXG4gICAgcXVlcnk6IHt9LFxyXG4gICAgaGFzaDogJycsXHJcbiAgICBmdWxsUGF0aDogJy8nLFxyXG4gICAgbWF0Y2hlZDogW10sXHJcbiAgICBtZXRhOiB7fSxcclxuICAgIHJlZGlyZWN0ZWRGcm9tOiB1bmRlZmluZWQsXHJcbn07XG5cbmNvbnN0IE5hdmlnYXRpb25GYWlsdXJlU3ltYm9sID0gU3ltYm9sKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/ICduYXZpZ2F0aW9uIGZhaWx1cmUnIDogJycpO1xyXG4vKipcclxuICogRW51bWVyYXRpb24gd2l0aCBhbGwgcG9zc2libGUgdHlwZXMgZm9yIG5hdmlnYXRpb24gZmFpbHVyZXMuIENhbiBiZSBwYXNzZWQgdG9cclxuICoge0BsaW5rIGlzTmF2aWdhdGlvbkZhaWx1cmV9IHRvIGNoZWNrIGZvciBzcGVjaWZpYyBmYWlsdXJlcy5cclxuICovXHJcbnZhciBOYXZpZ2F0aW9uRmFpbHVyZVR5cGU7XHJcbihmdW5jdGlvbiAoTmF2aWdhdGlvbkZhaWx1cmVUeXBlKSB7XHJcbiAgICAvKipcclxuICAgICAqIEFuIGFib3J0ZWQgbmF2aWdhdGlvbiBpcyBhIG5hdmlnYXRpb24gdGhhdCBmYWlsZWQgYmVjYXVzZSBhIG5hdmlnYXRpb25cclxuICAgICAqIGd1YXJkIHJldHVybmVkIGBmYWxzZWAgb3IgY2FsbGVkIGBuZXh0KGZhbHNlKWBcclxuICAgICAqL1xyXG4gICAgTmF2aWdhdGlvbkZhaWx1cmVUeXBlW05hdmlnYXRpb25GYWlsdXJlVHlwZVtcImFib3J0ZWRcIl0gPSA0XSA9IFwiYWJvcnRlZFwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNhbmNlbGxlZCBuYXZpZ2F0aW9uIGlzIGEgbmF2aWdhdGlvbiB0aGF0IGZhaWxlZCBiZWNhdXNlIGEgbW9yZSByZWNlbnRcclxuICAgICAqIG5hdmlnYXRpb24gZmluaXNoZWQgc3RhcnRlZCAobm90IG5lY2Vzc2FyaWx5IGZpbmlzaGVkKS5cclxuICAgICAqL1xyXG4gICAgTmF2aWdhdGlvbkZhaWx1cmVUeXBlW05hdmlnYXRpb25GYWlsdXJlVHlwZVtcImNhbmNlbGxlZFwiXSA9IDhdID0gXCJjYW5jZWxsZWRcIjtcclxuICAgIC8qKlxyXG4gICAgICogQSBkdXBsaWNhdGVkIG5hdmlnYXRpb24gaXMgYSBuYXZpZ2F0aW9uIHRoYXQgZmFpbGVkIGJlY2F1c2UgaXQgd2FzXHJcbiAgICAgKiBpbml0aWF0ZWQgd2hpbGUgYWxyZWFkeSBiZWluZyBhdCB0aGUgZXhhY3Qgc2FtZSBsb2NhdGlvbi5cclxuICAgICAqL1xyXG4gICAgTmF2aWdhdGlvbkZhaWx1cmVUeXBlW05hdmlnYXRpb25GYWlsdXJlVHlwZVtcImR1cGxpY2F0ZWRcIl0gPSAxNl0gPSBcImR1cGxpY2F0ZWRcIjtcclxufSkoTmF2aWdhdGlvbkZhaWx1cmVUeXBlIHx8IChOYXZpZ2F0aW9uRmFpbHVyZVR5cGUgPSB7fSkpO1xyXG4vLyBERVYgb25seSBkZWJ1ZyBtZXNzYWdlc1xyXG5jb25zdCBFcnJvclR5cGVNZXNzYWdlcyA9IHtcclxuICAgIFsxIC8qIEVycm9yVHlwZXMuTUFUQ0hFUl9OT1RfRk9VTkQgKi9dKHsgbG9jYXRpb24sIGN1cnJlbnRMb2NhdGlvbiB9KSB7XHJcbiAgICAgICAgcmV0dXJuIGBObyBtYXRjaCBmb3JcXG4gJHtKU09OLnN0cmluZ2lmeShsb2NhdGlvbil9JHtjdXJyZW50TG9jYXRpb25cclxuICAgICAgICAgICAgPyAnXFxud2hpbGUgYmVpbmcgYXRcXG4nICsgSlNPTi5zdHJpbmdpZnkoY3VycmVudExvY2F0aW9uKVxyXG4gICAgICAgICAgICA6ICcnfWA7XHJcbiAgICB9LFxyXG4gICAgWzIgLyogRXJyb3JUeXBlcy5OQVZJR0FUSU9OX0dVQVJEX1JFRElSRUNUICovXSh7IGZyb20sIHRvLCB9KSB7XHJcbiAgICAgICAgcmV0dXJuIGBSZWRpcmVjdGVkIGZyb20gXCIke2Zyb20uZnVsbFBhdGh9XCIgdG8gXCIke3N0cmluZ2lmeVJvdXRlKHRvKX1cIiB2aWEgYSBuYXZpZ2F0aW9uIGd1YXJkLmA7XHJcbiAgICB9LFxyXG4gICAgWzQgLyogRXJyb3JUeXBlcy5OQVZJR0FUSU9OX0FCT1JURUQgKi9dKHsgZnJvbSwgdG8gfSkge1xyXG4gICAgICAgIHJldHVybiBgTmF2aWdhdGlvbiBhYm9ydGVkIGZyb20gXCIke2Zyb20uZnVsbFBhdGh9XCIgdG8gXCIke3RvLmZ1bGxQYXRofVwiIHZpYSBhIG5hdmlnYXRpb24gZ3VhcmQuYDtcclxuICAgIH0sXHJcbiAgICBbOCAvKiBFcnJvclR5cGVzLk5BVklHQVRJT05fQ0FOQ0VMTEVEICovXSh7IGZyb20sIHRvIH0pIHtcclxuICAgICAgICByZXR1cm4gYE5hdmlnYXRpb24gY2FuY2VsbGVkIGZyb20gXCIke2Zyb20uZnVsbFBhdGh9XCIgdG8gXCIke3RvLmZ1bGxQYXRofVwiIHdpdGggYSBuZXcgbmF2aWdhdGlvbi5gO1xyXG4gICAgfSxcclxuICAgIFsxNiAvKiBFcnJvclR5cGVzLk5BVklHQVRJT05fRFVQTElDQVRFRCAqL10oeyBmcm9tLCB0byB9KSB7XHJcbiAgICAgICAgcmV0dXJuIGBBdm9pZGVkIHJlZHVuZGFudCBuYXZpZ2F0aW9uIHRvIGN1cnJlbnQgbG9jYXRpb246IFwiJHtmcm9tLmZ1bGxQYXRofVwiLmA7XHJcbiAgICB9LFxyXG59O1xyXG5mdW5jdGlvbiBjcmVhdGVSb3V0ZXJFcnJvcih0eXBlLCBwYXJhbXMpIHtcclxuICAgIC8vIGtlZXAgZnVsbCBlcnJvciBtZXNzYWdlcyBpbiBjanMgdmVyc2lvbnNcclxuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgIXRydWUpIHtcclxuICAgICAgICByZXR1cm4gYXNzaWduKG5ldyBFcnJvcihFcnJvclR5cGVNZXNzYWdlc1t0eXBlXShwYXJhbXMpKSwge1xyXG4gICAgICAgICAgICB0eXBlLFxyXG4gICAgICAgICAgICBbTmF2aWdhdGlvbkZhaWx1cmVTeW1ib2xdOiB0cnVlLFxyXG4gICAgICAgIH0sIHBhcmFtcyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gYXNzaWduKG5ldyBFcnJvcigpLCB7XHJcbiAgICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICAgIFtOYXZpZ2F0aW9uRmFpbHVyZVN5bWJvbF06IHRydWUsXHJcbiAgICAgICAgfSwgcGFyYW1zKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBpc05hdmlnYXRpb25GYWlsdXJlKGVycm9yLCB0eXBlKSB7XHJcbiAgICByZXR1cm4gKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiZcclxuICAgICAgICBOYXZpZ2F0aW9uRmFpbHVyZVN5bWJvbCBpbiBlcnJvciAmJlxyXG4gICAgICAgICh0eXBlID09IG51bGwgfHwgISEoZXJyb3IudHlwZSAmIHR5cGUpKSk7XHJcbn1cclxuY29uc3QgcHJvcGVydGllc1RvTG9nID0gWydwYXJhbXMnLCAncXVlcnknLCAnaGFzaCddO1xyXG5mdW5jdGlvbiBzdHJpbmdpZnlSb3V0ZSh0bykge1xyXG4gICAgaWYgKHR5cGVvZiB0byA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAgcmV0dXJuIHRvO1xyXG4gICAgaWYgKCdwYXRoJyBpbiB0bylcclxuICAgICAgICByZXR1cm4gdG8ucGF0aDtcclxuICAgIGNvbnN0IGxvY2F0aW9uID0ge307XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBwcm9wZXJ0aWVzVG9Mb2cpIHtcclxuICAgICAgICBpZiAoa2V5IGluIHRvKVxyXG4gICAgICAgICAgICBsb2NhdGlvbltrZXldID0gdG9ba2V5XTtcclxuICAgIH1cclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShsb2NhdGlvbiwgbnVsbCwgMik7XHJcbn1cblxuLy8gZGVmYXVsdCBwYXR0ZXJuIGZvciBhIHBhcmFtOiBub24tZ3JlZWR5IGV2ZXJ5dGhpbmcgYnV0IC9cclxuY29uc3QgQkFTRV9QQVJBTV9QQVRURVJOID0gJ1teL10rPyc7XHJcbmNvbnN0IEJBU0VfUEFUSF9QQVJTRVJfT1BUSU9OUyA9IHtcclxuICAgIHNlbnNpdGl2ZTogZmFsc2UsXHJcbiAgICBzdHJpY3Q6IGZhbHNlLFxyXG4gICAgc3RhcnQ6IHRydWUsXHJcbiAgICBlbmQ6IHRydWUsXHJcbn07XHJcbi8vIFNwZWNpYWwgUmVnZXggY2hhcmFjdGVycyB0aGF0IG11c3QgYmUgZXNjYXBlZCBpbiBzdGF0aWMgdG9rZW5zXHJcbmNvbnN0IFJFR0VYX0NIQVJTX1JFID0gL1suKyo/XiR7fSgpW1xcXS9cXFxcXS9nO1xyXG4vKipcclxuICogQ3JlYXRlcyBhIHBhdGggcGFyc2VyIGZyb20gYW4gYXJyYXkgb2YgU2VnbWVudHMgKGEgc2VnbWVudCBpcyBhbiBhcnJheSBvZiBUb2tlbnMpXHJcbiAqXHJcbiAqIEBwYXJhbSBzZWdtZW50cyAtIGFycmF5IG9mIHNlZ21lbnRzIHJldHVybmVkIGJ5IHRva2VuaXplUGF0aFxyXG4gKiBAcGFyYW0gZXh0cmFPcHRpb25zIC0gb3B0aW9uYWwgb3B0aW9ucyBmb3IgdGhlIHJlZ2V4cFxyXG4gKiBAcmV0dXJucyBhIFBhdGhQYXJzZXJcclxuICovXHJcbmZ1bmN0aW9uIHRva2Vuc1RvUGFyc2VyKHNlZ21lbnRzLCBleHRyYU9wdGlvbnMpIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBhc3NpZ24oe30sIEJBU0VfUEFUSF9QQVJTRVJfT1BUSU9OUywgZXh0cmFPcHRpb25zKTtcclxuICAgIC8vIHRoZSBhbW91bnQgb2Ygc2NvcmVzIGlzIHRoZSBzYW1lIGFzIHRoZSBsZW5ndGggb2Ygc2VnbWVudHMgZXhjZXB0IGZvciB0aGUgcm9vdCBzZWdtZW50IFwiL1wiXHJcbiAgICBjb25zdCBzY29yZSA9IFtdO1xyXG4gICAgLy8gdGhlIHJlZ2V4cCBhcyBhIHN0cmluZ1xyXG4gICAgbGV0IHBhdHRlcm4gPSBvcHRpb25zLnN0YXJ0ID8gJ14nIDogJyc7XHJcbiAgICAvLyBleHRyYWN0ZWQga2V5c1xyXG4gICAgY29uc3Qga2V5cyA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNlZ21lbnRzKSB7XHJcbiAgICAgICAgLy8gdGhlIHJvb3Qgc2VnbWVudCBuZWVkcyBzcGVjaWFsIHRyZWF0bWVudFxyXG4gICAgICAgIGNvbnN0IHNlZ21lbnRTY29yZXMgPSBzZWdtZW50Lmxlbmd0aCA/IFtdIDogWzkwIC8qIFBhdGhTY29yZS5Sb290ICovXTtcclxuICAgICAgICAvLyBhbGxvdyB0cmFpbGluZyBzbGFzaFxyXG4gICAgICAgIGlmIChvcHRpb25zLnN0cmljdCAmJiAhc2VnbWVudC5sZW5ndGgpXHJcbiAgICAgICAgICAgIHBhdHRlcm4gKz0gJy8nO1xyXG4gICAgICAgIGZvciAobGV0IHRva2VuSW5kZXggPSAwOyB0b2tlbkluZGV4IDwgc2VnbWVudC5sZW5ndGg7IHRva2VuSW5kZXgrKykge1xyXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHNlZ21lbnRbdG9rZW5JbmRleF07XHJcbiAgICAgICAgICAgIC8vIHJlc2V0cyB0aGUgc2NvcmUgaWYgd2UgYXJlIGluc2lkZSBhIHN1Yi1zZWdtZW50IC86YS1vdGhlci06YlxyXG4gICAgICAgICAgICBsZXQgc3ViU2VnbWVudFNjb3JlID0gNDAgLyogUGF0aFNjb3JlLlNlZ21lbnQgKi8gK1xyXG4gICAgICAgICAgICAgICAgKG9wdGlvbnMuc2Vuc2l0aXZlID8gMC4yNSAvKiBQYXRoU2NvcmUuQm9udXNDYXNlU2Vuc2l0aXZlICovIDogMCk7XHJcbiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAwIC8qIFRva2VuVHlwZS5TdGF0aWMgKi8pIHtcclxuICAgICAgICAgICAgICAgIC8vIHByZXBlbmQgdGhlIHNsYXNoIGlmIHdlIGFyZSBzdGFydGluZyBhIG5ldyBzZWdtZW50XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRva2VuSW5kZXgpXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybiArPSAnLyc7XHJcbiAgICAgICAgICAgICAgICBwYXR0ZXJuICs9IHRva2VuLnZhbHVlLnJlcGxhY2UoUkVHRVhfQ0hBUlNfUkUsICdcXFxcJCYnKTtcclxuICAgICAgICAgICAgICAgIHN1YlNlZ21lbnRTY29yZSArPSA0MCAvKiBQYXRoU2NvcmUuU3RhdGljICovO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IDEgLyogVG9rZW5UeXBlLlBhcmFtICovKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHZhbHVlLCByZXBlYXRhYmxlLCBvcHRpb25hbCwgcmVnZXhwIH0gPSB0b2tlbjtcclxuICAgICAgICAgICAgICAgIGtleXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVwZWF0YWJsZSxcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmUgPSByZWdleHAgPyByZWdleHAgOiBCQVNFX1BBUkFNX1BBVFRFUk47XHJcbiAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciBwcm92aWRlZCBhIGN1c3RvbSByZWdleHAgLzppZChcXFxcZCspXHJcbiAgICAgICAgICAgICAgICBpZiAocmUgIT09IEJBU0VfUEFSQU1fUEFUVEVSTikge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1YlNlZ21lbnRTY29yZSArPSAxMCAvKiBQYXRoU2NvcmUuQm9udXNDdXN0b21SZWdFeHAgKi87XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSByZWdleHAgaXMgdmFsaWQgYmVmb3JlIHVzaW5nIGl0XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChgKCR7cmV9KWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjdXN0b20gUmVnRXhwIGZvciBwYXJhbSBcIiR7dmFsdWV9XCIgKCR7cmV9KTogYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gd2hlbiB3ZSByZXBlYXQgd2UgbXVzdCB0YWtlIGNhcmUgb2YgdGhlIHJlcGVhdGluZyBsZWFkaW5nIHNsYXNoXHJcbiAgICAgICAgICAgICAgICBsZXQgc3ViUGF0dGVybiA9IHJlcGVhdGFibGUgPyBgKCg/OiR7cmV9KSg/Oi8oPzoke3JlfSkpKilgIDogYCgke3JlfSlgO1xyXG4gICAgICAgICAgICAgICAgLy8gcHJlcGVuZCB0aGUgc2xhc2ggaWYgd2UgYXJlIHN0YXJ0aW5nIGEgbmV3IHNlZ21lbnRcclxuICAgICAgICAgICAgICAgIGlmICghdG9rZW5JbmRleClcclxuICAgICAgICAgICAgICAgICAgICBzdWJQYXR0ZXJuID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZvaWQgYW4gb3B0aW9uYWwgLyBpZiB0aGVyZSBhcmUgbW9yZSBzZWdtZW50cyBlLmcuIC86cD8tc3RhdGljXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIC86cD8tOnAyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsICYmIHNlZ21lbnQubGVuZ3RoIDwgMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgKD86LyR7c3ViUGF0dGVybn0pYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnLycgKyBzdWJQYXR0ZXJuO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbmFsKVxyXG4gICAgICAgICAgICAgICAgICAgIHN1YlBhdHRlcm4gKz0gJz8nO1xyXG4gICAgICAgICAgICAgICAgcGF0dGVybiArPSBzdWJQYXR0ZXJuO1xyXG4gICAgICAgICAgICAgICAgc3ViU2VnbWVudFNjb3JlICs9IDIwIC8qIFBhdGhTY29yZS5EeW5hbWljICovO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbmFsKVxyXG4gICAgICAgICAgICAgICAgICAgIHN1YlNlZ21lbnRTY29yZSArPSAtOCAvKiBQYXRoU2NvcmUuQm9udXNPcHRpb25hbCAqLztcclxuICAgICAgICAgICAgICAgIGlmIChyZXBlYXRhYmxlKVxyXG4gICAgICAgICAgICAgICAgICAgIHN1YlNlZ21lbnRTY29yZSArPSAtMjAgLyogUGF0aFNjb3JlLkJvbnVzUmVwZWF0YWJsZSAqLztcclxuICAgICAgICAgICAgICAgIGlmIChyZSA9PT0gJy4qJylcclxuICAgICAgICAgICAgICAgICAgICBzdWJTZWdtZW50U2NvcmUgKz0gLTUwIC8qIFBhdGhTY29yZS5Cb251c1dpbGRjYXJkICovO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNlZ21lbnRTY29yZXMucHVzaChzdWJTZWdtZW50U2NvcmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBhbiBlbXB0eSBhcnJheSBsaWtlIC9ob21lLyAtPiBbW3tob21lfV0sIFtdXVxyXG4gICAgICAgIC8vIGlmICghc2VnbWVudC5sZW5ndGgpIHBhdHRlcm4gKz0gJy8nXHJcbiAgICAgICAgc2NvcmUucHVzaChzZWdtZW50U2NvcmVzKTtcclxuICAgIH1cclxuICAgIC8vIG9ubHkgYXBwbHkgdGhlIHN0cmljdCBib251cyB0byB0aGUgbGFzdCBzY29yZVxyXG4gICAgaWYgKG9wdGlvbnMuc3RyaWN0ICYmIG9wdGlvbnMuZW5kKSB7XHJcbiAgICAgICAgY29uc3QgaSA9IHNjb3JlLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgc2NvcmVbaV1bc2NvcmVbaV0ubGVuZ3RoIC0gMV0gKz0gMC43MDAwMDAwMDAwMDAwMDAxIC8qIFBhdGhTY29yZS5Cb251c1N0cmljdCAqLztcclxuICAgIH1cclxuICAgIC8vIFRPRE86IGRldiBvbmx5IHdhcm4gZG91YmxlIHRyYWlsaW5nIHNsYXNoXHJcbiAgICBpZiAoIW9wdGlvbnMuc3RyaWN0KVxyXG4gICAgICAgIHBhdHRlcm4gKz0gJy8/JztcclxuICAgIGlmIChvcHRpb25zLmVuZClcclxuICAgICAgICBwYXR0ZXJuICs9ICckJztcclxuICAgIC8vIGFsbG93IHBhdGhzIGxpa2UgL2R5bmFtaWMgdG8gb25seSBtYXRjaCBkeW5hbWljIG9yIGR5bmFtaWMvLi4uIGJ1dCBub3QgZHluYW1pY19zb21ldGhpbmdfZWxzZVxyXG4gICAgZWxzZSBpZiAob3B0aW9ucy5zdHJpY3QpXHJcbiAgICAgICAgcGF0dGVybiArPSAnKD86L3wkKSc7XHJcbiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAocGF0dGVybiwgb3B0aW9ucy5zZW5zaXRpdmUgPyAnJyA6ICdpJyk7XHJcbiAgICBmdW5jdGlvbiBwYXJzZShwYXRoKSB7XHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBwYXRoLm1hdGNoKHJlKTtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7fTtcclxuICAgICAgICBpZiAoIW1hdGNoKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG1hdGNoLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbWF0Y2hbaV0gfHwgJyc7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaSAtIDFdO1xyXG4gICAgICAgICAgICBwYXJhbXNba2V5Lm5hbWVdID0gdmFsdWUgJiYga2V5LnJlcGVhdGFibGUgPyB2YWx1ZS5zcGxpdCgnLycpIDogdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYXJhbXM7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzdHJpbmdpZnkocGFyYW1zKSB7XHJcbiAgICAgICAgbGV0IHBhdGggPSAnJztcclxuICAgICAgICAvLyBmb3Igb3B0aW9uYWwgcGFyYW1ldGVycyB0byBhbGxvdyB0byBiZSBlbXB0eVxyXG4gICAgICAgIGxldCBhdm9pZER1cGxpY2F0ZWRTbGFzaCA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xyXG4gICAgICAgICAgICBpZiAoIWF2b2lkRHVwbGljYXRlZFNsYXNoIHx8ICFwYXRoLmVuZHNXaXRoKCcvJykpXHJcbiAgICAgICAgICAgICAgICBwYXRoICs9ICcvJztcclxuICAgICAgICAgICAgYXZvaWREdXBsaWNhdGVkU2xhc2ggPSBmYWxzZTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBzZWdtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gMCAvKiBUb2tlblR5cGUuU3RhdGljICovKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aCArPSB0b2tlbi52YWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IDEgLyogVG9rZW5UeXBlLlBhcmFtICovKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB2YWx1ZSwgcmVwZWF0YWJsZSwgb3B0aW9uYWwgfSA9IHRva2VuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtID0gdmFsdWUgaW4gcGFyYW1zID8gcGFyYW1zW3ZhbHVlXSA6ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHBhcmFtKSAmJiAhcmVwZWF0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3ZpZGVkIHBhcmFtIFwiJHt2YWx1ZX1cIiBpcyBhbiBhcnJheSBidXQgaXQgaXMgbm90IHJlcGVhdGFibGUgKCogb3IgKyBtb2RpZmllcnMpYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBpc0FycmF5KHBhcmFtKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHBhcmFtLmpvaW4oJy8nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHBhcmFtO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGV4dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSBvcHRpb25hbCBwYXJhbSBsaWtlIC86YT8tc3RhdGljIHdlIGRvbid0IG5lZWQgdG8gY2FyZSBhYm91dCB0aGUgb3B0aW9uYWwgcGFyYW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA8IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGxhc3Qgc2xhc2ggYXMgd2UgY291bGQgYmUgYXQgdGhlIGVuZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCcvJykpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgYXBwZW5kIGEgc2xhc2ggb24gdGhlIG5leHQgaXRlcmF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdm9pZER1cGxpY2F0ZWRTbGFzaCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtIFwiJHt2YWx1ZX1cImApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBwYXRoICs9IHRleHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gYXZvaWQgZW1wdHkgcGF0aCB3aGVuIHdlIGhhdmUgbXVsdGlwbGUgb3B0aW9uYWwgcGFyYW1zXHJcbiAgICAgICAgcmV0dXJuIHBhdGggfHwgJy8nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICByZSxcclxuICAgICAgICBzY29yZSxcclxuICAgICAgICBrZXlzLFxyXG4gICAgICAgIHBhcnNlLFxyXG4gICAgICAgIHN0cmluZ2lmeSxcclxuICAgIH07XHJcbn1cclxuLyoqXHJcbiAqIENvbXBhcmVzIGFuIGFycmF5IG9mIG51bWJlcnMgYXMgdXNlZCBpbiBQYXRoUGFyc2VyLnNjb3JlIGFuZCByZXR1cm5zIGFcclxuICogbnVtYmVyLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGBzb3J0YCBhbiBhcnJheVxyXG4gKlxyXG4gKiBAcGFyYW0gYSAtIGZpcnN0IGFycmF5IG9mIG51bWJlcnNcclxuICogQHBhcmFtIGIgLSBzZWNvbmQgYXJyYXkgb2YgbnVtYmVyc1xyXG4gKiBAcmV0dXJucyAwIGlmIGJvdGggYXJlIGVxdWFsLCA8IDAgaWYgYSBzaG91bGQgYmUgc29ydGVkIGZpcnN0LCA+IDAgaWYgYlxyXG4gKiBzaG91bGQgYmUgc29ydGVkIGZpcnN0XHJcbiAqL1xyXG5mdW5jdGlvbiBjb21wYXJlU2NvcmVBcnJheShhLCBiKSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICB3aGlsZSAoaSA8IGEubGVuZ3RoICYmIGkgPCBiLmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGRpZmYgPSBiW2ldIC0gYVtpXTtcclxuICAgICAgICAvLyBvbmx5IGtlZXAgZ29pbmcgaWYgZGlmZiA9PT0gMFxyXG4gICAgICAgIGlmIChkaWZmKVxyXG4gICAgICAgICAgICByZXR1cm4gZGlmZjtcclxuICAgICAgICBpKys7XHJcbiAgICB9XHJcbiAgICAvLyBpZiB0aGUgbGFzdCBzdWJzZWdtZW50IHdhcyBTdGF0aWMsIHRoZSBzaG9ydGVyIHNlZ21lbnRzIHNob3VsZCBiZSBzb3J0ZWQgZmlyc3RcclxuICAgIC8vIG90aGVyd2lzZSBzb3J0IHRoZSBsb25nZXN0IHNlZ21lbnQgZmlyc3RcclxuICAgIGlmIChhLmxlbmd0aCA8IGIubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIGEubGVuZ3RoID09PSAxICYmIGFbMF0gPT09IDQwIC8qIFBhdGhTY29yZS5TdGF0aWMgKi8gKyA0MCAvKiBQYXRoU2NvcmUuU2VnbWVudCAqL1xyXG4gICAgICAgICAgICA/IC0xXHJcbiAgICAgICAgICAgIDogMTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGEubGVuZ3RoID4gYi5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gYi5sZW5ndGggPT09IDEgJiYgYlswXSA9PT0gNDAgLyogUGF0aFNjb3JlLlN0YXRpYyAqLyArIDQwIC8qIFBhdGhTY29yZS5TZWdtZW50ICovXHJcbiAgICAgICAgICAgID8gMVxyXG4gICAgICAgICAgICA6IC0xO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIDA7XHJcbn1cclxuLyoqXHJcbiAqIENvbXBhcmUgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGBzb3J0YCB0byBzb3J0IGFuIGFycmF5IG9mIFBhdGhQYXJzZXJcclxuICpcclxuICogQHBhcmFtIGEgLSBmaXJzdCBQYXRoUGFyc2VyXHJcbiAqIEBwYXJhbSBiIC0gc2Vjb25kIFBhdGhQYXJzZXJcclxuICogQHJldHVybnMgMCBpZiBib3RoIGFyZSBlcXVhbCwgPCAwIGlmIGEgc2hvdWxkIGJlIHNvcnRlZCBmaXJzdCwgPiAwIGlmIGJcclxuICovXHJcbmZ1bmN0aW9uIGNvbXBhcmVQYXRoUGFyc2VyU2NvcmUoYSwgYikge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgY29uc3QgYVNjb3JlID0gYS5zY29yZTtcclxuICAgIGNvbnN0IGJTY29yZSA9IGIuc2NvcmU7XHJcbiAgICB3aGlsZSAoaSA8IGFTY29yZS5sZW5ndGggJiYgaSA8IGJTY29yZS5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBjb21wID0gY29tcGFyZVNjb3JlQXJyYXkoYVNjb3JlW2ldLCBiU2NvcmVbaV0pO1xyXG4gICAgICAgIC8vIGRvIG5vdCByZXR1cm4gaWYgYm90aCBhcmUgZXF1YWxcclxuICAgICAgICBpZiAoY29tcClcclxuICAgICAgICAgICAgcmV0dXJuIGNvbXA7XHJcbiAgICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgaWYgKE1hdGguYWJzKGJTY29yZS5sZW5ndGggLSBhU2NvcmUubGVuZ3RoKSA9PT0gMSkge1xyXG4gICAgICAgIGlmIChpc0xhc3RTY29yZU5lZ2F0aXZlKGFTY29yZSkpXHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgIGlmIChpc0xhc3RTY29yZU5lZ2F0aXZlKGJTY29yZSkpXHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuICAgIC8vIGlmIGEgYW5kIGIgc2hhcmUgdGhlIHNhbWUgc2NvcmUgZW50cmllcyBidXQgYiBoYXMgbW9yZSwgc29ydCBiIGZpcnN0XHJcbiAgICByZXR1cm4gYlNjb3JlLmxlbmd0aCAtIGFTY29yZS5sZW5ndGg7XHJcbiAgICAvLyB0aGlzIGlzIHRoZSB0ZXJuYXJ5IHZlcnNpb25cclxuICAgIC8vIHJldHVybiBhU2NvcmUubGVuZ3RoIDwgYlNjb3JlLmxlbmd0aFxyXG4gICAgLy8gICA/IDFcclxuICAgIC8vICAgOiBhU2NvcmUubGVuZ3RoID4gYlNjb3JlLmxlbmd0aFxyXG4gICAgLy8gICA/IC0xXHJcbiAgICAvLyAgIDogMFxyXG59XHJcbi8qKlxyXG4gKiBUaGlzIGFsbG93cyBkZXRlY3Rpbmcgc3BsYXRzIGF0IHRoZSBlbmQgb2YgYSBwYXRoOiAvaG9tZS86aWQoLiopKlxyXG4gKlxyXG4gKiBAcGFyYW0gc2NvcmUgLSBzY29yZSB0byBjaGVja1xyXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBsYXN0IGVudHJ5IGlzIG5lZ2F0aXZlXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0xhc3RTY29yZU5lZ2F0aXZlKHNjb3JlKSB7XHJcbiAgICBjb25zdCBsYXN0ID0gc2NvcmVbc2NvcmUubGVuZ3RoIC0gMV07XHJcbiAgICByZXR1cm4gc2NvcmUubGVuZ3RoID4gMCAmJiBsYXN0W2xhc3QubGVuZ3RoIC0gMV0gPCAwO1xyXG59XG5cbmNvbnN0IFJPT1RfVE9LRU4gPSB7XHJcbiAgICB0eXBlOiAwIC8qIFRva2VuVHlwZS5TdGF0aWMgKi8sXHJcbiAgICB2YWx1ZTogJycsXHJcbn07XHJcbmNvbnN0IFZBTElEX1BBUkFNX1JFID0gL1thLXpBLVowLTlfXS87XHJcbi8vIEFmdGVyIHNvbWUgcHJvZmlsaW5nLCB0aGUgY2FjaGUgc2VlbXMgdG8gYmUgdW5uZWNlc3NhcnkgYmVjYXVzZSB0b2tlbml6ZVBhdGhcclxuLy8gKHRoZSBzbG93ZXN0IHBhcnQgb2YgYWRkaW5nIGEgcm91dGUpIGlzIHZlcnkgZmFzdFxyXG4vLyBjb25zdCB0b2tlbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFRva2VuW11bXT4oKVxyXG5mdW5jdGlvbiB0b2tlbml6ZVBhdGgocGF0aCkge1xyXG4gICAgaWYgKCFwYXRoKVxyXG4gICAgICAgIHJldHVybiBbW11dO1xyXG4gICAgaWYgKHBhdGggPT09ICcvJylcclxuICAgICAgICByZXR1cm4gW1tST09UX1RPS0VOXV07XHJcbiAgICBpZiAoIXBhdGguc3RhcnRzV2l0aCgnLycpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKVxyXG4gICAgICAgICAgICA/IGBSb3V0ZSBwYXRocyBzaG91bGQgc3RhcnQgd2l0aCBhIFwiL1wiOiBcIiR7cGF0aH1cIiBzaG91bGQgYmUgXCIvJHtwYXRofVwiLmBcclxuICAgICAgICAgICAgOiBgSW52YWxpZCBwYXRoIFwiJHtwYXRofVwiYCk7XHJcbiAgICB9XHJcbiAgICAvLyBpZiAodG9rZW5DYWNoZS5oYXMocGF0aCkpIHJldHVybiB0b2tlbkNhY2hlLmdldChwYXRoKSFcclxuICAgIGZ1bmN0aW9uIGNyYXNoKG1lc3NhZ2UpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVSUiAoJHtzdGF0ZX0pL1wiJHtidWZmZXJ9XCI6ICR7bWVzc2FnZX1gKTtcclxuICAgIH1cclxuICAgIGxldCBzdGF0ZSA9IDAgLyogVG9rZW5pemVyU3RhdGUuU3RhdGljICovO1xyXG4gICAgbGV0IHByZXZpb3VzU3RhdGUgPSBzdGF0ZTtcclxuICAgIGNvbnN0IHRva2VucyA9IFtdO1xyXG4gICAgLy8gdGhlIHNlZ21lbnQgd2lsbCBhbHdheXMgYmUgdmFsaWQgYmVjYXVzZSB3ZSBnZXQgaW50byB0aGUgaW5pdGlhbCBzdGF0ZVxyXG4gICAgLy8gd2l0aCB0aGUgbGVhZGluZyAvXHJcbiAgICBsZXQgc2VnbWVudDtcclxuICAgIGZ1bmN0aW9uIGZpbmFsaXplU2VnbWVudCgpIHtcclxuICAgICAgICBpZiAoc2VnbWVudClcclxuICAgICAgICAgICAgdG9rZW5zLnB1c2goc2VnbWVudCk7XHJcbiAgICAgICAgc2VnbWVudCA9IFtdO1xyXG4gICAgfVxyXG4gICAgLy8gaW5kZXggb24gdGhlIHBhdGhcclxuICAgIGxldCBpID0gMDtcclxuICAgIC8vIGNoYXIgYXQgaW5kZXhcclxuICAgIGxldCBjaGFyO1xyXG4gICAgLy8gYnVmZmVyIG9mIHRoZSB2YWx1ZSByZWFkXHJcbiAgICBsZXQgYnVmZmVyID0gJyc7XHJcbiAgICAvLyBjdXN0b20gcmVnZXhwIGZvciBhIHBhcmFtXHJcbiAgICBsZXQgY3VzdG9tUmUgPSAnJztcclxuICAgIGZ1bmN0aW9uIGNvbnN1bWVCdWZmZXIoKSB7XHJcbiAgICAgICAgaWYgKCFidWZmZXIpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoc3RhdGUgPT09IDAgLyogVG9rZW5pemVyU3RhdGUuU3RhdGljICovKSB7XHJcbiAgICAgICAgICAgIHNlZ21lbnQucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAwIC8qIFRva2VuVHlwZS5TdGF0aWMgKi8sXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogYnVmZmVyLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09IDEgLyogVG9rZW5pemVyU3RhdGUuUGFyYW0gKi8gfHxcclxuICAgICAgICAgICAgc3RhdGUgPT09IDIgLyogVG9rZW5pemVyU3RhdGUuUGFyYW1SZWdFeHAgKi8gfHxcclxuICAgICAgICAgICAgc3RhdGUgPT09IDMgLyogVG9rZW5pemVyU3RhdGUuUGFyYW1SZWdFeHBFbmQgKi8pIHtcclxuICAgICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID4gMSAmJiAoY2hhciA9PT0gJyonIHx8IGNoYXIgPT09ICcrJykpXHJcbiAgICAgICAgICAgICAgICBjcmFzaChgQSByZXBlYXRhYmxlIHBhcmFtICgke2J1ZmZlcn0pIG11c3QgYmUgYWxvbmUgaW4gaXRzIHNlZ21lbnQuIGVnOiAnLzppZHMrLmApO1xyXG4gICAgICAgICAgICBzZWdtZW50LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogMSAvKiBUb2tlblR5cGUuUGFyYW0gKi8sXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogYnVmZmVyLFxyXG4gICAgICAgICAgICAgICAgcmVnZXhwOiBjdXN0b21SZSxcclxuICAgICAgICAgICAgICAgIHJlcGVhdGFibGU6IGNoYXIgPT09ICcqJyB8fCBjaGFyID09PSAnKycsXHJcbiAgICAgICAgICAgICAgICBvcHRpb25hbDogY2hhciA9PT0gJyonIHx8IGNoYXIgPT09ICc/JyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjcmFzaCgnSW52YWxpZCBzdGF0ZSB0byBjb25zdW1lIGJ1ZmZlcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBidWZmZXIgPSAnJztcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZENoYXJUb0J1ZmZlcigpIHtcclxuICAgICAgICBidWZmZXIgKz0gY2hhcjtcclxuICAgIH1cclxuICAgIHdoaWxlIChpIDwgcGF0aC5sZW5ndGgpIHtcclxuICAgICAgICBjaGFyID0gcGF0aFtpKytdO1xyXG4gICAgICAgIGlmIChjaGFyID09PSAnXFxcXCcgJiYgc3RhdGUgIT09IDIgLyogVG9rZW5pemVyU3RhdGUuUGFyYW1SZWdFeHAgKi8pIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTdGF0ZSA9IHN0YXRlO1xyXG4gICAgICAgICAgICBzdGF0ZSA9IDQgLyogVG9rZW5pemVyU3RhdGUuRXNjYXBlTmV4dCAqLztcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcclxuICAgICAgICAgICAgY2FzZSAwIC8qIFRva2VuaXplclN0YXRlLlN0YXRpYyAqLzpcclxuICAgICAgICAgICAgICAgIGlmIChjaGFyID09PSAnLycpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVCdWZmZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZmluYWxpemVTZWdtZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGFyID09PSAnOicpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdW1lQnVmZmVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAxIC8qIFRva2VuaXplclN0YXRlLlBhcmFtICovO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWRkQ2hhclRvQnVmZmVyKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSA0IC8qIFRva2VuaXplclN0YXRlLkVzY2FwZU5leHQgKi86XHJcbiAgICAgICAgICAgICAgICBhZGRDaGFyVG9CdWZmZXIoKTtcclxuICAgICAgICAgICAgICAgIHN0YXRlID0gcHJldmlvdXNTdGF0ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDEgLyogVG9rZW5pemVyU3RhdGUuUGFyYW0gKi86XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hhciA9PT0gJygnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyIC8qIFRva2VuaXplclN0YXRlLlBhcmFtUmVnRXhwICovO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoVkFMSURfUEFSQU1fUkUudGVzdChjaGFyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFkZENoYXJUb0J1ZmZlcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3VtZUJ1ZmZlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMCAvKiBUb2tlbml6ZXJTdGF0ZS5TdGF0aWMgKi87XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZ28gYmFjayBvbmUgY2hhcmFjdGVyIGlmIHdlIHdlcmUgbm90IG1vZGlmeWluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyICE9PSAnKicgJiYgY2hhciAhPT0gJz8nICYmIGNoYXIgIT09ICcrJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaS0tO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMiAvKiBUb2tlbml6ZXJTdGF0ZS5QYXJhbVJlZ0V4cCAqLzpcclxuICAgICAgICAgICAgICAgIC8vIFRPRE86IGlzIGl0IHdvcnRoIGhhbmRsaW5nIG5lc3RlZCByZWdleHA/IGxpa2UgOnAoPzpwcmVmaXhfKFteL10rKV9zdWZmaXgpXHJcbiAgICAgICAgICAgICAgICAvLyBpdCBhbHJlYWR5IHdvcmtzIGJ5IGVzY2FwaW5nIHRoZSBjbG9zaW5nIClcclxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vcGF0aHMuZXNtLmRldi8/cD1BQU1lSmJpQXdRRWNES2JBb0FBa1A2MFBHMlI2UUF2Z05hQTZBRkFDTTJBQnVRQkIjXHJcbiAgICAgICAgICAgICAgICAvLyBpcyB0aGlzIHJlYWxseSBzb21ldGhpbmcgcGVvcGxlIG5lZWQgc2luY2UgeW91IGNhbiBhbHNvIHdyaXRlXHJcbiAgICAgICAgICAgICAgICAvLyAvcHJlZml4XzpwKClfc3VmZml4XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hhciA9PT0gJyknKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlc2NhcGVkIClcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VzdG9tUmVbY3VzdG9tUmUubGVuZ3RoIC0gMV0gPT0gJ1xcXFwnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21SZSA9IGN1c3RvbVJlLnNsaWNlKDAsIC0xKSArIGNoYXI7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDMgLyogVG9rZW5pemVyU3RhdGUuUGFyYW1SZWdFeHBFbmQgKi87XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjdXN0b21SZSArPSBjaGFyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMyAvKiBUb2tlbml6ZXJTdGF0ZS5QYXJhbVJlZ0V4cEVuZCAqLzpcclxuICAgICAgICAgICAgICAgIC8vIHNhbWUgYXMgZmluYWxpemluZyBhIHBhcmFtXHJcbiAgICAgICAgICAgICAgICBjb25zdW1lQnVmZmVyKCk7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IDAgLyogVG9rZW5pemVyU3RhdGUuU3RhdGljICovO1xyXG4gICAgICAgICAgICAgICAgLy8gZ28gYmFjayBvbmUgY2hhcmFjdGVyIGlmIHdlIHdlcmUgbm90IG1vZGlmeWluZ1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoYXIgIT09ICcqJyAmJiBjaGFyICE9PSAnPycgJiYgY2hhciAhPT0gJysnKVxyXG4gICAgICAgICAgICAgICAgICAgIGktLTtcclxuICAgICAgICAgICAgICAgIGN1c3RvbVJlID0gJyc7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGNyYXNoKCdVbmtub3duIHN0YXRlJyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoc3RhdGUgPT09IDIgLyogVG9rZW5pemVyU3RhdGUuUGFyYW1SZWdFeHAgKi8pXHJcbiAgICAgICAgY3Jhc2goYFVuZmluaXNoZWQgY3VzdG9tIFJlZ0V4cCBmb3IgcGFyYW0gXCIke2J1ZmZlcn1cImApO1xyXG4gICAgY29uc3VtZUJ1ZmZlcigpO1xyXG4gICAgZmluYWxpemVTZWdtZW50KCk7XHJcbiAgICAvLyB0b2tlbkNhY2hlLnNldChwYXRoLCB0b2tlbnMpXHJcbiAgICByZXR1cm4gdG9rZW5zO1xyXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvdXRlUmVjb3JkTWF0Y2hlcihyZWNvcmQsIHBhcmVudCwgb3B0aW9ucykge1xyXG4gICAgY29uc3QgcGFyc2VyID0gdG9rZW5zVG9QYXJzZXIodG9rZW5pemVQYXRoKHJlY29yZC5wYXRoKSwgb3B0aW9ucyk7XHJcbiAgICAvLyB3YXJuIGFnYWluc3QgcGFyYW1zIHdpdGggdGhlIHNhbWUgbmFtZVxyXG4gICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nS2V5cyA9IG5ldyBTZXQoKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBwYXJzZXIua2V5cykge1xyXG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdLZXlzLmhhcyhrZXkubmFtZSkpXHJcbiAgICAgICAgICAgICAgICB3YXJuKGBGb3VuZCBkdXBsaWNhdGVkIHBhcmFtcyB3aXRoIG5hbWUgXCIke2tleS5uYW1lfVwiIGZvciBwYXRoIFwiJHtyZWNvcmQucGF0aH1cIi4gT25seSB0aGUgbGFzdCBvbmUgd2lsbCBiZSBhdmFpbGFibGUgb24gXCIkcm91dGUucGFyYW1zXCIuYCk7XHJcbiAgICAgICAgICAgIGV4aXN0aW5nS2V5cy5hZGQoa2V5Lm5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IG1hdGNoZXIgPSBhc3NpZ24ocGFyc2VyLCB7XHJcbiAgICAgICAgcmVjb3JkLFxyXG4gICAgICAgIHBhcmVudCxcclxuICAgICAgICAvLyB0aGVzZSBuZWVkcyB0byBiZSBwb3B1bGF0ZWQgYnkgdGhlIHBhcmVudFxyXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcclxuICAgICAgICBhbGlhczogW10sXHJcbiAgICB9KTtcclxuICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAvLyBib3RoIGFyZSBhbGlhc2VzIG9yIGJvdGggYXJlIG5vdCBhbGlhc2VzXHJcbiAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBtaXggdGhlbSBiZWNhdXNlIHRoZSBvcmRlciBpcyB1c2VkIHdoZW5cclxuICAgICAgICAvLyBwYXNzaW5nIG9yaWdpbmFsUmVjb3JkIGluIE1hdGNoZXIuYWRkUm91dGVcclxuICAgICAgICBpZiAoIW1hdGNoZXIucmVjb3JkLmFsaWFzT2YgPT09ICFwYXJlbnQucmVjb3JkLmFsaWFzT2YpXHJcbiAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKG1hdGNoZXIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1hdGNoZXI7XHJcbn1cblxuLyoqXHJcbiAqIENyZWF0ZXMgYSBSb3V0ZXIgTWF0Y2hlci5cclxuICpcclxuICogQGludGVybmFsXHJcbiAqIEBwYXJhbSByb3V0ZXMgLSBhcnJheSBvZiBpbml0aWFsIHJvdXRlc1xyXG4gKiBAcGFyYW0gZ2xvYmFsT3B0aW9ucyAtIGdsb2JhbCByb3V0ZSBvcHRpb25zXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVSb3V0ZXJNYXRjaGVyKHJvdXRlcywgZ2xvYmFsT3B0aW9ucykge1xyXG4gICAgLy8gbm9ybWFsaXplZCBvcmRlcmVkIGFycmF5IG9mIG1hdGNoZXJzXHJcbiAgICBjb25zdCBtYXRjaGVycyA9IFtdO1xyXG4gICAgY29uc3QgbWF0Y2hlck1hcCA9IG5ldyBNYXAoKTtcclxuICAgIGdsb2JhbE9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoeyBzdHJpY3Q6IGZhbHNlLCBlbmQ6IHRydWUsIHNlbnNpdGl2ZTogZmFsc2UgfSwgZ2xvYmFsT3B0aW9ucyk7XHJcbiAgICBmdW5jdGlvbiBnZXRSZWNvcmRNYXRjaGVyKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbWF0Y2hlck1hcC5nZXQobmFtZSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRSb3V0ZShyZWNvcmQsIHBhcmVudCwgb3JpZ2luYWxSZWNvcmQpIHtcclxuICAgICAgICAvLyB1c2VkIGxhdGVyIG9uIHRvIHJlbW92ZSBieSBuYW1lXHJcbiAgICAgICAgY29uc3QgaXNSb290QWRkID0gIW9yaWdpbmFsUmVjb3JkO1xyXG4gICAgICAgIGNvbnN0IG1haW5Ob3JtYWxpemVkUmVjb3JkID0gbm9ybWFsaXplUm91dGVSZWNvcmQocmVjb3JkKTtcclxuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XHJcbiAgICAgICAgICAgIGNoZWNrQ2hpbGRNaXNzaW5nTmFtZVdpdGhFbXB0eVBhdGgobWFpbk5vcm1hbGl6ZWRSZWNvcmQsIHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHdlIG1pZ2h0IGJlIHRoZSBjaGlsZCBvZiBhbiBhbGlhc1xyXG4gICAgICAgIG1haW5Ob3JtYWxpemVkUmVjb3JkLmFsaWFzT2YgPSBvcmlnaW5hbFJlY29yZCAmJiBvcmlnaW5hbFJlY29yZC5yZWNvcmQ7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhnbG9iYWxPcHRpb25zLCByZWNvcmQpO1xyXG4gICAgICAgIC8vIGdlbmVyYXRlIGFuIGFycmF5IG9mIHJlY29yZHMgdG8gY29ycmVjdGx5IGhhbmRsZSBhbGlhc2VzXHJcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFJlY29yZHMgPSBbXHJcbiAgICAgICAgICAgIG1haW5Ob3JtYWxpemVkUmVjb3JkLFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgaWYgKCdhbGlhcycgaW4gcmVjb3JkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFsaWFzZXMgPSB0eXBlb2YgcmVjb3JkLmFsaWFzID09PSAnc3RyaW5nJyA/IFtyZWNvcmQuYWxpYXNdIDogcmVjb3JkLmFsaWFzO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFsaWFzIG9mIGFsaWFzZXMpIHtcclxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRSZWNvcmRzLnB1c2goYXNzaWduKHt9LCBtYWluTm9ybWFsaXplZFJlY29yZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsb3dzIHVzIHRvIGhvbGQgYSBjb3B5IG9mIHRoZSBgY29tcG9uZW50c2Agb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCBhc3luYyBjb21wb25lbnRzIGNhY2hlIGlzIGhvbGQgb24gdGhlIG9yaWdpbmFsIHJlY29yZFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IG9yaWdpbmFsUmVjb3JkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gb3JpZ2luYWxSZWNvcmQucmVjb3JkLmNvbXBvbmVudHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBtYWluTm9ybWFsaXplZFJlY29yZC5jb21wb25lbnRzLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGFsaWFzLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIG1pZ2h0IGJlIHRoZSBjaGlsZCBvZiBhbiBhbGlhc1xyXG4gICAgICAgICAgICAgICAgICAgIGFsaWFzT2Y6IG9yaWdpbmFsUmVjb3JkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gb3JpZ2luYWxSZWNvcmQucmVjb3JkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbWFpbk5vcm1hbGl6ZWRSZWNvcmQsXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFsaWFzZXMgYXJlIGFsd2F5cyBvZiB0aGUgc2FtZSBraW5kIGFzIHRoZSBvcmlnaW5hbCBzaW5jZSB0aGV5XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYXJlIGRlZmluZWQgb24gdGhlIHNhbWUgcmVjb3JkXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG1hdGNoZXI7XHJcbiAgICAgICAgbGV0IG9yaWdpbmFsTWF0Y2hlcjtcclxuICAgICAgICBmb3IgKGNvbnN0IG5vcm1hbGl6ZWRSZWNvcmQgb2Ygbm9ybWFsaXplZFJlY29yZHMpIHtcclxuICAgICAgICAgICAgY29uc3QgeyBwYXRoIH0gPSBub3JtYWxpemVkUmVjb3JkO1xyXG4gICAgICAgICAgICAvLyBCdWlsZCB1cCB0aGUgcGF0aCBmb3IgbmVzdGVkIHJvdXRlcyBpZiB0aGUgY2hpbGQgaXNuJ3QgYW4gYWJzb2x1dGVcclxuICAgICAgICAgICAgLy8gcm91dGUuIE9ubHkgYWRkIHRoZSAvIGRlbGltaXRlciBpZiB0aGUgY2hpbGQgcGF0aCBpc24ndCBlbXB0eSBhbmQgaWYgdGhlXHJcbiAgICAgICAgICAgIC8vIHBhcmVudCBwYXRoIGRvZXNuJ3QgaGF2ZSBhIHRyYWlsaW5nIHNsYXNoXHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgcGF0aFswXSAhPT0gJy8nKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGFyZW50LnJlY29yZC5wYXRoO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29ubmVjdGluZ1NsYXNoID0gcGFyZW50UGF0aFtwYXJlbnRQYXRoLmxlbmd0aCAtIDFdID09PSAnLycgPyAnJyA6ICcvJztcclxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRSZWNvcmQucGF0aCA9XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LnJlY29yZC5wYXRoICsgKHBhdGggJiYgY29ubmVjdGluZ1NsYXNoICsgcGF0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiBub3JtYWxpemVkUmVjb3JkLnBhdGggPT09ICcqJykge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYXRjaCBhbGwgcm91dGVzIChcIipcIikgbXVzdCBub3cgYmUgZGVmaW5lZCB1c2luZyBhIHBhcmFtIHdpdGggYSBjdXN0b20gcmVnZXhwLlxcbicgK1xyXG4gICAgICAgICAgICAgICAgICAgICdTZWUgbW9yZSBhdCBodHRwczovL25leHQucm91dGVyLnZ1ZWpzLm9yZy9ndWlkZS9taWdyYXRpb24vI3JlbW92ZWQtc3Rhci1vci1jYXRjaC1hbGwtcm91dGVzLicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgb2JqZWN0IGJlZm9yZWhhbmQsIHNvIGl0IGNhbiBiZSBwYXNzZWQgdG8gY2hpbGRyZW5cclxuICAgICAgICAgICAgbWF0Y2hlciA9IGNyZWF0ZVJvdXRlUmVjb3JkTWF0Y2hlcihub3JtYWxpemVkUmVjb3JkLCBwYXJlbnQsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIHBhcmVudCAmJiBwYXRoWzBdID09PSAnLycpXHJcbiAgICAgICAgICAgICAgICBjaGVja01pc3NpbmdQYXJhbXNJbkFic29sdXRlUGF0aChtYXRjaGVyLCBwYXJlbnQpO1xyXG4gICAgICAgICAgICAvLyBpZiB3ZSBhcmUgYW4gYWxpYXMgd2UgbXVzdCB0ZWxsIHRoZSBvcmlnaW5hbCByZWNvcmQgdGhhdCB3ZSBleGlzdCxcclxuICAgICAgICAgICAgLy8gc28gd2UgY2FuIGJlIHJlbW92ZWRcclxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsUmVjb3JkKSB7XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFJlY29yZC5hbGlhcy5wdXNoKG1hdGNoZXIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrU2FtZVBhcmFtcyhvcmlnaW5hbFJlY29yZCwgbWF0Y2hlcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIHRoZSBmaXJzdCByZWNvcmQgaXMgdGhlIG9yaWdpbmFsIGFuZCBvdGhlcnMgYXJlIGFsaWFzZXNcclxuICAgICAgICAgICAgICAgIG9yaWdpbmFsTWF0Y2hlciA9IG9yaWdpbmFsTWF0Y2hlciB8fCBtYXRjaGVyO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsTWF0Y2hlciAhPT0gbWF0Y2hlcilcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbE1hdGNoZXIuYWxpYXMucHVzaChtYXRjaGVyKTtcclxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgcm91dGUgaWYgbmFtZWQgYW5kIG9ubHkgZm9yIHRoZSB0b3AgcmVjb3JkIChhdm9pZCBpbiBuZXN0ZWQgY2FsbHMpXHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzIHdvcmtzIGJlY2F1c2UgdGhlIG9yaWdpbmFsIHJlY29yZCBpcyB0aGUgZmlyc3Qgb25lXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNSb290QWRkICYmIHJlY29yZC5uYW1lICYmICFpc0FsaWFzUmVjb3JkKG1hdGNoZXIpKVxyXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZVJvdXRlKHJlY29yZC5uYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobWFpbk5vcm1hbGl6ZWRSZWNvcmQuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbWFpbk5vcm1hbGl6ZWRSZWNvcmQuY2hpbGRyZW47XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWRkUm91dGUoY2hpbGRyZW5baV0sIG1hdGNoZXIsIG9yaWdpbmFsUmVjb3JkICYmIG9yaWdpbmFsUmVjb3JkLmNoaWxkcmVuW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSB3YXMgbm8gb3JpZ2luYWwgcmVjb3JkLCB0aGVuIHRoZSBmaXJzdCBvbmUgd2FzIG5vdCBhbiBhbGlhcyBhbmQgYWxsXHJcbiAgICAgICAgICAgIC8vIG90aGVyIGFsaWFzZXMgKGlmIGFueSkgbmVlZCB0byByZWZlcmVuY2UgdGhpcyByZWNvcmQgd2hlbiBhZGRpbmcgY2hpbGRyZW5cclxuICAgICAgICAgICAgb3JpZ2luYWxSZWNvcmQgPSBvcmlnaW5hbFJlY29yZCB8fCBtYXRjaGVyO1xyXG4gICAgICAgICAgICAvLyBUT0RPOiBhZGQgbm9ybWFsaXplZCByZWNvcmRzIGZvciBtb3JlIGZsZXhpYmlsaXR5XHJcbiAgICAgICAgICAgIC8vIGlmIChwYXJlbnQgJiYgaXNBbGlhc1JlY29yZChvcmlnaW5hbFJlY29yZCkpIHtcclxuICAgICAgICAgICAgLy8gICBwYXJlbnQuY2hpbGRyZW4ucHVzaChvcmlnaW5hbFJlY29yZClcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAvLyBBdm9pZCBhZGRpbmcgYSByZWNvcmQgdGhhdCBkb2Vzbid0IGRpc3BsYXkgYW55dGhpbmcuIFRoaXMgYWxsb3dzIHBhc3NpbmcgdGhyb3VnaCByZWNvcmRzIHdpdGhvdXQgYSBjb21wb25lbnQgdG9cclxuICAgICAgICAgICAgLy8gbm90IGJlIHJlYWNoZWQgYW5kIHBhc3MgdGhyb3VnaCB0aGUgY2F0Y2ggYWxsIHJvdXRlXHJcbiAgICAgICAgICAgIGlmICgobWF0Y2hlci5yZWNvcmQuY29tcG9uZW50cyAmJlxyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMobWF0Y2hlci5yZWNvcmQuY29tcG9uZW50cykubGVuZ3RoKSB8fFxyXG4gICAgICAgICAgICAgICAgbWF0Y2hlci5yZWNvcmQubmFtZSB8fFxyXG4gICAgICAgICAgICAgICAgbWF0Y2hlci5yZWNvcmQucmVkaXJlY3QpIHtcclxuICAgICAgICAgICAgICAgIGluc2VydE1hdGNoZXIobWF0Y2hlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWF0Y2hlclxyXG4gICAgICAgICAgICA/ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIHNpbmNlIG90aGVyIG1hdGNoZXJzIGFyZSBhbGlhc2VzLCB0aGV5IHNob3VsZCBiZSByZW1vdmVkIGJ5IHRoZSBvcmlnaW5hbCBtYXRjaGVyXHJcbiAgICAgICAgICAgICAgICByZW1vdmVSb3V0ZShvcmlnaW5hbE1hdGNoZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDogbm9vcDtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHJlbW92ZVJvdXRlKG1hdGNoZXJSZWYpIHtcclxuICAgICAgICBpZiAoaXNSb3V0ZU5hbWUobWF0Y2hlclJlZikpIHtcclxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlciA9IG1hdGNoZXJNYXAuZ2V0KG1hdGNoZXJSZWYpO1xyXG4gICAgICAgICAgICBpZiAobWF0Y2hlcikge1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hlck1hcC5kZWxldGUobWF0Y2hlclJlZik7XHJcbiAgICAgICAgICAgICAgICBtYXRjaGVycy5zcGxpY2UobWF0Y2hlcnMuaW5kZXhPZihtYXRjaGVyKSwgMSk7XHJcbiAgICAgICAgICAgICAgICBtYXRjaGVyLmNoaWxkcmVuLmZvckVhY2gocmVtb3ZlUm91dGUpO1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hlci5hbGlhcy5mb3JFYWNoKHJlbW92ZVJvdXRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBtYXRjaGVycy5pbmRleE9mKG1hdGNoZXJSZWYpO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hlcnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyUmVmLnJlY29yZC5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXJNYXAuZGVsZXRlKG1hdGNoZXJSZWYucmVjb3JkLm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hlclJlZi5jaGlsZHJlbi5mb3JFYWNoKHJlbW92ZVJvdXRlKTtcclxuICAgICAgICAgICAgICAgIG1hdGNoZXJSZWYuYWxpYXMuZm9yRWFjaChyZW1vdmVSb3V0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBnZXRSb3V0ZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIG1hdGNoZXJzO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0TWF0Y2hlcihtYXRjaGVyKSB7XHJcbiAgICAgICAgbGV0IGkgPSAwO1xyXG4gICAgICAgIHdoaWxlIChpIDwgbWF0Y2hlcnMubGVuZ3RoICYmXHJcbiAgICAgICAgICAgIGNvbXBhcmVQYXRoUGFyc2VyU2NvcmUobWF0Y2hlciwgbWF0Y2hlcnNbaV0pID49IDAgJiZcclxuICAgICAgICAgICAgLy8gQWRkaW5nIGNoaWxkcmVuIHdpdGggZW1wdHkgcGF0aCBzaG91bGQgc3RpbGwgYXBwZWFyIGJlZm9yZSB0aGUgcGFyZW50XHJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy9yb3V0ZXIvaXNzdWVzLzExMjRcclxuICAgICAgICAgICAgKG1hdGNoZXIucmVjb3JkLnBhdGggIT09IG1hdGNoZXJzW2ldLnJlY29yZC5wYXRoIHx8XHJcbiAgICAgICAgICAgICAgICAhaXNSZWNvcmRDaGlsZE9mKG1hdGNoZXIsIG1hdGNoZXJzW2ldKSkpXHJcbiAgICAgICAgICAgIGkrKztcclxuICAgICAgICBtYXRjaGVycy5zcGxpY2UoaSwgMCwgbWF0Y2hlcik7XHJcbiAgICAgICAgLy8gb25seSBhZGQgdGhlIG9yaWdpbmFsIHJlY29yZCB0byB0aGUgbmFtZSBtYXBcclxuICAgICAgICBpZiAobWF0Y2hlci5yZWNvcmQubmFtZSAmJiAhaXNBbGlhc1JlY29yZChtYXRjaGVyKSlcclxuICAgICAgICAgICAgbWF0Y2hlck1hcC5zZXQobWF0Y2hlci5yZWNvcmQubmFtZSwgbWF0Y2hlcik7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiByZXNvbHZlKGxvY2F0aW9uLCBjdXJyZW50TG9jYXRpb24pIHtcclxuICAgICAgICBsZXQgbWF0Y2hlcjtcclxuICAgICAgICBsZXQgcGFyYW1zID0ge307XHJcbiAgICAgICAgbGV0IHBhdGg7XHJcbiAgICAgICAgbGV0IG5hbWU7XHJcbiAgICAgICAgaWYgKCduYW1lJyBpbiBsb2NhdGlvbiAmJiBsb2NhdGlvbi5uYW1lKSB7XHJcbiAgICAgICAgICAgIG1hdGNoZXIgPSBtYXRjaGVyTWFwLmdldChsb2NhdGlvbi5uYW1lKTtcclxuICAgICAgICAgICAgaWYgKCFtYXRjaGVyKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlUm91dGVyRXJyb3IoMSAvKiBFcnJvclR5cGVzLk1BVENIRVJfTk9UX0ZPVU5EICovLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gd2FybiBpZiB0aGUgdXNlciBpcyBwYXNzaW5nIGludmFsaWQgcGFyYW1zIHNvIHRoZXkgY2FuIGRlYnVnIGl0IGJldHRlciB3aGVuIHRoZXkgZ2V0IHJlbW92ZWRcclxuICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW52YWxpZFBhcmFtcyA9IE9iamVjdC5rZXlzKGxvY2F0aW9uLnBhcmFtcyB8fCB7fSkuZmlsdGVyKHBhcmFtTmFtZSA9PiAhbWF0Y2hlci5rZXlzLmZpbmQoayA9PiBrLm5hbWUgPT09IHBhcmFtTmFtZSkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGludmFsaWRQYXJhbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2FybihgRGlzY2FyZGVkIGludmFsaWQgcGFyYW0ocykgXCIke2ludmFsaWRQYXJhbXMuam9pbignXCIsIFwiJyl9XCIgd2hlbiBuYXZpZ2F0aW5nLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3JvdXRlci9ibG9iL21haW4vcGFja2FnZXMvcm91dGVyL0NIQU5HRUxPRy5tZCM0MTQtMjAyMi0wOC0yMiBmb3IgbW9yZSBkZXRhaWxzLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5hbWUgPSBtYXRjaGVyLnJlY29yZC5uYW1lO1xyXG4gICAgICAgICAgICBwYXJhbXMgPSBhc3NpZ24oXHJcbiAgICAgICAgICAgIC8vIHBhcmFtc0Zyb21Mb2NhdGlvbiBpcyBhIG5ldyBvYmplY3RcclxuICAgICAgICAgICAgcGFyYW1zRnJvbUxvY2F0aW9uKGN1cnJlbnRMb2NhdGlvbi5wYXJhbXMsIFxyXG4gICAgICAgICAgICAvLyBvbmx5IGtlZXAgcGFyYW1zIHRoYXQgZXhpc3QgaW4gdGhlIHJlc29sdmVkIGxvY2F0aW9uXHJcbiAgICAgICAgICAgIC8vIFRPRE86IG9ubHkga2VlcCBvcHRpb25hbCBwYXJhbXMgY29taW5nIGZyb20gYSBwYXJlbnQgcmVjb3JkXHJcbiAgICAgICAgICAgIG1hdGNoZXIua2V5cy5maWx0ZXIoayA9PiAhay5vcHRpb25hbCkubWFwKGsgPT4gay5uYW1lKSksIFxyXG4gICAgICAgICAgICAvLyBkaXNjYXJkIGFueSBleGlzdGluZyBwYXJhbXMgaW4gdGhlIGN1cnJlbnQgbG9jYXRpb24gdGhhdCBkbyBub3QgZXhpc3QgaGVyZVxyXG4gICAgICAgICAgICAvLyAjMTQ5NyB0aGlzIGVuc3VyZXMgYmV0dGVyIGFjdGl2ZS9leGFjdCBtYXRjaGluZ1xyXG4gICAgICAgICAgICBsb2NhdGlvbi5wYXJhbXMgJiZcclxuICAgICAgICAgICAgICAgIHBhcmFtc0Zyb21Mb2NhdGlvbihsb2NhdGlvbi5wYXJhbXMsIG1hdGNoZXIua2V5cy5tYXAoayA9PiBrLm5hbWUpKSk7XHJcbiAgICAgICAgICAgIC8vIHRocm93cyBpZiBjYW5ub3QgYmUgc3RyaW5naWZpZWRcclxuICAgICAgICAgICAgcGF0aCA9IG1hdGNoZXIuc3RyaW5naWZ5KHBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCdwYXRoJyBpbiBsb2NhdGlvbikge1xyXG4gICAgICAgICAgICAvLyBubyBuZWVkIHRvIHJlc29sdmUgdGhlIHBhdGggd2l0aCB0aGUgbWF0Y2hlciBhcyBpdCB3YXMgcHJvdmlkZWRcclxuICAgICAgICAgICAgLy8gdGhpcyBhbHNvIGFsbG93cyB0aGUgdXNlciB0byBjb250cm9sIHRoZSBlbmNvZGluZ1xyXG4gICAgICAgICAgICBwYXRoID0gbG9jYXRpb24ucGF0aDtcclxuICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhcGF0aC5zdGFydHNXaXRoKCcvJykpIHtcclxuICAgICAgICAgICAgICAgIHdhcm4oYFRoZSBNYXRjaGVyIGNhbm5vdCByZXNvbHZlIHJlbGF0aXZlIHBhdGhzIGJ1dCByZWNlaXZlZCBcIiR7cGF0aH1cIi4gVW5sZXNzIHlvdSBkaXJlY3RseSBjYWxsZWQgXFxgbWF0Y2hlci5yZXNvbHZlKFwiJHtwYXRofVwiKVxcYCwgdGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiB2dWUtcm91dGVyLiBQbGVhc2Ugb3BlbiBhbiBpc3N1ZSBhdCBodHRwczovL25ldy1pc3N1ZS52dWVqcy5vcmcvP3JlcG89dnVlanMvcm91dGVyLmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG1hdGNoZXIgPSBtYXRjaGVycy5maW5kKG0gPT4gbS5yZS50ZXN0KHBhdGgpKTtcclxuICAgICAgICAgICAgLy8gbWF0Y2hlciBzaG91bGQgaGF2ZSBhIHZhbHVlIGFmdGVyIHRoZSBsb29wXHJcbiAgICAgICAgICAgIGlmIChtYXRjaGVyKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBrbm93IHRoZSBtYXRjaGVyIHdvcmtzIGJlY2F1c2Ugd2UgdGVzdGVkIHRoZSByZWdleHBcclxuICAgICAgICAgICAgICAgIHBhcmFtcyA9IG1hdGNoZXIucGFyc2UocGF0aCk7XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gbWF0Y2hlci5yZWNvcmQubmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBsb2NhdGlvbiBpcyBhIHJlbGF0aXZlIHBhdGhcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIG1hdGNoIGJ5IG5hbWUgb3IgcGF0aCBvZiBjdXJyZW50IHJvdXRlXHJcbiAgICAgICAgICAgIG1hdGNoZXIgPSBjdXJyZW50TG9jYXRpb24ubmFtZVxyXG4gICAgICAgICAgICAgICAgPyBtYXRjaGVyTWFwLmdldChjdXJyZW50TG9jYXRpb24ubmFtZSlcclxuICAgICAgICAgICAgICAgIDogbWF0Y2hlcnMuZmluZChtID0+IG0ucmUudGVzdChjdXJyZW50TG9jYXRpb24ucGF0aCkpO1xyXG4gICAgICAgICAgICBpZiAoIW1hdGNoZXIpXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVSb3V0ZXJFcnJvcigxIC8qIEVycm9yVHlwZXMuTUFUQ0hFUl9OT1RfRk9VTkQgKi8sIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9jYXRpb24sXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbmFtZSA9IG1hdGNoZXIucmVjb3JkLm5hbWU7XHJcbiAgICAgICAgICAgIC8vIHNpbmNlIHdlIGFyZSBuYXZpZ2F0aW5nIHRvIHRoZSBzYW1lIGxvY2F0aW9uLCB3ZSBkb24ndCBuZWVkIHRvIHBpY2sgdGhlXHJcbiAgICAgICAgICAgIC8vIHBhcmFtcyBsaWtlIHdoZW4gYG5hbWVgIGlzIHByb3ZpZGVkXHJcbiAgICAgICAgICAgIHBhcmFtcyA9IGFzc2lnbih7fSwgY3VycmVudExvY2F0aW9uLnBhcmFtcywgbG9jYXRpb24ucGFyYW1zKTtcclxuICAgICAgICAgICAgcGF0aCA9IG1hdGNoZXIuc3RyaW5naWZ5KHBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG1hdGNoZWQgPSBbXTtcclxuICAgICAgICBsZXQgcGFyZW50TWF0Y2hlciA9IG1hdGNoZXI7XHJcbiAgICAgICAgd2hpbGUgKHBhcmVudE1hdGNoZXIpIHtcclxuICAgICAgICAgICAgLy8gcmV2ZXJzZWQgb3JkZXIgc28gcGFyZW50cyBhcmUgYXQgdGhlIGJlZ2lubmluZ1xyXG4gICAgICAgICAgICBtYXRjaGVkLnVuc2hpZnQocGFyZW50TWF0Y2hlci5yZWNvcmQpO1xyXG4gICAgICAgICAgICBwYXJlbnRNYXRjaGVyID0gcGFyZW50TWF0Y2hlci5wYXJlbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG5hbWUsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgIHBhcmFtcyxcclxuICAgICAgICAgICAgbWF0Y2hlZCxcclxuICAgICAgICAgICAgbWV0YTogbWVyZ2VNZXRhRmllbGRzKG1hdGNoZWQpLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvLyBhZGQgaW5pdGlhbCByb3V0ZXNcclxuICAgIHJvdXRlcy5mb3JFYWNoKHJvdXRlID0+IGFkZFJvdXRlKHJvdXRlKSk7XHJcbiAgICByZXR1cm4geyBhZGRSb3V0ZSwgcmVzb2x2ZSwgcmVtb3ZlUm91dGUsIGdldFJvdXRlcywgZ2V0UmVjb3JkTWF0Y2hlciB9O1xyXG59XHJcbmZ1bmN0aW9uIHBhcmFtc0Zyb21Mb2NhdGlvbihwYXJhbXMsIGtleXMpIHtcclxuICAgIGNvbnN0IG5ld1BhcmFtcyA9IHt9O1xyXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xyXG4gICAgICAgIGlmIChrZXkgaW4gcGFyYW1zKVxyXG4gICAgICAgICAgICBuZXdQYXJhbXNba2V5XSA9IHBhcmFtc1trZXldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld1BhcmFtcztcclxufVxyXG4vKipcclxuICogTm9ybWFsaXplcyBhIFJvdXRlUmVjb3JkUmF3LiBDcmVhdGVzIGEgY29weVxyXG4gKlxyXG4gKiBAcGFyYW0gcmVjb3JkXHJcbiAqIEByZXR1cm5zIHRoZSBub3JtYWxpemVkIHZlcnNpb25cclxuICovXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZVJvdXRlUmVjb3JkKHJlY29yZCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBwYXRoOiByZWNvcmQucGF0aCxcclxuICAgICAgICByZWRpcmVjdDogcmVjb3JkLnJlZGlyZWN0LFxyXG4gICAgICAgIG5hbWU6IHJlY29yZC5uYW1lLFxyXG4gICAgICAgIG1ldGE6IHJlY29yZC5tZXRhIHx8IHt9LFxyXG4gICAgICAgIGFsaWFzT2Y6IHVuZGVmaW5lZCxcclxuICAgICAgICBiZWZvcmVFbnRlcjogcmVjb3JkLmJlZm9yZUVudGVyLFxyXG4gICAgICAgIHByb3BzOiBub3JtYWxpemVSZWNvcmRQcm9wcyhyZWNvcmQpLFxyXG4gICAgICAgIGNoaWxkcmVuOiByZWNvcmQuY2hpbGRyZW4gfHwgW10sXHJcbiAgICAgICAgaW5zdGFuY2VzOiB7fSxcclxuICAgICAgICBsZWF2ZUd1YXJkczogbmV3IFNldCgpLFxyXG4gICAgICAgIHVwZGF0ZUd1YXJkczogbmV3IFNldCgpLFxyXG4gICAgICAgIGVudGVyQ2FsbGJhY2tzOiB7fSxcclxuICAgICAgICBjb21wb25lbnRzOiAnY29tcG9uZW50cycgaW4gcmVjb3JkXHJcbiAgICAgICAgICAgID8gcmVjb3JkLmNvbXBvbmVudHMgfHwgbnVsbFxyXG4gICAgICAgICAgICA6IHJlY29yZC5jb21wb25lbnQgJiYgeyBkZWZhdWx0OiByZWNvcmQuY29tcG9uZW50IH0sXHJcbiAgICB9O1xyXG59XHJcbi8qKlxyXG4gKiBOb3JtYWxpemUgdGhlIG9wdGlvbmFsIGBwcm9wc2AgaW4gYSByZWNvcmQgdG8gYWx3YXlzIGJlIGFuIG9iamVjdCBzaW1pbGFyIHRvXHJcbiAqIGNvbXBvbmVudHMuIEFsc28gYWNjZXB0IGEgYm9vbGVhbiBmb3IgY29tcG9uZW50cy5cclxuICogQHBhcmFtIHJlY29yZFxyXG4gKi9cclxuZnVuY3Rpb24gbm9ybWFsaXplUmVjb3JkUHJvcHMocmVjb3JkKSB7XHJcbiAgICBjb25zdCBwcm9wc09iamVjdCA9IHt9O1xyXG4gICAgLy8gcHJvcHMgZG9lcyBub3QgZXhpc3Qgb24gcmVkaXJlY3QgcmVjb3JkcywgYnV0IHdlIGNhbiBzZXQgZmFsc2UgZGlyZWN0bHlcclxuICAgIGNvbnN0IHByb3BzID0gcmVjb3JkLnByb3BzIHx8IGZhbHNlO1xyXG4gICAgaWYgKCdjb21wb25lbnQnIGluIHJlY29yZCkge1xyXG4gICAgICAgIHByb3BzT2JqZWN0LmRlZmF1bHQgPSBwcm9wcztcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIE5PVEU6IHdlIGNvdWxkIGFsc28gYWxsb3cgYSBmdW5jdGlvbiB0byBiZSBhcHBsaWVkIHRvIGV2ZXJ5IGNvbXBvbmVudC5cclxuICAgICAgICAvLyBXb3VsZCBuZWVkIHVzZXIgZmVlZGJhY2sgZm9yIHVzZSBjYXNlc1xyXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiByZWNvcmQuY29tcG9uZW50cylcclxuICAgICAgICAgICAgcHJvcHNPYmplY3RbbmFtZV0gPSB0eXBlb2YgcHJvcHMgPT09ICdib29sZWFuJyA/IHByb3BzIDogcHJvcHNbbmFtZV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvcHNPYmplY3Q7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrcyBpZiBhIHJlY29yZCBvciBhbnkgb2YgaXRzIHBhcmVudCBpcyBhbiBhbGlhc1xyXG4gKiBAcGFyYW0gcmVjb3JkXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0FsaWFzUmVjb3JkKHJlY29yZCkge1xyXG4gICAgd2hpbGUgKHJlY29yZCkge1xyXG4gICAgICAgIGlmIChyZWNvcmQucmVjb3JkLmFsaWFzT2YpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJlY29yZCA9IHJlY29yZC5wYXJlbnQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxuLyoqXHJcbiAqIE1lcmdlIG1ldGEgZmllbGRzIG9mIGFuIGFycmF5IG9mIHJlY29yZHNcclxuICpcclxuICogQHBhcmFtIG1hdGNoZWQgLSBhcnJheSBvZiBtYXRjaGVkIHJlY29yZHNcclxuICovXHJcbmZ1bmN0aW9uIG1lcmdlTWV0YUZpZWxkcyhtYXRjaGVkKSB7XHJcbiAgICByZXR1cm4gbWF0Y2hlZC5yZWR1Y2UoKG1ldGEsIHJlY29yZCkgPT4gYXNzaWduKG1ldGEsIHJlY29yZC5tZXRhKSwge30pO1xyXG59XHJcbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyhkZWZhdWx0cywgcGFydGlhbE9wdGlvbnMpIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIGRlZmF1bHRzKSB7XHJcbiAgICAgICAgb3B0aW9uc1trZXldID0ga2V5IGluIHBhcnRpYWxPcHRpb25zID8gcGFydGlhbE9wdGlvbnNba2V5XSA6IGRlZmF1bHRzW2tleV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3B0aW9ucztcclxufVxyXG5mdW5jdGlvbiBpc1NhbWVQYXJhbShhLCBiKSB7XHJcbiAgICByZXR1cm4gKGEubmFtZSA9PT0gYi5uYW1lICYmXHJcbiAgICAgICAgYS5vcHRpb25hbCA9PT0gYi5vcHRpb25hbCAmJlxyXG4gICAgICAgIGEucmVwZWF0YWJsZSA9PT0gYi5yZXBlYXRhYmxlKTtcclxufVxyXG4vKipcclxuICogQ2hlY2sgaWYgYSBwYXRoIGFuZCBpdHMgYWxpYXMgaGF2ZSB0aGUgc2FtZSByZXF1aXJlZCBwYXJhbXNcclxuICpcclxuICogQHBhcmFtIGEgLSBvcmlnaW5hbCByZWNvcmRcclxuICogQHBhcmFtIGIgLSBhbGlhcyByZWNvcmRcclxuICovXHJcbmZ1bmN0aW9uIGNoZWNrU2FtZVBhcmFtcyhhLCBiKSB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBhLmtleXMpIHtcclxuICAgICAgICBpZiAoIWtleS5vcHRpb25hbCAmJiAhYi5rZXlzLmZpbmQoaXNTYW1lUGFyYW0uYmluZChudWxsLCBrZXkpKSlcclxuICAgICAgICAgICAgcmV0dXJuIHdhcm4oYEFsaWFzIFwiJHtiLnJlY29yZC5wYXRofVwiIGFuZCB0aGUgb3JpZ2luYWwgcmVjb3JkOiBcIiR7YS5yZWNvcmQucGF0aH1cIiBtdXN0IGhhdmUgdGhlIGV4YWN0IHNhbWUgcGFyYW0gbmFtZWQgXCIke2tleS5uYW1lfVwiYCk7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBiLmtleXMpIHtcclxuICAgICAgICBpZiAoIWtleS5vcHRpb25hbCAmJiAhYS5rZXlzLmZpbmQoaXNTYW1lUGFyYW0uYmluZChudWxsLCBrZXkpKSlcclxuICAgICAgICAgICAgcmV0dXJuIHdhcm4oYEFsaWFzIFwiJHtiLnJlY29yZC5wYXRofVwiIGFuZCB0aGUgb3JpZ2luYWwgcmVjb3JkOiBcIiR7YS5yZWNvcmQucGF0aH1cIiBtdXN0IGhhdmUgdGhlIGV4YWN0IHNhbWUgcGFyYW0gbmFtZWQgXCIke2tleS5uYW1lfVwiYCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEEgcm91dGUgd2l0aCBhIG5hbWUgYW5kIGEgY2hpbGQgd2l0aCBhbiBlbXB0eSBwYXRoIHdpdGhvdXQgYSBuYW1lIHNob3VsZCB3YXJuIHdoZW4gYWRkaW5nIHRoZSByb3V0ZVxyXG4gKlxyXG4gKiBAcGFyYW0gbWFpbk5vcm1hbGl6ZWRSZWNvcmQgLSBSb3V0ZVJlY29yZE5vcm1hbGl6ZWRcclxuICogQHBhcmFtIHBhcmVudCAtIFJvdXRlUmVjb3JkTWF0Y2hlclxyXG4gKi9cclxuZnVuY3Rpb24gY2hlY2tDaGlsZE1pc3NpbmdOYW1lV2l0aEVtcHR5UGF0aChtYWluTm9ybWFsaXplZFJlY29yZCwgcGFyZW50KSB7XHJcbiAgICBpZiAocGFyZW50ICYmXHJcbiAgICAgICAgcGFyZW50LnJlY29yZC5uYW1lICYmXHJcbiAgICAgICAgIW1haW5Ob3JtYWxpemVkUmVjb3JkLm5hbWUgJiZcclxuICAgICAgICAhbWFpbk5vcm1hbGl6ZWRSZWNvcmQucGF0aCkge1xyXG4gICAgICAgIHdhcm4oYFRoZSByb3V0ZSBuYW1lZCBcIiR7U3RyaW5nKHBhcmVudC5yZWNvcmQubmFtZSl9XCIgaGFzIGEgY2hpbGQgd2l0aG91dCBhIG5hbWUgYW5kIGFuIGVtcHR5IHBhdGguIFVzaW5nIHRoYXQgbmFtZSB3b24ndCByZW5kZXIgdGhlIGVtcHR5IHBhdGggY2hpbGQgc28geW91IHByb2JhYmx5IHdhbnQgdG8gbW92ZSB0aGUgbmFtZSB0byB0aGUgY2hpbGQgaW5zdGVhZC4gSWYgdGhpcyBpcyBpbnRlbnRpb25hbCwgYWRkIGEgbmFtZSB0byB0aGUgY2hpbGQgcm91dGUgdG8gcmVtb3ZlIHRoZSB3YXJuaW5nLmApO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGNoZWNrTWlzc2luZ1BhcmFtc0luQWJzb2x1dGVQYXRoKHJlY29yZCwgcGFyZW50KSB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBwYXJlbnQua2V5cykge1xyXG4gICAgICAgIGlmICghcmVjb3JkLmtleXMuZmluZChpc1NhbWVQYXJhbS5iaW5kKG51bGwsIGtleSkpKVxyXG4gICAgICAgICAgICByZXR1cm4gd2FybihgQWJzb2x1dGUgcGF0aCBcIiR7cmVjb3JkLnJlY29yZC5wYXRofVwiIG11c3QgaGF2ZSB0aGUgZXhhY3Qgc2FtZSBwYXJhbSBuYW1lZCBcIiR7a2V5Lm5hbWV9XCIgYXMgaXRzIHBhcmVudCBcIiR7cGFyZW50LnJlY29yZC5wYXRofVwiLmApO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGlzUmVjb3JkQ2hpbGRPZihyZWNvcmQsIHBhcmVudCkge1xyXG4gICAgcmV0dXJuIHBhcmVudC5jaGlsZHJlbi5zb21lKGNoaWxkID0+IGNoaWxkID09PSByZWNvcmQgfHwgaXNSZWNvcmRDaGlsZE9mKHJlY29yZCwgY2hpbGQpKTtcclxufVxuXG4vKipcclxuICogRW5jb2RpbmcgUnVsZXMg4pCjID0gU3BhY2UgUGF0aDog4pCjIFwiIDwgPiAjID8geyB9IFF1ZXJ5OiDikKMgXCIgPCA+ICMgJiA9IEhhc2g6IOKQoyBcIlxyXG4gKiA8ID4gYFxyXG4gKlxyXG4gKiBPbiB0b3Agb2YgdGhhdCwgdGhlIFJGQzM5ODYgKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMi4yKVxyXG4gKiBkZWZpbmVzIHNvbWUgZXh0cmEgY2hhcmFjdGVycyB0byBiZSBlbmNvZGVkLiBNb3N0IGJyb3dzZXJzIGRvIG5vdCBlbmNvZGUgdGhlbVxyXG4gKiBpbiBlbmNvZGVVUkkgaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy91cmwvaXNzdWVzLzM2OSwgc28gaXQgbWF5IGJlIHNhZmVyIHRvXHJcbiAqIGFsc28gZW5jb2RlIGAhJygpKmAuIExlYXZpbmcgdW4tZW5jb2RlZCBvbmx5IEFTQ0lJIGFscGhhbnVtZXJpYyhgYS16QS1aMC05YClcclxuICogcGx1cyBgLS5ffmAuIFRoaXMgZXh0cmEgc2FmZXR5IHNob3VsZCBiZSBhcHBsaWVkIHRvIHF1ZXJ5IGJ5IHBhdGNoaW5nIHRoZVxyXG4gKiBzdHJpbmcgcmV0dXJuZWQgYnkgZW5jb2RlVVJJQ29tcG9uZW50IGVuY29kZVVSSSBhbHNvIGVuY29kZXMgYFtcXF1eYC4gYFxcYFxyXG4gKiBzaG91bGQgYmUgZW5jb2RlZCB0byBhdm9pZCBhbWJpZ3VpdHkuIEJyb3dzZXJzIChJRSwgRkYsIEMpIHRyYW5zZm9ybSBhIGBcXGBcclxuICogaW50byBhIGAvYCBpZiBkaXJlY3RseSB0eXBlZCBpbi4gVGhlIF9iYWNrdGlja18gKGBgYGBgKSBzaG91bGQgYWxzbyBiZVxyXG4gKiBlbmNvZGVkIGV2ZXJ5d2hlcmUgYmVjYXVzZSBzb21lIGJyb3dzZXJzIGxpa2UgRkYgZW5jb2RlIGl0IHdoZW4gZGlyZWN0bHlcclxuICogd3JpdHRlbiB3aGlsZSBvdGhlcnMgZG9uJ3QuIFNhZmFyaSBhbmQgSUUgZG9uJ3QgZW5jb2RlIGBgXCI8Pnt9YGBgIGluIGhhc2guXHJcbiAqL1xyXG4vLyBjb25zdCBFWFRSQV9SRVNFUlZFRF9SRSA9IC9bIScoKSpdL2dcclxuLy8gY29uc3QgZW5jb2RlUmVzZXJ2ZWRSZXBsYWNlciA9IChjOiBzdHJpbmcpID0+ICclJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNilcclxuY29uc3QgSEFTSF9SRSA9IC8jL2c7IC8vICUyM1xyXG5jb25zdCBBTVBFUlNBTkRfUkUgPSAvJi9nOyAvLyAlMjZcclxuY29uc3QgU0xBU0hfUkUgPSAvXFwvL2c7IC8vICUyRlxyXG5jb25zdCBFUVVBTF9SRSA9IC89L2c7IC8vICUzRFxyXG5jb25zdCBJTV9SRSA9IC9cXD8vZzsgLy8gJTNGXHJcbmNvbnN0IFBMVVNfUkUgPSAvXFwrL2c7IC8vICUyQlxyXG4vKipcclxuICogTk9URTogSXQncyBub3QgY2xlYXIgdG8gbWUgaWYgd2Ugc2hvdWxkIGVuY29kZSB0aGUgKyBzeW1ib2wgaW4gcXVlcmllcywgaXRcclxuICogc2VlbXMgdG8gYmUgbGVzcyBmbGV4aWJsZSB0aGFuIG5vdCBkb2luZyBzbyBhbmQgSSBjYW4ndCBmaW5kIG91dCB0aGUgbGVnYWN5XHJcbiAqIHN5c3RlbXMgcmVxdWlyaW5nIHRoaXMgZm9yIHJlZ3VsYXIgcmVxdWVzdHMgbGlrZSB0ZXh0L2h0bWwuIEluIHRoZSBzdGFuZGFyZCxcclxuICogdGhlIGVuY29kaW5nIG9mIHRoZSBwbHVzIGNoYXJhY3RlciBpcyBvbmx5IG1lbnRpb25lZCBmb3JcclxuICogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXHJcbiAqIChodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybGVuY29kZWQtcGFyc2luZykgYW5kIG1vc3QgYnJvd3NlcnMgc2VlbXMgbG9cclxuICogbGVhdmUgdGhlIHBsdXMgY2hhcmFjdGVyIGFzIGlzIGluIHF1ZXJpZXMuIFRvIGJlIG1vcmUgZmxleGlibGUsIHdlIGFsbG93IHRoZVxyXG4gKiBwbHVzIGNoYXJhY3RlciBvbiB0aGUgcXVlcnksIGJ1dCBpdCBjYW4gYWxzbyBiZSBtYW51YWxseSBlbmNvZGVkIGJ5IHRoZSB1c2VyLlxyXG4gKlxyXG4gKiBSZXNvdXJjZXM6XHJcbiAqIC0gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmxlbmNvZGVkLXBhcnNpbmdcclxuICogLSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNjM0MjcxL3VybC1lbmNvZGluZy10aGUtc3BhY2UtY2hhcmFjdGVyLW9yLTIwXHJcbiAqL1xyXG5jb25zdCBFTkNfQlJBQ0tFVF9PUEVOX1JFID0gLyU1Qi9nOyAvLyBbXHJcbmNvbnN0IEVOQ19CUkFDS0VUX0NMT1NFX1JFID0gLyU1RC9nOyAvLyBdXHJcbmNvbnN0IEVOQ19DQVJFVF9SRSA9IC8lNUUvZzsgLy8gXlxyXG5jb25zdCBFTkNfQkFDS1RJQ0tfUkUgPSAvJTYwL2c7IC8vIGBcclxuY29uc3QgRU5DX0NVUkxZX09QRU5fUkUgPSAvJTdCL2c7IC8vIHtcclxuY29uc3QgRU5DX1BJUEVfUkUgPSAvJTdDL2c7IC8vIHxcclxuY29uc3QgRU5DX0NVUkxZX0NMT1NFX1JFID0gLyU3RC9nOyAvLyB9XHJcbmNvbnN0IEVOQ19TUEFDRV9SRSA9IC8lMjAvZzsgLy8gfVxyXG4vKipcclxuICogRW5jb2RlIGNoYXJhY3RlcnMgdGhhdCBuZWVkIHRvIGJlIGVuY29kZWQgb24gdGhlIHBhdGgsIHNlYXJjaCBhbmQgaGFzaFxyXG4gKiBzZWN0aW9ucyBvZiB0aGUgVVJMLlxyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICogQHBhcmFtIHRleHQgLSBzdHJpbmcgdG8gZW5jb2RlXHJcbiAqIEByZXR1cm5zIGVuY29kZWQgc3RyaW5nXHJcbiAqL1xyXG5mdW5jdGlvbiBjb21tb25FbmNvZGUodGV4dCkge1xyXG4gICAgcmV0dXJuIGVuY29kZVVSSSgnJyArIHRleHQpXHJcbiAgICAgICAgLnJlcGxhY2UoRU5DX1BJUEVfUkUsICd8JylcclxuICAgICAgICAucmVwbGFjZShFTkNfQlJBQ0tFVF9PUEVOX1JFLCAnWycpXHJcbiAgICAgICAgLnJlcGxhY2UoRU5DX0JSQUNLRVRfQ0xPU0VfUkUsICddJyk7XHJcbn1cclxuLyoqXHJcbiAqIEVuY29kZSBjaGFyYWN0ZXJzIHRoYXQgbmVlZCB0byBiZSBlbmNvZGVkIG9uIHRoZSBoYXNoIHNlY3Rpb24gb2YgdGhlIFVSTC5cclxuICpcclxuICogQHBhcmFtIHRleHQgLSBzdHJpbmcgdG8gZW5jb2RlXHJcbiAqIEByZXR1cm5zIGVuY29kZWQgc3RyaW5nXHJcbiAqL1xyXG5mdW5jdGlvbiBlbmNvZGVIYXNoKHRleHQpIHtcclxuICAgIHJldHVybiBjb21tb25FbmNvZGUodGV4dClcclxuICAgICAgICAucmVwbGFjZShFTkNfQ1VSTFlfT1BFTl9SRSwgJ3snKVxyXG4gICAgICAgIC5yZXBsYWNlKEVOQ19DVVJMWV9DTE9TRV9SRSwgJ30nKVxyXG4gICAgICAgIC5yZXBsYWNlKEVOQ19DQVJFVF9SRSwgJ14nKTtcclxufVxyXG4vKipcclxuICogRW5jb2RlIGNoYXJhY3RlcnMgdGhhdCBuZWVkIHRvIGJlIGVuY29kZWQgcXVlcnkgdmFsdWVzIG9uIHRoZSBxdWVyeVxyXG4gKiBzZWN0aW9uIG9mIHRoZSBVUkwuXHJcbiAqXHJcbiAqIEBwYXJhbSB0ZXh0IC0gc3RyaW5nIHRvIGVuY29kZVxyXG4gKiBAcmV0dXJucyBlbmNvZGVkIHN0cmluZ1xyXG4gKi9cclxuZnVuY3Rpb24gZW5jb2RlUXVlcnlWYWx1ZSh0ZXh0KSB7XHJcbiAgICByZXR1cm4gKGNvbW1vbkVuY29kZSh0ZXh0KVxyXG4gICAgICAgIC8vIEVuY29kZSB0aGUgc3BhY2UgYXMgKywgZW5jb2RlIHRoZSArIHRvIGRpZmZlcmVudGlhdGUgaXQgZnJvbSB0aGUgc3BhY2VcclxuICAgICAgICAucmVwbGFjZShQTFVTX1JFLCAnJTJCJylcclxuICAgICAgICAucmVwbGFjZShFTkNfU1BBQ0VfUkUsICcrJylcclxuICAgICAgICAucmVwbGFjZShIQVNIX1JFLCAnJTIzJylcclxuICAgICAgICAucmVwbGFjZShBTVBFUlNBTkRfUkUsICclMjYnKVxyXG4gICAgICAgIC5yZXBsYWNlKEVOQ19CQUNLVElDS19SRSwgJ2AnKVxyXG4gICAgICAgIC5yZXBsYWNlKEVOQ19DVVJMWV9PUEVOX1JFLCAneycpXHJcbiAgICAgICAgLnJlcGxhY2UoRU5DX0NVUkxZX0NMT1NFX1JFLCAnfScpXHJcbiAgICAgICAgLnJlcGxhY2UoRU5DX0NBUkVUX1JFLCAnXicpKTtcclxufVxyXG4vKipcclxuICogTGlrZSBgZW5jb2RlUXVlcnlWYWx1ZWAgYnV0IGFsc28gZW5jb2RlcyB0aGUgYD1gIGNoYXJhY3Rlci5cclxuICpcclxuICogQHBhcmFtIHRleHQgLSBzdHJpbmcgdG8gZW5jb2RlXHJcbiAqL1xyXG5mdW5jdGlvbiBlbmNvZGVRdWVyeUtleSh0ZXh0KSB7XHJcbiAgICByZXR1cm4gZW5jb2RlUXVlcnlWYWx1ZSh0ZXh0KS5yZXBsYWNlKEVRVUFMX1JFLCAnJTNEJyk7XHJcbn1cclxuLyoqXHJcbiAqIEVuY29kZSBjaGFyYWN0ZXJzIHRoYXQgbmVlZCB0byBiZSBlbmNvZGVkIG9uIHRoZSBwYXRoIHNlY3Rpb24gb2YgdGhlIFVSTC5cclxuICpcclxuICogQHBhcmFtIHRleHQgLSBzdHJpbmcgdG8gZW5jb2RlXHJcbiAqIEByZXR1cm5zIGVuY29kZWQgc3RyaW5nXHJcbiAqL1xyXG5mdW5jdGlvbiBlbmNvZGVQYXRoKHRleHQpIHtcclxuICAgIHJldHVybiBjb21tb25FbmNvZGUodGV4dCkucmVwbGFjZShIQVNIX1JFLCAnJTIzJykucmVwbGFjZShJTV9SRSwgJyUzRicpO1xyXG59XHJcbi8qKlxyXG4gKiBFbmNvZGUgY2hhcmFjdGVycyB0aGF0IG5lZWQgdG8gYmUgZW5jb2RlZCBvbiB0aGUgcGF0aCBzZWN0aW9uIG9mIHRoZSBVUkwgYXMgYVxyXG4gKiBwYXJhbS4gVGhpcyBmdW5jdGlvbiBlbmNvZGVzIGV2ZXJ5dGhpbmcge0BsaW5rIGVuY29kZVBhdGh9IGRvZXMgcGx1cyB0aGVcclxuICogc2xhc2ggKGAvYCkgY2hhcmFjdGVyLiBJZiBgdGV4dGAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLCByZXR1cm5zIGFuIGVtcHR5XHJcbiAqIHN0cmluZyBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAcGFyYW0gdGV4dCAtIHN0cmluZyB0byBlbmNvZGVcclxuICogQHJldHVybnMgZW5jb2RlZCBzdHJpbmdcclxuICovXHJcbmZ1bmN0aW9uIGVuY29kZVBhcmFtKHRleHQpIHtcclxuICAgIHJldHVybiB0ZXh0ID09IG51bGwgPyAnJyA6IGVuY29kZVBhdGgodGV4dCkucmVwbGFjZShTTEFTSF9SRSwgJyUyRicpO1xyXG59XHJcbi8qKlxyXG4gKiBEZWNvZGUgdGV4dCB1c2luZyBgZGVjb2RlVVJJQ29tcG9uZW50YC4gUmV0dXJucyB0aGUgb3JpZ2luYWwgdGV4dCBpZiBpdFxyXG4gKiBmYWlscy5cclxuICpcclxuICogQHBhcmFtIHRleHQgLSBzdHJpbmcgdG8gZGVjb2RlXHJcbiAqIEByZXR1cm5zIGRlY29kZWQgc3RyaW5nXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWNvZGUodGV4dCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KCcnICsgdGV4dCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIHdhcm4oYEVycm9yIGRlY29kaW5nIFwiJHt0ZXh0fVwiLiBVc2luZyBvcmlnaW5hbCB2YWx1ZWApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnICsgdGV4dDtcclxufVxuXG4vKipcclxuICogVHJhbnNmb3JtcyBhIHF1ZXJ5U3RyaW5nIGludG8gYSB7QGxpbmsgTG9jYXRpb25RdWVyeX0gb2JqZWN0LiBBY2NlcHQgYm90aCwgYVxyXG4gKiB2ZXJzaW9uIHdpdGggdGhlIGxlYWRpbmcgYD9gIGFuZCB3aXRob3V0IFNob3VsZCB3b3JrIGFzIFVSTFNlYXJjaFBhcmFtc1xyXG5cbiAqIEBpbnRlcm5hbFxyXG4gKlxyXG4gKiBAcGFyYW0gc2VhcmNoIC0gc2VhcmNoIHN0cmluZyB0byBwYXJzZVxyXG4gKiBAcmV0dXJucyBhIHF1ZXJ5IG9iamVjdFxyXG4gKi9cclxuZnVuY3Rpb24gcGFyc2VRdWVyeShzZWFyY2gpIHtcclxuICAgIGNvbnN0IHF1ZXJ5ID0ge307XHJcbiAgICAvLyBhdm9pZCBjcmVhdGluZyBhbiBvYmplY3Qgd2l0aCBhbiBlbXB0eSBrZXkgYW5kIGVtcHR5IHZhbHVlXHJcbiAgICAvLyBiZWNhdXNlIG9mIHNwbGl0KCcmJylcclxuICAgIGlmIChzZWFyY2ggPT09ICcnIHx8IHNlYXJjaCA9PT0gJz8nKVxyXG4gICAgICAgIHJldHVybiBxdWVyeTtcclxuICAgIGNvbnN0IGhhc0xlYWRpbmdJTSA9IHNlYXJjaFswXSA9PT0gJz8nO1xyXG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gKGhhc0xlYWRpbmdJTSA/IHNlYXJjaC5zbGljZSgxKSA6IHNlYXJjaCkuc3BsaXQoJyYnKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoUGFyYW1zLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgLy8gcHJlIGRlY29kZSB0aGUgKyBpbnRvIHNwYWNlXHJcbiAgICAgICAgY29uc3Qgc2VhcmNoUGFyYW0gPSBzZWFyY2hQYXJhbXNbaV0ucmVwbGFjZShQTFVTX1JFLCAnICcpO1xyXG4gICAgICAgIC8vIGFsbG93IHRoZSA9IGNoYXJhY3RlclxyXG4gICAgICAgIGNvbnN0IGVxUG9zID0gc2VhcmNoUGFyYW0uaW5kZXhPZignPScpO1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGRlY29kZShlcVBvcyA8IDAgPyBzZWFyY2hQYXJhbSA6IHNlYXJjaFBhcmFtLnNsaWNlKDAsIGVxUG9zKSk7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBlcVBvcyA8IDAgPyBudWxsIDogZGVjb2RlKHNlYXJjaFBhcmFtLnNsaWNlKGVxUG9zICsgMSkpO1xyXG4gICAgICAgIGlmIChrZXkgaW4gcXVlcnkpIHtcclxuICAgICAgICAgICAgLy8gYW4gZXh0cmEgdmFyaWFibGUgZm9yIHRzIHR5cGVzXHJcbiAgICAgICAgICAgIGxldCBjdXJyZW50VmFsdWUgPSBxdWVyeVtrZXldO1xyXG4gICAgICAgICAgICBpZiAoIWlzQXJyYXkoY3VycmVudFZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFZhbHVlID0gcXVlcnlba2V5XSA9IFtjdXJyZW50VmFsdWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZS5wdXNoKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5W2tleV0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcXVlcnk7XHJcbn1cclxuLyoqXHJcbiAqIFN0cmluZ2lmaWVzIGEge0BsaW5rIExvY2F0aW9uUXVlcnlSYXd9IG9iamVjdC4gTGlrZSBgVVJMU2VhcmNoUGFyYW1zYCwgaXRcclxuICogZG9lc24ndCBwcmVwZW5kIGEgYD9gXHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKlxyXG4gKiBAcGFyYW0gcXVlcnkgLSBxdWVyeSBvYmplY3QgdG8gc3RyaW5naWZ5XHJcbiAqIEByZXR1cm5zIHN0cmluZyB2ZXJzaW9uIG9mIHRoZSBxdWVyeSB3aXRob3V0IHRoZSBsZWFkaW5nIGA/YFxyXG4gKi9cclxuZnVuY3Rpb24gc3RyaW5naWZ5UXVlcnkocXVlcnkpIHtcclxuICAgIGxldCBzZWFyY2ggPSAnJztcclxuICAgIGZvciAobGV0IGtleSBpbiBxdWVyeSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcXVlcnlba2V5XTtcclxuICAgICAgICBrZXkgPSBlbmNvZGVRdWVyeUtleShrZXkpO1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIG9ubHkgbnVsbCBhZGRzIHRoZSB2YWx1ZVxyXG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgc2VhcmNoICs9IChzZWFyY2gubGVuZ3RoID8gJyYnIDogJycpICsga2V5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBrZWVwIG51bGwgdmFsdWVzXHJcbiAgICAgICAgY29uc3QgdmFsdWVzID0gaXNBcnJheSh2YWx1ZSlcclxuICAgICAgICAgICAgPyB2YWx1ZS5tYXAodiA9PiB2ICYmIGVuY29kZVF1ZXJ5VmFsdWUodikpXHJcbiAgICAgICAgICAgIDogW3ZhbHVlICYmIGVuY29kZVF1ZXJ5VmFsdWUodmFsdWUpXTtcclxuICAgICAgICB2YWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIC8vIHNraXAgdW5kZWZpbmVkIHZhbHVlcyBpbiBhcnJheXMgYXMgaWYgdGhleSB3ZXJlIG5vdCBwcmVzZW50XHJcbiAgICAgICAgICAgIC8vIHNtYWxsZXIgY29kZSB0aGFuIHVzaW5nIGZpbHRlclxyXG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gb25seSBhcHBlbmQgJiB3aXRoIG5vbi1lbXB0eSBzZWFyY2hcclxuICAgICAgICAgICAgICAgIHNlYXJjaCArPSAoc2VhcmNoLmxlbmd0aCA/ICcmJyA6ICcnKSArIGtleTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaCArPSAnPScgKyB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlYXJjaDtcclxufVxyXG4vKipcclxuICogVHJhbnNmb3JtcyBhIHtAbGluayBMb2NhdGlvblF1ZXJ5UmF3fSBpbnRvIGEge0BsaW5rIExvY2F0aW9uUXVlcnl9IGJ5IGNhc3RpbmdcclxuICogbnVtYmVycyBpbnRvIHN0cmluZ3MsIHJlbW92aW5nIGtleXMgd2l0aCBhbiB1bmRlZmluZWQgdmFsdWUgYW5kIHJlcGxhY2luZ1xyXG4gKiB1bmRlZmluZWQgd2l0aCBudWxsIGluIGFycmF5c1xyXG4gKlxyXG4gKiBAcGFyYW0gcXVlcnkgLSBxdWVyeSBvYmplY3QgdG8gbm9ybWFsaXplXHJcbiAqIEByZXR1cm5zIGEgbm9ybWFsaXplZCBxdWVyeSBvYmplY3RcclxuICovXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZVF1ZXJ5KHF1ZXJ5KSB7XHJcbiAgICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSB7fTtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIHF1ZXJ5KSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBxdWVyeVtrZXldO1xyXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRRdWVyeVtrZXldID0gaXNBcnJheSh2YWx1ZSlcclxuICAgICAgICAgICAgICAgID8gdmFsdWUubWFwKHYgPT4gKHYgPT0gbnVsbCA/IG51bGwgOiAnJyArIHYpKVxyXG4gICAgICAgICAgICAgICAgOiB2YWx1ZSA9PSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgPyB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgIDogJycgKyB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbm9ybWFsaXplZFF1ZXJ5O1xyXG59XG5cbi8qKlxyXG4gKiBSb3V0ZVJlY29yZCBiZWluZyByZW5kZXJlZCBieSB0aGUgY2xvc2VzdCBhbmNlc3RvciBSb3V0ZXIgVmlldy4gVXNlZCBmb3JcclxuICogYG9uQmVmb3JlUm91dGVVcGRhdGVgIGFuZCBgb25CZWZvcmVSb3V0ZUxlYXZlYC4gcnZsbSBzdGFuZHMgZm9yIFJvdXRlciBWaWV3XHJcbiAqIExvY2F0aW9uIE1hdGNoZWRcclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jb25zdCBtYXRjaGVkUm91dGVLZXkgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gJ3JvdXRlciB2aWV3IGxvY2F0aW9uIG1hdGNoZWQnIDogJycpO1xyXG4vKipcclxuICogQWxsb3dzIG92ZXJyaWRpbmcgdGhlIHJvdXRlciB2aWV3IGRlcHRoIHRvIGNvbnRyb2wgd2hpY2ggY29tcG9uZW50IGluXHJcbiAqIGBtYXRjaGVkYCBpcyByZW5kZXJlZC4gcnZkIHN0YW5kcyBmb3IgUm91dGVyIFZpZXcgRGVwdGhcclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jb25zdCB2aWV3RGVwdGhLZXkgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gJ3JvdXRlciB2aWV3IGRlcHRoJyA6ICcnKTtcclxuLyoqXHJcbiAqIEFsbG93cyBvdmVycmlkaW5nIHRoZSByb3V0ZXIgaW5zdGFuY2UgcmV0dXJuZWQgYnkgYHVzZVJvdXRlcmAgaW4gdGVzdHMuIHJcclxuICogc3RhbmRzIGZvciByb3V0ZXJcclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jb25zdCByb3V0ZXJLZXkgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gJ3JvdXRlcicgOiAnJyk7XHJcbi8qKlxyXG4gKiBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgY3VycmVudCByb3V0ZSByZXR1cm5lZCBieSBgdXNlUm91dGVgIGluIHRlc3RzLiBybFxyXG4gKiBzdGFuZHMgZm9yIHJvdXRlIGxvY2F0aW9uXHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuY29uc3Qgcm91dGVMb2NhdGlvbktleSA9IFN5bWJvbCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgPyAncm91dGUgbG9jYXRpb24nIDogJycpO1xyXG4vKipcclxuICogQWxsb3dzIG92ZXJyaWRpbmcgdGhlIGN1cnJlbnQgcm91dGUgdXNlZCBieSByb3V0ZXItdmlldy4gSW50ZXJuYWxseSB0aGlzIGlzXHJcbiAqIHVzZWQgd2hlbiB0aGUgYHJvdXRlYCBwcm9wIGlzIHBhc3NlZC5cclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jb25zdCByb3V0ZXJWaWV3TG9jYXRpb25LZXkgPSBTeW1ib2woKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpID8gJ3JvdXRlciB2aWV3IGxvY2F0aW9uJyA6ICcnKTtcblxuLyoqXHJcbiAqIENyZWF0ZSBhIGxpc3Qgb2YgY2FsbGJhY2tzIHRoYXQgY2FuIGJlIHJlc2V0LiBVc2VkIHRvIGNyZWF0ZSBiZWZvcmUgYW5kIGFmdGVyIG5hdmlnYXRpb24gZ3VhcmRzIGxpc3RcclxuICovXHJcbmZ1bmN0aW9uIHVzZUNhbGxiYWNrcygpIHtcclxuICAgIGxldCBoYW5kbGVycyA9IFtdO1xyXG4gICAgZnVuY3Rpb24gYWRkKGhhbmRsZXIpIHtcclxuICAgICAgICBoYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGkgPSBoYW5kbGVycy5pbmRleE9mKGhhbmRsZXIpO1xyXG4gICAgICAgICAgICBpZiAoaSA+IC0xKVxyXG4gICAgICAgICAgICAgICAgaGFuZGxlcnMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiByZXNldCgpIHtcclxuICAgICAgICBoYW5kbGVycyA9IFtdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBhZGQsXHJcbiAgICAgICAgbGlzdDogKCkgPT4gaGFuZGxlcnMsXHJcbiAgICAgICAgcmVzZXQsXHJcbiAgICB9O1xyXG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyR3VhcmQocmVjb3JkLCBuYW1lLCBndWFyZCkge1xyXG4gICAgY29uc3QgcmVtb3ZlRnJvbUxpc3QgPSAoKSA9PiB7XHJcbiAgICAgICAgcmVjb3JkW25hbWVdLmRlbGV0ZShndWFyZCk7XHJcbiAgICB9O1xyXG4gICAgb25Vbm1vdW50ZWQocmVtb3ZlRnJvbUxpc3QpO1xyXG4gICAgb25EZWFjdGl2YXRlZChyZW1vdmVGcm9tTGlzdCk7XHJcbiAgICBvbkFjdGl2YXRlZCgoKSA9PiB7XHJcbiAgICAgICAgcmVjb3JkW25hbWVdLmFkZChndWFyZCk7XHJcbiAgICB9KTtcclxuICAgIHJlY29yZFtuYW1lXS5hZGQoZ3VhcmQpO1xyXG59XHJcbi8qKlxyXG4gKiBBZGQgYSBuYXZpZ2F0aW9uIGd1YXJkIHRoYXQgdHJpZ2dlcnMgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBmb3IgdGhlIGN1cnJlbnRcclxuICogbG9jYXRpb24gaXMgYWJvdXQgdG8gYmUgbGVmdC4gU2ltaWxhciB0byB7QGxpbmsgYmVmb3JlUm91dGVMZWF2ZX0gYnV0IGNhbiBiZVxyXG4gKiB1c2VkIGluIGFueSBjb21wb25lbnQuIFRoZSBndWFyZCBpcyByZW1vdmVkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyB1bm1vdW50ZWQuXHJcbiAqXHJcbiAqIEBwYXJhbSBsZWF2ZUd1YXJkIC0ge0BsaW5rIE5hdmlnYXRpb25HdWFyZH1cclxuICovXHJcbmZ1bmN0aW9uIG9uQmVmb3JlUm91dGVMZWF2ZShsZWF2ZUd1YXJkKSB7XHJcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmICFnZXRDdXJyZW50SW5zdGFuY2UoKSkge1xyXG4gICAgICAgIHdhcm4oJ2dldEN1cnJlbnRJbnN0YW5jZSgpIHJldHVybmVkIG51bGwuIG9uQmVmb3JlUm91dGVMZWF2ZSgpIG11c3QgYmUgY2FsbGVkIGF0IHRoZSB0b3Agb2YgYSBzZXR1cCBmdW5jdGlvbicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGFjdGl2ZVJlY29yZCA9IGluamVjdChtYXRjaGVkUm91dGVLZXksIFxyXG4gICAgLy8gdG8gYXZvaWQgd2FybmluZ1xyXG4gICAge30pLnZhbHVlO1xyXG4gICAgaWYgKCFhY3RpdmVSZWNvcmQpIHtcclxuICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiZcclxuICAgICAgICAgICAgd2FybignTm8gYWN0aXZlIHJvdXRlIHJlY29yZCB3YXMgZm91bmQgd2hlbiBjYWxsaW5nIGBvbkJlZm9yZVJvdXRlTGVhdmUoKWAuIE1ha2Ugc3VyZSB5b3UgY2FsbCB0aGlzIGZ1bmN0aW9uIGluc2lkZSBhIGNvbXBvbmVudCBjaGlsZCBvZiA8cm91dGVyLXZpZXc+LiBNYXliZSB5b3UgY2FsbGVkIGl0IGluc2lkZSBvZiBBcHAudnVlPycpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHJlZ2lzdGVyR3VhcmQoYWN0aXZlUmVjb3JkLCAnbGVhdmVHdWFyZHMnLCBsZWF2ZUd1YXJkKTtcclxufVxyXG4vKipcclxuICogQWRkIGEgbmF2aWdhdGlvbiBndWFyZCB0aGF0IHRyaWdnZXJzIHdoZW5ldmVyIHRoZSBjdXJyZW50IGxvY2F0aW9uIGlzIGFib3V0XHJcbiAqIHRvIGJlIHVwZGF0ZWQuIFNpbWlsYXIgdG8ge0BsaW5rIGJlZm9yZVJvdXRlVXBkYXRlfSBidXQgY2FuIGJlIHVzZWQgaW4gYW55XHJcbiAqIGNvbXBvbmVudC4gVGhlIGd1YXJkIGlzIHJlbW92ZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIHVubW91bnRlZC5cclxuICpcclxuICogQHBhcmFtIHVwZGF0ZUd1YXJkIC0ge0BsaW5rIE5hdmlnYXRpb25HdWFyZH1cclxuICovXHJcbmZ1bmN0aW9uIG9uQmVmb3JlUm91dGVVcGRhdGUodXBkYXRlR3VhcmQpIHtcclxuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIWdldEN1cnJlbnRJbnN0YW5jZSgpKSB7XHJcbiAgICAgICAgd2FybignZ2V0Q3VycmVudEluc3RhbmNlKCkgcmV0dXJuZWQgbnVsbC4gb25CZWZvcmVSb3V0ZVVwZGF0ZSgpIG11c3QgYmUgY2FsbGVkIGF0IHRoZSB0b3Agb2YgYSBzZXR1cCBmdW5jdGlvbicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGFjdGl2ZVJlY29yZCA9IGluamVjdChtYXRjaGVkUm91dGVLZXksIFxyXG4gICAgLy8gdG8gYXZvaWQgd2FybmluZ1xyXG4gICAge30pLnZhbHVlO1xyXG4gICAgaWYgKCFhY3RpdmVSZWNvcmQpIHtcclxuICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiZcclxuICAgICAgICAgICAgd2FybignTm8gYWN0aXZlIHJvdXRlIHJlY29yZCB3YXMgZm91bmQgd2hlbiBjYWxsaW5nIGBvbkJlZm9yZVJvdXRlVXBkYXRlKClgLiBNYWtlIHN1cmUgeW91IGNhbGwgdGhpcyBmdW5jdGlvbiBpbnNpZGUgYSBjb21wb25lbnQgY2hpbGQgb2YgPHJvdXRlci12aWV3Pi4gTWF5YmUgeW91IGNhbGxlZCBpdCBpbnNpZGUgb2YgQXBwLnZ1ZT8nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICByZWdpc3Rlckd1YXJkKGFjdGl2ZVJlY29yZCwgJ3VwZGF0ZUd1YXJkcycsIHVwZGF0ZUd1YXJkKTtcclxufVxyXG5mdW5jdGlvbiBndWFyZFRvUHJvbWlzZUZuKGd1YXJkLCB0bywgZnJvbSwgcmVjb3JkLCBuYW1lKSB7XHJcbiAgICAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBlbnRlckNhbGxiYWNrQXJyYXkgdG8gcHJldmVudCBwdXNoaW5nIGNhbGxiYWNrcyBpZiBhIG5ldyBuYXZpZ2F0aW9uIHRvb2sgcGxhY2VcclxuICAgIGNvbnN0IGVudGVyQ2FsbGJhY2tBcnJheSA9IHJlY29yZCAmJlxyXG4gICAgICAgIC8vIG5hbWUgaXMgZGVmaW5lZCBpZiByZWNvcmQgaXMgYmVjYXVzZSBvZiB0aGUgZnVuY3Rpb24gb3ZlcmxvYWRcclxuICAgICAgICAocmVjb3JkLmVudGVyQ2FsbGJhY2tzW25hbWVdID0gcmVjb3JkLmVudGVyQ2FsbGJhY2tzW25hbWVdIHx8IFtdKTtcclxuICAgIHJldHVybiAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbmV4dCA9ICh2YWxpZCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodmFsaWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoY3JlYXRlUm91dGVyRXJyb3IoNCAvKiBFcnJvclR5cGVzLk5BVklHQVRJT05fQUJPUlRFRCAqLywge1xyXG4gICAgICAgICAgICAgICAgICAgIGZyb20sXHJcbiAgICAgICAgICAgICAgICAgICAgdG8sXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsaWQgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KHZhbGlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChpc1JvdXRlTG9jYXRpb24odmFsaWQpKSB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoY3JlYXRlUm91dGVyRXJyb3IoMiAvKiBFcnJvclR5cGVzLk5BVklHQVRJT05fR1VBUkRfUkVESVJFQ1QgKi8sIHtcclxuICAgICAgICAgICAgICAgICAgICBmcm9tOiB0byxcclxuICAgICAgICAgICAgICAgICAgICB0bzogdmFsaWQsXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZW50ZXJDYWxsYmFja0FycmF5ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgZW50ZXJDYWxsYmFja0FycmF5IGlzIHRydXRoeSwgYm90aCByZWNvcmQgYW5kIG5hbWUgYWxzbyBhcmVcclxuICAgICAgICAgICAgICAgICAgICByZWNvcmQuZW50ZXJDYWxsYmFja3NbbmFtZV0gPT09IGVudGVyQ2FsbGJhY2tBcnJheSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB2YWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGVudGVyQ2FsbGJhY2tBcnJheS5wdXNoKHZhbGlkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gd3JhcHBpbmcgd2l0aCBQcm9taXNlLnJlc29sdmUgYWxsb3dzIGl0IHRvIHdvcmsgd2l0aCBib3RoIGFzeW5jIGFuZCBzeW5jIGd1YXJkc1xyXG4gICAgICAgIGNvbnN0IGd1YXJkUmV0dXJuID0gZ3VhcmQuY2FsbChyZWNvcmQgJiYgcmVjb3JkLmluc3RhbmNlc1tuYW1lXSwgdG8sIGZyb20sIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSA/IGNhbk9ubHlCZUNhbGxlZE9uY2UobmV4dCwgdG8sIGZyb20pIDogbmV4dCk7XHJcbiAgICAgICAgbGV0IGd1YXJkQ2FsbCA9IFByb21pc2UucmVzb2x2ZShndWFyZFJldHVybik7XHJcbiAgICAgICAgaWYgKGd1YXJkLmxlbmd0aCA8IDMpXHJcbiAgICAgICAgICAgIGd1YXJkQ2FsbCA9IGd1YXJkQ2FsbC50aGVuKG5leHQpO1xyXG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgZ3VhcmQubGVuZ3RoID4gMikge1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYFRoZSBcIm5leHRcIiBjYWxsYmFjayB3YXMgbmV2ZXIgY2FsbGVkIGluc2lkZSBvZiAke2d1YXJkLm5hbWUgPyAnXCInICsgZ3VhcmQubmFtZSArICdcIicgOiAnJ306XFxuJHtndWFyZC50b1N0cmluZygpfVxcbi4gSWYgeW91IGFyZSByZXR1cm5pbmcgYSB2YWx1ZSBpbnN0ZWFkIG9mIGNhbGxpbmcgXCJuZXh0XCIsIG1ha2Ugc3VyZSB0byByZW1vdmUgdGhlIFwibmV4dFwiIHBhcmFtZXRlciBmcm9tIHlvdXIgZnVuY3Rpb24uYDtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBndWFyZFJldHVybiA9PT0gJ29iamVjdCcgJiYgJ3RoZW4nIGluIGd1YXJkUmV0dXJuKSB7XHJcbiAgICAgICAgICAgICAgICBndWFyZENhbGwgPSBndWFyZENhbGwudGhlbihyZXNvbHZlZFZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBfY2FsbGVkIGlzIGFkZGVkIGF0IGNhbk9ubHlCZUNhbGxlZE9uY2VcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHQuX2NhbGxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3YXJuKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdJbnZhbGlkIG5hdmlnYXRpb24gZ3VhcmQnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZ3VhcmRSZXR1cm4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogX2NhbGxlZCBpcyBhZGRlZCBhdCBjYW5Pbmx5QmVDYWxsZWRPbmNlXHJcbiAgICAgICAgICAgICAgICBpZiAoIW5leHQuX2NhbGxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdhcm4obWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignSW52YWxpZCBuYXZpZ2F0aW9uIGd1YXJkJykpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBndWFyZENhbGwuY2F0Y2goZXJyID0+IHJlamVjdChlcnIpKTtcclxuICAgIH0pO1xyXG59XHJcbmZ1bmN0aW9uIGNhbk9ubHlCZUNhbGxlZE9uY2UobmV4dCwgdG8sIGZyb20pIHtcclxuICAgIGxldCBjYWxsZWQgPSAwO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoY2FsbGVkKysgPT09IDEpXHJcbiAgICAgICAgICAgIHdhcm4oYFRoZSBcIm5leHRcIiBjYWxsYmFjayB3YXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGluIG9uZSBuYXZpZ2F0aW9uIGd1YXJkIHdoZW4gZ29pbmcgZnJvbSBcIiR7ZnJvbS5mdWxsUGF0aH1cIiB0byBcIiR7dG8uZnVsbFBhdGh9XCIuIEl0IHNob3VsZCBiZSBjYWxsZWQgZXhhY3RseSBvbmUgdGltZSBpbiBlYWNoIG5hdmlnYXRpb24gZ3VhcmQuIFRoaXMgd2lsbCBmYWlsIGluIHByb2R1Y3Rpb24uYCk7XHJcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogd2UgcHV0IGl0IGluIHRoZSBvcmlnaW5hbCBvbmUgYmVjYXVzZSBpdCdzIGVhc2llciB0byBjaGVja1xyXG4gICAgICAgIG5leHQuX2NhbGxlZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNhbGxlZCA9PT0gMSlcclxuICAgICAgICAgICAgbmV4dC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xyXG4gICAgfTtcclxufVxyXG5mdW5jdGlvbiBleHRyYWN0Q29tcG9uZW50c0d1YXJkcyhtYXRjaGVkLCBndWFyZFR5cGUsIHRvLCBmcm9tKSB7XHJcbiAgICBjb25zdCBndWFyZHMgPSBbXTtcclxuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIG1hdGNoZWQpIHtcclxuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmICFyZWNvcmQuY29tcG9uZW50cyAmJiAhcmVjb3JkLmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB3YXJuKGBSZWNvcmQgd2l0aCBwYXRoIFwiJHtyZWNvcmQucGF0aH1cIiBpcyBlaXRoZXIgbWlzc2luZyBhIFwiY29tcG9uZW50KHMpXCJgICtcclxuICAgICAgICAgICAgICAgIGAgb3IgXCJjaGlsZHJlblwiIHByb3BlcnR5LmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gcmVjb3JkLmNvbXBvbmVudHMpIHtcclxuICAgICAgICAgICAgbGV0IHJhd0NvbXBvbmVudCA9IHJlY29yZC5jb21wb25lbnRzW25hbWVdO1xyXG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXJhd0NvbXBvbmVudCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgcmF3Q29tcG9uZW50ICE9PSAnb2JqZWN0JyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcmF3Q29tcG9uZW50ICE9PSAnZnVuY3Rpb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdhcm4oYENvbXBvbmVudCBcIiR7bmFtZX1cIiBpbiByZWNvcmQgd2l0aCBwYXRoIFwiJHtyZWNvcmQucGF0aH1cIiBpcyBub3RgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYCBhIHZhbGlkIGNvbXBvbmVudC4gUmVjZWl2ZWQgXCIke1N0cmluZyhyYXdDb21wb25lbnQpfVwiLmApO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRocm93IHRvIGVuc3VyZSB3ZSBzdG9wIGhlcmUgYnV0IHdhcm4gdG8gZW5zdXJlIHRoZSBtZXNzYWdlIGlzbid0XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbWlzc2VkIGJ5IHRoZSB1c2VyXHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJvdXRlIGNvbXBvbmVudCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoJ3RoZW4nIGluIHJhd0NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdhcm4gaWYgdXNlciB3cm90ZSBpbXBvcnQoJy9jb21wb25lbnQudnVlJykgaW5zdGVhZCBvZiAoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGltcG9ydCgnLi9jb21wb25lbnQudnVlJylcclxuICAgICAgICAgICAgICAgICAgICB3YXJuKGBDb21wb25lbnQgXCIke25hbWV9XCIgaW4gcmVjb3JkIHdpdGggcGF0aCBcIiR7cmVjb3JkLnBhdGh9XCIgaXMgYSBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYFByb21pc2UgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIFByb21pc2UuIERpZCB5b3UgYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGB3cml0ZSBcImltcG9ydCgnLi9NeVBhZ2UudnVlJylcIiBpbnN0ZWFkIG9mIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgXCIoKSA9PiBpbXBvcnQoJy4vTXlQYWdlLnZ1ZScpXCIgPyBUaGlzIHdpbGwgYnJlYWsgaW4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBwcm9kdWN0aW9uIGlmIG5vdCBmaXhlZC5gKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gcmF3Q29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIHJhd0NvbXBvbmVudCA9ICgpID0+IHByb21pc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXdDb21wb25lbnQuX19hc3luY0xvYWRlciAmJlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdhcm4gb25seSBvbmNlIHBlciBjb21wb25lbnRcclxuICAgICAgICAgICAgICAgICAgICAhcmF3Q29tcG9uZW50Ll9fd2FybmVkRGVmaW5lQXN5bmMpIHtcclxuICAgICAgICAgICAgICAgICAgICByYXdDb21wb25lbnQuX193YXJuZWREZWZpbmVBc3luYyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgd2FybihgQ29tcG9uZW50IFwiJHtuYW1lfVwiIGluIHJlY29yZCB3aXRoIHBhdGggXCIke3JlY29yZC5wYXRofVwiIGlzIGRlZmluZWQgYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGB1c2luZyBcImRlZmluZUFzeW5jQ29tcG9uZW50KClcIi4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBXcml0ZSBcIigpID0+IGltcG9ydCgnLi9NeVBhZ2UudnVlJylcIiBpbnN0ZWFkIG9mIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgXCJkZWZpbmVBc3luY0NvbXBvbmVudCgoKSA9PiBpbXBvcnQoJy4vTXlQYWdlLnZ1ZScpKVwiLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHNraXAgdXBkYXRlIGFuZCBsZWF2ZSBndWFyZHMgaWYgdGhlIHJvdXRlIGNvbXBvbmVudCBpcyBub3QgbW91bnRlZFxyXG4gICAgICAgICAgICBpZiAoZ3VhcmRUeXBlICE9PSAnYmVmb3JlUm91dGVFbnRlcicgJiYgIXJlY29yZC5pbnN0YW5jZXNbbmFtZV0pXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKGlzUm91dGVDb21wb25lbnQocmF3Q29tcG9uZW50KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gX192Y2NPcHRzIGlzIGFkZGVkIGJ5IHZ1ZS1jbGFzcy1jb21wb25lbnQgYW5kIGNvbnRhaW4gdGhlIHJlZ3VsYXIgb3B0aW9uc1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHJhd0NvbXBvbmVudC5fX3ZjY09wdHMgfHwgcmF3Q29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3VhcmQgPSBvcHRpb25zW2d1YXJkVHlwZV07XHJcbiAgICAgICAgICAgICAgICBndWFyZCAmJiBndWFyZHMucHVzaChndWFyZFRvUHJvbWlzZUZuKGd1YXJkLCB0bywgZnJvbSwgcmVjb3JkLCBuYW1lKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBzdGFydCByZXF1ZXN0aW5nIHRoZSBjaHVuayBhbHJlYWR5XHJcbiAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50UHJvbWlzZSA9IHJhd0NvbXBvbmVudCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhKCdjYXRjaCcgaW4gY29tcG9uZW50UHJvbWlzZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB3YXJuKGBDb21wb25lbnQgXCIke25hbWV9XCIgaW4gcmVjb3JkIHdpdGggcGF0aCBcIiR7cmVjb3JkLnBhdGh9XCIgaXMgYSBmdW5jdGlvbiB0aGF0IGRvZXMgbm90IHJldHVybiBhIFByb21pc2UuIElmIHlvdSB3ZXJlIHBhc3NpbmcgYSBmdW5jdGlvbmFsIGNvbXBvbmVudCwgbWFrZSBzdXJlIHRvIGFkZCBhIFwiZGlzcGxheU5hbWVcIiB0byB0aGUgY29tcG9uZW50LiBUaGlzIHdpbGwgYnJlYWsgaW4gcHJvZHVjdGlvbiBpZiBub3QgZml4ZWQuYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShjb21wb25lbnRQcm9taXNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGd1YXJkcy5wdXNoKCgpID0+IGNvbXBvbmVudFByb21pc2UudGhlbihyZXNvbHZlZCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNvbHZlZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgQ291bGRuJ3QgcmVzb2x2ZSBjb21wb25lbnQgXCIke25hbWV9XCIgYXQgXCIke3JlY29yZC5wYXRofVwiYCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ29tcG9uZW50ID0gaXNFU01vZHVsZShyZXNvbHZlZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyByZXNvbHZlZC5kZWZhdWx0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcmVzb2x2ZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgcmVzb2x2ZWQgY29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkIGJlY2F1c2Ugd2Ugd2VudCBpbnRvIHRoZSBmb3IgbG9vcFxyXG4gICAgICAgICAgICAgICAgICAgIHJlY29yZC5jb21wb25lbnRzW25hbWVdID0gcmVzb2x2ZWRDb21wb25lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gX192Y2NPcHRzIGlzIGFkZGVkIGJ5IHZ1ZS1jbGFzcy1jb21wb25lbnQgYW5kIGNvbnRhaW4gdGhlIHJlZ3VsYXIgb3B0aW9uc1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSByZXNvbHZlZENvbXBvbmVudC5fX3ZjY09wdHMgfHwgcmVzb2x2ZWRDb21wb25lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VhcmQgPSBvcHRpb25zW2d1YXJkVHlwZV07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGd1YXJkICYmIGd1YXJkVG9Qcm9taXNlRm4oZ3VhcmQsIHRvLCBmcm9tLCByZWNvcmQsIG5hbWUpKCk7XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3VhcmRzO1xyXG59XHJcbi8qKlxyXG4gKiBBbGxvd3MgZGlmZmVyZW50aWF0aW5nIGxhenkgY29tcG9uZW50cyBmcm9tIGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhbmQgdnVlLWNsYXNzLWNvbXBvbmVudFxyXG4gKiBAaW50ZXJuYWxcclxuICpcclxuICogQHBhcmFtIGNvbXBvbmVudFxyXG4gKi9cclxuZnVuY3Rpb24gaXNSb3V0ZUNvbXBvbmVudChjb21wb25lbnQpIHtcclxuICAgIHJldHVybiAodHlwZW9mIGNvbXBvbmVudCA9PT0gJ29iamVjdCcgfHxcclxuICAgICAgICAnZGlzcGxheU5hbWUnIGluIGNvbXBvbmVudCB8fFxyXG4gICAgICAgICdwcm9wcycgaW4gY29tcG9uZW50IHx8XHJcbiAgICAgICAgJ19fdmNjT3B0cycgaW4gY29tcG9uZW50KTtcclxufVxyXG4vKipcclxuICogRW5zdXJlcyBhIHJvdXRlIGlzIGxvYWRlZCwgc28gaXQgY2FuIGJlIHBhc3NlZCBhcyBvIHByb3AgdG8gYDxSb3V0ZXJWaWV3PmAuXHJcbiAqXHJcbiAqIEBwYXJhbSByb3V0ZSAtIHJlc29sdmVkIHJvdXRlIHRvIGxvYWRcclxuICovXHJcbmZ1bmN0aW9uIGxvYWRSb3V0ZUxvY2F0aW9uKHJvdXRlKSB7XHJcbiAgICByZXR1cm4gcm91dGUubWF0Y2hlZC5ldmVyeShyZWNvcmQgPT4gcmVjb3JkLnJlZGlyZWN0KVxyXG4gICAgICAgID8gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdDYW5ub3QgbG9hZCBhIHJvdXRlIHRoYXQgcmVkaXJlY3RzLicpKVxyXG4gICAgICAgIDogUHJvbWlzZS5hbGwocm91dGUubWF0Y2hlZC5tYXAocmVjb3JkID0+IHJlY29yZC5jb21wb25lbnRzICYmXHJcbiAgICAgICAgICAgIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKHJlY29yZC5jb21wb25lbnRzKS5yZWR1Y2UoKHByb21pc2VzLCBuYW1lKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByYXdDb21wb25lbnQgPSByZWNvcmQuY29tcG9uZW50c1tuYW1lXTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmF3Q29tcG9uZW50ID09PSAnZnVuY3Rpb24nICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISgnZGlzcGxheU5hbWUnIGluIHJhd0NvbXBvbmVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHJhd0NvbXBvbmVudCgpLnRoZW4ocmVzb2x2ZWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgQ291bGRuJ3QgcmVzb2x2ZSBjb21wb25lbnQgXCIke25hbWV9XCIgYXQgXCIke3JlY29yZC5wYXRofVwiLiBFbnN1cmUgeW91IHBhc3NlZCBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHByb21pc2UuYCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbXBvbmVudCA9IGlzRVNNb2R1bGUocmVzb2x2ZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlc29sdmVkLmRlZmF1bHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVzb2x2ZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIHJlc29sdmVkIGNvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQgYmVjYXVzZSB3ZSB3ZW50IGludG8gdGhlIGZvciBsb29wXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC5jb21wb25lbnRzW25hbWVdID0gcmVzb2x2ZWRDb21wb25lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZXM7XHJcbiAgICAgICAgICAgIH0sIFtdKSkpKS50aGVuKCgpID0+IHJvdXRlKTtcclxufVxuXG4vLyBUT0RPOiB3ZSBjb3VsZCBhbGxvdyBjdXJyZW50Um91dGUgYXMgYSBwcm9wIHRvIGV4cG9zZSBgaXNBY3RpdmVgIGFuZFxyXG4vLyBgaXNFeGFjdEFjdGl2ZWAgYmVoYXZpb3Igc2hvdWxkIGdvIHRocm91Z2ggYW4gUkZDXHJcbmZ1bmN0aW9uIHVzZUxpbmsocHJvcHMpIHtcclxuICAgIGNvbnN0IHJvdXRlciA9IGluamVjdChyb3V0ZXJLZXkpO1xyXG4gICAgY29uc3QgY3VycmVudFJvdXRlID0gaW5qZWN0KHJvdXRlTG9jYXRpb25LZXkpO1xyXG4gICAgY29uc3Qgcm91dGUgPSBjb21wdXRlZCgoKSA9PiByb3V0ZXIucmVzb2x2ZSh1bnJlZihwcm9wcy50bykpKTtcclxuICAgIGNvbnN0IGFjdGl2ZVJlY29yZEluZGV4ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgbWF0Y2hlZCB9ID0gcm91dGUudmFsdWU7XHJcbiAgICAgICAgY29uc3QgeyBsZW5ndGggfSA9IG1hdGNoZWQ7XHJcbiAgICAgICAgY29uc3Qgcm91dGVNYXRjaGVkID0gbWF0Y2hlZFtsZW5ndGggLSAxXTtcclxuICAgICAgICBjb25zdCBjdXJyZW50TWF0Y2hlZCA9IGN1cnJlbnRSb3V0ZS5tYXRjaGVkO1xyXG4gICAgICAgIGlmICghcm91dGVNYXRjaGVkIHx8ICFjdXJyZW50TWF0Y2hlZC5sZW5ndGgpXHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGN1cnJlbnRNYXRjaGVkLmZpbmRJbmRleChpc1NhbWVSb3V0ZVJlY29yZC5iaW5kKG51bGwsIHJvdXRlTWF0Y2hlZCkpO1xyXG4gICAgICAgIGlmIChpbmRleCA+IC0xKVxyXG4gICAgICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICAgICAgLy8gcG9zc2libGUgcGFyZW50IHJlY29yZFxyXG4gICAgICAgIGNvbnN0IHBhcmVudFJlY29yZFBhdGggPSBnZXRPcmlnaW5hbFBhdGgobWF0Y2hlZFtsZW5ndGggLSAyXSk7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAvLyB3ZSBhcmUgZGVhbGluZyB3aXRoIG5lc3RlZCByb3V0ZXNcclxuICAgICAgICBsZW5ndGggPiAxICYmXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJlbnQgYW5kIG1hdGNoZWQgcm91dGUgaGF2ZSB0aGUgc2FtZSBwYXRoLCB0aGlzIGxpbmsgaXNcclxuICAgICAgICAgICAgLy8gcmVmZXJyaW5nIHRvIHRoZSBlbXB0eSBjaGlsZC4gT3Igd2UgY3VycmVudGx5IGFyZSBvbiBhIGRpZmZlcmVudFxyXG4gICAgICAgICAgICAvLyBjaGlsZCBvZiB0aGUgc2FtZSBwYXJlbnRcclxuICAgICAgICAgICAgZ2V0T3JpZ2luYWxQYXRoKHJvdXRlTWF0Y2hlZCkgPT09IHBhcmVudFJlY29yZFBhdGggJiZcclxuICAgICAgICAgICAgLy8gYXZvaWQgY29tcGFyaW5nIHRoZSBjaGlsZCB3aXRoIGl0cyBwYXJlbnRcclxuICAgICAgICAgICAgY3VycmVudE1hdGNoZWRbY3VycmVudE1hdGNoZWQubGVuZ3RoIC0gMV0ucGF0aCAhPT0gcGFyZW50UmVjb3JkUGF0aFxyXG4gICAgICAgICAgICA/IGN1cnJlbnRNYXRjaGVkLmZpbmRJbmRleChpc1NhbWVSb3V0ZVJlY29yZC5iaW5kKG51bGwsIG1hdGNoZWRbbGVuZ3RoIC0gMl0pKVxyXG4gICAgICAgICAgICA6IGluZGV4KTtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgaXNBY3RpdmUgPSBjb21wdXRlZCgoKSA9PiBhY3RpdmVSZWNvcmRJbmRleC52YWx1ZSA+IC0xICYmXHJcbiAgICAgICAgaW5jbHVkZXNQYXJhbXMoY3VycmVudFJvdXRlLnBhcmFtcywgcm91dGUudmFsdWUucGFyYW1zKSk7XHJcbiAgICBjb25zdCBpc0V4YWN0QWN0aXZlID0gY29tcHV0ZWQoKCkgPT4gYWN0aXZlUmVjb3JkSW5kZXgudmFsdWUgPiAtMSAmJlxyXG4gICAgICAgIGFjdGl2ZVJlY29yZEluZGV4LnZhbHVlID09PSBjdXJyZW50Um91dGUubWF0Y2hlZC5sZW5ndGggLSAxICYmXHJcbiAgICAgICAgaXNTYW1lUm91dGVMb2NhdGlvblBhcmFtcyhjdXJyZW50Um91dGUucGFyYW1zLCByb3V0ZS52YWx1ZS5wYXJhbXMpKTtcclxuICAgIGZ1bmN0aW9uIG5hdmlnYXRlKGUgPSB7fSkge1xyXG4gICAgICAgIGlmIChndWFyZEV2ZW50KGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByb3V0ZXJbdW5yZWYocHJvcHMucmVwbGFjZSkgPyAncmVwbGFjZScgOiAncHVzaCddKHVucmVmKHByb3BzLnRvKVxyXG4gICAgICAgICAgICAvLyBhdm9pZCB1bmNhdWdodCBlcnJvcnMgYXJlIHRoZXkgYXJlIGxvZ2dlZCBhbnl3YXlcclxuICAgICAgICAgICAgKS5jYXRjaChub29wKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG4gICAgLy8gZGV2dG9vbHMgb25seVxyXG4gICAgaWYgKCgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSAmJiBpc0Jyb3dzZXIpIHtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xyXG4gICAgICAgIGlmIChpbnN0YW5jZSkge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5rQ29udGV4dERldnRvb2xzID0ge1xyXG4gICAgICAgICAgICAgICAgcm91dGU6IHJvdXRlLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgaXNBY3RpdmU6IGlzQWN0aXZlLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgaXNFeGFjdEFjdGl2ZTogaXNFeGFjdEFjdGl2ZS52YWx1ZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogdGhpcyBpcyBpbnRlcm5hbFxyXG4gICAgICAgICAgICBpbnN0YW5jZS5fX3ZybF9kZXZ0b29scyA9IGluc3RhbmNlLl9fdnJsX2RldnRvb2xzIHx8IFtdO1xyXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiB0aGlzIGlzIGludGVybmFsXHJcbiAgICAgICAgICAgIGluc3RhbmNlLl9fdnJsX2RldnRvb2xzLnB1c2gobGlua0NvbnRleHREZXZ0b29scyk7XHJcbiAgICAgICAgICAgIHdhdGNoRWZmZWN0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxpbmtDb250ZXh0RGV2dG9vbHMucm91dGUgPSByb3V0ZS52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGxpbmtDb250ZXh0RGV2dG9vbHMuaXNBY3RpdmUgPSBpc0FjdGl2ZS52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGxpbmtDb250ZXh0RGV2dG9vbHMuaXNFeGFjdEFjdGl2ZSA9IGlzRXhhY3RBY3RpdmUudmFsdWU7XHJcbiAgICAgICAgICAgIH0sIHsgZmx1c2g6ICdwb3N0JyB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE5PVEU6IHVwZGF0ZSB7QGxpbmsgX1JvdXRlckxpbmtJfSdzIGAkc2xvdHNgIHR5cGUgd2hlbiB1cGRhdGluZyB0aGlzXHJcbiAgICAgKi9cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgcm91dGUsXHJcbiAgICAgICAgaHJlZjogY29tcHV0ZWQoKCkgPT4gcm91dGUudmFsdWUuaHJlZiksXHJcbiAgICAgICAgaXNBY3RpdmUsXHJcbiAgICAgICAgaXNFeGFjdEFjdGl2ZSxcclxuICAgICAgICBuYXZpZ2F0ZSxcclxuICAgIH07XHJcbn1cclxuY29uc3QgUm91dGVyTGlua0ltcGwgPSAvKiNfX1BVUkVfXyovIGRlZmluZUNvbXBvbmVudCh7XHJcbiAgICBuYW1lOiAnUm91dGVyTGluaycsXHJcbiAgICBjb21wYXRDb25maWc6IHsgTU9ERTogMyB9LFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgICB0bzoge1xyXG4gICAgICAgICAgICB0eXBlOiBbU3RyaW5nLCBPYmplY3RdLFxyXG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlcGxhY2U6IEJvb2xlYW4sXHJcbiAgICAgICAgYWN0aXZlQ2xhc3M6IFN0cmluZyxcclxuICAgICAgICAvLyBpbmFjdGl2ZUNsYXNzOiBTdHJpbmcsXHJcbiAgICAgICAgZXhhY3RBY3RpdmVDbGFzczogU3RyaW5nLFxyXG4gICAgICAgIGN1c3RvbTogQm9vbGVhbixcclxuICAgICAgICBhcmlhQ3VycmVudFZhbHVlOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ3BhZ2UnLFxyXG4gICAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgdXNlTGluayxcclxuICAgIHNldHVwKHByb3BzLCB7IHNsb3RzIH0pIHtcclxuICAgICAgICBjb25zdCBsaW5rID0gcmVhY3RpdmUodXNlTGluayhwcm9wcykpO1xyXG4gICAgICAgIGNvbnN0IHsgb3B0aW9ucyB9ID0gaW5qZWN0KHJvdXRlcktleSk7XHJcbiAgICAgICAgY29uc3QgZWxDbGFzcyA9IGNvbXB1dGVkKCgpID0+ICh7XHJcbiAgICAgICAgICAgIFtnZXRMaW5rQ2xhc3MocHJvcHMuYWN0aXZlQ2xhc3MsIG9wdGlvbnMubGlua0FjdGl2ZUNsYXNzLCAncm91dGVyLWxpbmstYWN0aXZlJyldOiBsaW5rLmlzQWN0aXZlLFxyXG4gICAgICAgICAgICAvLyBbZ2V0TGlua0NsYXNzKFxyXG4gICAgICAgICAgICAvLyAgIHByb3BzLmluYWN0aXZlQ2xhc3MsXHJcbiAgICAgICAgICAgIC8vICAgb3B0aW9ucy5saW5rSW5hY3RpdmVDbGFzcyxcclxuICAgICAgICAgICAgLy8gICAncm91dGVyLWxpbmstaW5hY3RpdmUnXHJcbiAgICAgICAgICAgIC8vICldOiAhbGluay5pc0V4YWN0QWN0aXZlLFxyXG4gICAgICAgICAgICBbZ2V0TGlua0NsYXNzKHByb3BzLmV4YWN0QWN0aXZlQ2xhc3MsIG9wdGlvbnMubGlua0V4YWN0QWN0aXZlQ2xhc3MsICdyb3V0ZXItbGluay1leGFjdC1hY3RpdmUnKV06IGxpbmsuaXNFeGFjdEFjdGl2ZSxcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0ICYmIHNsb3RzLmRlZmF1bHQobGluayk7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5jdXN0b21cclxuICAgICAgICAgICAgICAgID8gY2hpbGRyZW5cclxuICAgICAgICAgICAgICAgIDogaCgnYScsIHtcclxuICAgICAgICAgICAgICAgICAgICAnYXJpYS1jdXJyZW50JzogbGluay5pc0V4YWN0QWN0aXZlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcHJvcHMuYXJpYUN1cnJlbnRWYWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgaHJlZjogbGluay5ocmVmLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd291bGQgb3ZlcnJpZGUgdXNlciBhZGRlZCBhdHRycyBidXQgVnVlIHdpbGwgc3RpbGwgYWRkXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpc3RlbmVyLCBzbyB3ZSBlbmQgdXAgdHJpZ2dlcmluZyBib3RoXHJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljazogbGluay5uYXZpZ2F0ZSxcclxuICAgICAgICAgICAgICAgICAgICBjbGFzczogZWxDbGFzcy52YWx1ZSxcclxuICAgICAgICAgICAgICAgIH0sIGNoaWxkcmVuKTtcclxuICAgICAgICB9O1xyXG4gICAgfSxcclxufSk7XHJcbi8vIGV4cG9ydCB0aGUgcHVibGljIHR5cGUgZm9yIGgvdHN4IGluZmVyZW5jZVxyXG4vLyBhbHNvIHRvIGF2b2lkIGlubGluZSBpbXBvcnQoKSBpbiBnZW5lcmF0ZWQgZC50cyBmaWxlc1xyXG4vKipcclxuICogQ29tcG9uZW50IHRvIHJlbmRlciBhIGxpbmsgdGhhdCB0cmlnZ2VycyBhIG5hdmlnYXRpb24gb24gY2xpY2suXHJcbiAqL1xyXG5jb25zdCBSb3V0ZXJMaW5rID0gUm91dGVyTGlua0ltcGw7XHJcbmZ1bmN0aW9uIGd1YXJkRXZlbnQoZSkge1xyXG4gICAgLy8gZG9uJ3QgcmVkaXJlY3Qgd2l0aCBjb250cm9sIGtleXNcclxuICAgIGlmIChlLm1ldGFLZXkgfHwgZS5hbHRLZXkgfHwgZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gZG9uJ3QgcmVkaXJlY3Qgd2hlbiBwcmV2ZW50RGVmYXVsdCBjYWxsZWRcclxuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gZG9uJ3QgcmVkaXJlY3Qgb24gcmlnaHQgY2xpY2tcclxuICAgIGlmIChlLmJ1dHRvbiAhPT0gdW5kZWZpbmVkICYmIGUuYnV0dG9uICE9PSAwKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIC8vIGRvbid0IHJlZGlyZWN0IGlmIGB0YXJnZXQ9XCJfYmxhbmtcImBcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZ2V0QXR0cmlidXRlIGRvZXMgZXhpc3RcclxuICAgIGlmIChlLmN1cnJlbnRUYXJnZXQgJiYgZS5jdXJyZW50VGFyZ2V0LmdldEF0dHJpYnV0ZSkge1xyXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZ2V0QXR0cmlidXRlIGV4aXN0c1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGUuY3VycmVudFRhcmdldC5nZXRBdHRyaWJ1dGUoJ3RhcmdldCcpO1xyXG4gICAgICAgIGlmICgvXFxiX2JsYW5rXFxiL2kudGVzdCh0YXJnZXQpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyB0aGlzIG1heSBiZSBhIFdlZXggZXZlbnQgd2hpY2ggZG9lc24ndCBoYXZlIHRoaXMgbWV0aG9kXHJcbiAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdClcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5mdW5jdGlvbiBpbmNsdWRlc1BhcmFtcyhvdXRlciwgaW5uZXIpIHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIGlubmVyKSB7XHJcbiAgICAgICAgY29uc3QgaW5uZXJWYWx1ZSA9IGlubmVyW2tleV07XHJcbiAgICAgICAgY29uc3Qgb3V0ZXJWYWx1ZSA9IG91dGVyW2tleV07XHJcbiAgICAgICAgaWYgKHR5cGVvZiBpbm5lclZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAoaW5uZXJWYWx1ZSAhPT0gb3V0ZXJWYWx1ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghaXNBcnJheShvdXRlclZhbHVlKSB8fFxyXG4gICAgICAgICAgICAgICAgb3V0ZXJWYWx1ZS5sZW5ndGggIT09IGlubmVyVmFsdWUubGVuZ3RoIHx8XHJcbiAgICAgICAgICAgICAgICBpbm5lclZhbHVlLnNvbWUoKHZhbHVlLCBpKSA9PiB2YWx1ZSAhPT0gb3V0ZXJWYWx1ZVtpXSkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuLyoqXHJcbiAqIEdldCB0aGUgb3JpZ2luYWwgcGF0aCB2YWx1ZSBvZiBhIHJlY29yZCBieSBmb2xsb3dpbmcgaXRzIGFsaWFzT2ZcclxuICogQHBhcmFtIHJlY29yZFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0T3JpZ2luYWxQYXRoKHJlY29yZCkge1xyXG4gICAgcmV0dXJuIHJlY29yZCA/IChyZWNvcmQuYWxpYXNPZiA/IHJlY29yZC5hbGlhc09mLnBhdGggOiByZWNvcmQucGF0aCkgOiAnJztcclxufVxyXG4vKipcclxuICogVXRpbGl0eSBjbGFzcyB0byBnZXQgdGhlIGFjdGl2ZSBjbGFzcyBiYXNlZCBvbiBkZWZhdWx0cy5cclxuICogQHBhcmFtIHByb3BDbGFzc1xyXG4gKiBAcGFyYW0gZ2xvYmFsQ2xhc3NcclxuICogQHBhcmFtIGRlZmF1bHRDbGFzc1xyXG4gKi9cclxuY29uc3QgZ2V0TGlua0NsYXNzID0gKHByb3BDbGFzcywgZ2xvYmFsQ2xhc3MsIGRlZmF1bHRDbGFzcykgPT4gcHJvcENsYXNzICE9IG51bGxcclxuICAgID8gcHJvcENsYXNzXHJcbiAgICA6IGdsb2JhbENsYXNzICE9IG51bGxcclxuICAgICAgICA/IGdsb2JhbENsYXNzXHJcbiAgICAgICAgOiBkZWZhdWx0Q2xhc3M7XG5cbmNvbnN0IFJvdXRlclZpZXdJbXBsID0gLyojX19QVVJFX18qLyBkZWZpbmVDb21wb25lbnQoe1xyXG4gICAgbmFtZTogJ1JvdXRlclZpZXcnLFxyXG4gICAgLy8gIzY3NCB3ZSBtYW51YWxseSBpbmhlcml0IHRoZW1cclxuICAgIGluaGVyaXRBdHRyczogZmFsc2UsXHJcbiAgICBwcm9wczoge1xyXG4gICAgICAgIG5hbWU6IHtcclxuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnZGVmYXVsdCcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICByb3V0ZTogT2JqZWN0LFxyXG4gICAgfSxcclxuICAgIC8vIEJldHRlciBjb21wYXQgZm9yIEB2dWUvY29tcGF0IHVzZXJzXHJcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvcm91dGVyL2lzc3Vlcy8xMzE1XHJcbiAgICBjb21wYXRDb25maWc6IHsgTU9ERTogMyB9LFxyXG4gICAgc2V0dXAocHJvcHMsIHsgYXR0cnMsIHNsb3RzIH0pIHtcclxuICAgICAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgd2FybkRlcHJlY2F0ZWRVc2FnZSgpO1xyXG4gICAgICAgIGNvbnN0IGluamVjdGVkUm91dGUgPSBpbmplY3Qocm91dGVyVmlld0xvY2F0aW9uS2V5KTtcclxuICAgICAgICBjb25zdCByb3V0ZVRvRGlzcGxheSA9IGNvbXB1dGVkKCgpID0+IHByb3BzLnJvdXRlIHx8IGluamVjdGVkUm91dGUudmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IGluamVjdGVkRGVwdGggPSBpbmplY3Qodmlld0RlcHRoS2V5LCAwKTtcclxuICAgICAgICAvLyBUaGUgZGVwdGggY2hhbmdlcyBiYXNlZCBvbiBlbXB0eSBjb21wb25lbnRzIG9wdGlvbiwgd2hpY2ggYWxsb3dzIHBhc3N0aHJvdWdoIHJvdXRlcyBlLmcuIHJvdXRlcyB3aXRoIGNoaWxkcmVuXHJcbiAgICAgICAgLy8gdGhhdCBhcmUgdXNlZCB0byByZXVzZSB0aGUgYHBhdGhgIHByb3BlcnR5XHJcbiAgICAgICAgY29uc3QgZGVwdGggPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpbml0aWFsRGVwdGggPSB1bnJlZihpbmplY3RlZERlcHRoKTtcclxuICAgICAgICAgICAgY29uc3QgeyBtYXRjaGVkIH0gPSByb3V0ZVRvRGlzcGxheS52YWx1ZTtcclxuICAgICAgICAgICAgbGV0IG1hdGNoZWRSb3V0ZTtcclxuICAgICAgICAgICAgd2hpbGUgKChtYXRjaGVkUm91dGUgPSBtYXRjaGVkW2luaXRpYWxEZXB0aF0pICYmXHJcbiAgICAgICAgICAgICAgICAhbWF0Y2hlZFJvdXRlLmNvbXBvbmVudHMpIHtcclxuICAgICAgICAgICAgICAgIGluaXRpYWxEZXB0aCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBpbml0aWFsRGVwdGg7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgbWF0Y2hlZFJvdXRlUmVmID0gY29tcHV0ZWQoKCkgPT4gcm91dGVUb0Rpc3BsYXkudmFsdWUubWF0Y2hlZFtkZXB0aC52YWx1ZV0pO1xyXG4gICAgICAgIHByb3ZpZGUodmlld0RlcHRoS2V5LCBjb21wdXRlZCgoKSA9PiBkZXB0aC52YWx1ZSArIDEpKTtcclxuICAgICAgICBwcm92aWRlKG1hdGNoZWRSb3V0ZUtleSwgbWF0Y2hlZFJvdXRlUmVmKTtcclxuICAgICAgICBwcm92aWRlKHJvdXRlclZpZXdMb2NhdGlvbktleSwgcm91dGVUb0Rpc3BsYXkpO1xyXG4gICAgICAgIGNvbnN0IHZpZXdSZWYgPSByZWYoKTtcclxuICAgICAgICAvLyB3YXRjaCBhdCB0aGUgc2FtZSB0aW1lIHRoZSBjb21wb25lbnQgaW5zdGFuY2UsIHRoZSByb3V0ZSByZWNvcmQgd2UgYXJlXHJcbiAgICAgICAgLy8gcmVuZGVyaW5nLCBhbmQgdGhlIG5hbWVcclxuICAgICAgICB3YXRjaCgoKSA9PiBbdmlld1JlZi52YWx1ZSwgbWF0Y2hlZFJvdXRlUmVmLnZhbHVlLCBwcm9wcy5uYW1lXSwgKFtpbnN0YW5jZSwgdG8sIG5hbWVdLCBbb2xkSW5zdGFuY2UsIGZyb20sIG9sZE5hbWVdKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGNvcHkgcmV1c2VkIGluc3RhbmNlc1xyXG4gICAgICAgICAgICBpZiAodG8pIHtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCB1cGRhdGUgdGhlIGluc3RhbmNlIGZvciBuZXcgaW5zdGFuY2VzIGFzIHdlbGwgYXMgcmV1c2VkXHJcbiAgICAgICAgICAgICAgICAvLyBpbnN0YW5jZXMgd2hlbiBuYXZpZ2F0aW5nIHRvIGEgbmV3IHJvdXRlXHJcbiAgICAgICAgICAgICAgICB0by5pbnN0YW5jZXNbbmFtZV0gPSBpbnN0YW5jZTtcclxuICAgICAgICAgICAgICAgIC8vIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgaXMgcmV1c2VkIGZvciBhIGRpZmZlcmVudCByb3V0ZSBvciBuYW1lLCBzb1xyXG4gICAgICAgICAgICAgICAgLy8gd2UgY29weSBhbnkgc2F2ZWQgdXBkYXRlIG9yIGxlYXZlIGd1YXJkcy4gV2l0aCBhc3luYyBzZXR1cCwgdGhlXHJcbiAgICAgICAgICAgICAgICAvLyBtb3VudGluZyBjb21wb25lbnQgd2lsbCBtb3VudCBiZWZvcmUgdGhlIG1hdGNoZWRSb3V0ZSBjaGFuZ2VzLFxyXG4gICAgICAgICAgICAgICAgLy8gbWFraW5nIGluc3RhbmNlID09PSBvbGRJbnN0YW5jZSwgc28gd2UgY2hlY2sgaWYgZ3VhcmRzIGhhdmUgYmVlblxyXG4gICAgICAgICAgICAgICAgLy8gYWRkZWQgYmVmb3JlLiBUaGlzIHdvcmtzIGJlY2F1c2Ugd2UgcmVtb3ZlIGd1YXJkcyB3aGVuXHJcbiAgICAgICAgICAgICAgICAvLyB1bm1vdW50aW5nL2RlYWN0aXZhdGluZyBjb21wb25lbnRzXHJcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSAmJiBmcm9tICE9PSB0byAmJiBpbnN0YW5jZSAmJiBpbnN0YW5jZSA9PT0gb2xkSW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRvLmxlYXZlR3VhcmRzLnNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG8ubGVhdmVHdWFyZHMgPSBmcm9tLmxlYXZlR3VhcmRzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRvLnVwZGF0ZUd1YXJkcy5zaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvLnVwZGF0ZUd1YXJkcyA9IGZyb20udXBkYXRlR3VhcmRzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyB0cmlnZ2VyIGJlZm9yZVJvdXRlRW50ZXIgbmV4dCBjYWxsYmFja3NcclxuICAgICAgICAgICAgaWYgKGluc3RhbmNlICYmXHJcbiAgICAgICAgICAgICAgICB0byAmJlxyXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gaW5zdGFuY2UgYnV0IHRvIGFuZCBmcm9tIGFyZSB0aGUgc2FtZSB0aGlzIG1pZ2h0IGJlXHJcbiAgICAgICAgICAgICAgICAvLyB0aGUgZmlyc3QgdmlzaXRcclxuICAgICAgICAgICAgICAgICghZnJvbSB8fCAhaXNTYW1lUm91dGVSZWNvcmQodG8sIGZyb20pIHx8ICFvbGRJbnN0YW5jZSkpIHtcclxuICAgICAgICAgICAgICAgICh0by5lbnRlckNhbGxiYWNrc1tuYW1lXSB8fCBbXSkuZm9yRWFjaChjYWxsYmFjayA9PiBjYWxsYmFjayhpbnN0YW5jZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgeyBmbHVzaDogJ3Bvc3QnIH0pO1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlID0gcm91dGVUb0Rpc3BsYXkudmFsdWU7XHJcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdGhlIHZhbHVlIGF0IHRoZSB0aW1lIHdlIHJlbmRlciBiZWNhdXNlIHdoZW4gd2UgdW5tb3VudCwgd2VcclxuICAgICAgICAgICAgLy8gbmF2aWdhdGVkIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uIHNvIHRoZSB2YWx1ZSBpcyBkaWZmZXJlbnRcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudE5hbWUgPSBwcm9wcy5uYW1lO1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkUm91dGUgPSBtYXRjaGVkUm91dGVSZWYudmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IFZpZXdDb21wb25lbnQgPSBtYXRjaGVkUm91dGUgJiYgbWF0Y2hlZFJvdXRlLmNvbXBvbmVudHNbY3VycmVudE5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIVZpZXdDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVTbG90KHNsb3RzLmRlZmF1bHQsIHsgQ29tcG9uZW50OiBWaWV3Q29tcG9uZW50LCByb3V0ZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBwcm9wcyBmcm9tIHJvdXRlIGNvbmZpZ3VyYXRpb25cclxuICAgICAgICAgICAgY29uc3Qgcm91dGVQcm9wc09wdGlvbiA9IG1hdGNoZWRSb3V0ZS5wcm9wc1tjdXJyZW50TmFtZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlUHJvcHMgPSByb3V0ZVByb3BzT3B0aW9uXHJcbiAgICAgICAgICAgICAgICA/IHJvdXRlUHJvcHNPcHRpb24gPT09IHRydWVcclxuICAgICAgICAgICAgICAgICAgICA/IHJvdXRlLnBhcmFtc1xyXG4gICAgICAgICAgICAgICAgICAgIDogdHlwZW9mIHJvdXRlUHJvcHNPcHRpb24gPT09ICdmdW5jdGlvbidcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyByb3V0ZVByb3BzT3B0aW9uKHJvdXRlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJvdXRlUHJvcHNPcHRpb25cclxuICAgICAgICAgICAgICAgIDogbnVsbDtcclxuICAgICAgICAgICAgY29uc3Qgb25Wbm9kZVVubW91bnRlZCA9IHZub2RlID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgaW5zdGFuY2UgcmVmZXJlbmNlIHRvIHByZXZlbnQgbGVha1xyXG4gICAgICAgICAgICAgICAgaWYgKHZub2RlLmNvbXBvbmVudC5pc1VubW91bnRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRSb3V0ZS5pbnN0YW5jZXNbY3VycmVudE5hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gaChWaWV3Q29tcG9uZW50LCBhc3NpZ24oe30sIHJvdXRlUHJvcHMsIGF0dHJzLCB7XHJcbiAgICAgICAgICAgICAgICBvblZub2RlVW5tb3VudGVkLFxyXG4gICAgICAgICAgICAgICAgcmVmOiB2aWV3UmVmLFxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIGlmICgoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykgJiZcclxuICAgICAgICAgICAgICAgIGlzQnJvd3NlciAmJlxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZikge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogY2FuIGRpc3BsYXkgaWYgaXQncyBhbiBhbGlhcywgaXRzIHByb3BzXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmZvID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlcHRoOiBkZXB0aC52YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtYXRjaGVkUm91dGUubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBtYXRjaGVkUm91dGUucGF0aCxcclxuICAgICAgICAgICAgICAgICAgICBtZXRhOiBtYXRjaGVkUm91dGUubWV0YSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbEluc3RhbmNlcyA9IGlzQXJyYXkoY29tcG9uZW50LnJlZilcclxuICAgICAgICAgICAgICAgICAgICA/IGNvbXBvbmVudC5yZWYubWFwKHIgPT4gci5pKVxyXG4gICAgICAgICAgICAgICAgICAgIDogW2NvbXBvbmVudC5yZWYuaV07XHJcbiAgICAgICAgICAgICAgICBpbnRlcm5hbEluc3RhbmNlcy5mb3JFYWNoKGluc3RhbmNlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuX192cnZfZGV2dG9vbHMgPSBpbmZvO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgLy8gcGFzcyB0aGUgdm5vZGUgdG8gdGhlIHNsb3QgYXMgYSBwcm9wLlxyXG4gICAgICAgICAgICAvLyBoIGFuZCA8Y29tcG9uZW50IDppcz1cIi4uLlwiPiBib3RoIGFjY2VwdCB2bm9kZXNcclxuICAgICAgICAgICAgbm9ybWFsaXplU2xvdChzbG90cy5kZWZhdWx0LCB7IENvbXBvbmVudDogY29tcG9uZW50LCByb3V0ZSB9KSB8fFxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgfSxcclxufSk7XHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZVNsb3Qoc2xvdCwgZGF0YSkge1xyXG4gICAgaWYgKCFzbG90KVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgY29uc3Qgc2xvdENvbnRlbnQgPSBzbG90KGRhdGEpO1xyXG4gICAgcmV0dXJuIHNsb3RDb250ZW50Lmxlbmd0aCA9PT0gMSA/IHNsb3RDb250ZW50WzBdIDogc2xvdENvbnRlbnQ7XHJcbn1cclxuLy8gZXhwb3J0IHRoZSBwdWJsaWMgdHlwZSBmb3IgaC90c3ggaW5mZXJlbmNlXHJcbi8vIGFsc28gdG8gYXZvaWQgaW5saW5lIGltcG9ydCgpIGluIGdlbmVyYXRlZCBkLnRzIGZpbGVzXHJcbi8qKlxyXG4gKiBDb21wb25lbnQgdG8gZGlzcGxheSB0aGUgY3VycmVudCByb3V0ZSB0aGUgdXNlciBpcyBhdC5cclxuICovXHJcbmNvbnN0IFJvdXRlclZpZXcgPSBSb3V0ZXJWaWV3SW1wbDtcclxuLy8gd2FybiBhZ2FpbnN0IGRlcHJlY2F0ZWQgdXNhZ2Ugd2l0aCA8dHJhbnNpdGlvbj4gJiA8a2VlcC1hbGl2ZT5cclxuLy8gZHVlIHRvIGZ1bmN0aW9uYWwgY29tcG9uZW50IGJlaW5nIG5vIGxvbmdlciBlYWdlciBpbiBWdWUgM1xyXG5mdW5jdGlvbiB3YXJuRGVwcmVjYXRlZFVzYWdlKCkge1xyXG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcclxuICAgIGNvbnN0IHBhcmVudE5hbWUgPSBpbnN0YW5jZS5wYXJlbnQgJiYgaW5zdGFuY2UucGFyZW50LnR5cGUubmFtZTtcclxuICAgIGlmIChwYXJlbnROYW1lICYmXHJcbiAgICAgICAgKHBhcmVudE5hbWUgPT09ICdLZWVwQWxpdmUnIHx8IHBhcmVudE5hbWUuaW5jbHVkZXMoJ1RyYW5zaXRpb24nKSkpIHtcclxuICAgICAgICBjb25zdCBjb21wID0gcGFyZW50TmFtZSA9PT0gJ0tlZXBBbGl2ZScgPyAna2VlcC1hbGl2ZScgOiAndHJhbnNpdGlvbic7XHJcbiAgICAgICAgd2FybihgPHJvdXRlci12aWV3PiBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgZGlyZWN0bHkgaW5zaWRlIDx0cmFuc2l0aW9uPiBvciA8a2VlcC1hbGl2ZT4uXFxuYCArXHJcbiAgICAgICAgICAgIGBVc2Ugc2xvdCBwcm9wcyBpbnN0ZWFkOlxcblxcbmAgK1xyXG4gICAgICAgICAgICBgPHJvdXRlci12aWV3IHYtc2xvdD1cInsgQ29tcG9uZW50IH1cIj5cXG5gICtcclxuICAgICAgICAgICAgYCAgPCR7Y29tcH0+XFxuYCArXHJcbiAgICAgICAgICAgIGAgICAgPGNvbXBvbmVudCA6aXM9XCJDb21wb25lbnRcIiAvPlxcbmAgK1xyXG4gICAgICAgICAgICBgICA8LyR7Y29tcH0+XFxuYCArXHJcbiAgICAgICAgICAgIGA8L3JvdXRlci12aWV3PmApO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBDb3BpZXMgYSByb3V0ZSBsb2NhdGlvbiBhbmQgcmVtb3ZlcyBhbnkgcHJvYmxlbWF0aWMgcHJvcGVydGllcyB0aGF0IGNhbm5vdCBiZSBzaG93biBpbiBkZXZ0b29scyAoZS5nLiBWdWUgaW5zdGFuY2VzKS5cclxuICpcclxuICogQHBhcmFtIHJvdXRlTG9jYXRpb24gLSByb3V0ZUxvY2F0aW9uIHRvIGZvcm1hdFxyXG4gKiBAcGFyYW0gdG9vbHRpcCAtIG9wdGlvbmFsIHRvb2x0aXBcclxuICogQHJldHVybnMgYSBjb3B5IG9mIHRoZSByb3V0ZUxvY2F0aW9uXHJcbiAqL1xyXG5mdW5jdGlvbiBmb3JtYXRSb3V0ZUxvY2F0aW9uKHJvdXRlTG9jYXRpb24sIHRvb2x0aXApIHtcclxuICAgIGNvbnN0IGNvcHkgPSBhc3NpZ24oe30sIHJvdXRlTG9jYXRpb24sIHtcclxuICAgICAgICAvLyByZW1vdmUgdmFyaWFibGVzIHRoYXQgY2FuIGNvbnRhaW4gdnVlIGluc3RhbmNlc1xyXG4gICAgICAgIG1hdGNoZWQ6IHJvdXRlTG9jYXRpb24ubWF0Y2hlZC5tYXAobWF0Y2hlZCA9PiBvbWl0KG1hdGNoZWQsIFsnaW5zdGFuY2VzJywgJ2NoaWxkcmVuJywgJ2FsaWFzT2YnXSkpLFxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIF9jdXN0b206IHtcclxuICAgICAgICAgICAgdHlwZTogbnVsbCxcclxuICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXHJcbiAgICAgICAgICAgIGRpc3BsYXk6IHJvdXRlTG9jYXRpb24uZnVsbFBhdGgsXHJcbiAgICAgICAgICAgIHRvb2x0aXAsXHJcbiAgICAgICAgICAgIHZhbHVlOiBjb3B5LFxyXG4gICAgICAgIH0sXHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIGZvcm1hdERpc3BsYXkoZGlzcGxheSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBfY3VzdG9tOiB7XHJcbiAgICAgICAgICAgIGRpc3BsYXksXHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcbn1cclxuLy8gdG8gc3VwcG9ydCBtdWx0aXBsZSByb3V0ZXIgaW5zdGFuY2VzXHJcbmxldCByb3V0ZXJJZCA9IDA7XHJcbmZ1bmN0aW9uIGFkZERldnRvb2xzKGFwcCwgcm91dGVyLCBtYXRjaGVyKSB7XHJcbiAgICAvLyBUYWtlIG92ZXIgcm91dGVyLmJlZm9yZUVhY2ggYW5kIGFmdGVyRWFjaFxyXG4gICAgLy8gbWFrZSBzdXJlIHdlIGFyZSBub3QgcmVnaXN0ZXJpbmcgdGhlIGRldnRvb2wgdHdpY2VcclxuICAgIGlmIChyb3V0ZXIuX19oYXNEZXZ0b29scylcclxuICAgICAgICByZXR1cm47XHJcbiAgICByb3V0ZXIuX19oYXNEZXZ0b29scyA9IHRydWU7XHJcbiAgICAvLyBpbmNyZW1lbnQgdG8gc3VwcG9ydCBtdWx0aXBsZSByb3V0ZXIgaW5zdGFuY2VzXHJcbiAgICBjb25zdCBpZCA9IHJvdXRlcklkKys7XHJcbiAgICBzZXR1cERldnRvb2xzUGx1Z2luKHtcclxuICAgICAgICBpZDogJ29yZy52dWVqcy5yb3V0ZXInICsgKGlkID8gJy4nICsgaWQgOiAnJyksXHJcbiAgICAgICAgbGFiZWw6ICdWdWUgUm91dGVyJyxcclxuICAgICAgICBwYWNrYWdlTmFtZTogJ3Z1ZS1yb3V0ZXInLFxyXG4gICAgICAgIGhvbWVwYWdlOiAnaHR0cHM6Ly9yb3V0ZXIudnVlanMub3JnJyxcclxuICAgICAgICBsb2dvOiAnaHR0cHM6Ly9yb3V0ZXIudnVlanMub3JnL2xvZ28ucG5nJyxcclxuICAgICAgICBjb21wb25lbnRTdGF0ZVR5cGVzOiBbJ1JvdXRpbmcnXSxcclxuICAgICAgICBhcHAsXHJcbiAgICB9LCBhcGkgPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgYXBpLm5vdyAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tWdWUgUm91dGVyXTogWW91IHNlZW0gdG8gYmUgdXNpbmcgYW4gb3V0ZGF0ZWQgdmVyc2lvbiBvZiBWdWUgRGV2dG9vbHMuIEFyZSB5b3Ugc3RpbGwgdXNpbmcgdGhlIEJldGEgcmVsZWFzZSBpbnN0ZWFkIG9mIHRoZSBzdGFibGUgb25lPyBZb3UgY2FuIGZpbmQgdGhlIGxpbmtzIGF0IGh0dHBzOi8vZGV2dG9vbHMudnVlanMub3JnL2d1aWRlL2luc3RhbGxhdGlvbi5odG1sLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBkaXNwbGF5IHN0YXRlIGFkZGVkIGJ5IHRoZSByb3V0ZXJcclxuICAgICAgICBhcGkub24uaW5zcGVjdENvbXBvbmVudCgocGF5bG9hZCwgY3R4KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwYXlsb2FkLmluc3RhbmNlRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pbnN0YW5jZURhdGEuc3RhdGUucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1JvdXRpbmcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGtleTogJyRyb3V0ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXRSb3V0ZUxvY2F0aW9uKHJvdXRlci5jdXJyZW50Um91dGUudmFsdWUsICdDdXJyZW50IFJvdXRlJyksXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIG1hcmsgcm91dGVyLWxpbmsgYXMgYWN0aXZlIGFuZCBkaXNwbGF5IHRhZ3Mgb24gcm91dGVyIHZpZXdzXHJcbiAgICAgICAgYXBpLm9uLnZpc2l0Q29tcG9uZW50VHJlZSgoeyB0cmVlTm9kZTogbm9kZSwgY29tcG9uZW50SW5zdGFuY2UgfSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50SW5zdGFuY2UuX192cnZfZGV2dG9vbHMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBjb21wb25lbnRJbnN0YW5jZS5fX3Zydl9kZXZ0b29scztcclxuICAgICAgICAgICAgICAgIG5vZGUudGFncy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogKGluZm8ubmFtZSA/IGAke2luZm8ubmFtZS50b1N0cmluZygpfTogYCA6ICcnKSArIGluZm8ucGF0aCxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogJ1RoaXMgY29tcG9uZW50IGlzIHJlbmRlcmVkIGJ5ICZsdDtyb3V0ZXItdmlldyZndDsnLFxyXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogUElOS181MDAsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiBtdWx0aXBsZSB1c2VMaW5rIGFyZSB1c2VkXHJcbiAgICAgICAgICAgIGlmIChpc0FycmF5KGNvbXBvbmVudEluc3RhbmNlLl9fdnJsX2RldnRvb2xzKSkge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuX19kZXZ0b29sc0FwaSA9IGFwaTtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlLl9fdnJsX2RldnRvb2xzLmZvckVhY2goZGV2dG9vbHNEYXRhID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYmFja2dyb3VuZENvbG9yID0gT1JBTkdFXzQwMDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdG9vbHRpcCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXZ0b29sc0RhdGEuaXNFeGFjdEFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBMSU1FXzUwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcCA9ICdUaGlzIGlzIGV4YWN0bHkgYWN0aXZlJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGV2dG9vbHNEYXRhLmlzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvciA9IEJMVUVfNjAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwID0gJ1RoaXMgbGluayBpcyBhY3RpdmUnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBub2RlLnRhZ3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBkZXZ0b29sc0RhdGEucm91dGUucGF0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dENvbG9yOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHdhdGNoKHJvdXRlci5jdXJyZW50Um91dGUsICgpID0+IHtcclxuICAgICAgICAgICAgLy8gcmVmcmVzaCBhY3RpdmUgc3RhdGVcclxuICAgICAgICAgICAgcmVmcmVzaFJvdXRlc1ZpZXcoKTtcclxuICAgICAgICAgICAgYXBpLm5vdGlmeUNvbXBvbmVudFVwZGF0ZSgpO1xyXG4gICAgICAgICAgICBhcGkuc2VuZEluc3BlY3RvclRyZWUocm91dGVySW5zcGVjdG9ySWQpO1xyXG4gICAgICAgICAgICBhcGkuc2VuZEluc3BlY3RvclN0YXRlKHJvdXRlckluc3BlY3RvcklkKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uc0xheWVySWQgPSAncm91dGVyOm5hdmlnYXRpb25zOicgKyBpZDtcclxuICAgICAgICBhcGkuYWRkVGltZWxpbmVMYXllcih7XHJcbiAgICAgICAgICAgIGlkOiBuYXZpZ2F0aW9uc0xheWVySWQsXHJcbiAgICAgICAgICAgIGxhYmVsOiBgUm91dGVyJHtpZCA/ICcgJyArIGlkIDogJyd9IE5hdmlnYXRpb25zYCxcclxuICAgICAgICAgICAgY29sb3I6IDB4NDBhOGM0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIGNvbnN0IGVycm9yc0xheWVySWQgPSAncm91dGVyOmVycm9ycydcclxuICAgICAgICAvLyBhcGkuYWRkVGltZWxpbmVMYXllcih7XHJcbiAgICAgICAgLy8gICBpZDogZXJyb3JzTGF5ZXJJZCxcclxuICAgICAgICAvLyAgIGxhYmVsOiAnUm91dGVyIEVycm9ycycsXHJcbiAgICAgICAgLy8gICBjb2xvcjogMHhlYTU0NTUsXHJcbiAgICAgICAgLy8gfSlcclxuICAgICAgICByb3V0ZXIub25FcnJvcigoZXJyb3IsIHRvKSA9PiB7XHJcbiAgICAgICAgICAgIGFwaS5hZGRUaW1lbGluZUV2ZW50KHtcclxuICAgICAgICAgICAgICAgIGxheWVySWQ6IG5hdmlnYXRpb25zTGF5ZXJJZCxcclxuICAgICAgICAgICAgICAgIGV2ZW50OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdFcnJvciBkdXJpbmcgTmF2aWdhdGlvbicsXHJcbiAgICAgICAgICAgICAgICAgICAgc3VidGl0bGU6IHRvLmZ1bGxQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvZ1R5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICAgICAgdGltZTogYXBpLm5vdygpLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHsgZXJyb3IgfSxcclxuICAgICAgICAgICAgICAgICAgICBncm91cElkOiB0by5tZXRhLl9fbmF2aWdhdGlvbklkLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gYXR0YWNoZWQgdG8gYG1ldGFgIGFuZCB1c2VkIHRvIGdyb3VwIGV2ZW50c1xyXG4gICAgICAgIGxldCBuYXZpZ2F0aW9uSWQgPSAwO1xyXG4gICAgICAgIHJvdXRlci5iZWZvcmVFYWNoKCh0bywgZnJvbSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgZ3VhcmQ6IGZvcm1hdERpc3BsYXkoJ2JlZm9yZUVhY2gnKSxcclxuICAgICAgICAgICAgICAgIGZyb206IGZvcm1hdFJvdXRlTG9jYXRpb24oZnJvbSwgJ0N1cnJlbnQgTG9jYXRpb24gZHVyaW5nIHRoaXMgbmF2aWdhdGlvbicpLFxyXG4gICAgICAgICAgICAgICAgdG86IGZvcm1hdFJvdXRlTG9jYXRpb24odG8sICdUYXJnZXQgbG9jYXRpb24nKSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgLy8gVXNlZCB0byBncm91cCBuYXZpZ2F0aW9ucyB0b2dldGhlciwgaGlkZSBmcm9tIGRldnRvb2xzXHJcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0by5tZXRhLCAnX19uYXZpZ2F0aW9uSWQnLCB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogbmF2aWdhdGlvbklkKyssXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBhcGkuYWRkVGltZWxpbmVFdmVudCh7XHJcbiAgICAgICAgICAgICAgICBsYXllcklkOiBuYXZpZ2F0aW9uc0xheWVySWQsXHJcbiAgICAgICAgICAgICAgICBldmVudDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpbWU6IGFwaS5ub3coKSxcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ1N0YXJ0IG9mIG5hdmlnYXRpb24nLFxyXG4gICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlOiB0by5mdWxsUGF0aCxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6IHRvLm1ldGEuX19uYXZpZ2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByb3V0ZXIuYWZ0ZXJFYWNoKCh0bywgZnJvbSwgZmFpbHVyZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgZ3VhcmQ6IGZvcm1hdERpc3BsYXkoJ2FmdGVyRWFjaCcpLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZiAoZmFpbHVyZSkge1xyXG4gICAgICAgICAgICAgICAgZGF0YS5mYWlsdXJlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIF9jdXN0b206IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRXJyb3IsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmYWlsdXJlID8gZmFpbHVyZS5tZXNzYWdlIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA6ICdOYXZpZ2F0aW9uIEZhaWx1cmUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmFpbHVyZSxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGRhdGEuc3RhdHVzID0gZm9ybWF0RGlzcGxheSgn4p2MJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLnN0YXR1cyA9IGZvcm1hdERpc3BsYXkoJ+KchScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHdlIHNldCBoZXJlIHRvIGhhdmUgdGhlIHJpZ2h0IG9yZGVyXHJcbiAgICAgICAgICAgIGRhdGEuZnJvbSA9IGZvcm1hdFJvdXRlTG9jYXRpb24oZnJvbSwgJ0N1cnJlbnQgTG9jYXRpb24gZHVyaW5nIHRoaXMgbmF2aWdhdGlvbicpO1xyXG4gICAgICAgICAgICBkYXRhLnRvID0gZm9ybWF0Um91dGVMb2NhdGlvbih0bywgJ1RhcmdldCBsb2NhdGlvbicpO1xyXG4gICAgICAgICAgICBhcGkuYWRkVGltZWxpbmVFdmVudCh7XHJcbiAgICAgICAgICAgICAgICBsYXllcklkOiBuYXZpZ2F0aW9uc0xheWVySWQsXHJcbiAgICAgICAgICAgICAgICBldmVudDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnRW5kIG9mIG5hdmlnYXRpb24nLFxyXG4gICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlOiB0by5mdWxsUGF0aCxcclxuICAgICAgICAgICAgICAgICAgICB0aW1lOiBhcGkubm93KCksXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICBsb2dUeXBlOiBmYWlsdXJlID8gJ3dhcm5pbmcnIDogJ2RlZmF1bHQnLFxyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6IHRvLm1ldGEuX19uYXZpZ2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnNwZWN0b3Igb2YgRXhpc3Rpbmcgcm91dGVzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3Qgcm91dGVySW5zcGVjdG9ySWQgPSAncm91dGVyLWluc3BlY3RvcjonICsgaWQ7XHJcbiAgICAgICAgYXBpLmFkZEluc3BlY3Rvcih7XHJcbiAgICAgICAgICAgIGlkOiByb3V0ZXJJbnNwZWN0b3JJZCxcclxuICAgICAgICAgICAgbGFiZWw6ICdSb3V0ZXMnICsgKGlkID8gJyAnICsgaWQgOiAnJyksXHJcbiAgICAgICAgICAgIGljb246ICdib29rJyxcclxuICAgICAgICAgICAgdHJlZUZpbHRlclBsYWNlaG9sZGVyOiAnU2VhcmNoIHJvdXRlcycsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZnVuY3Rpb24gcmVmcmVzaFJvdXRlc1ZpZXcoKSB7XHJcbiAgICAgICAgICAgIC8vIHRoZSByb3V0ZXMgdmlldyBpc24ndCBhY3RpdmVcclxuICAgICAgICAgICAgaWYgKCFhY3RpdmVSb3V0ZXNQYXlsb2FkKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYWN0aXZlUm91dGVzUGF5bG9hZDtcclxuICAgICAgICAgICAgLy8gY2hpbGRyZW4gcm91dGVzIHdpbGwgYXBwZWFyIGFzIG5lc3RlZFxyXG4gICAgICAgICAgICBsZXQgcm91dGVzID0gbWF0Y2hlci5nZXRSb3V0ZXMoKS5maWx0ZXIocm91dGUgPT4gIXJvdXRlLnBhcmVudCk7XHJcbiAgICAgICAgICAgIC8vIHJlc2V0IG1hdGNoIHN0YXRlIHRvIGZhbHNlXHJcbiAgICAgICAgICAgIHJvdXRlcy5mb3JFYWNoKHJlc2V0TWF0Y2hTdGF0ZU9uUm91dGVSZWNvcmQpO1xyXG4gICAgICAgICAgICAvLyBhcHBseSBhIG1hdGNoIHN0YXRlIGlmIHRoZXJlIGlzIGEgcGF5bG9hZFxyXG4gICAgICAgICAgICBpZiAocGF5bG9hZC5maWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgIHJvdXRlcyA9IHJvdXRlcy5maWx0ZXIocm91dGUgPT4gXHJcbiAgICAgICAgICAgICAgICAvLyBzYXZlIG1hdGNoZXMgc3RhdGUgYmFzZWQgb24gdGhlIHBheWxvYWRcclxuICAgICAgICAgICAgICAgIGlzUm91dGVNYXRjaGluZyhyb3V0ZSwgcGF5bG9hZC5maWx0ZXIudG9Mb3dlckNhc2UoKSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIG1hcmsgYWN0aXZlIHJvdXRlc1xyXG4gICAgICAgICAgICByb3V0ZXMuZm9yRWFjaChyb3V0ZSA9PiBtYXJrUm91dGVSZWNvcmRBY3RpdmUocm91dGUsIHJvdXRlci5jdXJyZW50Um91dGUudmFsdWUpKTtcclxuICAgICAgICAgICAgcGF5bG9hZC5yb290Tm9kZXMgPSByb3V0ZXMubWFwKGZvcm1hdFJvdXRlUmVjb3JkRm9ySW5zcGVjdG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGFjdGl2ZVJvdXRlc1BheWxvYWQ7XHJcbiAgICAgICAgYXBpLm9uLmdldEluc3BlY3RvclRyZWUocGF5bG9hZCA9PiB7XHJcbiAgICAgICAgICAgIGFjdGl2ZVJvdXRlc1BheWxvYWQgPSBwYXlsb2FkO1xyXG4gICAgICAgICAgICBpZiAocGF5bG9hZC5hcHAgPT09IGFwcCAmJiBwYXlsb2FkLmluc3BlY3RvcklkID09PSByb3V0ZXJJbnNwZWN0b3JJZCkge1xyXG4gICAgICAgICAgICAgICAgcmVmcmVzaFJvdXRlc1ZpZXcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSByZWNvcmRcclxuICAgICAgICAgKi9cclxuICAgICAgICBhcGkub24uZ2V0SW5zcGVjdG9yU3RhdGUocGF5bG9hZCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwYXlsb2FkLmFwcCA9PT0gYXBwICYmIHBheWxvYWQuaW5zcGVjdG9ySWQgPT09IHJvdXRlckluc3BlY3RvcklkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3V0ZXMgPSBtYXRjaGVyLmdldFJvdXRlcygpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm91dGUgPSByb3V0ZXMuZmluZChyb3V0ZSA9PiByb3V0ZS5yZWNvcmQuX192ZF9pZCA9PT0gcGF5bG9hZC5ub2RlSWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJvdXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogZm9ybWF0Um91dGVSZWNvcmRNYXRjaGVyRm9yU3RhdGVJbnNwZWN0b3Iocm91dGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBhcGkuc2VuZEluc3BlY3RvclRyZWUocm91dGVySW5zcGVjdG9ySWQpO1xyXG4gICAgICAgIGFwaS5zZW5kSW5zcGVjdG9yU3RhdGUocm91dGVySW5zcGVjdG9ySWQpO1xyXG4gICAgfSk7XHJcbn1cclxuZnVuY3Rpb24gbW9kaWZpZXJGb3JLZXkoa2V5KSB7XHJcbiAgICBpZiAoa2V5Lm9wdGlvbmFsKSB7XHJcbiAgICAgICAgcmV0dXJuIGtleS5yZXBlYXRhYmxlID8gJyonIDogJz8nO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGtleS5yZXBlYXRhYmxlID8gJysnIDogJyc7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gZm9ybWF0Um91dGVSZWNvcmRNYXRjaGVyRm9yU3RhdGVJbnNwZWN0b3Iocm91dGUpIHtcclxuICAgIGNvbnN0IHsgcmVjb3JkIH0gPSByb3V0ZTtcclxuICAgIGNvbnN0IGZpZWxkcyA9IFtcclxuICAgICAgICB7IGVkaXRhYmxlOiBmYWxzZSwga2V5OiAncGF0aCcsIHZhbHVlOiByZWNvcmQucGF0aCB9LFxyXG4gICAgXTtcclxuICAgIGlmIChyZWNvcmQubmFtZSAhPSBudWxsKSB7XHJcbiAgICAgICAgZmllbGRzLnB1c2goe1xyXG4gICAgICAgICAgICBlZGl0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGtleTogJ25hbWUnLFxyXG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLm5hbWUsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBmaWVsZHMucHVzaCh7IGVkaXRhYmxlOiBmYWxzZSwga2V5OiAncmVnZXhwJywgdmFsdWU6IHJvdXRlLnJlIH0pO1xyXG4gICAgaWYgKHJvdXRlLmtleXMubGVuZ3RoKSB7XHJcbiAgICAgICAgZmllbGRzLnB1c2goe1xyXG4gICAgICAgICAgICBlZGl0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGtleTogJ2tleXMnLFxyXG4gICAgICAgICAgICB2YWx1ZToge1xyXG4gICAgICAgICAgICAgICAgX2N1c3RvbToge1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogcm91dGUua2V5c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKGtleSA9PiBgJHtrZXkubmFtZX0ke21vZGlmaWVyRm9yS2V5KGtleSl9YClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJyAnKSxcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiAnUGFyYW0ga2V5cycsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJvdXRlLmtleXMsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHJlY29yZC5yZWRpcmVjdCAhPSBudWxsKSB7XHJcbiAgICAgICAgZmllbGRzLnB1c2goe1xyXG4gICAgICAgICAgICBlZGl0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGtleTogJ3JlZGlyZWN0JyxcclxuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5yZWRpcmVjdCxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChyb3V0ZS5hbGlhcy5sZW5ndGgpIHtcclxuICAgICAgICBmaWVsZHMucHVzaCh7XHJcbiAgICAgICAgICAgIGVkaXRhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAga2V5OiAnYWxpYXNlcycsXHJcbiAgICAgICAgICAgIHZhbHVlOiByb3V0ZS5hbGlhcy5tYXAoYWxpYXMgPT4gYWxpYXMucmVjb3JkLnBhdGgpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKE9iamVjdC5rZXlzKHJvdXRlLnJlY29yZC5tZXRhKS5sZW5ndGgpIHtcclxuICAgICAgICBmaWVsZHMucHVzaCh7XHJcbiAgICAgICAgICAgIGVkaXRhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAga2V5OiAnbWV0YScsXHJcbiAgICAgICAgICAgIHZhbHVlOiByb3V0ZS5yZWNvcmQubWV0YSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGZpZWxkcy5wdXNoKHtcclxuICAgICAgICBrZXk6ICdzY29yZScsXHJcbiAgICAgICAgZWRpdGFibGU6IGZhbHNlLFxyXG4gICAgICAgIHZhbHVlOiB7XHJcbiAgICAgICAgICAgIF9jdXN0b206IHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IG51bGwsXHJcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IHJvdXRlLnNjb3JlLm1hcChzY29yZSA9PiBzY29yZS5qb2luKCcsICcpKS5qb2luKCcgfCAnKSxcclxuICAgICAgICAgICAgICAgIHRvb2x0aXA6ICdTY29yZSB1c2VkIHRvIHNvcnQgcm91dGVzJyxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiByb3V0ZS5zY29yZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZmllbGRzO1xyXG59XHJcbi8qKlxyXG4gKiBFeHRyYWN0ZWQgZnJvbSB0YWlsd2luZCBwYWxldHRlXHJcbiAqL1xyXG5jb25zdCBQSU5LXzUwMCA9IDB4ZWM0ODk5O1xyXG5jb25zdCBCTFVFXzYwMCA9IDB4MjU2M2ViO1xyXG5jb25zdCBMSU1FXzUwMCA9IDB4ODRjYzE2O1xyXG5jb25zdCBDWUFOXzQwMCA9IDB4MjJkM2VlO1xyXG5jb25zdCBPUkFOR0VfNDAwID0gMHhmYjkyM2M7XHJcbi8vIGNvbnN0IEdSQVlfMTAwID0gMHhmNGY0ZjVcclxuY29uc3QgREFSSyA9IDB4NjY2NjY2O1xyXG5mdW5jdGlvbiBmb3JtYXRSb3V0ZVJlY29yZEZvckluc3BlY3Rvcihyb3V0ZSkge1xyXG4gICAgY29uc3QgdGFncyA9IFtdO1xyXG4gICAgY29uc3QgeyByZWNvcmQgfSA9IHJvdXRlO1xyXG4gICAgaWYgKHJlY29yZC5uYW1lICE9IG51bGwpIHtcclxuICAgICAgICB0YWdzLnB1c2goe1xyXG4gICAgICAgICAgICBsYWJlbDogU3RyaW5nKHJlY29yZC5uYW1lKSxcclxuICAgICAgICAgICAgdGV4dENvbG9yOiAwLFxyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IENZQU5fNDAwLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHJlY29yZC5hbGlhc09mKSB7XHJcbiAgICAgICAgdGFncy5wdXNoKHtcclxuICAgICAgICAgICAgbGFiZWw6ICdhbGlhcycsXHJcbiAgICAgICAgICAgIHRleHRDb2xvcjogMCxcclxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBPUkFOR0VfNDAwLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHJvdXRlLl9fdmRfbWF0Y2gpIHtcclxuICAgICAgICB0YWdzLnB1c2goe1xyXG4gICAgICAgICAgICBsYWJlbDogJ21hdGNoZXMnLFxyXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IDAsXHJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogUElOS181MDAsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAocm91dGUuX192ZF9leGFjdEFjdGl2ZSkge1xyXG4gICAgICAgIHRhZ3MucHVzaCh7XHJcbiAgICAgICAgICAgIGxhYmVsOiAnZXhhY3QnLFxyXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IDAsXHJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogTElNRV81MDAsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAocm91dGUuX192ZF9hY3RpdmUpIHtcclxuICAgICAgICB0YWdzLnB1c2goe1xyXG4gICAgICAgICAgICBsYWJlbDogJ2FjdGl2ZScsXHJcbiAgICAgICAgICAgIHRleHRDb2xvcjogMCxcclxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBCTFVFXzYwMCxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChyZWNvcmQucmVkaXJlY3QpIHtcclxuICAgICAgICB0YWdzLnB1c2goe1xyXG4gICAgICAgICAgICBsYWJlbDogdHlwZW9mIHJlY29yZC5yZWRpcmVjdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gYHJlZGlyZWN0OiAke3JlY29yZC5yZWRpcmVjdH1gXHJcbiAgICAgICAgICAgICAgICA6ICdyZWRpcmVjdHMnLFxyXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IDB4ZmZmZmZmLFxyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IERBUkssXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBhZGQgYW4gaWQgdG8gYmUgYWJsZSB0byBzZWxlY3QgaXQuIFVzaW5nIHRoZSBgcGF0aGAgaXMgbm90IHBvc3NpYmxlIGJlY2F1c2VcclxuICAgIC8vIGVtcHR5IHBhdGggY2hpbGRyZW4gd291bGQgY29sbGlkZSB3aXRoIHRoZWlyIHBhcmVudHNcclxuICAgIGxldCBpZCA9IHJlY29yZC5fX3ZkX2lkO1xyXG4gICAgaWYgKGlkID09IG51bGwpIHtcclxuICAgICAgICBpZCA9IFN0cmluZyhyb3V0ZVJlY29yZElkKyspO1xyXG4gICAgICAgIHJlY29yZC5fX3ZkX2lkID0gaWQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGlkLFxyXG4gICAgICAgIGxhYmVsOiByZWNvcmQucGF0aCxcclxuICAgICAgICB0YWdzLFxyXG4gICAgICAgIGNoaWxkcmVuOiByb3V0ZS5jaGlsZHJlbi5tYXAoZm9ybWF0Um91dGVSZWNvcmRGb3JJbnNwZWN0b3IpLFxyXG4gICAgfTtcclxufVxyXG4vLyAgaW5jcmVtZW50YWwgaWQgZm9yIHJvdXRlIHJlY29yZHMgYW5kIGluc3BlY3RvciBzdGF0ZVxyXG5sZXQgcm91dGVSZWNvcmRJZCA9IDA7XHJcbmNvbnN0IEVYVFJBQ1RfUkVHRVhQX1JFID0gL15cXC8oLiopXFwvKFthLXpdKikkLztcclxuZnVuY3Rpb24gbWFya1JvdXRlUmVjb3JkQWN0aXZlKHJvdXRlLCBjdXJyZW50Um91dGUpIHtcclxuICAgIC8vIG5vIHJvdXRlIHdpbGwgYmUgYWN0aXZlIGlmIG1hdGNoZWQgaXMgZW1wdHlcclxuICAgIC8vIHJlc2V0IHRoZSBtYXRjaGluZyBzdGF0ZVxyXG4gICAgY29uc3QgaXNFeGFjdEFjdGl2ZSA9IGN1cnJlbnRSb3V0ZS5tYXRjaGVkLmxlbmd0aCAmJlxyXG4gICAgICAgIGlzU2FtZVJvdXRlUmVjb3JkKGN1cnJlbnRSb3V0ZS5tYXRjaGVkW2N1cnJlbnRSb3V0ZS5tYXRjaGVkLmxlbmd0aCAtIDFdLCByb3V0ZS5yZWNvcmQpO1xyXG4gICAgcm91dGUuX192ZF9leGFjdEFjdGl2ZSA9IHJvdXRlLl9fdmRfYWN0aXZlID0gaXNFeGFjdEFjdGl2ZTtcclxuICAgIGlmICghaXNFeGFjdEFjdGl2ZSkge1xyXG4gICAgICAgIHJvdXRlLl9fdmRfYWN0aXZlID0gY3VycmVudFJvdXRlLm1hdGNoZWQuc29tZShtYXRjaCA9PiBpc1NhbWVSb3V0ZVJlY29yZChtYXRjaCwgcm91dGUucmVjb3JkKSk7XHJcbiAgICB9XHJcbiAgICByb3V0ZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkUm91dGUgPT4gbWFya1JvdXRlUmVjb3JkQWN0aXZlKGNoaWxkUm91dGUsIGN1cnJlbnRSb3V0ZSkpO1xyXG59XHJcbmZ1bmN0aW9uIHJlc2V0TWF0Y2hTdGF0ZU9uUm91dGVSZWNvcmQocm91dGUpIHtcclxuICAgIHJvdXRlLl9fdmRfbWF0Y2ggPSBmYWxzZTtcclxuICAgIHJvdXRlLmNoaWxkcmVuLmZvckVhY2gocmVzZXRNYXRjaFN0YXRlT25Sb3V0ZVJlY29yZCk7XHJcbn1cclxuZnVuY3Rpb24gaXNSb3V0ZU1hdGNoaW5nKHJvdXRlLCBmaWx0ZXIpIHtcclxuICAgIGNvbnN0IGZvdW5kID0gU3RyaW5nKHJvdXRlLnJlKS5tYXRjaChFWFRSQUNUX1JFR0VYUF9SRSk7XHJcbiAgICByb3V0ZS5fX3ZkX21hdGNoID0gZmFsc2U7XHJcbiAgICBpZiAoIWZvdW5kIHx8IGZvdW5kLmxlbmd0aCA8IDMpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyB1c2UgYSByZWdleHAgd2l0aG91dCAkIGF0IHRoZSBlbmQgdG8gbWF0Y2ggbmVzdGVkIHJvdXRlcyBiZXR0ZXJcclxuICAgIGNvbnN0IG5vbkVuZGluZ1JFID0gbmV3IFJlZ0V4cChmb3VuZFsxXS5yZXBsYWNlKC9cXCQkLywgJycpLCBmb3VuZFsyXSk7XHJcbiAgICBpZiAobm9uRW5kaW5nUkUudGVzdChmaWx0ZXIpKSB7XHJcbiAgICAgICAgLy8gbWFyayBjaGlsZHJlbiBhcyBtYXRjaGVzXHJcbiAgICAgICAgcm91dGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBpc1JvdXRlTWF0Y2hpbmcoY2hpbGQsIGZpbHRlcikpO1xyXG4gICAgICAgIC8vIGV4Y2VwdGlvbiBjYXNlOiBgL2BcclxuICAgICAgICBpZiAocm91dGUucmVjb3JkLnBhdGggIT09ICcvJyB8fCBmaWx0ZXIgPT09ICcvJykge1xyXG4gICAgICAgICAgICByb3V0ZS5fX3ZkX21hdGNoID0gcm91dGUucmUudGVzdChmaWx0ZXIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaGlkZSB0aGUgLyByb3V0ZVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBhdGggPSByb3V0ZS5yZWNvcmQucGF0aC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgY29uc3QgZGVjb2RlZFBhdGggPSBkZWNvZGUocGF0aCk7XHJcbiAgICAvLyBhbHNvIGFsbG93IHBhcnRpYWwgbWF0Y2hpbmcgb24gdGhlIHBhdGhcclxuICAgIGlmICghZmlsdGVyLnN0YXJ0c1dpdGgoJy8nKSAmJlxyXG4gICAgICAgIChkZWNvZGVkUGF0aC5pbmNsdWRlcyhmaWx0ZXIpIHx8IHBhdGguaW5jbHVkZXMoZmlsdGVyKSkpXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICBpZiAoZGVjb2RlZFBhdGguc3RhcnRzV2l0aChmaWx0ZXIpIHx8IHBhdGguc3RhcnRzV2l0aChmaWx0ZXIpKVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgaWYgKHJvdXRlLnJlY29yZC5uYW1lICYmIFN0cmluZyhyb3V0ZS5yZWNvcmQubmFtZSkuaW5jbHVkZXMoZmlsdGVyKSlcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIHJldHVybiByb3V0ZS5jaGlsZHJlbi5zb21lKGNoaWxkID0+IGlzUm91dGVNYXRjaGluZyhjaGlsZCwgZmlsdGVyKSk7XHJcbn1cclxuZnVuY3Rpb24gb21pdChvYmosIGtleXMpIHtcclxuICAgIGNvbnN0IHJldCA9IHt9O1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcclxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxyXG4gICAgICAgICAgICByZXRba2V5XSA9IG9ialtrZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXQ7XHJcbn1cblxuLyoqXHJcbiAqIENyZWF0ZXMgYSBSb3V0ZXIgaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZCBieSBhIFZ1ZSBhcHAuXHJcbiAqXHJcbiAqIEBwYXJhbSBvcHRpb25zIC0ge0BsaW5rIFJvdXRlck9wdGlvbnN9XHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVSb3V0ZXIob3B0aW9ucykge1xyXG4gICAgY29uc3QgbWF0Y2hlciA9IGNyZWF0ZVJvdXRlck1hdGNoZXIob3B0aW9ucy5yb3V0ZXMsIG9wdGlvbnMpO1xyXG4gICAgY29uc3QgcGFyc2VRdWVyeSQxID0gb3B0aW9ucy5wYXJzZVF1ZXJ5IHx8IHBhcnNlUXVlcnk7XHJcbiAgICBjb25zdCBzdHJpbmdpZnlRdWVyeSQxID0gb3B0aW9ucy5zdHJpbmdpZnlRdWVyeSB8fCBzdHJpbmdpZnlRdWVyeTtcclxuICAgIGNvbnN0IHJvdXRlckhpc3RvcnkgPSBvcHRpb25zLmhpc3Rvcnk7XHJcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmICFyb3V0ZXJIaXN0b3J5KVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvdmlkZSB0aGUgXCJoaXN0b3J5XCIgb3B0aW9uIHdoZW4gY2FsbGluZyBcImNyZWF0ZVJvdXRlcigpXCI6JyArXHJcbiAgICAgICAgICAgICcgaHR0cHM6Ly9uZXh0LnJvdXRlci52dWVqcy5vcmcvYXBpLyNoaXN0b3J5LicpO1xyXG4gICAgY29uc3QgYmVmb3JlR3VhcmRzID0gdXNlQ2FsbGJhY2tzKCk7XHJcbiAgICBjb25zdCBiZWZvcmVSZXNvbHZlR3VhcmRzID0gdXNlQ2FsbGJhY2tzKCk7XHJcbiAgICBjb25zdCBhZnRlckd1YXJkcyA9IHVzZUNhbGxiYWNrcygpO1xyXG4gICAgY29uc3QgY3VycmVudFJvdXRlID0gc2hhbGxvd1JlZihTVEFSVF9MT0NBVElPTl9OT1JNQUxJWkVEKTtcclxuICAgIGxldCBwZW5kaW5nTG9jYXRpb24gPSBTVEFSVF9MT0NBVElPTl9OT1JNQUxJWkVEO1xyXG4gICAgLy8gbGVhdmUgdGhlIHNjcm9sbFJlc3RvcmF0aW9uIGlmIG5vIHNjcm9sbEJlaGF2aW9yIGlzIHByb3ZpZGVkXHJcbiAgICBpZiAoaXNCcm93c2VyICYmIG9wdGlvbnMuc2Nyb2xsQmVoYXZpb3IgJiYgJ3Njcm9sbFJlc3RvcmF0aW9uJyBpbiBoaXN0b3J5KSB7XHJcbiAgICAgICAgaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbiA9ICdtYW51YWwnO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm9ybWFsaXplUGFyYW1zID0gYXBwbHlUb1BhcmFtcy5iaW5kKG51bGwsIHBhcmFtVmFsdWUgPT4gJycgKyBwYXJhbVZhbHVlKTtcclxuICAgIGNvbnN0IGVuY29kZVBhcmFtcyA9IGFwcGx5VG9QYXJhbXMuYmluZChudWxsLCBlbmNvZGVQYXJhbSk7XHJcbiAgICBjb25zdCBkZWNvZGVQYXJhbXMgPSBcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGludGVudGlvbmFsbHkgYXZvaWQgdGhlIHR5cGUgY2hlY2tcclxuICAgIGFwcGx5VG9QYXJhbXMuYmluZChudWxsLCBkZWNvZGUpO1xyXG4gICAgZnVuY3Rpb24gYWRkUm91dGUocGFyZW50T3JSb3V0ZSwgcm91dGUpIHtcclxuICAgICAgICBsZXQgcGFyZW50O1xyXG4gICAgICAgIGxldCByZWNvcmQ7XHJcbiAgICAgICAgaWYgKGlzUm91dGVOYW1lKHBhcmVudE9yUm91dGUpKSB7XHJcbiAgICAgICAgICAgIHBhcmVudCA9IG1hdGNoZXIuZ2V0UmVjb3JkTWF0Y2hlcihwYXJlbnRPclJvdXRlKTtcclxuICAgICAgICAgICAgcmVjb3JkID0gcm91dGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZWNvcmQgPSBwYXJlbnRPclJvdXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWF0Y2hlci5hZGRSb3V0ZShyZWNvcmQsIHBhcmVudCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiByZW1vdmVSb3V0ZShuYW1lKSB7XHJcbiAgICAgICAgY29uc3QgcmVjb3JkTWF0Y2hlciA9IG1hdGNoZXIuZ2V0UmVjb3JkTWF0Y2hlcihuYW1lKTtcclxuICAgICAgICBpZiAocmVjb3JkTWF0Y2hlcikge1xyXG4gICAgICAgICAgICBtYXRjaGVyLnJlbW92ZVJvdXRlKHJlY29yZE1hdGNoZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcclxuICAgICAgICAgICAgd2FybihgQ2Fubm90IHJlbW92ZSBub24tZXhpc3RlbnQgcm91dGUgXCIke1N0cmluZyhuYW1lKX1cImApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGdldFJvdXRlcygpIHtcclxuICAgICAgICByZXR1cm4gbWF0Y2hlci5nZXRSb3V0ZXMoKS5tYXAocm91dGVNYXRjaGVyID0+IHJvdXRlTWF0Y2hlci5yZWNvcmQpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaGFzUm91dGUobmFtZSkge1xyXG4gICAgICAgIHJldHVybiAhIW1hdGNoZXIuZ2V0UmVjb3JkTWF0Y2hlcihuYW1lKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHJlc29sdmUocmF3TG9jYXRpb24sIGN1cnJlbnRMb2NhdGlvbikge1xyXG4gICAgICAgIC8vIGNvbnN0IG9iamVjdExvY2F0aW9uID0gcm91dGVyTG9jYXRpb25Bc09iamVjdChyYXdMb2NhdGlvbilcclxuICAgICAgICAvLyB3ZSBjcmVhdGUgYSBjb3B5IHRvIG1vZGlmeSBpdCBsYXRlclxyXG4gICAgICAgIGN1cnJlbnRMb2NhdGlvbiA9IGFzc2lnbih7fSwgY3VycmVudExvY2F0aW9uIHx8IGN1cnJlbnRSb3V0ZS52YWx1ZSk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiByYXdMb2NhdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25Ob3JtYWxpemVkID0gcGFyc2VVUkwocGFyc2VRdWVyeSQxLCByYXdMb2NhdGlvbiwgY3VycmVudExvY2F0aW9uLnBhdGgpO1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkUm91dGUgPSBtYXRjaGVyLnJlc29sdmUoeyBwYXRoOiBsb2NhdGlvbk5vcm1hbGl6ZWQucGF0aCB9LCBjdXJyZW50TG9jYXRpb24pO1xyXG4gICAgICAgICAgICBjb25zdCBocmVmID0gcm91dGVySGlzdG9yeS5jcmVhdGVIcmVmKGxvY2F0aW9uTm9ybWFsaXplZC5mdWxsUGF0aCk7XHJcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcclxuICAgICAgICAgICAgICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoJy8vJykpXHJcbiAgICAgICAgICAgICAgICAgICAgd2FybihgTG9jYXRpb24gXCIke3Jhd0xvY2F0aW9ufVwiIHJlc29sdmVkIHRvIFwiJHtocmVmfVwiLiBBIHJlc29sdmVkIGxvY2F0aW9uIGNhbm5vdCBzdGFydCB3aXRoIG11bHRpcGxlIHNsYXNoZXMuYCk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghbWF0Y2hlZFJvdXRlLm1hdGNoZWQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2FybihgTm8gbWF0Y2ggZm91bmQgZm9yIGxvY2F0aW9uIHdpdGggcGF0aCBcIiR7cmF3TG9jYXRpb259XCJgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBsb2NhdGlvbk5vcm1hbGl6ZWQgaXMgYWx3YXlzIGEgbmV3IG9iamVjdFxyXG4gICAgICAgICAgICByZXR1cm4gYXNzaWduKGxvY2F0aW9uTm9ybWFsaXplZCwgbWF0Y2hlZFJvdXRlLCB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGRlY29kZVBhcmFtcyhtYXRjaGVkUm91dGUucGFyYW1zKSxcclxuICAgICAgICAgICAgICAgIGhhc2g6IGRlY29kZShsb2NhdGlvbk5vcm1hbGl6ZWQuaGFzaCksXHJcbiAgICAgICAgICAgICAgICByZWRpcmVjdGVkRnJvbTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgaHJlZixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBtYXRjaGVyTG9jYXRpb247XHJcbiAgICAgICAgLy8gcGF0aCBjb3VsZCBiZSByZWxhdGl2ZSBpbiBvYmplY3QgYXMgd2VsbFxyXG4gICAgICAgIGlmICgncGF0aCcgaW4gcmF3TG9jYXRpb24pIHtcclxuICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJlxyXG4gICAgICAgICAgICAgICAgJ3BhcmFtcycgaW4gcmF3TG9jYXRpb24gJiZcclxuICAgICAgICAgICAgICAgICEoJ25hbWUnIGluIHJhd0xvY2F0aW9uKSAmJlxyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogdGhlIHR5cGUgaXMgbmV2ZXJcclxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJhd0xvY2F0aW9uLnBhcmFtcykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB3YXJuKGBQYXRoIFwiJHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHRoZSB0eXBlIGlzIG5ldmVyXHJcbiAgICAgICAgICAgICAgICByYXdMb2NhdGlvbi5wYXRofVwiIHdhcyBwYXNzZWQgd2l0aCBwYXJhbXMgYnV0IHRoZXkgd2lsbCBiZSBpZ25vcmVkLiBVc2UgYSBuYW1lZCByb3V0ZSBhbG9uZ3NpZGUgcGFyYW1zIGluc3RlYWQuYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbWF0Y2hlckxvY2F0aW9uID0gYXNzaWduKHt9LCByYXdMb2NhdGlvbiwge1xyXG4gICAgICAgICAgICAgICAgcGF0aDogcGFyc2VVUkwocGFyc2VRdWVyeSQxLCByYXdMb2NhdGlvbi5wYXRoLCBjdXJyZW50TG9jYXRpb24ucGF0aCkucGF0aCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyByZW1vdmUgYW55IG51bGxpc2ggcGFyYW1cclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0UGFyYW1zID0gYXNzaWduKHt9LCByYXdMb2NhdGlvbi5wYXJhbXMpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0YXJnZXRQYXJhbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRQYXJhbXNba2V5XSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRhcmdldFBhcmFtc1trZXldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHBhc3MgZW5jb2RlZCB2YWx1ZXMgdG8gdGhlIG1hdGNoZXIsIHNvIGl0IGNhbiBwcm9kdWNlIGVuY29kZWQgcGF0aCBhbmQgZnVsbFBhdGhcclxuICAgICAgICAgICAgbWF0Y2hlckxvY2F0aW9uID0gYXNzaWduKHt9LCByYXdMb2NhdGlvbiwge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBlbmNvZGVQYXJhbXMocmF3TG9jYXRpb24ucGFyYW1zKSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIGN1cnJlbnQgbG9jYXRpb24gcGFyYW1zIGFyZSBkZWNvZGVkLCB3ZSBuZWVkIHRvIGVuY29kZSB0aGVtIGluIGNhc2UgdGhlXHJcbiAgICAgICAgICAgIC8vIG1hdGNoZXIgbWVyZ2VzIHRoZSBwYXJhbXNcclxuICAgICAgICAgICAgY3VycmVudExvY2F0aW9uLnBhcmFtcyA9IGVuY29kZVBhcmFtcyhjdXJyZW50TG9jYXRpb24ucGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbWF0Y2hlZFJvdXRlID0gbWF0Y2hlci5yZXNvbHZlKG1hdGNoZXJMb2NhdGlvbiwgY3VycmVudExvY2F0aW9uKTtcclxuICAgICAgICBjb25zdCBoYXNoID0gcmF3TG9jYXRpb24uaGFzaCB8fCAnJztcclxuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmIGhhc2ggJiYgIWhhc2guc3RhcnRzV2l0aCgnIycpKSB7XHJcbiAgICAgICAgICAgIHdhcm4oYEEgXFxgaGFzaFxcYCBzaG91bGQgYWx3YXlzIHN0YXJ0IHdpdGggdGhlIGNoYXJhY3RlciBcIiNcIi4gUmVwbGFjZSBcIiR7aGFzaH1cIiB3aXRoIFwiIyR7aGFzaH1cIi5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhlIG1hdGNoZXIgbWlnaHQgaGF2ZSBtZXJnZWQgY3VycmVudCBsb2NhdGlvbiBwYXJhbXMsIHNvXHJcbiAgICAgICAgLy8gd2UgbmVlZCB0byBydW4gdGhlIGRlY29kaW5nIGFnYWluXHJcbiAgICAgICAgbWF0Y2hlZFJvdXRlLnBhcmFtcyA9IG5vcm1hbGl6ZVBhcmFtcyhkZWNvZGVQYXJhbXMobWF0Y2hlZFJvdXRlLnBhcmFtcykpO1xyXG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gc3RyaW5naWZ5VVJMKHN0cmluZ2lmeVF1ZXJ5JDEsIGFzc2lnbih7fSwgcmF3TG9jYXRpb24sIHtcclxuICAgICAgICAgICAgaGFzaDogZW5jb2RlSGFzaChoYXNoKSxcclxuICAgICAgICAgICAgcGF0aDogbWF0Y2hlZFJvdXRlLnBhdGgsXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIGNvbnN0IGhyZWYgPSByb3V0ZXJIaXN0b3J5LmNyZWF0ZUhyZWYoZnVsbFBhdGgpO1xyXG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcclxuICAgICAgICAgICAgaWYgKGhyZWYuc3RhcnRzV2l0aCgnLy8nKSkge1xyXG4gICAgICAgICAgICAgICAgd2FybihgTG9jYXRpb24gXCIke3Jhd0xvY2F0aW9ufVwiIHJlc29sdmVkIHRvIFwiJHtocmVmfVwiLiBBIHJlc29sdmVkIGxvY2F0aW9uIGNhbm5vdCBzdGFydCB3aXRoIG11bHRpcGxlIHNsYXNoZXMuYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoIW1hdGNoZWRSb3V0ZS5tYXRjaGVkLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgd2FybihgTm8gbWF0Y2ggZm91bmQgZm9yIGxvY2F0aW9uIHdpdGggcGF0aCBcIiR7J3BhdGgnIGluIHJhd0xvY2F0aW9uID8gcmF3TG9jYXRpb24ucGF0aCA6IHJhd0xvY2F0aW9ufVwiYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFzc2lnbih7XHJcbiAgICAgICAgICAgIGZ1bGxQYXRoLFxyXG4gICAgICAgICAgICAvLyBrZWVwIHRoZSBoYXNoIGVuY29kZWQgc28gZnVsbFBhdGggaXMgZWZmZWN0aXZlbHkgcGF0aCArIGVuY29kZWRRdWVyeSArXHJcbiAgICAgICAgICAgIC8vIGhhc2hcclxuICAgICAgICAgICAgaGFzaCxcclxuICAgICAgICAgICAgcXVlcnk6IFxyXG4gICAgICAgICAgICAvLyBpZiB0aGUgdXNlciBpcyB1c2luZyBhIGN1c3RvbSBxdWVyeSBsaWIgbGlrZSBxcywgd2UgbWlnaHQgaGF2ZVxyXG4gICAgICAgICAgICAvLyBuZXN0ZWQgb2JqZWN0cywgc28gd2Uga2VlcCB0aGUgcXVlcnkgYXMgaXMsIG1lYW5pbmcgaXQgY2FuIGNvbnRhaW5cclxuICAgICAgICAgICAgLy8gbnVtYmVycyBhdCBgJHJvdXRlLnF1ZXJ5YCwgYnV0IGF0IHRoZSBwb2ludCwgdGhlIHVzZXIgd2lsbCBoYXZlIHRvXHJcbiAgICAgICAgICAgIC8vIHVzZSB0aGVpciBvd24gdHlwZSBhbnl3YXkuXHJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy9yb3V0ZXIvaXNzdWVzLzMyOCNpc3N1ZWNvbW1lbnQtNjQ5NDgxNTY3XHJcbiAgICAgICAgICAgIHN0cmluZ2lmeVF1ZXJ5JDEgPT09IHN0cmluZ2lmeVF1ZXJ5XHJcbiAgICAgICAgICAgICAgICA/IG5vcm1hbGl6ZVF1ZXJ5KHJhd0xvY2F0aW9uLnF1ZXJ5KVxyXG4gICAgICAgICAgICAgICAgOiAocmF3TG9jYXRpb24ucXVlcnkgfHwge30pLFxyXG4gICAgICAgIH0sIG1hdGNoZWRSb3V0ZSwge1xyXG4gICAgICAgICAgICByZWRpcmVjdGVkRnJvbTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBocmVmLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gbG9jYXRpb25Bc09iamVjdCh0bykge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdG8gPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgID8gcGFyc2VVUkwocGFyc2VRdWVyeSQxLCB0bywgY3VycmVudFJvdXRlLnZhbHVlLnBhdGgpXHJcbiAgICAgICAgICAgIDogYXNzaWduKHt9LCB0byk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBjaGVja0NhbmNlbGVkTmF2aWdhdGlvbih0bywgZnJvbSkge1xyXG4gICAgICAgIGlmIChwZW5kaW5nTG9jYXRpb24gIT09IHRvKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSb3V0ZXJFcnJvcig4IC8qIEVycm9yVHlwZXMuTkFWSUdBVElPTl9DQU5DRUxMRUQgKi8sIHtcclxuICAgICAgICAgICAgICAgIGZyb20sXHJcbiAgICAgICAgICAgICAgICB0byxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcHVzaCh0bykge1xyXG4gICAgICAgIHJldHVybiBwdXNoV2l0aFJlZGlyZWN0KHRvKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHJlcGxhY2UodG8pIHtcclxuICAgICAgICByZXR1cm4gcHVzaChhc3NpZ24obG9jYXRpb25Bc09iamVjdCh0byksIHsgcmVwbGFjZTogdHJ1ZSB9KSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVSZWRpcmVjdFJlY29yZCh0bykge1xyXG4gICAgICAgIGNvbnN0IGxhc3RNYXRjaGVkID0gdG8ubWF0Y2hlZFt0by5tYXRjaGVkLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIGlmIChsYXN0TWF0Y2hlZCAmJiBsYXN0TWF0Y2hlZC5yZWRpcmVjdCkge1xyXG4gICAgICAgICAgICBjb25zdCB7IHJlZGlyZWN0IH0gPSBsYXN0TWF0Y2hlZDtcclxuICAgICAgICAgICAgbGV0IG5ld1RhcmdldExvY2F0aW9uID0gdHlwZW9mIHJlZGlyZWN0ID09PSAnZnVuY3Rpb24nID8gcmVkaXJlY3QodG8pIDogcmVkaXJlY3Q7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmV3VGFyZ2V0TG9jYXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdUYXJnZXRMb2NhdGlvbiA9XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3VGFyZ2V0TG9jYXRpb24uaW5jbHVkZXMoJz8nKSB8fCBuZXdUYXJnZXRMb2NhdGlvbi5pbmNsdWRlcygnIycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKG5ld1RhcmdldExvY2F0aW9uID0gbG9jYXRpb25Bc09iamVjdChuZXdUYXJnZXRMb2NhdGlvbikpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogLy8gZm9yY2UgZW1wdHkgcGFyYW1zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBhdGg6IG5ld1RhcmdldExvY2F0aW9uIH07XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBmb3JjZSBlbXB0eSBwYXJhbXMgd2hlbiBhIHN0cmluZyBpcyBwYXNzZWQgdG8gbGV0XHJcbiAgICAgICAgICAgICAgICAvLyB0aGUgcm91dGVyIHBhcnNlIHRoZW0gYWdhaW5cclxuICAgICAgICAgICAgICAgIG5ld1RhcmdldExvY2F0aW9uLnBhcmFtcyA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiZcclxuICAgICAgICAgICAgICAgICEoJ3BhdGgnIGluIG5ld1RhcmdldExvY2F0aW9uKSAmJlxyXG4gICAgICAgICAgICAgICAgISgnbmFtZScgaW4gbmV3VGFyZ2V0TG9jYXRpb24pKSB7XHJcbiAgICAgICAgICAgICAgICB3YXJuKGBJbnZhbGlkIHJlZGlyZWN0IGZvdW5kOlxcbiR7SlNPTi5zdHJpbmdpZnkobmV3VGFyZ2V0TG9jYXRpb24sIG51bGwsIDIpfVxcbiB3aGVuIG5hdmlnYXRpbmcgdG8gXCIke3RvLmZ1bGxQYXRofVwiLiBBIHJlZGlyZWN0IG11c3QgY29udGFpbiBhIG5hbWUgb3IgcGF0aC4gVGhpcyB3aWxsIGJyZWFrIGluIHByb2R1Y3Rpb24uYCk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVkaXJlY3QnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXNzaWduKHtcclxuICAgICAgICAgICAgICAgIHF1ZXJ5OiB0by5xdWVyeSxcclxuICAgICAgICAgICAgICAgIGhhc2g6IHRvLmhhc2gsXHJcbiAgICAgICAgICAgICAgICAvLyBhdm9pZCB0cmFuc2ZlcnJpbmcgcGFyYW1zIGlmIHRoZSByZWRpcmVjdCBoYXMgYSBwYXRoXHJcbiAgICAgICAgICAgICAgICBwYXJhbXM6ICdwYXRoJyBpbiBuZXdUYXJnZXRMb2NhdGlvbiA/IHt9IDogdG8ucGFyYW1zLFxyXG4gICAgICAgICAgICB9LCBuZXdUYXJnZXRMb2NhdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcHVzaFdpdGhSZWRpcmVjdCh0bywgcmVkaXJlY3RlZEZyb20pIHtcclxuICAgICAgICBjb25zdCB0YXJnZXRMb2NhdGlvbiA9IChwZW5kaW5nTG9jYXRpb24gPSByZXNvbHZlKHRvKSk7XHJcbiAgICAgICAgY29uc3QgZnJvbSA9IGN1cnJlbnRSb3V0ZS52YWx1ZTtcclxuICAgICAgICBjb25zdCBkYXRhID0gdG8uc3RhdGU7XHJcbiAgICAgICAgY29uc3QgZm9yY2UgPSB0by5mb3JjZTtcclxuICAgICAgICAvLyB0byBjb3VsZCBiZSBhIHN0cmluZyB3aGVyZSBgcmVwbGFjZWAgaXMgYSBmdW5jdGlvblxyXG4gICAgICAgIGNvbnN0IHJlcGxhY2UgPSB0by5yZXBsYWNlID09PSB0cnVlO1xyXG4gICAgICAgIGNvbnN0IHNob3VsZFJlZGlyZWN0ID0gaGFuZGxlUmVkaXJlY3RSZWNvcmQodGFyZ2V0TG9jYXRpb24pO1xyXG4gICAgICAgIGlmIChzaG91bGRSZWRpcmVjdClcclxuICAgICAgICAgICAgcmV0dXJuIHB1c2hXaXRoUmVkaXJlY3QoYXNzaWduKGxvY2F0aW9uQXNPYmplY3Qoc2hvdWxkUmVkaXJlY3QpLCB7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZTogdHlwZW9mIHNob3VsZFJlZGlyZWN0ID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgICAgICAgICAgID8gYXNzaWduKHt9LCBkYXRhLCBzaG91bGRSZWRpcmVjdC5zdGF0ZSlcclxuICAgICAgICAgICAgICAgICAgICA6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICBmb3JjZSxcclxuICAgICAgICAgICAgICAgIHJlcGxhY2UsXHJcbiAgICAgICAgICAgIH0pLCBcclxuICAgICAgICAgICAgLy8ga2VlcCBvcmlnaW5hbCByZWRpcmVjdGVkRnJvbSBpZiBpdCBleGlzdHNcclxuICAgICAgICAgICAgcmVkaXJlY3RlZEZyb20gfHwgdGFyZ2V0TG9jYXRpb24pO1xyXG4gICAgICAgIC8vIGlmIGl0IHdhcyBhIHJlZGlyZWN0IHdlIGFscmVhZHkgY2FsbGVkIGBwdXNoV2l0aFJlZGlyZWN0YCBhYm92ZVxyXG4gICAgICAgIGNvbnN0IHRvTG9jYXRpb24gPSB0YXJnZXRMb2NhdGlvbjtcclxuICAgICAgICB0b0xvY2F0aW9uLnJlZGlyZWN0ZWRGcm9tID0gcmVkaXJlY3RlZEZyb207XHJcbiAgICAgICAgbGV0IGZhaWx1cmU7XHJcbiAgICAgICAgaWYgKCFmb3JjZSAmJiBpc1NhbWVSb3V0ZUxvY2F0aW9uKHN0cmluZ2lmeVF1ZXJ5JDEsIGZyb20sIHRhcmdldExvY2F0aW9uKSkge1xyXG4gICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUm91dGVyRXJyb3IoMTYgLyogRXJyb3JUeXBlcy5OQVZJR0FUSU9OX0RVUExJQ0FURUQgKi8sIHsgdG86IHRvTG9jYXRpb24sIGZyb20gfSk7XHJcbiAgICAgICAgICAgIC8vIHRyaWdnZXIgc2Nyb2xsIHRvIGFsbG93IHNjcm9sbGluZyB0byB0aGUgc2FtZSBhbmNob3JcclxuICAgICAgICAgICAgaGFuZGxlU2Nyb2xsKGZyb20sIGZyb20sIFxyXG4gICAgICAgICAgICAvLyB0aGlzIGlzIGEgcHVzaCwgdGhlIG9ubHkgd2F5IGZvciBpdCB0byBiZSB0cmlnZ2VyZWQgZnJvbSBhXHJcbiAgICAgICAgICAgIC8vIGhpc3RvcnkubGlzdGVuIGlzIHdpdGggYSByZWRpcmVjdCwgd2hpY2ggbWFrZXMgaXQgYmVjb21lIGEgcHVzaFxyXG4gICAgICAgICAgICB0cnVlLCBcclxuICAgICAgICAgICAgLy8gVGhpcyBjYW5ub3QgYmUgdGhlIGZpcnN0IG5hdmlnYXRpb24gYmVjYXVzZSB0aGUgaW5pdGlhbCBsb2NhdGlvblxyXG4gICAgICAgICAgICAvLyBjYW5ub3QgYmUgbWFudWFsbHkgbmF2aWdhdGVkIHRvXHJcbiAgICAgICAgICAgIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChmYWlsdXJlID8gUHJvbWlzZS5yZXNvbHZlKGZhaWx1cmUpIDogbmF2aWdhdGUodG9Mb2NhdGlvbiwgZnJvbSkpXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGlzTmF2aWdhdGlvbkZhaWx1cmUoZXJyb3IpXHJcbiAgICAgICAgICAgID8gLy8gbmF2aWdhdGlvbiByZWRpcmVjdHMgc3RpbGwgbWFyayB0aGUgcm91dGVyIGFzIHJlYWR5XHJcbiAgICAgICAgICAgICAgICBpc05hdmlnYXRpb25GYWlsdXJlKGVycm9yLCAyIC8qIEVycm9yVHlwZXMuTkFWSUdBVElPTl9HVUFSRF9SRURJUkVDVCAqLylcclxuICAgICAgICAgICAgICAgICAgICA/IGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgOiBtYXJrQXNSZWFkeShlcnJvcikgLy8gYWxzbyByZXR1cm5zIHRoZSBlcnJvclxyXG4gICAgICAgICAgICA6IC8vIHJlamVjdCBhbnkgdW5rbm93biBlcnJvclxyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckVycm9yKGVycm9yLCB0b0xvY2F0aW9uLCBmcm9tKSlcclxuICAgICAgICAgICAgLnRoZW4oKGZhaWx1cmUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGZhaWx1cmUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc05hdmlnYXRpb25GYWlsdXJlKGZhaWx1cmUsIDIgLyogRXJyb3JUeXBlcy5OQVZJR0FUSU9OX0dVQVJEX1JFRElSRUNUICovKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIHJlZGlyZWN0aW5nIHRvIHRoZSBzYW1lIGxvY2F0aW9uIHdlIHdlcmUgYWxyZWFkeSBhdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1NhbWVSb3V0ZUxvY2F0aW9uKHN0cmluZ2lmeVF1ZXJ5JDEsIHJlc29sdmUoZmFpbHVyZS50byksIHRvTG9jYXRpb24pICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBoYXZlIGRvbmUgaXQgYSBjb3VwbGUgb2YgdGltZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RlZEZyb20gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogYWRkZWQgb25seSBpbiBkZXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlZGlyZWN0ZWRGcm9tLl9jb3VudCA9IHJlZGlyZWN0ZWRGcm9tLl9jb3VudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAvLyBAdHMtZXhwZWN0LWVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RlZEZyb20uX2NvdW50ICsgMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxKSA+IDEwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4oYERldGVjdGVkIGFuIGluZmluaXRlIHJlZGlyZWN0aW9uIGluIGEgbmF2aWdhdGlvbiBndWFyZCB3aGVuIGdvaW5nIGZyb20gXCIke2Zyb20uZnVsbFBhdGh9XCIgdG8gXCIke3RvTG9jYXRpb24uZnVsbFBhdGh9XCIuIEFib3J0aW5nIHRvIGF2b2lkIGEgU3RhY2sgT3ZlcmZsb3cuIFRoaXMgd2lsbCBicmVhayBpbiBwcm9kdWN0aW9uIGlmIG5vdCBmaXhlZC5gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignSW5maW5pdGUgcmVkaXJlY3QgaW4gbmF2aWdhdGlvbiBndWFyZCcpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHB1c2hXaXRoUmVkaXJlY3QoXHJcbiAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBvcHRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgYXNzaWduKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VydmUgYW4gZXhpc3RpbmcgcmVwbGFjZW1lbnQgYnV0IGFsbG93IHRoZSByZWRpcmVjdCB0byBvdmVycmlkZSBpdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sIGxvY2F0aW9uQXNPYmplY3QoZmFpbHVyZS50byksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHR5cGVvZiBmYWlsdXJlLnRvID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhc3NpZ24oe30sIGRhdGEsIGZhaWx1cmUudG8uc3RhdGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pLCBcclxuICAgICAgICAgICAgICAgICAgICAvLyBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgcmVkaXJlY3RlZEZyb20gaWYgYW55XHJcbiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RlZEZyb20gfHwgdG9Mb2NhdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBmYWlsIHdlIGRvbid0IGZpbmFsaXplIHRoZSBuYXZpZ2F0aW9uXHJcbiAgICAgICAgICAgICAgICBmYWlsdXJlID0gZmluYWxpemVOYXZpZ2F0aW9uKHRvTG9jYXRpb24sIGZyb20sIHRydWUsIHJlcGxhY2UsIGRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyaWdnZXJBZnRlckVhY2godG9Mb2NhdGlvbiwgZnJvbSwgZmFpbHVyZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWlsdXJlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgdG8gcmVqZWN0IGFuZCBza2lwIGFsbCBuYXZpZ2F0aW9uIGd1YXJkcyBpZiBhIG5ldyBuYXZpZ2F0aW9uIGhhcHBlbmVkXHJcbiAgICAgKiBAcGFyYW0gdG9cclxuICAgICAqIEBwYXJhbSBmcm9tXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGNoZWNrQ2FuY2VsZWROYXZpZ2F0aW9uQW5kUmVqZWN0KHRvLCBmcm9tKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSBjaGVja0NhbmNlbGVkTmF2aWdhdGlvbih0bywgZnJvbSk7XHJcbiAgICAgICAgcmV0dXJuIGVycm9yID8gUHJvbWlzZS5yZWplY3QoZXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICB9XHJcbiAgICAvLyBUT0RPOiByZWZhY3RvciB0aGUgd2hvbGUgYmVmb3JlIGd1YXJkcyBieSBpbnRlcm5hbGx5IHVzaW5nIHJvdXRlci5iZWZvcmVFYWNoXHJcbiAgICBmdW5jdGlvbiBuYXZpZ2F0ZSh0bywgZnJvbSkge1xyXG4gICAgICAgIGxldCBndWFyZHM7XHJcbiAgICAgICAgY29uc3QgW2xlYXZpbmdSZWNvcmRzLCB1cGRhdGluZ1JlY29yZHMsIGVudGVyaW5nUmVjb3Jkc10gPSBleHRyYWN0Q2hhbmdpbmdSZWNvcmRzKHRvLCBmcm9tKTtcclxuICAgICAgICAvLyBhbGwgY29tcG9uZW50cyBoZXJlIGhhdmUgYmVlbiByZXNvbHZlZCBvbmNlIGJlY2F1c2Ugd2UgYXJlIGxlYXZpbmdcclxuICAgICAgICBndWFyZHMgPSBleHRyYWN0Q29tcG9uZW50c0d1YXJkcyhsZWF2aW5nUmVjb3Jkcy5yZXZlcnNlKCksICdiZWZvcmVSb3V0ZUxlYXZlJywgdG8sIGZyb20pO1xyXG4gICAgICAgIC8vIGxlYXZpbmdSZWNvcmRzIGlzIGFscmVhZHkgcmV2ZXJzZWRcclxuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBsZWF2aW5nUmVjb3Jkcykge1xyXG4gICAgICAgICAgICByZWNvcmQubGVhdmVHdWFyZHMuZm9yRWFjaChndWFyZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBndWFyZHMucHVzaChndWFyZFRvUHJvbWlzZUZuKGd1YXJkLCB0bywgZnJvbSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY2FuY2VsZWROYXZpZ2F0aW9uQ2hlY2sgPSBjaGVja0NhbmNlbGVkTmF2aWdhdGlvbkFuZFJlamVjdC5iaW5kKG51bGwsIHRvLCBmcm9tKTtcclxuICAgICAgICBndWFyZHMucHVzaChjYW5jZWxlZE5hdmlnYXRpb25DaGVjayk7XHJcbiAgICAgICAgLy8gcnVuIHRoZSBxdWV1ZSBvZiBwZXIgcm91dGUgYmVmb3JlUm91dGVMZWF2ZSBndWFyZHNcclxuICAgICAgICByZXR1cm4gKHJ1bkd1YXJkUXVldWUoZ3VhcmRzKVxyXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGdsb2JhbCBndWFyZHMgYmVmb3JlRWFjaFxyXG4gICAgICAgICAgICBndWFyZHMgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBndWFyZCBvZiBiZWZvcmVHdWFyZHMubGlzdCgpKSB7XHJcbiAgICAgICAgICAgICAgICBndWFyZHMucHVzaChndWFyZFRvUHJvbWlzZUZuKGd1YXJkLCB0bywgZnJvbSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGd1YXJkcy5wdXNoKGNhbmNlbGVkTmF2aWdhdGlvbkNoZWNrKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJ1bkd1YXJkUXVldWUoZ3VhcmRzKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGluIGNvbXBvbmVudHMgYmVmb3JlUm91dGVVcGRhdGVcclxuICAgICAgICAgICAgZ3VhcmRzID0gZXh0cmFjdENvbXBvbmVudHNHdWFyZHModXBkYXRpbmdSZWNvcmRzLCAnYmVmb3JlUm91dGVVcGRhdGUnLCB0bywgZnJvbSk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHVwZGF0aW5nUmVjb3Jkcykge1xyXG4gICAgICAgICAgICAgICAgcmVjb3JkLnVwZGF0ZUd1YXJkcy5mb3JFYWNoKGd1YXJkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBndWFyZHMucHVzaChndWFyZFRvUHJvbWlzZUZuKGd1YXJkLCB0bywgZnJvbSkpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZ3VhcmRzLnB1c2goY2FuY2VsZWROYXZpZ2F0aW9uQ2hlY2spO1xyXG4gICAgICAgICAgICAvLyBydW4gdGhlIHF1ZXVlIG9mIHBlciByb3V0ZSBiZWZvcmVFbnRlciBndWFyZHNcclxuICAgICAgICAgICAgcmV0dXJuIHJ1bkd1YXJkUXVldWUoZ3VhcmRzKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIHRoZSByb3V0ZSBiZWZvcmVFbnRlclxyXG4gICAgICAgICAgICBndWFyZHMgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgdG8ubWF0Y2hlZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gZG8gbm90IHRyaWdnZXIgYmVmb3JlRW50ZXIgb24gcmV1c2VkIHZpZXdzXHJcbiAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmJlZm9yZUVudGVyICYmICFmcm9tLm1hdGNoZWQuaW5jbHVkZXMocmVjb3JkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHJlY29yZC5iZWZvcmVFbnRlcikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBiZWZvcmVFbnRlciBvZiByZWNvcmQuYmVmb3JlRW50ZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWFyZHMucHVzaChndWFyZFRvUHJvbWlzZUZuKGJlZm9yZUVudGVyLCB0bywgZnJvbSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3VhcmRzLnB1c2goZ3VhcmRUb1Byb21pc2VGbihyZWNvcmQuYmVmb3JlRW50ZXIsIHRvLCBmcm9tKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGd1YXJkcy5wdXNoKGNhbmNlbGVkTmF2aWdhdGlvbkNoZWNrKTtcclxuICAgICAgICAgICAgLy8gcnVuIHRoZSBxdWV1ZSBvZiBwZXIgcm91dGUgYmVmb3JlRW50ZXIgZ3VhcmRzXHJcbiAgICAgICAgICAgIHJldHVybiBydW5HdWFyZFF1ZXVlKGd1YXJkcyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBOT1RFOiBhdCB0aGlzIHBvaW50IHRvLm1hdGNoZWQgaXMgbm9ybWFsaXplZCBhbmQgZG9lcyBub3QgY29udGFpbiBhbnkgKCkgPT4gUHJvbWlzZTxDb21wb25lbnQ+XHJcbiAgICAgICAgICAgIC8vIGNsZWFyIGV4aXN0aW5nIGVudGVyQ2FsbGJhY2tzLCB0aGVzZSBhcmUgYWRkZWQgYnkgZXh0cmFjdENvbXBvbmVudHNHdWFyZHNcclxuICAgICAgICAgICAgdG8ubWF0Y2hlZC5mb3JFYWNoKHJlY29yZCA9PiAocmVjb3JkLmVudGVyQ2FsbGJhY2tzID0ge30pKTtcclxuICAgICAgICAgICAgLy8gY2hlY2sgaW4tY29tcG9uZW50IGJlZm9yZVJvdXRlRW50ZXJcclxuICAgICAgICAgICAgZ3VhcmRzID0gZXh0cmFjdENvbXBvbmVudHNHdWFyZHMoZW50ZXJpbmdSZWNvcmRzLCAnYmVmb3JlUm91dGVFbnRlcicsIHRvLCBmcm9tKTtcclxuICAgICAgICAgICAgZ3VhcmRzLnB1c2goY2FuY2VsZWROYXZpZ2F0aW9uQ2hlY2spO1xyXG4gICAgICAgICAgICAvLyBydW4gdGhlIHF1ZXVlIG9mIHBlciByb3V0ZSBiZWZvcmVFbnRlciBndWFyZHNcclxuICAgICAgICAgICAgcmV0dXJuIHJ1bkd1YXJkUXVldWUoZ3VhcmRzKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGdsb2JhbCBndWFyZHMgYmVmb3JlUmVzb2x2ZVxyXG4gICAgICAgICAgICBndWFyZHMgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBndWFyZCBvZiBiZWZvcmVSZXNvbHZlR3VhcmRzLmxpc3QoKSkge1xyXG4gICAgICAgICAgICAgICAgZ3VhcmRzLnB1c2goZ3VhcmRUb1Byb21pc2VGbihndWFyZCwgdG8sIGZyb20pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBndWFyZHMucHVzaChjYW5jZWxlZE5hdmlnYXRpb25DaGVjayk7XHJcbiAgICAgICAgICAgIHJldHVybiBydW5HdWFyZFF1ZXVlKGd1YXJkcyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLy8gY2F0Y2ggYW55IG5hdmlnYXRpb24gY2FuY2VsZWRcclxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBpc05hdmlnYXRpb25GYWlsdXJlKGVyciwgOCAvKiBFcnJvclR5cGVzLk5BVklHQVRJT05fQ0FOQ0VMTEVEICovKVxyXG4gICAgICAgICAgICA/IGVyclxyXG4gICAgICAgICAgICA6IFByb21pc2UucmVqZWN0KGVycikpKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHRyaWdnZXJBZnRlckVhY2godG8sIGZyb20sIGZhaWx1cmUpIHtcclxuICAgICAgICAvLyBuYXZpZ2F0aW9uIGlzIGNvbmZpcm1lZCwgY2FsbCBhZnRlckd1YXJkc1xyXG4gICAgICAgIC8vIFRPRE86IHdyYXAgd2l0aCBlcnJvciBoYW5kbGVyc1xyXG4gICAgICAgIGZvciAoY29uc3QgZ3VhcmQgb2YgYWZ0ZXJHdWFyZHMubGlzdCgpKVxyXG4gICAgICAgICAgICBndWFyZCh0bywgZnJvbSwgZmFpbHVyZSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIC0gQ2xlYW5zIHVwIGFueSBuYXZpZ2F0aW9uIGd1YXJkc1xyXG4gICAgICogLSBDaGFuZ2VzIHRoZSB1cmwgaWYgbmVjZXNzYXJ5XHJcbiAgICAgKiAtIENhbGxzIHRoZSBzY3JvbGxCZWhhdmlvclxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBmaW5hbGl6ZU5hdmlnYXRpb24odG9Mb2NhdGlvbiwgZnJvbSwgaXNQdXNoLCByZXBsYWNlLCBkYXRhKSB7XHJcbiAgICAgICAgLy8gYSBtb3JlIHJlY2VudCBuYXZpZ2F0aW9uIHRvb2sgcGxhY2VcclxuICAgICAgICBjb25zdCBlcnJvciA9IGNoZWNrQ2FuY2VsZWROYXZpZ2F0aW9uKHRvTG9jYXRpb24sIGZyb20pO1xyXG4gICAgICAgIGlmIChlcnJvcilcclxuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xyXG4gICAgICAgIC8vIG9ubHkgY29uc2lkZXIgYXMgcHVzaCBpZiBpdCdzIG5vdCB0aGUgZmlyc3QgbmF2aWdhdGlvblxyXG4gICAgICAgIGNvbnN0IGlzRmlyc3ROYXZpZ2F0aW9uID0gZnJvbSA9PT0gU1RBUlRfTE9DQVRJT05fTk9STUFMSVpFRDtcclxuICAgICAgICBjb25zdCBzdGF0ZSA9ICFpc0Jyb3dzZXIgPyB7fSA6IGhpc3Rvcnkuc3RhdGU7XHJcbiAgICAgICAgLy8gY2hhbmdlIFVSTCBvbmx5IGlmIHRoZSB1c2VyIGRpZCBhIHB1c2gvcmVwbGFjZSBhbmQgaWYgaXQncyBub3QgdGhlIGluaXRpYWwgbmF2aWdhdGlvbiBiZWNhdXNlXHJcbiAgICAgICAgLy8gaXQncyBqdXN0IHJlZmxlY3RpbmcgdGhlIHVybFxyXG4gICAgICAgIGlmIChpc1B1c2gpIHtcclxuICAgICAgICAgICAgLy8gb24gdGhlIGluaXRpYWwgbmF2aWdhdGlvbiwgd2Ugd2FudCB0byByZXVzZSB0aGUgc2Nyb2xsIHBvc2l0aW9uIGZyb21cclxuICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGF0ZSBpZiBpdCBleGlzdHNcclxuICAgICAgICAgICAgaWYgKHJlcGxhY2UgfHwgaXNGaXJzdE5hdmlnYXRpb24pXHJcbiAgICAgICAgICAgICAgICByb3V0ZXJIaXN0b3J5LnJlcGxhY2UodG9Mb2NhdGlvbi5mdWxsUGF0aCwgYXNzaWduKHtcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGw6IGlzRmlyc3ROYXZpZ2F0aW9uICYmIHN0YXRlICYmIHN0YXRlLnNjcm9sbCxcclxuICAgICAgICAgICAgICAgIH0sIGRhdGEpKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgcm91dGVySGlzdG9yeS5wdXNoKHRvTG9jYXRpb24uZnVsbFBhdGgsIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBhY2NlcHQgY3VycmVudCBuYXZpZ2F0aW9uXHJcbiAgICAgICAgY3VycmVudFJvdXRlLnZhbHVlID0gdG9Mb2NhdGlvbjtcclxuICAgICAgICBoYW5kbGVTY3JvbGwodG9Mb2NhdGlvbiwgZnJvbSwgaXNQdXNoLCBpc0ZpcnN0TmF2aWdhdGlvbik7XHJcbiAgICAgICAgbWFya0FzUmVhZHkoKTtcclxuICAgIH1cclxuICAgIGxldCByZW1vdmVIaXN0b3J5TGlzdGVuZXI7XHJcbiAgICAvLyBhdHRhY2ggbGlzdGVuZXIgdG8gaGlzdG9yeSB0byB0cmlnZ2VyIG5hdmlnYXRpb25zXHJcbiAgICBmdW5jdGlvbiBzZXR1cExpc3RlbmVycygpIHtcclxuICAgICAgICAvLyBhdm9pZCBzZXR0aW5nIHVwIGxpc3RlbmVycyB0d2ljZSBkdWUgdG8gYW4gaW52YWxpZCBmaXJzdCBuYXZpZ2F0aW9uXHJcbiAgICAgICAgaWYgKHJlbW92ZUhpc3RvcnlMaXN0ZW5lcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHJlbW92ZUhpc3RvcnlMaXN0ZW5lciA9IHJvdXRlckhpc3RvcnkubGlzdGVuKCh0bywgX2Zyb20sIGluZm8pID0+IHtcclxuICAgICAgICAgICAgaWYgKCFyb3V0ZXIubGlzdGVuaW5nKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAvLyBjYW5ub3QgYmUgYSByZWRpcmVjdCByb3V0ZSBiZWNhdXNlIGl0IHdhcyBpbiBoaXN0b3J5XHJcbiAgICAgICAgICAgIGNvbnN0IHRvTG9jYXRpb24gPSByZXNvbHZlKHRvKTtcclxuICAgICAgICAgICAgLy8gZHVlIHRvIGR5bmFtaWMgcm91dGluZywgYW5kIHRvIGhhc2ggaGlzdG9yeSB3aXRoIG1hbnVhbCBuYXZpZ2F0aW9uXHJcbiAgICAgICAgICAgIC8vIChtYW51YWxseSBjaGFuZ2luZyB0aGUgdXJsIG9yIGNhbGxpbmcgaGlzdG9yeS5oYXNoID0gJyMvc29tZXdoZXJlJyksXHJcbiAgICAgICAgICAgIC8vIHRoZXJlIGNvdWxkIGJlIGEgcmVkaXJlY3QgcmVjb3JkIGluIGhpc3RvcnlcclxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkUmVkaXJlY3QgPSBoYW5kbGVSZWRpcmVjdFJlY29yZCh0b0xvY2F0aW9uKTtcclxuICAgICAgICAgICAgaWYgKHNob3VsZFJlZGlyZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBwdXNoV2l0aFJlZGlyZWN0KGFzc2lnbihzaG91bGRSZWRpcmVjdCwgeyByZXBsYWNlOiB0cnVlIH0pLCB0b0xvY2F0aW9uKS5jYXRjaChub29wKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwZW5kaW5nTG9jYXRpb24gPSB0b0xvY2F0aW9uO1xyXG4gICAgICAgICAgICBjb25zdCBmcm9tID0gY3VycmVudFJvdXRlLnZhbHVlO1xyXG4gICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgYmUgbW92ZWQgdG8gd2ViIGhpc3Rvcnk/XHJcbiAgICAgICAgICAgIGlmIChpc0Jyb3dzZXIpIHtcclxuICAgICAgICAgICAgICAgIHNhdmVTY3JvbGxQb3NpdGlvbihnZXRTY3JvbGxLZXkoZnJvbS5mdWxsUGF0aCwgaW5mby5kZWx0YSksIGNvbXB1dGVTY3JvbGxQb3NpdGlvbigpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBuYXZpZ2F0ZSh0b0xvY2F0aW9uLCBmcm9tKVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzTmF2aWdhdGlvbkZhaWx1cmUoZXJyb3IsIDQgLyogRXJyb3JUeXBlcy5OQVZJR0FUSU9OX0FCT1JURUQgKi8gfCA4IC8qIEVycm9yVHlwZXMuTkFWSUdBVElPTl9DQU5DRUxMRUQgKi8pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzTmF2aWdhdGlvbkZhaWx1cmUoZXJyb3IsIDIgLyogRXJyb3JUeXBlcy5OQVZJR0FUSU9OX0dVQVJEX1JFRElSRUNUICovKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgd2UgY291bGQgY2FsbCBpZiAoaW5mby5kZWx0YSkgcm91dGVySGlzdG9yeS5nbygtaW5mby5kZWx0YSxcclxuICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZSkgYnV0IHRoaXMgaXMgYnVnIHByb25lIGFzIHdlIGhhdmUgbm8gd2F5IHRvIHdhaXQgdGhlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbmF2aWdhdGlvbiB0byBiZSBmaW5pc2hlZCBiZWZvcmUgY2FsbGluZyBwdXNoV2l0aFJlZGlyZWN0LiBVc2luZ1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgc2V0VGltZW91dCBvZiAxNm1zIHNlZW1zIHRvIHdvcmsgYnV0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSBmb3JcclxuICAgICAgICAgICAgICAgICAgICAvLyBpdCB0byB3b3JrIG9uIGV2ZXJ5IGJyb3dzZXIuIFNvIGluc3RlYWQgd2UgZG8gbm90IHJlc3RvcmUgdGhlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaGlzdG9yeSBlbnRyeSBhbmQgdHJpZ2dlciBhIG5ldyBuYXZpZ2F0aW9uIGFzIHJlcXVlc3RlZCBieSB0aGVcclxuICAgICAgICAgICAgICAgICAgICAvLyBuYXZpZ2F0aW9uIGd1YXJkLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlcnJvciBpcyBhbHJlYWR5IGhhbmRsZWQgYnkgcm91dGVyLnB1c2ggd2UganVzdCB3YW50IHRvIGF2b2lkXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nZ2luZyB0aGUgZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICBwdXNoV2l0aFJlZGlyZWN0KGVycm9yLnRvLCB0b0xvY2F0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYXZvaWQgYW4gdW5jYXVnaHQgcmVqZWN0aW9uLCBsZXQgcHVzaCBjYWxsIHRyaWdnZXJFcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZmFpbHVyZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbnVhbCBjaGFuZ2UgaW4gaGFzaCBoaXN0b3J5ICM5MTYgZW5kaW5nIHVwIGluIHRoZSBVUkwgbm90XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5naW5nLCBidXQgaXQgd2FzIGNoYW5nZWQgYnkgdGhlIG1hbnVhbCB1cmwgY2hhbmdlLCBzbyB3ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIG1hbnVhbGx5IGNoYW5nZSBpdCBvdXJzZWx2ZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmF2aWdhdGlvbkZhaWx1cmUoZmFpbHVyZSwgNCAvKiBFcnJvclR5cGVzLk5BVklHQVRJT05fQUJPUlRFRCAqLyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiAvKiBFcnJvclR5cGVzLk5BVklHQVRJT05fRFVQTElDQVRFRCAqLykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpbmZvLmRlbHRhICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnR5cGUgPT09IE5hdmlnYXRpb25UeXBlLnBvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVySGlzdG9yeS5nbygtMSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKG5vb3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGF2b2lkIHRoZSB0aGVuIGJyYW5jaFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gZG8gbm90IHJlc3RvcmUgaGlzdG9yeSBvbiB1bmtub3duIGRpcmVjdGlvblxyXG4gICAgICAgICAgICAgICAgaWYgKGluZm8uZGVsdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICByb3V0ZXJIaXN0b3J5LmdvKC1pbmZvLmRlbHRhLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB1bnJlY29nbml6ZWQgZXJyb3IsIHRyYW5zZmVyIHRvIHRoZSBnbG9iYWwgaGFuZGxlclxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyaWdnZXJFcnJvcihlcnJvciwgdG9Mb2NhdGlvbiwgZnJvbSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAudGhlbigoZmFpbHVyZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZmFpbHVyZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgZmFpbHVyZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZU5hdmlnYXRpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIG5hdmlnYXRpb24sIGFsbCBtYXRjaGVkIGNvbXBvbmVudHMgYXJlIHJlc29sdmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvTG9jYXRpb24sIGZyb20sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIC8vIHJldmVydCB0aGUgbmF2aWdhdGlvblxyXG4gICAgICAgICAgICAgICAgaWYgKGZhaWx1cmUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5kZWx0YSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIG5ldyBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCwgc28gd2UgZG8gbm90IHdhbnQgdG8gcmV2ZXJ0LCB0aGF0IHdpbGwgY2hhbmdlIHRoZSBjdXJyZW50IGhpc3RvcnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50cnkgd2hpbGUgYSBkaWZmZXJlbnQgcm91dGUgaXMgZGlzcGxheWVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICFpc05hdmlnYXRpb25GYWlsdXJlKGZhaWx1cmUsIDggLyogRXJyb3JUeXBlcy5OQVZJR0FUSU9OX0NBTkNFTExFRCAqLykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVySGlzdG9yeS5nbygtaW5mby5kZWx0YSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbmZvLnR5cGUgPT09IE5hdmlnYXRpb25UeXBlLnBvcCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc05hdmlnYXRpb25GYWlsdXJlKGZhaWx1cmUsIDQgLyogRXJyb3JUeXBlcy5OQVZJR0FUSU9OX0FCT1JURUQgKi8gfCAxNiAvKiBFcnJvclR5cGVzLk5BVklHQVRJT05fRFVQTElDQVRFRCAqLykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFudWFsIGNoYW5nZSBpbiBoYXNoIGhpc3RvcnkgIzkxNlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIGxpa2UgYSBwdXNoIGJ1dCBsYWNrcyB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGRpcmVjdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXJIaXN0b3J5LmdvKC0xLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckFmdGVyRWFjaCh0b0xvY2F0aW9uLCBmcm9tLCBmYWlsdXJlKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5jYXRjaChub29wKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vIEluaXRpYWxpemF0aW9uIGFuZCBFcnJvcnNcclxuICAgIGxldCByZWFkeUhhbmRsZXJzID0gdXNlQ2FsbGJhY2tzKCk7XHJcbiAgICBsZXQgZXJyb3JIYW5kbGVycyA9IHVzZUNhbGxiYWNrcygpO1xyXG4gICAgbGV0IHJlYWR5O1xyXG4gICAgLyoqXHJcbiAgICAgKiBUcmlnZ2VyIGVycm9ySGFuZGxlcnMgYWRkZWQgdmlhIG9uRXJyb3IgYW5kIHRocm93cyB0aGUgZXJyb3IgYXMgd2VsbFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBlcnJvciAtIGVycm9yIHRvIHRocm93XHJcbiAgICAgKiBAcGFyYW0gdG8gLSBsb2NhdGlvbiB3ZSB3ZXJlIG5hdmlnYXRpbmcgdG8gd2hlbiB0aGUgZXJyb3IgaGFwcGVuZWRcclxuICAgICAqIEBwYXJhbSBmcm9tIC0gbG9jYXRpb24gd2Ugd2VyZSBuYXZpZ2F0aW5nIGZyb20gd2hlbiB0aGUgZXJyb3IgaGFwcGVuZWRcclxuICAgICAqIEByZXR1cm5zIHRoZSBlcnJvciBhcyBhIHJlamVjdGVkIHByb21pc2VcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gdHJpZ2dlckVycm9yKGVycm9yLCB0bywgZnJvbSkge1xyXG4gICAgICAgIG1hcmtBc1JlYWR5KGVycm9yKTtcclxuICAgICAgICBjb25zdCBsaXN0ID0gZXJyb3JIYW5kbGVycy5saXN0KCk7XHJcbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxpc3QuZm9yRWFjaChoYW5kbGVyID0+IGhhbmRsZXIoZXJyb3IsIHRvLCBmcm9tKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XHJcbiAgICAgICAgICAgICAgICB3YXJuKCd1bmNhdWdodCBlcnJvciBkdXJpbmcgcm91dGUgbmF2aWdhdGlvbjonKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGlzUmVhZHkoKSB7XHJcbiAgICAgICAgaWYgKHJlYWR5ICYmIGN1cnJlbnRSb3V0ZS52YWx1ZSAhPT0gU1RBUlRfTE9DQVRJT05fTk9STUFMSVpFRClcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHJlYWR5SGFuZGxlcnMuYWRkKFtyZXNvbHZlLCByZWplY3RdKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG1hcmtBc1JlYWR5KGVycikge1xyXG4gICAgICAgIGlmICghcmVhZHkpIHtcclxuICAgICAgICAgICAgLy8gc3RpbGwgbm90IHJlYWR5IGlmIGFuIGVycm9yIGhhcHBlbmVkXHJcbiAgICAgICAgICAgIHJlYWR5ID0gIWVycjtcclxuICAgICAgICAgICAgc2V0dXBMaXN0ZW5lcnMoKTtcclxuICAgICAgICAgICAgcmVhZHlIYW5kbGVyc1xyXG4gICAgICAgICAgICAgICAgLmxpc3QoKVxyXG4gICAgICAgICAgICAgICAgLmZvckVhY2goKFtyZXNvbHZlLCByZWplY3RdKSA9PiAoZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKCkpKTtcclxuICAgICAgICAgICAgcmVhZHlIYW5kbGVycy5yZXNldCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZXJyO1xyXG4gICAgfVxyXG4gICAgLy8gU2Nyb2xsIGJlaGF2aW9yXHJcbiAgICBmdW5jdGlvbiBoYW5kbGVTY3JvbGwodG8sIGZyb20sIGlzUHVzaCwgaXNGaXJzdE5hdmlnYXRpb24pIHtcclxuICAgICAgICBjb25zdCB7IHNjcm9sbEJlaGF2aW9yIH0gPSBvcHRpb25zO1xyXG4gICAgICAgIGlmICghaXNCcm93c2VyIHx8ICFzY3JvbGxCZWhhdmlvcilcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gKCFpc1B1c2ggJiYgZ2V0U2F2ZWRTY3JvbGxQb3NpdGlvbihnZXRTY3JvbGxLZXkodG8uZnVsbFBhdGgsIDApKSkgfHxcclxuICAgICAgICAgICAgKChpc0ZpcnN0TmF2aWdhdGlvbiB8fCAhaXNQdXNoKSAmJlxyXG4gICAgICAgICAgICAgICAgaGlzdG9yeS5zdGF0ZSAmJlxyXG4gICAgICAgICAgICAgICAgaGlzdG9yeS5zdGF0ZS5zY3JvbGwpIHx8XHJcbiAgICAgICAgICAgIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIG5leHRUaWNrKClcclxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gc2Nyb2xsQmVoYXZpb3IodG8sIGZyb20sIHNjcm9sbFBvc2l0aW9uKSlcclxuICAgICAgICAgICAgLnRoZW4ocG9zaXRpb24gPT4gcG9zaXRpb24gJiYgc2Nyb2xsVG9Qb3NpdGlvbihwb3NpdGlvbikpXHJcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gdHJpZ2dlckVycm9yKGVyciwgdG8sIGZyb20pKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGdvID0gKGRlbHRhKSA9PiByb3V0ZXJIaXN0b3J5LmdvKGRlbHRhKTtcclxuICAgIGxldCBzdGFydGVkO1xyXG4gICAgY29uc3QgaW5zdGFsbGVkQXBwcyA9IG5ldyBTZXQoKTtcclxuICAgIGNvbnN0IHJvdXRlciA9IHtcclxuICAgICAgICBjdXJyZW50Um91dGUsXHJcbiAgICAgICAgbGlzdGVuaW5nOiB0cnVlLFxyXG4gICAgICAgIGFkZFJvdXRlLFxyXG4gICAgICAgIHJlbW92ZVJvdXRlLFxyXG4gICAgICAgIGhhc1JvdXRlLFxyXG4gICAgICAgIGdldFJvdXRlcyxcclxuICAgICAgICByZXNvbHZlLFxyXG4gICAgICAgIG9wdGlvbnMsXHJcbiAgICAgICAgcHVzaCxcclxuICAgICAgICByZXBsYWNlLFxyXG4gICAgICAgIGdvLFxyXG4gICAgICAgIGJhY2s6ICgpID0+IGdvKC0xKSxcclxuICAgICAgICBmb3J3YXJkOiAoKSA9PiBnbygxKSxcclxuICAgICAgICBiZWZvcmVFYWNoOiBiZWZvcmVHdWFyZHMuYWRkLFxyXG4gICAgICAgIGJlZm9yZVJlc29sdmU6IGJlZm9yZVJlc29sdmVHdWFyZHMuYWRkLFxyXG4gICAgICAgIGFmdGVyRWFjaDogYWZ0ZXJHdWFyZHMuYWRkLFxyXG4gICAgICAgIG9uRXJyb3I6IGVycm9ySGFuZGxlcnMuYWRkLFxyXG4gICAgICAgIGlzUmVhZHksXHJcbiAgICAgICAgaW5zdGFsbChhcHApIHtcclxuICAgICAgICAgICAgY29uc3Qgcm91dGVyID0gdGhpcztcclxuICAgICAgICAgICAgYXBwLmNvbXBvbmVudCgnUm91dGVyTGluaycsIFJvdXRlckxpbmspO1xyXG4gICAgICAgICAgICBhcHAuY29tcG9uZW50KCdSb3V0ZXJWaWV3JywgUm91dGVyVmlldyk7XHJcbiAgICAgICAgICAgIGFwcC5jb25maWcuZ2xvYmFsUHJvcGVydGllcy4kcm91dGVyID0gcm91dGVyO1xyXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLCAnJHJvdXRlJywge1xyXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGdldDogKCkgPT4gdW5yZWYoY3VycmVudFJvdXRlKSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMgaW5pdGlhbCBuYXZpZ2F0aW9uIGlzIG9ubHkgbmVjZXNzYXJ5IG9uIGNsaWVudCwgb24gc2VydmVyIGl0IGRvZXNuJ3RcclxuICAgICAgICAgICAgLy8gbWFrZSBzZW5zZSBiZWNhdXNlIGl0IHdpbGwgY3JlYXRlIGFuIGV4dHJhIHVubmVjZXNzYXJ5IG5hdmlnYXRpb24gYW5kIGNvdWxkXHJcbiAgICAgICAgICAgIC8vIGxlYWQgdG8gcHJvYmxlbXNcclxuICAgICAgICAgICAgaWYgKGlzQnJvd3NlciAmJlxyXG4gICAgICAgICAgICAgICAgLy8gdXNlZCBmb3IgdGhlIGluaXRpYWwgbmF2aWdhdGlvbiBjbGllbnQgc2lkZSB0byBhdm9pZCBwdXNoaW5nXHJcbiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSB0aW1lcyB3aGVuIHRoZSByb3V0ZXIgaXMgdXNlZCBpbiBtdWx0aXBsZSBhcHBzXHJcbiAgICAgICAgICAgICAgICAhc3RhcnRlZCAmJlxyXG4gICAgICAgICAgICAgICAgY3VycmVudFJvdXRlLnZhbHVlID09PSBTVEFSVF9MT0NBVElPTl9OT1JNQUxJWkVEKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBzZWUgYWJvdmVcclxuICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcHVzaChyb3V0ZXJIaXN0b3J5LmxvY2F0aW9uKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4oJ1VuZXhwZWN0ZWQgZXJyb3Igd2hlbiBzdGFydGluZyB0aGUgcm91dGVyOicsIGVycik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCByZWFjdGl2ZVJvdXRlID0ge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIFNUQVJUX0xPQ0FUSU9OX05PUk1BTElaRUQpIHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHRoZSBrZXkgbWF0Y2hlc1xyXG4gICAgICAgICAgICAgICAgcmVhY3RpdmVSb3V0ZVtrZXldID0gY29tcHV0ZWQoKCkgPT4gY3VycmVudFJvdXRlLnZhbHVlW2tleV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFwcC5wcm92aWRlKHJvdXRlcktleSwgcm91dGVyKTtcclxuICAgICAgICAgICAgYXBwLnByb3ZpZGUocm91dGVMb2NhdGlvbktleSwgcmVhY3RpdmUocmVhY3RpdmVSb3V0ZSkpO1xyXG4gICAgICAgICAgICBhcHAucHJvdmlkZShyb3V0ZXJWaWV3TG9jYXRpb25LZXksIGN1cnJlbnRSb3V0ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHVubW91bnRBcHAgPSBhcHAudW5tb3VudDtcclxuICAgICAgICAgICAgaW5zdGFsbGVkQXBwcy5hZGQoYXBwKTtcclxuICAgICAgICAgICAgYXBwLnVubW91bnQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpbnN0YWxsZWRBcHBzLmRlbGV0ZShhcHApO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJvdXRlciBpcyBub3QgYXR0YWNoZWQgdG8gYW4gYXBwIGFueW1vcmVcclxuICAgICAgICAgICAgICAgIGlmIChpbnN0YWxsZWRBcHBzLnNpemUgPCAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZGF0ZSB0aGUgY3VycmVudCBuYXZpZ2F0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0xvY2F0aW9uID0gU1RBUlRfTE9DQVRJT05fTk9STUFMSVpFRDtcclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVIaXN0b3J5TGlzdGVuZXIgJiYgcmVtb3ZlSGlzdG9yeUxpc3RlbmVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSGlzdG9yeUxpc3RlbmVyID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Um91dGUudmFsdWUgPSBTVEFSVF9MT0NBVElPTl9OT1JNQUxJWkVEO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICByZWFkeSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdW5tb3VudEFwcCgpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAvLyBUT0RPOiB0aGlzIHByb2JhYmx5IG5lZWRzIHRvIGJlIHVwZGF0ZWQgc28gaXQgY2FuIGJlIHVzZWQgYnkgdnVlLXRlcm11aVxyXG4gICAgICAgICAgICBpZiAoKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pICYmIGlzQnJvd3Nlcikge1xyXG4gICAgICAgICAgICAgICAgYWRkRGV2dG9vbHMoYXBwLCByb3V0ZXIsIG1hdGNoZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcbiAgICByZXR1cm4gcm91dGVyO1xyXG59XHJcbmZ1bmN0aW9uIHJ1bkd1YXJkUXVldWUoZ3VhcmRzKSB7XHJcbiAgICByZXR1cm4gZ3VhcmRzLnJlZHVjZSgocHJvbWlzZSwgZ3VhcmQpID0+IHByb21pc2UudGhlbigoKSA9PiBndWFyZCgpKSwgUHJvbWlzZS5yZXNvbHZlKCkpO1xyXG59XHJcbmZ1bmN0aW9uIGV4dHJhY3RDaGFuZ2luZ1JlY29yZHModG8sIGZyb20pIHtcclxuICAgIGNvbnN0IGxlYXZpbmdSZWNvcmRzID0gW107XHJcbiAgICBjb25zdCB1cGRhdGluZ1JlY29yZHMgPSBbXTtcclxuICAgIGNvbnN0IGVudGVyaW5nUmVjb3JkcyA9IFtdO1xyXG4gICAgY29uc3QgbGVuID0gTWF0aC5tYXgoZnJvbS5tYXRjaGVkLmxlbmd0aCwgdG8ubWF0Y2hlZC5sZW5ndGgpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHJlY29yZEZyb20gPSBmcm9tLm1hdGNoZWRbaV07XHJcbiAgICAgICAgaWYgKHJlY29yZEZyb20pIHtcclxuICAgICAgICAgICAgaWYgKHRvLm1hdGNoZWQuZmluZChyZWNvcmQgPT4gaXNTYW1lUm91dGVSZWNvcmQocmVjb3JkLCByZWNvcmRGcm9tKSkpXHJcbiAgICAgICAgICAgICAgICB1cGRhdGluZ1JlY29yZHMucHVzaChyZWNvcmRGcm9tKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgbGVhdmluZ1JlY29yZHMucHVzaChyZWNvcmRGcm9tKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVjb3JkVG8gPSB0by5tYXRjaGVkW2ldO1xyXG4gICAgICAgIGlmIChyZWNvcmRUbykge1xyXG4gICAgICAgICAgICAvLyB0aGUgdHlwZSBkb2Vzbid0IG1hdHRlciBiZWNhdXNlIHdlIGFyZSBjb21wYXJpbmcgcGVyIHJlZmVyZW5jZVxyXG4gICAgICAgICAgICBpZiAoIWZyb20ubWF0Y2hlZC5maW5kKHJlY29yZCA9PiBpc1NhbWVSb3V0ZVJlY29yZChyZWNvcmQsIHJlY29yZFRvKSkpIHtcclxuICAgICAgICAgICAgICAgIGVudGVyaW5nUmVjb3Jkcy5wdXNoKHJlY29yZFRvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBbbGVhdmluZ1JlY29yZHMsIHVwZGF0aW5nUmVjb3JkcywgZW50ZXJpbmdSZWNvcmRzXTtcclxufVxuXG4vKipcclxuICogUmV0dXJucyB0aGUgcm91dGVyIGluc3RhbmNlLiBFcXVpdmFsZW50IHRvIHVzaW5nIGAkcm91dGVyYCBpbnNpZGVcclxuICogdGVtcGxhdGVzLlxyXG4gKi9cclxuZnVuY3Rpb24gdXNlUm91dGVyKCkge1xyXG4gICAgcmV0dXJuIGluamVjdChyb3V0ZXJLZXkpO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJvdXRlIGxvY2F0aW9uLiBFcXVpdmFsZW50IHRvIHVzaW5nIGAkcm91dGVgIGluc2lkZVxyXG4gKiB0ZW1wbGF0ZXMuXHJcbiAqL1xyXG5mdW5jdGlvbiB1c2VSb3V0ZSgpIHtcclxuICAgIHJldHVybiBpbmplY3Qocm91dGVMb2NhdGlvbktleSk7XHJcbn1cblxuZXhwb3J0IHsgTmF2aWdhdGlvbkZhaWx1cmVUeXBlLCBSb3V0ZXJMaW5rLCBSb3V0ZXJWaWV3LCBTVEFSVF9MT0NBVElPTl9OT1JNQUxJWkVEIGFzIFNUQVJUX0xPQ0FUSU9OLCBjcmVhdGVNZW1vcnlIaXN0b3J5LCBjcmVhdGVSb3V0ZXIsIGNyZWF0ZVJvdXRlck1hdGNoZXIsIGNyZWF0ZVdlYkhhc2hIaXN0b3J5LCBjcmVhdGVXZWJIaXN0b3J5LCBpc05hdmlnYXRpb25GYWlsdXJlLCBsb2FkUm91dGVMb2NhdGlvbiwgbWF0Y2hlZFJvdXRlS2V5LCBvbkJlZm9yZVJvdXRlTGVhdmUsIG9uQmVmb3JlUm91dGVVcGRhdGUsIHBhcnNlUXVlcnksIHJvdXRlTG9jYXRpb25LZXksIHJvdXRlcktleSwgcm91dGVyVmlld0xvY2F0aW9uS2V5LCBzdHJpbmdpZnlRdWVyeSwgdXNlTGluaywgdXNlUm91dGUsIHVzZVJvdXRlciwgdmlld0RlcHRoS2V5IH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/vue-router/dist/vue-router.mjs\n");

/***/ })

/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
/******/ 		if (cachedModule !== undefined) {
/******/ 			return cachedModule.exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			id: moduleId,
/******/ 			loaded: false,
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Flag the module as loaded
/******/ 		module.loaded = true;
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = __webpack_modules__;
/******/ 	
/************************************************************************/
/******/ 	/* webpack/runtime/amd options */
/******/ 	(() => {
/******/ 		__webpack_require__.amdO = {};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/chunk loaded */
/******/ 	(() => {
/******/ 		var deferred = [];
/******/ 		__webpack_require__.O = (result, chunkIds, fn, priority) => {
/******/ 			if(chunkIds) {
/******/ 				priority = priority || 0;
/******/ 				for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];
/******/ 				deferred[i] = [chunkIds, fn, priority];
/******/ 				return;
/******/ 			}
/******/ 			var notFulfilled = Infinity;
/******/ 			for (var i = 0; i < deferred.length; i++) {
/******/ 				var [chunkIds, fn, priority] = deferred[i];
/******/ 				var fulfilled = true;
/******/ 				for (var j = 0; j < chunkIds.length; j++) {
/******/ 					if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {
/******/ 						chunkIds.splice(j--, 1);
/******/ 					} else {
/******/ 						fulfilled = false;
/******/ 						if(priority < notFulfilled) notFulfilled = priority;
/******/ 					}
/******/ 				}
/******/ 				if(fulfilled) {
/******/ 					deferred.splice(i--, 1)
/******/ 					var r = fn();
/******/ 					if (r !== undefined) result = r;
/******/ 				}
/******/ 			}
/******/ 			return result;
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/compat get default export */
/******/ 	(() => {
/******/ 		// getDefaultExport function for compatibility with non-harmony modules
/******/ 		__webpack_require__.n = (module) => {
/******/ 			var getter = module && module.__esModule ?
/******/ 				() => (module['default']) :
/******/ 				() => (module);
/******/ 			__webpack_require__.d(getter, { a: getter });
/******/ 			return getter;
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/define property getters */
/******/ 	(() => {
/******/ 		// define getter functions for harmony exports
/******/ 		__webpack_require__.d = (exports, definition) => {
/******/ 			for(var key in definition) {
/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 				}
/******/ 			}
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/ensure chunk */
/******/ 	(() => {
/******/ 		__webpack_require__.f = {};
/******/ 		// This file contains only the entry chunk.
/******/ 		// The chunk loading function for additional chunks
/******/ 		__webpack_require__.e = (chunkId) => {
/******/ 			return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {
/******/ 				__webpack_require__.f[key](chunkId, promises);
/******/ 				return promises;
/******/ 			}, []));
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/get javascript chunk filename */
/******/ 	(() => {
/******/ 		// This function allow to reference async chunks
/******/ 		__webpack_require__.u = (chunkId) => {
/******/ 			// return url for filenames not based on template
/******/ 			if ({"resources_js_pages_Login_vue":1,"resources_js_core_components_Page_vue":1,"resources_js_pages_Dashboard_vue":1,"resources_js_core_components_ParentPage_vue":1,"resources_js_core_components_LegacyPage_vue":1,"resources_js_domain_bookings_pages_Berthing_vue":1,"resources_js_domain_ancillaries_pages_ParkingOptions_vue":1,"resources_js_domain_ancillaries_pages_parking-options_Index_vue":1,"resources_js_domain_Enquiries_pages_enquiry_vue":1,"resources_js_domain_mas_pages_Settings_vue":1,"resources_js_domain_mas_pages_settings_Index_vue":1,"resources_js_domain_mas_pages_DestinationExperiences_vue":1,"resources_js_domain_mas_pages_Guests_vue":1,"resources_js_domain_mas_pages_guests_Index_vue":1,"resources_js_domain_itinerary_pages_Itineraries_vue":1,"resources_js_domain_itinerary_pages_CreateOrEditItinerary_vue":1,"resources_js_domain_users_pages_Users_vue":1,"resources_js_domain_users_pages_users_Index_vue":1,"resources_js_domain_users_pages_users_Create_vue":1,"resources_js_domain_users_pages_users_Edit_vue":1,"resources_js_domain_permissions_pages_Permissions_vue":1,"resources_js_domain_permissions_pages_permissions_Index_vue":1,"resources_js_domain_permissions_pages_permissions_Edit_vue":1,"resources_js_core_components_forms_TextInput_vue":1,"resources_js_core_components_forms_ValidationError_vue":1,"resources_js_core_components_forms_HFormGroup_vue":1,"resources_js_core_components_Panel_vue":1,"resources_js_core_components_forms_EmailInput_vue":1,"resources_js_core_components_forms_PasswordInput_vue":1,"resources_js_core_components_forms_CheckboxInput_vue":1,"resources_js_core_components_Alert_vue":1}[chunkId]) return "js/" + chunkId + ".js";
/******/ 			// return url for filenames based on template
/******/ 			return undefined;
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/get mini-css chunk filename */
/******/ 	(() => {
/******/ 		// This function allow to reference all chunks
/******/ 		__webpack_require__.miniCssF = (chunkId) => {
/******/ 			// return url for filenames based on template
/******/ 			return "" + chunkId + ".css";
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/global */
/******/ 	(() => {
/******/ 		__webpack_require__.g = (function() {
/******/ 			if (typeof globalThis === 'object') return globalThis;
/******/ 			try {
/******/ 				return this || new Function('return this')();
/******/ 			} catch (e) {
/******/ 				if (typeof window === 'object') return window;
/******/ 			}
/******/ 		})();
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/harmony module decorator */
/******/ 	(() => {
/******/ 		__webpack_require__.hmd = (module) => {
/******/ 			module = Object.create(module);
/******/ 			if (!module.children) module.children = [];
/******/ 			Object.defineProperty(module, 'exports', {
/******/ 				enumerable: true,
/******/ 				set: () => {
/******/ 					throw new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);
/******/ 				}
/******/ 			});
/******/ 			return module;
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
/******/ 	(() => {
/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/load script */
/******/ 	(() => {
/******/ 		var inProgress = {};
/******/ 		// data-webpack is not used as build has no uniqueName
/******/ 		// loadScript function to load a script via script tag
/******/ 		__webpack_require__.l = (url, done, key, chunkId) => {
/******/ 			if(inProgress[url]) { inProgress[url].push(done); return; }
/******/ 			var script, needAttach;
/******/ 			if(key !== undefined) {
/******/ 				var scripts = document.getElementsByTagName("script");
/******/ 				for(var i = 0; i < scripts.length; i++) {
/******/ 					var s = scripts[i];
/******/ 					if(s.getAttribute("src") == url) { script = s; break; }
/******/ 				}
/******/ 			}
/******/ 			if(!script) {
/******/ 				needAttach = true;
/******/ 				script = document.createElement('script');
/******/ 		
/******/ 				script.charset = 'utf-8';
/******/ 				script.timeout = 120;
/******/ 				if (__webpack_require__.nc) {
/******/ 					script.setAttribute("nonce", __webpack_require__.nc);
/******/ 				}
/******/ 		
/******/ 				script.src = url;
/******/ 			}
/******/ 			inProgress[url] = [done];
/******/ 			var onScriptComplete = (prev, event) => {
/******/ 				// avoid mem leaks in IE.
/******/ 				script.onerror = script.onload = null;
/******/ 				clearTimeout(timeout);
/******/ 				var doneFns = inProgress[url];
/******/ 				delete inProgress[url];
/******/ 				script.parentNode && script.parentNode.removeChild(script);
/******/ 				doneFns && doneFns.forEach((fn) => (fn(event)));
/******/ 				if(prev) return prev(event);
/******/ 			}
/******/ 			var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);
/******/ 			script.onerror = onScriptComplete.bind(null, script.onerror);
/******/ 			script.onload = onScriptComplete.bind(null, script.onload);
/******/ 			needAttach && document.head.appendChild(script);
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/make namespace object */
/******/ 	(() => {
/******/ 		// define __esModule on exports
/******/ 		__webpack_require__.r = (exports) => {
/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 			}
/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/publicPath */
/******/ 	(() => {
/******/ 		__webpack_require__.p = "/";
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/jsonp chunk loading */
/******/ 	(() => {
/******/ 		// no baseURI
/******/ 		
/******/ 		// object to store loaded and loading chunks
/******/ 		// undefined = chunk not loaded, null = chunk preloaded/prefetched
/******/ 		// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
/******/ 		var installedChunks = {
/******/ 			"/js/app": 0,
/******/ 			"css/app": 0,
/******/ 			"css/theme-ocean": 0,
/******/ 			"css/nifty": 0,
/******/ 			"css/bootstrap-4-utilities": 0
/******/ 		};
/******/ 		
/******/ 		__webpack_require__.f.j = (chunkId, promises) => {
/******/ 				// JSONP chunk loading for javascript
/******/ 				var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;
/******/ 				if(installedChunkData !== 0) { // 0 means "already installed".
/******/ 		
/******/ 					// a Promise means "currently loading".
/******/ 					if(installedChunkData) {
/******/ 						promises.push(installedChunkData[2]);
/******/ 					} else {
/******/ 						if(!/^css\/(app|bootstrap\-4\-utilities|nifty|theme\-ocean)$/.test(chunkId)) {
/******/ 							// setup Promise in chunk cache
/******/ 							var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));
/******/ 							promises.push(installedChunkData[2] = promise);
/******/ 		
/******/ 							// start chunk loading
/******/ 							var url = __webpack_require__.p + __webpack_require__.u(chunkId);
/******/ 							// create error before stack unwound to get useful stacktrace later
/******/ 							var error = new Error();
/******/ 							var loadingEnded = (event) => {
/******/ 								if(__webpack_require__.o(installedChunks, chunkId)) {
/******/ 									installedChunkData = installedChunks[chunkId];
/******/ 									if(installedChunkData !== 0) installedChunks[chunkId] = undefined;
/******/ 									if(installedChunkData) {
/******/ 										var errorType = event && (event.type === 'load' ? 'missing' : event.type);
/******/ 										var realSrc = event && event.target && event.target.src;
/******/ 										error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')';
/******/ 										error.name = 'ChunkLoadError';
/******/ 										error.type = errorType;
/******/ 										error.request = realSrc;
/******/ 										installedChunkData[1](error);
/******/ 									}
/******/ 								}
/******/ 							};
/******/ 							__webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId);
/******/ 						} else installedChunks[chunkId] = 0;
/******/ 					}
/******/ 				}
/******/ 		};
/******/ 		
/******/ 		// no prefetching
/******/ 		
/******/ 		// no preloaded
/******/ 		
/******/ 		// no HMR
/******/ 		
/******/ 		// no HMR manifest
/******/ 		
/******/ 		__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);
/******/ 		
/******/ 		// install a JSONP callback for chunk loading
/******/ 		var webpackJsonpCallback = (parentChunkLoadingFunction, data) => {
/******/ 			var [chunkIds, moreModules, runtime] = data;
/******/ 			// add "moreModules" to the modules object,
/******/ 			// then flag all "chunkIds" as loaded and fire callback
/******/ 			var moduleId, chunkId, i = 0;
/******/ 			if(chunkIds.some((id) => (installedChunks[id] !== 0))) {
/******/ 				for(moduleId in moreModules) {
/******/ 					if(__webpack_require__.o(moreModules, moduleId)) {
/******/ 						__webpack_require__.m[moduleId] = moreModules[moduleId];
/******/ 					}
/******/ 				}
/******/ 				if(runtime) var result = runtime(__webpack_require__);
/******/ 			}
/******/ 			if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
/******/ 			for(;i < chunkIds.length; i++) {
/******/ 				chunkId = chunkIds[i];
/******/ 				if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {
/******/ 					installedChunks[chunkId][0]();
/******/ 				}
/******/ 				installedChunks[chunkId] = 0;
/******/ 			}
/******/ 			return __webpack_require__.O(result);
/******/ 		}
/******/ 		
/******/ 		var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || [];
/******/ 		chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
/******/ 		chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/nonce */
/******/ 	(() => {
/******/ 		__webpack_require__.nc = undefined;
/******/ 	})();
/******/ 	
/************************************************************************/
/******/ 	
/******/ 	// startup
/******/ 	// Load entry module and return exports
/******/ 	// This entry module depends on other loaded chunks and execution need to be delayed
/******/ 	__webpack_require__.O(undefined, ["css/app","css/theme-ocean","css/nifty","css/bootstrap-4-utilities"], () => (__webpack_require__("./resources/js/app.js")))
/******/ 	__webpack_require__.O(undefined, ["css/app","css/theme-ocean","css/nifty","css/bootstrap-4-utilities"], () => (__webpack_require__("./resources/less/bootstrap-4-utilities.less")))
/******/ 	__webpack_require__.O(undefined, ["css/app","css/theme-ocean","css/nifty","css/bootstrap-4-utilities"], () => (__webpack_require__("./resources/sass/app.scss")))
/******/ 	__webpack_require__.O(undefined, ["css/app","css/theme-ocean","css/nifty","css/bootstrap-4-utilities"], () => (__webpack_require__("./resources/sass/nifty.scss")))
/******/ 	var __webpack_exports__ = __webpack_require__.O(undefined, ["css/app","css/theme-ocean","css/nifty","css/bootstrap-4-utilities"], () => (__webpack_require__("./resources/sass/themes/type-b/theme-ocean.scss")))
/******/ 	__webpack_exports__ = __webpack_require__.O(__webpack_exports__);
/******/ 	
/******/ })()
;