You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
25 lines
149 KiB
JavaScript
25 lines
149 KiB
JavaScript
"use strict";
|
|
/*
|
|
* 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/).
|
|
*/
|
|
exports.id = "vendor-chunks/react-router-dom";
|
|
exports.ids = ["vendor-chunks/react-router-dom"];
|
|
exports.modules = {
|
|
|
|
/***/ "(ssr)/./node_modules/react-router-dom/dist/index.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./node_modules/react-router-dom/dist/index.js ***!
|
|
\*****************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbortedDeferredError: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_1__.AbortedDeferredError),\n/* harmony export */ Await: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.Await),\n/* harmony export */ BrowserRouter: () => (/* binding */ BrowserRouter),\n/* harmony export */ Form: () => (/* binding */ Form),\n/* harmony export */ HashRouter: () => (/* binding */ HashRouter),\n/* harmony export */ Link: () => (/* binding */ Link),\n/* harmony export */ MemoryRouter: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.MemoryRouter),\n/* harmony export */ NavLink: () => (/* binding */ NavLink),\n/* harmony export */ Navigate: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.Navigate),\n/* harmony export */ NavigationType: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_1__.Action),\n/* harmony export */ Outlet: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.Outlet),\n/* harmony export */ Route: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.Route),\n/* harmony export */ Router: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.Router),\n/* harmony export */ RouterProvider: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.RouterProvider),\n/* harmony export */ Routes: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.Routes),\n/* harmony export */ ScrollRestoration: () => (/* binding */ ScrollRestoration),\n/* harmony export */ UNSAFE_DataRouterContext: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_DataRouterContext),\n/* harmony export */ UNSAFE_DataRouterStateContext: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_DataRouterStateContext),\n/* harmony export */ UNSAFE_LocationContext: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_LocationContext),\n/* harmony export */ UNSAFE_NavigationContext: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_NavigationContext),\n/* harmony export */ UNSAFE_RouteContext: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_RouteContext),\n/* harmony export */ UNSAFE_useRouteId: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_useRouteId),\n/* harmony export */ UNSAFE_useScrollRestoration: () => (/* binding */ useScrollRestoration),\n/* harmony export */ createBrowserRouter: () => (/* binding */ createBrowserRouter),\n/* harmony export */ createHashRouter: () => (/* binding */ createHashRouter),\n/* harmony export */ createMemoryRouter: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.createMemoryRouter),\n/* harmony export */ createPath: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_1__.createPath),\n/* harmony export */ createRoutesFromChildren: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.createRoutesFromChildren),\n/* harmony export */ createRoutesFromElements: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.createRoutesFromElements),\n/* harmony export */ createSearchParams: () => (/* binding */ createSearchParams),\n/* harmony export */ defer: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_1__.defer),\n/* harmony export */ generatePath: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_1__.generatePath),\n/* harmony export */ isRouteErrorResponse: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_1__.isRouteErrorResponse),\n/* harmony export */ json: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_1__.json),\n/* harmony export */ matchPath: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_1__.matchPath),\n/* harmony export */ matchRoutes: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_1__.matchRoutes),\n/* harmony export */ parsePath: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_1__.parsePath),\n/* harmony export */ redirect: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_1__.redirect),\n/* harmony export */ redirectDocument: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_1__.redirectDocument),\n/* harmony export */ renderMatches: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.renderMatches),\n/* harmony export */ resolvePath: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_1__.resolvePath),\n/* harmony export */ unstable_HistoryRouter: () => (/* binding */ HistoryRouter),\n/* harmony export */ unstable_useBlocker: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.unstable_useBlocker),\n/* harmony export */ unstable_usePrompt: () => (/* binding */ usePrompt),\n/* harmony export */ useActionData: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useActionData),\n/* harmony export */ useAsyncError: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useAsyncError),\n/* harmony export */ useAsyncValue: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useAsyncValue),\n/* harmony export */ useBeforeUnload: () => (/* binding */ useBeforeUnload),\n/* harmony export */ useFetcher: () => (/* binding */ useFetcher),\n/* harmony export */ useFetchers: () => (/* binding */ useFetchers),\n/* harmony export */ useFormAction: () => (/* binding */ useFormAction),\n/* harmony export */ useHref: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useHref),\n/* harmony export */ useInRouterContext: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useInRouterContext),\n/* harmony export */ useLinkClickHandler: () => (/* binding */ useLinkClickHandler),\n/* harmony export */ useLoaderData: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useLoaderData),\n/* harmony export */ useLocation: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useLocation),\n/* harmony export */ useMatch: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useMatch),\n/* harmony export */ useMatches: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useMatches),\n/* harmony export */ useNavigate: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useNavigate),\n/* harmony export */ useNavigation: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useNavigation),\n/* harmony export */ useNavigationType: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useNavigationType),\n/* harmony export */ useOutlet: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useOutlet),\n/* harmony export */ useOutletContext: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useOutletContext),\n/* harmony export */ useParams: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useParams),\n/* harmony export */ useResolvedPath: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useResolvedPath),\n/* harmony export */ useRevalidator: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useRevalidator),\n/* harmony export */ useRouteError: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useRouteError),\n/* harmony export */ useRouteLoaderData: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useRouteLoaderData),\n/* harmony export */ useRoutes: () => (/* reexport safe */ react_router__WEBPACK_IMPORTED_MODULE_2__.useRoutes),\n/* harmony export */ useSearchParams: () => (/* binding */ useSearchParams),\n/* harmony export */ useSubmit: () => (/* binding */ useSubmit)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-router */ \"(ssr)/./node_modules/react-router/dist/index.js\");\n/* harmony import */ var react_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @remix-run/router */ \"(ssr)/./node_modules/@remix-run/router/dist/router.js\");\n/**\n * React Router DOM v6.15.0\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */ \n\n\n\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i];\n for(var key in source){\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nconst defaultMethod = \"get\";\nconst defaultEncType = \"application/x-www-form-urlencoded\";\nfunction isHtmlElement(object) {\n return object != null && typeof object.tagName === \"string\";\n}\nfunction isButtonElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"button\";\n}\nfunction isFormElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"form\";\n}\nfunction isInputElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"input\";\n}\nfunction isModifiedEvent(event) {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\nfunction shouldProcessLinkClick(event, target) {\n return event.button === 0 && // Ignore everything but left clicks\n (!target || target === \"_self\") && // Let browser handle \"target=_blank\" etc.\n !isModifiedEvent(event) // Ignore clicks with modifier keys\n ;\n}\n/**\n * Creates a URLSearchParams object using the given initializer.\n *\n * This is identical to `new URLSearchParams(init)` except it also\n * supports arrays as values in the object form of the initializer\n * instead of just strings. This is convenient when you need multiple\n * values for a given key, but don't want to use an array initializer.\n *\n * For example, instead of:\n *\n * let searchParams = new URLSearchParams([\n * ['sort', 'name'],\n * ['sort', 'price']\n * ]);\n *\n * you can do:\n *\n * let searchParams = createSearchParams({\n * sort: ['name', 'price']\n * });\n */ function createSearchParams(init) {\n if (init === void 0) {\n init = \"\";\n }\n return new URLSearchParams(typeof init === \"string\" || Array.isArray(init) || init instanceof URLSearchParams ? init : Object.keys(init).reduce((memo, key)=>{\n let value = init[key];\n return memo.concat(Array.isArray(value) ? value.map((v)=>[\n key,\n v\n ]) : [\n [\n key,\n value\n ]\n ]);\n }, []));\n}\nfunction getSearchParamsForLocation(locationSearch, defaultSearchParams) {\n let searchParams = createSearchParams(locationSearch);\n if (defaultSearchParams) {\n // Use `defaultSearchParams.forEach(...)` here instead of iterating of\n // `defaultSearchParams.keys()` to work-around a bug in Firefox related to\n // web extensions. Relevant Bugzilla tickets:\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1414602\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1023984\n defaultSearchParams.forEach((_, key)=>{\n if (!searchParams.has(key)) {\n defaultSearchParams.getAll(key).forEach((value)=>{\n searchParams.append(key, value);\n });\n }\n });\n }\n return searchParams;\n}\n// One-time check for submitter support\nlet _formDataSupportsSubmitter = null;\nfunction isFormDataSubmitterSupported() {\n if (_formDataSupportsSubmitter === null) {\n try {\n new FormData(document.createElement(\"form\"), // @ts-expect-error if FormData supports the submitter parameter, this will throw\n 0);\n _formDataSupportsSubmitter = false;\n } catch (e) {\n _formDataSupportsSubmitter = true;\n }\n }\n return _formDataSupportsSubmitter;\n}\nconst supportedFormEncTypes = new Set([\n \"application/x-www-form-urlencoded\",\n \"multipart/form-data\",\n \"text/plain\"\n]);\nfunction getFormEncType(encType) {\n if (encType != null && !supportedFormEncTypes.has(encType)) {\n true ? (0,react_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_warning)(false, '\"' + encType + '\" is not a valid `encType` for `<Form>`/`<fetcher.Form>` ' + ('and will default to \"' + defaultEncType + '\"')) : 0;\n return null;\n }\n return encType;\n}\nfunction getFormSubmissionInfo(target, basename) {\n let method;\n let action;\n let encType;\n let formData;\n let body;\n if (isFormElement(target)) {\n // When grabbing the action from the element, it will have had the basename\n // prefixed to ensure non-JS scenarios work, so strip it since we'll\n // re-prefix in the router\n let attr = target.getAttribute(\"action\");\n action = attr ? (0,react_router__WEBPACK_IMPORTED_MODULE_1__.stripBasename)(attr, basename) : null;\n method = target.getAttribute(\"method\") || defaultMethod;\n encType = getFormEncType(target.getAttribute(\"enctype\")) || defaultEncType;\n formData = new FormData(target);\n } else if (isButtonElement(target) || isInputElement(target) && (target.type === \"submit\" || target.type === \"image\")) {\n let form = target.form;\n if (form == null) {\n throw new Error('Cannot submit a <button> or <input type=\"submit\"> without a <form>');\n }\n // <button>/<input type=\"submit\"> may override attributes of <form>\n // When grabbing the action from the element, it will have had the basename\n // prefixed to ensure non-JS scenarios work, so strip it since we'll\n // re-prefix in the router\n let attr = target.getAttribute(\"formaction\") || form.getAttribute(\"action\");\n action = attr ? (0,react_router__WEBPACK_IMPORTED_MODULE_1__.stripBasename)(attr, basename) : null;\n method = target.getAttribute(\"formmethod\") || form.getAttribute(\"method\") || defaultMethod;\n encType = getFormEncType(target.getAttribute(\"formenctype\")) || getFormEncType(form.getAttribute(\"enctype\")) || defaultEncType;\n // Build a FormData object populated from a form and submitter\n formData = new FormData(form, target);\n // If this browser doesn't support the `FormData(el, submitter)` format,\n // then tack on the submitter value at the end. This is a lightweight\n // solution that is not 100% spec compliant. For complete support in older\n // browsers, consider using the `formdata-submitter-polyfill` package\n if (!isFormDataSubmitterSupported()) {\n let { name, type, value } = target;\n if (type === \"image\") {\n let prefix = name ? name + \".\" : \"\";\n formData.append(prefix + \"x\", \"0\");\n formData.append(prefix + \"y\", \"0\");\n } else if (name) {\n formData.append(name, value);\n }\n }\n } else if (isHtmlElement(target)) {\n throw new Error(\"Cannot submit element that is not <form>, <button>, or \" + '<input type=\"submit|image\">');\n } else {\n method = defaultMethod;\n action = null;\n encType = defaultEncType;\n body = target;\n }\n // Send body for <Form encType=\"text/plain\" so we encode it into text\n if (formData && encType === \"text/plain\") {\n body = formData;\n formData = undefined;\n }\n return {\n action,\n method: method.toLowerCase(),\n encType,\n formData,\n body\n };\n}\nconst _excluded = [\n \"onClick\",\n \"relative\",\n \"reloadDocument\",\n \"replace\",\n \"state\",\n \"target\",\n \"to\",\n \"preventScrollReset\"\n], _excluded2 = [\n \"aria-current\",\n \"caseSensitive\",\n \"className\",\n \"end\",\n \"style\",\n \"to\",\n \"children\"\n], _excluded3 = [\n \"reloadDocument\",\n \"replace\",\n \"state\",\n \"method\",\n \"action\",\n \"onSubmit\",\n \"submit\",\n \"relative\",\n \"preventScrollReset\"\n];\nfunction createBrowserRouter(routes, opts) {\n return (0,react_router__WEBPACK_IMPORTED_MODULE_1__.createRouter)({\n basename: opts == null ? void 0 : opts.basename,\n future: _extends({}, opts == null ? void 0 : opts.future, {\n v7_prependBasename: true\n }),\n history: (0,react_router__WEBPACK_IMPORTED_MODULE_1__.createBrowserHistory)({\n window: opts == null ? void 0 : opts.window\n }),\n hydrationData: (opts == null ? void 0 : opts.hydrationData) || parseHydrationData(),\n routes,\n mapRouteProperties: react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_mapRouteProperties\n }).initialize();\n}\nfunction createHashRouter(routes, opts) {\n return (0,react_router__WEBPACK_IMPORTED_MODULE_1__.createRouter)({\n basename: opts == null ? void 0 : opts.basename,\n future: _extends({}, opts == null ? void 0 : opts.future, {\n v7_prependBasename: true\n }),\n history: (0,react_router__WEBPACK_IMPORTED_MODULE_1__.createHashHistory)({\n window: opts == null ? void 0 : opts.window\n }),\n hydrationData: (opts == null ? void 0 : opts.hydrationData) || parseHydrationData(),\n routes,\n mapRouteProperties: react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_mapRouteProperties\n }).initialize();\n}\nfunction parseHydrationData() {\n var _window;\n let state = (_window = window) == null ? void 0 : _window.__staticRouterHydrationData;\n if (state && state.errors) {\n state = _extends({}, state, {\n errors: deserializeErrors(state.errors)\n });\n }\n return state;\n}\nfunction deserializeErrors(errors) {\n if (!errors) return null;\n let entries = Object.entries(errors);\n let serialized = {};\n for (let [key, val] of entries){\n // Hey you! If you change this, please change the corresponding logic in\n // serializeErrors in react-router-dom/server.tsx :)\n if (val && val.__type === \"RouteErrorResponse\") {\n serialized[key] = new react_router__WEBPACK_IMPORTED_MODULE_1__.ErrorResponse(val.status, val.statusText, val.data, val.internal === true);\n } else if (val && val.__type === \"Error\") {\n // Attempt to reconstruct the right type of Error (i.e., ReferenceError)\n if (val.__subType) {\n let ErrorConstructor = window[val.__subType];\n if (typeof ErrorConstructor === \"function\") {\n try {\n // @ts-expect-error\n let error = new ErrorConstructor(val.message);\n // Wipe away the client-side stack trace. Nothing to fill it in with\n // because we don't serialize SSR stack traces for security reasons\n error.stack = \"\";\n serialized[key] = error;\n } catch (e) {\n // no-op - fall through and create a normal Error\n }\n }\n }\n if (serialized[key] == null) {\n let error = new Error(val.message);\n // Wipe away the client-side stack trace. Nothing to fill it in with\n // because we don't serialize SSR stack traces for security reasons\n error.stack = \"\";\n serialized[key] = error;\n }\n } else {\n serialized[key] = val;\n }\n }\n return serialized;\n}\n//#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region Components\n////////////////////////////////////////////////////////////////////////////////\n/**\n Webpack + React 17 fails to compile on any of the following because webpack\n complains that `startTransition` doesn't exist in `React`:\n * import { startTransition } from \"react\"\n * import * as React from from \"react\";\n \"startTransition\" in React ? React.startTransition(() => setState()) : setState()\n * import * as React from from \"react\";\n \"startTransition\" in React ? React[\"startTransition\"](() => setState()) : setState()\n\n Moving it to a constant such as the following solves the Webpack/React 17 issue:\n * import * as React from from \"react\";\n const START_TRANSITION = \"startTransition\";\n START_TRANSITION in React ? React[START_TRANSITION](() => setState()) : setState()\n\n However, that introduces webpack/terser minification issues in production builds\n in React 18 where minification/obfuscation ends up removing the call of\n React.startTransition entirely from the first half of the ternary. Grabbing\n this exported reference once up front resolves that issue.\n\n See https://github.com/remix-run/react-router/issues/10579\n*/ const START_TRANSITION = \"startTransition\";\nconst startTransitionImpl = react__WEBPACK_IMPORTED_MODULE_0__[START_TRANSITION];\n/**\n * A `<Router>` for use in web browsers. Provides the cleanest URLs.\n */ function BrowserRouter(_ref) {\n let { basename, children, future, window: window1 } = _ref;\n let historyRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef();\n if (historyRef.current == null) {\n historyRef.current = (0,react_router__WEBPACK_IMPORTED_MODULE_1__.createBrowserHistory)({\n window: window1,\n v5Compat: true\n });\n }\n let history = historyRef.current;\n let [state, setStateImpl] = react__WEBPACK_IMPORTED_MODULE_0__.useState({\n action: history.action,\n location: history.location\n });\n let { v7_startTransition } = future || {};\n let setState = react__WEBPACK_IMPORTED_MODULE_0__.useCallback((newState)=>{\n v7_startTransition && startTransitionImpl ? startTransitionImpl(()=>setStateImpl(newState)) : setStateImpl(newState);\n }, [\n setStateImpl,\n v7_startTransition\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect(()=>history.listen(setState), [\n history,\n setState\n ]);\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router__WEBPACK_IMPORTED_MODULE_2__.Router, {\n basename: basename,\n children: children,\n location: state.location,\n navigationType: state.action,\n navigator: history\n });\n}\n/**\n * A `<Router>` for use in web browsers. Stores the location in the hash\n * portion of the URL so it is not sent to the server.\n */ function HashRouter(_ref2) {\n let { basename, children, future, window: window1 } = _ref2;\n let historyRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef();\n if (historyRef.current == null) {\n historyRef.current = (0,react_router__WEBPACK_IMPORTED_MODULE_1__.createHashHistory)({\n window: window1,\n v5Compat: true\n });\n }\n let history = historyRef.current;\n let [state, setStateImpl] = react__WEBPACK_IMPORTED_MODULE_0__.useState({\n action: history.action,\n location: history.location\n });\n let { v7_startTransition } = future || {};\n let setState = react__WEBPACK_IMPORTED_MODULE_0__.useCallback((newState)=>{\n v7_startTransition && startTransitionImpl ? startTransitionImpl(()=>setStateImpl(newState)) : setStateImpl(newState);\n }, [\n setStateImpl,\n v7_startTransition\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect(()=>history.listen(setState), [\n history,\n setState\n ]);\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router__WEBPACK_IMPORTED_MODULE_2__.Router, {\n basename: basename,\n children: children,\n location: state.location,\n navigationType: state.action,\n navigator: history\n });\n}\n/**\n * A `<Router>` that accepts a pre-instantiated history object. It's important\n * to note that using your own history object is highly discouraged and may add\n * two versions of the history library to your bundles unless you use the same\n * version of the history library that React Router uses internally.\n */ function HistoryRouter(_ref3) {\n let { basename, children, future, history } = _ref3;\n let [state, setStateImpl] = react__WEBPACK_IMPORTED_MODULE_0__.useState({\n action: history.action,\n location: history.location\n });\n let { v7_startTransition } = future || {};\n let setState = react__WEBPACK_IMPORTED_MODULE_0__.useCallback((newState)=>{\n v7_startTransition && startTransitionImpl ? startTransitionImpl(()=>setStateImpl(newState)) : setStateImpl(newState);\n }, [\n setStateImpl,\n v7_startTransition\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect(()=>history.listen(setState), [\n history,\n setState\n ]);\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router__WEBPACK_IMPORTED_MODULE_2__.Router, {\n basename: basename,\n children: children,\n location: state.location,\n navigationType: state.action,\n navigator: history\n });\n}\nif (true) {\n HistoryRouter.displayName = \"unstable_HistoryRouter\";\n}\nconst isBrowser = false && 0;\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n/**\n * The public API for rendering a history-aware <a>.\n */ const Link = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(function LinkWithRef(_ref4, ref) {\n let { onClick, relative, reloadDocument, replace, state, target, to, preventScrollReset } = _ref4, rest = _objectWithoutPropertiesLoose(_ref4, _excluded);\n let { basename } = react__WEBPACK_IMPORTED_MODULE_0__.useContext(react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_NavigationContext);\n // Rendered into <a href> for absolute URLs\n let absoluteHref;\n let isExternal = false;\n if (typeof to === \"string\" && ABSOLUTE_URL_REGEX.test(to)) {\n // Render the absolute href server- and client-side\n absoluteHref = to;\n // Only check for external origins client-side\n if (isBrowser) {\n try {\n let currentUrl = new URL(window.location.href);\n let targetUrl = to.startsWith(\"//\") ? new URL(currentUrl.protocol + to) : new URL(to);\n let path = (0,react_router__WEBPACK_IMPORTED_MODULE_1__.stripBasename)(targetUrl.pathname, basename);\n if (targetUrl.origin === currentUrl.origin && path != null) {\n // Strip the protocol/origin/basename for same-origin absolute URLs\n to = path + targetUrl.search + targetUrl.hash;\n } else {\n isExternal = true;\n }\n } catch (e) {\n // We can't do external URL detection without a valid URL\n true ? (0,react_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_warning)(false, '<Link to=\"' + to + '\"> contains an invalid URL which will probably break ' + \"when clicked - please update to a valid URL path.\") : 0;\n }\n }\n }\n // Rendered into <a href> for relative URLs\n let href = (0,react_router__WEBPACK_IMPORTED_MODULE_2__.useHref)(to, {\n relative\n });\n let internalOnClick = useLinkClickHandler(to, {\n replace,\n state,\n target,\n preventScrollReset,\n relative\n });\n function handleClick(event) {\n if (onClick) onClick(event);\n if (!event.defaultPrevented) {\n internalOnClick(event);\n }\n }\n return(/*#__PURE__*/ // eslint-disable-next-line jsx-a11y/anchor-has-content\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"a\", _extends({}, rest, {\n href: absoluteHref || href,\n onClick: isExternal || reloadDocument ? onClick : handleClick,\n ref: ref,\n target: target\n })));\n});\nif (true) {\n Link.displayName = \"Link\";\n}\n/**\n * A <Link> wrapper that knows if it's \"active\" or not.\n */ const NavLink = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(function NavLinkWithRef(_ref5, ref) {\n let { \"aria-current\": ariaCurrentProp = \"page\", caseSensitive = false, className: classNameProp = \"\", end = false, style: styleProp, to, children } = _ref5, rest = _objectWithoutPropertiesLoose(_ref5, _excluded2);\n let path = (0,react_router__WEBPACK_IMPORTED_MODULE_2__.useResolvedPath)(to, {\n relative: rest.relative\n });\n let location = (0,react_router__WEBPACK_IMPORTED_MODULE_2__.useLocation)();\n let routerState = react__WEBPACK_IMPORTED_MODULE_0__.useContext(react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_DataRouterStateContext);\n let { navigator } = react__WEBPACK_IMPORTED_MODULE_0__.useContext(react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_NavigationContext);\n let toPathname = navigator.encodeLocation ? navigator.encodeLocation(path).pathname : path.pathname;\n let locationPathname = location.pathname;\n let nextLocationPathname = routerState && routerState.navigation && routerState.navigation.location ? routerState.navigation.location.pathname : null;\n if (!caseSensitive) {\n locationPathname = locationPathname.toLowerCase();\n nextLocationPathname = nextLocationPathname ? nextLocationPathname.toLowerCase() : null;\n toPathname = toPathname.toLowerCase();\n }\n let isActive = locationPathname === toPathname || !end && locationPathname.startsWith(toPathname) && locationPathname.charAt(toPathname.length) === \"/\";\n let isPending = nextLocationPathname != null && (nextLocationPathname === toPathname || !end && nextLocationPathname.startsWith(toPathname) && nextLocationPathname.charAt(toPathname.length) === \"/\");\n let ariaCurrent = isActive ? ariaCurrentProp : undefined;\n let className;\n if (typeof classNameProp === \"function\") {\n className = classNameProp({\n isActive,\n isPending\n });\n } else {\n // If the className prop is not a function, we use a default `active`\n // class for <NavLink />s that are active. In v5 `active` was the default\n // value for `activeClassName`, but we are removing that API and can still\n // use the old default behavior for a cleaner upgrade path and keep the\n // simple styling rules working as they currently do.\n className = [\n classNameProp,\n isActive ? \"active\" : null,\n isPending ? \"pending\" : null\n ].filter(Boolean).join(\" \");\n }\n let style = typeof styleProp === \"function\" ? styleProp({\n isActive,\n isPending\n }) : styleProp;\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(Link, _extends({}, rest, {\n \"aria-current\": ariaCurrent,\n className: className,\n ref: ref,\n style: style,\n to: to\n }), typeof children === \"function\" ? children({\n isActive,\n isPending\n }) : children);\n});\nif (true) {\n NavLink.displayName = \"NavLink\";\n}\n/**\n * A `@remix-run/router`-aware `<form>`. It behaves like a normal form except\n * that the interaction with the server is with `fetch` instead of new document\n * requests, allowing components to add nicer UX to the page as the form is\n * submitted and returns with data.\n */ const Form = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef((props, ref)=>{\n let submit = useSubmit();\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(FormImpl, _extends({}, props, {\n submit: submit,\n ref: ref\n }));\n});\nif (true) {\n Form.displayName = \"Form\";\n}\nconst FormImpl = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef((_ref6, forwardedRef)=>{\n let { reloadDocument, replace, state, method = defaultMethod, action, onSubmit, submit, relative, preventScrollReset } = _ref6, props = _objectWithoutPropertiesLoose(_ref6, _excluded3);\n let formMethod = method.toLowerCase() === \"get\" ? \"get\" : \"post\";\n let formAction = useFormAction(action, {\n relative\n });\n let submitHandler = (event)=>{\n onSubmit && onSubmit(event);\n if (event.defaultPrevented) return;\n event.preventDefault();\n let submitter = event.nativeEvent.submitter;\n let submitMethod = (submitter == null ? void 0 : submitter.getAttribute(\"formmethod\")) || method;\n submit(submitter || event.currentTarget, {\n method: submitMethod,\n replace,\n state,\n relative,\n preventScrollReset\n });\n };\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"form\", _extends({\n ref: forwardedRef,\n method: formMethod,\n action: formAction,\n onSubmit: reloadDocument ? onSubmit : submitHandler\n }, props));\n});\nif (true) {\n FormImpl.displayName = \"FormImpl\";\n}\n/**\n * This component will emulate the browser's scroll restoration on location\n * changes.\n */ function ScrollRestoration(_ref7) {\n let { getKey, storageKey } = _ref7;\n useScrollRestoration({\n getKey,\n storageKey\n });\n return null;\n}\nif (true) {\n ScrollRestoration.displayName = \"ScrollRestoration\";\n}\n//#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region Hooks\n////////////////////////////////////////////////////////////////////////////////\nvar DataRouterHook;\n(function(DataRouterHook) {\n DataRouterHook[\"UseScrollRestoration\"] = \"useScrollRestoration\";\n DataRouterHook[\"UseSubmit\"] = \"useSubmit\";\n DataRouterHook[\"UseSubmitFetcher\"] = \"useSubmitFetcher\";\n DataRouterHook[\"UseFetcher\"] = \"useFetcher\";\n})(DataRouterHook || (DataRouterHook = {}));\nvar DataRouterStateHook;\n(function(DataRouterStateHook) {\n DataRouterStateHook[\"UseFetchers\"] = \"useFetchers\";\n DataRouterStateHook[\"UseScrollRestoration\"] = \"useScrollRestoration\";\n})(DataRouterStateHook || (DataRouterStateHook = {}));\nfunction getDataRouterConsoleError(hookName) {\n return hookName + \" must be used within a data router. See https://reactrouter.com/routers/picking-a-router.\";\n}\nfunction useDataRouterContext(hookName) {\n let ctx = react__WEBPACK_IMPORTED_MODULE_0__.useContext(react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_DataRouterContext);\n !ctx ? true ? (0,react_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, getDataRouterConsoleError(hookName)) : 0 : void 0;\n return ctx;\n}\nfunction useDataRouterState(hookName) {\n let state = react__WEBPACK_IMPORTED_MODULE_0__.useContext(react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_DataRouterStateContext);\n !state ? true ? (0,react_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, getDataRouterConsoleError(hookName)) : 0 : void 0;\n return state;\n}\n/**\n * Handles the click behavior for router `<Link>` components. This is useful if\n * you need to create custom `<Link>` components with the same click behavior we\n * use in our exported `<Link>`.\n */ function useLinkClickHandler(to, _temp) {\n let { target, replace: replaceProp, state, preventScrollReset, relative } = _temp === void 0 ? {} : _temp;\n let navigate = (0,react_router__WEBPACK_IMPORTED_MODULE_2__.useNavigate)();\n let location = (0,react_router__WEBPACK_IMPORTED_MODULE_2__.useLocation)();\n let path = (0,react_router__WEBPACK_IMPORTED_MODULE_2__.useResolvedPath)(to, {\n relative\n });\n return react__WEBPACK_IMPORTED_MODULE_0__.useCallback((event)=>{\n if (shouldProcessLinkClick(event, target)) {\n event.preventDefault();\n // If the URL hasn't changed, a regular <a> will do a replace instead of\n // a push, so do the same here unless the replace prop is explicitly set\n let replace = replaceProp !== undefined ? replaceProp : (0,react_router__WEBPACK_IMPORTED_MODULE_1__.createPath)(location) === (0,react_router__WEBPACK_IMPORTED_MODULE_1__.createPath)(path);\n navigate(to, {\n replace,\n state,\n preventScrollReset,\n relative\n });\n }\n }, [\n location,\n navigate,\n path,\n replaceProp,\n state,\n target,\n to,\n preventScrollReset,\n relative\n ]);\n}\n/**\n * A convenient wrapper for reading and writing search parameters via the\n * URLSearchParams interface.\n */ function useSearchParams(defaultInit) {\n true ? (0,react_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_warning)(typeof URLSearchParams !== \"undefined\", \"You cannot use the `useSearchParams` hook in a browser that does not \" + \"support the URLSearchParams API. If you need to support Internet \" + \"Explorer 11, we recommend you load a polyfill such as \" + \"https://github.com/ungap/url-search-params\\n\\n\" + \"If you're unsure how to load polyfills, we recommend you check out \" + \"https://polyfill.io/v3/ which provides some recommendations about how \" + \"to load polyfills only for users that need them, instead of for every \" + \"user.\") : 0;\n let defaultSearchParamsRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(createSearchParams(defaultInit));\n let hasSetSearchParamsRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(false);\n let location = (0,react_router__WEBPACK_IMPORTED_MODULE_2__.useLocation)();\n let searchParams = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(()=>// Only merge in the defaults if we haven't yet called setSearchParams.\n // Once we call that we want those to take precedence, otherwise you can't\n // remove a param with setSearchParams({}) if it has an initial value\n getSearchParamsForLocation(location.search, hasSetSearchParamsRef.current ? null : defaultSearchParamsRef.current), [\n location.search\n ]);\n let navigate = (0,react_router__WEBPACK_IMPORTED_MODULE_2__.useNavigate)();\n let setSearchParams = react__WEBPACK_IMPORTED_MODULE_0__.useCallback((nextInit, navigateOptions)=>{\n const newSearchParams = createSearchParams(typeof nextInit === \"function\" ? nextInit(searchParams) : nextInit);\n hasSetSearchParamsRef.current = true;\n navigate(\"?\" + newSearchParams, navigateOptions);\n }, [\n navigate,\n searchParams\n ]);\n return [\n searchParams,\n setSearchParams\n ];\n}\nfunction validateClientSideSubmission() {\n if (typeof document === \"undefined\") {\n throw new Error(\"You are calling submit during the server render. \" + \"Try calling submit within a `useEffect` or callback instead.\");\n }\n}\n/**\n * Returns a function that may be used to programmatically submit a form (or\n * some arbitrary data) to the server.\n */ function useSubmit() {\n let { router } = useDataRouterContext(DataRouterHook.UseSubmit);\n let { basename } = react__WEBPACK_IMPORTED_MODULE_0__.useContext(react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_NavigationContext);\n let currentRouteId = (0,react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_useRouteId)();\n return react__WEBPACK_IMPORTED_MODULE_0__.useCallback(function(target, options) {\n if (options === void 0) {\n options = {};\n }\n validateClientSideSubmission();\n let { action, method, encType, formData, body } = getFormSubmissionInfo(target, basename);\n router.navigate(options.action || action, {\n preventScrollReset: options.preventScrollReset,\n formData,\n body,\n formMethod: options.method || method,\n formEncType: options.encType || encType,\n replace: options.replace,\n state: options.state,\n fromRouteId: currentRouteId\n });\n }, [\n router,\n basename,\n currentRouteId\n ]);\n}\n/**\n * Returns the implementation for fetcher.submit\n */ function useSubmitFetcher(fetcherKey, fetcherRouteId) {\n let { router } = useDataRouterContext(DataRouterHook.UseSubmitFetcher);\n let { basename } = react__WEBPACK_IMPORTED_MODULE_0__.useContext(react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_NavigationContext);\n return react__WEBPACK_IMPORTED_MODULE_0__.useCallback(function(target, options) {\n if (options === void 0) {\n options = {};\n }\n validateClientSideSubmission();\n let { action, method, encType, formData, body } = getFormSubmissionInfo(target, basename);\n !(fetcherRouteId != null) ? true ? (0,react_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, \"No routeId available for useFetcher()\") : 0 : void 0;\n router.fetch(fetcherKey, fetcherRouteId, options.action || action, {\n preventScrollReset: options.preventScrollReset,\n formData,\n body,\n formMethod: options.method || method,\n formEncType: options.encType || encType\n });\n }, [\n router,\n basename,\n fetcherKey,\n fetcherRouteId\n ]);\n}\n// v7: Eventually we should deprecate this entirely in favor of using the\n// router method directly?\nfunction useFormAction(action, _temp2) {\n let { relative } = _temp2 === void 0 ? {} : _temp2;\n let { basename } = react__WEBPACK_IMPORTED_MODULE_0__.useContext(react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_NavigationContext);\n let routeContext = react__WEBPACK_IMPORTED_MODULE_0__.useContext(react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_RouteContext);\n !routeContext ? true ? (0,react_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, \"useFormAction must be used inside a RouteContext\") : 0 : void 0;\n let [match] = routeContext.matches.slice(-1);\n // Shallow clone path so we can modify it below, otherwise we modify the\n // object referenced by useMemo inside useResolvedPath\n let path = _extends({}, (0,react_router__WEBPACK_IMPORTED_MODULE_2__.useResolvedPath)(action ? action : \".\", {\n relative\n }));\n // Previously we set the default action to \".\". The problem with this is that\n // `useResolvedPath(\".\")` excludes search params of the resolved URL. This is\n // the intended behavior of when \".\" is specifically provided as\n // the form action, but inconsistent w/ browsers when the action is omitted.\n // https://github.com/remix-run/remix/issues/927\n let location = (0,react_router__WEBPACK_IMPORTED_MODULE_2__.useLocation)();\n if (action == null) {\n // Safe to write to this directly here since if action was undefined, we\n // would have called useResolvedPath(\".\") which will never include a search\n path.search = location.search;\n // When grabbing search params from the URL, remove the automatically\n // inserted ?index param so we match the useResolvedPath search behavior\n // which would not include ?index\n if (match.route.index) {\n let params = new URLSearchParams(path.search);\n params.delete(\"index\");\n path.search = params.toString() ? \"?\" + params.toString() : \"\";\n }\n }\n if ((!action || action === \".\") && match.route.index) {\n path.search = path.search ? path.search.replace(/^\\?/, \"?index&\") : \"?index\";\n }\n // If we're operating within a basename, prepend it to the pathname prior\n // to creating the form action. If this is a root navigation, then just use\n // the raw basename which allows the basename to have full control over the\n // presence of a trailing slash on root actions\n if (basename !== \"/\") {\n path.pathname = path.pathname === \"/\" ? basename : (0,react_router__WEBPACK_IMPORTED_MODULE_1__.joinPaths)([\n basename,\n path.pathname\n ]);\n }\n return (0,react_router__WEBPACK_IMPORTED_MODULE_1__.createPath)(path);\n}\nfunction createFetcherForm(fetcherKey, routeId) {\n let FetcherForm = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.forwardRef((props, ref)=>{\n let submit = useSubmitFetcher(fetcherKey, routeId);\n return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(FormImpl, _extends({}, props, {\n ref: ref,\n submit: submit\n }));\n });\n if (true) {\n FetcherForm.displayName = \"fetcher.Form\";\n }\n return FetcherForm;\n}\nlet fetcherId = 0;\n/**\n * Interacts with route loaders and actions without causing a navigation. Great\n * for any interaction that stays on the same page.\n */ function useFetcher() {\n var _route$matches;\n let { router } = useDataRouterContext(DataRouterHook.UseFetcher);\n let route = react__WEBPACK_IMPORTED_MODULE_0__.useContext(react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_RouteContext);\n !route ? true ? (0,react_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, \"useFetcher must be used inside a RouteContext\") : 0 : void 0;\n let routeId = (_route$matches = route.matches[route.matches.length - 1]) == null ? void 0 : _route$matches.route.id;\n !(routeId != null) ? true ? (0,react_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, 'useFetcher can only be used on routes that contain a unique \"id\"') : 0 : void 0;\n let [fetcherKey] = react__WEBPACK_IMPORTED_MODULE_0__.useState(()=>String(++fetcherId));\n let [Form] = react__WEBPACK_IMPORTED_MODULE_0__.useState(()=>{\n !routeId ? true ? (0,react_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, \"No routeId available for fetcher.Form()\") : 0 : void 0;\n return createFetcherForm(fetcherKey, routeId);\n });\n let [load] = react__WEBPACK_IMPORTED_MODULE_0__.useState(()=>(href)=>{\n !router ? true ? (0,react_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, \"No router available for fetcher.load()\") : 0 : void 0;\n !routeId ? true ? (0,react_router__WEBPACK_IMPORTED_MODULE_1__.UNSAFE_invariant)(false, \"No routeId available for fetcher.load()\") : 0 : void 0;\n router.fetch(fetcherKey, routeId, href);\n });\n let submit = useSubmitFetcher(fetcherKey, routeId);\n let fetcher = router.getFetcher(fetcherKey);\n let fetcherWithComponents = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(()=>_extends({\n Form,\n submit,\n load\n }, fetcher), [\n fetcher,\n Form,\n submit,\n load\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n // Is this busted when the React team gets real weird and calls effects\n // twice on mount? We really just need to garbage collect here when this\n // fetcher is no longer around.\n return ()=>{\n if (!router) {\n console.warn(\"No router available to clean up from useFetcher()\");\n return;\n }\n router.deleteFetcher(fetcherKey);\n };\n }, [\n router,\n fetcherKey\n ]);\n return fetcherWithComponents;\n}\n/**\n * Provides all fetchers currently on the page. Useful for layouts and parent\n * routes that need to provide pending/optimistic UI regarding the fetch.\n */ function useFetchers() {\n let state = useDataRouterState(DataRouterStateHook.UseFetchers);\n return [\n ...state.fetchers.values()\n ];\n}\nconst SCROLL_RESTORATION_STORAGE_KEY = \"react-router-scroll-positions\";\nlet savedScrollPositions = {};\n/**\n * When rendered inside a RouterProvider, will restore scroll positions on navigations\n */ function useScrollRestoration(_temp3) {\n let { getKey, storageKey } = _temp3 === void 0 ? {} : _temp3;\n let { router } = useDataRouterContext(DataRouterHook.UseScrollRestoration);\n let { restoreScrollPosition, preventScrollReset } = useDataRouterState(DataRouterStateHook.UseScrollRestoration);\n let { basename } = react__WEBPACK_IMPORTED_MODULE_0__.useContext(react_router__WEBPACK_IMPORTED_MODULE_2__.UNSAFE_NavigationContext);\n let location = (0,react_router__WEBPACK_IMPORTED_MODULE_2__.useLocation)();\n let matches = (0,react_router__WEBPACK_IMPORTED_MODULE_2__.useMatches)();\n let navigation = (0,react_router__WEBPACK_IMPORTED_MODULE_2__.useNavigation)();\n // Trigger manual scroll restoration while we're active\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n window.history.scrollRestoration = \"manual\";\n return ()=>{\n window.history.scrollRestoration = \"auto\";\n };\n }, []);\n // Save positions on pagehide\n usePageHide(react__WEBPACK_IMPORTED_MODULE_0__.useCallback(()=>{\n if (navigation.state === \"idle\") {\n let key = (getKey ? getKey(location, matches) : null) || location.key;\n savedScrollPositions[key] = window.scrollY;\n }\n sessionStorage.setItem(storageKey || SCROLL_RESTORATION_STORAGE_KEY, JSON.stringify(savedScrollPositions));\n window.history.scrollRestoration = \"auto\";\n }, [\n storageKey,\n getKey,\n navigation.state,\n location,\n matches\n ]));\n // Read in any saved scroll locations\n if (typeof document !== \"undefined\") {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect(()=>{\n try {\n let sessionPositions = sessionStorage.getItem(storageKey || SCROLL_RESTORATION_STORAGE_KEY);\n if (sessionPositions) {\n savedScrollPositions = JSON.parse(sessionPositions);\n }\n } catch (e) {\n // no-op, use default empty object\n }\n }, [\n storageKey\n ]);\n // Enable scroll restoration in the router\n // eslint-disable-next-line react-hooks/rules-of-hooks\n react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect(()=>{\n let getKeyWithoutBasename = getKey && basename !== \"/\" ? (location, matches)=>getKey(_extends({}, location, {\n pathname: (0,react_router__WEBPACK_IMPORTED_MODULE_1__.stripBasename)(location.pathname, basename) || location.pathname\n }), matches) : getKey;\n let disableScrollRestoration = router == null ? void 0 : router.enableScrollRestoration(savedScrollPositions, ()=>window.scrollY, getKeyWithoutBasename);\n return ()=>disableScrollRestoration && disableScrollRestoration();\n }, [\n router,\n basename,\n getKey\n ]);\n // Restore scrolling when state.restoreScrollPosition changes\n // eslint-disable-next-line react-hooks/rules-of-hooks\n react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect(()=>{\n // Explicit false means don't do anything (used for submissions)\n if (restoreScrollPosition === false) {\n return;\n }\n // been here before, scroll to it\n if (typeof restoreScrollPosition === \"number\") {\n window.scrollTo(0, restoreScrollPosition);\n return;\n }\n // try to scroll to the hash\n if (location.hash) {\n let el = document.getElementById(decodeURIComponent(location.hash.slice(1)));\n if (el) {\n el.scrollIntoView();\n return;\n }\n }\n // Don't reset if this navigation opted out\n if (preventScrollReset === true) {\n return;\n }\n // otherwise go to the top on new locations\n window.scrollTo(0, 0);\n }, [\n location,\n restoreScrollPosition,\n preventScrollReset\n ]);\n }\n}\n/**\n * Setup a callback to be fired on the window's `beforeunload` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */ function useBeforeUnload(callback, options) {\n let { capture } = options || {};\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n let opts = capture != null ? {\n capture\n } : undefined;\n window.addEventListener(\"beforeunload\", callback, opts);\n return ()=>{\n window.removeEventListener(\"beforeunload\", callback, opts);\n };\n }, [\n callback,\n capture\n ]);\n}\n/**\n * Setup a callback to be fired on the window's `pagehide` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes. This event is better supported than beforeunload across browsers.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */ function usePageHide(callback, options) {\n let { capture } = options || {};\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n let opts = capture != null ? {\n capture\n } : undefined;\n window.addEventListener(\"pagehide\", callback, opts);\n return ()=>{\n window.removeEventListener(\"pagehide\", callback, opts);\n };\n }, [\n callback,\n capture\n ]);\n}\n/**\n * Wrapper around useBlocker to show a window.confirm prompt to users instead\n * of building a custom UI with useBlocker.\n *\n * Warning: This has *a lot of rough edges* and behaves very differently (and\n * very incorrectly in some cases) across browsers if user click addition\n * back/forward navigations while the confirm is open. Use at your own risk.\n */ function usePrompt(_ref8) {\n let { when, message } = _ref8;\n let blocker = (0,react_router__WEBPACK_IMPORTED_MODULE_2__.unstable_useBlocker)(when);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n if (blocker.state === \"blocked\") {\n let proceed = window.confirm(message);\n if (proceed) {\n // This timeout is needed to avoid a weird \"race\" on POP navigations\n // between the `window.history` revert navigation and the result of\n // `window.confirm`\n setTimeout(blocker.proceed, 0);\n } else {\n blocker.reset();\n }\n }\n }, [\n blocker,\n message\n ]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(()=>{\n if (blocker.state === \"blocked\" && !when) {\n blocker.reset();\n }\n }, [\n blocker,\n when\n ]);\n}\n//#endregion\n //# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyLWRvbS9kaXN0L2luZGV4LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Q0FTQyxHQUM4QjtBQUM2UTtBQUNnaEI7QUFDdnBCO0FBRXJLLFNBQVM4RDtJQUNQQSxXQUFXQyxPQUFPQyxNQUFNLEdBQUdELE9BQU9DLE1BQU0sQ0FBQ0MsSUFBSSxLQUFLLFNBQVVDLE1BQU07UUFDaEUsSUFBSyxJQUFJQyxJQUFJLEdBQUdBLElBQUlDLFVBQVVDLE1BQU0sRUFBRUYsSUFBSztZQUN6QyxJQUFJRyxTQUFTRixTQUFTLENBQUNELEVBQUU7WUFDekIsSUFBSyxJQUFJSSxPQUFPRCxPQUFRO2dCQUN0QixJQUFJUCxPQUFPUyxTQUFTLENBQUNDLGNBQWMsQ0FBQ0MsSUFBSSxDQUFDSixRQUFRQyxNQUFNO29CQUNyREwsTUFBTSxDQUFDSyxJQUFJLEdBQUdELE1BQU0sQ0FBQ0MsSUFBSTtnQkFDM0I7WUFDRjtRQUNGO1FBQ0EsT0FBT0w7SUFDVDtJQUNBLE9BQU9KLFNBQVNhLEtBQUssQ0FBQyxJQUFJLEVBQUVQO0FBQzlCO0FBQ0EsU0FBU1EsOEJBQThCTixNQUFNLEVBQUVPLFFBQVE7SUFDckQsSUFBSVAsVUFBVSxNQUFNLE9BQU8sQ0FBQztJQUM1QixJQUFJSixTQUFTLENBQUM7SUFDZCxJQUFJWSxhQUFhZixPQUFPZ0IsSUFBSSxDQUFDVDtJQUM3QixJQUFJQyxLQUFLSjtJQUNULElBQUtBLElBQUksR0FBR0EsSUFBSVcsV0FBV1QsTUFBTSxFQUFFRixJQUFLO1FBQ3RDSSxNQUFNTyxVQUFVLENBQUNYLEVBQUU7UUFDbkIsSUFBSVUsU0FBU0csT0FBTyxDQUFDVCxRQUFRLEdBQUc7UUFDaENMLE1BQU0sQ0FBQ0ssSUFBSSxHQUFHRCxNQUFNLENBQUNDLElBQUk7SUFD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b2R1bGVzL3JlYWN0LXJvdXRlci1kb20vZGlzdC9pbmRleC5qcz8wM2E2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVhY3QgUm91dGVyIERPTSB2Ni4xNS4wXG4gKlxuICogQ29weXJpZ2h0IChjKSBSZW1peCBTb2Z0d2FyZSBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFLm1kIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFVOU0FGRV9tYXBSb3V0ZVByb3BlcnRpZXMsIFJvdXRlciwgVU5TQUZFX05hdmlnYXRpb25Db250ZXh0LCB1c2VIcmVmLCB1c2VSZXNvbHZlZFBhdGgsIHVzZUxvY2F0aW9uLCBVTlNBRkVfRGF0YVJvdXRlclN0YXRlQ29udGV4dCwgdXNlTmF2aWdhdGUsIGNyZWF0ZVBhdGgsIFVOU0FGRV91c2VSb3V0ZUlkLCBVTlNBRkVfUm91dGVDb250ZXh0LCB1c2VNYXRjaGVzLCB1c2VOYXZpZ2F0aW9uLCB1bnN0YWJsZV91c2VCbG9ja2VyLCBVTlNBRkVfRGF0YVJvdXRlckNvbnRleHQgfSBmcm9tICdyZWFjdC1yb3V0ZXInO1xuZXhwb3J0IHsgQWJvcnRlZERlZmVycmVkRXJyb3IsIEF3YWl0LCBNZW1vcnlSb3V0ZXIsIE5hdmlnYXRlLCBOYXZpZ2F0aW9uVHlwZSwgT3V0bGV0LCBSb3V0ZSwgUm91dGVyLCBSb3V0ZXJQcm92aWRlciwgUm91dGVzLCBVTlNBRkVfRGF0YVJvdXRlckNvbnRleHQsIFVOU0FGRV9EYXRhUm91dGVyU3RhdGVDb250ZXh0LCBVTlNBRkVfTG9jYXRpb25Db250ZXh0LCBVTlNBRkVfTmF2aWdhdGlvbkNvbnRleHQsIFVOU0FGRV9Sb3V0ZUNvbnRleHQsIFVOU0FGRV91c2VSb3V0ZUlkLCBjcmVhdGVNZW1vcnlSb3V0ZXIsIGNyZWF0ZVBhdGgsIGNyZWF0ZVJvdXRlc0Zyb21DaGlsZHJlbiwgY3JlYXRlUm91dGVzRnJvbUVsZW1lbnRzLCBkZWZlciwgZ2VuZXJhdGVQYXRoLCBpc1JvdXRlRXJyb3JSZXNwb25zZSwganNvbiwgbWF0Y2hQYXRoLCBtYXRjaFJvdXRlcywgcGFyc2VQYXRoLCByZWRpcmVjdCwgcmVkaXJlY3REb2N1bWVudCwgcmVuZGVyTWF0Y2hlcywgcmVzb2x2ZVBhdGgsIHVuc3RhYmxlX3VzZUJsb2NrZXIsIHVzZUFjdGlvbkRhdGEsIHVzZUFzeW5jRXJyb3IsIHVzZUFzeW5jVmFsdWUsIHVzZUhyZWYsIHVzZUluUm91dGVyQ29udGV4dCwgdXNlTG9hZGVyRGF0YSwgdXNlTG9jYXRpb24sIHVzZU1hdGNoLCB1c2VNYXRjaGVzLCB1c2VOYXZpZ2F0ZSwgdXNlTmF2aWdhdGlvbiwgdXNlTmF2aWdhdGlvblR5cGUsIHVzZU91dGxldCwgdXNlT3V0bGV0Q29udGV4dCwgdXNlUGFyYW1zLCB1c2VSZXNvbHZlZFBhdGgsIHVzZVJldmFsaWRhdG9yLCB1c2VSb3V0ZUVycm9yLCB1c2VSb3V0ZUxvYWRlckRhdGEsIHVzZVJvdXRlcyB9IGZyb20gJ3JlYWN0LXJvdXRlcic7XG5pbXBvcnQgeyBzdHJpcEJhc2VuYW1lLCBVTlNBRkVfd2FybmluZywgY3JlYXRlUm91dGVyLCBjcmVhdGVCcm93c2VySGlzdG9yeSwgY3JlYXRlSGFzaEhpc3RvcnksIEVycm9yUmVzcG9uc2UsIFVOU0FGRV9pbnZhcmlhbnQsIGpvaW5QYXRocyB9IGZyb20gJ0ByZW1peC1ydW4vcm91dGVyJztcblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5jb25zdCBkZWZhdWx0TWV0aG9kID0gXCJnZXRcIjtcbmNvbnN0IGRlZmF1bHRFbmNUeXBlID0gXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIjtcbmZ1bmN0aW9uIGlzSHRtbEVsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiB0eXBlb2Ygb2JqZWN0LnRhZ05hbWUgPT09IFwic3RyaW5nXCI7XG59XG5mdW5jdGlvbiBpc0J1dHRvbkVsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiBpc0h0bWxFbGVtZW50KG9iamVjdCkgJiYgb2JqZWN0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJidXR0b25cIjtcbn1cbmZ1bmN0aW9uIGlzRm9ybUVsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiBpc0h0bWxFbGVtZW50KG9iamVjdCkgJiYgb2JqZWN0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJmb3JtXCI7XG59XG5mdW5jdGlvbiBpc0lucHV0RWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIGlzSHRtbEVsZW1lbnQob2JqZWN0KSAmJiBvYmplY3QudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCI7XG59XG5mdW5jdGlvbiBpc01vZGlmaWVkRXZlbnQoZXZlbnQpIHtcbiAgcmV0dXJuICEhKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuc2hpZnRLZXkpO1xufVxuZnVuY3Rpb24gc2hvdWxkUHJvY2Vzc0xpbmtDbGljayhldmVudCwgdGFyZ2V0KSB7XG4gIHJldHVybiBldmVudC5idXR0b24gPT09IDAgJiYgKFxuICAvLyBJZ25vcmUgZXZlcnl0aGluZyBidXQgbGVmdCBjbGlja3NcbiAgIXRhcmdldCB8fCB0YXJnZXQgPT09IFwiX3NlbGZcIikgJiZcbiAgLy8gTGV0IGJyb3dzZXIgaGFuZGxlIFwidGFyZ2V0PV9ibGFua1wiIGV0Yy5cbiAgIWlzTW9kaWZpZWRFdmVudChldmVudCkgLy8gSWdub3JlIGNsaWNrcyB3aXRoIG1vZGlmaWVyIGtleXNcbiAgO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdCB1c2luZyB0aGUgZ2l2ZW4gaW5pdGlhbGl6ZXIuXG4gKlxuICogVGhpcyBpcyBpZGVudGljYWwgdG8gYG5ldyBVUkxTZWFyY2hQYXJhbXMoaW5pdClgIGV4Y2VwdCBpdCBhbHNvXG4gKiBzdXBwb3J0cyBhcnJheXMgYXMgdmFsdWVzIGluIHRoZSBvYmplY3QgZm9ybSBvZiB0aGUgaW5pdGlhbGl6ZXJcbiAqIGluc3RlYWQgb2YganVzdCBzdHJpbmdzLiBUaGlzIGlzIGNvbnZlbmllbnQgd2hlbiB5b3UgbmVlZCBtdWx0aXBsZVxuICogdmFsdWVzIGZvciBhIGdpdmVuIGtleSwgYnV0IGRvbid0IHdhbnQgdG8gdXNlIGFuIGFycmF5IGluaXRpYWxpemVyLlxuICpcbiAqIEZvciBleGFtcGxlLCBpbnN0ZWFkIG9mOlxuICpcbiAqICAgbGV0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoW1xuICogICAgIFsnc29ydCcsICduYW1lJ10sXG4gKiAgICAgWydzb3J0JywgJ3ByaWNlJ11cbiAqICAgXSk7XG4gKlxuICogeW91IGNhbiBkbzpcbiAqXG4gKiAgIGxldCBzZWFyY2hQYXJhbXMgPSBjcmVhdGVTZWFyY2hQYXJhbXMoe1xuICogICAgIHNvcnQ6IFsnbmFtZScsICdwcmljZSddXG4gKiAgIH0pO1xuICovXG5mdW5jdGlvbiBjcmVhdGVTZWFyY2hQYXJhbXMoaW5pdCkge1xuICBpZiAoaW5pdCA9PT0gdm9pZCAwKSB7XG4gICAgaW5pdCA9IFwiXCI7XG4gIH1cbiAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXModHlwZW9mIGluaXQgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheShpbml0KSB8fCBpbml0IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zID8gaW5pdCA6IE9iamVjdC5rZXlzKGluaXQpLnJlZHVjZSgobWVtbywga2V5KSA9PiB7XG4gICAgbGV0IHZhbHVlID0gaW5pdFtrZXldO1xuICAgIHJldHVybiBtZW1vLmNvbmNhdChBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcCh2ID0+IFtrZXksIHZdKSA6IFtba2V5LCB2YWx1ZV1dKTtcbiAgfSwgW10pKTtcbn1cbmZ1bmN0aW9uIGdldFNlYXJjaFBhcmFtc0ZvckxvY2F0aW9uKGxvY2F0aW9uU2VhcmNoLCBkZWZhdWx0U2VhcmNoUGFyYW1zKSB7XG4gIGxldCBzZWFyY2hQYXJhbXMgPSBjcmVhdGVTZWFyY2hQYXJhbXMobG9jYXRpb25TZWFyY2gpO1xuICBpZiAoZGVmYXVsdFNlYXJjaFBhcmFtcykge1xuICAgIC8vIFVzZSBgZGVmYXVsdFNlYXJjaFBhcmFtcy5mb3JFYWNoKC4uLilgIGhlcmUgaW5zdGVhZCBvZiBpdGVyYXRpbmcgb2ZcbiAgICAvLyBgZGVmYXVsdFNlYXJjaFBhcmFtcy5rZXlzKClgIHRvIHdvcmstYXJvdW5kIGEgYnVnIGluIEZpcmVmb3ggcmVsYXRlZCB0b1xuICAgIC8vIHdlYiBleHRlbnNpb25zLiBSZWxldmFudCBCdWd6aWxsYSB0aWNrZXRzOlxuICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTE0MTQ2MDJcbiAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDIzOTg0XG4gICAgZGVmYXVsdFNlYXJjaFBhcmFtcy5mb3JFYWNoKChfLCBrZXkpID0+IHtcbiAgICAgIGlmICghc2VhcmNoUGFyYW1zLmhhcyhrZXkpKSB7XG4gICAgICAgIGRlZmF1bHRTZWFyY2hQYXJhbXMuZ2V0QWxsKGtleSkuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHNlYXJjaFBhcmFtcztcbn1cbi8vIE9uZS10aW1lIGNoZWNrIGZvciBzdWJtaXR0ZXIgc3VwcG9ydFxubGV0IF9mb3JtRGF0YVN1cHBvcnRzU3VibWl0dGVyID0gbnVsbDtcbmZ1bmN0aW9uIGlzRm9ybURhdGFTdWJtaXR0ZXJTdXBwb3J0ZWQoKSB7XG4gIGlmIChfZm9ybURhdGFTdXBwb3J0c1N1Ym1pdHRlciA9PT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBuZXcgRm9ybURhdGEoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvcm1cIiksXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlmIEZvcm1EYXRhIHN1cHBvcnRzIHRoZSBzdWJtaXR0ZXIgcGFyYW1ldGVyLCB0aGlzIHdpbGwgdGhyb3dcbiAgICAgIDApO1xuICAgICAgX2Zvcm1EYXRhU3VwcG9ydHNTdWJtaXR0ZXIgPSBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBfZm9ybURhdGFTdXBwb3J0c1N1Ym1pdHRlciA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBfZm9ybURhdGFTdXBwb3J0c1N1Ym1pdHRlcjtcbn1cbmNvbnN0IHN1cHBvcnRlZEZvcm1FbmNUeXBlcyA9IG5ldyBTZXQoW1wiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIsIFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiLCBcInRleHQvcGxhaW5cIl0pO1xuZnVuY3Rpb24gZ2V0Rm9ybUVuY1R5cGUoZW5jVHlwZSkge1xuICBpZiAoZW5jVHlwZSAhPSBudWxsICYmICFzdXBwb3J0ZWRGb3JtRW5jVHlwZXMuaGFzKGVuY1R5cGUpKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX3dhcm5pbmcoZmFsc2UsIFwiXFxcIlwiICsgZW5jVHlwZSArIFwiXFxcIiBpcyBub3QgYSB2YWxpZCBgZW5jVHlwZWAgZm9yIGA8Rm9ybT5gL2A8ZmV0Y2hlci5Gb3JtPmAgXCIgKyAoXCJhbmQgd2lsbCBkZWZhdWx0IHRvIFxcXCJcIiArIGRlZmF1bHRFbmNUeXBlICsgXCJcXFwiXCIpKSA6IHZvaWQgMDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gZW5jVHlwZTtcbn1cbmZ1bmN0aW9uIGdldEZvcm1TdWJtaXNzaW9uSW5mbyh0YXJnZXQsIGJhc2VuYW1lKSB7XG4gIGxldCBtZXRob2Q7XG4gIGxldCBhY3Rpb247XG4gIGxldCBlbmNUeXBlO1xuICBsZXQgZm9ybURhdGE7XG4gIGxldCBib2R5O1xuICBpZiAoaXNGb3JtRWxlbWVudCh0YXJnZXQpKSB7XG4gICAgLy8gV2hlbiBncmFiYmluZyB0aGUgYWN0aW9uIGZyb20gdGhlIGVsZW1lbnQsIGl0IHdpbGwgaGF2ZSBoYWQgdGhlIGJhc2VuYW1lXG4gICAgLy8gcHJlZml4ZWQgdG8gZW5zdXJlIG5vbi1KUyBzY2VuYXJpb3Mgd29yaywgc28gc3RyaXAgaXQgc2luY2Ugd2UnbGxcbiAgICAvLyByZS1wcmVmaXggaW4gdGhlIHJvdXRlclxuICAgIGxldCBhdHRyID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShcImFjdGlvblwiKTtcbiAgICBhY3Rpb24gPSBhdHRyID8gc3RyaXBCYXNlbmFtZShhdHRyLCBiYXNlbmFtZSkgOiBudWxsO1xuICAgIG1ldGhvZCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJtZXRob2RcIikgfHwgZGVmYXVsdE1ldGhvZDtcbiAgICBlbmNUeXBlID0gZ2V0Rm9ybUVuY1R5cGUodGFyZ2V0LmdldEF0dHJpYnV0ZShcImVuY3R5cGVcIikpIHx8IGRlZmF1bHRFbmNUeXBlO1xuICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKHRhcmdldCk7XG4gIH0gZWxzZSBpZiAoaXNCdXR0b25FbGVtZW50KHRhcmdldCkgfHwgaXNJbnB1dEVsZW1lbnQodGFyZ2V0KSAmJiAodGFyZ2V0LnR5cGUgPT09IFwic3VibWl0XCIgfHwgdGFyZ2V0LnR5cGUgPT09IFwiaW1hZ2VcIikpIHtcbiAgICBsZXQgZm9ybSA9IHRhcmdldC5mb3JtO1xuICAgIGlmIChmb3JtID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzdWJtaXQgYSA8YnV0dG9uPiBvciA8aW5wdXQgdHlwZT1cXFwic3VibWl0XFxcIj4gd2l0aG91dCBhIDxmb3JtPlwiKTtcbiAgICB9XG4gICAgLy8gPGJ1dHRvbj4vPGlucHV0IHR5cGU9XCJzdWJtaXRcIj4gbWF5IG92ZXJyaWRlIGF0dHJpYnV0ZXMgb2YgPGZvcm0+XG4gICAgLy8gV2hlbiBncmFiYmluZyB0aGUgYWN0aW9uIGZyb20gdGhlIGVsZW1lbnQsIGl0IHdpbGwgaGF2ZSBoYWQgdGhlIGJhc2VuYW1lXG4gICAgLy8gcHJlZml4ZWQgdG8gZW5zdXJlIG5vbi1KUyBzY2VuYXJpb3Mgd29yaywgc28gc3RyaXAgaXQgc2luY2Ugd2UnbGxcbiAgICAvLyByZS1wcmVmaXggaW4gdGhlIHJvdXRlclxuICAgIGxldCBhdHRyID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShcImZvcm1hY3Rpb25cIikgfHwgZm9ybS5nZXRBdHRyaWJ1dGUoXCJhY3Rpb25cIik7XG4gICAgYWN0aW9uID0gYXR0ciA/IHN0cmlwQmFzZW5hbWUoYXR0ciwgYmFzZW5hbWUpIDogbnVsbDtcbiAgICBtZXRob2QgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKFwiZm9ybW1ldGhvZFwiKSB8fCBmb3JtLmdldEF0dHJpYnV0ZShcIm1ldGhvZFwiKSB8fCBkZWZhdWx0TWV0aG9kO1xuICAgIGVuY1R5cGUgPSBnZXRGb3JtRW5jVHlwZSh0YXJnZXQuZ2V0QXR0cmlidXRlKFwiZm9ybWVuY3R5cGVcIikpIHx8IGdldEZvcm1FbmNUeXBlKGZvcm0uZ2V0QXR0cmlidXRlKFwiZW5jdHlwZVwiKSkgfHwgZGVmYXVsdEVuY1R5cGU7XG4gICAgLy8gQnVpbGQgYSBGb3JtRGF0YSBvYmplY3QgcG9wdWxhdGVkIGZyb20gYSBmb3JtIGFuZCBzdWJtaXR0ZXJcbiAgICBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtLCB0YXJnZXQpO1xuICAgIC8vIElmIHRoaXMgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgdGhlIGBGb3JtRGF0YShlbCwgc3VibWl0dGVyKWAgZm9ybWF0LFxuICAgIC8vIHRoZW4gdGFjayBvbiB0aGUgc3VibWl0dGVyIHZhbHVlIGF0IHRoZSBlbmQuICBUaGlzIGlzIGEgbGlnaHR3ZWlnaHRcbiAgICAvLyBzb2x1dGlvbiB0aGF0IGlzIG5vdCAxMDAlIHNwZWMgY29tcGxpYW50LiAgRm9yIGNvbXBsZXRlIHN1cHBvcnQgaW4gb2xkZXJcbiAgICAvLyBicm93c2VycywgY29uc2lkZXIgdXNpbmcgdGhlIGBmb3JtZGF0YS1zdWJtaXR0ZXItcG9seWZpbGxgIHBhY2thZ2VcbiAgICBpZiAoIWlzRm9ybURhdGFTdWJtaXR0ZXJTdXBwb3J0ZWQoKSkge1xuICAgICAgbGV0IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdmFsdWVcbiAgICAgIH0gPSB0YXJnZXQ7XG4gICAgICBpZiAodHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICAgIGxldCBwcmVmaXggPSBuYW1lID8gbmFtZSArIFwiLlwiIDogXCJcIjtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKHByZWZpeCArIFwieFwiLCBcIjBcIik7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChwcmVmaXggKyBcInlcIiwgXCIwXCIpO1xuICAgICAgfSBlbHNlIGlmIChuYW1lKSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzSHRtbEVsZW1lbnQodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzdWJtaXQgZWxlbWVudCB0aGF0IGlzIG5vdCA8Zm9ybT4sIDxidXR0b24+LCBvciBcIiArIFwiPGlucHV0IHR5cGU9XFxcInN1Ym1pdHxpbWFnZVxcXCI+XCIpO1xuICB9IGVsc2Uge1xuICAgIG1ldGhvZCA9IGRlZmF1bHRNZXRob2Q7XG4gICAgYWN0aW9uID0gbnVsbDtcbiAgICBlbmNUeXBlID0gZGVmYXVsdEVuY1R5cGU7XG4gICAgYm9keSA9IHRhcmdldDtcbiAgfVxuICAvLyBTZW5kIGJvZHkgZm9yIDxGb3JtIGVuY1R5cGU9XCJ0ZXh0L3BsYWluXCIgc28gd2UgZW5jb2RlIGl0IGludG8gdGV4dFxuICBpZiAoZm9ybURhdGEgJiYgZW5jVHlwZSA9PT0gXCJ0ZXh0L3BsYWluXCIpIHtcbiAgICBib2R5ID0gZm9ybURhdGE7XG4gICAgZm9ybURhdGEgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhY3Rpb24sXG4gICAgbWV0aG9kOiBtZXRob2QudG9Mb3dlckNhc2UoKSxcbiAgICBlbmNUeXBlLFxuICAgIGZvcm1EYXRhLFxuICAgIGJvZHlcbiAgfTtcbn1cblxuY29uc3QgX2V4Y2x1ZGVkID0gW1wib25DbGlja1wiLCBcInJlbGF0aXZlXCIsIFwicmVsb2FkRG9jdW1lbnRcIiwgXCJyZXBsYWNlXCIsIFwic3RhdGVcIiwgXCJ0YXJnZXRcIiwgXCJ0b1wiLCBcInByZXZlbnRTY3JvbGxSZXNldFwiXSxcbiAgX2V4Y2x1ZGVkMiA9IFtcImFyaWEtY3VycmVudFwiLCBcImNhc2VTZW5zaXRpdmVcIiwgXCJjbGFzc05hbWVcIiwgXCJlbmRcIiwgXCJzdHlsZVwiLCBcInRvXCIsIFwiY2hpbGRyZW5cIl0sXG4gIF9leGNsdWRlZDMgPSBbXCJyZWxvYWREb2N1bWVudFwiLCBcInJlcGxhY2VcIiwgXCJzdGF0ZVwiLCBcIm1ldGhvZFwiLCBcImFjdGlvblwiLCBcIm9uU3VibWl0XCIsIFwic3VibWl0XCIsIFwicmVsYXRpdmVcIiwgXCJwcmV2ZW50U2Nyb2xsUmVzZXRcIl07XG5mdW5jdGlvbiBjcmVhdGVCcm93c2VyUm91dGVyKHJvdXRlcywgb3B0cykge1xuICByZXR1cm4gY3JlYXRlUm91dGVyKHtcbiAgICBiYXNlbmFtZTogb3B0cyA9PSBudWxsID8gdm9pZCAwIDogb3B0cy5iYXNlbmFtZSxcbiAgICBmdXR1cmU6IF9leHRlbmRzKHt9LCBvcHRzID09IG51bGwgPyB2b2lkIDAgOiBvcHRzLmZ1dHVyZSwge1xuICAgICAgdjdfcHJlcGVuZEJhc2VuYW1lOiB0cnVlXG4gICAgfSksXG4gICAgaGlzdG9yeTogY3JlYXRlQnJvd3Nlckhpc3Rvcnkoe1xuICAgICAgd2luZG93OiBvcHRzID09IG51bGwgPyB2b2lkIDAgOiBvcHRzLndpbmRvd1xuICAgIH0pLFxuICAgIGh5ZHJhdGlvbkRhdGE6IChvcHRzID09IG51bGwgPyB2b2lkIDAgOiBvcHRzLmh5ZHJhdGlvbkRhdGEpIHx8IHBhcnNlSHlkcmF0aW9uRGF0YSgpLFxuICAgIHJvdXRlcyxcbiAgICBtYXBSb3V0ZVByb3BlcnRpZXM6IFVOU0FGRV9tYXBSb3V0ZVByb3BlcnRpZXNcbiAgfSkuaW5pdGlhbGl6ZSgpO1xufVxuZnVuY3Rpb24gY3JlYXRlSGFzaFJvdXRlcihyb3V0ZXMsIG9wdHMpIHtcbiAgcmV0dXJuIGNyZWF0ZVJvdXRlcih7XG4gICAgYmFzZW5hbWU6IG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMuYmFzZW5hbWUsXG4gICAgZnV0dXJlOiBfZXh0ZW5kcyh7fSwgb3B0cyA9PSBudWxsID8gdm9pZCAwIDogb3B0cy5mdXR1cmUsIHtcbiAgICAgIHY3X3ByZXBlbmRCYXNlbmFtZTogdHJ1ZVxuICAgIH0pLFxuICAgIGhpc3Rvcnk6IGNyZWF0ZUhhc2hIaXN0b3J5KHtcbiAgICAgIHdpbmRvdzogb3B0cyA9PSBudWxsID8gdm9pZCAwIDogb3B0cy53aW5kb3dcbiAgICB9KSxcbiAgICBoeWRyYXRpb25EYXRhOiAob3B0cyA9PSBudWxsID8gdm9pZCAwIDogb3B0cy5oeWRyYXRpb25EYXRhKSB8fCBwYXJzZUh5ZHJhdGlvbkRhdGEoKSxcbiAgICByb3V0ZXMsXG4gICAgbWFwUm91dGVQcm9wZXJ0aWVzOiBVTlNBRkVfbWFwUm91dGVQcm9wZXJ0aWVzXG4gIH0pLmluaXRpYWxpemUoKTtcbn1cbmZ1bmN0aW9uIHBhcnNlSHlkcmF0aW9uRGF0YSgpIHtcbiAgdmFyIF93aW5kb3c7XG4gIGxldCBzdGF0ZSA9IChfd2luZG93ID0gd2luZG93KSA9PSBudWxsID8gdm9pZCAwIDogX3dpbmRvdy5fX3N0YXRpY1JvdXRlckh5ZHJhdGlvbkRhdGE7XG4gIGlmIChzdGF0ZSAmJiBzdGF0ZS5lcnJvcnMpIHtcbiAgICBzdGF0ZSA9IF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgZXJyb3JzOiBkZXNlcmlhbGl6ZUVycm9ycyhzdGF0ZS5lcnJvcnMpXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHN0YXRlO1xufVxuZnVuY3Rpb24gZGVzZXJpYWxpemVFcnJvcnMoZXJyb3JzKSB7XG4gIGlmICghZXJyb3JzKSByZXR1cm4gbnVsbDtcbiAgbGV0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhlcnJvcnMpO1xuICBsZXQgc2VyaWFsaXplZCA9IHt9O1xuICBmb3IgKGxldCBba2V5LCB2YWxdIG9mIGVudHJpZXMpIHtcbiAgICAvLyBIZXkgeW91ISAgSWYgeW91IGNoYW5nZSB0aGlzLCBwbGVhc2UgY2hhbmdlIHRoZSBjb3JyZXNwb25kaW5nIGxvZ2ljIGluXG4gICAgLy8gc2VyaWFsaXplRXJyb3JzIGluIHJlYWN0LXJvdXRlci1kb20vc2VydmVyLnRzeCA6KVxuICAgIGlmICh2YWwgJiYgdmFsLl9fdHlwZSA9PT0gXCJSb3V0ZUVycm9yUmVzcG9uc2VcIikge1xuICAgICAgc2VyaWFsaXplZFtrZXldID0gbmV3IEVycm9yUmVzcG9uc2UodmFsLnN0YXR1cywgdmFsLnN0YXR1c1RleHQsIHZhbC5kYXRhLCB2YWwuaW50ZXJuYWwgPT09IHRydWUpO1xuICAgIH0gZWxzZSBpZiAodmFsICYmIHZhbC5fX3R5cGUgPT09IFwiRXJyb3JcIikge1xuICAgICAgLy8gQXR0ZW1wdCB0byByZWNvbnN0cnVjdCB0aGUgcmlnaHQgdHlwZSBvZiBFcnJvciAoaS5lLiwgUmVmZXJlbmNlRXJyb3IpXG4gICAgICBpZiAodmFsLl9fc3ViVHlwZSkge1xuICAgICAgICBsZXQgRXJyb3JDb25zdHJ1Y3RvciA9IHdpbmRvd1t2YWwuX19zdWJUeXBlXTtcbiAgICAgICAgaWYgKHR5cGVvZiBFcnJvckNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yQ29uc3RydWN0b3IodmFsLm1lc3NhZ2UpO1xuICAgICAgICAgICAgLy8gV2lwZSBhd2F5IHRoZSBjbGllbnQtc2lkZSBzdGFjayB0cmFjZS4gIE5vdGhpbmcgdG8gZmlsbCBpdCBpbiB3aXRoXG4gICAgICAgICAgICAvLyBiZWNhdXNlIHdlIGRvbid0IHNlcmlhbGl6ZSBTU1Igc3RhY2sgdHJhY2VzIGZvciBzZWN1cml0eSByZWFzb25zXG4gICAgICAgICAgICBlcnJvci5zdGFjayA9IFwiXCI7XG4gICAgICAgICAgICBzZXJpYWxpemVkW2tleV0gPSBlcnJvcjtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBuby1vcCAtIGZhbGwgdGhyb3VnaCBhbmQgY3JlYXRlIGEgbm9ybWFsIEVycm9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc2VyaWFsaXplZFtrZXldID09IG51bGwpIHtcbiAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKHZhbC5tZXNzYWdlKTtcbiAgICAgICAgLy8gV2lwZSBhd2F5IHRoZSBjbGllbnQtc2lkZSBzdGFjayB0cmFjZS4gIE5vdGhpbmcgdG8gZmlsbCBpdCBpbiB3aXRoXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3Qgc2VyaWFsaXplIFNTUiBzdGFjayB0cmFjZXMgZm9yIHNlY3VyaXR5IHJlYXNvbnNcbiAgICAgICAgZXJyb3Iuc3RhY2sgPSBcIlwiO1xuICAgICAgICBzZXJpYWxpemVkW2tleV0gPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2VyaWFsaXplZFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2VyaWFsaXplZDtcbn1cbi8vI2VuZHJlZ2lvblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vI3JlZ2lvbiBDb21wb25lbnRzXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLyoqXG4gIFdlYnBhY2sgKyBSZWFjdCAxNyBmYWlscyB0byBjb21waWxlIG9uIGFueSBvZiB0aGUgZm9sbG93aW5nIGJlY2F1c2Ugd2VicGFja1xuICBjb21wbGFpbnMgdGhhdCBgc3RhcnRUcmFuc2l0aW9uYCBkb2Vzbid0IGV4aXN0IGluIGBSZWFjdGA6XG4gICogaW1wb3J0IHsgc3RhcnRUcmFuc2l0aW9uIH0gZnJvbSBcInJlYWN0XCJcbiAgKiBpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIGZyb20gXCJyZWFjdFwiO1xuICAgIFwic3RhcnRUcmFuc2l0aW9uXCIgaW4gUmVhY3QgPyBSZWFjdC5zdGFydFRyYW5zaXRpb24oKCkgPT4gc2V0U3RhdGUoKSkgOiBzZXRTdGF0ZSgpXG4gICogaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBmcm9tIFwicmVhY3RcIjtcbiAgICBcInN0YXJ0VHJhbnNpdGlvblwiIGluIFJlYWN0ID8gUmVhY3RbXCJzdGFydFRyYW5zaXRpb25cIl0oKCkgPT4gc2V0U3RhdGUoKSkgOiBzZXRTdGF0ZSgpXG5cbiAgTW92aW5nIGl0IHRvIGEgY29uc3RhbnQgc3VjaCBhcyB0aGUgZm9sbG93aW5nIHNvbHZlcyB0aGUgV2VicGFjay9SZWFjdCAxNyBpc3N1ZTpcbiAgKiBpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIGZyb20gXCJyZWFjdFwiO1xuICAgIGNvbnN0IFNUQVJUX1RSQU5TSVRJT04gPSBcInN0YXJ0VHJhbnNpdGlvblwiO1xuICAgIFNUQVJUX1RSQU5TSVRJT04gaW4gUmVhY3QgPyBSZWFjdFtTVEFSVF9UUkFOU0lUSU9OXSgoKSA9PiBzZXRTdGF0ZSgpKSA6IHNldFN0YXRlKClcblxuICBIb3dldmVyLCB0aGF0IGludHJvZHVjZXMgd2VicGFjay90ZXJzZXIgbWluaWZpY2F0aW9uIGlzc3VlcyBpbiBwcm9kdWN0aW9uIGJ1aWxkc1xuICBpbiBSZWFjdCAxOCB3aGVyZSBtaW5pZmljYXRpb24vb2JmdXNjYXRpb24gZW5kcyB1cCByZW1vdmluZyB0aGUgY2FsbCBvZlxuICBSZWFjdC5zdGFydFRyYW5zaXRpb24gZW50aXJlbHkgZnJvbSB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgdGVybmFyeS4gIEdyYWJiaW5nXG4gIHRoaXMgZXhwb3J0ZWQgcmVmZXJlbmNlIG9uY2UgdXAgZnJvbnQgcmVzb2x2ZXMgdGhhdCBpc3N1ZS5cblxuICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlbWl4LXJ1bi9yZWFjdC1yb3V0ZXIvaXNzdWVzLzEwNTc5XG4qL1xuY29uc3QgU1RBUlRfVFJBTlNJVElPTiA9IFwic3RhcnRUcmFuc2l0aW9uXCI7XG5jb25zdCBzdGFydFRyYW5zaXRpb25JbXBsID0gUmVhY3RbU1RBUlRfVFJBTlNJVElPTl07XG4vKipcbiAqIEEgYDxSb3V0ZXI+YCBmb3IgdXNlIGluIHdlYiBicm93c2Vycy4gUHJvdmlkZXMgdGhlIGNsZWFuZXN0IFVSTHMuXG4gKi9cbmZ1bmN0aW9uIEJyb3dzZXJSb3V0ZXIoX3JlZikge1xuICBsZXQge1xuICAgIGJhc2VuYW1lLFxuICAgIGNoaWxkcmVuLFxuICAgIGZ1dHVyZSxcbiAgICB3aW5kb3dcbiAgfSA9IF9yZWY7XG4gIGxldCBoaXN0b3J5UmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGlmIChoaXN0b3J5UmVmLmN1cnJlbnQgPT0gbnVsbCkge1xuICAgIGhpc3RvcnlSZWYuY3VycmVudCA9IGNyZWF0ZUJyb3dzZXJIaXN0b3J5KHtcbiAgICAgIHdpbmRvdyxcbiAgICAgIHY1Q29tcGF0OiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgbGV0IGhpc3RvcnkgPSBoaXN0b3J5UmVmLmN1cnJlbnQ7XG4gIGxldCBbc3RhdGUsIHNldFN0YXRlSW1wbF0gPSBSZWFjdC51c2VTdGF0ZSh7XG4gICAgYWN0aW9uOiBoaXN0b3J5LmFjdGlvbixcbiAgICBsb2NhdGlvbjogaGlzdG9yeS5sb2NhdGlvblxuICB9KTtcbiAgbGV0IHtcbiAgICB2N19zdGFydFRyYW5zaXRpb25cbiAgfSA9IGZ1dHVyZSB8fCB7fTtcbiAgbGV0IHNldFN0YXRlID0gUmVhY3QudXNlQ2FsbGJhY2sobmV3U3RhdGUgPT4ge1xuICAgIHY3X3N0YXJ0VHJhbnNpdGlvbiAmJiBzdGFydFRyYW5zaXRpb25JbXBsID8gc3RhcnRUcmFuc2l0aW9uSW1wbCgoKSA9PiBzZXRTdGF0ZUltcGwobmV3U3RhdGUpKSA6IHNldFN0YXRlSW1wbChuZXdTdGF0ZSk7XG4gIH0sIFtzZXRTdGF0ZUltcGwsIHY3X3N0YXJ0VHJhbnNpdGlvbl0pO1xuICBSZWFjdC51c2VMYXlvdXRFZmZlY3QoKCkgPT4gaGlzdG9yeS5saXN0ZW4oc2V0U3RhdGUpLCBbaGlzdG9yeSwgc2V0U3RhdGVdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJvdXRlciwge1xuICAgIGJhc2VuYW1lOiBiYXNlbmFtZSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgIG5hdmlnYXRpb25UeXBlOiBzdGF0ZS5hY3Rpb24sXG4gICAgbmF2aWdhdG9yOiBoaXN0b3J5XG4gIH0pO1xufVxuLyoqXG4gKiBBIGA8Um91dGVyPmAgZm9yIHVzZSBpbiB3ZWIgYnJvd3NlcnMuIFN0b3JlcyB0aGUgbG9jYXRpb24gaW4gdGhlIGhhc2hcbiAqIHBvcnRpb24gb2YgdGhlIFVSTCBzbyBpdCBpcyBub3Qgc2VudCB0byB0aGUgc2VydmVyLlxuICovXG5mdW5jdGlvbiBIYXNoUm91dGVyKF9yZWYyKSB7XG4gIGxldCB7XG4gICAgYmFzZW5hbWUsXG4gICAgY2hpbGRyZW4sXG4gICAgZnV0dXJlLFxuICAgIHdpbmRvd1xuICB9ID0gX3JlZjI7XG4gIGxldCBoaXN0b3J5UmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGlmIChoaXN0b3J5UmVmLmN1cnJlbnQgPT0gbnVsbCkge1xuICAgIGhpc3RvcnlSZWYuY3VycmVudCA9IGNyZWF0ZUhhc2hIaXN0b3J5KHtcbiAgICAgIHdpbmRvdyxcbiAgICAgIHY1Q29tcGF0OiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgbGV0IGhpc3RvcnkgPSBoaXN0b3J5UmVmLmN1cnJlbnQ7XG4gIGxldCBbc3RhdGUsIHNldFN0YXRlSW1wbF0gPSBSZWFjdC51c2VTdGF0ZSh7XG4gICAgYWN0aW9uOiBoaXN0b3J5LmFjdGlvbixcbiAgICBsb2NhdGlvbjogaGlzdG9yeS5sb2NhdGlvblxuICB9KTtcbiAgbGV0IHtcbiAgICB2N19zdGFydFRyYW5zaXRpb25cbiAgfSA9IGZ1dHVyZSB8fCB7fTtcbiAgbGV0IHNldFN0YXRlID0gUmVhY3QudXNlQ2FsbGJhY2sobmV3U3RhdGUgPT4ge1xuICAgIHY3X3N0YXJ0VHJhbnNpdGlvbiAmJiBzdGFydFRyYW5zaXRpb25JbXBsID8gc3RhcnRUcmFuc2l0aW9uSW1wbCgoKSA9PiBzZXRTdGF0ZUltcGwobmV3U3RhdGUpKSA6IHNldFN0YXRlSW1wbChuZXdTdGF0ZSk7XG4gIH0sIFtzZXRTdGF0ZUltcGwsIHY3X3N0YXJ0VHJhbnNpdGlvbl0pO1xuICBSZWFjdC51c2VMYXlvdXRFZmZlY3QoKCkgPT4gaGlzdG9yeS5saXN0ZW4oc2V0U3RhdGUpLCBbaGlzdG9yeSwgc2V0U3RhdGVdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJvdXRlciwge1xuICAgIGJhc2VuYW1lOiBiYXNlbmFtZSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgIG5hdmlnYXRpb25UeXBlOiBzdGF0ZS5hY3Rpb24sXG4gICAgbmF2aWdhdG9yOiBoaXN0b3J5XG4gIH0pO1xufVxuLyoqXG4gKiBBIGA8Um91dGVyPmAgdGhhdCBhY2NlcHRzIGEgcHJlLWluc3RhbnRpYXRlZCBoaXN0b3J5IG9iamVjdC4gSXQncyBpbXBvcnRhbnRcbiAqIHRvIG5vdGUgdGhhdCB1c2luZyB5b3VyIG93biBoaXN0b3J5IG9iamVjdCBpcyBoaWdobHkgZGlzY291cmFnZWQgYW5kIG1heSBhZGRcbiAqIHR3byB2ZXJzaW9ucyBvZiB0aGUgaGlzdG9yeSBsaWJyYXJ5IHRvIHlvdXIgYnVuZGxlcyB1bmxlc3MgeW91IHVzZSB0aGUgc2FtZVxuICogdmVyc2lvbiBvZiB0aGUgaGlzdG9yeSBsaWJyYXJ5IHRoYXQgUmVhY3QgUm91dGVyIHVzZXMgaW50ZXJuYWxseS5cbiAqL1xuZnVuY3Rpb24gSGlzdG9yeVJvdXRlcihfcmVmMykge1xuICBsZXQge1xuICAgIGJhc2VuYW1lLFxuICAgIGNoaWxkcmVuLFxuICAgIGZ1dHVyZSxcbiAgICBoaXN0b3J5XG4gIH0gPSBfcmVmMztcbiAgbGV0IFtzdGF0ZSwgc2V0U3RhdGVJbXBsXSA9IFJlYWN0LnVzZVN0YXRlKHtcbiAgICBhY3Rpb246IGhpc3RvcnkuYWN0aW9uLFxuICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uXG4gIH0pO1xuICBsZXQge1xuICAgIHY3X3N0YXJ0VHJhbnNpdGlvblxuICB9ID0gZnV0dXJlIHx8IHt9O1xuICBsZXQgc2V0U3RhdGUgPSBSZWFjdC51c2VDYWxsYmFjayhuZXdTdGF0ZSA9PiB7XG4gICAgdjdfc3RhcnRUcmFuc2l0aW9uICYmIHN0YXJ0VHJhbnNpdGlvbkltcGwgPyBzdGFydFRyYW5zaXRpb25JbXBsKCgpID0+IHNldFN0YXRlSW1wbChuZXdTdGF0ZSkpIDogc2V0U3RhdGVJbXBsKG5ld1N0YXRlKTtcbiAgfSwgW3NldFN0YXRlSW1wbCwgdjdfc3RhcnRUcmFuc2l0aW9uXSk7XG4gIFJlYWN0LnVzZUxheW91dEVmZmVjdCgoKSA9PiBoaXN0b3J5Lmxpc3RlbihzZXRTdGF0ZSksIFtoaXN0b3J5LCBzZXRTdGF0ZV0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyLCB7XG4gICAgYmFzZW5hbWU6IGJhc2VuYW1lLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBsb2NhdGlvbjogc3RhdGUubG9jYXRpb24sXG4gICAgbmF2aWdhdGlvblR5cGU6IHN0YXRlLmFjdGlvbixcbiAgICBuYXZpZ2F0b3I6IGhpc3RvcnlcbiAgfSk7XG59XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIEhpc3RvcnlSb3V0ZXIuZGlzcGxheU5hbWUgPSBcInVuc3RhYmxlX0hpc3RvcnlSb3V0ZXJcIjtcbn1cbmNvbnN0IGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgIT09IFwidW5kZWZpbmVkXCI7XG5jb25zdCBBQlNPTFVURV9VUkxfUkVHRVggPSAvXig/OlthLXpdW2EtejAtOSsuLV0qOnxcXC9cXC8pL2k7XG4vKipcbiAqIFRoZSBwdWJsaWMgQVBJIGZvciByZW5kZXJpbmcgYSBoaXN0b3J5LWF3YXJlIDxhPi5cbiAqL1xuY29uc3QgTGluayA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIExpbmtXaXRoUmVmKF9yZWY0LCByZWYpIHtcbiAgbGV0IHtcbiAgICAgIG9uQ2xpY2ssXG4gICAgICByZWxhdGl2ZSxcbiAgICAgIHJlbG9hZERvY3VtZW50LFxuICAgICAgcmVwbGFjZSxcbiAgICAgIHN0YXRlLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdG8sXG4gICAgICBwcmV2ZW50U2Nyb2xsUmVzZXRcbiAgICB9ID0gX3JlZjQsXG4gICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWY0LCBfZXhjbHVkZWQpO1xuICBsZXQge1xuICAgIGJhc2VuYW1lXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KFVOU0FGRV9OYXZpZ2F0aW9uQ29udGV4dCk7XG4gIC8vIFJlbmRlcmVkIGludG8gPGEgaHJlZj4gZm9yIGFic29sdXRlIFVSTHNcbiAgbGV0IGFic29sdXRlSHJlZjtcbiAgbGV0IGlzRXh0ZXJuYWwgPSBmYWxzZTtcbiAgaWYgKHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiAmJiBBQlNPTFVURV9VUkxfUkVHRVgudGVzdCh0bykpIHtcbiAgICAvLyBSZW5kZXIgdGhlIGFic29sdXRlIGhyZWYgc2VydmVyLSBhbmQgY2xpZW50LXNpZGVcbiAgICBhYnNvbHV0ZUhyZWYgPSB0bztcbiAgICAvLyBPbmx5IGNoZWNrIGZvciBleHRlcm5hbCBvcmlnaW5zIGNsaWVudC1zaWRlXG4gICAgaWYgKGlzQnJvd3Nlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGN1cnJlbnRVcmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgbGV0IHRhcmdldFVybCA9IHRvLnN0YXJ0c1dpdGgoXCIvL1wiKSA/IG5ldyBVUkwoY3VycmVudFVybC5wcm90b2NvbCArIHRvKSA6IG5ldyBVUkwodG8pO1xuICAgICAgICBsZXQgcGF0aCA9IHN0cmlwQmFzZW5hbWUodGFyZ2V0VXJsLnBhdGhuYW1lLCBiYXNlbmFtZSk7XG4gICAgICAgIGlmICh0YXJnZXRVcmwub3JpZ2luID09PSBjdXJyZW50VXJsLm9yaWdpbiAmJiBwYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBTdHJpcCB0aGUgcHJvdG9jb2wvb3JpZ2luL2Jhc2VuYW1lIGZvciBzYW1lLW9yaWdpbiBhYnNvbHV0ZSBVUkxzXG4gICAgICAgICAgdG8gPSBwYXRoICsgdGFyZ2V0VXJsLnNlYXJjaCArIHRhcmdldFVybC5oYXNoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzRXh0ZXJuYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIFdlIGNhbid0IGRvIGV4dGVybmFsIFVSTCBkZXRlY3Rpb24gd2l0aG91dCBhIHZhbGlkIFVSTFxuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfd2FybmluZyhmYWxzZSwgXCI8TGluayB0bz1cXFwiXCIgKyB0byArIFwiXFxcIj4gY29udGFpbnMgYW4gaW52YWxpZCBVUkwgd2hpY2ggd2lsbCBwcm9iYWJseSBicmVhayBcIiArIFwid2hlbiBjbGlja2VkIC0gcGxlYXNlIHVwZGF0ZSB0byBhIHZhbGlkIFVSTCBwYXRoLlwiKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gUmVuZGVyZWQgaW50byA8YSBocmVmPiBmb3IgcmVsYXRpdmUgVVJMc1xuICBsZXQgaHJlZiA9IHVzZUhyZWYodG8sIHtcbiAgICByZWxhdGl2ZVxuICB9KTtcbiAgbGV0IGludGVybmFsT25DbGljayA9IHVzZUxpbmtDbGlja0hhbmRsZXIodG8sIHtcbiAgICByZXBsYWNlLFxuICAgIHN0YXRlLFxuICAgIHRhcmdldCxcbiAgICBwcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgcmVsYXRpdmVcbiAgfSk7XG4gIGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7XG4gICAgaWYgKG9uQ2xpY2spIG9uQ2xpY2soZXZlbnQpO1xuICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgaW50ZXJuYWxPbkNsaWNrKGV2ZW50KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICAvKiNfX1BVUkVfXyovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzeC1hMTF5L2FuY2hvci1oYXMtY29udGVudFxuICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBocmVmOiBhYnNvbHV0ZUhyZWYgfHwgaHJlZixcbiAgICAgIG9uQ2xpY2s6IGlzRXh0ZXJuYWwgfHwgcmVsb2FkRG9jdW1lbnQgPyBvbkNsaWNrIDogaGFuZGxlQ2xpY2ssXG4gICAgICByZWY6IHJlZixcbiAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgfSkpXG4gICk7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgTGluay5kaXNwbGF5TmFtZSA9IFwiTGlua1wiO1xufVxuLyoqXG4gKiBBIDxMaW5rPiB3cmFwcGVyIHRoYXQga25vd3MgaWYgaXQncyBcImFjdGl2ZVwiIG9yIG5vdC5cbiAqL1xuY29uc3QgTmF2TGluayA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIE5hdkxpbmtXaXRoUmVmKF9yZWY1LCByZWYpIHtcbiAgbGV0IHtcbiAgICAgIFwiYXJpYS1jdXJyZW50XCI6IGFyaWFDdXJyZW50UHJvcCA9IFwicGFnZVwiLFxuICAgICAgY2FzZVNlbnNpdGl2ZSA9IGZhbHNlLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVQcm9wID0gXCJcIixcbiAgICAgIGVuZCA9IGZhbHNlLFxuICAgICAgc3R5bGU6IHN0eWxlUHJvcCxcbiAgICAgIHRvLFxuICAgICAgY2hpbGRyZW5cbiAgICB9ID0gX3JlZjUsXG4gICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWY1LCBfZXhjbHVkZWQyKTtcbiAgbGV0IHBhdGggPSB1c2VSZXNvbHZlZFBhdGgodG8sIHtcbiAgICByZWxhdGl2ZTogcmVzdC5yZWxhdGl2ZVxuICB9KTtcbiAgbGV0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgbGV0IHJvdXRlclN0YXRlID0gUmVhY3QudXNlQ29udGV4dChVTlNBRkVfRGF0YVJvdXRlclN0YXRlQ29udGV4dCk7XG4gIGxldCB7XG4gICAgbmF2aWdhdG9yXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KFVOU0FGRV9OYXZpZ2F0aW9uQ29udGV4dCk7XG4gIGxldCB0b1BhdGhuYW1lID0gbmF2aWdhdG9yLmVuY29kZUxvY2F0aW9uID8gbmF2aWdhdG9yLmVuY29kZUxvY2F0aW9uKHBhdGgpLnBhdGhuYW1lIDogcGF0aC5wYXRobmFtZTtcbiAgbGV0IGxvY2F0aW9uUGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcbiAgbGV0IG5leHRMb2NhdGlvblBhdGhuYW1lID0gcm91dGVyU3RhdGUgJiYgcm91dGVyU3RhdGUubmF2aWdhdGlvbiAmJiByb3V0ZXJTdGF0ZS5uYXZpZ2F0aW9uLmxvY2F0aW9uID8gcm91dGVyU3RhdGUubmF2aWdhdGlvbi5sb2NhdGlvbi5wYXRobmFtZSA6IG51bGw7XG4gIGlmICghY2FzZVNlbnNpdGl2ZSkge1xuICAgIGxvY2F0aW9uUGF0aG5hbWUgPSBsb2NhdGlvblBhdGhuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgbmV4dExvY2F0aW9uUGF0aG5hbWUgPSBuZXh0TG9jYXRpb25QYXRobmFtZSA/IG5leHRMb2NhdGlvblBhdGhuYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgIHRvUGF0aG5hbWUgPSB0b1BhdGhuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgbGV0IGlzQWN0aXZlID0gbG9jYXRpb25QYXRobmFtZSA9PT0gdG9QYXRobmFtZSB8fCAhZW5kICYmIGxvY2F0aW9uUGF0aG5hbWUuc3RhcnRzV2l0aCh0b1BhdGhuYW1lKSAmJiBsb2NhdGlvblBhdGhuYW1lLmNoYXJBdCh0b1BhdGhuYW1lLmxlbmd0aCkgPT09IFwiL1wiO1xuICBsZXQgaXNQZW5kaW5nID0gbmV4dExvY2F0aW9uUGF0aG5hbWUgIT0gbnVsbCAmJiAobmV4dExvY2F0aW9uUGF0aG5hbWUgPT09IHRvUGF0aG5hbWUgfHwgIWVuZCAmJiBuZXh0TG9jYXRpb25QYXRobmFtZS5zdGFydHNXaXRoKHRvUGF0aG5hbWUpICYmIG5leHRMb2NhdGlvblBhdGhuYW1lLmNoYXJBdCh0b1BhdGhuYW1lLmxlbmd0aCkgPT09IFwiL1wiKTtcbiAgbGV0IGFyaWFDdXJyZW50ID0gaXNBY3RpdmUgPyBhcmlhQ3VycmVudFByb3AgOiB1bmRlZmluZWQ7XG4gIGxldCBjbGFzc05hbWU7XG4gIGlmICh0eXBlb2YgY2xhc3NOYW1lUHJvcCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lUHJvcCh7XG4gICAgICBpc0FjdGl2ZSxcbiAgICAgIGlzUGVuZGluZ1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIHRoZSBjbGFzc05hbWUgcHJvcCBpcyBub3QgYSBmdW5jdGlvbiwgd2UgdXNlIGEgZGVmYXVsdCBgYWN0aXZlYFxuICAgIC8vIGNsYXNzIGZvciA8TmF2TGluayAvPnMgdGhhdCBhcmUgYWN0aXZlLiBJbiB2NSBgYWN0aXZlYCB3YXMgdGhlIGRlZmF1bHRcbiAgICAvLyB2YWx1ZSBmb3IgYGFjdGl2ZUNsYXNzTmFtZWAsIGJ1dCB3ZSBhcmUgcmVtb3ZpbmcgdGhhdCBBUEkgYW5kIGNhbiBzdGlsbFxuICAgIC8vIHVzZSB0aGUgb2xkIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGEgY2xlYW5lciB1cGdyYWRlIHBhdGggYW5kIGtlZXAgdGhlXG4gICAgLy8gc2ltcGxlIHN0eWxpbmcgcnVsZXMgd29ya2luZyBhcyB0aGV5IGN1cnJlbnRseSBkby5cbiAgICBjbGFzc05hbWUgPSBbY2xhc3NOYW1lUHJvcCwgaXNBY3RpdmUgPyBcImFjdGl2ZVwiIDogbnVsbCwgaXNQZW5kaW5nID8gXCJwZW5kaW5nXCIgOiBudWxsXS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiBcIik7XG4gIH1cbiAgbGV0IHN0eWxlID0gdHlwZW9mIHN0eWxlUHJvcCA9PT0gXCJmdW5jdGlvblwiID8gc3R5bGVQcm9wKHtcbiAgICBpc0FjdGl2ZSxcbiAgICBpc1BlbmRpbmdcbiAgfSkgOiBzdHlsZVByb3A7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMaW5rLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIFwiYXJpYS1jdXJyZW50XCI6IGFyaWFDdXJyZW50LFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIHJlZjogcmVmLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICB0bzogdG9cbiAgfSksIHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiID8gY2hpbGRyZW4oe1xuICAgIGlzQWN0aXZlLFxuICAgIGlzUGVuZGluZ1xuICB9KSA6IGNoaWxkcmVuKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICBOYXZMaW5rLmRpc3BsYXlOYW1lID0gXCJOYXZMaW5rXCI7XG59XG4vKipcbiAqIEEgYEByZW1peC1ydW4vcm91dGVyYC1hd2FyZSBgPGZvcm0+YC4gSXQgYmVoYXZlcyBsaWtlIGEgbm9ybWFsIGZvcm0gZXhjZXB0XG4gKiB0aGF0IHRoZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBzZXJ2ZXIgaXMgd2l0aCBgZmV0Y2hgIGluc3RlYWQgb2YgbmV3IGRvY3VtZW50XG4gKiByZXF1ZXN0cywgYWxsb3dpbmcgY29tcG9uZW50cyB0byBhZGQgbmljZXIgVVggdG8gdGhlIHBhZ2UgYXMgdGhlIGZvcm0gaXNcbiAqIHN1Ym1pdHRlZCBhbmQgcmV0dXJucyB3aXRoIGRhdGEuXG4gKi9cbmNvbnN0IEZvcm0gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBsZXQgc3VibWl0ID0gdXNlU3VibWl0KCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb3JtSW1wbCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgc3VibWl0OiBzdWJtaXQsXG4gICAgcmVmOiByZWZcbiAgfSkpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIEZvcm0uZGlzcGxheU5hbWUgPSBcIkZvcm1cIjtcbn1cbmNvbnN0IEZvcm1JbXBsID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKF9yZWY2LCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgbGV0IHtcbiAgICAgIHJlbG9hZERvY3VtZW50LFxuICAgICAgcmVwbGFjZSxcbiAgICAgIHN0YXRlLFxuICAgICAgbWV0aG9kID0gZGVmYXVsdE1ldGhvZCxcbiAgICAgIGFjdGlvbixcbiAgICAgIG9uU3VibWl0LFxuICAgICAgc3VibWl0LFxuICAgICAgcmVsYXRpdmUsXG4gICAgICBwcmV2ZW50U2Nyb2xsUmVzZXRcbiAgICB9ID0gX3JlZjYsXG4gICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmNiwgX2V4Y2x1ZGVkMyk7XG4gIGxldCBmb3JtTWV0aG9kID0gbWV0aG9kLnRvTG93ZXJDYXNlKCkgPT09IFwiZ2V0XCIgPyBcImdldFwiIDogXCJwb3N0XCI7XG4gIGxldCBmb3JtQWN0aW9uID0gdXNlRm9ybUFjdGlvbihhY3Rpb24sIHtcbiAgICByZWxhdGl2ZVxuICB9KTtcbiAgbGV0IHN1Ym1pdEhhbmRsZXIgPSBldmVudCA9PiB7XG4gICAgb25TdWJtaXQgJiYgb25TdWJtaXQoZXZlbnQpO1xuICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBsZXQgc3VibWl0dGVyID0gZXZlbnQubmF0aXZlRXZlbnQuc3VibWl0dGVyO1xuICAgIGxldCBzdWJtaXRNZXRob2QgPSAoc3VibWl0dGVyID09IG51bGwgPyB2b2lkIDAgOiBzdWJtaXR0ZXIuZ2V0QXR0cmlidXRlKFwiZm9ybW1ldGhvZFwiKSkgfHwgbWV0aG9kO1xuICAgIHN1Ym1pdChzdWJtaXR0ZXIgfHwgZXZlbnQuY3VycmVudFRhcmdldCwge1xuICAgICAgbWV0aG9kOiBzdWJtaXRNZXRob2QsXG4gICAgICByZXBsYWNlLFxuICAgICAgc3RhdGUsXG4gICAgICByZWxhdGl2ZSxcbiAgICAgIHByZXZlbnRTY3JvbGxSZXNldFxuICAgIH0pO1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmb3JtXCIsIF9leHRlbmRzKHtcbiAgICByZWY6IGZvcndhcmRlZFJlZixcbiAgICBtZXRob2Q6IGZvcm1NZXRob2QsXG4gICAgYWN0aW9uOiBmb3JtQWN0aW9uLFxuICAgIG9uU3VibWl0OiByZWxvYWREb2N1bWVudCA/IG9uU3VibWl0IDogc3VibWl0SGFuZGxlclxuICB9LCBwcm9wcykpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIEZvcm1JbXBsLmRpc3BsYXlOYW1lID0gXCJGb3JtSW1wbFwiO1xufVxuLyoqXG4gKiBUaGlzIGNvbXBvbmVudCB3aWxsIGVtdWxhdGUgdGhlIGJyb3dzZXIncyBzY3JvbGwgcmVzdG9yYXRpb24gb24gbG9jYXRpb25cbiAqIGNoYW5nZXMuXG4gKi9cbmZ1bmN0aW9uIFNjcm9sbFJlc3RvcmF0aW9uKF9yZWY3KSB7XG4gIGxldCB7XG4gICAgZ2V0S2V5LFxuICAgIHN0b3JhZ2VLZXlcbiAgfSA9IF9yZWY3O1xuICB1c2VTY3JvbGxSZXN0b3JhdGlvbih7XG4gICAgZ2V0S2V5LFxuICAgIHN0b3JhZ2VLZXlcbiAgfSk7XG4gIHJldHVybiBudWxsO1xufVxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICBTY3JvbGxSZXN0b3JhdGlvbi5kaXNwbGF5TmFtZSA9IFwiU2Nyb2xsUmVzdG9yYXRpb25cIjtcbn1cbi8vI2VuZHJlZ2lvblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vI3JlZ2lvbiBIb29rc1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbnZhciBEYXRhUm91dGVySG9vaztcbihmdW5jdGlvbiAoRGF0YVJvdXRlckhvb2spIHtcbiAgRGF0YVJvdXRlckhvb2tbXCJVc2VTY3JvbGxSZXN0b3JhdGlvblwiXSA9IFwidXNlU2Nyb2xsUmVzdG9yYXRpb25cIjtcbiAgRGF0YVJvdXRlckhvb2tbXCJVc2VTdWJtaXRcIl0gPSBcInVzZVN1Ym1pdFwiO1xuICBEYXRhUm91dGVySG9va1tcIlVzZVN1Ym1pdEZldGNoZXJcIl0gPSBcInVzZVN1Ym1pdEZldGNoZXJcIjtcbiAgRGF0YVJvdXRlckhvb2tbXCJVc2VGZXRjaGVyXCJdID0gXCJ1c2VGZXRjaGVyXCI7XG59KShEYXRhUm91dGVySG9vayB8fCAoRGF0YVJvdXRlckhvb2sgPSB7fSkpO1xudmFyIERhdGFSb3V0ZXJTdGF0ZUhvb2s7XG4oZnVuY3Rpb24gKERhdGFSb3V0ZXJTdGF0ZUhvb2spIHtcbiAgRGF0YVJvdXRlclN0YXRlSG9va1tcIlVzZUZldGNoZXJzXCJdID0gXCJ1c2VGZXRjaGVyc1wiO1xuICBEYXRhUm91dGVyU3RhdGVIb29rW1wiVXNlU2Nyb2xsUmVzdG9yYXRpb25cIl0gPSBcInVzZVNjcm9sbFJlc3RvcmF0aW9uXCI7XG59KShEYXRhUm91dGVyU3RhdGVIb29rIHx8IChEYXRhUm91dGVyU3RhdGVIb29rID0ge30pKTtcbmZ1bmN0aW9uIGdldERhdGFSb3V0ZXJDb25zb2xlRXJyb3IoaG9va05hbWUpIHtcbiAgcmV0dXJuIGhvb2tOYW1lICsgXCIgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIGRhdGEgcm91dGVyLiAgU2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL3JvdXRlcnMvcGlja2luZy1hLXJvdXRlci5cIjtcbn1cbmZ1bmN0aW9uIHVzZURhdGFSb3V0ZXJDb250ZXh0KGhvb2tOYW1lKSB7XG4gIGxldCBjdHggPSBSZWFjdC51c2VDb250ZXh0KFVOU0FGRV9EYXRhUm91dGVyQ29udGV4dCk7XG4gICFjdHggPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBnZXREYXRhUm91dGVyQ29uc29sZUVycm9yKGhvb2tOYW1lKSkgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIGN0eDtcbn1cbmZ1bmN0aW9uIHVzZURhdGFSb3V0ZXJTdGF0ZShob29rTmFtZSkge1xuICBsZXQgc3RhdGUgPSBSZWFjdC51c2VDb250ZXh0KFVOU0FGRV9EYXRhUm91dGVyU3RhdGVDb250ZXh0KTtcbiAgIXN0YXRlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvcihob29rTmFtZSkpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIHJldHVybiBzdGF0ZTtcbn1cbi8qKlxuICogSGFuZGxlcyB0aGUgY2xpY2sgYmVoYXZpb3IgZm9yIHJvdXRlciBgPExpbms+YCBjb21wb25lbnRzLiBUaGlzIGlzIHVzZWZ1bCBpZlxuICogeW91IG5lZWQgdG8gY3JlYXRlIGN1c3RvbSBgPExpbms+YCBjb21wb25lbnRzIHdpdGggdGhlIHNhbWUgY2xpY2sgYmVoYXZpb3Igd2VcbiAqIHVzZSBpbiBvdXIgZXhwb3J0ZWQgYDxMaW5rPmAuXG4gKi9cbmZ1bmN0aW9uIHVzZUxpbmtDbGlja0hhbmRsZXIodG8sIF90ZW1wKSB7XG4gIGxldCB7XG4gICAgdGFyZ2V0LFxuICAgIHJlcGxhY2U6IHJlcGxhY2VQcm9wLFxuICAgIHN0YXRlLFxuICAgIHByZXZlbnRTY3JvbGxSZXNldCxcbiAgICByZWxhdGl2ZVxuICB9ID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA7XG4gIGxldCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XG4gIGxldCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCBwYXRoID0gdXNlUmVzb2x2ZWRQYXRoKHRvLCB7XG4gICAgcmVsYXRpdmVcbiAgfSk7XG4gIHJldHVybiBSZWFjdC51c2VDYWxsYmFjayhldmVudCA9PiB7XG4gICAgaWYgKHNob3VsZFByb2Nlc3NMaW5rQ2xpY2soZXZlbnQsIHRhcmdldCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyBJZiB0aGUgVVJMIGhhc24ndCBjaGFuZ2VkLCBhIHJlZ3VsYXIgPGE+IHdpbGwgZG8gYSByZXBsYWNlIGluc3RlYWQgb2ZcbiAgICAgIC8vIGEgcHVzaCwgc28gZG8gdGhlIHNhbWUgaGVyZSB1bmxlc3MgdGhlIHJlcGxhY2UgcHJvcCBpcyBleHBsaWNpdGx5IHNldFxuICAgICAgbGV0IHJlcGxhY2UgPSByZXBsYWNlUHJvcCAhPT0gdW5kZWZpbmVkID8gcmVwbGFjZVByb3AgOiBjcmVhdGVQYXRoKGxvY2F0aW9uKSA9PT0gY3JlYXRlUGF0aChwYXRoKTtcbiAgICAgIG5hdmlnYXRlKHRvLCB7XG4gICAgICAgIHJlcGxhY2UsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgICAgIHJlbGF0aXZlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtsb2NhdGlvbiwgbmF2aWdhdGUsIHBhdGgsIHJlcGxhY2VQcm9wLCBzdGF0ZSwgdGFyZ2V0LCB0bywgcHJldmVudFNjcm9sbFJlc2V0LCByZWxhdGl2ZV0pO1xufVxuLyoqXG4gKiBBIGNvbnZlbmllbnQgd3JhcHBlciBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBzZWFyY2ggcGFyYW1ldGVycyB2aWEgdGhlXG4gKiBVUkxTZWFyY2hQYXJhbXMgaW50ZXJmYWNlLlxuICovXG5mdW5jdGlvbiB1c2VTZWFyY2hQYXJhbXMoZGVmYXVsdEluaXQpIHtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX3dhcm5pbmcodHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gXCJ1bmRlZmluZWRcIiwgXCJZb3UgY2Fubm90IHVzZSB0aGUgYHVzZVNlYXJjaFBhcmFtc2AgaG9vayBpbiBhIGJyb3dzZXIgdGhhdCBkb2VzIG5vdCBcIiArIFwic3VwcG9ydCB0aGUgVVJMU2VhcmNoUGFyYW1zIEFQSS4gSWYgeW91IG5lZWQgdG8gc3VwcG9ydCBJbnRlcm5ldCBcIiArIFwiRXhwbG9yZXIgMTEsIHdlIHJlY29tbWVuZCB5b3UgbG9hZCBhIHBvbHlmaWxsIHN1Y2ggYXMgXCIgKyBcImh0dHBzOi8vZ2l0aHViLmNvbS91bmdhcC91cmwtc2VhcmNoLXBhcmFtc1xcblxcblwiICsgXCJJZiB5b3UncmUgdW5zdXJlIGhvdyB0byBsb2FkIHBvbHlmaWxscywgd2UgcmVjb21tZW5kIHlvdSBjaGVjayBvdXQgXCIgKyBcImh0dHBzOi8vcG9seWZpbGwuaW8vdjMvIHdoaWNoIHByb3ZpZGVzIHNvbWUgcmVjb21tZW5kYXRpb25zIGFib3V0IGhvdyBcIiArIFwidG8gbG9hZCBwb2x5ZmlsbHMgb25seSBmb3IgdXNlcnMgdGhhdCBuZWVkIHRoZW0sIGluc3RlYWQgb2YgZm9yIGV2ZXJ5IFwiICsgXCJ1c2VyLlwiKSA6IHZvaWQgMDtcbiAgbGV0IGRlZmF1bHRTZWFyY2hQYXJhbXNSZWYgPSBSZWFjdC51c2VSZWYoY3JlYXRlU2VhcmNoUGFyYW1zKGRlZmF1bHRJbml0KSk7XG4gIGxldCBoYXNTZXRTZWFyY2hQYXJhbXNSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBsZXQgbG9jYXRpb24gPSB1c2VMb2NhdGlvbigpO1xuICBsZXQgc2VhcmNoUGFyYW1zID0gUmVhY3QudXNlTWVtbygoKSA9PlxuICAvLyBPbmx5IG1lcmdlIGluIHRoZSBkZWZhdWx0cyBpZiB3ZSBoYXZlbid0IHlldCBjYWxsZWQgc2V0U2VhcmNoUGFyYW1zLlxuICAvLyBPbmNlIHdlIGNhbGwgdGhhdCB3ZSB3YW50IHRob3NlIHRvIHRha2UgcHJlY2VkZW5jZSwgb3RoZXJ3aXNlIHlvdSBjYW4ndFxuICAvLyByZW1vdmUgYSBwYXJhbSB3aXRoIHNldFNlYXJjaFBhcmFtcyh7fSkgaWYgaXQgaGFzIGFuIGluaXRpYWwgdmFsdWVcbiAgZ2V0U2VhcmNoUGFyYW1zRm9yTG9jYXRpb24obG9jYXRpb24uc2VhcmNoLCBoYXNTZXRTZWFyY2hQYXJhbXNSZWYuY3VycmVudCA/IG51bGwgOiBkZWZhdWx0U2VhcmNoUGFyYW1zUmVmLmN1cnJlbnQpLCBbbG9jYXRpb24uc2VhcmNoXSk7XG4gIGxldCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XG4gIGxldCBzZXRTZWFyY2hQYXJhbXMgPSBSZWFjdC51c2VDYWxsYmFjaygobmV4dEluaXQsIG5hdmlnYXRlT3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IG5ld1NlYXJjaFBhcmFtcyA9IGNyZWF0ZVNlYXJjaFBhcmFtcyh0eXBlb2YgbmV4dEluaXQgPT09IFwiZnVuY3Rpb25cIiA/IG5leHRJbml0KHNlYXJjaFBhcmFtcykgOiBuZXh0SW5pdCk7XG4gICAgaGFzU2V0U2VhcmNoUGFyYW1zUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIG5hdmlnYXRlKFwiP1wiICsgbmV3U2VhcmNoUGFyYW1zLCBuYXZpZ2F0ZU9wdGlvbnMpO1xuICB9LCBbbmF2aWdhdGUsIHNlYXJjaFBhcmFtc10pO1xuICByZXR1cm4gW3NlYXJjaFBhcmFtcywgc2V0U2VhcmNoUGFyYW1zXTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlQ2xpZW50U2lkZVN1Ym1pc3Npb24oKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgYXJlIGNhbGxpbmcgc3VibWl0IGR1cmluZyB0aGUgc2VydmVyIHJlbmRlci4gXCIgKyBcIlRyeSBjYWxsaW5nIHN1Ym1pdCB3aXRoaW4gYSBgdXNlRWZmZWN0YCBvciBjYWxsYmFjayBpbnN0ZWFkLlwiKTtcbiAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBtYXkgYmUgdXNlZCB0byBwcm9ncmFtbWF0aWNhbGx5IHN1Ym1pdCBhIGZvcm0gKG9yXG4gKiBzb21lIGFyYml0cmFyeSBkYXRhKSB0byB0aGUgc2VydmVyLlxuICovXG5mdW5jdGlvbiB1c2VTdWJtaXQoKSB7XG4gIGxldCB7XG4gICAgcm91dGVyXG4gIH0gPSB1c2VEYXRhUm91dGVyQ29udGV4dChEYXRhUm91dGVySG9vay5Vc2VTdWJtaXQpO1xuICBsZXQge1xuICAgIGJhc2VuYW1lXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KFVOU0FGRV9OYXZpZ2F0aW9uQ29udGV4dCk7XG4gIGxldCBjdXJyZW50Um91dGVJZCA9IFVOU0FGRV91c2VSb3V0ZUlkKCk7XG4gIHJldHVybiBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICB2YWxpZGF0ZUNsaWVudFNpZGVTdWJtaXNzaW9uKCk7XG4gICAgbGV0IHtcbiAgICAgIGFjdGlvbixcbiAgICAgIG1ldGhvZCxcbiAgICAgIGVuY1R5cGUsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIGJvZHlcbiAgICB9ID0gZ2V0Rm9ybVN1Ym1pc3Npb25JbmZvKHRhcmdldCwgYmFzZW5hbWUpO1xuICAgIHJvdXRlci5uYXZpZ2F0ZShvcHRpb25zLmFjdGlvbiB8fCBhY3Rpb24sIHtcbiAgICAgIHByZXZlbnRTY3JvbGxSZXNldDogb3B0aW9ucy5wcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIGJvZHksXG4gICAgICBmb3JtTWV0aG9kOiBvcHRpb25zLm1ldGhvZCB8fCBtZXRob2QsXG4gICAgICBmb3JtRW5jVHlwZTogb3B0aW9ucy5lbmNUeXBlIHx8IGVuY1R5cGUsXG4gICAgICByZXBsYWNlOiBvcHRpb25zLnJlcGxhY2UsXG4gICAgICBzdGF0ZTogb3B0aW9ucy5zdGF0ZSxcbiAgICAgIGZyb21Sb3V0ZUlkOiBjdXJyZW50Um91dGVJZFxuICAgIH0pO1xuICB9LCBbcm91dGVyLCBiYXNlbmFtZSwgY3VycmVudFJvdXRlSWRdKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIGZldGNoZXIuc3VibWl0XG4gKi9cbmZ1bmN0aW9uIHVzZVN1Ym1pdEZldGNoZXIoZmV0Y2hlcktleSwgZmV0Y2hlclJvdXRlSWQpIHtcbiAgbGV0IHtcbiAgICByb3V0ZXJcbiAgfSA9IHVzZURhdGFSb3V0ZXJDb250ZXh0KERhdGFSb3V0ZXJIb29rLlVzZVN1Ym1pdEZldGNoZXIpO1xuICBsZXQge1xuICAgIGJhc2VuYW1lXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KFVOU0FGRV9OYXZpZ2F0aW9uQ29udGV4dCk7XG4gIHJldHVybiBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICB2YWxpZGF0ZUNsaWVudFNpZGVTdWJtaXNzaW9uKCk7XG4gICAgbGV0IHtcbiAgICAgIGFjdGlvbixcbiAgICAgIG1ldGhvZCxcbiAgICAgIGVuY1R5cGUsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIGJvZHlcbiAgICB9ID0gZ2V0Rm9ybVN1Ym1pc3Npb25JbmZvKHRhcmdldCwgYmFzZW5hbWUpO1xuICAgICEoZmV0Y2hlclJvdXRlSWQgIT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBcIk5vIHJvdXRlSWQgYXZhaWxhYmxlIGZvciB1c2VGZXRjaGVyKClcIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICByb3V0ZXIuZmV0Y2goZmV0Y2hlcktleSwgZmV0Y2hlclJvdXRlSWQsIG9wdGlvbnMuYWN0aW9uIHx8IGFjdGlvbiwge1xuICAgICAgcHJldmVudFNjcm9sbFJlc2V0OiBvcHRpb25zLnByZXZlbnRTY3JvbGxSZXNldCxcbiAgICAgIGZvcm1EYXRhLFxuICAgICAgYm9keSxcbiAgICAgIGZvcm1NZXRob2Q6IG9wdGlvbnMubWV0aG9kIHx8IG1ldGhvZCxcbiAgICAgIGZvcm1FbmNUeXBlOiBvcHRpb25zLmVuY1R5cGUgfHwgZW5jVHlwZVxuICAgIH0pO1xuICB9LCBbcm91dGVyLCBiYXNlbmFtZSwgZmV0Y2hlcktleSwgZmV0Y2hlclJvdXRlSWRdKTtcbn1cbi8vIHY3OiBFdmVudHVhbGx5IHdlIHNob3VsZCBkZXByZWNhdGUgdGhpcyBlbnRpcmVseSBpbiBmYXZvciBvZiB1c2luZyB0aGVcbi8vIHJvdXRlciBtZXRob2QgZGlyZWN0bHk/XG5mdW5jdGlvbiB1c2VGb3JtQWN0aW9uKGFjdGlvbiwgX3RlbXAyKSB7XG4gIGxldCB7XG4gICAgcmVsYXRpdmVcbiAgfSA9IF90ZW1wMiA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDI7XG4gIGxldCB7XG4gICAgYmFzZW5hbWVcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoVU5TQUZFX05hdmlnYXRpb25Db250ZXh0KTtcbiAgbGV0IHJvdXRlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoVU5TQUZFX1JvdXRlQ29udGV4dCk7XG4gICFyb3V0ZUNvbnRleHQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBcInVzZUZvcm1BY3Rpb24gbXVzdCBiZSB1c2VkIGluc2lkZSBhIFJvdXRlQ29udGV4dFwiKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICBsZXQgW21hdGNoXSA9IHJvdXRlQ29udGV4dC5tYXRjaGVzLnNsaWNlKC0xKTtcbiAgLy8gU2hhbGxvdyBjbG9uZSBwYXRoIHNvIHdlIGNhbiBtb2RpZnkgaXQgYmVsb3csIG90aGVyd2lzZSB3ZSBtb2RpZnkgdGhlXG4gIC8vIG9iamVjdCByZWZlcmVuY2VkIGJ5IHVzZU1lbW8gaW5zaWRlIHVzZVJlc29sdmVkUGF0aFxuICBsZXQgcGF0aCA9IF9leHRlbmRzKHt9LCB1c2VSZXNvbHZlZFBhdGgoYWN0aW9uID8gYWN0aW9uIDogXCIuXCIsIHtcbiAgICByZWxhdGl2ZVxuICB9KSk7XG4gIC8vIFByZXZpb3VzbHkgd2Ugc2V0IHRoZSBkZWZhdWx0IGFjdGlvbiB0byBcIi5cIi4gVGhlIHByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXRcbiAgLy8gYHVzZVJlc29sdmVkUGF0aChcIi5cIilgIGV4Y2x1ZGVzIHNlYXJjaCBwYXJhbXMgb2YgdGhlIHJlc29sdmVkIFVSTC4gVGhpcyBpc1xuICAvLyB0aGUgaW50ZW5kZWQgYmVoYXZpb3Igb2Ygd2hlbiBcIi5cIiBpcyBzcGVjaWZpY2FsbHkgcHJvdmlkZWQgYXNcbiAgLy8gdGhlIGZvcm0gYWN0aW9uLCBidXQgaW5jb25zaXN0ZW50IHcvIGJyb3dzZXJzIHdoZW4gdGhlIGFjdGlvbiBpcyBvbWl0dGVkLlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVtaXgtcnVuL3JlbWl4L2lzc3Vlcy85MjdcbiAgbGV0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgaWYgKGFjdGlvbiA9PSBudWxsKSB7XG4gICAgLy8gU2FmZSB0byB3cml0ZSB0byB0aGlzIGRpcmVjdGx5IGhlcmUgc2luY2UgaWYgYWN0aW9uIHdhcyB1bmRlZmluZWQsIHdlXG4gICAgLy8gd291bGQgaGF2ZSBjYWxsZWQgdXNlUmVzb2x2ZWRQYXRoKFwiLlwiKSB3aGljaCB3aWxsIG5ldmVyIGluY2x1ZGUgYSBzZWFyY2hcbiAgICBwYXRoLnNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaDtcbiAgICAvLyBXaGVuIGdyYWJiaW5nIHNlYXJjaCBwYXJhbXMgZnJvbSB0aGUgVVJMLCByZW1vdmUgdGhlIGF1dG9tYXRpY2FsbHlcbiAgICAvLyBpbnNlcnRlZCA/aW5kZXggcGFyYW0gc28gd2UgbWF0Y2ggdGhlIHVzZVJlc29sdmVkUGF0aCBzZWFyY2ggYmVoYXZpb3JcbiAgICAvLyB3aGljaCB3b3VsZCBub3QgaW5jbHVkZSA/aW5kZXhcbiAgICBpZiAobWF0Y2gucm91dGUuaW5kZXgpIHtcbiAgICAgIGxldCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhdGguc2VhcmNoKTtcbiAgICAgIHBhcmFtcy5kZWxldGUoXCJpbmRleFwiKTtcbiAgICAgIHBhdGguc2VhcmNoID0gcGFyYW1zLnRvU3RyaW5nKCkgPyBcIj9cIiArIHBhcmFtcy50b1N0cmluZygpIDogXCJcIjtcbiAgICB9XG4gIH1cbiAgaWYgKCghYWN0aW9uIHx8IGFjdGlvbiA9PT0gXCIuXCIpICYmIG1hdGNoLnJvdXRlLmluZGV4KSB7XG4gICAgcGF0aC5zZWFyY2ggPSBwYXRoLnNlYXJjaCA/IHBhdGguc2VhcmNoLnJlcGxhY2UoL15cXD8vLCBcIj9pbmRleCZcIikgOiBcIj9pbmRleFwiO1xuICB9XG4gIC8vIElmIHdlJ3JlIG9wZXJhdGluZyB3aXRoaW4gYSBiYXNlbmFtZSwgcHJlcGVuZCBpdCB0byB0aGUgcGF0aG5hbWUgcHJpb3JcbiAgLy8gdG8gY3JlYXRpbmcgdGhlIGZvcm0gYWN0aW9uLiAgSWYgdGhpcyBpcyBhIHJvb3QgbmF2aWdhdGlvbiwgdGhlbiBqdXN0IHVzZVxuICAvLyB0aGUgcmF3IGJhc2VuYW1lIHdoaWNoIGFsbG93cyB0aGUgYmFzZW5hbWUgdG8gaGF2ZSBmdWxsIGNvbnRyb2wgb3ZlciB0aGVcbiAgLy8gcHJlc2VuY2Ugb2YgYSB0cmFpbGluZyBzbGFzaCBvbiByb290IGFjdGlvbnNcbiAgaWYgKGJhc2VuYW1lICE9PSBcIi9cIikge1xuICAgIHBhdGgucGF0aG5hbWUgPSBwYXRoLnBhdGhuYW1lID09PSBcIi9cIiA/IGJhc2VuYW1lIDogam9pblBhdGhzKFtiYXNlbmFtZSwgcGF0aC5wYXRobmFtZV0pO1xuICB9XG4gIHJldHVybiBjcmVhdGVQYXRoKHBhdGgpO1xufVxuZnVuY3Rpb24gY3JlYXRlRmV0Y2hlckZvcm0oZmV0Y2hlcktleSwgcm91dGVJZCkge1xuICBsZXQgRmV0Y2hlckZvcm0gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICAgIGxldCBzdWJtaXQgPSB1c2VTdWJtaXRGZXRjaGVyKGZldGNoZXJLZXksIHJvdXRlSWQpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb3JtSW1wbCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICByZWY6IHJlZixcbiAgICAgIHN1Ym1pdDogc3VibWl0XG4gICAgfSkpO1xuICB9KTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIEZldGNoZXJGb3JtLmRpc3BsYXlOYW1lID0gXCJmZXRjaGVyLkZvcm1cIjtcbiAgfVxuICByZXR1cm4gRmV0Y2hlckZvcm07XG59XG5sZXQgZmV0Y2hlcklkID0gMDtcbi8qKlxuICogSW50ZXJhY3RzIHdpdGggcm91dGUgbG9hZGVycyBhbmQgYWN0aW9ucyB3aXRob3V0IGNhdXNpbmcgYSBuYXZpZ2F0aW9uLiBHcmVhdFxuICogZm9yIGFueSBpbnRlcmFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuXG4gKi9cbmZ1bmN0aW9uIHVzZUZldGNoZXIoKSB7XG4gIHZhciBfcm91dGUkbWF0Y2hlcztcbiAgbGV0IHtcbiAgICByb3V0ZXJcbiAgfSA9IHVzZURhdGFSb3V0ZXJDb250ZXh0KERhdGFSb3V0ZXJIb29rLlVzZUZldGNoZXIpO1xuICBsZXQgcm91dGUgPSBSZWFjdC51c2VDb250ZXh0KFVOU0FGRV9Sb3V0ZUNvbnRleHQpO1xuICAhcm91dGUgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBcInVzZUZldGNoZXIgbXVzdCBiZSB1c2VkIGluc2lkZSBhIFJvdXRlQ29udGV4dFwiKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICBsZXQgcm91dGVJZCA9IChfcm91dGUkbWF0Y2hlcyA9IHJvdXRlLm1hdGNoZXNbcm91dGUubWF0Y2hlcy5sZW5ndGggLSAxXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9yb3V0ZSRtYXRjaGVzLnJvdXRlLmlkO1xuICAhKHJvdXRlSWQgIT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBcInVzZUZldGNoZXIgY2FuIG9ubHkgYmUgdXNlZCBvbiByb3V0ZXMgdGhhdCBjb250YWluIGEgdW5pcXVlIFxcXCJpZFxcXCJcIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgbGV0IFtmZXRjaGVyS2V5XSA9IFJlYWN0LnVzZVN0YXRlKCgpID0+IFN0cmluZygrK2ZldGNoZXJJZCkpO1xuICBsZXQgW0Zvcm1dID0gUmVhY3QudXNlU3RhdGUoKCkgPT4ge1xuICAgICFyb3V0ZUlkID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgXCJObyByb3V0ZUlkIGF2YWlsYWJsZSBmb3IgZmV0Y2hlci5Gb3JtKClcIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICByZXR1cm4gY3JlYXRlRmV0Y2hlckZvcm0oZmV0Y2hlcktleSwgcm91dGVJZCk7XG4gIH0pO1xuICBsZXQgW2xvYWRdID0gUmVhY3QudXNlU3RhdGUoKCkgPT4gaHJlZiA9PiB7XG4gICAgIXJvdXRlciA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIFwiTm8gcm91dGVyIGF2YWlsYWJsZSBmb3IgZmV0Y2hlci5sb2FkKClcIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICAhcm91dGVJZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIFwiTm8gcm91dGVJZCBhdmFpbGFibGUgZm9yIGZldGNoZXIubG9hZCgpXCIpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgcm91dGVyLmZldGNoKGZldGNoZXJLZXksIHJvdXRlSWQsIGhyZWYpO1xuICB9KTtcbiAgbGV0IHN1Ym1pdCA9IHVzZVN1Ym1pdEZldGNoZXIoZmV0Y2hlcktleSwgcm91dGVJZCk7XG4gIGxldCBmZXRjaGVyID0gcm91dGVyLmdldEZldGNoZXIoZmV0Y2hlcktleSk7XG4gIGxldCBmZXRjaGVyV2l0aENvbXBvbmVudHMgPSBSZWFjdC51c2VNZW1vKCgpID0+IF9leHRlbmRzKHtcbiAgICBGb3JtLFxuICAgIHN1Ym1pdCxcbiAgICBsb2FkXG4gIH0sIGZldGNoZXIpLCBbZmV0Y2hlciwgRm9ybSwgc3VibWl0LCBsb2FkXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gSXMgdGhpcyBidXN0ZWQgd2hlbiB0aGUgUmVhY3QgdGVhbSBnZXRzIHJlYWwgd2VpcmQgYW5kIGNhbGxzIGVmZmVjdHNcbiAgICAvLyB0d2ljZSBvbiBtb3VudD8gIFdlIHJlYWxseSBqdXN0IG5lZWQgdG8gZ2FyYmFnZSBjb2xsZWN0IGhlcmUgd2hlbiB0aGlzXG4gICAgLy8gZmV0Y2hlciBpcyBubyBsb25nZXIgYXJvdW5kLlxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoIXJvdXRlcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJObyByb3V0ZXIgYXZhaWxhYmxlIHRvIGNsZWFuIHVwIGZyb20gdXNlRmV0Y2hlcigpXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByb3V0ZXIuZGVsZXRlRmV0Y2hlcihmZXRjaGVyS2V5KTtcbiAgICB9O1xuICB9LCBbcm91dGVyLCBmZXRjaGVyS2V5XSk7XG4gIHJldHVybiBmZXRjaGVyV2l0aENvbXBvbmVudHM7XG59XG4vKipcbiAqIFByb3ZpZGVzIGFsbCBmZXRjaGVycyBjdXJyZW50bHkgb24gdGhlIHBhZ2UuIFVzZWZ1bCBmb3IgbGF5b3V0cyBhbmQgcGFyZW50XG4gKiByb3V0ZXMgdGhhdCBuZWVkIHRvIHByb3ZpZGUgcGVuZGluZy9vcHRpbWlzdGljIFVJIHJlZ2FyZGluZyB0aGUgZmV0Y2guXG4gKi9cbmZ1bmN0aW9uIHVzZUZldGNoZXJzKCkge1xuICBsZXQgc3RhdGUgPSB1c2VEYXRhUm91dGVyU3RhdGUoRGF0YVJvdXRlclN0YXRlSG9vay5Vc2VGZXRjaGVycyk7XG4gIHJldHVybiBbLi4uc3RhdGUuZmV0Y2hlcnMudmFsdWVzKCldO1xufVxuY29uc3QgU0NST0xMX1JFU1RPUkFUSU9OX1NUT1JBR0VfS0VZID0gXCJyZWFjdC1yb3V0ZXItc2Nyb2xsLXBvc2l0aW9uc1wiO1xubGV0IHNhdmVkU2Nyb2xsUG9zaXRpb25zID0ge307XG4vKipcbiAqIFdoZW4gcmVuZGVyZWQgaW5zaWRlIGEgUm91dGVyUHJvdmlkZXIsIHdpbGwgcmVzdG9yZSBzY3JvbGwgcG9zaXRpb25zIG9uIG5hdmlnYXRpb25zXG4gKi9cbmZ1bmN0aW9uIHVzZVNjcm9sbFJlc3RvcmF0aW9uKF90ZW1wMykge1xuICBsZXQge1xuICAgIGdldEtleSxcbiAgICBzdG9yYWdlS2V5XG4gIH0gPSBfdGVtcDMgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAzO1xuICBsZXQge1xuICAgIHJvdXRlclxuICB9ID0gdXNlRGF0YVJvdXRlckNvbnRleHQoRGF0YVJvdXRlckhvb2suVXNlU2Nyb2xsUmVzdG9yYXRpb24pO1xuICBsZXQge1xuICAgIHJlc3RvcmVTY3JvbGxQb3NpdGlvbixcbiAgICBwcmV2ZW50U2Nyb2xsUmVzZXRcbiAgfSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShEYXRhUm91dGVyU3RhdGVIb29rLlVzZVNjcm9sbFJlc3RvcmF0aW9uKTtcbiAgbGV0IHtcbiAgICBiYXNlbmFtZVxuICB9ID0gUmVhY3QudXNlQ29udGV4dChVTlNBRkVfTmF2aWdhdGlvbkNvbnRleHQpO1xuICBsZXQgbG9jYXRpb24gPSB1c2VMb2NhdGlvbigpO1xuICBsZXQgbWF0Y2hlcyA9IHVzZU1hdGNoZXMoKTtcbiAgbGV0IG5hdmlnYXRpb24gPSB1c2VOYXZpZ2F0aW9uKCk7XG4gIC8vIFRyaWdnZXIgbWFudWFsIHNjcm9sbCByZXN0b3JhdGlvbiB3aGlsZSB3ZSdyZSBhY3RpdmVcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICB3aW5kb3cuaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbiA9IFwibWFudWFsXCI7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gXCJhdXRvXCI7XG4gICAgfTtcbiAgfSwgW10pO1xuICAvLyBTYXZlIHBvc2l0aW9ucyBvbiBwYWdlaGlkZVxuICB1c2VQYWdlSGlkZShSZWFjdC51c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKG5hdmlnYXRpb24uc3RhdGUgPT09IFwiaWRsZVwiKSB7XG4gICAgICBsZXQga2V5ID0gKGdldEtleSA/IGdldEtleShsb2NhdGlvbiwgbWF0Y2hlcykgOiBudWxsKSB8fCBsb2NhdGlvbi5rZXk7XG4gICAgICBzYXZlZFNjcm9sbFBvc2l0aW9uc1trZXldID0gd2luZG93LnNjcm9sbFk7XG4gICAgfVxuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSB8fCBTQ1JPTExfUkVTVE9SQVRJT05fU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHNhdmVkU2Nyb2xsUG9zaXRpb25zKSk7XG4gICAgd2luZG93Lmhpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb24gPSBcImF1dG9cIjtcbiAgfSwgW3N0b3JhZ2VLZXksIGdldEtleSwgbmF2aWdhdGlvbi5zdGF0ZSwgbG9jYXRpb24sIG1hdGNoZXNdKSk7XG4gIC8vIFJlYWQgaW4gYW55IHNhdmVkIHNjcm9sbCBsb2NhdGlvbnNcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rc1xuICAgIFJlYWN0LnVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgc2Vzc2lvblBvc2l0aW9ucyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oc3RvcmFnZUtleSB8fCBTQ1JPTExfUkVTVE9SQVRJT05fU1RPUkFHRV9LRVkpO1xuICAgICAgICBpZiAoc2Vzc2lvblBvc2l0aW9ucykge1xuICAgICAgICAgIHNhdmVkU2Nyb2xsUG9zaXRpb25zID0gSlNPTi5wYXJzZShzZXNzaW9uUG9zaXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBuby1vcCwgdXNlIGRlZmF1bHQgZW1wdHkgb2JqZWN0XG4gICAgICB9XG4gICAgfSwgW3N0b3JhZ2VLZXldKTtcbiAgICAvLyBFbmFibGUgc2Nyb2xsIHJlc3RvcmF0aW9uIGluIHRoZSByb3V0ZXJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvcnVsZXMtb2YtaG9va3NcbiAgICBSZWFjdC51c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgbGV0IGdldEtleVdpdGhvdXRCYXNlbmFtZSA9IGdldEtleSAmJiBiYXNlbmFtZSAhPT0gXCIvXCIgPyAobG9jYXRpb24sIG1hdGNoZXMpID0+IGdldEtleSggLy8gU3RyaXAgdGhlIGJhc2VuYW1lIHRvIG1hdGNoIHVzZUxvY2F0aW9uKClcbiAgICAgIF9leHRlbmRzKHt9LCBsb2NhdGlvbiwge1xuICAgICAgICBwYXRobmFtZTogc3RyaXBCYXNlbmFtZShsb2NhdGlvbi5wYXRobmFtZSwgYmFzZW5hbWUpIHx8IGxvY2F0aW9uLnBhdGhuYW1lXG4gICAgICB9KSwgbWF0Y2hlcykgOiBnZXRLZXk7XG4gICAgICBsZXQgZGlzYWJsZVNjcm9sbFJlc3RvcmF0aW9uID0gcm91dGVyID09IG51bGwgPyB2b2lkIDAgOiByb3V0ZXIuZW5hYmxlU2Nyb2xsUmVzdG9yYXRpb24oc2F2ZWRTY3JvbGxQb3NpdGlvbnMsICgpID0+IHdpbmRvdy5zY3JvbGxZLCBnZXRLZXlXaXRob3V0QmFzZW5hbWUpO1xuICAgICAgcmV0dXJuICgpID0+IGRpc2FibGVTY3JvbGxSZXN0b3JhdGlvbiAmJiBkaXNhYmxlU2Nyb2xsUmVzdG9yYXRpb24oKTtcbiAgICB9LCBbcm91dGVyLCBiYXNlbmFtZSwgZ2V0S2V5XSk7XG4gICAgLy8gUmVzdG9yZSBzY3JvbGxpbmcgd2hlbiBzdGF0ZS5yZXN0b3JlU2Nyb2xsUG9zaXRpb24gY2hhbmdlc1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rc1xuICAgIFJlYWN0LnVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICAvLyBFeHBsaWNpdCBmYWxzZSBtZWFucyBkb24ndCBkbyBhbnl0aGluZyAodXNlZCBmb3Igc3VibWlzc2lvbnMpXG4gICAgICBpZiAocmVzdG9yZVNjcm9sbFBvc2l0aW9uID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBiZWVuIGhlcmUgYmVmb3JlLCBzY3JvbGwgdG8gaXRcbiAgICAgIGlmICh0eXBlb2YgcmVzdG9yZVNjcm9sbFBvc2l0aW9uID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCByZXN0b3JlU2Nyb2xsUG9zaXRpb24pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyB0cnkgdG8gc2Nyb2xsIHRvIHRoZSBoYXNoXG4gICAgICBpZiAobG9jYXRpb24uaGFzaCkge1xuICAgICAgICBsZXQgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zbGljZSgxKSkpO1xuICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICBlbC5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgcmVzZXQgaWYgdGhpcyBuYXZpZ2F0aW9uIG9wdGVkIG91dFxuICAgICAgaWYgKHByZXZlbnRTY3JvbGxSZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBvdGhlcndpc2UgZ28gdG8gdGhlIHRvcCBvbiBuZXcgbG9jYXRpb25zXG4gICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7XG4gICAgfSwgW2xvY2F0aW9uLCByZXN0b3JlU2Nyb2xsUG9zaXRpb24sIHByZXZlbnRTY3JvbGxSZXNldF0pO1xuICB9XG59XG4vKipcbiAqIFNldHVwIGEgY2FsbGJhY2sgdG8gYmUgZmlyZWQgb24gdGhlIHdpbmRvdydzIGBiZWZvcmV1bmxvYWRgIGV2ZW50LiBUaGlzIGlzXG4gKiB1c2VmdWwgZm9yIHNhdmluZyBzb21lIGRhdGEgdG8gYHdpbmRvdy5sb2NhbFN0b3JhZ2VgIGp1c3QgYmVmb3JlIHRoZSBwYWdlXG4gKiByZWZyZXNoZXMuXG4gKlxuICogTm90ZTogVGhlIGBjYWxsYmFja2AgYXJndW1lbnQgc2hvdWxkIGJlIGEgZnVuY3Rpb24gY3JlYXRlZCB3aXRoXG4gKiBgUmVhY3QudXNlQ2FsbGJhY2soKWAuXG4gKi9cbmZ1bmN0aW9uIHVzZUJlZm9yZVVubG9hZChjYWxsYmFjaywgb3B0aW9ucykge1xuICBsZXQge1xuICAgIGNhcHR1cmVcbiAgfSA9IG9wdGlvbnMgfHwge307XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IG9wdHMgPSBjYXB0dXJlICE9IG51bGwgPyB7XG4gICAgICBjYXB0dXJlXG4gICAgfSA6IHVuZGVmaW5lZDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBjYWxsYmFjaywgb3B0cyk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIGNhbGxiYWNrLCBvcHRzKTtcbiAgICB9O1xuICB9LCBbY2FsbGJhY2ssIGNhcHR1cmVdKTtcbn1cbi8qKlxuICogU2V0dXAgYSBjYWxsYmFjayB0byBiZSBmaXJlZCBvbiB0aGUgd2luZG93J3MgYHBhZ2VoaWRlYCBldmVudC4gVGhpcyBpc1xuICogdXNlZnVsIGZvciBzYXZpbmcgc29tZSBkYXRhIHRvIGB3aW5kb3cubG9jYWxTdG9yYWdlYCBqdXN0IGJlZm9yZSB0aGUgcGFnZVxuICogcmVmcmVzaGVzLiAgVGhpcyBldmVudCBpcyBiZXR0ZXIgc3VwcG9ydGVkIHRoYW4gYmVmb3JldW5sb2FkIGFjcm9zcyBicm93c2Vycy5cbiAqXG4gKiBOb3RlOiBUaGUgYGNhbGxiYWNrYCBhcmd1bWVudCBzaG91bGQgYmUgYSBmdW5jdGlvbiBjcmVhdGVkIHdpdGhcbiAqIGBSZWFjdC51c2VDYWxsYmFjaygpYC5cbiAqL1xuZnVuY3Rpb24gdXNlUGFnZUhpZGUoY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgbGV0IHtcbiAgICBjYXB0dXJlXG4gIH0gPSBvcHRpb25zIHx8IHt9O1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBvcHRzID0gY2FwdHVyZSAhPSBudWxsID8ge1xuICAgICAgY2FwdHVyZVxuICAgIH0gOiB1bmRlZmluZWQ7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBjYWxsYmFjaywgb3B0cyk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgY2FsbGJhY2ssIG9wdHMpO1xuICAgIH07XG4gIH0sIFtjYWxsYmFjaywgY2FwdHVyZV0pO1xufVxuLyoqXG4gKiBXcmFwcGVyIGFyb3VuZCB1c2VCbG9ja2VyIHRvIHNob3cgYSB3aW5kb3cuY29uZmlybSBwcm9tcHQgdG8gdXNlcnMgaW5zdGVhZFxuICogb2YgYnVpbGRpbmcgYSBjdXN0b20gVUkgd2l0aCB1c2VCbG9ja2VyLlxuICpcbiAqIFdhcm5pbmc6IFRoaXMgaGFzICphIGxvdCBvZiByb3VnaCBlZGdlcyogYW5kIGJlaGF2ZXMgdmVyeSBkaWZmZXJlbnRseSAoYW5kXG4gKiB2ZXJ5IGluY29ycmVjdGx5IGluIHNvbWUgY2FzZXMpIGFjcm9zcyBicm93c2VycyBpZiB1c2VyIGNsaWNrIGFkZGl0aW9uXG4gKiBiYWNrL2ZvcndhcmQgbmF2aWdhdGlvbnMgd2hpbGUgdGhlIGNvbmZpcm0gaXMgb3Blbi4gIFVzZSBhdCB5b3VyIG93biByaXNrLlxuICovXG5mdW5jdGlvbiB1c2VQcm9tcHQoX3JlZjgpIHtcbiAgbGV0IHtcbiAgICB3aGVuLFxuICAgIG1lc3NhZ2VcbiAgfSA9IF9yZWY4O1xuICBsZXQgYmxvY2tlciA9IHVuc3RhYmxlX3VzZUJsb2NrZXIod2hlbik7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGJsb2NrZXIuc3RhdGUgPT09IFwiYmxvY2tlZFwiKSB7XG4gICAgICBsZXQgcHJvY2VlZCA9IHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpO1xuICAgICAgaWYgKHByb2NlZWQpIHtcbiAgICAgICAgLy8gVGhpcyB0aW1lb3V0IGlzIG5lZWRlZCB0byBhdm9pZCBhIHdlaXJkIFwicmFjZVwiIG9uIFBPUCBuYXZpZ2F0aW9uc1xuICAgICAgICAvLyBiZXR3ZWVuIHRoZSBgd2luZG93Lmhpc3RvcnlgIHJldmVydCBuYXZpZ2F0aW9uIGFuZCB0aGUgcmVzdWx0IG9mXG4gICAgICAgIC8vIGB3aW5kb3cuY29uZmlybWBcbiAgICAgICAgc2V0VGltZW91dChibG9ja2VyLnByb2NlZWQsIDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmxvY2tlci5yZXNldCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW2Jsb2NrZXIsIG1lc3NhZ2VdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoYmxvY2tlci5zdGF0ZSA9PT0gXCJibG9ja2VkXCIgJiYgIXdoZW4pIHtcbiAgICAgIGJsb2NrZXIucmVzZXQoKTtcbiAgICB9XG4gIH0sIFtibG9ja2VyLCB3aGVuXSk7XG59XG4vLyNlbmRyZWdpb25cblxuZXhwb3J0IHsgQnJvd3NlclJvdXRlciwgRm9ybSwgSGFzaFJvdXRlciwgTGluaywgTmF2TGluaywgU2Nyb2xsUmVzdG9yYXRpb24sIHVzZVNjcm9sbFJlc3RvcmF0aW9uIGFzIFVOU0FGRV91c2VTY3JvbGxSZXN0b3JhdGlvbiwgY3JlYXRlQnJvd3NlclJvdXRlciwgY3JlYXRlSGFzaFJvdXRlciwgY3JlYXRlU2VhcmNoUGFyYW1zLCBIaXN0b3J5Um91dGVyIGFzIHVuc3RhYmxlX0hpc3RvcnlSb3V0ZXIsIHVzZVByb21wdCBhcyB1bnN0YWJsZV91c2VQcm9tcHQsIHVzZUJlZm9yZVVubG9hZCwgdXNlRmV0Y2hlciwgdXNlRmV0Y2hlcnMsIHVzZUZvcm1BY3Rpb24sIHVzZUxpbmtDbGlja0hhbmRsZXIsIHVzZVNlYXJjaFBhcmFtcywgdXNlU3VibWl0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiJdLCJuYW1lcyI6WyJSZWFjdCIsIlVOU0FGRV9tYXBSb3V0ZVByb3BlcnRpZXMiLCJSb3V0ZXIiLCJVTlNBRkVfTmF2aWdhdGlvbkNvbnRleHQiLCJ1c2VIcmVmIiwidXNlUmVzb2x2ZWRQYXRoIiwidXNlTG9jYXRpb24iLCJVTlNBRkVfRGF0YVJvdXRlclN0YXRlQ29udGV4dCIsInVzZU5hdmlnYXRlIiwiY3JlYXRlUGF0aCIsIlVOU0FGRV91c2VSb3V0ZUlkIiwiVU5TQUZFX1JvdXRlQ29udGV4dCIsInVzZU1hdGNoZXMiLCJ1c2VOYXZpZ2F0aW9uIiwidW5zdGFibGVfdXNlQmxvY2tlciIsIlVOU0FGRV9EYXRhUm91dGVyQ29udGV4dCIsIkFib3J0ZWREZWZlcnJlZEVycm9yIiwiQXdhaXQiLCJNZW1vcnlSb3V0ZXIiLCJOYXZpZ2F0ZSIsIk5hdmlnYXRpb25UeXBlIiwiT3V0bGV0IiwiUm91dGUiLCJSb3V0ZXJQcm92aWRlciIsIlJvdXRlcyIsIlVOU0FGRV9Mb2NhdGlvbkNvbnRleHQiLCJjcmVhdGVNZW1vcnlSb3V0ZXIiLCJjcmVhdGVSb3V0ZXNGcm9tQ2hpbGRyZW4iLCJjcmVhdGVSb3V0ZXNGcm9tRWxlbWVudHMiLCJkZWZlciIsImdlbmVyYXRlUGF0aCIsImlzUm91dGVFcnJvclJlc3BvbnNlIiwianNvbiIsIm1hdGNoUGF0aCIsIm1hdGNoUm91dGVzIiwicGFyc2VQYXRoIiwicmVkaXJlY3QiLCJyZWRpcmVjdERvY3VtZW50IiwicmVuZGVyTWF0Y2hlcyIsInJlc29sdmVQYXRoIiwidXNlQWN0aW9uRGF0YSIsInVzZUFzeW5jRXJyb3IiLCJ1c2VBc3luY1ZhbHVlIiwidXNlSW5Sb3V0ZXJDb250ZXh0IiwidXNlTG9hZGVyRGF0YSIsInVzZU1hdGNoIiwidXNlTmF2aWdhdGlvblR5cGUiLCJ1c2VPdXRsZXQiLCJ1c2VPdXRsZXRDb250ZXh0IiwidXNlUGFyYW1zIiwidXNlUmV2YWxpZGF0b3IiLCJ1c2VSb3V0ZUVycm9yIiwidXNlUm91dGVMb2FkZXJEYXRhIiwidXNlUm91dGVzIiwic3RyaXBCYXNlbmFtZSIsIlVOU0FGRV93YXJuaW5nIiwiY3JlYXRlUm91dGVyIiwiY3JlYXRlQnJvd3Nlckhpc3RvcnkiLCJjcmVhdGVIYXNoSGlzdG9yeSIsIkVycm9yUmVzcG9uc2UiLCJVTlNBRkVfaW52YXJpYW50Iiwiam9pblBhdGhzIiwiX2V4dGVuZHMiLCJPYmplY3QiLCJhc3NpZ24iLCJiaW5kIiwidGFyZ2V0IiwiaSIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNvdXJjZSIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImFwcGx5IiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UiLCJleGNsdWRlZCIsInNvdXJjZUtleXMiLCJrZXlzIiwiaW5kZXhPZiIsImRlZmF1bHRNZXRob2QiLCJkZWZhdWx0RW5jVHlwZSIsImlzSHRtbEVsZW1lbnQiLCJvYmplY3QiLCJ0YWdOYW1lIiwiaXNCdXR0b25FbGVtZW50IiwidG9Mb3dlckNhc2UiLCJpc0Zvcm1FbGVtZW50IiwiaXNJbnB1dEVsZW1lbnQiLCJpc01vZGlmaWVkRXZlbnQiLCJldmVudCIsIm1ldGFLZXkiLCJhbHRLZXkiLCJjdHJsS2V5Iiwic2hpZnRLZXkiLCJzaG91bGRQcm9jZXNzTGlua0NsaWNrIiwiYnV0dG9uIiwiY3JlYXRlU2VhcmNoUGFyYW1zIiwiaW5pdCIsIlVSTFNlYXJjaFBhcmFtcyIsIkFycmF5IiwiaXNBcnJheSIsInJlZHVjZSIsIm1lbW8iLCJ2YWx1ZSIsImNvbmNhdCIsIm1hcCIsInYiLCJnZXRTZWFyY2hQYXJhbXNGb3JMb2NhdGlvbiIsImxvY2F0aW9uU2VhcmNoIiwiZGVmYXVsdFNlYXJjaFBhcmFtcyIsInNlYXJjaFBhcmFtcyIsImZvckVhY2giLCJfIiwiaGFzIiwiZ2V0QWxsIiwiYXBwZW5kIiwiX2Zvcm1EYXRhU3VwcG9ydHNTdWJtaXR0ZXIiLCJpc0Zvcm1EYXRhU3VibWl0dGVyU3VwcG9ydGVkIiwiRm9ybURhdGEiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJlIiwic3VwcG9ydGVkRm9ybUVuY1R5cGVzIiwiU2V0IiwiZ2V0Rm9ybUVuY1R5cGUiLCJlbmNUeXBlIiwiZ2V0Rm9ybVN1Ym1pc3Npb25JbmZvIiwiYmFzZW5hbWUiLCJtZXRob2QiLCJhY3Rpb24iLCJmb3JtRGF0YSIsImJvZHkiLCJhdHRyIiwiZ2V0QXR0cmlidXRlIiwidHlwZSIsImZvcm0iLCJFcnJvciIsIm5hbWUiLCJwcmVmaXgiLCJ1bmRlZmluZWQiLCJfZXhjbHVkZWQiLCJfZXhjbHVkZWQyIiwiX2V4Y2x1ZGVkMyIsImNyZWF0ZUJyb3dzZXJSb3V0ZXIiLCJyb3V0ZXMiLCJvcHRzIiwiZnV0dXJlIiwidjdfcHJlcGVuZEJhc2VuYW1lIiwiaGlzdG9yeSIsIndpbmRvdyIsImh5ZHJhdGlvbkRhdGEiLCJwYXJzZUh5ZHJhdGlvbkRhdGEiLCJtYXBSb3V0ZVByb3BlcnRpZXMiLCJpbml0aWFsaXplIiwiY3JlYXRlSGFzaFJvdXRlciIsIl93aW5kb3ciLCJzdGF0ZSIsIl9fc3RhdGljUm91dGVySHlkcmF0aW9uRGF0YSIsImVycm9ycyIsImRlc2VyaWFsaXplRXJyb3JzIiwiZW50cmllcyIsInNlcmlhbGl6ZWQiLCJ2YWwiLCJfX3R5cGUiLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwiZGF0YSIsImludGVybmFsIiwiX19zdWJUeXBlIiwiRXJyb3JDb25zdHJ1Y3RvciIsImVycm9yIiwibWVzc2FnZSIsInN0YWNrIiwiU1RBUlRfVFJBTlNJVElPTiIsInN0YXJ0VHJhbnNpdGlvbkltcGwiLCJCcm93c2VyUm91dGVyIiwiX3JlZiIsImNoaWxkcmVuIiwiaGlzdG9yeVJlZiIsInVzZVJlZiIsImN1cnJlbnQiLCJ2NUNvbXBhdCIsInNldFN0YXRlSW1wbCIsInVzZVN0YXRlIiwibG9jYXRpb24iLCJ2N19zdGFydFRyYW5zaXRpb24iLCJzZXRTdGF0ZSIsInVzZUNhbGxiYWNrIiwibmV3U3RhdGUiLCJ1c2VMYXlvdXRFZmZlY3QiLCJsaXN0ZW4iLCJuYXZpZ2F0aW9uVHlwZSIsIm5hdmlnYXRvciIsIkhhc2hSb3V0ZXIiLCJfcmVmMiIsIkhpc3RvcnlSb3V0ZXIiLCJfcmVmMyIsInByb2Nlc3MiLCJkaXNwbGF5TmFtZSIsImlzQnJvd3NlciIsIkFCU09MVVRFX1VSTF9SRUdFWCIsIkxpbmsiLCJmb3J3YXJkUmVmIiwiTGlua1dpdGhSZWYiLCJfcmVmNCIsInJlZiIsIm9uQ2xpY2siLCJyZWxhdGl2ZSIsInJlbG9hZERvY3VtZW50IiwicmVwbGFjZSIsInRvIiwicHJldmVudFNjcm9sbFJlc2V0IiwicmVzdCIsInVzZUNvbnRleHQiLCJhYnNvbHV0ZUhyZWYiLCJpc0V4dGVybmFsIiwidGVzdCIsImN1cnJlbnRVcmwiLCJVUkwiLCJocmVmIiwidGFyZ2V0VXJsIiwic3RhcnRzV2l0aCIsInByb3RvY29sIiwicGF0aCIsInBhdGhuYW1lIiwib3JpZ2luIiwic2VhcmNoIiwiaGFzaCIsImludGVybmFsT25DbGljayIsInVzZUxpbmtDbGlja0hhbmRsZXIiLCJoYW5kbGVDbGljayIsImRlZmF1bHRQcmV2ZW50ZWQiLCJOYXZMaW5rIiwiTmF2TGlua1dpdGhSZWYiLCJfcmVmNSIsImFyaWFDdXJyZW50UHJvcCIsImNhc2VTZW5zaXRpdmUiLCJjbGFzc05hbWUiLCJjbGFzc05hbWVQcm9wIiwiZW5kIiwic3R5bGUiLCJzdHlsZVByb3AiLCJyb3V0ZXJTdGF0ZSIsInRvUGF0aG5hbWUiLCJlbmNvZGVMb2NhdGlvbiIsImxvY2F0aW9uUGF0aG5hbWUiLCJuZXh0TG9jYXRpb25QYXRobmFtZSIsIm5hdmlnYXRpb24iLCJpc0FjdGl2ZSIsImNoYXJBdCIsImlzUGVuZGluZyIsImFyaWFDdXJyZW50IiwiZmlsdGVyIiwiQm9vbGVhbiIsImpvaW4iLCJGb3JtIiwicHJvcHMiLCJzdWJtaXQiLCJ1c2VTdWJtaXQiLCJGb3JtSW1wbCIsIl9yZWY2IiwiZm9yd2FyZGVkUmVmIiwib25TdWJtaXQiLCJmb3JtTWV0aG9kIiwiZm9ybUFjdGlvbiIsInVzZUZvcm1BY3Rpb24iLCJzdWJtaXRIYW5kbGVyIiwicHJldmVudERlZmF1bHQiLCJzdWJtaXR0ZXIiLCJuYXRpdmVFdmVudCIsInN1Ym1pdE1ldGhvZCIsImN1cnJlbnRUYXJnZXQiLCJTY3JvbGxSZXN0b3JhdGlvbiIsIl9yZWY3IiwiZ2V0S2V5Iiwic3RvcmFnZUtleSIsInVzZVNjcm9sbFJlc3RvcmF0aW9uIiwiRGF0YVJvdXRlckhvb2siLCJEYXRhUm91dGVyU3RhdGVIb29rIiwiZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvciIsImhvb2tOYW1lIiwidXNlRGF0YVJvdXRlckNvbnRleHQiLCJjdHgiLCJ1c2VEYXRhUm91dGVyU3RhdGUiLCJfdGVtcCIsInJlcGxhY2VQcm9wIiwibmF2aWdhdGUiLCJ1c2VTZWFyY2hQYXJhbXMiLCJkZWZhdWx0SW5pdCIsImRlZmF1bHRTZWFyY2hQYXJhbXNSZWYiLCJoYXNTZXRTZWFyY2hQYXJhbXNSZWYiLCJ1c2VNZW1vIiwic2V0U2VhcmNoUGFyYW1zIiwibmV4dEluaXQiLCJuYXZpZ2F0ZU9wdGlvbnMiLCJuZXdTZWFyY2hQYXJhbXMiLCJ2YWxpZGF0ZUNsaWVudFNpZGVTdWJtaXNzaW9uIiwicm91dGVyIiwiVXNlU3VibWl0IiwiY3VycmVudFJvdXRlSWQiLCJvcHRpb25zIiwiZm9ybUVuY1R5cGUiLCJmcm9tUm91dGVJZCIsInVzZVN1Ym1pdEZldGNoZXIiLCJmZXRjaGVyS2V5IiwiZmV0Y2hlclJvdXRlSWQiLCJVc2VTdWJtaXRGZXRjaGVyIiwiZmV0Y2giLCJfdGVtcDIiLCJyb3V0ZUNvbnRleHQiLCJtYXRjaCIsIm1hdGNoZXMiLCJzbGljZSIsInJvdXRlIiwiaW5kZXgiLCJwYXJhbXMiLCJkZWxldGUiLCJ0b1N0cmluZyIsImNyZWF0ZUZldGNoZXJGb3JtIiwicm91dGVJZCIsIkZldGNoZXJGb3JtIiwiZmV0Y2hlcklkIiwidXNlRmV0Y2hlciIsIl9yb3V0ZSRtYXRjaGVzIiwiVXNlRmV0Y2hlciIsImlkIiwiU3RyaW5nIiwibG9hZCIsImZldGNoZXIiLCJnZXRGZXRjaGVyIiwiZmV0Y2hlcldpdGhDb21wb25lbnRzIiwidXNlRWZmZWN0IiwiY29uc29sZSIsIndhcm4iLCJkZWxldGVGZXRjaGVyIiwidXNlRmV0Y2hlcnMiLCJVc2VGZXRjaGVycyIsImZldGNoZXJzIiwidmFsdWVzIiwiU0NST0xMX1JFU1RPUkFUSU9OX1NUT1JBR0VfS0VZIiwic2F2ZWRTY3JvbGxQb3NpdGlvbnMiLCJfdGVtcDMiLCJVc2VTY3JvbGxSZXN0b3JhdGlvbiIsInJlc3RvcmVTY3JvbGxQb3NpdGlvbiIsInNjcm9sbFJlc3RvcmF0aW9uIiwidXNlUGFnZUhpZGUiLCJzY3JvbGxZIiwic2Vzc2lvblN0b3JhZ2UiLCJzZXRJdGVtIiwiSlNPTiIsInN0cmluZ2lmeSIsInNlc3Npb25Qb3NpdGlvbnMiLCJnZXRJdGVtIiwicGFyc2UiLCJnZXRLZXlXaXRob3V0QmFzZW5hbWUiLCJkaXNhYmxlU2Nyb2xsUmVzdG9yYXRpb24iLCJlbmFibGVTY3JvbGxSZXN0b3JhdGlvbiIsInNjcm9sbFRvIiwiZWwiLCJnZXRFbGVtZW50QnlJZCIsImRlY29kZVVSSUNvbXBvbmVudCIsInNjcm9sbEludG9WaWV3IiwidXNlQmVmb3JlVW5sb2FkIiwiY2FsbGJhY2siLCJjYXB0dXJlIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ1c2VQcm9tcHQiLCJfcmVmOCIsIndoZW4iLCJibG9ja2VyIiwicHJvY2VlZCIsImNvbmZpcm0iLCJzZXRUaW1lb3V0IiwicmVzZXQiLCJVTlNBRkVfdXNlU2Nyb2xsUmVzdG9yYXRpb24iLCJ1bnN0YWJsZV9IaXN0b3J5Um91dGVyIiwidW5zdGFibGVfdXNlUHJvbXB0Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/react-router-dom/dist/index.js\n");
|
|
|
|
/***/ })
|
|
|
|
};
|
|
; |